aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/libdessert
diff options
context:
space:
mode:
authorHenning Heinold <heinold@inf.fu-berlin.de>2009-12-08 11:53:16 +0100
committerHenning Heinold <heinold@inf.fu-berlin.de>2009-12-08 11:54:17 +0100
commit6676586580fa15bbf5a4d430a45b96b2e4875c7d (patch)
tree4fc48668c7de1a1780babe5c37031a5c81c8f26e /recipes/libdessert
parentcc665bd8eae066519430782f0397301fbd94b81b (diff)
downloadopenembedded-6676586580fa15bbf5a4d430a45b96b2e4875c7d.tar.gz
libdessert: introduce framework to develop routing protocols
Diffstat (limited to 'recipes/libdessert')
-rw-r--r--recipes/libdessert/files/0001-big-fat-autotools-patch.patch78653
-rw-r--r--recipes/libdessert/libdessert_0.86.14.bb15
2 files changed, 78668 insertions, 0 deletions
diff --git a/recipes/libdessert/files/0001-big-fat-autotools-patch.patch b/recipes/libdessert/files/0001-big-fat-autotools-patch.patch
new file mode 100644
index 0000000000..6a396bf2a8
--- /dev/null
+++ b/recipes/libdessert/files/0001-big-fat-autotools-patch.patch
@@ -0,0 +1,78653 @@
+From 93d0a4993100114f3ac89af5a3d95d14483817c0 Mon Sep 17 00:00:00 2001
+From: woglinde <woglinde@rhein.zuhause.netz>
+Date: Sat, 5 Dec 2009 01:09:35 +0100
+Subject: [PATCH] *big fat autotools patch
+
+---
+ AUTHORS | 2 +
+ COPYING | 674 ++
+ ChangeLog | 7 +
+ DES-SERT.doxyfile | 2 +-
+ INSTALL | 302 +
+ Intro.txt | 270 -
+ Makefile | 154 -
+ Makefile.am | 11 +
+ Makefile.in | 924 ++
+ NEWS | 1 +
+ README | 270 +
+ autogen.sh | 2 +
+ changelog.gz | Bin 260 -> 0 bytes
+ config.guess | 1533 +++
+ config.h.in | 205 +
+ config.sub | 1693 +++
+ configure |16274 ++++++++++++++++++++++++++
+ configure.ac | 93 +
+ depcomp | 630 +
+ dessert.h | 1334 ---
+ dessert_agentx.c | 563 -
+ dessert_cli.c | 255 -
+ dessert_core.c | 241 -
+ dessert_internal.h | 219 -
+ dessert_log.c | 417 -
+ dessert_meshiface.c | 1220 --
+ dessert_msg.c | 876 --
+ dessert_periodic.c | 326 -
+ dessert_sysiface.c | 487 -
+ doxygen-include.am | 203 +
+ include/Makefile.am | 3 +
+ include/Makefile.in | 489 +
+ include/dessert/dessert.h | 1334 +++
+ include/dessert/utlist.h | 349 +
+ install-sh | 520 +
+ libdessert.pc.in | 11 +
+ ltmain.sh | 8413 +++++++++++++
+ m4/ac_doxygen.m4 | 324 +
+ m4/ax_pthread.m4 | 272 +
+ m4/net-snmp.m4 | 10 +
+ m4/pcap.m4 | 10 +
+ missing | 376 +
+ snmp/dessertAppParamsTable.c | 231 -
+ snmp/dessertAppParamsTable.h | 252 -
+ snmp/dessertAppParamsTable_data_access.c | 352 -
+ snmp/dessertAppParamsTable_data_access.h | 93 -
+ snmp/dessertAppParamsTable_data_get.c | 731 --
+ snmp/dessertAppParamsTable_data_get.h | 136 -
+ snmp/dessertAppParamsTable_data_set.c | 1241 --
+ snmp/dessertAppParamsTable_data_set.h | 168 -
+ snmp/dessertAppParamsTable_enums.h | 93 -
+ snmp/dessertAppParamsTable_interface.c | 1843 ---
+ snmp/dessertAppParamsTable_interface.h | 101 -
+ snmp/dessertAppParamsTable_oids.h | 56 -
+ snmp/dessertAppStatsTable.c | 173 -
+ snmp/dessertAppStatsTable.h | 251 -
+ snmp/dessertAppStatsTable_data_access.c | 407 -
+ snmp/dessertAppStatsTable_data_access.h | 93 -
+ snmp/dessertAppStatsTable_data_get.c | 1088 --
+ snmp/dessertAppStatsTable_data_get.h | 174 -
+ snmp/dessertAppStatsTable_data_set.c | 28 -
+ snmp/dessertAppStatsTable_data_set.h | 28 -
+ snmp/dessertAppStatsTable_enums.h | 118 -
+ snmp/dessertAppStatsTable_interface.c | 1069 --
+ snmp/dessertAppStatsTable_interface.h | 98 -
+ snmp/dessertAppStatsTable_oids.h | 64 -
+ snmp/dessertMeshifTable.c | 214 -
+ snmp/dessertMeshifTable.h | 222 -
+ snmp/dessertMeshifTable_data_access.c | 377 -
+ snmp/dessertMeshifTable_data_access.h | 77 -
+ snmp/dessertMeshifTable_data_get.c | 522 -
+ snmp/dessertMeshifTable_data_get.h | 109 -
+ snmp/dessertMeshifTable_data_set.c | 28 -
+ snmp/dessertMeshifTable_data_set.h | 28 -
+ snmp/dessertMeshifTable_enums.h | 39 -
+ snmp/dessertMeshifTable_interface.c | 944 --
+ snmp/dessertMeshifTable_interface.h | 98 -
+ snmp/dessertMeshifTable_oids.h | 43 -
+ snmp/dessertObjects.c | 164 -
+ snmp/dessertObjects.h | 17 -
+ snmp/dessertSysifTable.c | 215 -
+ snmp/dessertSysifTable.h | 230 -
+ snmp/dessertSysifTable_data_access.c | 342 -
+ snmp/dessertSysifTable_data_access.h | 90 -
+ snmp/dessertSysifTable_data_get.c | 507 -
+ snmp/dessertSysifTable_data_get.h | 105 -
+ snmp/dessertSysifTable_data_set.c | 28 -
+ snmp/dessertSysifTable_data_set.h | 28 -
+ snmp/dessertSysifTable_enums.h | 39 -
+ snmp/dessertSysifTable_interface.c | 936 --
+ snmp/dessertSysifTable_interface.h | 97 -
+ snmp/dessertSysifTable_oids.h | 43 -
+ snmp/dessertSysifTable_subagent.c | 202 -
+ src/Makefile.am | 3 +
+ src/Makefile.in | 590 +
+ src/libdessert/Makefile.am | 21 +
+ src/libdessert/Makefile.in | 579 +
+ src/libdessert/dessert_agentx.c | 563 +
+ src/libdessert/dessert_cli.c | 257 +
+ src/libdessert/dessert_core.c | 241 +
+ src/libdessert/dessert_internal.h | 219 +
+ src/libdessert/dessert_log.c | 417 +
+ src/libdessert/dessert_meshiface.c | 1221 ++
+ src/libdessert/dessert_msg.c | 876 ++
+ src/libdessert/dessert_periodic.c | 326 +
+ src/libdessert/dessert_sysiface.c | 487 +
+ src/snmp/Makefile.am | 60 +
+ src/snmp/Makefile.in | 582 +
+ src/snmp/dessertAppParamsTable.c | 231 +
+ src/snmp/dessertAppParamsTable.h | 252 +
+ src/snmp/dessertAppParamsTable_data_access.c | 352 +
+ src/snmp/dessertAppParamsTable_data_access.h | 93 +
+ src/snmp/dessertAppParamsTable_data_get.c | 731 ++
+ src/snmp/dessertAppParamsTable_data_get.h | 136 +
+ src/snmp/dessertAppParamsTable_data_set.c | 1241 ++
+ src/snmp/dessertAppParamsTable_data_set.h | 168 +
+ src/snmp/dessertAppParamsTable_enums.h | 93 +
+ src/snmp/dessertAppParamsTable_interface.c | 1843 +++
+ src/snmp/dessertAppParamsTable_interface.h | 101 +
+ src/snmp/dessertAppParamsTable_oids.h | 56 +
+ src/snmp/dessertAppStatsTable.c | 173 +
+ src/snmp/dessertAppStatsTable.h | 251 +
+ src/snmp/dessertAppStatsTable_data_access.c | 407 +
+ src/snmp/dessertAppStatsTable_data_access.h | 93 +
+ src/snmp/dessertAppStatsTable_data_get.c | 1088 ++
+ src/snmp/dessertAppStatsTable_data_get.h | 174 +
+ src/snmp/dessertAppStatsTable_data_set.c | 28 +
+ src/snmp/dessertAppStatsTable_data_set.h | 28 +
+ src/snmp/dessertAppStatsTable_enums.h | 118 +
+ src/snmp/dessertAppStatsTable_interface.c | 1069 ++
+ src/snmp/dessertAppStatsTable_interface.h | 98 +
+ src/snmp/dessertAppStatsTable_oids.h | 64 +
+ src/snmp/dessertMeshifTable.c | 214 +
+ src/snmp/dessertMeshifTable.h | 222 +
+ src/snmp/dessertMeshifTable_data_access.c | 371 +
+ src/snmp/dessertMeshifTable_data_access.h | 77 +
+ src/snmp/dessertMeshifTable_data_get.c | 522 +
+ src/snmp/dessertMeshifTable_data_get.h | 109 +
+ src/snmp/dessertMeshifTable_data_set.c | 28 +
+ src/snmp/dessertMeshifTable_data_set.h | 28 +
+ src/snmp/dessertMeshifTable_enums.h | 39 +
+ src/snmp/dessertMeshifTable_interface.c | 944 ++
+ src/snmp/dessertMeshifTable_interface.h | 98 +
+ src/snmp/dessertMeshifTable_oids.h | 43 +
+ src/snmp/dessertObjects.c | 165 +
+ src/snmp/dessertObjects.h | 17 +
+ src/snmp/dessertSysifTable.c | 215 +
+ src/snmp/dessertSysifTable.h | 230 +
+ src/snmp/dessertSysifTable_data_access.c | 336 +
+ src/snmp/dessertSysifTable_data_access.h | 90 +
+ src/snmp/dessertSysifTable_data_get.c | 507 +
+ src/snmp/dessertSysifTable_data_get.h | 105 +
+ src/snmp/dessertSysifTable_data_set.c | 28 +
+ src/snmp/dessertSysifTable_data_set.h | 28 +
+ src/snmp/dessertSysifTable_enums.h | 39 +
+ src/snmp/dessertSysifTable_interface.c | 936 ++
+ src/snmp/dessertSysifTable_interface.h | 97 +
+ src/snmp/dessertSysifTable_oids.h | 43 +
+ src/snmp/dessertSysifTable_subagent.c | 202 +
+ utlist.h | 349 -
+ 160 files changed, 55999 insertions(+), 21344 deletions(-)
+ create mode 100644 COPYING
+ create mode 100644 ChangeLog
+ create mode 100644 INSTALL
+ delete mode 100644 Intro.txt
+ delete mode 100644 Makefile
+ create mode 100644 Makefile.am
+ create mode 100644 Makefile.in
+ create mode 100644 NEWS
+ create mode 100644 README
+ create mode 100755 autogen.sh
+ delete mode 100644 changelog.gz
+ create mode 100755 config.guess
+ create mode 100644 config.h.in
+ create mode 100755 config.sub
+ create mode 100755 configure
+ create mode 100644 configure.ac
+ create mode 100755 depcomp
+ delete mode 100644 dessert.h
+ delete mode 100644 dessert_agentx.c
+ delete mode 100644 dessert_cli.c
+ delete mode 100644 dessert_core.c
+ delete mode 100644 dessert_internal.h
+ delete mode 100644 dessert_log.c
+ delete mode 100644 dessert_meshiface.c
+ delete mode 100644 dessert_msg.c
+ delete mode 100644 dessert_periodic.c
+ delete mode 100644 dessert_sysiface.c
+ create mode 100644 doxygen-include.am
+ create mode 100644 include/Makefile.am
+ create mode 100644 include/Makefile.in
+ create mode 100644 include/dessert/dessert.h
+ create mode 100644 include/dessert/utlist.h
+ create mode 100755 install-sh
+ create mode 100644 libdessert.pc.in
+ create mode 100755 ltmain.sh
+ create mode 100644 m4/ac_doxygen.m4
+ create mode 100644 m4/ax_pthread.m4
+ create mode 100644 m4/net-snmp.m4
+ create mode 100644 m4/pcap.m4
+ create mode 100755 missing
+ delete mode 100644 snmp/dessertAppParamsTable.c
+ delete mode 100644 snmp/dessertAppParamsTable.h
+ delete mode 100644 snmp/dessertAppParamsTable_data_access.c
+ delete mode 100644 snmp/dessertAppParamsTable_data_access.h
+ delete mode 100644 snmp/dessertAppParamsTable_data_get.c
+ delete mode 100644 snmp/dessertAppParamsTable_data_get.h
+ delete mode 100644 snmp/dessertAppParamsTable_data_set.c
+ delete mode 100644 snmp/dessertAppParamsTable_data_set.h
+ delete mode 100644 snmp/dessertAppParamsTable_enums.h
+ delete mode 100644 snmp/dessertAppParamsTable_interface.c
+ delete mode 100644 snmp/dessertAppParamsTable_interface.h
+ delete mode 100644 snmp/dessertAppParamsTable_oids.h
+ delete mode 100644 snmp/dessertAppStatsTable.c
+ delete mode 100644 snmp/dessertAppStatsTable.h
+ delete mode 100644 snmp/dessertAppStatsTable_data_access.c
+ delete mode 100644 snmp/dessertAppStatsTable_data_access.h
+ delete mode 100644 snmp/dessertAppStatsTable_data_get.c
+ delete mode 100644 snmp/dessertAppStatsTable_data_get.h
+ delete mode 100644 snmp/dessertAppStatsTable_data_set.c
+ delete mode 100644 snmp/dessertAppStatsTable_data_set.h
+ delete mode 100644 snmp/dessertAppStatsTable_enums.h
+ delete mode 100644 snmp/dessertAppStatsTable_interface.c
+ delete mode 100644 snmp/dessertAppStatsTable_interface.h
+ delete mode 100644 snmp/dessertAppStatsTable_oids.h
+ delete mode 100644 snmp/dessertMeshifTable.c
+ delete mode 100644 snmp/dessertMeshifTable.h
+ delete mode 100644 snmp/dessertMeshifTable_data_access.c
+ delete mode 100644 snmp/dessertMeshifTable_data_access.h
+ delete mode 100644 snmp/dessertMeshifTable_data_get.c
+ delete mode 100644 snmp/dessertMeshifTable_data_get.h
+ delete mode 100644 snmp/dessertMeshifTable_data_set.c
+ delete mode 100644 snmp/dessertMeshifTable_data_set.h
+ delete mode 100644 snmp/dessertMeshifTable_enums.h
+ delete mode 100644 snmp/dessertMeshifTable_interface.c
+ delete mode 100644 snmp/dessertMeshifTable_interface.h
+ delete mode 100644 snmp/dessertMeshifTable_oids.h
+ delete mode 100644 snmp/dessertObjects.c
+ delete mode 100644 snmp/dessertObjects.h
+ delete mode 100644 snmp/dessertSysifTable.c
+ delete mode 100644 snmp/dessertSysifTable.h
+ delete mode 100644 snmp/dessertSysifTable_data_access.c
+ delete mode 100644 snmp/dessertSysifTable_data_access.h
+ delete mode 100644 snmp/dessertSysifTable_data_get.c
+ delete mode 100644 snmp/dessertSysifTable_data_get.h
+ delete mode 100644 snmp/dessertSysifTable_data_set.c
+ delete mode 100644 snmp/dessertSysifTable_data_set.h
+ delete mode 100644 snmp/dessertSysifTable_enums.h
+ delete mode 100644 snmp/dessertSysifTable_interface.c
+ delete mode 100644 snmp/dessertSysifTable_interface.h
+ delete mode 100644 snmp/dessertSysifTable_oids.h
+ delete mode 100644 snmp/dessertSysifTable_subagent.c
+ create mode 100644 src/Makefile.am
+ create mode 100644 src/Makefile.in
+ create mode 100644 src/libdessert/Makefile.am
+ create mode 100644 src/libdessert/Makefile.in
+ create mode 100644 src/libdessert/dessert_agentx.c
+ create mode 100644 src/libdessert/dessert_cli.c
+ create mode 100644 src/libdessert/dessert_core.c
+ create mode 100644 src/libdessert/dessert_internal.h
+ create mode 100644 src/libdessert/dessert_log.c
+ create mode 100644 src/libdessert/dessert_meshiface.c
+ create mode 100644 src/libdessert/dessert_msg.c
+ create mode 100644 src/libdessert/dessert_periodic.c
+ create mode 100644 src/libdessert/dessert_sysiface.c
+ create mode 100644 src/snmp/Makefile.am
+ create mode 100644 src/snmp/Makefile.in
+ create mode 100644 src/snmp/dessertAppParamsTable.c
+ create mode 100644 src/snmp/dessertAppParamsTable.h
+ create mode 100644 src/snmp/dessertAppParamsTable_data_access.c
+ create mode 100644 src/snmp/dessertAppParamsTable_data_access.h
+ create mode 100644 src/snmp/dessertAppParamsTable_data_get.c
+ create mode 100644 src/snmp/dessertAppParamsTable_data_get.h
+ create mode 100644 src/snmp/dessertAppParamsTable_data_set.c
+ create mode 100644 src/snmp/dessertAppParamsTable_data_set.h
+ create mode 100644 src/snmp/dessertAppParamsTable_enums.h
+ create mode 100644 src/snmp/dessertAppParamsTable_interface.c
+ create mode 100644 src/snmp/dessertAppParamsTable_interface.h
+ create mode 100644 src/snmp/dessertAppParamsTable_oids.h
+ create mode 100644 src/snmp/dessertAppStatsTable.c
+ create mode 100644 src/snmp/dessertAppStatsTable.h
+ create mode 100644 src/snmp/dessertAppStatsTable_data_access.c
+ create mode 100644 src/snmp/dessertAppStatsTable_data_access.h
+ create mode 100644 src/snmp/dessertAppStatsTable_data_get.c
+ create mode 100644 src/snmp/dessertAppStatsTable_data_get.h
+ create mode 100644 src/snmp/dessertAppStatsTable_data_set.c
+ create mode 100644 src/snmp/dessertAppStatsTable_data_set.h
+ create mode 100644 src/snmp/dessertAppStatsTable_enums.h
+ create mode 100644 src/snmp/dessertAppStatsTable_interface.c
+ create mode 100644 src/snmp/dessertAppStatsTable_interface.h
+ create mode 100644 src/snmp/dessertAppStatsTable_oids.h
+ create mode 100644 src/snmp/dessertMeshifTable.c
+ create mode 100644 src/snmp/dessertMeshifTable.h
+ create mode 100644 src/snmp/dessertMeshifTable_data_access.c
+ create mode 100644 src/snmp/dessertMeshifTable_data_access.h
+ create mode 100644 src/snmp/dessertMeshifTable_data_get.c
+ create mode 100644 src/snmp/dessertMeshifTable_data_get.h
+ create mode 100644 src/snmp/dessertMeshifTable_data_set.c
+ create mode 100644 src/snmp/dessertMeshifTable_data_set.h
+ create mode 100644 src/snmp/dessertMeshifTable_enums.h
+ create mode 100644 src/snmp/dessertMeshifTable_interface.c
+ create mode 100644 src/snmp/dessertMeshifTable_interface.h
+ create mode 100644 src/snmp/dessertMeshifTable_oids.h
+ create mode 100644 src/snmp/dessertObjects.c
+ create mode 100644 src/snmp/dessertObjects.h
+ create mode 100644 src/snmp/dessertSysifTable.c
+ create mode 100644 src/snmp/dessertSysifTable.h
+ create mode 100644 src/snmp/dessertSysifTable_data_access.c
+ create mode 100644 src/snmp/dessertSysifTable_data_access.h
+ create mode 100644 src/snmp/dessertSysifTable_data_get.c
+ create mode 100644 src/snmp/dessertSysifTable_data_get.h
+ create mode 100644 src/snmp/dessertSysifTable_data_set.c
+ create mode 100644 src/snmp/dessertSysifTable_data_set.h
+ create mode 100644 src/snmp/dessertSysifTable_enums.h
+ create mode 100644 src/snmp/dessertSysifTable_interface.c
+ create mode 100644 src/snmp/dessertSysifTable_interface.h
+ create mode 100644 src/snmp/dessertSysifTable_oids.h
+ create mode 100644 src/snmp/dessertSysifTable_subagent.c
+ delete mode 100644 utlist.h
+
+diff --git a/AUTHORS b/AUTHORS
+index 6cf4381..1e3383e 100644
+--- a/AUTHORS
++++ b/AUTHORS
+@@ -15,6 +15,8 @@ Bug reports and contributions by:
+ Wladimir Degtjarew <degtjare@inf.fu-berlin.de>
+ Sebastian Hofmann <shof@inf.fu-berlin.de>
+
++Autotools:
++ Henning Heinold <heinold@inf.fu-berlin.de>
+
+ DES-SERT is under development at Freie Universitaet Berlin, Germany
+ Distributed, Embedded Systems (DES) research group, Prof Mesut Guenes
+diff --git a/COPYING b/COPYING
+new file mode 100644
+index 0000000..94a9ed0
+--- /dev/null
++++ b/COPYING
+@@ -0,0 +1,674 @@
++ GNU GENERAL PUBLIC LICENSE
++ Version 3, 29 June 2007
++
++ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
++ Everyone is permitted to copy and distribute verbatim copies
++ of this license document, but changing it is not allowed.
++
++ Preamble
++
++ The GNU General Public License is a free, copyleft license for
++software and other kinds of works.
++
++ The licenses for most software and other practical works are designed
++to take away your freedom to share and change the works. By contrast,
++the GNU General Public License is intended to guarantee your freedom to
++share and change all versions of a program--to make sure it remains free
++software for all its users. We, the Free Software Foundation, use the
++GNU General Public License for most of our software; it applies also to
++any other work released this way by its authors. You can apply it to
++your programs, too.
++
++ When we speak of free software, we are referring to freedom, not
++price. Our General Public Licenses are designed to make sure that you
++have the freedom to distribute copies of free software (and charge for
++them if you wish), that you receive source code or can get it if you
++want it, that you can change the software or use pieces of it in new
++free programs, and that you know you can do these things.
++
++ To protect your rights, we need to prevent others from denying you
++these rights or asking you to surrender the rights. Therefore, you have
++certain responsibilities if you distribute copies of the software, or if
++you modify it: responsibilities to respect the freedom of others.
++
++ For example, if you distribute copies of such a program, whether
++gratis or for a fee, you must pass on to the recipients the same
++freedoms that you received. You must make sure that they, too, receive
++or can get the source code. And you must show them these terms so they
++know their rights.
++
++ Developers that use the GNU GPL protect your rights with two steps:
++(1) assert copyright on the software, and (2) offer you this License
++giving you legal permission to copy, distribute and/or modify it.
++
++ For the developers' and authors' protection, the GPL clearly explains
++that there is no warranty for this free software. For both users' and
++authors' sake, the GPL requires that modified versions be marked as
++changed, so that their problems will not be attributed erroneously to
++authors of previous versions.
++
++ Some devices are designed to deny users access to install or run
++modified versions of the software inside them, although the manufacturer
++can do so. This is fundamentally incompatible with the aim of
++protecting users' freedom to change the software. The systematic
++pattern of such abuse occurs in the area of products for individuals to
++use, which is precisely where it is most unacceptable. Therefore, we
++have designed this version of the GPL to prohibit the practice for those
++products. If such problems arise substantially in other domains, we
++stand ready to extend this provision to those domains in future versions
++of the GPL, as needed to protect the freedom of users.
++
++ Finally, every program is threatened constantly by software patents.
++States should not allow patents to restrict development and use of
++software on general-purpose computers, but in those that do, we wish to
++avoid the special danger that patents applied to a free program could
++make it effectively proprietary. To prevent this, the GPL assures that
++patents cannot be used to render the program non-free.
++
++ The precise terms and conditions for copying, distribution and
++modification follow.
++
++ TERMS AND CONDITIONS
++
++ 0. Definitions.
++
++ "This License" refers to version 3 of the GNU General Public License.
++
++ "Copyright" also means copyright-like laws that apply to other kinds of
++works, such as semiconductor masks.
++
++ "The Program" refers to any copyrightable work licensed under this
++License. Each licensee is addressed as "you". "Licensees" and
++"recipients" may be individuals or organizations.
++
++ To "modify" a work means to copy from or adapt all or part of the work
++in a fashion requiring copyright permission, other than the making of an
++exact copy. The resulting work is called a "modified version" of the
++earlier work or a work "based on" the earlier work.
++
++ A "covered work" means either the unmodified Program or a work based
++on the Program.
++
++ To "propagate" a work means to do anything with it that, without
++permission, would make you directly or secondarily liable for
++infringement under applicable copyright law, except executing it on a
++computer or modifying a private copy. Propagation includes copying,
++distribution (with or without modification), making available to the
++public, and in some countries other activities as well.
++
++ To "convey" a work means any kind of propagation that enables other
++parties to make or receive copies. Mere interaction with a user through
++a computer network, with no transfer of a copy, is not conveying.
++
++ An interactive user interface displays "Appropriate Legal Notices"
++to the extent that it includes a convenient and prominently visible
++feature that (1) displays an appropriate copyright notice, and (2)
++tells the user that there is no warranty for the work (except to the
++extent that warranties are provided), that licensees may convey the
++work under this License, and how to view a copy of this License. If
++the interface presents a list of user commands or options, such as a
++menu, a prominent item in the list meets this criterion.
++
++ 1. Source Code.
++
++ The "source code" for a work means the preferred form of the work
++for making modifications to it. "Object code" means any non-source
++form of a work.
++
++ A "Standard Interface" means an interface that either is an official
++standard defined by a recognized standards body, or, in the case of
++interfaces specified for a particular programming language, one that
++is widely used among developers working in that language.
++
++ The "System Libraries" of an executable work include anything, other
++than the work as a whole, that (a) is included in the normal form of
++packaging a Major Component, but which is not part of that Major
++Component, and (b) serves only to enable use of the work with that
++Major Component, or to implement a Standard Interface for which an
++implementation is available to the public in source code form. A
++"Major Component", in this context, means a major essential component
++(kernel, window system, and so on) of the specific operating system
++(if any) on which the executable work runs, or a compiler used to
++produce the work, or an object code interpreter used to run it.
++
++ The "Corresponding Source" for a work in object code form means all
++the source code needed to generate, install, and (for an executable
++work) run the object code and to modify the work, including scripts to
++control those activities. However, it does not include the work's
++System Libraries, or general-purpose tools or generally available free
++programs which are used unmodified in performing those activities but
++which are not part of the work. For example, Corresponding Source
++includes interface definition files associated with source files for
++the work, and the source code for shared libraries and dynamically
++linked subprograms that the work is specifically designed to require,
++such as by intimate data communication or control flow between those
++subprograms and other parts of the work.
++
++ The Corresponding Source need not include anything that users
++can regenerate automatically from other parts of the Corresponding
++Source.
++
++ The Corresponding Source for a work in source code form is that
++same work.
++
++ 2. Basic Permissions.
++
++ All rights granted under this License are granted for the term of
++copyright on the Program, and are irrevocable provided the stated
++conditions are met. This License explicitly affirms your unlimited
++permission to run the unmodified Program. The output from running a
++covered work is covered by this License only if the output, given its
++content, constitutes a covered work. This License acknowledges your
++rights of fair use or other equivalent, as provided by copyright law.
++
++ You may make, run and propagate covered works that you do not
++convey, without conditions so long as your license otherwise remains
++in force. You may convey covered works to others for the sole purpose
++of having them make modifications exclusively for you, or provide you
++with facilities for running those works, provided that you comply with
++the terms of this License in conveying all material for which you do
++not control copyright. Those thus making or running the covered works
++for you must do so exclusively on your behalf, under your direction
++and control, on terms that prohibit them from making any copies of
++your copyrighted material outside their relationship with you.
++
++ Conveying under any other circumstances is permitted solely under
++the conditions stated below. Sublicensing is not allowed; section 10
++makes it unnecessary.
++
++ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
++
++ No covered work shall be deemed part of an effective technological
++measure under any applicable law fulfilling obligations under article
++11 of the WIPO copyright treaty adopted on 20 December 1996, or
++similar laws prohibiting or restricting circumvention of such
++measures.
++
++ When you convey a covered work, you waive any legal power to forbid
++circumvention of technological measures to the extent such circumvention
++is effected by exercising rights under this License with respect to
++the covered work, and you disclaim any intention to limit operation or
++modification of the work as a means of enforcing, against the work's
++users, your or third parties' legal rights to forbid circumvention of
++technological measures.
++
++ 4. Conveying Verbatim Copies.
++
++ You may convey verbatim copies of the Program's source code as you
++receive it, in any medium, provided that you conspicuously and
++appropriately publish on each copy an appropriate copyright notice;
++keep intact all notices stating that this License and any
++non-permissive terms added in accord with section 7 apply to the code;
++keep intact all notices of the absence of any warranty; and give all
++recipients a copy of this License along with the Program.
++
++ You may charge any price or no price for each copy that you convey,
++and you may offer support or warranty protection for a fee.
++
++ 5. Conveying Modified Source Versions.
++
++ You may convey a work based on the Program, or the modifications to
++produce it from the Program, in the form of source code under the
++terms of section 4, provided that you also meet all of these conditions:
++
++ a) The work must carry prominent notices stating that you modified
++ it, and giving a relevant date.
++
++ b) The work must carry prominent notices stating that it is
++ released under this License and any conditions added under section
++ 7. This requirement modifies the requirement in section 4 to
++ "keep intact all notices".
++
++ c) You must license the entire work, as a whole, under this
++ License to anyone who comes into possession of a copy. This
++ License will therefore apply, along with any applicable section 7
++ additional terms, to the whole of the work, and all its parts,
++ regardless of how they are packaged. This License gives no
++ permission to license the work in any other way, but it does not
++ invalidate such permission if you have separately received it.
++
++ d) If the work has interactive user interfaces, each must display
++ Appropriate Legal Notices; however, if the Program has interactive
++ interfaces that do not display Appropriate Legal Notices, your
++ work need not make them do so.
++
++ A compilation of a covered work with other separate and independent
++works, which are not by their nature extensions of the covered work,
++and which are not combined with it such as to form a larger program,
++in or on a volume of a storage or distribution medium, is called an
++"aggregate" if the compilation and its resulting copyright are not
++used to limit the access or legal rights of the compilation's users
++beyond what the individual works permit. Inclusion of a covered work
++in an aggregate does not cause this License to apply to the other
++parts of the aggregate.
++
++ 6. Conveying Non-Source Forms.
++
++ You may convey a covered work in object code form under the terms
++of sections 4 and 5, provided that you also convey the
++machine-readable Corresponding Source under the terms of this License,
++in one of these ways:
++
++ a) Convey the object code in, or embodied in, a physical product
++ (including a physical distribution medium), accompanied by the
++ Corresponding Source fixed on a durable physical medium
++ customarily used for software interchange.
++
++ b) Convey the object code in, or embodied in, a physical product
++ (including a physical distribution medium), accompanied by a
++ written offer, valid for at least three years and valid for as
++ long as you offer spare parts or customer support for that product
++ model, to give anyone who possesses the object code either (1) a
++ copy of the Corresponding Source for all the software in the
++ product that is covered by this License, on a durable physical
++ medium customarily used for software interchange, for a price no
++ more than your reasonable cost of physically performing this
++ conveying of source, or (2) access to copy the
++ Corresponding Source from a network server at no charge.
++
++ c) Convey individual copies of the object code with a copy of the
++ written offer to provide the Corresponding Source. This
++ alternative is allowed only occasionally and noncommercially, and
++ only if you received the object code with such an offer, in accord
++ with subsection 6b.
++
++ d) Convey the object code by offering access from a designated
++ place (gratis or for a charge), and offer equivalent access to the
++ Corresponding Source in the same way through the same place at no
++ further charge. You need not require recipients to copy the
++ Corresponding Source along with the object code. If the place to
++ copy the object code is a network server, the Corresponding Source
++ may be on a different server (operated by you or a third party)
++ that supports equivalent copying facilities, provided you maintain
++ clear directions next to the object code saying where to find the
++ Corresponding Source. Regardless of what server hosts the
++ Corresponding Source, you remain obligated to ensure that it is
++ available for as long as needed to satisfy these requirements.
++
++ e) Convey the object code using peer-to-peer transmission, provided
++ you inform other peers where the object code and Corresponding
++ Source of the work are being offered to the general public at no
++ charge under subsection 6d.
++
++ A separable portion of the object code, whose source code is excluded
++from the Corresponding Source as a System Library, need not be
++included in conveying the object code work.
++
++ A "User Product" is either (1) a "consumer product", which means any
++tangible personal property which is normally used for personal, family,
++or household purposes, or (2) anything designed or sold for incorporation
++into a dwelling. In determining whether a product is a consumer product,
++doubtful cases shall be resolved in favor of coverage. For a particular
++product received by a particular user, "normally used" refers to a
++typical or common use of that class of product, regardless of the status
++of the particular user or of the way in which the particular user
++actually uses, or expects or is expected to use, the product. A product
++is a consumer product regardless of whether the product has substantial
++commercial, industrial or non-consumer uses, unless such uses represent
++the only significant mode of use of the product.
++
++ "Installation Information" for a User Product means any methods,
++procedures, authorization keys, or other information required to install
++and execute modified versions of a covered work in that User Product from
++a modified version of its Corresponding Source. The information must
++suffice to ensure that the continued functioning of the modified object
++code is in no case prevented or interfered with solely because
++modification has been made.
++
++ If you convey an object code work under this section in, or with, or
++specifically for use in, a User Product, and the conveying occurs as
++part of a transaction in which the right of possession and use of the
++User Product is transferred to the recipient in perpetuity or for a
++fixed term (regardless of how the transaction is characterized), the
++Corresponding Source conveyed under this section must be accompanied
++by the Installation Information. But this requirement does not apply
++if neither you nor any third party retains the ability to install
++modified object code on the User Product (for example, the work has
++been installed in ROM).
++
++ The requirement to provide Installation Information does not include a
++requirement to continue to provide support service, warranty, or updates
++for a work that has been modified or installed by the recipient, or for
++the User Product in which it has been modified or installed. Access to a
++network may be denied when the modification itself materially and
++adversely affects the operation of the network or violates the rules and
++protocols for communication across the network.
++
++ Corresponding Source conveyed, and Installation Information provided,
++in accord with this section must be in a format that is publicly
++documented (and with an implementation available to the public in
++source code form), and must require no special password or key for
++unpacking, reading or copying.
++
++ 7. Additional Terms.
++
++ "Additional permissions" are terms that supplement the terms of this
++License by making exceptions from one or more of its conditions.
++Additional permissions that are applicable to the entire Program shall
++be treated as though they were included in this License, to the extent
++that they are valid under applicable law. If additional permissions
++apply only to part of the Program, that part may be used separately
++under those permissions, but the entire Program remains governed by
++this License without regard to the additional permissions.
++
++ When you convey a copy of a covered work, you may at your option
++remove any additional permissions from that copy, or from any part of
++it. (Additional permissions may be written to require their own
++removal in certain cases when you modify the work.) You may place
++additional permissions on material, added by you to a covered work,
++for which you have or can give appropriate copyright permission.
++
++ Notwithstanding any other provision of this License, for material you
++add to a covered work, you may (if authorized by the copyright holders of
++that material) supplement the terms of this License with terms:
++
++ a) Disclaiming warranty or limiting liability differently from the
++ terms of sections 15 and 16 of this License; or
++
++ b) Requiring preservation of specified reasonable legal notices or
++ author attributions in that material or in the Appropriate Legal
++ Notices displayed by works containing it; or
++
++ c) Prohibiting misrepresentation of the origin of that material, or
++ requiring that modified versions of such material be marked in
++ reasonable ways as different from the original version; or
++
++ d) Limiting the use for publicity purposes of names of licensors or
++ authors of the material; or
++
++ e) Declining to grant rights under trademark law for use of some
++ trade names, trademarks, or service marks; or
++
++ f) Requiring indemnification of licensors and authors of that
++ material by anyone who conveys the material (or modified versions of
++ it) with contractual assumptions of liability to the recipient, for
++ any liability that these contractual assumptions directly impose on
++ those licensors and authors.
++
++ All other non-permissive additional terms are considered "further
++restrictions" within the meaning of section 10. If the Program as you
++received it, or any part of it, contains a notice stating that it is
++governed by this License along with a term that is a further
++restriction, you may remove that term. If a license document contains
++a further restriction but permits relicensing or conveying under this
++License, you may add to a covered work material governed by the terms
++of that license document, provided that the further restriction does
++not survive such relicensing or conveying.
++
++ If you add terms to a covered work in accord with this section, you
++must place, in the relevant source files, a statement of the
++additional terms that apply to those files, or a notice indicating
++where to find the applicable terms.
++
++ Additional terms, permissive or non-permissive, may be stated in the
++form of a separately written license, or stated as exceptions;
++the above requirements apply either way.
++
++ 8. Termination.
++
++ You may not propagate or modify a covered work except as expressly
++provided under this License. Any attempt otherwise to propagate or
++modify it is void, and will automatically terminate your rights under
++this License (including any patent licenses granted under the third
++paragraph of section 11).
++
++ However, if you cease all violation of this License, then your
++license from a particular copyright holder is reinstated (a)
++provisionally, unless and until the copyright holder explicitly and
++finally terminates your license, and (b) permanently, if the copyright
++holder fails to notify you of the violation by some reasonable means
++prior to 60 days after the cessation.
++
++ Moreover, your license from a particular copyright holder is
++reinstated permanently if the copyright holder notifies you of the
++violation by some reasonable means, this is the first time you have
++received notice of violation of this License (for any work) from that
++copyright holder, and you cure the violation prior to 30 days after
++your receipt of the notice.
++
++ Termination of your rights under this section does not terminate the
++licenses of parties who have received copies or rights from you under
++this License. If your rights have been terminated and not permanently
++reinstated, you do not qualify to receive new licenses for the same
++material under section 10.
++
++ 9. Acceptance Not Required for Having Copies.
++
++ You are not required to accept this License in order to receive or
++run a copy of the Program. Ancillary propagation of a covered work
++occurring solely as a consequence of using peer-to-peer transmission
++to receive a copy likewise does not require acceptance. However,
++nothing other than this License grants you permission to propagate or
++modify any covered work. These actions infringe copyright if you do
++not accept this License. Therefore, by modifying or propagating a
++covered work, you indicate your acceptance of this License to do so.
++
++ 10. Automatic Licensing of Downstream Recipients.
++
++ Each time you convey a covered work, the recipient automatically
++receives a license from the original licensors, to run, modify and
++propagate that work, subject to this License. You are not responsible
++for enforcing compliance by third parties with this License.
++
++ An "entity transaction" is a transaction transferring control of an
++organization, or substantially all assets of one, or subdividing an
++organization, or merging organizations. If propagation of a covered
++work results from an entity transaction, each party to that
++transaction who receives a copy of the work also receives whatever
++licenses to the work the party's predecessor in interest had or could
++give under the previous paragraph, plus a right to possession of the
++Corresponding Source of the work from the predecessor in interest, if
++the predecessor has it or can get it with reasonable efforts.
++
++ You may not impose any further restrictions on the exercise of the
++rights granted or affirmed under this License. For example, you may
++not impose a license fee, royalty, or other charge for exercise of
++rights granted under this License, and you may not initiate litigation
++(including a cross-claim or counterclaim in a lawsuit) alleging that
++any patent claim is infringed by making, using, selling, offering for
++sale, or importing the Program or any portion of it.
++
++ 11. Patents.
++
++ A "contributor" is a copyright holder who authorizes use under this
++License of the Program or a work on which the Program is based. The
++work thus licensed is called the contributor's "contributor version".
++
++ A contributor's "essential patent claims" are all patent claims
++owned or controlled by the contributor, whether already acquired or
++hereafter acquired, that would be infringed by some manner, permitted
++by this License, of making, using, or selling its contributor version,
++but do not include claims that would be infringed only as a
++consequence of further modification of the contributor version. For
++purposes of this definition, "control" includes the right to grant
++patent sublicenses in a manner consistent with the requirements of
++this License.
++
++ Each contributor grants you a non-exclusive, worldwide, royalty-free
++patent license under the contributor's essential patent claims, to
++make, use, sell, offer for sale, import and otherwise run, modify and
++propagate the contents of its contributor version.
++
++ In the following three paragraphs, a "patent license" is any express
++agreement or commitment, however denominated, not to enforce a patent
++(such as an express permission to practice a patent or covenant not to
++sue for patent infringement). To "grant" such a patent license to a
++party means to make such an agreement or commitment not to enforce a
++patent against the party.
++
++ If you convey a covered work, knowingly relying on a patent license,
++and the Corresponding Source of the work is not available for anyone
++to copy, free of charge and under the terms of this License, through a
++publicly available network server or other readily accessible means,
++then you must either (1) cause the Corresponding Source to be so
++available, or (2) arrange to deprive yourself of the benefit of the
++patent license for this particular work, or (3) arrange, in a manner
++consistent with the requirements of this License, to extend the patent
++license to downstream recipients. "Knowingly relying" means you have
++actual knowledge that, but for the patent license, your conveying the
++covered work in a country, or your recipient's use of the covered work
++in a country, would infringe one or more identifiable patents in that
++country that you have reason to believe are valid.
++
++ If, pursuant to or in connection with a single transaction or
++arrangement, you convey, or propagate by procuring conveyance of, a
++covered work, and grant a patent license to some of the parties
++receiving the covered work authorizing them to use, propagate, modify
++or convey a specific copy of the covered work, then the patent license
++you grant is automatically extended to all recipients of the covered
++work and works based on it.
++
++ A patent license is "discriminatory" if it does not include within
++the scope of its coverage, prohibits the exercise of, or is
++conditioned on the non-exercise of one or more of the rights that are
++specifically granted under this License. You may not convey a covered
++work if you are a party to an arrangement with a third party that is
++in the business of distributing software, under which you make payment
++to the third party based on the extent of your activity of conveying
++the work, and under which the third party grants, to any of the
++parties who would receive the covered work from you, a discriminatory
++patent license (a) in connection with copies of the covered work
++conveyed by you (or copies made from those copies), or (b) primarily
++for and in connection with specific products or compilations that
++contain the covered work, unless you entered into that arrangement,
++or that patent license was granted, prior to 28 March 2007.
++
++ Nothing in this License shall be construed as excluding or limiting
++any implied license or other defenses to infringement that may
++otherwise be available to you under applicable patent law.
++
++ 12. No Surrender of Others' Freedom.
++
++ If conditions are imposed on you (whether by court order, agreement or
++otherwise) that contradict the conditions of this License, they do not
++excuse you from the conditions of this License. If you cannot convey a
++covered work so as to satisfy simultaneously your obligations under this
++License and any other pertinent obligations, then as a consequence you may
++not convey it at all. For example, if you agree to terms that obligate you
++to collect a royalty for further conveying from those to whom you convey
++the Program, the only way you could satisfy both those terms and this
++License would be to refrain entirely from conveying the Program.
++
++ 13. Use with the GNU Affero General Public License.
++
++ Notwithstanding any other provision of this License, you have
++permission to link or combine any covered work with a work licensed
++under version 3 of the GNU Affero General Public License into a single
++combined work, and to convey the resulting work. The terms of this
++License will continue to apply to the part which is the covered work,
++but the special requirements of the GNU Affero General Public License,
++section 13, concerning interaction through a network will apply to the
++combination as such.
++
++ 14. Revised Versions of this License.
++
++ The Free Software Foundation may publish revised and/or new versions of
++the GNU General Public License from time to time. Such new versions will
++be similar in spirit to the present version, but may differ in detail to
++address new problems or concerns.
++
++ Each version is given a distinguishing version number. If the
++Program specifies that a certain numbered version of the GNU General
++Public License "or any later version" applies to it, you have the
++option of following the terms and conditions either of that numbered
++version or of any later version published by the Free Software
++Foundation. If the Program does not specify a version number of the
++GNU General Public License, you may choose any version ever published
++by the Free Software Foundation.
++
++ If the Program specifies that a proxy can decide which future
++versions of the GNU General Public License can be used, that proxy's
++public statement of acceptance of a version permanently authorizes you
++to choose that version for the Program.
++
++ Later license versions may give you additional or different
++permissions. However, no additional obligations are imposed on any
++author or copyright holder as a result of your choosing to follow a
++later version.
++
++ 15. Disclaimer of Warranty.
++
++ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
++APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
++HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
++OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
++THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
++PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
++IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
++ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
++
++ 16. Limitation of Liability.
++
++ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
++THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
++GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
++USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
++DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
++PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
++EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
++SUCH DAMAGES.
++
++ 17. Interpretation of Sections 15 and 16.
++
++ If the disclaimer of warranty and limitation of liability provided
++above cannot be given local legal effect according to their terms,
++reviewing courts shall apply local law that most closely approximates
++an absolute waiver of all civil liability in connection with the
++Program, unless a warranty or assumption of liability accompanies a
++copy of the Program in return for a fee.
++
++ END OF TERMS AND CONDITIONS
++
++ How to Apply These Terms to Your New Programs
++
++ If you develop a new program, and you want it to be of the greatest
++possible use to the public, the best way to achieve this is to make it
++free software which everyone can redistribute and change under these terms.
++
++ To do so, attach the following notices to the program. It is safest
++to attach them to the start of each source file to most effectively
++state the exclusion of warranty; and each file should have at least
++the "copyright" line and a pointer to where the full notice is found.
++
++ <one line to give the program's name and a brief idea of what it does.>
++ Copyright (C) <year> <name of author>
++
++ This program is free software: you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation, either version 3 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program. If not, see <http://www.gnu.org/licenses/>.
++
++Also add information on how to contact you by electronic and paper mail.
++
++ If the program does terminal interaction, make it output a short
++notice like this when it starts in an interactive mode:
++
++ <program> Copyright (C) <year> <name of author>
++ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
++ This is free software, and you are welcome to redistribute it
++ under certain conditions; type `show c' for details.
++
++The hypothetical commands `show w' and `show c' should show the appropriate
++parts of the General Public License. Of course, your program's commands
++might be different; for a GUI interface, you would use an "about box".
++
++ You should also get your employer (if you work as a programmer) or school,
++if any, to sign a "copyright disclaimer" for the program, if necessary.
++For more information on this, and how to apply and follow the GNU GPL, see
++<http://www.gnu.org/licenses/>.
++
++ The GNU General Public License does not permit incorporating your program
++into proprietary programs. If your program is a subroutine library, you
++may consider it more useful to permit linking proprietary applications with
++the library. If this is what you want to do, use the GNU Lesser General
++Public License instead of this License. But first, please read
++<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+diff --git a/ChangeLog b/ChangeLog
+new file mode 100644
+index 0000000..24a149f
+--- /dev/null
++++ b/ChangeLog
+@@ -0,0 +1,7 @@
++20091126 - 0.86.13
++ - The sysrxpipeline now properly destroys the passed message on DESSERT_MSG_DROP.
++ Developers, make sure to NOT destroy the msg by yourselves anymore!
++
++20091126 - 0.86.12
++ - Added int dessert_msg_getpayload(dessert_msg_t *msg, void **payload) to
++ retrieve the length of the payload and a pointer to the payload, if any.
+\ No newline at end of file
+diff --git a/DES-SERT.doxyfile b/DES-SERT.doxyfile
+index e92c000..5de05c9 100644
+--- a/DES-SERT.doxyfile
++++ b/DES-SERT.doxyfile
+@@ -568,7 +568,7 @@ WARN_LOGFILE =
+ # directories like "/usr/src/myproject". Separate the files or directories
+ # with spaces.
+
+-INPUT = .
++INPUT = include/dessert src/libdessert
+
+ # This tag can be used to specify the character encoding of the source files
+ # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+diff --git a/INSTALL b/INSTALL
+new file mode 100644
+index 0000000..2550dab
+--- /dev/null
++++ b/INSTALL
+@@ -0,0 +1,302 @@
++Installation Instructions
++*************************
++
++Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
++2006, 2007, 2008, 2009 Free Software Foundation, Inc.
++
++ This file is free documentation; the Free Software Foundation gives
++unlimited permission to copy, distribute and modify it.
++
++Basic Installation
++==================
++
++ Briefly, the shell commands `./configure; make; make install' should
++configure, build, and install this package. The following
++more-detailed instructions are generic; see the `README' file for
++instructions specific to this package.
++
++ The `configure' shell script attempts to guess correct values for
++various system-dependent variables used during compilation. It uses
++those values to create a `Makefile' in each directory of the package.
++It may also create one or more `.h' files containing system-dependent
++definitions. Finally, it creates a shell script `config.status' that
++you can run in the future to recreate the current configuration, and a
++file `config.log' containing compiler output (useful mainly for
++debugging `configure').
++
++ It can also use an optional file (typically called `config.cache'
++and enabled with `--cache-file=config.cache' or simply `-C') that saves
++the results of its tests to speed up reconfiguring. Caching is
++disabled by default to prevent problems with accidental use of stale
++cache files.
++
++ If you need to do unusual things to compile the package, please try
++to figure out how `configure' could check whether to do them, and mail
++diffs or instructions to the address given in the `README' so they can
++be considered for the next release. If you are using the cache, and at
++some point `config.cache' contains results you don't want to keep, you
++may remove or edit it.
++
++ The file `configure.ac' (or `configure.in') is used to create
++`configure' by a program called `autoconf'. You need `configure.ac' if
++you want to change it or regenerate `configure' using a newer version
++of `autoconf'.
++
++The simplest way to compile this package is:
++
++ 1. `cd' to the directory containing the package's source code and type
++ `./configure' to configure the package for your system.
++
++ Running `configure' might take a while. While running, it prints
++ some messages telling which features it is checking for.
++
++ 2. Type `make' to compile the package.
++
++ 3. Optionally, type `make check' to run any self-tests that come with
++ the package.
++
++ 4. Type `make install' to install the programs and any data files and
++ documentation.
++
++ 5. You can remove the program binaries and object files from the
++ source code directory by typing `make clean'. To also remove the
++ files that `configure' created (so you can compile the package for
++ a different kind of computer), type `make distclean'. There is
++ also a `make maintainer-clean' target, but that is intended mainly
++ for the package's developers. If you use it, you may have to get
++ all sorts of other programs in order to regenerate files that came
++ with the distribution.
++
++ 6. Often, you can also type `make uninstall' to remove the installed
++ files again.
++
++Compilers and Options
++=====================
++
++ Some systems require unusual options for compilation or linking that
++the `configure' script does not know about. Run `./configure --help'
++for details on some of the pertinent environment variables.
++
++ You can give `configure' initial values for configuration parameters
++by setting variables in the command line or in the environment. Here
++is an example:
++
++ ./configure CC=c99 CFLAGS=-g LIBS=-lposix
++
++ *Note Defining Variables::, for more details.
++
++Compiling For Multiple Architectures
++====================================
++
++ You can compile the package for more than one kind of computer at the
++same time, by placing the object files for each architecture in their
++own directory. To do this, you can use GNU `make'. `cd' to the
++directory where you want the object files and executables to go and run
++the `configure' script. `configure' automatically checks for the
++source code in the directory that `configure' is in and in `..'.
++
++ With a non-GNU `make', it is safer to compile the package for one
++architecture at a time in the source code directory. After you have
++installed the package for one architecture, use `make distclean' before
++reconfiguring for another architecture.
++
++ On MacOS X 10.5 and later systems, you can create libraries and
++executables that work on multiple system types--known as "fat" or
++"universal" binaries--by specifying multiple `-arch' options to the
++compiler but only a single `-arch' option to the preprocessor. Like
++this:
++
++ ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
++ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
++ CPP="gcc -E" CXXCPP="g++ -E"
++
++ This is not guaranteed to produce working output in all cases, you
++may have to build one architecture at a time and combine the results
++using the `lipo' tool if you have problems.
++
++Installation Names
++==================
++
++ By default, `make install' installs the package's commands under
++`/usr/local/bin', include files under `/usr/local/include', etc. You
++can specify an installation prefix other than `/usr/local' by giving
++`configure' the option `--prefix=PREFIX'.
++
++ You can specify separate installation prefixes for
++architecture-specific files and architecture-independent files. If you
++pass the option `--exec-prefix=PREFIX' to `configure', the package uses
++PREFIX as the prefix for installing programs and libraries.
++Documentation and other data files still use the regular prefix.
++
++ In addition, if you use an unusual directory layout you can give
++options like `--bindir=DIR' to specify different values for particular
++kinds of files. Run `configure --help' for a list of the directories
++you can set and what kinds of files go in them.
++
++ If the package supports it, you can cause programs to be installed
++with an extra prefix or suffix on their names by giving `configure' the
++option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
++
++Optional Features
++=================
++
++ Some packages pay attention to `--enable-FEATURE' options to
++`configure', where FEATURE indicates an optional part of the package.
++They may also pay attention to `--with-PACKAGE' options, where PACKAGE
++is something like `gnu-as' or `x' (for the X Window System). The
++`README' should mention any `--enable-' and `--with-' options that the
++package recognizes.
++
++ For packages that use the X Window System, `configure' can usually
++find the X include and library files automatically, but if it doesn't,
++you can use the `configure' options `--x-includes=DIR' and
++`--x-libraries=DIR' to specify their locations.
++
++Particular systems
++==================
++
++ On HP-UX, the default C compiler is not ANSI C compatible. If GNU
++CC is not installed, it is recommended to use the following options in
++order to use an ANSI C compiler:
++
++ ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
++
++and if that doesn't work, install pre-built binaries of GCC for HP-UX.
++
++ On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
++parse its `<wchar.h>' header file. The option `-nodtk' can be used as
++a workaround. If GNU CC is not installed, it is therefore recommended
++to try
++
++ ./configure CC="cc"
++
++and if that doesn't work, try
++
++ ./configure CC="cc -nodtk"
++
++ On Solaris, don't put `/usr/ucb' early in your `PATH'. This
++directory contains several dysfunctional programs; working variants of
++these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
++in your `PATH', put it _after_ `/usr/bin'.
++
++ On Haiku, software installed for all users goes in `/boot/common',
++not `/usr/local'. It is recommended to use the following options:
++
++ ./configure --prefix=/boot/common
++
++Specifying the System Type
++==========================
++
++ There may be some features `configure' cannot figure out
++automatically, but needs to determine by the type of machine the package
++will run on. Usually, assuming the package is built to be run on the
++_same_ architectures, `configure' can figure that out, but if it prints
++a message saying it cannot guess the machine type, give it the
++`--build=TYPE' option. TYPE can either be a short name for the system
++type, such as `sun4', or a canonical name which has the form:
++
++ CPU-COMPANY-SYSTEM
++
++where SYSTEM can have one of these forms:
++
++ OS
++ KERNEL-OS
++
++ See the file `config.sub' for the possible values of each field. If
++`config.sub' isn't included in this package, then this package doesn't
++need to know the machine type.
++
++ If you are _building_ compiler tools for cross-compiling, you should
++use the option `--target=TYPE' to select the type of system they will
++produce code for.
++
++ If you want to _use_ a cross compiler, that generates code for a
++platform different from the build platform, you should specify the
++"host" platform (i.e., that on which the generated programs will
++eventually be run) with `--host=TYPE'.
++
++Sharing Defaults
++================
++
++ If you want to set default values for `configure' scripts to share,
++you can create a site shell script called `config.site' that gives
++default values for variables like `CC', `cache_file', and `prefix'.
++`configure' looks for `PREFIX/share/config.site' if it exists, then
++`PREFIX/etc/config.site' if it exists. Or, you can set the
++`CONFIG_SITE' environment variable to the location of the site script.
++A warning: not all `configure' scripts look for a site script.
++
++Defining Variables
++==================
++
++ Variables not defined in a site shell script can be set in the
++environment passed to `configure'. However, some packages may run
++configure again during the build, and the customized values of these
++variables may be lost. In order to avoid this problem, you should set
++them in the `configure' command line, using `VAR=value'. For example:
++
++ ./configure CC=/usr/local2/bin/gcc
++
++causes the specified `gcc' to be used as the C compiler (unless it is
++overridden in the site shell script).
++
++Unfortunately, this technique does not work for `CONFIG_SHELL' due to
++an Autoconf bug. Until the bug is fixed you can use this workaround:
++
++ CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
++
++`configure' Invocation
++======================
++
++ `configure' recognizes the following options to control how it
++operates.
++
++`--help'
++`-h'
++ Print a summary of all of the options to `configure', and exit.
++
++`--help=short'
++`--help=recursive'
++ Print a summary of the options unique to this package's
++ `configure', and exit. The `short' variant lists options used
++ only in the top level, while the `recursive' variant lists options
++ also present in any nested packages.
++
++`--version'
++`-V'
++ Print the version of Autoconf used to generate the `configure'
++ script, and exit.
++
++`--cache-file=FILE'
++ Enable the cache: use and save the results of the tests in FILE,
++ traditionally `config.cache'. FILE defaults to `/dev/null' to
++ disable caching.
++
++`--config-cache'
++`-C'
++ Alias for `--cache-file=config.cache'.
++
++`--quiet'
++`--silent'
++`-q'
++ Do not print messages saying which checks are being made. To
++ suppress all normal output, redirect it to `/dev/null' (any error
++ messages will still be shown).
++
++`--srcdir=DIR'
++ Look for the package's source code in directory DIR. Usually
++ `configure' can determine that directory automatically.
++
++`--prefix=DIR'
++ Use DIR as the installation prefix. *Note Installation Names::
++ for more details, including other options available for fine-tuning
++ the installation locations.
++
++`--no-create'
++`-n'
++ Run the configure checks, but stop before creating any output
++ files.
++
++`configure' also accepts some other, not widely useful, options. Run
++`configure --help' for more details.
++
+diff --git a/Intro.txt b/Intro.txt
+deleted file mode 100644
+index f54e509..0000000
+--- a/Intro.txt
++++ /dev/null
+@@ -1,270 +0,0 @@
+-
+- DES-SERT - an Extensible Routing-Framework for Testbeds
+-
+-
+-Copyright
+-
+- Copyright Philipp Schmidt <phils@inf.fu-berlin.de>,
+- Computer Systems and Telematics / Distributed, Embedded Systems (DES) group,
+- Freie Universitaet Berlin
+-
+- This document has been published under GNU Free Documentation License.
+- All rights reserved.
+-
+-
+-1. Introduction
+-
+- DES-SERT, the DES Simple and Extensible Routing-Framework for Testbeds,
+- is a framework designed to assist researchers implementing routing
+- protocols for testbeds.
+-
+- DES-SERT enables the implementation of routing protocols on top of
+- Ethernet via an underlay (Layer 2.5) in user space.
+- It introduces an abstraction from OS specific issues and provides
+- functionality and data structures to implement proactive, reactive,
+- and hybrid routing protocols.
+-
+- While generally usable in many application scenarios, it is primarily
+- used in DES-Mesh (http://www.des-testbed.net/), the multi-transceiver
+- wireless mesh network testbed part of the DES-Testbed.
+-
+-
+-2. DES-SERT Architecture
+-
+- DES-SERT introduces some concepts to implement routing protocols.
+- When implementing a routing protocol with DES-SERT, you should be
+- familiar with these concepts to structure and tailor your implementation.
+-
+-
+-2.1. messages
+-
+- Every packet you send or receive on the mesh is represented as a
+- DES-SERT message. From a programmers point of view, a DES-SERT message
+- is just a C-structure:
+-
+- typedef struct dessert_msg {
+- /** the layer2 header on the wire */
+- struct ether_header l2h;
+- /** short name of the protocol as passed to dessert_init() */
+- char proto[DESSERT_PROTO_STRLEN];
+- /** version of the app as passed to dessert_init() */
+- uint8_t ver;
+- /** flags - bits 1-4 reserved for dessert, bits 5-8 for app usage */
+- uint8_t flags;
+- /** ttl or hopcount field for app usage - 0xff if not used*/
+- uint8_t ttl;
+- /** reserved for app usage - 0x00 if not used */
+- uint8_t u8;
+- /** reserved for app usage - 0xbeef if not used */
+- uint16_t u16;
+- /** header length incl. extensions */
+- uint16_t hlen;
+- /** payload length */
+- uint16_t plen;
+- } dessert_msg_t;
+-
+- Every message sent via the underlay carries this structure as a packet
+- header. All data in a "dessert_msg" is stored in network byte order.
+- DES-SERT tries to care as automatically as possible of this structure.
+- Nevertheless you will have to care at least about: "l2h.ether_dhost" and
+- "ttl".
+-
+- If you need to send some data along with every packet, e.g. some kind of
+- metric or cost your routing protocol uses, you should try to fit this
+- data into the "u8", "u16" and the upper 4 bits of the "flags" field.
+- These fields will never be touched by DES-SERT except on initialization
+- via "dessert_msg_new".
+-
+- Because just a C-structure is not really usable as a packet, there are some
+- utility functions around - please have a look around in "dessert.h" and the
+- doxygen doku. The most important ones are: "dessert_msg_new" and
+- "dessert_msg_destroy", which do not simply allocate memory for a DES-SERT
+- message, but for a whole packet of maximum size and initialize the
+- structures for further packet construction/processing.
+-
+- int dessert_msg_new(dessert_msg_t **msgout);
+-
+- void dessert_msg_destroy(dessert_msg_t* msg);
+-
+-
+-2.1.2 DES-SERT extensions
+-
+- A DES-SERT extension is some structure used to piggyback data on a
+- DES-SERT message. It consists of a 8-bit user supplied type field (with
+- some reserved values), an 8-bit length field and user supplied data of
+- arbitrary length of 253 bytes at most.
+-
+- It can be added to a message via "dessert_msg_addext", retrieved via
+- "dessert_msg_getext" and removed via "dessert_msg_delext".
+-
+- int dessert_msg_addext(dessert_msg_t* msg,
+- dessert_ext_t** ext, uint8_t type, size_t len);
+-
+- int dessert_msg_getext(const dessert_msg_t* msg,
+- dessert_ext_t** ext, uint8_t type, int index);
+-
+- int dessert_msg_delext(dessert_msg_t *msg, dessert_ext_t *ext);
+-
+- It is recommended not to put single data fields in extensions, but
+- combine semantically related data in a struct and attach this struct
+- as an extension because every extension carried introduces an 16-bit
+- overhead to the packet.
+-
+-
+-2.2. Processing pipelines
+-
+- Routing algorithms are often split up in several parts like packet
+- validation, loop-detection or routing table lookup.
+- To implement these as independent and clear as possible, DES-SERT enables
+- you to split up your packet processing in as many parts as you like.
+-
+- There are two separate processing pipelines - one for packets received
+- from the kernel via a TUN or TAP interface and one for packets received
+- via an interface used on the mesh network.
+-
+- You can register callbacks to be added to one of these pipelines with
+- "dessert_sysrxcb_add" or "dessert_meshrxcb_add". Both take an additional
+- integer argument ("priority") specifying the order the callbacks should
+- be called. Higher "priority" value results in being called later
+- within the pipeline.
+-
+- int dessert_sysrxcb_add(dessert_sysrxcb_t* c, int prio);
+-
+- int dessert_meshrxcb_add(dessert_meshrxcb_t* c, int prio);
+-
+- If a callback returns "DESSERT_MSG_KEEP" the packed will be processed by
+- further callbacks, if it returns "DESSERT_MSG_DROP" the message will be
+- dropped and no further callbacks will be called.
+-
+- You do not need to care about the management of the buffers for incoming
+- messages - DES-SERT does this for you. Nevertheless if you need to add
+- extensions or enlarge the payload of a message, you need to tell DES-SERT
+- to enlarge the buffer for you if the flag "DESSERT_FLAG_SPARSE" is set on
+- the message. You can do this by returning "DESSERT_MSG_NEEDNOSPARSE" from
+- within a callback. The callback will be called again with a larger buffer
+- and no "DESSERT_FLAG_SPARSE" flag being set.
+-
+-
+-2.2.1. Processing buffer
+-
+- If you need to pass information along several callbacks, you can do this
+- in the processing buffer passed to the the callbacks. This buffer contains
+- some local processing flags ("lflags") set by the builtin callback
+- "dessert_msg_ifaceflags_cb" (e.g. telling you about packet origin or if
+- the packet is multicast) and 1KB of space for your callbacks to pass
+- along arbitrary data.
+-
+- This buffer might only be allocated after you explicitly request it - in
+- this case the proc argument is NULL and you can return the value
+- "DESSERT_MSG_NEEDMSGPROC" from within your callback. The callback will
+- be called again with a valid processing buffer.
+-
+-
+-2.3. Using interfaces
+-
+-
+-2.3.1. Using a TUN/TAP interface
+-
+- First you have to choose whether to use a TUN or TAP interface. TUN
+- interfaces are used to exchange IPv4 / IPv6 datagrams with the kernel
+- network stack. TAP interfaces are used to exchange Ethernet frames
+- with the kernel network stack. If you want to route Ethernet frames,
+- you should choose a TAP interface. If you intend to implement
+- a custom layer 2 to layer 3 mapping, you should use a TUN interface.
+-
+- Currently, you can only initialize and use a single sys (TUN/TAP) interface.
+- This is done by "dessert_sysif_init". You must then set up the interface
+- config in the kernel yourself e.g. by calling "ifconfig".
+-
+- int dessert_sysif_init(char* name, uint8_t flags);
+-
+- In either case, frames you receive from a TUN/TAP interface will be
+- passed along the callbacks added by "dessert_sysrxcb_add" to the
+- processing pipeline. Each of them will be called with a pointer to an
+- Ethernet frame. In case of a TUN interface, "ether_shost" and "ether_dhost"
+- are set to "00:00:00:00:00:00", and ether_type reflects whether the packet
+- received is IPv4 oder IPv6.
+-
+- Packets are sent to the kernel network stack with "dessert_syssend".
+- In case of a TUN Interface "ether_shost" and "ether_dhost" will be
+- ignored.
+-
+- int dessert_syssend(const struct ether_header *eth, size_t len);
+-
+-
+-2.3.2. Using a mesh interface
+-
+- Mesh interfaces are used similar to the TUN/TAP interface with two major
+- differences: You can have multiple mesh interfaces and they send and
+- receive DES-SERT messages instead of Ethernet frames.
+-
+- You add an mesh interface using "dessert_meshif_add" and can send to it
+- by calling "dessert_meshsend". If the interface parameter is NULL, the
+- packet will be transmitted over every interface (good for flooding).
+-
+- int dessert_meshif_add(const char* dev, uint8_t flags);
+-
+- int dessert_meshsend(const dessert_msg_t* msg,
+- const dessert_meshif_t *iface);
+-
+-
+-2.4. Logging
+-
+- You can write log messages easily with a bunch of macros provided
+- by DES-SERT ("dessert_debug", "dessert_info" ,"dessert_notice",
+- "dessert_warn", "dessert_warning", "dessert_err", "dessert_crit",
+- "dessert_alert" and "dessert_emerg"). Each of them can be used like
+- "printf" and logs to Syslog, STDERR, file or a ringbuffer depending
+- on your configuration.
+-
+- DES-SERT also ships with a custom "assert" macro which acts like
+- the original macro from the standard C library and uses the logging
+- mechanism described above.
+-
+-
+-2.5. Periodics
+-
+- Periodics help you to perform maintenance or delayed tasks. A task
+- consists of a callback, which will be called at the time you requested,
+- and a void pointer the callback is passed. You can add these tasks by
+- calling "dessert_periodic_add" or "dessert_periodic_add_delayed".
+-
+-
+-2.6. CLI
+-
+- DES-SERT supports simple configuration and debugging of your routing
+- protocol implementation by providing a Cisco like command line interface
+- (cli) and a config file parser based upon it.
+- This cli is realized through libcli (http://code.google.com/p/libcli/).
+-
+- DES-SERT does some of the initialization of libcli. Therefore, it provides
+- the main cli anchor "dessert_cli" and some anchors to add commands below
+- "dessert_cli_.*". Because DES-SERT only loosely wraps libcli, you should
+- make yourself familiar with libcli itself. This may be improved in further
+- DES-SERT releases.
+-
+- You can evaluate a config file by calling "cli_file" and start a thread
+- enabling a telnet-interface for DES-SERT by calling "dessert_cli_run".
+-
+-
+-2.7. Putting all together
+-
+- Now you have learned about the most important aspects of DES-SERT.
+- To write your own routing protocol implementation, you need to know
+- how to put all this together.
+-
+- You should start with a main() program parsing the command line options
+- and then calling "dessert_init()". This is needed to set up DES-SERT
+- correctly. Afterwards you can register callbacks, read the config file
+- and do what you like. If everything is set up, you call "dessert_run()"
+- and let the event based framework do its job.
+-
+- If you would like to see a complete protocol implementation sample,
+- have a look at the "gossiping" directory.
+-
+-
+-3. Contact & Feedback
+-
+- We love feedback - if you have patches, comments or questions,
+- please contact us! Recent contact information is available on
+- http://www.des-testbed.net/des-sert/
+diff --git a/Makefile b/Makefile
+deleted file mode 100644
+index 3416f34..0000000
+--- a/Makefile
++++ /dev/null
+@@ -1,154 +0,0 @@
+-SHLIB_VERSION = 0.86.14
+-SHLIB_COMPAT_VERSION = 0.86
+-
+-MODULES=dessert_core.o dessert_log.o dessert_sysiface.o dessert_meshiface.o dessert_msg.o dessert_cli.o dessert_periodic.o dessert_agentx.o
+-
+-UNAME = $(shell uname | tr 'a-z' 'A-Z')
+-TARFILES = *.c *.h Makefile Intro.txt DES-SERT.doxyfile AUTHORS
+-
+-PREFIX ?= $(DESTDIR)/usr
+-DIR_LIB=$(PREFIX)/lib
+-DIR_INCLUDE=$(PREFIX)/include/dessert
+-
+-ifeq ($(UNAME),LINUX)
+- LIBS = pthread pcap cli
+- CFLAGS += -ggdb -Wall -fPIC -DTARGET_$(UNAME) -D_GNU_SOURCE -DSHLIB_VERSION=\"$(SHLIB_VERSION)\"
+- LDFLAGS += -dy -static-libgcc $(addprefix -l,$(LIBS))
+- SHLIB = libdessert.so.$(SHLIB_VERSION)
+- SHLIB_COMPAT = libdessert.so.$(SHLIB_COMPAT_VERSION)
+- SHLIB_DEFAULT = libdessert.so
+- SHLIB_LDFLAGS = -shared -Wl,-soname,$(SHLIB_COMPAT) -o $(SHLIB)
+-else ifeq ($(UNAME),DARWIN)
+- LIBS = pthread pcap cli
+- CFLAGS += -ggdb -Wall -fPIC -DTARGET_$(UNAME) -DTARGET_BSD -DSHLIB_VERSION=\"$(SHLIB_VERSION)\"
+- LDFLAGS += $(addprefix -l,$(LIBS))
+- SHLIB = libdessert.$(SHLIB_VERSION).dylib
+- SHLIB_COMPAT = libdessert.$(SHLIB_COMPAT_VERSION).dylib
+- SHLIB_DEFAULT = libdessert.dylib
+- SHLIB_LDFLAGS = -dynamiclib -compatibility_version $(SHLIB_COMPAT_VERSION) -current_version $(SHLIB_VERSION) -o $(SHLIB)
+-else ifeq ($(UNAME),FREEBSD)
+- LIBS = pcap cli
+- CFLAGS += -ggdb -Wall -fPIC -DTARGET_$(UNAME) -DTARGET_BSD -DSHLIB_VERSION=\"$(SHLIB_VERSION)\" -pthread -I/usr/local/include -I/usr/include
+- LDFLAGS += -dy -L/usr/local/lib -L/usr/lib $(addprefix -l,$(LIBS))
+- SHLIB = libdessert.so.$(SHLIB_VERSION)
+- SHLIB_COMPAT = libdessert.so.$(SHLIB_COMPAT_VERSION)
+- SHLIB_DEFAULT = libdessert.so
+- SHLIB_LDFLAGS = -shared -Wl,-soname,$(SHLIB_COMPAT) -o $(SHLIB)
+-endif
+-
+-## >>> SNMP ##
+-NETSNMPCONFIG=net-snmp-config
+-
+-STRICT_FLAGS = -Wstrict-prototypes
+-NETSNMPCFLAGS := $(shell $(NETSNMPCONFIG) --base-cflags) $(STRICT_FLAGS)
+-NETSNMPLIBS := $(shell $(NETSNMPCONFIG) --agent-libs)
+-
+-SNMPMODULES = snmp/dessertObjects \
+- snmp/dessertMeshifTable \
+- snmp/dessertMeshifTable_data_get \
+- snmp/dessertMeshifTable_data_set \
+- snmp/dessertMeshifTable_data_access \
+- snmp/dessertMeshifTable_interface \
+- snmp/dessertSysifTable \
+- snmp/dessertSysifTable_data_get \
+- snmp/dessertSysifTable_data_set \
+- snmp/dessertSysifTable_data_access \
+- snmp/dessertSysifTable_interface \
+- snmp/dessertAppStatsTable \
+- snmp/dessertAppStatsTable_data_get \
+- snmp/dessertAppStatsTable_data_set \
+- snmp/dessertAppStatsTable_data_access \
+- snmp/dessertAppStatsTable_interface \
+- snmp/dessertAppParamsTable \
+- snmp/dessertAppParamsTable_data_get \
+- snmp/dessertAppParamsTable_data_set \
+- snmp/dessertAppParamsTable_data_access \
+- snmp/dessertAppParamsTable_interface
+-
+-CFLAGS += $(NETSNMPCFLAGS)
+-LDFLAGS += $(NETSNMPLIBS)
+-MODULES += $(addsuffix .o,$(SNMPMODULES))
+-SNMPTARFILES = snmp/*.c snmp/*.h
+-## <<< SNMP ##
+-
+-DOXYGEN = /usr/bin/doxygen
+-DOXYFILE = DES-SERT.doxyfile
+-DOXYGENTARFILES = doxygen/html/*
+-
+-
+-CFLAGS +=
+-LDFLAGS +=
+-
+-all: doxygen libdessert.a $(SHLIB)
+-
+-clean:
+- rm -r *.o *.a *.so *.so.* *.dylib *.tar.gz || true
+- rm snmp/*.o || true
+- rm test/*.o || true
+- rm test-periodic_add || true
+- rm test-periodic_add-delete-modify-add || true
+- rm test-periodic_wladimir || true
+- rm test-meshif-iterator || true
+- rm test-agentx-appstats || true
+- rm test-agentx-appparams || true
+- rm test-agentx || true
+- rm -rf doxygen || true
+- rm Manual.pdf || true
+-
+-install:
+- echo "ECHO:: $(DIR_LIB) $(SHLIB)"
+- install -d $(DIR_LIB) $(DIR_INCLUDE)
+- install -m755 $(SHLIB) $(DIR_LIB)
+- (cd $(DIR_LIB) ; ln -fs $(SHLIB) $(SHLIB_COMPAT))
+- (cd $(DIR_LIB) ; ln -fs $(SHLIB) $(SHLIB_DEFAULT))
+- install -m644 dessert.h $(DIR_INCLUDE)
+- install -m644 utlist.h $(DIR_INCLUDE)
+-
+-
+-libdessert.a: $(MODULES)
+- $(AR) -r libdessert.a $(MODULES)
+- ranlib libdessert.a
+-
+-$(SHLIB): $(MODULES)
+- $(CC) $(CFLAGS) $(LDFLAGS) $(SHLIB_LDFLAGS) $(MODULES)
+- ln -fs $(SHLIB) $(SHLIB_COMPAT)
+- ln -fs $(SHLIB) $(SHLIB_DEFAULT)
+-
+-tarball: clean doxygen
+- mkdir libdessert$(SHLIB_COMPAT_VERSION)-$(SHLIB_VERSION)
+- cp -R $(TARFILES) libdessert$(SHLIB_COMPAT_VERSION)-$(SHLIB_VERSION)
+- mkdir libdessert$(SHLIB_COMPAT_VERSION)-$(SHLIB_VERSION)/snmp
+- cp -R $(SNMPTARFILES) libdessert$(SHLIB_COMPAT_VERSION)-$(SHLIB_VERSION)/snmp
+- mkdir libdessert$(SHLIB_COMPAT_VERSION)-$(SHLIB_VERSION)/doxygen
+- mkdir libdessert$(SHLIB_COMPAT_VERSION)-$(SHLIB_VERSION)/doxygen/html
+- cp -R $(DOXYGENTARFILES) libdessert$(SHLIB_COMPAT_VERSION)-$(SHLIB_VERSION)/doxygen/html
+- gzip -9 -c changelog > libdessert$(SHLIB_COMPAT_VERSION)-$(SHLIB_VERSION)/changelog.gz
+- tar -czf libdessert$(SHLIB_COMPAT_VERSION)-$(SHLIB_VERSION).tar.gz libdessert$(SHLIB_COMPAT_VERSION)-$(SHLIB_VERSION)
+- rm -rf libdessert$(SHLIB_COMPAT_VERSION)-$(SHLIB_VERSION)
+-
+-doxygen:
+- (cat $(DOXYFILE); echo "PROJECT_NUMBER=$(SHLIB_VERSION)") | $(DOXYGEN) -
+-
+-manual: doxygen
+- cd doxygen/latex; $(MAKE) pdf
+- cp doxygen/latex/refman.pdf Manual.pdf
+-
+-test-periodic_add: test/test-periodic_add.o $(MODULES)
+- $(CC) -ggdb -Wall -DTARGET_$(UNAME) -D_GNU_SOURCE $(NETSNMPCFLAGS) $(LDFLAGS) -o test-periodic_add test/test-periodic_add.o $(MODULES)
+-
+-test-periodic_add-delete-modify-add: test/test-periodic_add-delete-modify-add.o $(MODULES)
+- $(CC) -ggdb -Wall -DTARGET_$(UNAME) -D_GNU_SOURCE $(NETSNMPCFLAGS) $(LDFLAGS) -o test-periodic_add-delete-modify-add test/test-periodic_add-delete-modify-add.o $(MODULES)
+-
+-test-periodic_wladimir: test/test-periodic_wladimir.o $(MODULES)
+- $(CC) -ggdb -Wall -DTARGET_$(UNAME) -D_GNU_SOURCE $(NETSNMPCFLAGS) $(LDFLAGS) -o test-periodic_wladimir test/test-periodic_wladimir.o $(MODULES)
+-
+-
+-test-agentx-appparams: test/test-agentx-appparams.o $(MODULES)
+- $(CC) -ggdb -Wall -DTARGET_$(UNAME) -D_GNU_SOURCE $(NETSNMPCFLAGS) $(LDFLAGS) -o test-agentx-appparams test/test-agentx-appparams.o $(MODULES)
+-
+-test-agentx-appstats: test/test-agentx-appstats.o $(MODULES)
+- $(CC) -ggdb -Wall -DTARGET_$(UNAME) -D_GNU_SOURCE $(NETSNMPCFLAGS) $(LDFLAGS) -o test-agentx-appstats test/test-agentx-appstats.o $(MODULES)
+-
+-test-meshif-iterator: test/test-meshif-iterator.o $(MODULES)
+- $(CC) -ggdb -Wall -DTARGET_$(UNAME) -D_GNU_SOURCE $(NETSNMPCFLAGS) $(LDFLAGS) -o test-meshif-iterator test/test-meshif-iterator.o $(MODULES)
+-
+\ No newline at end of file
+diff --git a/Makefile.am b/Makefile.am
+new file mode 100644
+index 0000000..5171ca4
+--- /dev/null
++++ b/Makefile.am
+@@ -0,0 +1,11 @@
++
++ACLOCAL_AMFLAGS = -I m4 --install
++
++SUBDIRS = include src
++
++pkgconfigdir = $(libdir)/pkgconfig
++pkgconfig_DATA = libdessert.pc
++
++include doxygen-include.am
++
++EXTRA_DIST = autogen.sh DES-SERT.doxyfile doxygen/html
+diff --git a/Makefile.in b/Makefile.in
+new file mode 100644
+index 0000000..7848551
+--- /dev/null
++++ b/Makefile.in
+@@ -0,0 +1,924 @@
++# Makefile.in generated by automake 1.11 from Makefile.am.
++# @configure_input@
++
++# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
++# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
++# Inc.
++# This Makefile.in is free software; the Free Software Foundation
++# gives unlimited permission to copy and/or distribute it,
++# with or without modifications, as long as this notice is preserved.
++
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
++# PARTICULAR PURPOSE.
++
++@SET_MAKE@
++
++# ---------------------------------------------------------------------------
++# Licensed to the Apache Software Foundation (ASF) under one or more
++# contributor license agreements. See the NOTICE file distributed with
++# this work for additional information regarding copyright ownership.
++# The ASF licenses this file to You under the Apache License, Version 2.0
++# (the "License"); you may not use this file except in compliance with
++# the License. You may obtain a copy of the License at
++#
++# http://www.apache.org/licenses/LICENSE-2.0
++#
++# Unless required by applicable law or agreed to in writing, software
++# distributed under the License is distributed on an "AS IS" BASIS,
++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++# See the License for the specific language governing permissions and
++# limitations under the License.
++# ---------------------------------------------------------------------------
++
++# Copyright (C) 2004 Oren Ben-Kiki
++# This file is distributed under the same terms as the Automake macro files.
++
++# Generate automatic documentation using Doxygen. Goals and variables values
++# are controlled by the various DX_COND_??? conditionals set by autoconf.
++#
++# The provided goals are:
++# doxygen-doc: Generate all doxygen documentation.
++# doxygen-run: Run doxygen, which will generate some of the documentation
++# (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post
++# processing required for the rest of it (PS, PDF, and some MAN).
++# doxygen-man: Rename some doxygen generated man pages.
++# doxygen-ps: Generate doxygen PostScript documentation.
++# doxygen-pdf: Generate doxygen PDF documentation.
++#
++# Note that by default these are not integrated into the automake goals. If
++# doxygen is used to generate man pages, you can achieve this integration by
++# setting man3_MANS to the list of man pages generated and then adding the
++# dependency:
++#
++# $(man3_MANS): doxygen-doc
++#
++# This will cause make to run doxygen and generate all the documentation.
++#
++# The following variable is intended for use in Makefile.am:
++#
++# DX_CLEANFILES = everything to clean.
++#
++# This is usually added to MOSTLYCLEANFILES.
++
++VPATH = @srcdir@
++pkgdatadir = $(datadir)/@PACKAGE@
++pkgincludedir = $(includedir)/@PACKAGE@
++pkglibdir = $(libdir)/@PACKAGE@
++pkglibexecdir = $(libexecdir)/@PACKAGE@
++am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
++install_sh_DATA = $(install_sh) -c -m 644
++install_sh_PROGRAM = $(install_sh) -c
++install_sh_SCRIPT = $(install_sh) -c
++INSTALL_HEADER = $(INSTALL_DATA)
++transform = $(program_transform_name)
++NORMAL_INSTALL = :
++PRE_INSTALL = :
++POST_INSTALL = :
++NORMAL_UNINSTALL = :
++PRE_UNINSTALL = :
++POST_UNINSTALL = :
++build_triplet = @build@
++host_triplet = @host@
++DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
++ $(srcdir)/Makefile.in $(srcdir)/config.h.in \
++ $(srcdir)/doxygen-include.am $(srcdir)/libdessert.pc.in \
++ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \
++ config.guess config.sub depcomp install-sh ltmain.sh missing
++subdir = .
++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
++am__aclocal_m4_deps = $(top_srcdir)/m4/ac_doxygen.m4 \
++ $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \
++ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
++ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
++ $(top_srcdir)/m4/net-snmp.m4 $(top_srcdir)/m4/pcap.m4 \
++ $(top_srcdir)/configure.ac
++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
++ $(ACLOCAL_M4)
++am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
++ configure.lineno config.status.lineno
++mkinstalldirs = $(install_sh) -d
++CONFIG_HEADER = config.h
++CONFIG_CLEAN_FILES = libdessert.pc
++CONFIG_CLEAN_VPATH_FILES =
++SOURCES =
++DIST_SOURCES =
++RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
++ html-recursive info-recursive install-data-recursive \
++ install-dvi-recursive install-exec-recursive \
++ install-html-recursive install-info-recursive \
++ install-pdf-recursive install-ps-recursive install-recursive \
++ installcheck-recursive installdirs-recursive pdf-recursive \
++ ps-recursive uninstall-recursive
++am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
++am__vpath_adj = case $$p in \
++ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
++ *) f=$$p;; \
++ esac;
++am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
++am__install_max = 40
++am__nobase_strip_setup = \
++ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
++am__nobase_strip = \
++ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
++am__nobase_list = $(am__nobase_strip_setup); \
++ for p in $$list; do echo "$$p $$p"; done | \
++ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
++ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
++ if (++n[$$2] == $(am__install_max)) \
++ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
++ END { for (dir in files) print dir, files[dir] }'
++am__base_list = \
++ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
++ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
++am__installdirs = "$(DESTDIR)$(pkgconfigdir)"
++DATA = $(pkgconfig_DATA)
++RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
++ distclean-recursive maintainer-clean-recursive
++AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
++ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
++ distdir dist dist-all distcheck
++ETAGS = etags
++CTAGS = ctags
++DIST_SUBDIRS = $(SUBDIRS)
++DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
++distdir = $(PACKAGE)-$(VERSION)
++top_distdir = $(distdir)
++am__remove_distdir = \
++ { test ! -d "$(distdir)" \
++ || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
++ && rm -fr "$(distdir)"; }; }
++am__relativize = \
++ dir0=`pwd`; \
++ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
++ sed_rest='s,^[^/]*/*,,'; \
++ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
++ sed_butlast='s,/*[^/]*$$,,'; \
++ while test -n "$$dir1"; do \
++ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
++ if test "$$first" != "."; then \
++ if test "$$first" = ".."; then \
++ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
++ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
++ else \
++ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
++ if test "$$first2" = "$$first"; then \
++ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
++ else \
++ dir2="../$$dir2"; \
++ fi; \
++ dir0="$$dir0"/"$$first"; \
++ fi; \
++ fi; \
++ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
++ done; \
++ reldir="$$dir2"
++DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2
++GZIP_ENV = --best
++distuninstallcheck_listfiles = find . -type f -print
++distcleancheck_listfiles = find . -type f -print
++ACLOCAL = @ACLOCAL@
++AMTAR = @AMTAR@
++AR = @AR@
++AUTOCONF = @AUTOCONF@
++AUTOHEADER = @AUTOHEADER@
++AUTOMAKE = @AUTOMAKE@
++AWK = @AWK@
++CC = @CC@
++CCDEPMODE = @CCDEPMODE@
++CFLAGS = @CFLAGS@
++CPP = @CPP@
++CPPFLAGS = @CPPFLAGS@
++CYGPATH_W = @CYGPATH_W@
++DEFS = @DEFS@
++DEPDIR = @DEPDIR@
++DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@
++DSYMUTIL = @DSYMUTIL@
++DUMPBIN = @DUMPBIN@
++DX_CONFIG = @DX_CONFIG@
++DX_DOCDIR = @DX_DOCDIR@
++DX_DOT = @DX_DOT@
++DX_DOXYGEN = @DX_DOXYGEN@
++DX_DVIPS = @DX_DVIPS@
++DX_EGREP = @DX_EGREP@
++DX_ENV = @DX_ENV@
++DX_FLAG_chi = @DX_FLAG_chi@
++DX_FLAG_chm = @DX_FLAG_chm@
++DX_FLAG_doc = @DX_FLAG_doc@
++DX_FLAG_dot = @DX_FLAG_dot@
++DX_FLAG_html = @DX_FLAG_html@
++DX_FLAG_man = @DX_FLAG_man@
++DX_FLAG_pdf = @DX_FLAG_pdf@
++DX_FLAG_ps = @DX_FLAG_ps@
++DX_FLAG_rtf = @DX_FLAG_rtf@
++DX_FLAG_xml = @DX_FLAG_xml@
++DX_HHC = @DX_HHC@
++DX_LATEX = @DX_LATEX@
++DX_MAKEINDEX = @DX_MAKEINDEX@
++DX_PDFLATEX = @DX_PDFLATEX@
++DX_PERL = @DX_PERL@
++DX_PROJECT = @DX_PROJECT@
++ECHO_C = @ECHO_C@
++ECHO_N = @ECHO_N@
++ECHO_T = @ECHO_T@
++EGREP = @EGREP@
++EXEEXT = @EXEEXT@
++FGREP = @FGREP@
++GREP = @GREP@
++INSTALL = @INSTALL@
++INSTALL_DATA = @INSTALL_DATA@
++INSTALL_PROGRAM = @INSTALL_PROGRAM@
++INSTALL_SCRIPT = @INSTALL_SCRIPT@
++INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
++LD = @LD@
++LDFLAGS = @LDFLAGS@
++LIBDESSERT_LIBRARY_VERSION = @LIBDESSERT_LIBRARY_VERSION@
++LIBOBJS = @LIBOBJS@
++LIBS = @LIBS@
++LIBTOOL = @LIBTOOL@
++LIPO = @LIPO@
++LN_S = @LN_S@
++LTLIBOBJS = @LTLIBOBJS@
++MAKEINFO = @MAKEINFO@
++MKDIR_P = @MKDIR_P@
++NM = @NM@
++NMEDIT = @NMEDIT@
++OBJDUMP = @OBJDUMP@
++OBJEXT = @OBJEXT@
++OTOOL = @OTOOL@
++OTOOL64 = @OTOOL64@
++PACKAGE = @PACKAGE@
++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
++PACKAGE_NAME = @PACKAGE_NAME@
++PACKAGE_STRING = @PACKAGE_STRING@
++PACKAGE_TARNAME = @PACKAGE_TARNAME@
++PACKAGE_URL = @PACKAGE_URL@
++PACKAGE_VERSION = @PACKAGE_VERSION@
++PATH_SEPARATOR = @PATH_SEPARATOR@
++PCAP_CFLAGS = @PCAP_CFLAGS@
++PCAP_CFLGAS = @PCAP_CFLGAS@
++PCAP_LIBS = @PCAP_LIBS@
++PTHREAD_CC = @PTHREAD_CC@
++PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
++PTHREAD_LIBS = @PTHREAD_LIBS@
++RANLIB = @RANLIB@
++SED = @SED@
++SET_MAKE = @SET_MAKE@
++SHELL = @SHELL@
++SNMP_CFLAGS = @SNMP_CFLAGS@
++SNMP_CFLGAS = @SNMP_CFLGAS@
++SNMP_LIBS = @SNMP_LIBS@
++STRIP = @STRIP@
++VERSION = @VERSION@
++abs_builddir = @abs_builddir@
++abs_srcdir = @abs_srcdir@
++abs_top_builddir = @abs_top_builddir@
++abs_top_srcdir = @abs_top_srcdir@
++ac_ct_CC = @ac_ct_CC@
++ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
++am__include = @am__include@
++am__leading_dot = @am__leading_dot@
++am__quote = @am__quote@
++am__tar = @am__tar@
++am__untar = @am__untar@
++ax_pthread_config = @ax_pthread_config@
++bindir = @bindir@
++build = @build@
++build_alias = @build_alias@
++build_cpu = @build_cpu@
++build_os = @build_os@
++build_vendor = @build_vendor@
++builddir = @builddir@
++datadir = @datadir@
++datarootdir = @datarootdir@
++docdir = @docdir@
++dvidir = @dvidir@
++exec_prefix = @exec_prefix@
++host = @host@
++host_alias = @host_alias@
++host_cpu = @host_cpu@
++host_os = @host_os@
++host_vendor = @host_vendor@
++htmldir = @htmldir@
++includedir = @includedir@
++infodir = @infodir@
++install_sh = @install_sh@
++libdir = @libdir@
++libexecdir = @libexecdir@
++localedir = @localedir@
++localstatedir = @localstatedir@
++lt_ECHO = @lt_ECHO@
++mandir = @mandir@
++mkdir_p = @mkdir_p@
++oldincludedir = @oldincludedir@
++pdfdir = @pdfdir@
++prefix = @prefix@
++program_transform_name = @program_transform_name@
++psdir = @psdir@
++sbindir = @sbindir@
++sharedstatedir = @sharedstatedir@
++srcdir = @srcdir@
++sysconfdir = @sysconfdir@
++target_alias = @target_alias@
++top_build_prefix = @top_build_prefix@
++top_builddir = @top_builddir@
++top_srcdir = @top_srcdir@
++ACLOCAL_AMFLAGS = -I m4 --install
++SUBDIRS = include src
++pkgconfigdir = $(libdir)/pkgconfig
++pkgconfig_DATA = libdessert.pc
++@DX_COND_doc_TRUE@@DX_COND_html_TRUE@DX_CLEAN_HTML = @DX_DOCDIR@/html
++@DX_COND_chm_TRUE@@DX_COND_doc_TRUE@DX_CLEAN_CHM = @DX_DOCDIR@/chm
++@DX_COND_chi_TRUE@@DX_COND_chm_TRUE@@DX_COND_doc_TRUE@DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi
++@DX_COND_doc_TRUE@@DX_COND_man_TRUE@DX_CLEAN_MAN = @DX_DOCDIR@/man
++@DX_COND_doc_TRUE@@DX_COND_rtf_TRUE@DX_CLEAN_RTF = @DX_DOCDIR@/rtf
++@DX_COND_doc_TRUE@@DX_COND_xml_TRUE@DX_CLEAN_XML = @DX_DOCDIR@/xml
++@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps
++@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@DX_PS_GOAL = doxygen-ps
++@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf
++@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@DX_PDF_GOAL = doxygen-pdf
++@DX_COND_doc_TRUE@@DX_COND_latex_TRUE@DX_CLEAN_LATEX = @DX_DOCDIR@/latex
++@DX_COND_doc_TRUE@DX_CLEANFILES = \
++@DX_COND_doc_TRUE@ @DX_DOCDIR@/@PACKAGE@.tag \
++@DX_COND_doc_TRUE@ -r \
++@DX_COND_doc_TRUE@ $(DX_CLEAN_HTML) \
++@DX_COND_doc_TRUE@ $(DX_CLEAN_CHM) \
++@DX_COND_doc_TRUE@ $(DX_CLEAN_CHI) \
++@DX_COND_doc_TRUE@ $(DX_CLEAN_MAN) \
++@DX_COND_doc_TRUE@ $(DX_CLEAN_RTF) \
++@DX_COND_doc_TRUE@ $(DX_CLEAN_XML) \
++@DX_COND_doc_TRUE@ $(DX_CLEAN_PS) \
++@DX_COND_doc_TRUE@ $(DX_CLEAN_PDF) \
++@DX_COND_doc_TRUE@ $(DX_CLEAN_LATEX)
++
++EXTRA_DIST = autogen.sh DES-SERT.doxyfile doxygen/html
++all: config.h
++ $(MAKE) $(AM_MAKEFLAGS) all-recursive
++
++.SUFFIXES:
++am--refresh:
++ @:
++$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/doxygen-include.am $(am__configure_deps)
++ @for dep in $?; do \
++ case '$(am__configure_deps)' in \
++ *$$dep*) \
++ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
++ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
++ && exit 0; \
++ exit 1;; \
++ esac; \
++ done; \
++ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
++ $(am__cd) $(top_srcdir) && \
++ $(AUTOMAKE) --gnu Makefile
++.PRECIOUS: Makefile
++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
++ @case '$?' in \
++ *config.status*) \
++ echo ' $(SHELL) ./config.status'; \
++ $(SHELL) ./config.status;; \
++ *) \
++ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
++ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
++ esac;
++
++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
++ $(SHELL) ./config.status --recheck
++
++$(top_srcdir)/configure: $(am__configure_deps)
++ $(am__cd) $(srcdir) && $(AUTOCONF)
++$(ACLOCAL_M4): $(am__aclocal_m4_deps)
++ $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
++$(am__aclocal_m4_deps):
++
++config.h: stamp-h1
++ @if test ! -f $@; then \
++ rm -f stamp-h1; \
++ $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
++ else :; fi
++
++stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
++ @rm -f stamp-h1
++ cd $(top_builddir) && $(SHELL) ./config.status config.h
++$(srcdir)/config.h.in: $(am__configure_deps)
++ ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
++ rm -f stamp-h1
++ touch $@
++
++distclean-hdr:
++ -rm -f config.h stamp-h1
++libdessert.pc: $(top_builddir)/config.status $(srcdir)/libdessert.pc.in
++ cd $(top_builddir) && $(SHELL) ./config.status $@
++
++mostlyclean-libtool:
++ -rm -f *.lo
++
++clean-libtool:
++ -rm -rf .libs _libs
++
++distclean-libtool:
++ -rm -f libtool config.lt
++install-pkgconfigDATA: $(pkgconfig_DATA)
++ @$(NORMAL_INSTALL)
++ test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)"
++ @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
++ for p in $$list; do \
++ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
++ echo "$$d$$p"; \
++ done | $(am__base_list) | \
++ while read files; do \
++ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
++ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
++ done
++
++uninstall-pkgconfigDATA:
++ @$(NORMAL_UNINSTALL)
++ @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
++ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
++ test -n "$$files" || exit 0; \
++ echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \
++ cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files
++
++# This directory's subdirectories are mostly independent; you can cd
++# into them and run `make' without going through this Makefile.
++# To change the values of `make' variables: instead of editing Makefiles,
++# (1) if the variable is set in `config.status', edit `config.status'
++# (which will cause the Makefiles to be regenerated when you run `make');
++# (2) otherwise, pass the desired values on the `make' command line.
++$(RECURSIVE_TARGETS):
++ @failcom='exit 1'; \
++ for f in x $$MAKEFLAGS; do \
++ case $$f in \
++ *=* | --[!k]*);; \
++ *k*) failcom='fail=yes';; \
++ esac; \
++ done; \
++ dot_seen=no; \
++ target=`echo $@ | sed s/-recursive//`; \
++ list='$(SUBDIRS)'; for subdir in $$list; do \
++ echo "Making $$target in $$subdir"; \
++ if test "$$subdir" = "."; then \
++ dot_seen=yes; \
++ local_target="$$target-am"; \
++ else \
++ local_target="$$target"; \
++ fi; \
++ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
++ || eval $$failcom; \
++ done; \
++ if test "$$dot_seen" = "no"; then \
++ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
++ fi; test -z "$$fail"
++
++$(RECURSIVE_CLEAN_TARGETS):
++ @failcom='exit 1'; \
++ for f in x $$MAKEFLAGS; do \
++ case $$f in \
++ *=* | --[!k]*);; \
++ *k*) failcom='fail=yes';; \
++ esac; \
++ done; \
++ dot_seen=no; \
++ case "$@" in \
++ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
++ *) list='$(SUBDIRS)' ;; \
++ esac; \
++ rev=''; for subdir in $$list; do \
++ if test "$$subdir" = "."; then :; else \
++ rev="$$subdir $$rev"; \
++ fi; \
++ done; \
++ rev="$$rev ."; \
++ target=`echo $@ | sed s/-recursive//`; \
++ for subdir in $$rev; do \
++ echo "Making $$target in $$subdir"; \
++ if test "$$subdir" = "."; then \
++ local_target="$$target-am"; \
++ else \
++ local_target="$$target"; \
++ fi; \
++ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
++ || eval $$failcom; \
++ done && test -z "$$fail"
++tags-recursive:
++ list='$(SUBDIRS)'; for subdir in $$list; do \
++ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
++ done
++ctags-recursive:
++ list='$(SUBDIRS)'; for subdir in $$list; do \
++ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
++ done
++
++ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
++ unique=`for i in $$list; do \
++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
++ done | \
++ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
++ END { if (nonempty) { for (i in files) print i; }; }'`; \
++ mkid -fID $$unique
++tags: TAGS
++
++TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
++ $(TAGS_FILES) $(LISP)
++ set x; \
++ here=`pwd`; \
++ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
++ include_option=--etags-include; \
++ empty_fix=.; \
++ else \
++ include_option=--include; \
++ empty_fix=; \
++ fi; \
++ list='$(SUBDIRS)'; for subdir in $$list; do \
++ if test "$$subdir" = .; then :; else \
++ test ! -f $$subdir/TAGS || \
++ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
++ fi; \
++ done; \
++ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
++ unique=`for i in $$list; do \
++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
++ done | \
++ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
++ END { if (nonempty) { for (i in files) print i; }; }'`; \
++ shift; \
++ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
++ test -n "$$unique" || unique=$$empty_fix; \
++ if test $$# -gt 0; then \
++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
++ "$$@" $$unique; \
++ else \
++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
++ $$unique; \
++ fi; \
++ fi
++ctags: CTAGS
++CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
++ $(TAGS_FILES) $(LISP)
++ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
++ unique=`for i in $$list; do \
++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
++ done | \
++ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
++ END { if (nonempty) { for (i in files) print i; }; }'`; \
++ test -z "$(CTAGS_ARGS)$$unique" \
++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
++ $$unique
++
++GTAGS:
++ here=`$(am__cd) $(top_builddir) && pwd` \
++ && $(am__cd) $(top_srcdir) \
++ && gtags -i $(GTAGS_ARGS) "$$here"
++
++distclean-tags:
++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
++
++distdir: $(DISTFILES)
++ $(am__remove_distdir)
++ test -d "$(distdir)" || mkdir "$(distdir)"
++ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++ list='$(DISTFILES)'; \
++ dist_files=`for file in $$list; do echo $$file; done | \
++ sed -e "s|^$$srcdirstrip/||;t" \
++ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
++ case $$dist_files in \
++ */*) $(MKDIR_P) `echo "$$dist_files" | \
++ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
++ sort -u` ;; \
++ esac; \
++ for file in $$dist_files; do \
++ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
++ if test -d $$d/$$file; then \
++ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
++ if test -d "$(distdir)/$$file"; then \
++ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++ fi; \
++ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
++ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
++ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++ fi; \
++ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
++ else \
++ test -f "$(distdir)/$$file" \
++ || cp -p $$d/$$file "$(distdir)/$$file" \
++ || exit 1; \
++ fi; \
++ done
++ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
++ if test "$$subdir" = .; then :; else \
++ test -d "$(distdir)/$$subdir" \
++ || $(MKDIR_P) "$(distdir)/$$subdir" \
++ || exit 1; \
++ fi; \
++ done
++ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
++ if test "$$subdir" = .; then :; else \
++ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
++ $(am__relativize); \
++ new_distdir=$$reldir; \
++ dir1=$$subdir; dir2="$(top_distdir)"; \
++ $(am__relativize); \
++ new_top_distdir=$$reldir; \
++ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
++ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
++ ($(am__cd) $$subdir && \
++ $(MAKE) $(AM_MAKEFLAGS) \
++ top_distdir="$$new_top_distdir" \
++ distdir="$$new_distdir" \
++ am__remove_distdir=: \
++ am__skip_length_check=: \
++ am__skip_mode_fix=: \
++ distdir) \
++ || exit 1; \
++ fi; \
++ done
++ -test -n "$(am__skip_mode_fix)" \
++ || find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
++ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
++ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
++ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
++ || chmod -R a+r "$(distdir)"
++dist-gzip: distdir
++ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
++ $(am__remove_distdir)
++dist-bzip2: distdir
++ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
++ $(am__remove_distdir)
++
++dist-lzma: distdir
++ tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
++ $(am__remove_distdir)
++
++dist-xz: distdir
++ tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
++ $(am__remove_distdir)
++
++dist-tarZ: distdir
++ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
++ $(am__remove_distdir)
++
++dist-shar: distdir
++ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
++ $(am__remove_distdir)
++
++dist-zip: distdir
++ -rm -f $(distdir).zip
++ zip -rq $(distdir).zip $(distdir)
++ $(am__remove_distdir)
++
++dist dist-all: distdir
++ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
++ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
++ $(am__remove_distdir)
++
++# This target untars the dist file and tries a VPATH configuration. Then
++# it guarantees that the distribution is self-contained by making another
++# tarfile.
++distcheck: dist
++ case '$(DIST_ARCHIVES)' in \
++ *.tar.gz*) \
++ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
++ *.tar.bz2*) \
++ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
++ *.tar.lzma*) \
++ unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
++ *.tar.xz*) \
++ xz -dc $(distdir).tar.xz | $(am__untar) ;;\
++ *.tar.Z*) \
++ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
++ *.shar.gz*) \
++ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
++ *.zip*) \
++ unzip $(distdir).zip ;;\
++ esac
++ chmod -R a-w $(distdir); chmod a+w $(distdir)
++ mkdir $(distdir)/_build
++ mkdir $(distdir)/_inst
++ chmod a-w $(distdir)
++ test -d $(distdir)/_build || exit 0; \
++ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
++ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
++ && am__cwd=`pwd` \
++ && $(am__cd) $(distdir)/_build \
++ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
++ $(DISTCHECK_CONFIGURE_FLAGS) \
++ && $(MAKE) $(AM_MAKEFLAGS) \
++ && $(MAKE) $(AM_MAKEFLAGS) dvi \
++ && $(MAKE) $(AM_MAKEFLAGS) check \
++ && $(MAKE) $(AM_MAKEFLAGS) install \
++ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
++ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
++ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
++ distuninstallcheck \
++ && chmod -R a-w "$$dc_install_base" \
++ && ({ \
++ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
++ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
++ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
++ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
++ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
++ } || { rm -rf "$$dc_destdir"; exit 1; }) \
++ && rm -rf "$$dc_destdir" \
++ && $(MAKE) $(AM_MAKEFLAGS) dist \
++ && rm -rf $(DIST_ARCHIVES) \
++ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
++ && cd "$$am__cwd" \
++ || exit 1
++ $(am__remove_distdir)
++ @(echo "$(distdir) archives ready for distribution: "; \
++ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
++ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
++distuninstallcheck:
++ @$(am__cd) '$(distuninstallcheck_dir)' \
++ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
++ || { echo "ERROR: files left after uninstall:" ; \
++ if test -n "$(DESTDIR)"; then \
++ echo " (check DESTDIR support)"; \
++ fi ; \
++ $(distuninstallcheck_listfiles) ; \
++ exit 1; } >&2
++distcleancheck: distclean
++ @if test '$(srcdir)' = . ; then \
++ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
++ exit 1 ; \
++ fi
++ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
++ || { echo "ERROR: files left in build directory after distclean:" ; \
++ $(distcleancheck_listfiles) ; \
++ exit 1; } >&2
++check-am: all-am
++check: check-recursive
++all-am: Makefile $(DATA) config.h
++installdirs: installdirs-recursive
++installdirs-am:
++ for dir in "$(DESTDIR)$(pkgconfigdir)"; do \
++ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
++ done
++install: install-recursive
++install-exec: install-exec-recursive
++install-data: install-data-recursive
++uninstall: uninstall-recursive
++
++install-am: all-am
++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
++
++installcheck: installcheck-recursive
++install-strip:
++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
++ `test -z '$(STRIP)' || \
++ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
++mostlyclean-generic:
++
++clean-generic:
++
++distclean-generic:
++ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
++ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
++
++maintainer-clean-generic:
++ @echo "This command is intended for maintainers to use"
++ @echo "it deletes files that may require special tools to rebuild."
++clean: clean-recursive
++
++clean-am: clean-generic clean-libtool mostlyclean-am
++
++distclean: distclean-recursive
++ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
++ -rm -f Makefile
++distclean-am: clean-am distclean-generic distclean-hdr \
++ distclean-libtool distclean-tags
++
++dvi: dvi-recursive
++
++dvi-am:
++
++html: html-recursive
++
++html-am:
++
++info: info-recursive
++
++info-am:
++
++install-data-am: install-pkgconfigDATA
++
++install-dvi: install-dvi-recursive
++
++install-dvi-am:
++
++install-exec-am:
++
++install-html: install-html-recursive
++
++install-html-am:
++
++install-info: install-info-recursive
++
++install-info-am:
++
++install-man:
++
++install-pdf: install-pdf-recursive
++
++install-pdf-am:
++
++install-ps: install-ps-recursive
++
++install-ps-am:
++
++installcheck-am:
++
++maintainer-clean: maintainer-clean-recursive
++ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
++ -rm -rf $(top_srcdir)/autom4te.cache
++ -rm -f Makefile
++maintainer-clean-am: distclean-am maintainer-clean-generic
++
++mostlyclean: mostlyclean-recursive
++
++mostlyclean-am: mostlyclean-generic mostlyclean-libtool
++
++pdf: pdf-recursive
++
++pdf-am:
++
++ps: ps-recursive
++
++ps-am:
++
++uninstall-am: uninstall-pkgconfigDATA
++
++.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
++ ctags-recursive install-am install-strip tags-recursive
++
++.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
++ all all-am am--refresh check check-am clean clean-generic \
++ clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \
++ dist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \
++ distcheck distclean distclean-generic distclean-hdr \
++ distclean-libtool distclean-tags distcleancheck distdir \
++ distuninstallcheck dvi dvi-am html html-am info info-am \
++ install install-am install-data install-data-am install-dvi \
++ install-dvi-am install-exec install-exec-am install-html \
++ install-html-am install-info install-info-am install-man \
++ install-pdf install-pdf-am install-pkgconfigDATA install-ps \
++ install-ps-am install-strip installcheck installcheck-am \
++ installdirs installdirs-am maintainer-clean \
++ maintainer-clean-generic mostlyclean mostlyclean-generic \
++ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
++ uninstall uninstall-am uninstall-pkgconfigDATA
++
++
++@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps
++
++@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag
++@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ cd @DX_DOCDIR@/latex; \
++@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \
++@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(DX_LATEX) refman.tex; \
++@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(MAKEINDEX_PATH) refman.idx; \
++@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(DX_LATEX) refman.tex; \
++@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ countdown=5; \
++@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \
++@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ refman.log > /dev/null 2>&1 \
++@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ && test $$countdown -gt 0; do \
++@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(DX_LATEX) refman.tex; \
++@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ countdown=`expr $$countdown - 1`; \
++@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ done; \
++@DX_COND_doc_TRUE@@DX_COND_ps_TRUE@ $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi
++
++@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf
++
++@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag
++@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ cd @DX_DOCDIR@/latex; \
++@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \
++@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ $(DX_PDFLATEX) refman.tex; \
++@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ $(DX_MAKEINDEX) refman.idx; \
++@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ $(DX_PDFLATEX) refman.tex; \
++@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ countdown=5; \
++@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \
++@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ refman.log > /dev/null 2>&1 \
++@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ && test $$countdown -gt 0; do \
++@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ $(DX_PDFLATEX) refman.tex; \
++@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ countdown=`expr $$countdown - 1`; \
++@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ done; \
++@DX_COND_doc_TRUE@@DX_COND_pdf_TRUE@ mv refman.pdf ../@PACKAGE@.pdf
++
++@DX_COND_doc_TRUE@.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL)
++
++@DX_COND_doc_TRUE@.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL)
++
++@DX_COND_doc_TRUE@doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag
++
++@DX_COND_doc_TRUE@doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL)
++
++@DX_COND_doc_TRUE@@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS)
++@DX_COND_doc_TRUE@ rm -rf @DX_DOCDIR@
++@DX_COND_doc_TRUE@ $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG)
++
++# Tell versions [3.59,3.63) of GNU make to not export all variables.
++# Otherwise a system limit (for SysV at least) may be exceeded.
++.NOEXPORT:
+diff --git a/NEWS b/NEWS
+new file mode 100644
+index 0000000..3514d7e
+--- /dev/null
++++ b/NEWS
+@@ -0,0 +1 @@
++nothing yet
+diff --git a/README b/README
+new file mode 100644
+index 0000000..f54e509
+--- /dev/null
++++ b/README
+@@ -0,0 +1,270 @@
++
++ DES-SERT - an Extensible Routing-Framework for Testbeds
++
++
++Copyright
++
++ Copyright Philipp Schmidt <phils@inf.fu-berlin.de>,
++ Computer Systems and Telematics / Distributed, Embedded Systems (DES) group,
++ Freie Universitaet Berlin
++
++ This document has been published under GNU Free Documentation License.
++ All rights reserved.
++
++
++1. Introduction
++
++ DES-SERT, the DES Simple and Extensible Routing-Framework for Testbeds,
++ is a framework designed to assist researchers implementing routing
++ protocols for testbeds.
++
++ DES-SERT enables the implementation of routing protocols on top of
++ Ethernet via an underlay (Layer 2.5) in user space.
++ It introduces an abstraction from OS specific issues and provides
++ functionality and data structures to implement proactive, reactive,
++ and hybrid routing protocols.
++
++ While generally usable in many application scenarios, it is primarily
++ used in DES-Mesh (http://www.des-testbed.net/), the multi-transceiver
++ wireless mesh network testbed part of the DES-Testbed.
++
++
++2. DES-SERT Architecture
++
++ DES-SERT introduces some concepts to implement routing protocols.
++ When implementing a routing protocol with DES-SERT, you should be
++ familiar with these concepts to structure and tailor your implementation.
++
++
++2.1. messages
++
++ Every packet you send or receive on the mesh is represented as a
++ DES-SERT message. From a programmers point of view, a DES-SERT message
++ is just a C-structure:
++
++ typedef struct dessert_msg {
++ /** the layer2 header on the wire */
++ struct ether_header l2h;
++ /** short name of the protocol as passed to dessert_init() */
++ char proto[DESSERT_PROTO_STRLEN];
++ /** version of the app as passed to dessert_init() */
++ uint8_t ver;
++ /** flags - bits 1-4 reserved for dessert, bits 5-8 for app usage */
++ uint8_t flags;
++ /** ttl or hopcount field for app usage - 0xff if not used*/
++ uint8_t ttl;
++ /** reserved for app usage - 0x00 if not used */
++ uint8_t u8;
++ /** reserved for app usage - 0xbeef if not used */
++ uint16_t u16;
++ /** header length incl. extensions */
++ uint16_t hlen;
++ /** payload length */
++ uint16_t plen;
++ } dessert_msg_t;
++
++ Every message sent via the underlay carries this structure as a packet
++ header. All data in a "dessert_msg" is stored in network byte order.
++ DES-SERT tries to care as automatically as possible of this structure.
++ Nevertheless you will have to care at least about: "l2h.ether_dhost" and
++ "ttl".
++
++ If you need to send some data along with every packet, e.g. some kind of
++ metric or cost your routing protocol uses, you should try to fit this
++ data into the "u8", "u16" and the upper 4 bits of the "flags" field.
++ These fields will never be touched by DES-SERT except on initialization
++ via "dessert_msg_new".
++
++ Because just a C-structure is not really usable as a packet, there are some
++ utility functions around - please have a look around in "dessert.h" and the
++ doxygen doku. The most important ones are: "dessert_msg_new" and
++ "dessert_msg_destroy", which do not simply allocate memory for a DES-SERT
++ message, but for a whole packet of maximum size and initialize the
++ structures for further packet construction/processing.
++
++ int dessert_msg_new(dessert_msg_t **msgout);
++
++ void dessert_msg_destroy(dessert_msg_t* msg);
++
++
++2.1.2 DES-SERT extensions
++
++ A DES-SERT extension is some structure used to piggyback data on a
++ DES-SERT message. It consists of a 8-bit user supplied type field (with
++ some reserved values), an 8-bit length field and user supplied data of
++ arbitrary length of 253 bytes at most.
++
++ It can be added to a message via "dessert_msg_addext", retrieved via
++ "dessert_msg_getext" and removed via "dessert_msg_delext".
++
++ int dessert_msg_addext(dessert_msg_t* msg,
++ dessert_ext_t** ext, uint8_t type, size_t len);
++
++ int dessert_msg_getext(const dessert_msg_t* msg,
++ dessert_ext_t** ext, uint8_t type, int index);
++
++ int dessert_msg_delext(dessert_msg_t *msg, dessert_ext_t *ext);
++
++ It is recommended not to put single data fields in extensions, but
++ combine semantically related data in a struct and attach this struct
++ as an extension because every extension carried introduces an 16-bit
++ overhead to the packet.
++
++
++2.2. Processing pipelines
++
++ Routing algorithms are often split up in several parts like packet
++ validation, loop-detection or routing table lookup.
++ To implement these as independent and clear as possible, DES-SERT enables
++ you to split up your packet processing in as many parts as you like.
++
++ There are two separate processing pipelines - one for packets received
++ from the kernel via a TUN or TAP interface and one for packets received
++ via an interface used on the mesh network.
++
++ You can register callbacks to be added to one of these pipelines with
++ "dessert_sysrxcb_add" or "dessert_meshrxcb_add". Both take an additional
++ integer argument ("priority") specifying the order the callbacks should
++ be called. Higher "priority" value results in being called later
++ within the pipeline.
++
++ int dessert_sysrxcb_add(dessert_sysrxcb_t* c, int prio);
++
++ int dessert_meshrxcb_add(dessert_meshrxcb_t* c, int prio);
++
++ If a callback returns "DESSERT_MSG_KEEP" the packed will be processed by
++ further callbacks, if it returns "DESSERT_MSG_DROP" the message will be
++ dropped and no further callbacks will be called.
++
++ You do not need to care about the management of the buffers for incoming
++ messages - DES-SERT does this for you. Nevertheless if you need to add
++ extensions or enlarge the payload of a message, you need to tell DES-SERT
++ to enlarge the buffer for you if the flag "DESSERT_FLAG_SPARSE" is set on
++ the message. You can do this by returning "DESSERT_MSG_NEEDNOSPARSE" from
++ within a callback. The callback will be called again with a larger buffer
++ and no "DESSERT_FLAG_SPARSE" flag being set.
++
++
++2.2.1. Processing buffer
++
++ If you need to pass information along several callbacks, you can do this
++ in the processing buffer passed to the the callbacks. This buffer contains
++ some local processing flags ("lflags") set by the builtin callback
++ "dessert_msg_ifaceflags_cb" (e.g. telling you about packet origin or if
++ the packet is multicast) and 1KB of space for your callbacks to pass
++ along arbitrary data.
++
++ This buffer might only be allocated after you explicitly request it - in
++ this case the proc argument is NULL and you can return the value
++ "DESSERT_MSG_NEEDMSGPROC" from within your callback. The callback will
++ be called again with a valid processing buffer.
++
++
++2.3. Using interfaces
++
++
++2.3.1. Using a TUN/TAP interface
++
++ First you have to choose whether to use a TUN or TAP interface. TUN
++ interfaces are used to exchange IPv4 / IPv6 datagrams with the kernel
++ network stack. TAP interfaces are used to exchange Ethernet frames
++ with the kernel network stack. If you want to route Ethernet frames,
++ you should choose a TAP interface. If you intend to implement
++ a custom layer 2 to layer 3 mapping, you should use a TUN interface.
++
++ Currently, you can only initialize and use a single sys (TUN/TAP) interface.
++ This is done by "dessert_sysif_init". You must then set up the interface
++ config in the kernel yourself e.g. by calling "ifconfig".
++
++ int dessert_sysif_init(char* name, uint8_t flags);
++
++ In either case, frames you receive from a TUN/TAP interface will be
++ passed along the callbacks added by "dessert_sysrxcb_add" to the
++ processing pipeline. Each of them will be called with a pointer to an
++ Ethernet frame. In case of a TUN interface, "ether_shost" and "ether_dhost"
++ are set to "00:00:00:00:00:00", and ether_type reflects whether the packet
++ received is IPv4 oder IPv6.
++
++ Packets are sent to the kernel network stack with "dessert_syssend".
++ In case of a TUN Interface "ether_shost" and "ether_dhost" will be
++ ignored.
++
++ int dessert_syssend(const struct ether_header *eth, size_t len);
++
++
++2.3.2. Using a mesh interface
++
++ Mesh interfaces are used similar to the TUN/TAP interface with two major
++ differences: You can have multiple mesh interfaces and they send and
++ receive DES-SERT messages instead of Ethernet frames.
++
++ You add an mesh interface using "dessert_meshif_add" and can send to it
++ by calling "dessert_meshsend". If the interface parameter is NULL, the
++ packet will be transmitted over every interface (good for flooding).
++
++ int dessert_meshif_add(const char* dev, uint8_t flags);
++
++ int dessert_meshsend(const dessert_msg_t* msg,
++ const dessert_meshif_t *iface);
++
++
++2.4. Logging
++
++ You can write log messages easily with a bunch of macros provided
++ by DES-SERT ("dessert_debug", "dessert_info" ,"dessert_notice",
++ "dessert_warn", "dessert_warning", "dessert_err", "dessert_crit",
++ "dessert_alert" and "dessert_emerg"). Each of them can be used like
++ "printf" and logs to Syslog, STDERR, file or a ringbuffer depending
++ on your configuration.
++
++ DES-SERT also ships with a custom "assert" macro which acts like
++ the original macro from the standard C library and uses the logging
++ mechanism described above.
++
++
++2.5. Periodics
++
++ Periodics help you to perform maintenance or delayed tasks. A task
++ consists of a callback, which will be called at the time you requested,
++ and a void pointer the callback is passed. You can add these tasks by
++ calling "dessert_periodic_add" or "dessert_periodic_add_delayed".
++
++
++2.6. CLI
++
++ DES-SERT supports simple configuration and debugging of your routing
++ protocol implementation by providing a Cisco like command line interface
++ (cli) and a config file parser based upon it.
++ This cli is realized through libcli (http://code.google.com/p/libcli/).
++
++ DES-SERT does some of the initialization of libcli. Therefore, it provides
++ the main cli anchor "dessert_cli" and some anchors to add commands below
++ "dessert_cli_.*". Because DES-SERT only loosely wraps libcli, you should
++ make yourself familiar with libcli itself. This may be improved in further
++ DES-SERT releases.
++
++ You can evaluate a config file by calling "cli_file" and start a thread
++ enabling a telnet-interface for DES-SERT by calling "dessert_cli_run".
++
++
++2.7. Putting all together
++
++ Now you have learned about the most important aspects of DES-SERT.
++ To write your own routing protocol implementation, you need to know
++ how to put all this together.
++
++ You should start with a main() program parsing the command line options
++ and then calling "dessert_init()". This is needed to set up DES-SERT
++ correctly. Afterwards you can register callbacks, read the config file
++ and do what you like. If everything is set up, you call "dessert_run()"
++ and let the event based framework do its job.
++
++ If you would like to see a complete protocol implementation sample,
++ have a look at the "gossiping" directory.
++
++
++3. Contact & Feedback
++
++ We love feedback - if you have patches, comments or questions,
++ please contact us! Recent contact information is available on
++ http://www.des-testbed.net/des-sert/
+diff --git a/autogen.sh b/autogen.sh
+new file mode 100755
+index 0000000..b483139
+--- /dev/null
++++ b/autogen.sh
+@@ -0,0 +1,2 @@
++#!/bin/sh
++autoreconf --force --install -I m4
+diff --git a/changelog.gz b/changelog.gz
+deleted file mode 100644
+index f797d2e48676dea02be44b396649cd47a5054c4a..0000000000000000000000000000000000000000
+GIT binary patch
+literal 0
+HcmV?d00001
+
+literal 260
+zcmV+f0sH<RiwFoYvkprF17m1mZf9j|Z)X5qk5Nm*FcgKK*I#jb)6$i;!q7*d!zZ1r
+zeJ_>Vb-^?Vxmh*;-lR+zK3oDfC*S$fRMm4`H#=-ml~22}e#|yo^k)JGc0X2HQc@GN
+z`G$4Il2ZYK*gF##KIZJmOae18j}yUYwEM2xAN%30dmY;2;iE*h0a{u}B>)$g$FEp$
+zaRhJhe(3**D{$rsp8>&K9FtmzG3qcIM|WA){MT)g?u!u7Kx&^jOwJFHF-+v`7?c^s
+z{q5Q#k4J&UNP#@RMjnz$(sbmVjH;`OB0c#t%<1~mH5zr|z?xV{F1@?CEFe$GxBLaO
+Kgz5rW0RRAN&3b<T
+
+diff --git a/config.guess b/config.guess
+new file mode 100755
+index 0000000..e3a2116
+--- /dev/null
++++ b/config.guess
+@@ -0,0 +1,1533 @@
++#! /bin/sh
++# Attempt to guess a canonical system name.
++# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
++# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
++# Free Software Foundation, Inc.
++
++timestamp='2009-06-10'
++
++# This file is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful, but
++# WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++# General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
++# 02110-1301, USA.
++#
++# As a special exception to the GNU General Public License, if you
++# distribute this file as part of a program that contains a
++# configuration script generated by Autoconf, you may include it under
++# the same distribution terms that you use for the rest of that program.
++
++
++# Originally written by Per Bothner <per@bothner.com>.
++# Please send patches to <config-patches@gnu.org>. Submit a context
++# diff and a properly formatted ChangeLog entry.
++#
++# This script attempts to guess a canonical system name similar to
++# config.sub. If it succeeds, it prints the system name on stdout, and
++# exits with 0. Otherwise, it exits with 1.
++#
++# The plan is that this can be called by configure scripts if you
++# don't specify an explicit build system type.
++
++me=`echo "$0" | sed -e 's,.*/,,'`
++
++usage="\
++Usage: $0 [OPTION]
++
++Output the configuration name of the system \`$me' is run on.
++
++Operation modes:
++ -h, --help print this help, then exit
++ -t, --time-stamp print date of last modification, then exit
++ -v, --version print version number, then exit
++
++Report bugs and patches to <config-patches@gnu.org>."
++
++version="\
++GNU config.guess ($timestamp)
++
++Originally written by Per Bothner.
++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
++2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
++
++This is free software; see the source for copying conditions. There is NO
++warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
++
++help="
++Try \`$me --help' for more information."
++
++# Parse command line
++while test $# -gt 0 ; do
++ case $1 in
++ --time-stamp | --time* | -t )
++ echo "$timestamp" ; exit ;;
++ --version | -v )
++ echo "$version" ; exit ;;
++ --help | --h* | -h )
++ echo "$usage"; exit ;;
++ -- ) # Stop option processing
++ shift; break ;;
++ - ) # Use stdin as input.
++ break ;;
++ -* )
++ echo "$me: invalid option $1$help" >&2
++ exit 1 ;;
++ * )
++ break ;;
++ esac
++done
++
++if test $# != 0; then
++ echo "$me: too many arguments$help" >&2
++ exit 1
++fi
++
++trap 'exit 1' 1 2 15
++
++# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
++# compiler to aid in system detection is discouraged as it requires
++# temporary files to be created and, as you can see below, it is a
++# headache to deal with in a portable fashion.
++
++# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
++# use `HOST_CC' if defined, but it is deprecated.
++
++# Portable tmp directory creation inspired by the Autoconf team.
++
++set_cc_for_build='
++trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
++trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
++: ${TMPDIR=/tmp} ;
++ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
++ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
++ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
++ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
++dummy=$tmp/dummy ;
++tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
++case $CC_FOR_BUILD,$HOST_CC,$CC in
++ ,,) echo "int x;" > $dummy.c ;
++ for c in cc gcc c89 c99 ; do
++ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
++ CC_FOR_BUILD="$c"; break ;
++ fi ;
++ done ;
++ if test x"$CC_FOR_BUILD" = x ; then
++ CC_FOR_BUILD=no_compiler_found ;
++ fi
++ ;;
++ ,,*) CC_FOR_BUILD=$CC ;;
++ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
++esac ; set_cc_for_build= ;'
++
++# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
++# (ghazi@noc.rutgers.edu 1994-08-24)
++if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
++ PATH=$PATH:/.attbin ; export PATH
++fi
++
++UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
++UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
++UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
++UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
++
++# Note: order is significant - the case branches are not exclusive.
++
++case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
++ *:NetBSD:*:*)
++ # NetBSD (nbsd) targets should (where applicable) match one or
++ # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
++ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
++ # switched to ELF, *-*-netbsd* would select the old
++ # object file format. This provides both forward
++ # compatibility and a consistent mechanism for selecting the
++ # object file format.
++ #
++ # Note: NetBSD doesn't particularly care about the vendor
++ # portion of the name. We always set it to "unknown".
++ sysctl="sysctl -n hw.machine_arch"
++ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
++ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
++ case "${UNAME_MACHINE_ARCH}" in
++ armeb) machine=armeb-unknown ;;
++ arm*) machine=arm-unknown ;;
++ sh3el) machine=shl-unknown ;;
++ sh3eb) machine=sh-unknown ;;
++ sh5el) machine=sh5le-unknown ;;
++ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
++ esac
++ # The Operating System including object format, if it has switched
++ # to ELF recently, or will in the future.
++ case "${UNAME_MACHINE_ARCH}" in
++ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
++ eval $set_cc_for_build
++ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
++ | grep -q __ELF__
++ then
++ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
++ # Return netbsd for either. FIX?
++ os=netbsd
++ else
++ os=netbsdelf
++ fi
++ ;;
++ *)
++ os=netbsd
++ ;;
++ esac
++ # The OS release
++ # Debian GNU/NetBSD machines have a different userland, and
++ # thus, need a distinct triplet. However, they do not need
++ # kernel version information, so it can be replaced with a
++ # suitable tag, in the style of linux-gnu.
++ case "${UNAME_VERSION}" in
++ Debian*)
++ release='-gnu'
++ ;;
++ *)
++ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
++ ;;
++ esac
++ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
++ # contains redundant information, the shorter form:
++ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
++ echo "${machine}-${os}${release}"
++ exit ;;
++ *:OpenBSD:*:*)
++ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
++ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
++ exit ;;
++ *:ekkoBSD:*:*)
++ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
++ exit ;;
++ *:SolidBSD:*:*)
++ echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
++ exit ;;
++ macppc:MirBSD:*:*)
++ echo powerpc-unknown-mirbsd${UNAME_RELEASE}
++ exit ;;
++ *:MirBSD:*:*)
++ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
++ exit ;;
++ alpha:OSF1:*:*)
++ case $UNAME_RELEASE in
++ *4.0)
++ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
++ ;;
++ *5.*)
++ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
++ ;;
++ esac
++ # According to Compaq, /usr/sbin/psrinfo has been available on
++ # OSF/1 and Tru64 systems produced since 1995. I hope that
++ # covers most systems running today. This code pipes the CPU
++ # types through head -n 1, so we only detect the type of CPU 0.
++ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
++ case "$ALPHA_CPU_TYPE" in
++ "EV4 (21064)")
++ UNAME_MACHINE="alpha" ;;
++ "EV4.5 (21064)")
++ UNAME_MACHINE="alpha" ;;
++ "LCA4 (21066/21068)")
++ UNAME_MACHINE="alpha" ;;
++ "EV5 (21164)")
++ UNAME_MACHINE="alphaev5" ;;
++ "EV5.6 (21164A)")
++ UNAME_MACHINE="alphaev56" ;;
++ "EV5.6 (21164PC)")
++ UNAME_MACHINE="alphapca56" ;;
++ "EV5.7 (21164PC)")
++ UNAME_MACHINE="alphapca57" ;;
++ "EV6 (21264)")
++ UNAME_MACHINE="alphaev6" ;;
++ "EV6.7 (21264A)")
++ UNAME_MACHINE="alphaev67" ;;
++ "EV6.8CB (21264C)")
++ UNAME_MACHINE="alphaev68" ;;
++ "EV6.8AL (21264B)")
++ UNAME_MACHINE="alphaev68" ;;
++ "EV6.8CX (21264D)")
++ UNAME_MACHINE="alphaev68" ;;
++ "EV6.9A (21264/EV69A)")
++ UNAME_MACHINE="alphaev69" ;;
++ "EV7 (21364)")
++ UNAME_MACHINE="alphaev7" ;;
++ "EV7.9 (21364A)")
++ UNAME_MACHINE="alphaev79" ;;
++ esac
++ # A Pn.n version is a patched version.
++ # A Vn.n version is a released version.
++ # A Tn.n version is a released field test version.
++ # A Xn.n version is an unreleased experimental baselevel.
++ # 1.2 uses "1.2" for uname -r.
++ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
++ exit ;;
++ Alpha\ *:Windows_NT*:*)
++ # How do we know it's Interix rather than the generic POSIX subsystem?
++ # Should we change UNAME_MACHINE based on the output of uname instead
++ # of the specific Alpha model?
++ echo alpha-pc-interix
++ exit ;;
++ 21064:Windows_NT:50:3)
++ echo alpha-dec-winnt3.5
++ exit ;;
++ Amiga*:UNIX_System_V:4.0:*)
++ echo m68k-unknown-sysv4
++ exit ;;
++ *:[Aa]miga[Oo][Ss]:*:*)
++ echo ${UNAME_MACHINE}-unknown-amigaos
++ exit ;;
++ *:[Mm]orph[Oo][Ss]:*:*)
++ echo ${UNAME_MACHINE}-unknown-morphos
++ exit ;;
++ *:OS/390:*:*)
++ echo i370-ibm-openedition
++ exit ;;
++ *:z/VM:*:*)
++ echo s390-ibm-zvmoe
++ exit ;;
++ *:OS400:*:*)
++ echo powerpc-ibm-os400
++ exit ;;
++ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
++ echo arm-acorn-riscix${UNAME_RELEASE}
++ exit ;;
++ arm:riscos:*:*|arm:RISCOS:*:*)
++ echo arm-unknown-riscos
++ exit ;;
++ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
++ echo hppa1.1-hitachi-hiuxmpp
++ exit ;;
++ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
++ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
++ if test "`(/bin/universe) 2>/dev/null`" = att ; then
++ echo pyramid-pyramid-sysv3
++ else
++ echo pyramid-pyramid-bsd
++ fi
++ exit ;;
++ NILE*:*:*:dcosx)
++ echo pyramid-pyramid-svr4
++ exit ;;
++ DRS?6000:unix:4.0:6*)
++ echo sparc-icl-nx6
++ exit ;;
++ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
++ case `/usr/bin/uname -p` in
++ sparc) echo sparc-icl-nx7; exit ;;
++ esac ;;
++ s390x:SunOS:*:*)
++ echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
++ exit ;;
++ sun4H:SunOS:5.*:*)
++ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
++ exit ;;
++ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
++ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
++ exit ;;
++ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
++ eval $set_cc_for_build
++ SUN_ARCH="i386"
++ # If there is a compiler, see if it is configured for 64-bit objects.
++ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
++ # This test works for both compilers.
++ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
++ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
++ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
++ grep IS_64BIT_ARCH >/dev/null
++ then
++ SUN_ARCH="x86_64"
++ fi
++ fi
++ echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
++ exit ;;
++ sun4*:SunOS:6*:*)
++ # According to config.sub, this is the proper way to canonicalize
++ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
++ # it's likely to be more like Solaris than SunOS4.
++ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
++ exit ;;
++ sun4*:SunOS:*:*)
++ case "`/usr/bin/arch -k`" in
++ Series*|S4*)
++ UNAME_RELEASE=`uname -v`
++ ;;
++ esac
++ # Japanese Language versions have a version number like `4.1.3-JL'.
++ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
++ exit ;;
++ sun3*:SunOS:*:*)
++ echo m68k-sun-sunos${UNAME_RELEASE}
++ exit ;;
++ sun*:*:4.2BSD:*)
++ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
++ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
++ case "`/bin/arch`" in
++ sun3)
++ echo m68k-sun-sunos${UNAME_RELEASE}
++ ;;
++ sun4)
++ echo sparc-sun-sunos${UNAME_RELEASE}
++ ;;
++ esac
++ exit ;;
++ aushp:SunOS:*:*)
++ echo sparc-auspex-sunos${UNAME_RELEASE}
++ exit ;;
++ # The situation for MiNT is a little confusing. The machine name
++ # can be virtually everything (everything which is not
++ # "atarist" or "atariste" at least should have a processor
++ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
++ # to the lowercase version "mint" (or "freemint"). Finally
++ # the system name "TOS" denotes a system which is actually not
++ # MiNT. But MiNT is downward compatible to TOS, so this should
++ # be no problem.
++ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
++ echo m68k-atari-mint${UNAME_RELEASE}
++ exit ;;
++ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
++ echo m68k-atari-mint${UNAME_RELEASE}
++ exit ;;
++ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
++ echo m68k-atari-mint${UNAME_RELEASE}
++ exit ;;
++ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
++ echo m68k-milan-mint${UNAME_RELEASE}
++ exit ;;
++ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
++ echo m68k-hades-mint${UNAME_RELEASE}
++ exit ;;
++ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
++ echo m68k-unknown-mint${UNAME_RELEASE}
++ exit ;;
++ m68k:machten:*:*)
++ echo m68k-apple-machten${UNAME_RELEASE}
++ exit ;;
++ powerpc:machten:*:*)
++ echo powerpc-apple-machten${UNAME_RELEASE}
++ exit ;;
++ RISC*:Mach:*:*)
++ echo mips-dec-mach_bsd4.3
++ exit ;;
++ RISC*:ULTRIX:*:*)
++ echo mips-dec-ultrix${UNAME_RELEASE}
++ exit ;;
++ VAX*:ULTRIX*:*:*)
++ echo vax-dec-ultrix${UNAME_RELEASE}
++ exit ;;
++ 2020:CLIX:*:* | 2430:CLIX:*:*)
++ echo clipper-intergraph-clix${UNAME_RELEASE}
++ exit ;;
++ mips:*:*:UMIPS | mips:*:*:RISCos)
++ eval $set_cc_for_build
++ sed 's/^ //' << EOF >$dummy.c
++#ifdef __cplusplus
++#include <stdio.h> /* for printf() prototype */
++ int main (int argc, char *argv[]) {
++#else
++ int main (argc, argv) int argc; char *argv[]; {
++#endif
++ #if defined (host_mips) && defined (MIPSEB)
++ #if defined (SYSTYPE_SYSV)
++ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
++ #endif
++ #if defined (SYSTYPE_SVR4)
++ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
++ #endif
++ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
++ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
++ #endif
++ #endif
++ exit (-1);
++ }
++EOF
++ $CC_FOR_BUILD -o $dummy $dummy.c &&
++ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
++ SYSTEM_NAME=`$dummy $dummyarg` &&
++ { echo "$SYSTEM_NAME"; exit; }
++ echo mips-mips-riscos${UNAME_RELEASE}
++ exit ;;
++ Motorola:PowerMAX_OS:*:*)
++ echo powerpc-motorola-powermax
++ exit ;;
++ Motorola:*:4.3:PL8-*)
++ echo powerpc-harris-powermax
++ exit ;;
++ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
++ echo powerpc-harris-powermax
++ exit ;;
++ Night_Hawk:Power_UNIX:*:*)
++ echo powerpc-harris-powerunix
++ exit ;;
++ m88k:CX/UX:7*:*)
++ echo m88k-harris-cxux7
++ exit ;;
++ m88k:*:4*:R4*)
++ echo m88k-motorola-sysv4
++ exit ;;
++ m88k:*:3*:R3*)
++ echo m88k-motorola-sysv3
++ exit ;;
++ AViiON:dgux:*:*)
++ # DG/UX returns AViiON for all architectures
++ UNAME_PROCESSOR=`/usr/bin/uname -p`
++ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
++ then
++ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
++ [ ${TARGET_BINARY_INTERFACE}x = x ]
++ then
++ echo m88k-dg-dgux${UNAME_RELEASE}
++ else
++ echo m88k-dg-dguxbcs${UNAME_RELEASE}
++ fi
++ else
++ echo i586-dg-dgux${UNAME_RELEASE}
++ fi
++ exit ;;
++ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
++ echo m88k-dolphin-sysv3
++ exit ;;
++ M88*:*:R3*:*)
++ # Delta 88k system running SVR3
++ echo m88k-motorola-sysv3
++ exit ;;
++ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
++ echo m88k-tektronix-sysv3
++ exit ;;
++ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
++ echo m68k-tektronix-bsd
++ exit ;;
++ *:IRIX*:*:*)
++ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
++ exit ;;
++ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
++ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
++ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
++ i*86:AIX:*:*)
++ echo i386-ibm-aix
++ exit ;;
++ ia64:AIX:*:*)
++ if [ -x /usr/bin/oslevel ] ; then
++ IBM_REV=`/usr/bin/oslevel`
++ else
++ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
++ fi
++ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
++ exit ;;
++ *:AIX:2:3)
++ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
++ eval $set_cc_for_build
++ sed 's/^ //' << EOF >$dummy.c
++ #include <sys/systemcfg.h>
++
++ main()
++ {
++ if (!__power_pc())
++ exit(1);
++ puts("powerpc-ibm-aix3.2.5");
++ exit(0);
++ }
++EOF
++ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
++ then
++ echo "$SYSTEM_NAME"
++ else
++ echo rs6000-ibm-aix3.2.5
++ fi
++ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
++ echo rs6000-ibm-aix3.2.4
++ else
++ echo rs6000-ibm-aix3.2
++ fi
++ exit ;;
++ *:AIX:*:[456])
++ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
++ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
++ IBM_ARCH=rs6000
++ else
++ IBM_ARCH=powerpc
++ fi
++ if [ -x /usr/bin/oslevel ] ; then
++ IBM_REV=`/usr/bin/oslevel`
++ else
++ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
++ fi
++ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
++ exit ;;
++ *:AIX:*:*)
++ echo rs6000-ibm-aix
++ exit ;;
++ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
++ echo romp-ibm-bsd4.4
++ exit ;;
++ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
++ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
++ exit ;; # report: romp-ibm BSD 4.3
++ *:BOSX:*:*)
++ echo rs6000-bull-bosx
++ exit ;;
++ DPX/2?00:B.O.S.:*:*)
++ echo m68k-bull-sysv3
++ exit ;;
++ 9000/[34]??:4.3bsd:1.*:*)
++ echo m68k-hp-bsd
++ exit ;;
++ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
++ echo m68k-hp-bsd4.4
++ exit ;;
++ 9000/[34678]??:HP-UX:*:*)
++ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
++ case "${UNAME_MACHINE}" in
++ 9000/31? ) HP_ARCH=m68000 ;;
++ 9000/[34]?? ) HP_ARCH=m68k ;;
++ 9000/[678][0-9][0-9])
++ if [ -x /usr/bin/getconf ]; then
++ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
++ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
++ case "${sc_cpu_version}" in
++ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
++ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
++ 532) # CPU_PA_RISC2_0
++ case "${sc_kernel_bits}" in
++ 32) HP_ARCH="hppa2.0n" ;;
++ 64) HP_ARCH="hppa2.0w" ;;
++ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
++ esac ;;
++ esac
++ fi
++ if [ "${HP_ARCH}" = "" ]; then
++ eval $set_cc_for_build
++ sed 's/^ //' << EOF >$dummy.c
++
++ #define _HPUX_SOURCE
++ #include <stdlib.h>
++ #include <unistd.h>
++
++ int main ()
++ {
++ #if defined(_SC_KERNEL_BITS)
++ long bits = sysconf(_SC_KERNEL_BITS);
++ #endif
++ long cpu = sysconf (_SC_CPU_VERSION);
++
++ switch (cpu)
++ {
++ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
++ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
++ case CPU_PA_RISC2_0:
++ #if defined(_SC_KERNEL_BITS)
++ switch (bits)
++ {
++ case 64: puts ("hppa2.0w"); break;
++ case 32: puts ("hppa2.0n"); break;
++ default: puts ("hppa2.0"); break;
++ } break;
++ #else /* !defined(_SC_KERNEL_BITS) */
++ puts ("hppa2.0"); break;
++ #endif
++ default: puts ("hppa1.0"); break;
++ }
++ exit (0);
++ }
++EOF
++ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
++ test -z "$HP_ARCH" && HP_ARCH=hppa
++ fi ;;
++ esac
++ if [ ${HP_ARCH} = "hppa2.0w" ]
++ then
++ eval $set_cc_for_build
++
++ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
++ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
++ # generating 64-bit code. GNU and HP use different nomenclature:
++ #
++ # $ CC_FOR_BUILD=cc ./config.guess
++ # => hppa2.0w-hp-hpux11.23
++ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
++ # => hppa64-hp-hpux11.23
++
++ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
++ grep -q __LP64__
++ then
++ HP_ARCH="hppa2.0w"
++ else
++ HP_ARCH="hppa64"
++ fi
++ fi
++ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
++ exit ;;
++ ia64:HP-UX:*:*)
++ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
++ echo ia64-hp-hpux${HPUX_REV}
++ exit ;;
++ 3050*:HI-UX:*:*)
++ eval $set_cc_for_build
++ sed 's/^ //' << EOF >$dummy.c
++ #include <unistd.h>
++ int
++ main ()
++ {
++ long cpu = sysconf (_SC_CPU_VERSION);
++ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
++ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
++ results, however. */
++ if (CPU_IS_PA_RISC (cpu))
++ {
++ switch (cpu)
++ {
++ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
++ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
++ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
++ default: puts ("hppa-hitachi-hiuxwe2"); break;
++ }
++ }
++ else if (CPU_IS_HP_MC68K (cpu))
++ puts ("m68k-hitachi-hiuxwe2");
++ else puts ("unknown-hitachi-hiuxwe2");
++ exit (0);
++ }
++EOF
++ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
++ { echo "$SYSTEM_NAME"; exit; }
++ echo unknown-hitachi-hiuxwe2
++ exit ;;
++ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
++ echo hppa1.1-hp-bsd
++ exit ;;
++ 9000/8??:4.3bsd:*:*)
++ echo hppa1.0-hp-bsd
++ exit ;;
++ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
++ echo hppa1.0-hp-mpeix
++ exit ;;
++ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
++ echo hppa1.1-hp-osf
++ exit ;;
++ hp8??:OSF1:*:*)
++ echo hppa1.0-hp-osf
++ exit ;;
++ i*86:OSF1:*:*)
++ if [ -x /usr/sbin/sysversion ] ; then
++ echo ${UNAME_MACHINE}-unknown-osf1mk
++ else
++ echo ${UNAME_MACHINE}-unknown-osf1
++ fi
++ exit ;;
++ parisc*:Lites*:*:*)
++ echo hppa1.1-hp-lites
++ exit ;;
++ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
++ echo c1-convex-bsd
++ exit ;;
++ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
++ if getsysinfo -f scalar_acc
++ then echo c32-convex-bsd
++ else echo c2-convex-bsd
++ fi
++ exit ;;
++ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
++ echo c34-convex-bsd
++ exit ;;
++ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
++ echo c38-convex-bsd
++ exit ;;
++ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
++ echo c4-convex-bsd
++ exit ;;
++ CRAY*Y-MP:*:*:*)
++ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
++ exit ;;
++ CRAY*[A-Z]90:*:*:*)
++ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
++ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
++ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
++ -e 's/\.[^.]*$/.X/'
++ exit ;;
++ CRAY*TS:*:*:*)
++ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
++ exit ;;
++ CRAY*T3E:*:*:*)
++ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
++ exit ;;
++ CRAY*SV1:*:*:*)
++ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
++ exit ;;
++ *:UNICOS/mp:*:*)
++ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
++ exit ;;
++ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
++ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
++ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
++ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
++ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
++ exit ;;
++ 5000:UNIX_System_V:4.*:*)
++ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
++ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
++ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
++ exit ;;
++ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
++ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
++ exit ;;
++ sparc*:BSD/OS:*:*)
++ echo sparc-unknown-bsdi${UNAME_RELEASE}
++ exit ;;
++ *:BSD/OS:*:*)
++ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
++ exit ;;
++ *:FreeBSD:*:*)
++ case ${UNAME_MACHINE} in
++ pc98)
++ echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
++ amd64)
++ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
++ *)
++ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
++ esac
++ exit ;;
++ i*:CYGWIN*:*)
++ echo ${UNAME_MACHINE}-pc-cygwin
++ exit ;;
++ *:MINGW*:*)
++ echo ${UNAME_MACHINE}-pc-mingw32
++ exit ;;
++ i*:windows32*:*)
++ # uname -m includes "-pc" on this system.
++ echo ${UNAME_MACHINE}-mingw32
++ exit ;;
++ i*:PW*:*)
++ echo ${UNAME_MACHINE}-pc-pw32
++ exit ;;
++ *:Interix*:[3456]*)
++ case ${UNAME_MACHINE} in
++ x86)
++ echo i586-pc-interix${UNAME_RELEASE}
++ exit ;;
++ EM64T | authenticamd | genuineintel)
++ echo x86_64-unknown-interix${UNAME_RELEASE}
++ exit ;;
++ IA64)
++ echo ia64-unknown-interix${UNAME_RELEASE}
++ exit ;;
++ esac ;;
++ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
++ echo i${UNAME_MACHINE}-pc-mks
++ exit ;;
++ 8664:Windows_NT:*)
++ echo x86_64-pc-mks
++ exit ;;
++ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
++ # How do we know it's Interix rather than the generic POSIX subsystem?
++ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
++ # UNAME_MACHINE based on the output of uname instead of i386?
++ echo i586-pc-interix
++ exit ;;
++ i*:UWIN*:*)
++ echo ${UNAME_MACHINE}-pc-uwin
++ exit ;;
++ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
++ echo x86_64-unknown-cygwin
++ exit ;;
++ p*:CYGWIN*:*)
++ echo powerpcle-unknown-cygwin
++ exit ;;
++ prep*:SunOS:5.*:*)
++ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
++ exit ;;
++ *:GNU:*:*)
++ # the GNU system
++ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
++ exit ;;
++ *:GNU/*:*:*)
++ # other systems with GNU libc and userland
++ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
++ exit ;;
++ i*86:Minix:*:*)
++ echo ${UNAME_MACHINE}-pc-minix
++ exit ;;
++ arm*:Linux:*:*)
++ eval $set_cc_for_build
++ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
++ | grep -q __ARM_EABI__
++ then
++ echo ${UNAME_MACHINE}-unknown-linux-gnu
++ else
++ echo ${UNAME_MACHINE}-unknown-linux-gnueabi
++ fi
++ exit ;;
++ avr32*:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-gnu
++ exit ;;
++ cris:Linux:*:*)
++ echo cris-axis-linux-gnu
++ exit ;;
++ crisv32:Linux:*:*)
++ echo crisv32-axis-linux-gnu
++ exit ;;
++ frv:Linux:*:*)
++ echo frv-unknown-linux-gnu
++ exit ;;
++ ia64:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-gnu
++ exit ;;
++ m32r*:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-gnu
++ exit ;;
++ m68*:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-gnu
++ exit ;;
++ mips:Linux:*:* | mips64:Linux:*:*)
++ eval $set_cc_for_build
++ sed 's/^ //' << EOF >$dummy.c
++ #undef CPU
++ #undef ${UNAME_MACHINE}
++ #undef ${UNAME_MACHINE}el
++ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
++ CPU=${UNAME_MACHINE}el
++ #else
++ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
++ CPU=${UNAME_MACHINE}
++ #else
++ CPU=
++ #endif
++ #endif
++EOF
++ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
++ /^CPU/{
++ s: ::g
++ p
++ }'`"
++ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
++ ;;
++ or32:Linux:*:*)
++ echo or32-unknown-linux-gnu
++ exit ;;
++ ppc:Linux:*:*)
++ echo powerpc-unknown-linux-gnu
++ exit ;;
++ ppc64:Linux:*:*)
++ echo powerpc64-unknown-linux-gnu
++ exit ;;
++ alpha:Linux:*:*)
++ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
++ EV5) UNAME_MACHINE=alphaev5 ;;
++ EV56) UNAME_MACHINE=alphaev56 ;;
++ PCA56) UNAME_MACHINE=alphapca56 ;;
++ PCA57) UNAME_MACHINE=alphapca56 ;;
++ EV6) UNAME_MACHINE=alphaev6 ;;
++ EV67) UNAME_MACHINE=alphaev67 ;;
++ EV68*) UNAME_MACHINE=alphaev68 ;;
++ esac
++ objdump --private-headers /bin/sh | grep -q ld.so.1
++ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
++ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
++ exit ;;
++ padre:Linux:*:*)
++ echo sparc-unknown-linux-gnu
++ exit ;;
++ parisc:Linux:*:* | hppa:Linux:*:*)
++ # Look for CPU level
++ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
++ PA7*) echo hppa1.1-unknown-linux-gnu ;;
++ PA8*) echo hppa2.0-unknown-linux-gnu ;;
++ *) echo hppa-unknown-linux-gnu ;;
++ esac
++ exit ;;
++ parisc64:Linux:*:* | hppa64:Linux:*:*)
++ echo hppa64-unknown-linux-gnu
++ exit ;;
++ s390:Linux:*:* | s390x:Linux:*:*)
++ echo ${UNAME_MACHINE}-ibm-linux
++ exit ;;
++ sh64*:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-gnu
++ exit ;;
++ sh*:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-gnu
++ exit ;;
++ sparc:Linux:*:* | sparc64:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-gnu
++ exit ;;
++ vax:Linux:*:*)
++ echo ${UNAME_MACHINE}-dec-linux-gnu
++ exit ;;
++ x86_64:Linux:*:*)
++ echo x86_64-unknown-linux-gnu
++ exit ;;
++ xtensa*:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-gnu
++ exit ;;
++ i*86:Linux:*:*)
++ # The BFD linker knows what the default object file format is, so
++ # first see if it will tell us. cd to the root directory to prevent
++ # problems with other programs or directories called `ld' in the path.
++ # Set LC_ALL=C to ensure ld outputs messages in English.
++ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
++ | sed -ne '/supported targets:/!d
++ s/[ ][ ]*/ /g
++ s/.*supported targets: *//
++ s/ .*//
++ p'`
++ case "$ld_supported_targets" in
++ elf32-i386)
++ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
++ ;;
++ esac
++ # Determine whether the default compiler is a.out or elf
++ eval $set_cc_for_build
++ sed 's/^ //' << EOF >$dummy.c
++ #include <features.h>
++ #ifdef __ELF__
++ # ifdef __GLIBC__
++ # if __GLIBC__ >= 2
++ LIBC=gnu
++ # else
++ LIBC=gnulibc1
++ # endif
++ # else
++ LIBC=gnulibc1
++ # endif
++ #else
++ #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
++ LIBC=gnu
++ #else
++ LIBC=gnuaout
++ #endif
++ #endif
++ #ifdef __dietlibc__
++ LIBC=dietlibc
++ #endif
++EOF
++ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
++ /^LIBC/{
++ s: ::g
++ p
++ }'`"
++ test x"${LIBC}" != x && {
++ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
++ exit
++ }
++ test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
++ ;;
++ i*86:DYNIX/ptx:4*:*)
++ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
++ # earlier versions are messed up and put the nodename in both
++ # sysname and nodename.
++ echo i386-sequent-sysv4
++ exit ;;
++ i*86:UNIX_SV:4.2MP:2.*)
++ # Unixware is an offshoot of SVR4, but it has its own version
++ # number series starting with 2...
++ # I am not positive that other SVR4 systems won't match this,
++ # I just have to hope. -- rms.
++ # Use sysv4.2uw... so that sysv4* matches it.
++ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
++ exit ;;
++ i*86:OS/2:*:*)
++ # If we were able to find `uname', then EMX Unix compatibility
++ # is probably installed.
++ echo ${UNAME_MACHINE}-pc-os2-emx
++ exit ;;
++ i*86:XTS-300:*:STOP)
++ echo ${UNAME_MACHINE}-unknown-stop
++ exit ;;
++ i*86:atheos:*:*)
++ echo ${UNAME_MACHINE}-unknown-atheos
++ exit ;;
++ i*86:syllable:*:*)
++ echo ${UNAME_MACHINE}-pc-syllable
++ exit ;;
++ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
++ echo i386-unknown-lynxos${UNAME_RELEASE}
++ exit ;;
++ i*86:*DOS:*:*)
++ echo ${UNAME_MACHINE}-pc-msdosdjgpp
++ exit ;;
++ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
++ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
++ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
++ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
++ else
++ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
++ fi
++ exit ;;
++ i*86:*:5:[678]*)
++ # UnixWare 7.x, OpenUNIX and OpenServer 6.
++ case `/bin/uname -X | grep "^Machine"` in
++ *486*) UNAME_MACHINE=i486 ;;
++ *Pentium) UNAME_MACHINE=i586 ;;
++ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
++ esac
++ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
++ exit ;;
++ i*86:*:3.2:*)
++ if test -f /usr/options/cb.name; then
++ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
++ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
++ elif /bin/uname -X 2>/dev/null >/dev/null ; then
++ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
++ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
++ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
++ && UNAME_MACHINE=i586
++ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
++ && UNAME_MACHINE=i686
++ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
++ && UNAME_MACHINE=i686
++ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
++ else
++ echo ${UNAME_MACHINE}-pc-sysv32
++ fi
++ exit ;;
++ pc:*:*:*)
++ # Left here for compatibility:
++ # uname -m prints for DJGPP always 'pc', but it prints nothing about
++ # the processor, so we play safe by assuming i586.
++ # Note: whatever this is, it MUST be the same as what config.sub
++ # prints for the "djgpp" host, or else GDB configury will decide that
++ # this is a cross-build.
++ echo i586-pc-msdosdjgpp
++ exit ;;
++ Intel:Mach:3*:*)
++ echo i386-pc-mach3
++ exit ;;
++ paragon:*:*:*)
++ echo i860-intel-osf1
++ exit ;;
++ i860:*:4.*:*) # i860-SVR4
++ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
++ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
++ else # Add other i860-SVR4 vendors below as they are discovered.
++ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
++ fi
++ exit ;;
++ mini*:CTIX:SYS*5:*)
++ # "miniframe"
++ echo m68010-convergent-sysv
++ exit ;;
++ mc68k:UNIX:SYSTEM5:3.51m)
++ echo m68k-convergent-sysv
++ exit ;;
++ M680?0:D-NIX:5.3:*)
++ echo m68k-diab-dnix
++ exit ;;
++ M68*:*:R3V[5678]*:*)
++ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
++ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
++ OS_REL=''
++ test -r /etc/.relid \
++ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
++ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
++ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
++ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
++ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
++ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
++ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
++ && { echo i486-ncr-sysv4; exit; } ;;
++ NCR*:*:4.2:* | MPRAS*:*:4.2:*)
++ OS_REL='.3'
++ test -r /etc/.relid \
++ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
++ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
++ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
++ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
++ && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
++ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
++ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
++ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
++ echo m68k-unknown-lynxos${UNAME_RELEASE}
++ exit ;;
++ mc68030:UNIX_System_V:4.*:*)
++ echo m68k-atari-sysv4
++ exit ;;
++ TSUNAMI:LynxOS:2.*:*)
++ echo sparc-unknown-lynxos${UNAME_RELEASE}
++ exit ;;
++ rs6000:LynxOS:2.*:*)
++ echo rs6000-unknown-lynxos${UNAME_RELEASE}
++ exit ;;
++ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
++ echo powerpc-unknown-lynxos${UNAME_RELEASE}
++ exit ;;
++ SM[BE]S:UNIX_SV:*:*)
++ echo mips-dde-sysv${UNAME_RELEASE}
++ exit ;;
++ RM*:ReliantUNIX-*:*:*)
++ echo mips-sni-sysv4
++ exit ;;
++ RM*:SINIX-*:*:*)
++ echo mips-sni-sysv4
++ exit ;;
++ *:SINIX-*:*:*)
++ if uname -p 2>/dev/null >/dev/null ; then
++ UNAME_MACHINE=`(uname -p) 2>/dev/null`
++ echo ${UNAME_MACHINE}-sni-sysv4
++ else
++ echo ns32k-sni-sysv
++ fi
++ exit ;;
++ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
++ # says <Richard.M.Bartel@ccMail.Census.GOV>
++ echo i586-unisys-sysv4
++ exit ;;
++ *:UNIX_System_V:4*:FTX*)
++ # From Gerald Hewes <hewes@openmarket.com>.
++ # How about differentiating between stratus architectures? -djm
++ echo hppa1.1-stratus-sysv4
++ exit ;;
++ *:*:*:FTX*)
++ # From seanf@swdc.stratus.com.
++ echo i860-stratus-sysv4
++ exit ;;
++ i*86:VOS:*:*)
++ # From Paul.Green@stratus.com.
++ echo ${UNAME_MACHINE}-stratus-vos
++ exit ;;
++ *:VOS:*:*)
++ # From Paul.Green@stratus.com.
++ echo hppa1.1-stratus-vos
++ exit ;;
++ mc68*:A/UX:*:*)
++ echo m68k-apple-aux${UNAME_RELEASE}
++ exit ;;
++ news*:NEWS-OS:6*:*)
++ echo mips-sony-newsos6
++ exit ;;
++ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
++ if [ -d /usr/nec ]; then
++ echo mips-nec-sysv${UNAME_RELEASE}
++ else
++ echo mips-unknown-sysv${UNAME_RELEASE}
++ fi
++ exit ;;
++ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
++ echo powerpc-be-beos
++ exit ;;
++ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
++ echo powerpc-apple-beos
++ exit ;;
++ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
++ echo i586-pc-beos
++ exit ;;
++ BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
++ echo i586-pc-haiku
++ exit ;;
++ SX-4:SUPER-UX:*:*)
++ echo sx4-nec-superux${UNAME_RELEASE}
++ exit ;;
++ SX-5:SUPER-UX:*:*)
++ echo sx5-nec-superux${UNAME_RELEASE}
++ exit ;;
++ SX-6:SUPER-UX:*:*)
++ echo sx6-nec-superux${UNAME_RELEASE}
++ exit ;;
++ SX-7:SUPER-UX:*:*)
++ echo sx7-nec-superux${UNAME_RELEASE}
++ exit ;;
++ SX-8:SUPER-UX:*:*)
++ echo sx8-nec-superux${UNAME_RELEASE}
++ exit ;;
++ SX-8R:SUPER-UX:*:*)
++ echo sx8r-nec-superux${UNAME_RELEASE}
++ exit ;;
++ Power*:Rhapsody:*:*)
++ echo powerpc-apple-rhapsody${UNAME_RELEASE}
++ exit ;;
++ *:Rhapsody:*:*)
++ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
++ exit ;;
++ *:Darwin:*:*)
++ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
++ case $UNAME_PROCESSOR in
++ unknown) UNAME_PROCESSOR=powerpc ;;
++ esac
++ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
++ exit ;;
++ *:procnto*:*:* | *:QNX:[0123456789]*:*)
++ UNAME_PROCESSOR=`uname -p`
++ if test "$UNAME_PROCESSOR" = "x86"; then
++ UNAME_PROCESSOR=i386
++ UNAME_MACHINE=pc
++ fi
++ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
++ exit ;;
++ *:QNX:*:4*)
++ echo i386-pc-qnx
++ exit ;;
++ NSE-?:NONSTOP_KERNEL:*:*)
++ echo nse-tandem-nsk${UNAME_RELEASE}
++ exit ;;
++ NSR-?:NONSTOP_KERNEL:*:*)
++ echo nsr-tandem-nsk${UNAME_RELEASE}
++ exit ;;
++ *:NonStop-UX:*:*)
++ echo mips-compaq-nonstopux
++ exit ;;
++ BS2000:POSIX*:*:*)
++ echo bs2000-siemens-sysv
++ exit ;;
++ DS/*:UNIX_System_V:*:*)
++ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
++ exit ;;
++ *:Plan9:*:*)
++ # "uname -m" is not consistent, so use $cputype instead. 386
++ # is converted to i386 for consistency with other x86
++ # operating systems.
++ if test "$cputype" = "386"; then
++ UNAME_MACHINE=i386
++ else
++ UNAME_MACHINE="$cputype"
++ fi
++ echo ${UNAME_MACHINE}-unknown-plan9
++ exit ;;
++ *:TOPS-10:*:*)
++ echo pdp10-unknown-tops10
++ exit ;;
++ *:TENEX:*:*)
++ echo pdp10-unknown-tenex
++ exit ;;
++ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
++ echo pdp10-dec-tops20
++ exit ;;
++ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
++ echo pdp10-xkl-tops20
++ exit ;;
++ *:TOPS-20:*:*)
++ echo pdp10-unknown-tops20
++ exit ;;
++ *:ITS:*:*)
++ echo pdp10-unknown-its
++ exit ;;
++ SEI:*:*:SEIUX)
++ echo mips-sei-seiux${UNAME_RELEASE}
++ exit ;;
++ *:DragonFly:*:*)
++ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
++ exit ;;
++ *:*VMS:*:*)
++ UNAME_MACHINE=`(uname -p) 2>/dev/null`
++ case "${UNAME_MACHINE}" in
++ A*) echo alpha-dec-vms ; exit ;;
++ I*) echo ia64-dec-vms ; exit ;;
++ V*) echo vax-dec-vms ; exit ;;
++ esac ;;
++ *:XENIX:*:SysV)
++ echo i386-pc-xenix
++ exit ;;
++ i*86:skyos:*:*)
++ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
++ exit ;;
++ i*86:rdos:*:*)
++ echo ${UNAME_MACHINE}-pc-rdos
++ exit ;;
++ i*86:AROS:*:*)
++ echo ${UNAME_MACHINE}-pc-aros
++ exit ;;
++esac
++
++#echo '(No uname command or uname output not recognized.)' 1>&2
++#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
++
++eval $set_cc_for_build
++cat >$dummy.c <<EOF
++#ifdef _SEQUENT_
++# include <sys/types.h>
++# include <sys/utsname.h>
++#endif
++main ()
++{
++#if defined (sony)
++#if defined (MIPSEB)
++ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
++ I don't know.... */
++ printf ("mips-sony-bsd\n"); exit (0);
++#else
++#include <sys/param.h>
++ printf ("m68k-sony-newsos%s\n",
++#ifdef NEWSOS4
++ "4"
++#else
++ ""
++#endif
++ ); exit (0);
++#endif
++#endif
++
++#if defined (__arm) && defined (__acorn) && defined (__unix)
++ printf ("arm-acorn-riscix\n"); exit (0);
++#endif
++
++#if defined (hp300) && !defined (hpux)
++ printf ("m68k-hp-bsd\n"); exit (0);
++#endif
++
++#if defined (NeXT)
++#if !defined (__ARCHITECTURE__)
++#define __ARCHITECTURE__ "m68k"
++#endif
++ int version;
++ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
++ if (version < 4)
++ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
++ else
++ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
++ exit (0);
++#endif
++
++#if defined (MULTIMAX) || defined (n16)
++#if defined (UMAXV)
++ printf ("ns32k-encore-sysv\n"); exit (0);
++#else
++#if defined (CMU)
++ printf ("ns32k-encore-mach\n"); exit (0);
++#else
++ printf ("ns32k-encore-bsd\n"); exit (0);
++#endif
++#endif
++#endif
++
++#if defined (__386BSD__)
++ printf ("i386-pc-bsd\n"); exit (0);
++#endif
++
++#if defined (sequent)
++#if defined (i386)
++ printf ("i386-sequent-dynix\n"); exit (0);
++#endif
++#if defined (ns32000)
++ printf ("ns32k-sequent-dynix\n"); exit (0);
++#endif
++#endif
++
++#if defined (_SEQUENT_)
++ struct utsname un;
++
++ uname(&un);
++
++ if (strncmp(un.version, "V2", 2) == 0) {
++ printf ("i386-sequent-ptx2\n"); exit (0);
++ }
++ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
++ printf ("i386-sequent-ptx1\n"); exit (0);
++ }
++ printf ("i386-sequent-ptx\n"); exit (0);
++
++#endif
++
++#if defined (vax)
++# if !defined (ultrix)
++# include <sys/param.h>
++# if defined (BSD)
++# if BSD == 43
++ printf ("vax-dec-bsd4.3\n"); exit (0);
++# else
++# if BSD == 199006
++ printf ("vax-dec-bsd4.3reno\n"); exit (0);
++# else
++ printf ("vax-dec-bsd\n"); exit (0);
++# endif
++# endif
++# else
++ printf ("vax-dec-bsd\n"); exit (0);
++# endif
++# else
++ printf ("vax-dec-ultrix\n"); exit (0);
++# endif
++#endif
++
++#if defined (alliant) && defined (i860)
++ printf ("i860-alliant-bsd\n"); exit (0);
++#endif
++
++ exit (1);
++}
++EOF
++
++$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
++ { echo "$SYSTEM_NAME"; exit; }
++
++# Apollos put the system type in the environment.
++
++test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
++
++# Convex versions that predate uname can use getsysinfo(1)
++
++if [ -x /usr/convex/getsysinfo ]
++then
++ case `getsysinfo -f cpu_type` in
++ c1*)
++ echo c1-convex-bsd
++ exit ;;
++ c2*)
++ if getsysinfo -f scalar_acc
++ then echo c32-convex-bsd
++ else echo c2-convex-bsd
++ fi
++ exit ;;
++ c34*)
++ echo c34-convex-bsd
++ exit ;;
++ c38*)
++ echo c38-convex-bsd
++ exit ;;
++ c4*)
++ echo c4-convex-bsd
++ exit ;;
++ esac
++fi
++
++cat >&2 <<EOF
++$0: unable to guess system type
++
++This script, last modified $timestamp, has failed to recognize
++the operating system you are using. It is advised that you
++download the most up to date version of the config scripts from
++
++ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
++and
++ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
++
++If the version you run ($0) is already up to date, please
++send the following data and any information you think might be
++pertinent to <config-patches@gnu.org> in order to provide the needed
++information to handle your system.
++
++config.guess timestamp = $timestamp
++
++uname -m = `(uname -m) 2>/dev/null || echo unknown`
++uname -r = `(uname -r) 2>/dev/null || echo unknown`
++uname -s = `(uname -s) 2>/dev/null || echo unknown`
++uname -v = `(uname -v) 2>/dev/null || echo unknown`
++
++/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
++/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
++
++hostinfo = `(hostinfo) 2>/dev/null`
++/bin/universe = `(/bin/universe) 2>/dev/null`
++/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
++/bin/arch = `(/bin/arch) 2>/dev/null`
++/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
++/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
++
++UNAME_MACHINE = ${UNAME_MACHINE}
++UNAME_RELEASE = ${UNAME_RELEASE}
++UNAME_SYSTEM = ${UNAME_SYSTEM}
++UNAME_VERSION = ${UNAME_VERSION}
++EOF
++
++exit 1
++
++# Local variables:
++# eval: (add-hook 'write-file-hooks 'time-stamp)
++# time-stamp-start: "timestamp='"
++# time-stamp-format: "%:y-%02m-%02d"
++# time-stamp-end: "'"
++# End:
+diff --git a/config.h.in b/config.h.in
+new file mode 100644
+index 0000000..e69afae
+--- /dev/null
++++ b/config.h.in
+@@ -0,0 +1,205 @@
++/* config.h.in. Generated from configure.ac by autoheader. */
++
++/* Define to 1 if you have the <arpa/inet.h> header file. */
++#undef HAVE_ARPA_INET_H
++
++/* Define to 1 if you have the <dlfcn.h> header file. */
++#undef HAVE_DLFCN_H
++
++/* Define to 1 if you have the <fcntl.h> header file. */
++#undef HAVE_FCNTL_H
++
++/* Define to 1 if you have the `fork' function. */
++#undef HAVE_FORK
++
++/* Define to 1 if you have the `gethostname' function. */
++#undef HAVE_GETHOSTNAME
++
++/* Define to 1 if you have the `gettimeofday' function. */
++#undef HAVE_GETTIMEOFDAY
++
++/* Define to 1 if you have the <inttypes.h> header file. */
++#undef HAVE_INTTYPES_H
++
++/* Define to 1 if you have the <libcli.h> header file. */
++#undef HAVE_LIBCLI_H
++
++/* Define to 1 if you have the `localtime_r' function. */
++#undef HAVE_LOCALTIME_R
++
++/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
++ to 0 otherwise. */
++#undef HAVE_MALLOC
++
++/* Define to 1 if you have the `memmove' function. */
++#undef HAVE_MEMMOVE
++
++/* Define to 1 if you have the <memory.h> header file. */
++#undef HAVE_MEMORY_H
++
++/* Define to 1 if you have the `memset' function. */
++#undef HAVE_MEMSET
++
++/* Define to 1 if you have the <netinet/in.h> header file. */
++#undef HAVE_NETINET_IN_H
++
++/* Define if you have POSIX threads libraries and header files. */
++#undef HAVE_PTHREAD
++
++/* Define to 1 if your system has a GNU libc compatible `realloc' function,
++ and to 0 otherwise. */
++#undef HAVE_REALLOC
++
++/* Define to 1 if you have the `socket' function. */
++#undef HAVE_SOCKET
++
++/* Define to 1 if stdbool.h conforms to C99. */
++#undef HAVE_STDBOOL_H
++
++/* Define to 1 if you have the <stdint.h> header file. */
++#undef HAVE_STDINT_H
++
++/* Define to 1 if you have the <stdlib.h> header file. */
++#undef HAVE_STDLIB_H
++
++/* Define to 1 if you have the `strdup' function. */
++#undef HAVE_STRDUP
++
++/* Define to 1 if you have the `strerror' function. */
++#undef HAVE_STRERROR
++
++/* Define to 1 if you have the <strings.h> header file. */
++#undef HAVE_STRINGS_H
++
++/* Define to 1 if you have the <string.h> header file. */
++#undef HAVE_STRING_H
++
++/* Define to 1 if you have the `strtol' function. */
++#undef HAVE_STRTOL
++
++/* Define to 1 if you have the <syslog.h> header file. */
++#undef HAVE_SYSLOG_H
++
++/* Define to 1 if you have the <sys/ioctl.h> header file. */
++#undef HAVE_SYS_IOCTL_H
++
++/* Define to 1 if you have the <sys/socket.h> header file. */
++#undef HAVE_SYS_SOCKET_H
++
++/* Define to 1 if you have the <sys/stat.h> header file. */
++#undef HAVE_SYS_STAT_H
++
++/* Define to 1 if you have the <sys/types.h> header file. */
++#undef HAVE_SYS_TYPES_H
++
++/* Define to 1 if you have the <unistd.h> header file. */
++#undef HAVE_UNISTD_H
++
++/* Define to 1 if you have the `vfork' function. */
++#undef HAVE_VFORK
++
++/* Define to 1 if you have the <vfork.h> header file. */
++#undef HAVE_VFORK_H
++
++/* Define to 1 if `fork' works. */
++#undef HAVE_WORKING_FORK
++
++/* Define to 1 if `vfork' works. */
++#undef HAVE_WORKING_VFORK
++
++/* Define to 1 if the system has the type `_Bool'. */
++#undef HAVE__BOOL
++
++/* Define to the sub-directory in which libtool stores uninstalled libraries.
++ */
++#undef LT_OBJDIR
++
++/* Name of package */
++#undef PACKAGE
++
++/* Define to the address where bug reports for this package should be sent. */
++#undef PACKAGE_BUGREPORT
++
++/* Define to the full name of this package. */
++#undef PACKAGE_NAME
++
++/* Define to the full name and version of this package. */
++#undef PACKAGE_STRING
++
++/* Define to the one symbol short name of this package. */
++#undef PACKAGE_TARNAME
++
++/* Define to the home page for this package. */
++#undef PACKAGE_URL
++
++/* Define to the version of this package. */
++#undef PACKAGE_VERSION
++
++/* Define to necessary symbol if this constant uses a non-standard name on
++ your system. */
++#undef PTHREAD_CREATE_JOINABLE
++
++/* Define to 1 if you have the ANSI C header files. */
++#undef STDC_HEADERS
++
++/* Version number of package */
++#undef VERSION
++
++/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
++ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
++ #define below would cause a syntax error. */
++#undef _UINT32_T
++
++/* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>,
++ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
++ #define below would cause a syntax error. */
++#undef _UINT64_T
++
++/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>,
++ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
++ #define below would cause a syntax error. */
++#undef _UINT8_T
++
++/* Define to `__inline__' or `__inline' if that's what the C compiler
++ calls it, or to nothing if 'inline' is not supported under any name. */
++#ifndef __cplusplus
++#undef inline
++#endif
++
++/* Define to the type of a signed integer type of width exactly 32 bits if
++ such a type exists and the standard includes do not define it. */
++#undef int32_t
++
++/* Define to rpl_malloc if the replacement function should be used. */
++#undef malloc
++
++/* Define to `int' if <sys/types.h> does not define. */
++#undef pid_t
++
++/* Define to rpl_realloc if the replacement function should be used. */
++#undef realloc
++
++/* Define to `unsigned int' if <sys/types.h> does not define. */
++#undef size_t
++
++/* Define to `int' if <sys/types.h> does not define. */
++#undef ssize_t
++
++/* Define to the type of an unsigned integer type of width exactly 16 bits if
++ such a type exists and the standard includes do not define it. */
++#undef uint16_t
++
++/* Define to the type of an unsigned integer type of width exactly 32 bits if
++ such a type exists and the standard includes do not define it. */
++#undef uint32_t
++
++/* Define to the type of an unsigned integer type of width exactly 64 bits if
++ such a type exists and the standard includes do not define it. */
++#undef uint64_t
++
++/* Define to the type of an unsigned integer type of width exactly 8 bits if
++ such a type exists and the standard includes do not define it. */
++#undef uint8_t
++
++/* Define as `fork' if `vfork' does not work. */
++#undef vfork
+diff --git a/config.sub b/config.sub
+new file mode 100755
+index 0000000..eb0389a
+--- /dev/null
++++ b/config.sub
+@@ -0,0 +1,1693 @@
++#! /bin/sh
++# Configuration validation subroutine script.
++# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
++# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
++# Free Software Foundation, Inc.
++
++timestamp='2009-06-11'
++
++# This file is (in principle) common to ALL GNU software.
++# The presence of a machine in this file suggests that SOME GNU software
++# can handle that machine. It does not imply ALL GNU software can.
++#
++# This file is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
++# 02110-1301, USA.
++#
++# As a special exception to the GNU General Public License, if you
++# distribute this file as part of a program that contains a
++# configuration script generated by Autoconf, you may include it under
++# the same distribution terms that you use for the rest of that program.
++
++
++# Please send patches to <config-patches@gnu.org>. Submit a context
++# diff and a properly formatted ChangeLog entry.
++#
++# Configuration subroutine to validate and canonicalize a configuration type.
++# Supply the specified configuration type as an argument.
++# If it is invalid, we print an error message on stderr and exit with code 1.
++# Otherwise, we print the canonical config type on stdout and succeed.
++
++# This file is supposed to be the same for all GNU packages
++# and recognize all the CPU types, system types and aliases
++# that are meaningful with *any* GNU software.
++# Each package is responsible for reporting which valid configurations
++# it does not support. The user should be able to distinguish
++# a failure to support a valid configuration from a meaningless
++# configuration.
++
++# The goal of this file is to map all the various variations of a given
++# machine specification into a single specification in the form:
++# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
++# or in some cases, the newer four-part form:
++# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
++# It is wrong to echo any other type of specification.
++
++me=`echo "$0" | sed -e 's,.*/,,'`
++
++usage="\
++Usage: $0 [OPTION] CPU-MFR-OPSYS
++ $0 [OPTION] ALIAS
++
++Canonicalize a configuration name.
++
++Operation modes:
++ -h, --help print this help, then exit
++ -t, --time-stamp print date of last modification, then exit
++ -v, --version print version number, then exit
++
++Report bugs and patches to <config-patches@gnu.org>."
++
++version="\
++GNU config.sub ($timestamp)
++
++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
++2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
++
++This is free software; see the source for copying conditions. There is NO
++warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
++
++help="
++Try \`$me --help' for more information."
++
++# Parse command line
++while test $# -gt 0 ; do
++ case $1 in
++ --time-stamp | --time* | -t )
++ echo "$timestamp" ; exit ;;
++ --version | -v )
++ echo "$version" ; exit ;;
++ --help | --h* | -h )
++ echo "$usage"; exit ;;
++ -- ) # Stop option processing
++ shift; break ;;
++ - ) # Use stdin as input.
++ break ;;
++ -* )
++ echo "$me: invalid option $1$help"
++ exit 1 ;;
++
++ *local*)
++ # First pass through any local machine types.
++ echo $1
++ exit ;;
++
++ * )
++ break ;;
++ esac
++done
++
++case $# in
++ 0) echo "$me: missing argument$help" >&2
++ exit 1;;
++ 1) ;;
++ *) echo "$me: too many arguments$help" >&2
++ exit 1;;
++esac
++
++# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
++# Here we must recognize all the valid KERNEL-OS combinations.
++maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
++case $maybe_os in
++ nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
++ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
++ kopensolaris*-gnu* | \
++ storm-chaos* | os2-emx* | rtmk-nova*)
++ os=-$maybe_os
++ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
++ ;;
++ *)
++ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
++ if [ $basic_machine != $1 ]
++ then os=`echo $1 | sed 's/.*-/-/'`
++ else os=; fi
++ ;;
++esac
++
++### Let's recognize common machines as not being operating systems so
++### that things like config.sub decstation-3100 work. We also
++### recognize some manufacturers as not being operating systems, so we
++### can provide default operating systems below.
++case $os in
++ -sun*os*)
++ # Prevent following clause from handling this invalid input.
++ ;;
++ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
++ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
++ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
++ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
++ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
++ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
++ -apple | -axis | -knuth | -cray)
++ os=
++ basic_machine=$1
++ ;;
++ -bluegene*)
++ os=-cnk
++ ;;
++ -sim | -cisco | -oki | -wec | -winbond)
++ os=
++ basic_machine=$1
++ ;;
++ -scout)
++ ;;
++ -wrs)
++ os=-vxworks
++ basic_machine=$1
++ ;;
++ -chorusos*)
++ os=-chorusos
++ basic_machine=$1
++ ;;
++ -chorusrdb)
++ os=-chorusrdb
++ basic_machine=$1
++ ;;
++ -hiux*)
++ os=-hiuxwe2
++ ;;
++ -sco6)
++ os=-sco5v6
++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
++ ;;
++ -sco5)
++ os=-sco3.2v5
++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
++ ;;
++ -sco4)
++ os=-sco3.2v4
++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
++ ;;
++ -sco3.2.[4-9]*)
++ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
++ ;;
++ -sco3.2v[4-9]*)
++ # Don't forget version if it is 3.2v4 or newer.
++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
++ ;;
++ -sco5v6*)
++ # Don't forget version if it is 3.2v4 or newer.
++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
++ ;;
++ -sco*)
++ os=-sco3.2v2
++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
++ ;;
++ -udk*)
++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
++ ;;
++ -isc)
++ os=-isc2.2
++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
++ ;;
++ -clix*)
++ basic_machine=clipper-intergraph
++ ;;
++ -isc*)
++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
++ ;;
++ -lynx*)
++ os=-lynxos
++ ;;
++ -ptx*)
++ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
++ ;;
++ -windowsnt*)
++ os=`echo $os | sed -e 's/windowsnt/winnt/'`
++ ;;
++ -psos*)
++ os=-psos
++ ;;
++ -mint | -mint[0-9]*)
++ basic_machine=m68k-atari
++ os=-mint
++ ;;
++esac
++
++# Decode aliases for certain CPU-COMPANY combinations.
++case $basic_machine in
++ # Recognize the basic CPU types without company name.
++ # Some are omitted here because they have special meanings below.
++ 1750a | 580 \
++ | a29k \
++ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
++ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
++ | am33_2.0 \
++ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
++ | bfin \
++ | c4x | clipper \
++ | d10v | d30v | dlx | dsp16xx \
++ | fido | fr30 | frv \
++ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
++ | i370 | i860 | i960 | ia64 \
++ | ip2k | iq2000 \
++ | lm32 \
++ | m32c | m32r | m32rle | m68000 | m68k | m88k \
++ | maxq | mb | microblaze | mcore | mep | metag \
++ | mips | mipsbe | mipseb | mipsel | mipsle \
++ | mips16 \
++ | mips64 | mips64el \
++ | mips64octeon | mips64octeonel \
++ | mips64orion | mips64orionel \
++ | mips64r5900 | mips64r5900el \
++ | mips64vr | mips64vrel \
++ | mips64vr4100 | mips64vr4100el \
++ | mips64vr4300 | mips64vr4300el \
++ | mips64vr5000 | mips64vr5000el \
++ | mips64vr5900 | mips64vr5900el \
++ | mipsisa32 | mipsisa32el \
++ | mipsisa32r2 | mipsisa32r2el \
++ | mipsisa64 | mipsisa64el \
++ | mipsisa64r2 | mipsisa64r2el \
++ | mipsisa64sb1 | mipsisa64sb1el \
++ | mipsisa64sr71k | mipsisa64sr71kel \
++ | mipstx39 | mipstx39el \
++ | mn10200 | mn10300 \
++ | moxie \
++ | mt \
++ | msp430 \
++ | nios | nios2 \
++ | ns16k | ns32k \
++ | or32 \
++ | pdp10 | pdp11 | pj | pjl \
++ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
++ | pyramid \
++ | score \
++ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
++ | sh64 | sh64le \
++ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
++ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
++ | spu | strongarm \
++ | tahoe | thumb | tic4x | tic80 | tron \
++ | v850 | v850e \
++ | we32k \
++ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
++ | z8k | z80)
++ basic_machine=$basic_machine-unknown
++ ;;
++ m6811 | m68hc11 | m6812 | m68hc12)
++ # Motorola 68HC11/12.
++ basic_machine=$basic_machine-unknown
++ os=-none
++ ;;
++ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
++ ;;
++ ms1)
++ basic_machine=mt-unknown
++ ;;
++
++ # We use `pc' rather than `unknown'
++ # because (1) that's what they normally are, and
++ # (2) the word "unknown" tends to confuse beginning users.
++ i*86 | x86_64)
++ basic_machine=$basic_machine-pc
++ ;;
++ # Object if more than one company name word.
++ *-*-*)
++ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
++ exit 1
++ ;;
++ # Recognize the basic CPU types with company name.
++ 580-* \
++ | a29k-* \
++ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
++ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
++ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
++ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
++ | avr-* | avr32-* \
++ | bfin-* | bs2000-* \
++ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
++ | clipper-* | craynv-* | cydra-* \
++ | d10v-* | d30v-* | dlx-* \
++ | elxsi-* \
++ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
++ | h8300-* | h8500-* \
++ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
++ | i*86-* | i860-* | i960-* | ia64-* \
++ | ip2k-* | iq2000-* \
++ | lm32-* \
++ | m32c-* | m32r-* | m32rle-* \
++ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
++ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
++ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
++ | mips16-* \
++ | mips64-* | mips64el-* \
++ | mips64octeon-* | mips64octeonel-* \
++ | mips64orion-* | mips64orionel-* \
++ | mips64r5900-* | mips64r5900el-* \
++ | mips64vr-* | mips64vrel-* \
++ | mips64vr4100-* | mips64vr4100el-* \
++ | mips64vr4300-* | mips64vr4300el-* \
++ | mips64vr5000-* | mips64vr5000el-* \
++ | mips64vr5900-* | mips64vr5900el-* \
++ | mipsisa32-* | mipsisa32el-* \
++ | mipsisa32r2-* | mipsisa32r2el-* \
++ | mipsisa64-* | mipsisa64el-* \
++ | mipsisa64r2-* | mipsisa64r2el-* \
++ | mipsisa64sb1-* | mipsisa64sb1el-* \
++ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
++ | mipstx39-* | mipstx39el-* \
++ | mmix-* \
++ | mt-* \
++ | msp430-* \
++ | nios-* | nios2-* \
++ | none-* | np1-* | ns16k-* | ns32k-* \
++ | orion-* \
++ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
++ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
++ | pyramid-* \
++ | romp-* | rs6000-* \
++ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
++ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
++ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
++ | sparclite-* \
++ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
++ | tahoe-* | thumb-* \
++ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
++ | tron-* \
++ | v850-* | v850e-* | vax-* \
++ | we32k-* \
++ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
++ | xstormy16-* | xtensa*-* \
++ | ymp-* \
++ | z8k-* | z80-*)
++ ;;
++ # Recognize the basic CPU types without company name, with glob match.
++ xtensa*)
++ basic_machine=$basic_machine-unknown
++ ;;
++ # Recognize the various machine names and aliases which stand
++ # for a CPU type and a company and sometimes even an OS.
++ 386bsd)
++ basic_machine=i386-unknown
++ os=-bsd
++ ;;
++ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
++ basic_machine=m68000-att
++ ;;
++ 3b*)
++ basic_machine=we32k-att
++ ;;
++ a29khif)
++ basic_machine=a29k-amd
++ os=-udi
++ ;;
++ abacus)
++ basic_machine=abacus-unknown
++ ;;
++ adobe68k)
++ basic_machine=m68010-adobe
++ os=-scout
++ ;;
++ alliant | fx80)
++ basic_machine=fx80-alliant
++ ;;
++ altos | altos3068)
++ basic_machine=m68k-altos
++ ;;
++ am29k)
++ basic_machine=a29k-none
++ os=-bsd
++ ;;
++ amd64)
++ basic_machine=x86_64-pc
++ ;;
++ amd64-*)
++ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
++ amdahl)
++ basic_machine=580-amdahl
++ os=-sysv
++ ;;
++ amiga | amiga-*)
++ basic_machine=m68k-unknown
++ ;;
++ amigaos | amigados)
++ basic_machine=m68k-unknown
++ os=-amigaos
++ ;;
++ amigaunix | amix)
++ basic_machine=m68k-unknown
++ os=-sysv4
++ ;;
++ apollo68)
++ basic_machine=m68k-apollo
++ os=-sysv
++ ;;
++ apollo68bsd)
++ basic_machine=m68k-apollo
++ os=-bsd
++ ;;
++ aros)
++ basic_machine=i386-pc
++ os=-aros
++ ;;
++ aux)
++ basic_machine=m68k-apple
++ os=-aux
++ ;;
++ balance)
++ basic_machine=ns32k-sequent
++ os=-dynix
++ ;;
++ blackfin)
++ basic_machine=bfin-unknown
++ os=-linux
++ ;;
++ blackfin-*)
++ basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
++ os=-linux
++ ;;
++ bluegene*)
++ basic_machine=powerpc-ibm
++ os=-cnk
++ ;;
++ c90)
++ basic_machine=c90-cray
++ os=-unicos
++ ;;
++ cegcc)
++ basic_machine=arm-unknown
++ os=-cegcc
++ ;;
++ convex-c1)
++ basic_machine=c1-convex
++ os=-bsd
++ ;;
++ convex-c2)
++ basic_machine=c2-convex
++ os=-bsd
++ ;;
++ convex-c32)
++ basic_machine=c32-convex
++ os=-bsd
++ ;;
++ convex-c34)
++ basic_machine=c34-convex
++ os=-bsd
++ ;;
++ convex-c38)
++ basic_machine=c38-convex
++ os=-bsd
++ ;;
++ cray | j90)
++ basic_machine=j90-cray
++ os=-unicos
++ ;;
++ craynv)
++ basic_machine=craynv-cray
++ os=-unicosmp
++ ;;
++ cr16)
++ basic_machine=cr16-unknown
++ os=-elf
++ ;;
++ crds | unos)
++ basic_machine=m68k-crds
++ ;;
++ crisv32 | crisv32-* | etraxfs*)
++ basic_machine=crisv32-axis
++ ;;
++ cris | cris-* | etrax*)
++ basic_machine=cris-axis
++ ;;
++ crx)
++ basic_machine=crx-unknown
++ os=-elf
++ ;;
++ da30 | da30-*)
++ basic_machine=m68k-da30
++ ;;
++ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
++ basic_machine=mips-dec
++ ;;
++ decsystem10* | dec10*)
++ basic_machine=pdp10-dec
++ os=-tops10
++ ;;
++ decsystem20* | dec20*)
++ basic_machine=pdp10-dec
++ os=-tops20
++ ;;
++ delta | 3300 | motorola-3300 | motorola-delta \
++ | 3300-motorola | delta-motorola)
++ basic_machine=m68k-motorola
++ ;;
++ delta88)
++ basic_machine=m88k-motorola
++ os=-sysv3
++ ;;
++ dicos)
++ basic_machine=i686-pc
++ os=-dicos
++ ;;
++ djgpp)
++ basic_machine=i586-pc
++ os=-msdosdjgpp
++ ;;
++ dpx20 | dpx20-*)
++ basic_machine=rs6000-bull
++ os=-bosx
++ ;;
++ dpx2* | dpx2*-bull)
++ basic_machine=m68k-bull
++ os=-sysv3
++ ;;
++ ebmon29k)
++ basic_machine=a29k-amd
++ os=-ebmon
++ ;;
++ elxsi)
++ basic_machine=elxsi-elxsi
++ os=-bsd
++ ;;
++ encore | umax | mmax)
++ basic_machine=ns32k-encore
++ ;;
++ es1800 | OSE68k | ose68k | ose | OSE)
++ basic_machine=m68k-ericsson
++ os=-ose
++ ;;
++ fx2800)
++ basic_machine=i860-alliant
++ ;;
++ genix)
++ basic_machine=ns32k-ns
++ ;;
++ gmicro)
++ basic_machine=tron-gmicro
++ os=-sysv
++ ;;
++ go32)
++ basic_machine=i386-pc
++ os=-go32
++ ;;
++ h3050r* | hiux*)
++ basic_machine=hppa1.1-hitachi
++ os=-hiuxwe2
++ ;;
++ h8300hms)
++ basic_machine=h8300-hitachi
++ os=-hms
++ ;;
++ h8300xray)
++ basic_machine=h8300-hitachi
++ os=-xray
++ ;;
++ h8500hms)
++ basic_machine=h8500-hitachi
++ os=-hms
++ ;;
++ harris)
++ basic_machine=m88k-harris
++ os=-sysv3
++ ;;
++ hp300-*)
++ basic_machine=m68k-hp
++ ;;
++ hp300bsd)
++ basic_machine=m68k-hp
++ os=-bsd
++ ;;
++ hp300hpux)
++ basic_machine=m68k-hp
++ os=-hpux
++ ;;
++ hp3k9[0-9][0-9] | hp9[0-9][0-9])
++ basic_machine=hppa1.0-hp
++ ;;
++ hp9k2[0-9][0-9] | hp9k31[0-9])
++ basic_machine=m68000-hp
++ ;;
++ hp9k3[2-9][0-9])
++ basic_machine=m68k-hp
++ ;;
++ hp9k6[0-9][0-9] | hp6[0-9][0-9])
++ basic_machine=hppa1.0-hp
++ ;;
++ hp9k7[0-79][0-9] | hp7[0-79][0-9])
++ basic_machine=hppa1.1-hp
++ ;;
++ hp9k78[0-9] | hp78[0-9])
++ # FIXME: really hppa2.0-hp
++ basic_machine=hppa1.1-hp
++ ;;
++ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
++ # FIXME: really hppa2.0-hp
++ basic_machine=hppa1.1-hp
++ ;;
++ hp9k8[0-9][13679] | hp8[0-9][13679])
++ basic_machine=hppa1.1-hp
++ ;;
++ hp9k8[0-9][0-9] | hp8[0-9][0-9])
++ basic_machine=hppa1.0-hp
++ ;;
++ hppa-next)
++ os=-nextstep3
++ ;;
++ hppaosf)
++ basic_machine=hppa1.1-hp
++ os=-osf
++ ;;
++ hppro)
++ basic_machine=hppa1.1-hp
++ os=-proelf
++ ;;
++ i370-ibm* | ibm*)
++ basic_machine=i370-ibm
++ ;;
++# I'm not sure what "Sysv32" means. Should this be sysv3.2?
++ i*86v32)
++ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
++ os=-sysv32
++ ;;
++ i*86v4*)
++ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
++ os=-sysv4
++ ;;
++ i*86v)
++ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
++ os=-sysv
++ ;;
++ i*86sol2)
++ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
++ os=-solaris2
++ ;;
++ i386mach)
++ basic_machine=i386-mach
++ os=-mach
++ ;;
++ i386-vsta | vsta)
++ basic_machine=i386-unknown
++ os=-vsta
++ ;;
++ iris | iris4d)
++ basic_machine=mips-sgi
++ case $os in
++ -irix*)
++ ;;
++ *)
++ os=-irix4
++ ;;
++ esac
++ ;;
++ isi68 | isi)
++ basic_machine=m68k-isi
++ os=-sysv
++ ;;
++ m68knommu)
++ basic_machine=m68k-unknown
++ os=-linux
++ ;;
++ m68knommu-*)
++ basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
++ os=-linux
++ ;;
++ m88k-omron*)
++ basic_machine=m88k-omron
++ ;;
++ magnum | m3230)
++ basic_machine=mips-mips
++ os=-sysv
++ ;;
++ merlin)
++ basic_machine=ns32k-utek
++ os=-sysv
++ ;;
++ mingw32)
++ basic_machine=i386-pc
++ os=-mingw32
++ ;;
++ mingw32ce)
++ basic_machine=arm-unknown
++ os=-mingw32ce
++ ;;
++ miniframe)
++ basic_machine=m68000-convergent
++ ;;
++ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
++ basic_machine=m68k-atari
++ os=-mint
++ ;;
++ mips3*-*)
++ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
++ ;;
++ mips3*)
++ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
++ ;;
++ monitor)
++ basic_machine=m68k-rom68k
++ os=-coff
++ ;;
++ morphos)
++ basic_machine=powerpc-unknown
++ os=-morphos
++ ;;
++ msdos)
++ basic_machine=i386-pc
++ os=-msdos
++ ;;
++ ms1-*)
++ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
++ ;;
++ mvs)
++ basic_machine=i370-ibm
++ os=-mvs
++ ;;
++ ncr3000)
++ basic_machine=i486-ncr
++ os=-sysv4
++ ;;
++ netbsd386)
++ basic_machine=i386-unknown
++ os=-netbsd
++ ;;
++ netwinder)
++ basic_machine=armv4l-rebel
++ os=-linux
++ ;;
++ news | news700 | news800 | news900)
++ basic_machine=m68k-sony
++ os=-newsos
++ ;;
++ news1000)
++ basic_machine=m68030-sony
++ os=-newsos
++ ;;
++ news-3600 | risc-news)
++ basic_machine=mips-sony
++ os=-newsos
++ ;;
++ necv70)
++ basic_machine=v70-nec
++ os=-sysv
++ ;;
++ next | m*-next )
++ basic_machine=m68k-next
++ case $os in
++ -nextstep* )
++ ;;
++ -ns2*)
++ os=-nextstep2
++ ;;
++ *)
++ os=-nextstep3
++ ;;
++ esac
++ ;;
++ nh3000)
++ basic_machine=m68k-harris
++ os=-cxux
++ ;;
++ nh[45]000)
++ basic_machine=m88k-harris
++ os=-cxux
++ ;;
++ nindy960)
++ basic_machine=i960-intel
++ os=-nindy
++ ;;
++ mon960)
++ basic_machine=i960-intel
++ os=-mon960
++ ;;
++ nonstopux)
++ basic_machine=mips-compaq
++ os=-nonstopux
++ ;;
++ np1)
++ basic_machine=np1-gould
++ ;;
++ nsr-tandem)
++ basic_machine=nsr-tandem
++ ;;
++ op50n-* | op60c-*)
++ basic_machine=hppa1.1-oki
++ os=-proelf
++ ;;
++ openrisc | openrisc-*)
++ basic_machine=or32-unknown
++ ;;
++ os400)
++ basic_machine=powerpc-ibm
++ os=-os400
++ ;;
++ OSE68000 | ose68000)
++ basic_machine=m68000-ericsson
++ os=-ose
++ ;;
++ os68k)
++ basic_machine=m68k-none
++ os=-os68k
++ ;;
++ pa-hitachi)
++ basic_machine=hppa1.1-hitachi
++ os=-hiuxwe2
++ ;;
++ paragon)
++ basic_machine=i860-intel
++ os=-osf
++ ;;
++ parisc)
++ basic_machine=hppa-unknown
++ os=-linux
++ ;;
++ parisc-*)
++ basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
++ os=-linux
++ ;;
++ pbd)
++ basic_machine=sparc-tti
++ ;;
++ pbb)
++ basic_machine=m68k-tti
++ ;;
++ pc532 | pc532-*)
++ basic_machine=ns32k-pc532
++ ;;
++ pc98)
++ basic_machine=i386-pc
++ ;;
++ pc98-*)
++ basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
++ pentium | p5 | k5 | k6 | nexgen | viac3)
++ basic_machine=i586-pc
++ ;;
++ pentiumpro | p6 | 6x86 | athlon | athlon_*)
++ basic_machine=i686-pc
++ ;;
++ pentiumii | pentium2 | pentiumiii | pentium3)
++ basic_machine=i686-pc
++ ;;
++ pentium4)
++ basic_machine=i786-pc
++ ;;
++ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
++ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
++ pentiumpro-* | p6-* | 6x86-* | athlon-*)
++ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
++ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
++ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
++ pentium4-*)
++ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
++ pn)
++ basic_machine=pn-gould
++ ;;
++ power) basic_machine=power-ibm
++ ;;
++ ppc) basic_machine=powerpc-unknown
++ ;;
++ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
++ ppcle | powerpclittle | ppc-le | powerpc-little)
++ basic_machine=powerpcle-unknown
++ ;;
++ ppcle-* | powerpclittle-*)
++ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
++ ppc64) basic_machine=powerpc64-unknown
++ ;;
++ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
++ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
++ basic_machine=powerpc64le-unknown
++ ;;
++ ppc64le-* | powerpc64little-*)
++ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
++ ps2)
++ basic_machine=i386-ibm
++ ;;
++ pw32)
++ basic_machine=i586-unknown
++ os=-pw32
++ ;;
++ rdos)
++ basic_machine=i386-pc
++ os=-rdos
++ ;;
++ rom68k)
++ basic_machine=m68k-rom68k
++ os=-coff
++ ;;
++ rm[46]00)
++ basic_machine=mips-siemens
++ ;;
++ rtpc | rtpc-*)
++ basic_machine=romp-ibm
++ ;;
++ s390 | s390-*)
++ basic_machine=s390-ibm
++ ;;
++ s390x | s390x-*)
++ basic_machine=s390x-ibm
++ ;;
++ sa29200)
++ basic_machine=a29k-amd
++ os=-udi
++ ;;
++ sb1)
++ basic_machine=mipsisa64sb1-unknown
++ ;;
++ sb1el)
++ basic_machine=mipsisa64sb1el-unknown
++ ;;
++ sde)
++ basic_machine=mipsisa32-sde
++ os=-elf
++ ;;
++ sei)
++ basic_machine=mips-sei
++ os=-seiux
++ ;;
++ sequent)
++ basic_machine=i386-sequent
++ ;;
++ sh)
++ basic_machine=sh-hitachi
++ os=-hms
++ ;;
++ sh5el)
++ basic_machine=sh5le-unknown
++ ;;
++ sh64)
++ basic_machine=sh64-unknown
++ ;;
++ sparclite-wrs | simso-wrs)
++ basic_machine=sparclite-wrs
++ os=-vxworks
++ ;;
++ sps7)
++ basic_machine=m68k-bull
++ os=-sysv2
++ ;;
++ spur)
++ basic_machine=spur-unknown
++ ;;
++ st2000)
++ basic_machine=m68k-tandem
++ ;;
++ stratus)
++ basic_machine=i860-stratus
++ os=-sysv4
++ ;;
++ sun2)
++ basic_machine=m68000-sun
++ ;;
++ sun2os3)
++ basic_machine=m68000-sun
++ os=-sunos3
++ ;;
++ sun2os4)
++ basic_machine=m68000-sun
++ os=-sunos4
++ ;;
++ sun3os3)
++ basic_machine=m68k-sun
++ os=-sunos3
++ ;;
++ sun3os4)
++ basic_machine=m68k-sun
++ os=-sunos4
++ ;;
++ sun4os3)
++ basic_machine=sparc-sun
++ os=-sunos3
++ ;;
++ sun4os4)
++ basic_machine=sparc-sun
++ os=-sunos4
++ ;;
++ sun4sol2)
++ basic_machine=sparc-sun
++ os=-solaris2
++ ;;
++ sun3 | sun3-*)
++ basic_machine=m68k-sun
++ ;;
++ sun4)
++ basic_machine=sparc-sun
++ ;;
++ sun386 | sun386i | roadrunner)
++ basic_machine=i386-sun
++ ;;
++ sv1)
++ basic_machine=sv1-cray
++ os=-unicos
++ ;;
++ symmetry)
++ basic_machine=i386-sequent
++ os=-dynix
++ ;;
++ t3e)
++ basic_machine=alphaev5-cray
++ os=-unicos
++ ;;
++ t90)
++ basic_machine=t90-cray
++ os=-unicos
++ ;;
++ tic54x | c54x*)
++ basic_machine=tic54x-unknown
++ os=-coff
++ ;;
++ tic55x | c55x*)
++ basic_machine=tic55x-unknown
++ os=-coff
++ ;;
++ tic6x | c6x*)
++ basic_machine=tic6x-unknown
++ os=-coff
++ ;;
++ tile*)
++ basic_machine=tile-unknown
++ os=-linux-gnu
++ ;;
++ tx39)
++ basic_machine=mipstx39-unknown
++ ;;
++ tx39el)
++ basic_machine=mipstx39el-unknown
++ ;;
++ toad1)
++ basic_machine=pdp10-xkl
++ os=-tops20
++ ;;
++ tower | tower-32)
++ basic_machine=m68k-ncr
++ ;;
++ tpf)
++ basic_machine=s390x-ibm
++ os=-tpf
++ ;;
++ udi29k)
++ basic_machine=a29k-amd
++ os=-udi
++ ;;
++ ultra3)
++ basic_machine=a29k-nyu
++ os=-sym1
++ ;;
++ v810 | necv810)
++ basic_machine=v810-nec
++ os=-none
++ ;;
++ vaxv)
++ basic_machine=vax-dec
++ os=-sysv
++ ;;
++ vms)
++ basic_machine=vax-dec
++ os=-vms
++ ;;
++ vpp*|vx|vx-*)
++ basic_machine=f301-fujitsu
++ ;;
++ vxworks960)
++ basic_machine=i960-wrs
++ os=-vxworks
++ ;;
++ vxworks68)
++ basic_machine=m68k-wrs
++ os=-vxworks
++ ;;
++ vxworks29k)
++ basic_machine=a29k-wrs
++ os=-vxworks
++ ;;
++ w65*)
++ basic_machine=w65-wdc
++ os=-none
++ ;;
++ w89k-*)
++ basic_machine=hppa1.1-winbond
++ os=-proelf
++ ;;
++ xbox)
++ basic_machine=i686-pc
++ os=-mingw32
++ ;;
++ xps | xps100)
++ basic_machine=xps100-honeywell
++ ;;
++ ymp)
++ basic_machine=ymp-cray
++ os=-unicos
++ ;;
++ z8k-*-coff)
++ basic_machine=z8k-unknown
++ os=-sim
++ ;;
++ z80-*-coff)
++ basic_machine=z80-unknown
++ os=-sim
++ ;;
++ none)
++ basic_machine=none-none
++ os=-none
++ ;;
++
++# Here we handle the default manufacturer of certain CPU types. It is in
++# some cases the only manufacturer, in others, it is the most popular.
++ w89k)
++ basic_machine=hppa1.1-winbond
++ ;;
++ op50n)
++ basic_machine=hppa1.1-oki
++ ;;
++ op60c)
++ basic_machine=hppa1.1-oki
++ ;;
++ romp)
++ basic_machine=romp-ibm
++ ;;
++ mmix)
++ basic_machine=mmix-knuth
++ ;;
++ rs6000)
++ basic_machine=rs6000-ibm
++ ;;
++ vax)
++ basic_machine=vax-dec
++ ;;
++ pdp10)
++ # there are many clones, so DEC is not a safe bet
++ basic_machine=pdp10-unknown
++ ;;
++ pdp11)
++ basic_machine=pdp11-dec
++ ;;
++ we32k)
++ basic_machine=we32k-att
++ ;;
++ sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
++ basic_machine=sh-unknown
++ ;;
++ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
++ basic_machine=sparc-sun
++ ;;
++ cydra)
++ basic_machine=cydra-cydrome
++ ;;
++ orion)
++ basic_machine=orion-highlevel
++ ;;
++ orion105)
++ basic_machine=clipper-highlevel
++ ;;
++ mac | mpw | mac-mpw)
++ basic_machine=m68k-apple
++ ;;
++ pmac | pmac-mpw)
++ basic_machine=powerpc-apple
++ ;;
++ *-unknown)
++ # Make sure to match an already-canonicalized machine name.
++ ;;
++ *)
++ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
++ exit 1
++ ;;
++esac
++
++# Here we canonicalize certain aliases for manufacturers.
++case $basic_machine in
++ *-digital*)
++ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
++ ;;
++ *-commodore*)
++ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
++ ;;
++ *)
++ ;;
++esac
++
++# Decode manufacturer-specific aliases for certain operating systems.
++
++if [ x"$os" != x"" ]
++then
++case $os in
++ # First match some system type aliases
++ # that might get confused with valid system types.
++ # -solaris* is a basic system type, with this one exception.
++ -solaris1 | -solaris1.*)
++ os=`echo $os | sed -e 's|solaris1|sunos4|'`
++ ;;
++ -solaris)
++ os=-solaris2
++ ;;
++ -svr4*)
++ os=-sysv4
++ ;;
++ -unixware*)
++ os=-sysv4.2uw
++ ;;
++ -gnu/linux*)
++ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
++ ;;
++ # First accept the basic system types.
++ # The portable systems comes first.
++ # Each alternative MUST END IN A *, to match a version number.
++ # -sysv* is not here because it comes later, after sysvr4.
++ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
++ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
++ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
++ | -kopensolaris* \
++ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
++ | -aos* | -aros* \
++ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
++ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
++ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
++ | -openbsd* | -solidbsd* \
++ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
++ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
++ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
++ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
++ | -chorusos* | -chorusrdb* | -cegcc* \
++ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
++ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
++ | -uxpv* | -beos* | -mpeix* | -udk* \
++ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
++ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
++ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
++ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
++ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
++ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
++ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
++ # Remember, each alternative MUST END IN *, to match a version number.
++ ;;
++ -qnx*)
++ case $basic_machine in
++ x86-* | i*86-*)
++ ;;
++ *)
++ os=-nto$os
++ ;;
++ esac
++ ;;
++ -nto-qnx*)
++ ;;
++ -nto*)
++ os=`echo $os | sed -e 's|nto|nto-qnx|'`
++ ;;
++ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
++ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
++ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
++ ;;
++ -mac*)
++ os=`echo $os | sed -e 's|mac|macos|'`
++ ;;
++ -linux-dietlibc)
++ os=-linux-dietlibc
++ ;;
++ -linux*)
++ os=`echo $os | sed -e 's|linux|linux-gnu|'`
++ ;;
++ -sunos5*)
++ os=`echo $os | sed -e 's|sunos5|solaris2|'`
++ ;;
++ -sunos6*)
++ os=`echo $os | sed -e 's|sunos6|solaris3|'`
++ ;;
++ -opened*)
++ os=-openedition
++ ;;
++ -os400*)
++ os=-os400
++ ;;
++ -wince*)
++ os=-wince
++ ;;
++ -osfrose*)
++ os=-osfrose
++ ;;
++ -osf*)
++ os=-osf
++ ;;
++ -utek*)
++ os=-bsd
++ ;;
++ -dynix*)
++ os=-bsd
++ ;;
++ -acis*)
++ os=-aos
++ ;;
++ -atheos*)
++ os=-atheos
++ ;;
++ -syllable*)
++ os=-syllable
++ ;;
++ -386bsd)
++ os=-bsd
++ ;;
++ -ctix* | -uts*)
++ os=-sysv
++ ;;
++ -nova*)
++ os=-rtmk-nova
++ ;;
++ -ns2 )
++ os=-nextstep2
++ ;;
++ -nsk*)
++ os=-nsk
++ ;;
++ # Preserve the version number of sinix5.
++ -sinix5.*)
++ os=`echo $os | sed -e 's|sinix|sysv|'`
++ ;;
++ -sinix*)
++ os=-sysv4
++ ;;
++ -tpf*)
++ os=-tpf
++ ;;
++ -triton*)
++ os=-sysv3
++ ;;
++ -oss*)
++ os=-sysv3
++ ;;
++ -svr4)
++ os=-sysv4
++ ;;
++ -svr3)
++ os=-sysv3
++ ;;
++ -sysvr4)
++ os=-sysv4
++ ;;
++ # This must come after -sysvr4.
++ -sysv*)
++ ;;
++ -ose*)
++ os=-ose
++ ;;
++ -es1800*)
++ os=-ose
++ ;;
++ -xenix)
++ os=-xenix
++ ;;
++ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
++ os=-mint
++ ;;
++ -aros*)
++ os=-aros
++ ;;
++ -kaos*)
++ os=-kaos
++ ;;
++ -zvmoe)
++ os=-zvmoe
++ ;;
++ -dicos*)
++ os=-dicos
++ ;;
++ -none)
++ ;;
++ *)
++ # Get rid of the `-' at the beginning of $os.
++ os=`echo $os | sed 's/[^-]*-//'`
++ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
++ exit 1
++ ;;
++esac
++else
++
++# Here we handle the default operating systems that come with various machines.
++# The value should be what the vendor currently ships out the door with their
++# machine or put another way, the most popular os provided with the machine.
++
++# Note that if you're going to try to match "-MANUFACTURER" here (say,
++# "-sun"), then you have to tell the case statement up towards the top
++# that MANUFACTURER isn't an operating system. Otherwise, code above
++# will signal an error saying that MANUFACTURER isn't an operating
++# system, and we'll never get to this point.
++
++case $basic_machine in
++ score-*)
++ os=-elf
++ ;;
++ spu-*)
++ os=-elf
++ ;;
++ *-acorn)
++ os=-riscix1.2
++ ;;
++ arm*-rebel)
++ os=-linux
++ ;;
++ arm*-semi)
++ os=-aout
++ ;;
++ c4x-* | tic4x-*)
++ os=-coff
++ ;;
++ # This must come before the *-dec entry.
++ pdp10-*)
++ os=-tops20
++ ;;
++ pdp11-*)
++ os=-none
++ ;;
++ *-dec | vax-*)
++ os=-ultrix4.2
++ ;;
++ m68*-apollo)
++ os=-domain
++ ;;
++ i386-sun)
++ os=-sunos4.0.2
++ ;;
++ m68000-sun)
++ os=-sunos3
++ # This also exists in the configure program, but was not the
++ # default.
++ # os=-sunos4
++ ;;
++ m68*-cisco)
++ os=-aout
++ ;;
++ mep-*)
++ os=-elf
++ ;;
++ mips*-cisco)
++ os=-elf
++ ;;
++ mips*-*)
++ os=-elf
++ ;;
++ or32-*)
++ os=-coff
++ ;;
++ *-tti) # must be before sparc entry or we get the wrong os.
++ os=-sysv3
++ ;;
++ sparc-* | *-sun)
++ os=-sunos4.1.1
++ ;;
++ *-be)
++ os=-beos
++ ;;
++ *-haiku)
++ os=-haiku
++ ;;
++ *-ibm)
++ os=-aix
++ ;;
++ *-knuth)
++ os=-mmixware
++ ;;
++ *-wec)
++ os=-proelf
++ ;;
++ *-winbond)
++ os=-proelf
++ ;;
++ *-oki)
++ os=-proelf
++ ;;
++ *-hp)
++ os=-hpux
++ ;;
++ *-hitachi)
++ os=-hiux
++ ;;
++ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
++ os=-sysv
++ ;;
++ *-cbm)
++ os=-amigaos
++ ;;
++ *-dg)
++ os=-dgux
++ ;;
++ *-dolphin)
++ os=-sysv3
++ ;;
++ m68k-ccur)
++ os=-rtu
++ ;;
++ m88k-omron*)
++ os=-luna
++ ;;
++ *-next )
++ os=-nextstep
++ ;;
++ *-sequent)
++ os=-ptx
++ ;;
++ *-crds)
++ os=-unos
++ ;;
++ *-ns)
++ os=-genix
++ ;;
++ i370-*)
++ os=-mvs
++ ;;
++ *-next)
++ os=-nextstep3
++ ;;
++ *-gould)
++ os=-sysv
++ ;;
++ *-highlevel)
++ os=-bsd
++ ;;
++ *-encore)
++ os=-bsd
++ ;;
++ *-sgi)
++ os=-irix
++ ;;
++ *-siemens)
++ os=-sysv4
++ ;;
++ *-masscomp)
++ os=-rtu
++ ;;
++ f30[01]-fujitsu | f700-fujitsu)
++ os=-uxpv
++ ;;
++ *-rom68k)
++ os=-coff
++ ;;
++ *-*bug)
++ os=-coff
++ ;;
++ *-apple)
++ os=-macos
++ ;;
++ *-atari*)
++ os=-mint
++ ;;
++ *)
++ os=-none
++ ;;
++esac
++fi
++
++# Here we handle the case where we know the os, and the CPU type, but not the
++# manufacturer. We pick the logical manufacturer.
++vendor=unknown
++case $basic_machine in
++ *-unknown)
++ case $os in
++ -riscix*)
++ vendor=acorn
++ ;;
++ -sunos*)
++ vendor=sun
++ ;;
++ -cnk*|-aix*)
++ vendor=ibm
++ ;;
++ -beos*)
++ vendor=be
++ ;;
++ -hpux*)
++ vendor=hp
++ ;;
++ -mpeix*)
++ vendor=hp
++ ;;
++ -hiux*)
++ vendor=hitachi
++ ;;
++ -unos*)
++ vendor=crds
++ ;;
++ -dgux*)
++ vendor=dg
++ ;;
++ -luna*)
++ vendor=omron
++ ;;
++ -genix*)
++ vendor=ns
++ ;;
++ -mvs* | -opened*)
++ vendor=ibm
++ ;;
++ -os400*)
++ vendor=ibm
++ ;;
++ -ptx*)
++ vendor=sequent
++ ;;
++ -tpf*)
++ vendor=ibm
++ ;;
++ -vxsim* | -vxworks* | -windiss*)
++ vendor=wrs
++ ;;
++ -aux*)
++ vendor=apple
++ ;;
++ -hms*)
++ vendor=hitachi
++ ;;
++ -mpw* | -macos*)
++ vendor=apple
++ ;;
++ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
++ vendor=atari
++ ;;
++ -vos*)
++ vendor=stratus
++ ;;
++ esac
++ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
++ ;;
++esac
++
++echo $basic_machine$os
++exit
++
++# Local variables:
++# eval: (add-hook 'write-file-hooks 'time-stamp)
++# time-stamp-start: "timestamp='"
++# time-stamp-format: "%:y-%02m-%02d"
++# time-stamp-end: "'"
++# End:
+diff --git a/configure b/configure
+new file mode 100755
+index 0000000..f4500bf
+--- /dev/null
++++ b/configure
+@@ -0,0 +1,16274 @@
++#! /bin/sh
++# Guess values for system-dependent variables and create Makefiles.
++# Generated by GNU Autoconf 2.65 for libdessert 0.86.14.
++#
++# Report bugs to <des-sert@spline.inf.fu-berlin.de>.
++#
++#
++# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
++# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
++# Inc.
++#
++#
++# This configure script is free software; the Free Software Foundation
++# gives unlimited permission to copy, distribute and modify it.
++## -------------------- ##
++## M4sh Initialization. ##
++## -------------------- ##
++
++# Be more Bourne compatible
++DUALCASE=1; export DUALCASE # for MKS sh
++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
++ emulate sh
++ NULLCMD=:
++ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
++ # is contrary to our usage. Disable this feature.
++ alias -g '${1+"$@"}'='"$@"'
++ setopt NO_GLOB_SUBST
++else
++ case `(set -o) 2>/dev/null` in #(
++ *posix*) :
++ set -o posix ;; #(
++ *) :
++ ;;
++esac
++fi
++
++
++as_nl='
++'
++export as_nl
++# Printing a long string crashes Solaris 7 /usr/bin/printf.
++as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
++as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
++as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
++# Prefer a ksh shell builtin over an external printf program on Solaris,
++# but without wasting forks for bash or zsh.
++if test -z "$BASH_VERSION$ZSH_VERSION" \
++ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
++ as_echo='print -r --'
++ as_echo_n='print -rn --'
++elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
++ as_echo='printf %s\n'
++ as_echo_n='printf %s'
++else
++ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
++ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
++ as_echo_n='/usr/ucb/echo -n'
++ else
++ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
++ as_echo_n_body='eval
++ arg=$1;
++ case $arg in #(
++ *"$as_nl"*)
++ expr "X$arg" : "X\\(.*\\)$as_nl";
++ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
++ esac;
++ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
++ '
++ export as_echo_n_body
++ as_echo_n='sh -c $as_echo_n_body as_echo'
++ fi
++ export as_echo_body
++ as_echo='sh -c $as_echo_body as_echo'
++fi
++
++# The user is always right.
++if test "${PATH_SEPARATOR+set}" != set; then
++ PATH_SEPARATOR=:
++ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
++ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
++ PATH_SEPARATOR=';'
++ }
++fi
++
++
++# IFS
++# We need space, tab and new line, in precisely that order. Quoting is
++# there to prevent editors from complaining about space-tab.
++# (If _AS_PATH_WALK were called with IFS unset, it would disable word
++# splitting by setting IFS to empty value.)
++IFS=" "" $as_nl"
++
++# Find who we are. Look in the path if we contain no directory separator.
++case $0 in #((
++ *[\\/]* ) as_myself=$0 ;;
++ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++# We did not find ourselves, most probably we were run as `sh COMMAND'
++# in which case we are not to be found in the path.
++if test "x$as_myself" = x; then
++ as_myself=$0
++fi
++if test ! -f "$as_myself"; then
++ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
++ exit 1
++fi
++
++# Unset variables that we do not need and which cause bugs (e.g. in
++# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
++# suppresses any "Segmentation fault" message there. '((' could
++# trigger a bug in pdksh 5.2.14.
++for as_var in BASH_ENV ENV MAIL MAILPATH
++do eval test x\${$as_var+set} = xset \
++ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
++done
++PS1='$ '
++PS2='> '
++PS4='+ '
++
++# NLS nuisances.
++LC_ALL=C
++export LC_ALL
++LANGUAGE=C
++export LANGUAGE
++
++# CDPATH.
++(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
++
++if test "x$CONFIG_SHELL" = x; then
++ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
++ emulate sh
++ NULLCMD=:
++ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
++ # is contrary to our usage. Disable this feature.
++ alias -g '\${1+\"\$@\"}'='\"\$@\"'
++ setopt NO_GLOB_SUBST
++else
++ case \`(set -o) 2>/dev/null\` in #(
++ *posix*) :
++ set -o posix ;; #(
++ *) :
++ ;;
++esac
++fi
++"
++ as_required="as_fn_return () { (exit \$1); }
++as_fn_success () { as_fn_return 0; }
++as_fn_failure () { as_fn_return 1; }
++as_fn_ret_success () { return 0; }
++as_fn_ret_failure () { return 1; }
++
++exitcode=0
++as_fn_success || { exitcode=1; echo as_fn_success failed.; }
++as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
++as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
++as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
++if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
++
++else
++ exitcode=1; echo positional parameters were not saved.
++fi
++test x\$exitcode = x0 || exit 1"
++ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
++ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
++ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
++ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
++test \$(( 1 + 1 )) = 2 || exit 1"
++ if (eval "$as_required") 2>/dev/null; then :
++ as_have_required=yes
++else
++ as_have_required=no
++fi
++ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
++
++else
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++as_found=false
++for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ as_found=:
++ case $as_dir in #(
++ /*)
++ for as_base in sh bash ksh sh5; do
++ # Try only shells that exist, to save several forks.
++ as_shell=$as_dir/$as_base
++ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
++ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
++ CONFIG_SHELL=$as_shell as_have_required=yes
++ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
++ break 2
++fi
++fi
++ done;;
++ esac
++ as_found=false
++done
++$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
++ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
++ CONFIG_SHELL=$SHELL as_have_required=yes
++fi; }
++IFS=$as_save_IFS
++
++
++ if test "x$CONFIG_SHELL" != x; then :
++ # We cannot yet assume a decent shell, so we have to provide a
++ # neutralization value for shells without unset; and this also
++ # works around shells that cannot unset nonexistent variables.
++ BASH_ENV=/dev/null
++ ENV=/dev/null
++ (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
++ export CONFIG_SHELL
++ exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
++fi
++
++ if test x$as_have_required = xno; then :
++ $as_echo "$0: This script requires a shell more modern than all"
++ $as_echo "$0: the shells that I found on your system."
++ if test x${ZSH_VERSION+set} = xset ; then
++ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
++ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
++ else
++ $as_echo "$0: Please tell bug-autoconf@gnu.org and
++$0: des-sert@spline.inf.fu-berlin.de about your system,
++$0: including any error possibly output before this
++$0: message. Then install a modern shell, or manually run
++$0: the script under such a shell if you do have one."
++ fi
++ exit 1
++fi
++fi
++fi
++SHELL=${CONFIG_SHELL-/bin/sh}
++export SHELL
++# Unset more variables known to interfere with behavior of common tools.
++CLICOLOR_FORCE= GREP_OPTIONS=
++unset CLICOLOR_FORCE GREP_OPTIONS
++
++## --------------------- ##
++## M4sh Shell Functions. ##
++## --------------------- ##
++# as_fn_unset VAR
++# ---------------
++# Portably unset VAR.
++as_fn_unset ()
++{
++ { eval $1=; unset $1;}
++}
++as_unset=as_fn_unset
++
++# as_fn_set_status STATUS
++# -----------------------
++# Set $? to STATUS, without forking.
++as_fn_set_status ()
++{
++ return $1
++} # as_fn_set_status
++
++# as_fn_exit STATUS
++# -----------------
++# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
++as_fn_exit ()
++{
++ set +e
++ as_fn_set_status $1
++ exit $1
++} # as_fn_exit
++
++# as_fn_mkdir_p
++# -------------
++# Create "$as_dir" as a directory, including parents if necessary.
++as_fn_mkdir_p ()
++{
++
++ case $as_dir in #(
++ -*) as_dir=./$as_dir;;
++ esac
++ test -d "$as_dir" || eval $as_mkdir_p || {
++ as_dirs=
++ while :; do
++ case $as_dir in #(
++ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
++ *) as_qdir=$as_dir;;
++ esac
++ as_dirs="'$as_qdir' $as_dirs"
++ as_dir=`$as_dirname -- "$as_dir" ||
++$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
++ X"$as_dir" : 'X\(//\)[^/]' \| \
++ X"$as_dir" : 'X\(//\)$' \| \
++ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
++$as_echo X"$as_dir" |
++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
++ s//\1/
++ q
++ }
++ /^X\(\/\/\)[^/].*/{
++ s//\1/
++ q
++ }
++ /^X\(\/\/\)$/{
++ s//\1/
++ q
++ }
++ /^X\(\/\).*/{
++ s//\1/
++ q
++ }
++ s/.*/./; q'`
++ test -d "$as_dir" && break
++ done
++ test -z "$as_dirs" || eval "mkdir $as_dirs"
++ } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
++
++
++} # as_fn_mkdir_p
++# as_fn_append VAR VALUE
++# ----------------------
++# Append the text in VALUE to the end of the definition contained in VAR. Take
++# advantage of any shell optimizations that allow amortized linear growth over
++# repeated appends, instead of the typical quadratic growth present in naive
++# implementations.
++if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
++ eval 'as_fn_append ()
++ {
++ eval $1+=\$2
++ }'
++else
++ as_fn_append ()
++ {
++ eval $1=\$$1\$2
++ }
++fi # as_fn_append
++
++# as_fn_arith ARG...
++# ------------------
++# Perform arithmetic evaluation on the ARGs, and store the result in the
++# global $as_val. Take advantage of shells that can avoid forks. The arguments
++# must be portable across $(()) and expr.
++if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
++ eval 'as_fn_arith ()
++ {
++ as_val=$(( $* ))
++ }'
++else
++ as_fn_arith ()
++ {
++ as_val=`expr "$@" || test $? -eq 1`
++ }
++fi # as_fn_arith
++
++
++# as_fn_error ERROR [LINENO LOG_FD]
++# ---------------------------------
++# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
++# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
++# script with status $?, using 1 if that was 0.
++as_fn_error ()
++{
++ as_status=$?; test $as_status -eq 0 && as_status=1
++ if test "$3"; then
++ as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
++ $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
++ fi
++ $as_echo "$as_me: error: $1" >&2
++ as_fn_exit $as_status
++} # as_fn_error
++
++if expr a : '\(a\)' >/dev/null 2>&1 &&
++ test "X`expr 00001 : '.*\(...\)'`" = X001; then
++ as_expr=expr
++else
++ as_expr=false
++fi
++
++if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
++ as_basename=basename
++else
++ as_basename=false
++fi
++
++if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
++ as_dirname=dirname
++else
++ as_dirname=false
++fi
++
++as_me=`$as_basename -- "$0" ||
++$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
++ X"$0" : 'X\(//\)$' \| \
++ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
++$as_echo X/"$0" |
++ sed '/^.*\/\([^/][^/]*\)\/*$/{
++ s//\1/
++ q
++ }
++ /^X\/\(\/\/\)$/{
++ s//\1/
++ q
++ }
++ /^X\/\(\/\).*/{
++ s//\1/
++ q
++ }
++ s/.*/./; q'`
++
++# Avoid depending upon Character Ranges.
++as_cr_letters='abcdefghijklmnopqrstuvwxyz'
++as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
++as_cr_Letters=$as_cr_letters$as_cr_LETTERS
++as_cr_digits='0123456789'
++as_cr_alnum=$as_cr_Letters$as_cr_digits
++
++
++ as_lineno_1=$LINENO as_lineno_1a=$LINENO
++ as_lineno_2=$LINENO as_lineno_2a=$LINENO
++ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
++ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
++ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
++ sed -n '
++ p
++ /[$]LINENO/=
++ ' <$as_myself |
++ sed '
++ s/[$]LINENO.*/&-/
++ t lineno
++ b
++ :lineno
++ N
++ :loop
++ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
++ t loop
++ s/-\n.*//
++ ' >$as_me.lineno &&
++ chmod +x "$as_me.lineno" ||
++ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
++
++ # Don't try to exec as it changes $[0], causing all sort of problems
++ # (the dirname of $[0] is not the place where we might find the
++ # original and so on. Autoconf is especially sensitive to this).
++ . "./$as_me.lineno"
++ # Exit status is that of the last command.
++ exit
++}
++
++ECHO_C= ECHO_N= ECHO_T=
++case `echo -n x` in #(((((
++-n*)
++ case `echo 'xy\c'` in
++ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
++ xy) ECHO_C='\c';;
++ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
++ ECHO_T=' ';;
++ esac;;
++*)
++ ECHO_N='-n';;
++esac
++
++rm -f conf$$ conf$$.exe conf$$.file
++if test -d conf$$.dir; then
++ rm -f conf$$.dir/conf$$.file
++else
++ rm -f conf$$.dir
++ mkdir conf$$.dir 2>/dev/null
++fi
++if (echo >conf$$.file) 2>/dev/null; then
++ if ln -s conf$$.file conf$$ 2>/dev/null; then
++ as_ln_s='ln -s'
++ # ... but there are two gotchas:
++ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
++ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
++ # In both cases, we have to default to `cp -p'.
++ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
++ as_ln_s='cp -p'
++ elif ln conf$$.file conf$$ 2>/dev/null; then
++ as_ln_s=ln
++ else
++ as_ln_s='cp -p'
++ fi
++else
++ as_ln_s='cp -p'
++fi
++rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
++rmdir conf$$.dir 2>/dev/null
++
++if mkdir -p . 2>/dev/null; then
++ as_mkdir_p='mkdir -p "$as_dir"'
++else
++ test -d ./-p && rmdir ./-p
++ as_mkdir_p=false
++fi
++
++if test -x / >/dev/null 2>&1; then
++ as_test_x='test -x'
++else
++ if ls -dL / >/dev/null 2>&1; then
++ as_ls_L_option=L
++ else
++ as_ls_L_option=
++ fi
++ as_test_x='
++ eval sh -c '\''
++ if test -d "$1"; then
++ test -d "$1/.";
++ else
++ case $1 in #(
++ -*)set "./$1";;
++ esac;
++ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
++ ???[sx]*):;;*)false;;esac;fi
++ '\'' sh
++ '
++fi
++as_executable_p=$as_test_x
++
++# Sed expression to map a string onto a valid CPP name.
++as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
++
++# Sed expression to map a string onto a valid variable name.
++as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
++
++
++
++# Check that we are running under the correct shell.
++SHELL=${CONFIG_SHELL-/bin/sh}
++
++case X$lt_ECHO in
++X*--fallback-echo)
++ # Remove one level of quotation (which was required for Make).
++ ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','`
++ ;;
++esac
++
++ECHO=${lt_ECHO-echo}
++if test "X$1" = X--no-reexec; then
++ # Discard the --no-reexec flag, and continue.
++ shift
++elif test "X$1" = X--fallback-echo; then
++ # Avoid inline document here, it may be left over
++ :
++elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
++ # Yippee, $ECHO works!
++ :
++else
++ # Restart under the correct shell.
++ exec $SHELL "$0" --no-reexec ${1+"$@"}
++fi
++
++if test "X$1" = X--fallback-echo; then
++ # used as fallback echo
++ shift
++ cat <<_LT_EOF
++$*
++_LT_EOF
++ exit 0
++fi
++
++# The HP-UX ksh and POSIX shell print the target directory to stdout
++# if CDPATH is set.
++(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
++
++if test -z "$lt_ECHO"; then
++ if test "X${echo_test_string+set}" != Xset; then
++ # find a string as large as possible, as long as the shell can cope with it
++ for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
++ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
++ if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
++ { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
++ then
++ break
++ fi
++ done
++ fi
++
++ if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
++ echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
++ test "X$echo_testing_string" = "X$echo_test_string"; then
++ :
++ else
++ # The Solaris, AIX, and Digital Unix default echo programs unquote
++ # backslashes. This makes it impossible to quote backslashes using
++ # echo "$something" | sed 's/\\/\\\\/g'
++ #
++ # So, first we look for a working echo in the user's PATH.
++
++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
++ for dir in $PATH /usr/ucb; do
++ IFS="$lt_save_ifs"
++ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
++ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
++ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
++ test "X$echo_testing_string" = "X$echo_test_string"; then
++ ECHO="$dir/echo"
++ break
++ fi
++ done
++ IFS="$lt_save_ifs"
++
++ if test "X$ECHO" = Xecho; then
++ # We didn't find a better echo, so look for alternatives.
++ if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
++ echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
++ test "X$echo_testing_string" = "X$echo_test_string"; then
++ # This shell has a builtin print -r that does the trick.
++ ECHO='print -r'
++ elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
++ test "X$CONFIG_SHELL" != X/bin/ksh; then
++ # If we have ksh, try running configure again with it.
++ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
++ export ORIGINAL_CONFIG_SHELL
++ CONFIG_SHELL=/bin/ksh
++ export CONFIG_SHELL
++ exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
++ else
++ # Try using printf.
++ ECHO='printf %s\n'
++ if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
++ echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
++ test "X$echo_testing_string" = "X$echo_test_string"; then
++ # Cool, printf works
++ :
++ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
++ test "X$echo_testing_string" = 'X\t' &&
++ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
++ test "X$echo_testing_string" = "X$echo_test_string"; then
++ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
++ export CONFIG_SHELL
++ SHELL="$CONFIG_SHELL"
++ export SHELL
++ ECHO="$CONFIG_SHELL $0 --fallback-echo"
++ elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
++ test "X$echo_testing_string" = 'X\t' &&
++ echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
++ test "X$echo_testing_string" = "X$echo_test_string"; then
++ ECHO="$CONFIG_SHELL $0 --fallback-echo"
++ else
++ # maybe with a smaller string...
++ prev=:
++
++ for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
++ if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
++ then
++ break
++ fi
++ prev="$cmd"
++ done
++
++ if test "$prev" != 'sed 50q "$0"'; then
++ echo_test_string=`eval $prev`
++ export echo_test_string
++ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
++ else
++ # Oops. We lost completely, so just stick with echo.
++ ECHO=echo
++ fi
++ fi
++ fi
++ fi
++ fi
++fi
++
++# Copy echo and quote the copy suitably for passing to libtool from
++# the Makefile, instead of quoting the original, which is used later.
++lt_ECHO=$ECHO
++if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
++ lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
++fi
++
++
++
++
++test -n "$DJDIR" || exec 7<&0 </dev/null
++exec 6>&1
++
++# Name of the host.
++# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
++# so uname gets run too.
++ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
++
++#
++# Initializations.
++#
++ac_default_prefix=/usr/local
++ac_clean_files=
++ac_config_libobj_dir=.
++LIBOBJS=
++cross_compiling=no
++subdirs=
++MFLAGS=
++MAKEFLAGS=
++
++# Identity of this package.
++PACKAGE_NAME='libdessert'
++PACKAGE_TARNAME='libdessert'
++PACKAGE_VERSION='0.86.14'
++PACKAGE_STRING='libdessert 0.86.14'
++PACKAGE_BUGREPORT='des-sert@spline.inf.fu-berlin.de'
++PACKAGE_URL=''
++
++ac_unique_file="src/libdessert/dessert_core.c"
++# Factoring default headers for most tests.
++ac_includes_default="\
++#include <stdio.h>
++#ifdef HAVE_SYS_TYPES_H
++# include <sys/types.h>
++#endif
++#ifdef HAVE_SYS_STAT_H
++# include <sys/stat.h>
++#endif
++#ifdef STDC_HEADERS
++# include <stdlib.h>
++# include <stddef.h>
++#else
++# ifdef HAVE_STDLIB_H
++# include <stdlib.h>
++# endif
++#endif
++#ifdef HAVE_STRING_H
++# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
++# include <memory.h>
++# endif
++# include <string.h>
++#endif
++#ifdef HAVE_STRINGS_H
++# include <strings.h>
++#endif
++#ifdef HAVE_INTTYPES_H
++# include <inttypes.h>
++#endif
++#ifdef HAVE_STDINT_H
++# include <stdint.h>
++#endif
++#ifdef HAVE_UNISTD_H
++# include <unistd.h>
++#endif"
++
++ac_subst_vars='am__EXEEXT_FALSE
++am__EXEEXT_TRUE
++LTLIBOBJS
++DOXYGEN_PAPER_SIZE
++DX_COND_latex_FALSE
++DX_COND_latex_TRUE
++DX_COND_pdf_FALSE
++DX_COND_pdf_TRUE
++DX_PDFLATEX
++DX_FLAG_pdf
++DX_COND_ps_FALSE
++DX_COND_ps_TRUE
++DX_EGREP
++DX_DVIPS
++DX_MAKEINDEX
++DX_LATEX
++DX_FLAG_ps
++DX_COND_html_FALSE
++DX_COND_html_TRUE
++DX_FLAG_html
++DX_COND_chi_FALSE
++DX_COND_chi_TRUE
++DX_FLAG_chi
++DX_COND_chm_FALSE
++DX_COND_chm_TRUE
++DX_HHC
++DX_FLAG_chm
++DX_COND_xml_FALSE
++DX_COND_xml_TRUE
++DX_FLAG_xml
++DX_COND_rtf_FALSE
++DX_COND_rtf_TRUE
++DX_FLAG_rtf
++DX_COND_man_FALSE
++DX_COND_man_TRUE
++DX_FLAG_man
++DX_COND_dot_FALSE
++DX_COND_dot_TRUE
++DX_DOT
++DX_FLAG_dot
++DX_COND_doc_FALSE
++DX_COND_doc_TRUE
++DX_PERL
++DX_DOXYGEN
++DX_FLAG_doc
++DX_ENV
++DX_DOCDIR
++DX_CONFIG
++DX_PROJECT
++LIBOBJS
++PTHREAD_CFLAGS
++PTHREAD_LIBS
++PTHREAD_CC
++ax_pthread_config
++PCAP_CFLAGS
++PCAP_CFLGAS
++PCAP_LIBS
++SNMP_CFLAGS
++SNMP_CFLGAS
++SNMP_LIBS
++CPP
++OTOOL64
++OTOOL
++LIPO
++NMEDIT
++DSYMUTIL
++lt_ECHO
++RANLIB
++AR
++OBJDUMP
++NM
++ac_ct_DUMPBIN
++DUMPBIN
++LD
++FGREP
++EGREP
++GREP
++SED
++host_os
++host_vendor
++host_cpu
++host
++build_os
++build_vendor
++build_cpu
++build
++LIBTOOL
++LN_S
++am__fastdepCC_FALSE
++am__fastdepCC_TRUE
++CCDEPMODE
++AMDEPBACKSLASH
++AMDEP_FALSE
++AMDEP_TRUE
++am__quote
++am__include
++DEPDIR
++OBJEXT
++EXEEXT
++ac_ct_CC
++CPPFLAGS
++LDFLAGS
++CFLAGS
++CC
++LIBDESSERT_LIBRARY_VERSION
++am__untar
++am__tar
++AMTAR
++am__leading_dot
++SET_MAKE
++AWK
++mkdir_p
++MKDIR_P
++INSTALL_STRIP_PROGRAM
++STRIP
++install_sh
++MAKEINFO
++AUTOHEADER
++AUTOMAKE
++AUTOCONF
++ACLOCAL
++VERSION
++PACKAGE
++CYGPATH_W
++am__isrc
++INSTALL_DATA
++INSTALL_SCRIPT
++INSTALL_PROGRAM
++target_alias
++host_alias
++build_alias
++LIBS
++ECHO_T
++ECHO_N
++ECHO_C
++DEFS
++mandir
++localedir
++libdir
++psdir
++pdfdir
++dvidir
++htmldir
++infodir
++docdir
++oldincludedir
++includedir
++localstatedir
++sharedstatedir
++sysconfdir
++datadir
++datarootdir
++libexecdir
++sbindir
++bindir
++program_transform_name
++prefix
++exec_prefix
++PACKAGE_URL
++PACKAGE_BUGREPORT
++PACKAGE_STRING
++PACKAGE_VERSION
++PACKAGE_TARNAME
++PACKAGE_NAME
++PATH_SEPARATOR
++SHELL'
++ac_subst_files=''
++ac_user_opts='
++enable_option_checking
++enable_dependency_tracking
++enable_shared
++enable_static
++with_pic
++enable_fast_install
++with_gnu_ld
++enable_libtool_lock
++enable_doxygen_doc
++enable_doxygen_dot
++enable_doxygen_man
++enable_doxygen_rtf
++enable_doxygen_xml
++enable_doxygen_chm
++enable_doxygen_chi
++enable_doxygen_html
++enable_doxygen_ps
++enable_doxygen_pdf
++'
++ ac_precious_vars='build_alias
++host_alias
++target_alias
++CC
++CFLAGS
++LDFLAGS
++LIBS
++CPPFLAGS
++CPP
++DOXYGEN_PAPER_SIZE'
++
++
++# Initialize some variables set by options.
++ac_init_help=
++ac_init_version=false
++ac_unrecognized_opts=
++ac_unrecognized_sep=
++# The variables have the same names as the options, with
++# dashes changed to underlines.
++cache_file=/dev/null
++exec_prefix=NONE
++no_create=
++no_recursion=
++prefix=NONE
++program_prefix=NONE
++program_suffix=NONE
++program_transform_name=s,x,x,
++silent=
++site=
++srcdir=
++verbose=
++x_includes=NONE
++x_libraries=NONE
++
++# Installation directory options.
++# These are left unexpanded so users can "make install exec_prefix=/foo"
++# and all the variables that are supposed to be based on exec_prefix
++# by default will actually change.
++# Use braces instead of parens because sh, perl, etc. also accept them.
++# (The list follows the same order as the GNU Coding Standards.)
++bindir='${exec_prefix}/bin'
++sbindir='${exec_prefix}/sbin'
++libexecdir='${exec_prefix}/libexec'
++datarootdir='${prefix}/share'
++datadir='${datarootdir}'
++sysconfdir='${prefix}/etc'
++sharedstatedir='${prefix}/com'
++localstatedir='${prefix}/var'
++includedir='${prefix}/include'
++oldincludedir='/usr/include'
++docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
++infodir='${datarootdir}/info'
++htmldir='${docdir}'
++dvidir='${docdir}'
++pdfdir='${docdir}'
++psdir='${docdir}'
++libdir='${exec_prefix}/lib'
++localedir='${datarootdir}/locale'
++mandir='${datarootdir}/man'
++
++ac_prev=
++ac_dashdash=
++for ac_option
++do
++ # If the previous option needs an argument, assign it.
++ if test -n "$ac_prev"; then
++ eval $ac_prev=\$ac_option
++ ac_prev=
++ continue
++ fi
++
++ case $ac_option in
++ *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
++ *) ac_optarg=yes ;;
++ esac
++
++ # Accept the important Cygnus configure options, so we can diagnose typos.
++
++ case $ac_dashdash$ac_option in
++ --)
++ ac_dashdash=yes ;;
++
++ -bindir | --bindir | --bindi | --bind | --bin | --bi)
++ ac_prev=bindir ;;
++ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
++ bindir=$ac_optarg ;;
++
++ -build | --build | --buil | --bui | --bu)
++ ac_prev=build_alias ;;
++ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
++ build_alias=$ac_optarg ;;
++
++ -cache-file | --cache-file | --cache-fil | --cache-fi \
++ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
++ ac_prev=cache_file ;;
++ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
++ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
++ cache_file=$ac_optarg ;;
++
++ --config-cache | -C)
++ cache_file=config.cache ;;
++
++ -datadir | --datadir | --datadi | --datad)
++ ac_prev=datadir ;;
++ -datadir=* | --datadir=* | --datadi=* | --datad=*)
++ datadir=$ac_optarg ;;
++
++ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
++ | --dataroo | --dataro | --datar)
++ ac_prev=datarootdir ;;
++ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
++ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
++ datarootdir=$ac_optarg ;;
++
++ -disable-* | --disable-*)
++ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
++ # Reject names that are not valid shell variable names.
++ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
++ as_fn_error "invalid feature name: $ac_useropt"
++ ac_useropt_orig=$ac_useropt
++ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
++ case $ac_user_opts in
++ *"
++"enable_$ac_useropt"
++"*) ;;
++ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
++ ac_unrecognized_sep=', ';;
++ esac
++ eval enable_$ac_useropt=no ;;
++
++ -docdir | --docdir | --docdi | --doc | --do)
++ ac_prev=docdir ;;
++ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
++ docdir=$ac_optarg ;;
++
++ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
++ ac_prev=dvidir ;;
++ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
++ dvidir=$ac_optarg ;;
++
++ -enable-* | --enable-*)
++ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
++ # Reject names that are not valid shell variable names.
++ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
++ as_fn_error "invalid feature name: $ac_useropt"
++ ac_useropt_orig=$ac_useropt
++ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
++ case $ac_user_opts in
++ *"
++"enable_$ac_useropt"
++"*) ;;
++ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
++ ac_unrecognized_sep=', ';;
++ esac
++ eval enable_$ac_useropt=\$ac_optarg ;;
++
++ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
++ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
++ | --exec | --exe | --ex)
++ ac_prev=exec_prefix ;;
++ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
++ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
++ | --exec=* | --exe=* | --ex=*)
++ exec_prefix=$ac_optarg ;;
++
++ -gas | --gas | --ga | --g)
++ # Obsolete; use --with-gas.
++ with_gas=yes ;;
++
++ -help | --help | --hel | --he | -h)
++ ac_init_help=long ;;
++ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
++ ac_init_help=recursive ;;
++ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
++ ac_init_help=short ;;
++
++ -host | --host | --hos | --ho)
++ ac_prev=host_alias ;;
++ -host=* | --host=* | --hos=* | --ho=*)
++ host_alias=$ac_optarg ;;
++
++ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
++ ac_prev=htmldir ;;
++ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
++ | --ht=*)
++ htmldir=$ac_optarg ;;
++
++ -includedir | --includedir | --includedi | --included | --include \
++ | --includ | --inclu | --incl | --inc)
++ ac_prev=includedir ;;
++ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
++ | --includ=* | --inclu=* | --incl=* | --inc=*)
++ includedir=$ac_optarg ;;
++
++ -infodir | --infodir | --infodi | --infod | --info | --inf)
++ ac_prev=infodir ;;
++ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
++ infodir=$ac_optarg ;;
++
++ -libdir | --libdir | --libdi | --libd)
++ ac_prev=libdir ;;
++ -libdir=* | --libdir=* | --libdi=* | --libd=*)
++ libdir=$ac_optarg ;;
++
++ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
++ | --libexe | --libex | --libe)
++ ac_prev=libexecdir ;;
++ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
++ | --libexe=* | --libex=* | --libe=*)
++ libexecdir=$ac_optarg ;;
++
++ -localedir | --localedir | --localedi | --localed | --locale)
++ ac_prev=localedir ;;
++ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
++ localedir=$ac_optarg ;;
++
++ -localstatedir | --localstatedir | --localstatedi | --localstated \
++ | --localstate | --localstat | --localsta | --localst | --locals)
++ ac_prev=localstatedir ;;
++ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
++ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
++ localstatedir=$ac_optarg ;;
++
++ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
++ ac_prev=mandir ;;
++ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
++ mandir=$ac_optarg ;;
++
++ -nfp | --nfp | --nf)
++ # Obsolete; use --without-fp.
++ with_fp=no ;;
++
++ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
++ | --no-cr | --no-c | -n)
++ no_create=yes ;;
++
++ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
++ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
++ no_recursion=yes ;;
++
++ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
++ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
++ | --oldin | --oldi | --old | --ol | --o)
++ ac_prev=oldincludedir ;;
++ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
++ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
++ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
++ oldincludedir=$ac_optarg ;;
++
++ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
++ ac_prev=prefix ;;
++ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
++ prefix=$ac_optarg ;;
++
++ -program-prefix | --program-prefix | --program-prefi | --program-pref \
++ | --program-pre | --program-pr | --program-p)
++ ac_prev=program_prefix ;;
++ -program-prefix=* | --program-prefix=* | --program-prefi=* \
++ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
++ program_prefix=$ac_optarg ;;
++
++ -program-suffix | --program-suffix | --program-suffi | --program-suff \
++ | --program-suf | --program-su | --program-s)
++ ac_prev=program_suffix ;;
++ -program-suffix=* | --program-suffix=* | --program-suffi=* \
++ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
++ program_suffix=$ac_optarg ;;
++
++ -program-transform-name | --program-transform-name \
++ | --program-transform-nam | --program-transform-na \
++ | --program-transform-n | --program-transform- \
++ | --program-transform | --program-transfor \
++ | --program-transfo | --program-transf \
++ | --program-trans | --program-tran \
++ | --progr-tra | --program-tr | --program-t)
++ ac_prev=program_transform_name ;;
++ -program-transform-name=* | --program-transform-name=* \
++ | --program-transform-nam=* | --program-transform-na=* \
++ | --program-transform-n=* | --program-transform-=* \
++ | --program-transform=* | --program-transfor=* \
++ | --program-transfo=* | --program-transf=* \
++ | --program-trans=* | --program-tran=* \
++ | --progr-tra=* | --program-tr=* | --program-t=*)
++ program_transform_name=$ac_optarg ;;
++
++ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
++ ac_prev=pdfdir ;;
++ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
++ pdfdir=$ac_optarg ;;
++
++ -psdir | --psdir | --psdi | --psd | --ps)
++ ac_prev=psdir ;;
++ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
++ psdir=$ac_optarg ;;
++
++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
++ | -silent | --silent | --silen | --sile | --sil)
++ silent=yes ;;
++
++ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
++ ac_prev=sbindir ;;
++ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
++ | --sbi=* | --sb=*)
++ sbindir=$ac_optarg ;;
++
++ -sharedstatedir | --sharedstatedir | --sharedstatedi \
++ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
++ | --sharedst | --shareds | --shared | --share | --shar \
++ | --sha | --sh)
++ ac_prev=sharedstatedir ;;
++ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
++ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
++ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
++ | --sha=* | --sh=*)
++ sharedstatedir=$ac_optarg ;;
++
++ -site | --site | --sit)
++ ac_prev=site ;;
++ -site=* | --site=* | --sit=*)
++ site=$ac_optarg ;;
++
++ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
++ ac_prev=srcdir ;;
++ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
++ srcdir=$ac_optarg ;;
++
++ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
++ | --syscon | --sysco | --sysc | --sys | --sy)
++ ac_prev=sysconfdir ;;
++ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
++ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
++ sysconfdir=$ac_optarg ;;
++
++ -target | --target | --targe | --targ | --tar | --ta | --t)
++ ac_prev=target_alias ;;
++ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
++ target_alias=$ac_optarg ;;
++
++ -v | -verbose | --verbose | --verbos | --verbo | --verb)
++ verbose=yes ;;
++
++ -version | --version | --versio | --versi | --vers | -V)
++ ac_init_version=: ;;
++
++ -with-* | --with-*)
++ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
++ # Reject names that are not valid shell variable names.
++ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
++ as_fn_error "invalid package name: $ac_useropt"
++ ac_useropt_orig=$ac_useropt
++ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
++ case $ac_user_opts in
++ *"
++"with_$ac_useropt"
++"*) ;;
++ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
++ ac_unrecognized_sep=', ';;
++ esac
++ eval with_$ac_useropt=\$ac_optarg ;;
++
++ -without-* | --without-*)
++ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
++ # Reject names that are not valid shell variable names.
++ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
++ as_fn_error "invalid package name: $ac_useropt"
++ ac_useropt_orig=$ac_useropt
++ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
++ case $ac_user_opts in
++ *"
++"with_$ac_useropt"
++"*) ;;
++ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
++ ac_unrecognized_sep=', ';;
++ esac
++ eval with_$ac_useropt=no ;;
++
++ --x)
++ # Obsolete; use --with-x.
++ with_x=yes ;;
++
++ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
++ | --x-incl | --x-inc | --x-in | --x-i)
++ ac_prev=x_includes ;;
++ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
++ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
++ x_includes=$ac_optarg ;;
++
++ -x-libraries | --x-libraries | --x-librarie | --x-librari \
++ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
++ ac_prev=x_libraries ;;
++ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
++ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
++ x_libraries=$ac_optarg ;;
++
++ -*) as_fn_error "unrecognized option: \`$ac_option'
++Try \`$0 --help' for more information."
++ ;;
++
++ *=*)
++ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
++ # Reject names that are not valid shell variable names.
++ case $ac_envvar in #(
++ '' | [0-9]* | *[!_$as_cr_alnum]* )
++ as_fn_error "invalid variable name: \`$ac_envvar'" ;;
++ esac
++ eval $ac_envvar=\$ac_optarg
++ export $ac_envvar ;;
++
++ *)
++ # FIXME: should be removed in autoconf 3.0.
++ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
++ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
++ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
++ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
++ ;;
++
++ esac
++done
++
++if test -n "$ac_prev"; then
++ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
++ as_fn_error "missing argument to $ac_option"
++fi
++
++if test -n "$ac_unrecognized_opts"; then
++ case $enable_option_checking in
++ no) ;;
++ fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
++ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
++ esac
++fi
++
++# Check all directory arguments for consistency.
++for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
++ datadir sysconfdir sharedstatedir localstatedir includedir \
++ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
++ libdir localedir mandir
++do
++ eval ac_val=\$$ac_var
++ # Remove trailing slashes.
++ case $ac_val in
++ */ )
++ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
++ eval $ac_var=\$ac_val;;
++ esac
++ # Be sure to have absolute directory names.
++ case $ac_val in
++ [\\/$]* | ?:[\\/]* ) continue;;
++ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
++ esac
++ as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
++done
++
++# There might be people who depend on the old broken behavior: `$host'
++# used to hold the argument of --host etc.
++# FIXME: To remove some day.
++build=$build_alias
++host=$host_alias
++target=$target_alias
++
++# FIXME: To remove some day.
++if test "x$host_alias" != x; then
++ if test "x$build_alias" = x; then
++ cross_compiling=maybe
++ $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
++ If a cross compiler is detected then cross compile mode will be used." >&2
++ elif test "x$build_alias" != "x$host_alias"; then
++ cross_compiling=yes
++ fi
++fi
++
++ac_tool_prefix=
++test -n "$host_alias" && ac_tool_prefix=$host_alias-
++
++test "$silent" = yes && exec 6>/dev/null
++
++
++ac_pwd=`pwd` && test -n "$ac_pwd" &&
++ac_ls_di=`ls -di .` &&
++ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
++ as_fn_error "working directory cannot be determined"
++test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
++ as_fn_error "pwd does not report name of working directory"
++
++
++# Find the source files, if location was not specified.
++if test -z "$srcdir"; then
++ ac_srcdir_defaulted=yes
++ # Try the directory containing this script, then the parent directory.
++ ac_confdir=`$as_dirname -- "$as_myself" ||
++$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
++ X"$as_myself" : 'X\(//\)[^/]' \| \
++ X"$as_myself" : 'X\(//\)$' \| \
++ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
++$as_echo X"$as_myself" |
++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
++ s//\1/
++ q
++ }
++ /^X\(\/\/\)[^/].*/{
++ s//\1/
++ q
++ }
++ /^X\(\/\/\)$/{
++ s//\1/
++ q
++ }
++ /^X\(\/\).*/{
++ s//\1/
++ q
++ }
++ s/.*/./; q'`
++ srcdir=$ac_confdir
++ if test ! -r "$srcdir/$ac_unique_file"; then
++ srcdir=..
++ fi
++else
++ ac_srcdir_defaulted=no
++fi
++if test ! -r "$srcdir/$ac_unique_file"; then
++ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
++ as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
++fi
++ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
++ac_abs_confdir=`(
++ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg"
++ pwd)`
++# When building in place, set srcdir=.
++if test "$ac_abs_confdir" = "$ac_pwd"; then
++ srcdir=.
++fi
++# Remove unnecessary trailing slashes from srcdir.
++# Double slashes in file names in object file debugging info
++# mess up M-x gdb in Emacs.
++case $srcdir in
++*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
++esac
++for ac_var in $ac_precious_vars; do
++ eval ac_env_${ac_var}_set=\${${ac_var}+set}
++ eval ac_env_${ac_var}_value=\$${ac_var}
++ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
++ eval ac_cv_env_${ac_var}_value=\$${ac_var}
++done
++
++#
++# Report the --help message.
++#
++if test "$ac_init_help" = "long"; then
++ # Omit some internal or obsolete options to make the list less imposing.
++ # This message is too long to be a string in the A/UX 3.1 sh.
++ cat <<_ACEOF
++\`configure' configures libdessert 0.86.14 to adapt to many kinds of systems.
++
++Usage: $0 [OPTION]... [VAR=VALUE]...
++
++To assign environment variables (e.g., CC, CFLAGS...), specify them as
++VAR=VALUE. See below for descriptions of some of the useful variables.
++
++Defaults for the options are specified in brackets.
++
++Configuration:
++ -h, --help display this help and exit
++ --help=short display options specific to this package
++ --help=recursive display the short help of all the included packages
++ -V, --version display version information and exit
++ -q, --quiet, --silent do not print \`checking...' messages
++ --cache-file=FILE cache test results in FILE [disabled]
++ -C, --config-cache alias for \`--cache-file=config.cache'
++ -n, --no-create do not create output files
++ --srcdir=DIR find the sources in DIR [configure dir or \`..']
++
++Installation directories:
++ --prefix=PREFIX install architecture-independent files in PREFIX
++ [$ac_default_prefix]
++ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
++ [PREFIX]
++
++By default, \`make install' will install all the files in
++\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
++an installation prefix other than \`$ac_default_prefix' using \`--prefix',
++for instance \`--prefix=\$HOME'.
++
++For better control, use the options below.
++
++Fine tuning of the installation directories:
++ --bindir=DIR user executables [EPREFIX/bin]
++ --sbindir=DIR system admin executables [EPREFIX/sbin]
++ --libexecdir=DIR program executables [EPREFIX/libexec]
++ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
++ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
++ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
++ --libdir=DIR object code libraries [EPREFIX/lib]
++ --includedir=DIR C header files [PREFIX/include]
++ --oldincludedir=DIR C header files for non-gcc [/usr/include]
++ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
++ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
++ --infodir=DIR info documentation [DATAROOTDIR/info]
++ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
++ --mandir=DIR man documentation [DATAROOTDIR/man]
++ --docdir=DIR documentation root [DATAROOTDIR/doc/libdessert]
++ --htmldir=DIR html documentation [DOCDIR]
++ --dvidir=DIR dvi documentation [DOCDIR]
++ --pdfdir=DIR pdf documentation [DOCDIR]
++ --psdir=DIR ps documentation [DOCDIR]
++_ACEOF
++
++ cat <<\_ACEOF
++
++Program names:
++ --program-prefix=PREFIX prepend PREFIX to installed program names
++ --program-suffix=SUFFIX append SUFFIX to installed program names
++ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
++
++System types:
++ --build=BUILD configure for building on BUILD [guessed]
++ --host=HOST cross-compile to build programs to run on HOST [BUILD]
++_ACEOF
++fi
++
++if test -n "$ac_init_help"; then
++ case $ac_init_help in
++ short | recursive ) echo "Configuration of libdessert 0.86.14:";;
++ esac
++ cat <<\_ACEOF
++
++Optional Features:
++ --disable-option-checking ignore unrecognized --enable/--with options
++ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
++ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
++ --disable-dependency-tracking speeds up one-time build
++ --enable-dependency-tracking do not reject slow dependency extractors
++ --enable-shared[=PKGS] build shared libraries [default=yes]
++ --enable-static[=PKGS] build static libraries [default=yes]
++ --enable-fast-install[=PKGS]
++ optimize for fast installation [default=yes]
++ --disable-libtool-lock avoid locking (might break parallel builds)
++ --disable-doxygen-doc don't generate any doxygen documentation
++ --disable-doxygen-dot don't generate graphics for doxygen documentation
++ --enable-doxygen-man generate doxygen manual pages
++ --enable-doxygen-rtf generate doxygen RTF documentation
++ --enable-doxygen-xml generate doxygen XML documentation
++ --enable-doxygen-chm generate doxygen compressed HTML help documentation
++ --enable-doxygen-chi generate doxygen seperate compressed HTML help index
++ file
++ --disable-doxygen-html don't generate doxygen plain HTML documentation
++ --enable-doxygen-ps generate doxygen PostScript documentation
++ --disable-doxygen-pdf don't generate doxygen PDF documentation
++
++Optional Packages:
++ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
++ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
++ --with-pic try to use only PIC/non-PIC objects [default=use
++ both]
++ --with-gnu-ld assume the C compiler uses GNU ld [default=no]
++
++Some influential environment variables:
++ CC C compiler command
++ CFLAGS C compiler flags
++ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
++ nonstandard directory <lib dir>
++ LIBS libraries to pass to the linker, e.g. -l<library>
++ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
++ you have headers in a nonstandard directory <include dir>
++ CPP C preprocessor
++ DOXYGEN_PAPER_SIZE
++ a4wide (default), a4, letter, legal or executive
++
++Use these variables to override the choices made by `configure' or to help
++it to find libraries and programs with nonstandard names/locations.
++
++Report bugs to <des-sert@spline.inf.fu-berlin.de>.
++_ACEOF
++ac_status=$?
++fi
++
++if test "$ac_init_help" = "recursive"; then
++ # If there are subdirs, report their specific --help.
++ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
++ test -d "$ac_dir" ||
++ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
++ continue
++ ac_builddir=.
++
++case "$ac_dir" in
++.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
++*)
++ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
++ # A ".." for each directory in $ac_dir_suffix.
++ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
++ case $ac_top_builddir_sub in
++ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
++ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
++ esac ;;
++esac
++ac_abs_top_builddir=$ac_pwd
++ac_abs_builddir=$ac_pwd$ac_dir_suffix
++# for backward compatibility:
++ac_top_builddir=$ac_top_build_prefix
++
++case $srcdir in
++ .) # We are building in place.
++ ac_srcdir=.
++ ac_top_srcdir=$ac_top_builddir_sub
++ ac_abs_top_srcdir=$ac_pwd ;;
++ [\\/]* | ?:[\\/]* ) # Absolute name.
++ ac_srcdir=$srcdir$ac_dir_suffix;
++ ac_top_srcdir=$srcdir
++ ac_abs_top_srcdir=$srcdir ;;
++ *) # Relative name.
++ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
++ ac_top_srcdir=$ac_top_build_prefix$srcdir
++ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
++esac
++ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
++
++ cd "$ac_dir" || { ac_status=$?; continue; }
++ # Check for guested configure.
++ if test -f "$ac_srcdir/configure.gnu"; then
++ echo &&
++ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
++ elif test -f "$ac_srcdir/configure"; then
++ echo &&
++ $SHELL "$ac_srcdir/configure" --help=recursive
++ else
++ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
++ fi || ac_status=$?
++ cd "$ac_pwd" || { ac_status=$?; break; }
++ done
++fi
++
++test -n "$ac_init_help" && exit $ac_status
++if $ac_init_version; then
++ cat <<\_ACEOF
++libdessert configure 0.86.14
++generated by GNU Autoconf 2.65
++
++Copyright (C) 2009 Free Software Foundation, Inc.
++This configure script is free software; the Free Software Foundation
++gives unlimited permission to copy, distribute and modify it.
++_ACEOF
++ exit
++fi
++
++## ------------------------ ##
++## Autoconf initialization. ##
++## ------------------------ ##
++
++# ac_fn_c_try_compile LINENO
++# --------------------------
++# Try to compile conftest.$ac_ext, and return whether this succeeded.
++ac_fn_c_try_compile ()
++{
++ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
++ rm -f conftest.$ac_objext
++ if { { ac_try="$ac_compile"
++case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
++$as_echo "$ac_try_echo"; } >&5
++ (eval "$ac_compile") 2>conftest.err
++ ac_status=$?
++ if test -s conftest.err; then
++ grep -v '^ *+' conftest.err >conftest.er1
++ cat conftest.er1 >&5
++ mv -f conftest.er1 conftest.err
++ fi
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++ } && test -s conftest.$ac_objext; then :
++ ac_retval=0
++else
++ $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++ ac_retval=1
++fi
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
++ as_fn_set_status $ac_retval
++
++} # ac_fn_c_try_compile
++
++# ac_fn_c_try_link LINENO
++# -----------------------
++# Try to link conftest.$ac_ext, and return whether this succeeded.
++ac_fn_c_try_link ()
++{
++ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
++ rm -f conftest.$ac_objext conftest$ac_exeext
++ if { { ac_try="$ac_link"
++case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
++$as_echo "$ac_try_echo"; } >&5
++ (eval "$ac_link") 2>conftest.err
++ ac_status=$?
++ if test -s conftest.err; then
++ grep -v '^ *+' conftest.err >conftest.er1
++ cat conftest.er1 >&5
++ mv -f conftest.er1 conftest.err
++ fi
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++ } && test -s conftest$ac_exeext && {
++ test "$cross_compiling" = yes ||
++ $as_test_x conftest$ac_exeext
++ }; then :
++ ac_retval=0
++else
++ $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++ ac_retval=1
++fi
++ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
++ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
++ # interfere with the next link command; also delete a directory that is
++ # left behind by Apple's compiler. We do this before executing the actions.
++ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
++ as_fn_set_status $ac_retval
++
++} # ac_fn_c_try_link
++
++# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
++# -------------------------------------------------------
++# Tests whether HEADER exists and can be compiled using the include files in
++# INCLUDES, setting the cache variable VAR accordingly.
++ac_fn_c_check_header_compile ()
++{
++ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
++$as_echo_n "checking for $2... " >&6; }
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
++ $as_echo_n "(cached) " >&6
++else
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++$4
++#include <$2>
++_ACEOF
++if ac_fn_c_try_compile "$LINENO"; then :
++ eval "$3=yes"
++else
++ eval "$3=no"
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++eval ac_res=\$$3
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
++$as_echo "$ac_res" >&6; }
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
++
++} # ac_fn_c_check_header_compile
++
++# ac_fn_c_try_cpp LINENO
++# ----------------------
++# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
++ac_fn_c_try_cpp ()
++{
++ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
++ if { { ac_try="$ac_cpp conftest.$ac_ext"
++case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
++$as_echo "$ac_try_echo"; } >&5
++ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
++ ac_status=$?
++ if test -s conftest.err; then
++ grep -v '^ *+' conftest.err >conftest.er1
++ cat conftest.er1 >&5
++ mv -f conftest.er1 conftest.err
++ fi
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; } >/dev/null && {
++ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
++ test ! -s conftest.err
++ }; then :
++ ac_retval=0
++else
++ $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++ ac_retval=1
++fi
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
++ as_fn_set_status $ac_retval
++
++} # ac_fn_c_try_cpp
++
++# ac_fn_c_try_run LINENO
++# ----------------------
++# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
++# that executables *can* be run.
++ac_fn_c_try_run ()
++{
++ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
++ if { { ac_try="$ac_link"
++case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
++$as_echo "$ac_try_echo"; } >&5
++ (eval "$ac_link") 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
++ { { case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
++$as_echo "$ac_try_echo"; } >&5
++ (eval "$ac_try") 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; }; }; then :
++ ac_retval=0
++else
++ $as_echo "$as_me: program exited with status $ac_status" >&5
++ $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++ ac_retval=$ac_status
++fi
++ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
++ as_fn_set_status $ac_retval
++
++} # ac_fn_c_try_run
++
++# ac_fn_c_check_func LINENO FUNC VAR
++# ----------------------------------
++# Tests whether FUNC exists, setting the cache variable VAR accordingly
++ac_fn_c_check_func ()
++{
++ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
++$as_echo_n "checking for $2... " >&6; }
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
++ $as_echo_n "(cached) " >&6
++else
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
++ For example, HP-UX 11i <limits.h> declares gettimeofday. */
++#define $2 innocuous_$2
++
++/* System header to define __stub macros and hopefully few prototypes,
++ which can conflict with char $2 (); below.
++ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
++ <limits.h> exists even on freestanding compilers. */
++
++#ifdef __STDC__
++# include <limits.h>
++#else
++# include <assert.h>
++#endif
++
++#undef $2
++
++/* Override any GCC internal prototype to avoid an error.
++ Use char because int might match the return type of a GCC
++ builtin and then its argument prototype would still apply. */
++#ifdef __cplusplus
++extern "C"
++#endif
++char $2 ();
++/* The GNU C library defines this for functions which it implements
++ to always fail with ENOSYS. Some functions are actually named
++ something starting with __ and the normal name is an alias. */
++#if defined __stub_$2 || defined __stub___$2
++choke me
++#endif
++
++int
++main ()
++{
++return $2 ();
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++ eval "$3=yes"
++else
++ eval "$3=no"
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++fi
++eval ac_res=\$$3
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
++$as_echo "$ac_res" >&6; }
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
++
++} # ac_fn_c_check_func
++
++# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
++# -------------------------------------------------------
++# Tests whether HEADER exists, giving a warning if it cannot be compiled using
++# the include files in INCLUDES and setting the cache variable VAR
++# accordingly.
++ac_fn_c_check_header_mongrel ()
++{
++ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
++ if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
++$as_echo_n "checking for $2... " >&6; }
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
++ $as_echo_n "(cached) " >&6
++fi
++eval ac_res=\$$3
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
++$as_echo "$ac_res" >&6; }
++else
++ # Is the header compilable?
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
++$as_echo_n "checking $2 usability... " >&6; }
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++$4
++#include <$2>
++_ACEOF
++if ac_fn_c_try_compile "$LINENO"; then :
++ ac_header_compiler=yes
++else
++ ac_header_compiler=no
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
++$as_echo "$ac_header_compiler" >&6; }
++
++# Is the header present?
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
++$as_echo_n "checking $2 presence... " >&6; }
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++#include <$2>
++_ACEOF
++if ac_fn_c_try_cpp "$LINENO"; then :
++ ac_header_preproc=yes
++else
++ ac_header_preproc=no
++fi
++rm -f conftest.err conftest.$ac_ext
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
++$as_echo "$ac_header_preproc" >&6; }
++
++# So? What about this header?
++case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
++ yes:no: )
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
++$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
++$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
++ ;;
++ no:yes:* )
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
++$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
++$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
++$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
++$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
++$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
++( cat <<\_ASBOX
++## ----------------------------------------------- ##
++## Report this to des-sert@spline.inf.fu-berlin.de ##
++## ----------------------------------------------- ##
++_ASBOX
++ ) | sed "s/^/$as_me: WARNING: /" >&2
++ ;;
++esac
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
++$as_echo_n "checking for $2... " >&6; }
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
++ $as_echo_n "(cached) " >&6
++else
++ eval "$3=\$ac_header_compiler"
++fi
++eval ac_res=\$$3
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
++$as_echo "$ac_res" >&6; }
++fi
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
++
++} # ac_fn_c_check_header_mongrel
++
++# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
++# -------------------------------------------
++# Tests whether TYPE exists after having included INCLUDES, setting cache
++# variable VAR accordingly.
++ac_fn_c_check_type ()
++{
++ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
++$as_echo_n "checking for $2... " >&6; }
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
++ $as_echo_n "(cached) " >&6
++else
++ eval "$3=no"
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++$4
++int
++main ()
++{
++if (sizeof ($2))
++ return 0;
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_compile "$LINENO"; then :
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++$4
++int
++main ()
++{
++if (sizeof (($2)))
++ return 0;
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_compile "$LINENO"; then :
++
++else
++ eval "$3=yes"
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++eval ac_res=\$$3
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
++$as_echo "$ac_res" >&6; }
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
++
++} # ac_fn_c_check_type
++
++# ac_fn_c_find_intX_t LINENO BITS VAR
++# -----------------------------------
++# Finds a signed integer type with width BITS, setting cache variable VAR
++# accordingly.
++ac_fn_c_find_intX_t ()
++{
++ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5
++$as_echo_n "checking for int$2_t... " >&6; }
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
++ $as_echo_n "(cached) " >&6
++else
++ eval "$3=no"
++ # Order is important - never check a type that is potentially smaller
++ # than half of the expected target width.
++ for ac_type in int$2_t 'int' 'long int' \
++ 'long long int' 'short int' 'signed char'; do
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++$ac_includes_default
++int
++main ()
++{
++static int test_array [1 - 2 * !(enum { N = $2 / 2 - 1 };
++ 0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))];
++test_array [0] = 0
++
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_compile "$LINENO"; then :
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++$ac_includes_default
++int
++main ()
++{
++static int test_array [1 - 2 * !(enum { N = $2 / 2 - 1 };
++ ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1)
++ < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))];
++test_array [0] = 0
++
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_compile "$LINENO"; then :
++
++else
++ case $ac_type in #(
++ int$2_t) :
++ eval "$3=yes" ;; #(
++ *) :
++ eval "$3=\$ac_type" ;;
++esac
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++ eval as_val=\$$3
++ if test "x$as_val" = x""no; then :
++
++else
++ break
++fi
++ done
++fi
++eval ac_res=\$$3
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
++$as_echo "$ac_res" >&6; }
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
++
++} # ac_fn_c_find_intX_t
++
++# ac_fn_c_find_uintX_t LINENO BITS VAR
++# ------------------------------------
++# Finds an unsigned integer type with width BITS, setting cache variable VAR
++# accordingly.
++ac_fn_c_find_uintX_t ()
++{
++ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5
++$as_echo_n "checking for uint$2_t... " >&6; }
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
++ $as_echo_n "(cached) " >&6
++else
++ eval "$3=no"
++ # Order is important - never check a type that is potentially smaller
++ # than half of the expected target width.
++ for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \
++ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++$ac_includes_default
++int
++main ()
++{
++static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)];
++test_array [0] = 0
++
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_compile "$LINENO"; then :
++ case $ac_type in #(
++ uint$2_t) :
++ eval "$3=yes" ;; #(
++ *) :
++ eval "$3=\$ac_type" ;;
++esac
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++ eval as_val=\$$3
++ if test "x$as_val" = x""no; then :
++
++else
++ break
++fi
++ done
++fi
++eval ac_res=\$$3
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
++$as_echo "$ac_res" >&6; }
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
++
++} # ac_fn_c_find_uintX_t
++cat >config.log <<_ACEOF
++This file contains any messages produced by compilers while
++running configure, to aid debugging if configure makes a mistake.
++
++It was created by libdessert $as_me 0.86.14, which was
++generated by GNU Autoconf 2.65. Invocation command line was
++
++ $ $0 $@
++
++_ACEOF
++exec 5>>config.log
++{
++cat <<_ASUNAME
++## --------- ##
++## Platform. ##
++## --------- ##
++
++hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
++uname -m = `(uname -m) 2>/dev/null || echo unknown`
++uname -r = `(uname -r) 2>/dev/null || echo unknown`
++uname -s = `(uname -s) 2>/dev/null || echo unknown`
++uname -v = `(uname -v) 2>/dev/null || echo unknown`
++
++/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
++/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
++
++/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
++/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
++/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
++/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
++/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
++/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
++/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
++
++_ASUNAME
++
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ $as_echo "PATH: $as_dir"
++ done
++IFS=$as_save_IFS
++
++} >&5
++
++cat >&5 <<_ACEOF
++
++
++## ----------- ##
++## Core tests. ##
++## ----------- ##
++
++_ACEOF
++
++
++# Keep a trace of the command line.
++# Strip out --no-create and --no-recursion so they do not pile up.
++# Strip out --silent because we don't want to record it for future runs.
++# Also quote any args containing shell meta-characters.
++# Make two passes to allow for proper duplicate-argument suppression.
++ac_configure_args=
++ac_configure_args0=
++ac_configure_args1=
++ac_must_keep_next=false
++for ac_pass in 1 2
++do
++ for ac_arg
++ do
++ case $ac_arg in
++ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
++ | -silent | --silent | --silen | --sile | --sil)
++ continue ;;
++ *\'*)
++ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
++ esac
++ case $ac_pass in
++ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
++ 2)
++ as_fn_append ac_configure_args1 " '$ac_arg'"
++ if test $ac_must_keep_next = true; then
++ ac_must_keep_next=false # Got value, back to normal.
++ else
++ case $ac_arg in
++ *=* | --config-cache | -C | -disable-* | --disable-* \
++ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
++ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
++ | -with-* | --with-* | -without-* | --without-* | --x)
++ case "$ac_configure_args0 " in
++ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
++ esac
++ ;;
++ -* ) ac_must_keep_next=true ;;
++ esac
++ fi
++ as_fn_append ac_configure_args " '$ac_arg'"
++ ;;
++ esac
++ done
++done
++{ ac_configure_args0=; unset ac_configure_args0;}
++{ ac_configure_args1=; unset ac_configure_args1;}
++
++# When interrupted or exit'd, cleanup temporary files, and complete
++# config.log. We remove comments because anyway the quotes in there
++# would cause problems or look ugly.
++# WARNING: Use '\'' to represent an apostrophe within the trap.
++# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
++trap 'exit_status=$?
++ # Save into config.log some information that might help in debugging.
++ {
++ echo
++
++ cat <<\_ASBOX
++## ---------------- ##
++## Cache variables. ##
++## ---------------- ##
++_ASBOX
++ echo
++ # The following way of writing the cache mishandles newlines in values,
++(
++ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
++ eval ac_val=\$$ac_var
++ case $ac_val in #(
++ *${as_nl}*)
++ case $ac_var in #(
++ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
++$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
++ esac
++ case $ac_var in #(
++ _ | IFS | as_nl) ;; #(
++ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
++ *) { eval $ac_var=; unset $ac_var;} ;;
++ esac ;;
++ esac
++ done
++ (set) 2>&1 |
++ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
++ *${as_nl}ac_space=\ *)
++ sed -n \
++ "s/'\''/'\''\\\\'\'''\''/g;
++ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
++ ;; #(
++ *)
++ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
++ ;;
++ esac |
++ sort
++)
++ echo
++
++ cat <<\_ASBOX
++## ----------------- ##
++## Output variables. ##
++## ----------------- ##
++_ASBOX
++ echo
++ for ac_var in $ac_subst_vars
++ do
++ eval ac_val=\$$ac_var
++ case $ac_val in
++ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
++ esac
++ $as_echo "$ac_var='\''$ac_val'\''"
++ done | sort
++ echo
++
++ if test -n "$ac_subst_files"; then
++ cat <<\_ASBOX
++## ------------------- ##
++## File substitutions. ##
++## ------------------- ##
++_ASBOX
++ echo
++ for ac_var in $ac_subst_files
++ do
++ eval ac_val=\$$ac_var
++ case $ac_val in
++ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
++ esac
++ $as_echo "$ac_var='\''$ac_val'\''"
++ done | sort
++ echo
++ fi
++
++ if test -s confdefs.h; then
++ cat <<\_ASBOX
++## ----------- ##
++## confdefs.h. ##
++## ----------- ##
++_ASBOX
++ echo
++ cat confdefs.h
++ echo
++ fi
++ test "$ac_signal" != 0 &&
++ $as_echo "$as_me: caught signal $ac_signal"
++ $as_echo "$as_me: exit $exit_status"
++ } >&5
++ rm -f core *.core core.conftest.* &&
++ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
++ exit $exit_status
++' 0
++for ac_signal in 1 2 13 15; do
++ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
++done
++ac_signal=0
++
++# confdefs.h avoids OS command line length limits that DEFS can exceed.
++rm -f -r conftest* confdefs.h
++
++$as_echo "/* confdefs.h */" > confdefs.h
++
++# Predefined preprocessor variables.
++
++cat >>confdefs.h <<_ACEOF
++#define PACKAGE_NAME "$PACKAGE_NAME"
++_ACEOF
++
++cat >>confdefs.h <<_ACEOF
++#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
++_ACEOF
++
++cat >>confdefs.h <<_ACEOF
++#define PACKAGE_VERSION "$PACKAGE_VERSION"
++_ACEOF
++
++cat >>confdefs.h <<_ACEOF
++#define PACKAGE_STRING "$PACKAGE_STRING"
++_ACEOF
++
++cat >>confdefs.h <<_ACEOF
++#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
++_ACEOF
++
++cat >>confdefs.h <<_ACEOF
++#define PACKAGE_URL "$PACKAGE_URL"
++_ACEOF
++
++
++# Let the site file select an alternate cache file if it wants to.
++# Prefer an explicitly selected file to automatically selected ones.
++ac_site_file1=NONE
++ac_site_file2=NONE
++if test -n "$CONFIG_SITE"; then
++ ac_site_file1=$CONFIG_SITE
++elif test "x$prefix" != xNONE; then
++ ac_site_file1=$prefix/share/config.site
++ ac_site_file2=$prefix/etc/config.site
++else
++ ac_site_file1=$ac_default_prefix/share/config.site
++ ac_site_file2=$ac_default_prefix/etc/config.site
++fi
++for ac_site_file in "$ac_site_file1" "$ac_site_file2"
++do
++ test "x$ac_site_file" = xNONE && continue
++ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
++$as_echo "$as_me: loading site script $ac_site_file" >&6;}
++ sed 's/^/| /' "$ac_site_file" >&5
++ . "$ac_site_file"
++ fi
++done
++
++if test -r "$cache_file"; then
++ # Some versions of bash will fail to source /dev/null (special files
++ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
++ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
++$as_echo "$as_me: loading cache $cache_file" >&6;}
++ case $cache_file in
++ [\\/]* | ?:[\\/]* ) . "$cache_file";;
++ *) . "./$cache_file";;
++ esac
++ fi
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
++$as_echo "$as_me: creating cache $cache_file" >&6;}
++ >$cache_file
++fi
++
++# Check that the precious variables saved in the cache have kept the same
++# value.
++ac_cache_corrupted=false
++for ac_var in $ac_precious_vars; do
++ eval ac_old_set=\$ac_cv_env_${ac_var}_set
++ eval ac_new_set=\$ac_env_${ac_var}_set
++ eval ac_old_val=\$ac_cv_env_${ac_var}_value
++ eval ac_new_val=\$ac_env_${ac_var}_value
++ case $ac_old_set,$ac_new_set in
++ set,)
++ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
++$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
++ ac_cache_corrupted=: ;;
++ ,set)
++ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
++$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
++ ac_cache_corrupted=: ;;
++ ,);;
++ *)
++ if test "x$ac_old_val" != "x$ac_new_val"; then
++ # differences in whitespace do not lead to failure.
++ ac_old_val_w=`echo x $ac_old_val`
++ ac_new_val_w=`echo x $ac_new_val`
++ if test "$ac_old_val_w" != "$ac_new_val_w"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
++$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
++ ac_cache_corrupted=:
++ else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
++$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
++ eval $ac_var=\$ac_old_val
++ fi
++ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
++$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
++ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
++$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
++ fi;;
++ esac
++ # Pass precious variables to config.status.
++ if test "$ac_new_set" = set; then
++ case $ac_new_val in
++ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
++ *) ac_arg=$ac_var=$ac_new_val ;;
++ esac
++ case " $ac_configure_args " in
++ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
++ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
++ esac
++ fi
++done
++if $ac_cache_corrupted; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
++$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
++ as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
++fi
++## -------------------- ##
++## Main body of script. ##
++## -------------------- ##
++
++ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++
++
++am__api_version='1.11'
++
++ac_aux_dir=
++for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
++ for ac_t in install-sh install.sh shtool; do
++ if test -f "$ac_dir/$ac_t"; then
++ ac_aux_dir=$ac_dir
++ ac_install_sh="$ac_aux_dir/$ac_t -c"
++ break 2
++ fi
++ done
++done
++if test -z "$ac_aux_dir"; then
++ as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
++fi
++
++# These three variables are undocumented and unsupported,
++# and are intended to be withdrawn in a future Autoconf release.
++# They can cause serious problems if a builder's source tree is in a directory
++# whose full name contains unusual characters.
++ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
++ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
++ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
++
++
++# Find a good install program. We prefer a C program (faster),
++# so one script is as good as another. But avoid the broken or
++# incompatible versions:
++# SysV /etc/install, /usr/sbin/install
++# SunOS /usr/etc/install
++# IRIX /sbin/install
++# AIX /bin/install
++# AmigaOS /C/install, which installs bootblocks on floppy discs
++# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
++# AFS /usr/afsws/bin/install, which mishandles nonexistent args
++# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
++# OS/2's system install, which has a completely different semantic
++# ./install, which can be erroneously created by make from ./install.sh.
++# Reject install programs that cannot install multiple files.
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
++$as_echo_n "checking for a BSD-compatible install... " >&6; }
++if test -z "$INSTALL"; then
++if test "${ac_cv_path_install+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ # Account for people who put trailing slashes in PATH elements.
++case $as_dir/ in #((
++ ./ | .// | /[cC]/* | \
++ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
++ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
++ /usr/ucb/* ) ;;
++ *)
++ # OSF1 and SCO ODT 3.0 have their own names for install.
++ # Don't use installbsd from OSF since it installs stuff as root
++ # by default.
++ for ac_prog in ginstall scoinst install; do
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
++ if test $ac_prog = install &&
++ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
++ # AIX install. It has an incompatible calling convention.
++ :
++ elif test $ac_prog = install &&
++ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
++ # program-specific install script used by HP pwplus--don't use.
++ :
++ else
++ rm -rf conftest.one conftest.two conftest.dir
++ echo one > conftest.one
++ echo two > conftest.two
++ mkdir conftest.dir
++ if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
++ test -s conftest.one && test -s conftest.two &&
++ test -s conftest.dir/conftest.one &&
++ test -s conftest.dir/conftest.two
++ then
++ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
++ break 3
++ fi
++ fi
++ fi
++ done
++ done
++ ;;
++esac
++
++ done
++IFS=$as_save_IFS
++
++rm -rf conftest.one conftest.two conftest.dir
++
++fi
++ if test "${ac_cv_path_install+set}" = set; then
++ INSTALL=$ac_cv_path_install
++ else
++ # As a last resort, use the slow shell script. Don't cache a
++ # value for INSTALL within a source directory, because that will
++ # break other packages using the cache if that directory is
++ # removed, or if the value is a relative name.
++ INSTALL=$ac_install_sh
++ fi
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
++$as_echo "$INSTALL" >&6; }
++
++# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
++# It thinks the first close brace ends the variable substitution.
++test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
++
++test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
++
++test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
++$as_echo_n "checking whether build environment is sane... " >&6; }
++# Just in case
++sleep 1
++echo timestamp > conftest.file
++# Reject unsafe characters in $srcdir or the absolute working directory
++# name. Accept space and tab only in the latter.
++am_lf='
++'
++case `pwd` in
++ *[\\\"\#\$\&\'\`$am_lf]*)
++ as_fn_error "unsafe absolute working directory name" "$LINENO" 5;;
++esac
++case $srcdir in
++ *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
++ as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
++esac
++
++# Do `set' in a subshell so we don't clobber the current shell's
++# arguments. Must try -L first in case configure is actually a
++# symlink; some systems play weird games with the mod time of symlinks
++# (eg FreeBSD returns the mod time of the symlink's containing
++# directory).
++if (
++ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
++ if test "$*" = "X"; then
++ # -L didn't work.
++ set X `ls -t "$srcdir/configure" conftest.file`
++ fi
++ rm -f conftest.file
++ if test "$*" != "X $srcdir/configure conftest.file" \
++ && test "$*" != "X conftest.file $srcdir/configure"; then
++
++ # If neither matched, then we have a broken ls. This can happen
++ # if, for instance, CONFIG_SHELL is bash and it inherits a
++ # broken ls alias from the environment. This has actually
++ # happened. Such a system could not be considered "sane".
++ as_fn_error "ls -t appears to fail. Make sure there is not a broken
++alias in your environment" "$LINENO" 5
++ fi
++
++ test "$2" = conftest.file
++ )
++then
++ # Ok.
++ :
++else
++ as_fn_error "newly created file is older than distributed files!
++Check your system clock" "$LINENO" 5
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
++$as_echo "yes" >&6; }
++test "$program_prefix" != NONE &&
++ program_transform_name="s&^&$program_prefix&;$program_transform_name"
++# Use a double $ so make ignores it.
++test "$program_suffix" != NONE &&
++ program_transform_name="s&\$&$program_suffix&;$program_transform_name"
++# Double any \ or $.
++# By default was `s,x,x', remove it if useless.
++ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
++program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
++
++# expand $ac_aux_dir to an absolute path
++am_aux_dir=`cd $ac_aux_dir && pwd`
++
++if test x"${MISSING+set}" != xset; then
++ case $am_aux_dir in
++ *\ * | *\ *)
++ MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
++ *)
++ MISSING="\${SHELL} $am_aux_dir/missing" ;;
++ esac
++fi
++# Use eval to expand $SHELL
++if eval "$MISSING --run true"; then
++ am_missing_run="$MISSING --run "
++else
++ am_missing_run=
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
++$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
++fi
++
++if test x"${install_sh}" != xset; then
++ case $am_aux_dir in
++ *\ * | *\ *)
++ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
++ *)
++ install_sh="\${SHELL} $am_aux_dir/install-sh"
++ esac
++fi
++
++# Installed binaries are usually stripped using `strip' when the user
++# run `make install-strip'. However `strip' might not be the right
++# tool to use in cross-compilation environments, therefore Automake
++# will honor the `STRIP' environment variable to overrule this program.
++if test "$cross_compiling" != no; then
++ if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
++set dummy ${ac_tool_prefix}strip; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_STRIP+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$STRIP"; then
++ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++STRIP=$ac_cv_prog_STRIP
++if test -n "$STRIP"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
++$as_echo "$STRIP" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_prog_STRIP"; then
++ ac_ct_STRIP=$STRIP
++ # Extract the first word of "strip", so it can be a program name with args.
++set dummy strip; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$ac_ct_STRIP"; then
++ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_ac_ct_STRIP="strip"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
++if test -n "$ac_ct_STRIP"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
++$as_echo "$ac_ct_STRIP" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_ct_STRIP" = x; then
++ STRIP=":"
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ STRIP=$ac_ct_STRIP
++ fi
++else
++ STRIP="$ac_cv_prog_STRIP"
++fi
++
++fi
++INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
++$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
++if test -z "$MKDIR_P"; then
++ if test "${ac_cv_path_mkdir+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_prog in mkdir gmkdir; do
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
++ case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
++ 'mkdir (GNU coreutils) '* | \
++ 'mkdir (coreutils) '* | \
++ 'mkdir (fileutils) '4.1*)
++ ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
++ break 3;;
++ esac
++ done
++ done
++ done
++IFS=$as_save_IFS
++
++fi
++
++ test -d ./--version && rmdir ./--version
++ if test "${ac_cv_path_mkdir+set}" = set; then
++ MKDIR_P="$ac_cv_path_mkdir -p"
++ else
++ # As a last resort, use the slow shell script. Don't cache a
++ # value for MKDIR_P within a source directory, because that will
++ # break other packages using the cache if that directory is
++ # removed, or if the value is a relative name.
++ MKDIR_P="$ac_install_sh -d"
++ fi
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
++$as_echo "$MKDIR_P" >&6; }
++
++mkdir_p="$MKDIR_P"
++case $mkdir_p in
++ [\\/$]* | ?:[\\/]*) ;;
++ */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
++esac
++
++for ac_prog in gawk mawk nawk awk
++do
++ # Extract the first word of "$ac_prog", so it can be a program name with args.
++set dummy $ac_prog; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_AWK+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$AWK"; then
++ ac_cv_prog_AWK="$AWK" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_AWK="$ac_prog"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++AWK=$ac_cv_prog_AWK
++if test -n "$AWK"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
++$as_echo "$AWK" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++ test -n "$AWK" && break
++done
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
++$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
++set x ${MAKE-make}
++ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
++if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then :
++ $as_echo_n "(cached) " >&6
++else
++ cat >conftest.make <<\_ACEOF
++SHELL = /bin/sh
++all:
++ @echo '@@@%%%=$(MAKE)=@@@%%%'
++_ACEOF
++# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
++case `${MAKE-make} -f conftest.make 2>/dev/null` in
++ *@@@%%%=?*=@@@%%%*)
++ eval ac_cv_prog_make_${ac_make}_set=yes;;
++ *)
++ eval ac_cv_prog_make_${ac_make}_set=no;;
++esac
++rm -f conftest.make
++fi
++if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
++$as_echo "yes" >&6; }
++ SET_MAKE=
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++ SET_MAKE="MAKE=${MAKE-make}"
++fi
++
++rm -rf .tst 2>/dev/null
++mkdir .tst 2>/dev/null
++if test -d .tst; then
++ am__leading_dot=.
++else
++ am__leading_dot=_
++fi
++rmdir .tst 2>/dev/null
++
++if test "`cd $srcdir && pwd`" != "`pwd`"; then
++ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
++ # is not polluted with repeated "-I."
++ am__isrc=' -I$(srcdir)'
++ # test to see if srcdir already configured
++ if test -f $srcdir/config.status; then
++ as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
++ fi
++fi
++
++# test whether we have cygpath
++if test -z "$CYGPATH_W"; then
++ if (cygpath --version) >/dev/null 2>/dev/null; then
++ CYGPATH_W='cygpath -w'
++ else
++ CYGPATH_W=echo
++ fi
++fi
++
++
++# Define the identity of the package.
++ PACKAGE='libdessert'
++ VERSION='0.86.14'
++
++
++cat >>confdefs.h <<_ACEOF
++#define PACKAGE "$PACKAGE"
++_ACEOF
++
++
++cat >>confdefs.h <<_ACEOF
++#define VERSION "$VERSION"
++_ACEOF
++
++# Some tools Automake needs.
++
++ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
++
++
++AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
++
++
++AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
++
++
++AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
++
++
++MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
++
++# We need awk for the "check" target. The system "awk" is bad on
++# some platforms.
++# Always define AMTAR for backward compatibility.
++
++AMTAR=${AMTAR-"${am_missing_run}tar"}
++
++am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
++
++
++
++
++
++
++
++
++ac_config_headers="$ac_config_headers config.h"
++
++
++LIBDESSERT_LIBRARY_VERSION=0:86:14
++
++
++# Checks for programs.
++ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
++set dummy ${ac_tool_prefix}gcc; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_CC+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$CC"; then
++ ac_cv_prog_CC="$CC" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_CC="${ac_tool_prefix}gcc"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++CC=$ac_cv_prog_CC
++if test -n "$CC"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
++$as_echo "$CC" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_prog_CC"; then
++ ac_ct_CC=$CC
++ # Extract the first word of "gcc", so it can be a program name with args.
++set dummy gcc; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$ac_ct_CC"; then
++ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_ac_ct_CC="gcc"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++ac_ct_CC=$ac_cv_prog_ac_ct_CC
++if test -n "$ac_ct_CC"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
++$as_echo "$ac_ct_CC" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_ct_CC" = x; then
++ CC=""
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ CC=$ac_ct_CC
++ fi
++else
++ CC="$ac_cv_prog_CC"
++fi
++
++if test -z "$CC"; then
++ if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
++set dummy ${ac_tool_prefix}cc; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_CC+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$CC"; then
++ ac_cv_prog_CC="$CC" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_CC="${ac_tool_prefix}cc"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++CC=$ac_cv_prog_CC
++if test -n "$CC"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
++$as_echo "$CC" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++ fi
++fi
++if test -z "$CC"; then
++ # Extract the first word of "cc", so it can be a program name with args.
++set dummy cc; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_CC+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$CC"; then
++ ac_cv_prog_CC="$CC" # Let the user override the test.
++else
++ ac_prog_rejected=no
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
++ ac_prog_rejected=yes
++ continue
++ fi
++ ac_cv_prog_CC="cc"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++if test $ac_prog_rejected = yes; then
++ # We found a bogon in the path, so make sure we never use it.
++ set dummy $ac_cv_prog_CC
++ shift
++ if test $# != 0; then
++ # We chose a different compiler from the bogus one.
++ # However, it has the same basename, so the bogon will be chosen
++ # first if we set CC to just the basename; use the full file name.
++ shift
++ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
++ fi
++fi
++fi
++fi
++CC=$ac_cv_prog_CC
++if test -n "$CC"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
++$as_echo "$CC" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$CC"; then
++ if test -n "$ac_tool_prefix"; then
++ for ac_prog in cl.exe
++ do
++ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
++set dummy $ac_tool_prefix$ac_prog; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_CC+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$CC"; then
++ ac_cv_prog_CC="$CC" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++CC=$ac_cv_prog_CC
++if test -n "$CC"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
++$as_echo "$CC" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++ test -n "$CC" && break
++ done
++fi
++if test -z "$CC"; then
++ ac_ct_CC=$CC
++ for ac_prog in cl.exe
++do
++ # Extract the first word of "$ac_prog", so it can be a program name with args.
++set dummy $ac_prog; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$ac_ct_CC"; then
++ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_ac_ct_CC="$ac_prog"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++ac_ct_CC=$ac_cv_prog_ac_ct_CC
++if test -n "$ac_ct_CC"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
++$as_echo "$ac_ct_CC" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++ test -n "$ac_ct_CC" && break
++done
++
++ if test "x$ac_ct_CC" = x; then
++ CC=""
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ CC=$ac_ct_CC
++ fi
++fi
++
++fi
++
++
++test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++as_fn_error "no acceptable C compiler found in \$PATH
++See \`config.log' for more details." "$LINENO" 5; }
++
++# Provide some information about the compiler.
++$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
++set X $ac_compile
++ac_compiler=$2
++for ac_option in --version -v -V -qversion; do
++ { { ac_try="$ac_compiler $ac_option >&5"
++case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
++$as_echo "$ac_try_echo"; } >&5
++ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
++ ac_status=$?
++ if test -s conftest.err; then
++ sed '10a\
++... rest of stderr output deleted ...
++ 10q' conftest.err >conftest.er1
++ cat conftest.er1 >&5
++ fi
++ rm -f conftest.er1 conftest.err
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; }
++done
++
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++int
++main ()
++{
++
++ ;
++ return 0;
++}
++_ACEOF
++ac_clean_files_save=$ac_clean_files
++ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
++# Try to create an executable without -o first, disregard a.out.
++# It will help us diagnose broken compilers, and finding out an intuition
++# of exeext.
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
++$as_echo_n "checking whether the C compiler works... " >&6; }
++ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
++
++# The possible output files:
++ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
++
++ac_rmfiles=
++for ac_file in $ac_files
++do
++ case $ac_file in
++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
++ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
++ esac
++done
++rm -f $ac_rmfiles
++
++if { { ac_try="$ac_link_default"
++case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
++$as_echo "$ac_try_echo"; } >&5
++ (eval "$ac_link_default") 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; }; then :
++ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
++# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
++# in a Makefile. We should not override ac_cv_exeext if it was cached,
++# so that the user can short-circuit this test for compilers unknown to
++# Autoconf.
++for ac_file in $ac_files ''
++do
++ test -f "$ac_file" || continue
++ case $ac_file in
++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
++ ;;
++ [ab].out )
++ # We found the default executable, but exeext='' is most
++ # certainly right.
++ break;;
++ *.* )
++ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
++ then :; else
++ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
++ fi
++ # We set ac_cv_exeext here because the later test for it is not
++ # safe: cross compilers may not add the suffix if given an `-o'
++ # argument, so we may need to know it at that point already.
++ # Even if this section looks crufty: it has the advantage of
++ # actually working.
++ break;;
++ * )
++ break;;
++ esac
++done
++test "$ac_cv_exeext" = no && ac_cv_exeext=
++
++else
++ ac_file=''
++fi
++if test -z "$ac_file"; then :
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++$as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++{ as_fn_set_status 77
++as_fn_error "C compiler cannot create executables
++See \`config.log' for more details." "$LINENO" 5; }; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
++$as_echo "yes" >&6; }
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
++$as_echo_n "checking for C compiler default output file name... " >&6; }
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
++$as_echo "$ac_file" >&6; }
++ac_exeext=$ac_cv_exeext
++
++rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
++ac_clean_files=$ac_clean_files_save
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
++$as_echo_n "checking for suffix of executables... " >&6; }
++if { { ac_try="$ac_link"
++case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
++$as_echo "$ac_try_echo"; } >&5
++ (eval "$ac_link") 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; }; then :
++ # If both `conftest.exe' and `conftest' are `present' (well, observable)
++# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
++# work properly (i.e., refer to `conftest.exe'), while it won't with
++# `rm'.
++for ac_file in conftest.exe conftest conftest.*; do
++ test -f "$ac_file" || continue
++ case $ac_file in
++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
++ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
++ break;;
++ * ) break;;
++ esac
++done
++else
++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++as_fn_error "cannot compute suffix of executables: cannot compile and link
++See \`config.log' for more details." "$LINENO" 5; }
++fi
++rm -f conftest conftest$ac_cv_exeext
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
++$as_echo "$ac_cv_exeext" >&6; }
++
++rm -f conftest.$ac_ext
++EXEEXT=$ac_cv_exeext
++ac_exeext=$EXEEXT
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++#include <stdio.h>
++int
++main ()
++{
++FILE *f = fopen ("conftest.out", "w");
++ return ferror (f) || fclose (f) != 0;
++
++ ;
++ return 0;
++}
++_ACEOF
++ac_clean_files="$ac_clean_files conftest.out"
++# Check that the compiler produces executables we can run. If not, either
++# the compiler is broken, or we cross compile.
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
++$as_echo_n "checking whether we are cross compiling... " >&6; }
++if test "$cross_compiling" != yes; then
++ { { ac_try="$ac_link"
++case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
++$as_echo "$ac_try_echo"; } >&5
++ (eval "$ac_link") 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; }
++ if { ac_try='./conftest$ac_cv_exeext'
++ { { case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
++$as_echo "$ac_try_echo"; } >&5
++ (eval "$ac_try") 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; }; }; then
++ cross_compiling=no
++ else
++ if test "$cross_compiling" = maybe; then
++ cross_compiling=yes
++ else
++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++as_fn_error "cannot run C compiled programs.
++If you meant to cross compile, use \`--host'.
++See \`config.log' for more details." "$LINENO" 5; }
++ fi
++ fi
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
++$as_echo "$cross_compiling" >&6; }
++
++rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
++ac_clean_files=$ac_clean_files_save
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
++$as_echo_n "checking for suffix of object files... " >&6; }
++if test "${ac_cv_objext+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++int
++main ()
++{
++
++ ;
++ return 0;
++}
++_ACEOF
++rm -f conftest.o conftest.obj
++if { { ac_try="$ac_compile"
++case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
++$as_echo "$ac_try_echo"; } >&5
++ (eval "$ac_compile") 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; }; then :
++ for ac_file in conftest.o conftest.obj conftest.*; do
++ test -f "$ac_file" || continue;
++ case $ac_file in
++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
++ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
++ break;;
++ esac
++done
++else
++ $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++as_fn_error "cannot compute suffix of object files: cannot compile
++See \`config.log' for more details." "$LINENO" 5; }
++fi
++rm -f conftest.$ac_cv_objext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
++$as_echo "$ac_cv_objext" >&6; }
++OBJEXT=$ac_cv_objext
++ac_objext=$OBJEXT
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
++$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
++if test "${ac_cv_c_compiler_gnu+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++int
++main ()
++{
++#ifndef __GNUC__
++ choke me
++#endif
++
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_compile "$LINENO"; then :
++ ac_compiler_gnu=yes
++else
++ ac_compiler_gnu=no
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++ac_cv_c_compiler_gnu=$ac_compiler_gnu
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
++$as_echo "$ac_cv_c_compiler_gnu" >&6; }
++if test $ac_compiler_gnu = yes; then
++ GCC=yes
++else
++ GCC=
++fi
++ac_test_CFLAGS=${CFLAGS+set}
++ac_save_CFLAGS=$CFLAGS
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
++$as_echo_n "checking whether $CC accepts -g... " >&6; }
++if test "${ac_cv_prog_cc_g+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ ac_save_c_werror_flag=$ac_c_werror_flag
++ ac_c_werror_flag=yes
++ ac_cv_prog_cc_g=no
++ CFLAGS="-g"
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++int
++main ()
++{
++
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_compile "$LINENO"; then :
++ ac_cv_prog_cc_g=yes
++else
++ CFLAGS=""
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++int
++main ()
++{
++
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_compile "$LINENO"; then :
++
++else
++ ac_c_werror_flag=$ac_save_c_werror_flag
++ CFLAGS="-g"
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++int
++main ()
++{
++
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_compile "$LINENO"; then :
++ ac_cv_prog_cc_g=yes
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++ ac_c_werror_flag=$ac_save_c_werror_flag
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
++$as_echo "$ac_cv_prog_cc_g" >&6; }
++if test "$ac_test_CFLAGS" = set; then
++ CFLAGS=$ac_save_CFLAGS
++elif test $ac_cv_prog_cc_g = yes; then
++ if test "$GCC" = yes; then
++ CFLAGS="-g -O2"
++ else
++ CFLAGS="-g"
++ fi
++else
++ if test "$GCC" = yes; then
++ CFLAGS="-O2"
++ else
++ CFLAGS=
++ fi
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
++$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
++if test "${ac_cv_prog_cc_c89+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ ac_cv_prog_cc_c89=no
++ac_save_CC=$CC
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++#include <stdarg.h>
++#include <stdio.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
++struct buf { int x; };
++FILE * (*rcsopen) (struct buf *, struct stat *, int);
++static char *e (p, i)
++ char **p;
++ int i;
++{
++ return p[i];
++}
++static char *f (char * (*g) (char **, int), char **p, ...)
++{
++ char *s;
++ va_list v;
++ va_start (v,p);
++ s = g (p, va_arg (v,int));
++ va_end (v);
++ return s;
++}
++
++/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
++ function prototypes and stuff, but not '\xHH' hex character constants.
++ These don't provoke an error unfortunately, instead are silently treated
++ as 'x'. The following induces an error, until -std is added to get
++ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
++ array size at least. It's necessary to write '\x00'==0 to get something
++ that's true only with -std. */
++int osf4_cc_array ['\x00' == 0 ? 1 : -1];
++
++/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
++ inside strings and character constants. */
++#define FOO(x) 'x'
++int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
++
++int test (int i, double x);
++struct s1 {int (*f) (int a);};
++struct s2 {int (*f) (double a);};
++int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
++int argc;
++char **argv;
++int
++main ()
++{
++return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
++ ;
++ return 0;
++}
++_ACEOF
++for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
++ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
++do
++ CC="$ac_save_CC $ac_arg"
++ if ac_fn_c_try_compile "$LINENO"; then :
++ ac_cv_prog_cc_c89=$ac_arg
++fi
++rm -f core conftest.err conftest.$ac_objext
++ test "x$ac_cv_prog_cc_c89" != "xno" && break
++done
++rm -f conftest.$ac_ext
++CC=$ac_save_CC
++
++fi
++# AC_CACHE_VAL
++case "x$ac_cv_prog_cc_c89" in
++ x)
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
++$as_echo "none needed" >&6; } ;;
++ xno)
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
++$as_echo "unsupported" >&6; } ;;
++ *)
++ CC="$CC $ac_cv_prog_cc_c89"
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
++$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
++esac
++if test "x$ac_cv_prog_cc_c89" != xno; then :
++
++fi
++
++ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++DEPDIR="${am__leading_dot}deps"
++
++ac_config_commands="$ac_config_commands depfiles"
++
++
++am_make=${MAKE-make}
++cat > confinc << 'END'
++am__doit:
++ @echo this is the am__doit target
++.PHONY: am__doit
++END
++# If we don't find an include directive, just comment out the code.
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
++$as_echo_n "checking for style of include used by $am_make... " >&6; }
++am__include="#"
++am__quote=
++_am_result=none
++# First try GNU make style include.
++echo "include confinc" > confmf
++# Ignore all kinds of additional output from `make'.
++case `$am_make -s -f confmf 2> /dev/null` in #(
++*the\ am__doit\ target*)
++ am__include=include
++ am__quote=
++ _am_result=GNU
++ ;;
++esac
++# Now try BSD make style include.
++if test "$am__include" = "#"; then
++ echo '.include "confinc"' > confmf
++ case `$am_make -s -f confmf 2> /dev/null` in #(
++ *the\ am__doit\ target*)
++ am__include=.include
++ am__quote="\""
++ _am_result=BSD
++ ;;
++ esac
++fi
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
++$as_echo "$_am_result" >&6; }
++rm -f confinc confmf
++
++# Check whether --enable-dependency-tracking was given.
++if test "${enable_dependency_tracking+set}" = set; then :
++ enableval=$enable_dependency_tracking;
++fi
++
++if test "x$enable_dependency_tracking" != xno; then
++ am_depcomp="$ac_aux_dir/depcomp"
++ AMDEPBACKSLASH='\'
++fi
++ if test "x$enable_dependency_tracking" != xno; then
++ AMDEP_TRUE=
++ AMDEP_FALSE='#'
++else
++ AMDEP_TRUE='#'
++ AMDEP_FALSE=
++fi
++
++
++
++depcc="$CC" am_compiler_list=
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
++$as_echo_n "checking dependency style of $depcc... " >&6; }
++if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
++ # We make a subdir and do the tests there. Otherwise we can end up
++ # making bogus files that we don't know about and never remove. For
++ # instance it was reported that on HP-UX the gcc test will end up
++ # making a dummy file named `D' -- because `-MD' means `put the output
++ # in D'.
++ mkdir conftest.dir
++ # Copy depcomp to subdir because otherwise we won't find it if we're
++ # using a relative directory.
++ cp "$am_depcomp" conftest.dir
++ cd conftest.dir
++ # We will build objects and dependencies in a subdirectory because
++ # it helps to detect inapplicable dependency modes. For instance
++ # both Tru64's cc and ICC support -MD to output dependencies as a
++ # side effect of compilation, but ICC will put the dependencies in
++ # the current directory while Tru64 will put them in the object
++ # directory.
++ mkdir sub
++
++ am_cv_CC_dependencies_compiler_type=none
++ if test "$am_compiler_list" = ""; then
++ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
++ fi
++ am__universal=false
++ case " $depcc " in #(
++ *\ -arch\ *\ -arch\ *) am__universal=true ;;
++ esac
++
++ for depmode in $am_compiler_list; do
++ # Setup a source with many dependencies, because some compilers
++ # like to wrap large dependency lists on column 80 (with \), and
++ # we should not choose a depcomp mode which is confused by this.
++ #
++ # We need to recreate these files for each test, as the compiler may
++ # overwrite some of them when testing with obscure command lines.
++ # This happens at least with the AIX C compiler.
++ : > sub/conftest.c
++ for i in 1 2 3 4 5 6; do
++ echo '#include "conftst'$i'.h"' >> sub/conftest.c
++ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
++ # Solaris 8's {/usr,}/bin/sh.
++ touch sub/conftst$i.h
++ done
++ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
++
++ # We check with `-c' and `-o' for the sake of the "dashmstdout"
++ # mode. It turns out that the SunPro C++ compiler does not properly
++ # handle `-M -o', and we need to detect this. Also, some Intel
++ # versions had trouble with output in subdirs
++ am__obj=sub/conftest.${OBJEXT-o}
++ am__minus_obj="-o $am__obj"
++ case $depmode in
++ gcc)
++ # This depmode causes a compiler race in universal mode.
++ test "$am__universal" = false || continue
++ ;;
++ nosideeffect)
++ # after this tag, mechanisms are not by side-effect, so they'll
++ # only be used when explicitly requested
++ if test "x$enable_dependency_tracking" = xyes; then
++ continue
++ else
++ break
++ fi
++ ;;
++ msvisualcpp | msvcmsys)
++ # This compiler won't grok `-c -o', but also, the minuso test has
++ # not run yet. These depmodes are late enough in the game, and
++ # so weak that their functioning should not be impacted.
++ am__obj=conftest.${OBJEXT-o}
++ am__minus_obj=
++ ;;
++ none) break ;;
++ esac
++ if depmode=$depmode \
++ source=sub/conftest.c object=$am__obj \
++ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
++ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
++ >/dev/null 2>conftest.err &&
++ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
++ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
++ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
++ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
++ # icc doesn't choke on unknown options, it will just issue warnings
++ # or remarks (even with -Werror). So we grep stderr for any message
++ # that says an option was ignored or not supported.
++ # When given -MP, icc 7.0 and 7.1 complain thusly:
++ # icc: Command line warning: ignoring option '-M'; no argument required
++ # The diagnosis changed in icc 8.0:
++ # icc: Command line remark: option '-MP' not supported
++ if (grep 'ignoring option' conftest.err ||
++ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
++ am_cv_CC_dependencies_compiler_type=$depmode
++ break
++ fi
++ fi
++ done
++
++ cd ..
++ rm -rf conftest.dir
++else
++ am_cv_CC_dependencies_compiler_type=none
++fi
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
++$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
++CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
++
++ if
++ test "x$enable_dependency_tracking" != xno \
++ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
++ am__fastdepCC_TRUE=
++ am__fastdepCC_FALSE='#'
++else
++ am__fastdepCC_TRUE='#'
++ am__fastdepCC_FALSE=
++fi
++
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
++$as_echo_n "checking whether ln -s works... " >&6; }
++LN_S=$as_ln_s
++if test "$LN_S" = "ln -s"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
++$as_echo "yes" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
++$as_echo "no, using $LN_S" >&6; }
++fi
++
++
++# Checks for libtool
++
++# Debian Stable has no libtool2 yet so use old invocation
++#LT_INIT
++case `pwd` in
++ *\ * | *\ *)
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
++$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
++esac
++
++
++
++macro_version='2.2.6'
++macro_revision='1.3012'
++
++
++
++
++
++
++
++
++
++
++
++
++
++ltmain="$ac_aux_dir/ltmain.sh"
++
++# Make sure we can run config.sub.
++$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
++ as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
++$as_echo_n "checking build system type... " >&6; }
++if test "${ac_cv_build+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ ac_build_alias=$build_alias
++test "x$ac_build_alias" = x &&
++ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
++test "x$ac_build_alias" = x &&
++ as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5
++ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
++ as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
++$as_echo "$ac_cv_build" >&6; }
++case $ac_cv_build in
++*-*-*) ;;
++*) as_fn_error "invalid value of canonical build" "$LINENO" 5;;
++esac
++build=$ac_cv_build
++ac_save_IFS=$IFS; IFS='-'
++set x $ac_cv_build
++shift
++build_cpu=$1
++build_vendor=$2
++shift; shift
++# Remember, the first character of IFS is used to create $*,
++# except with old shells:
++build_os=$*
++IFS=$ac_save_IFS
++case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
++$as_echo_n "checking host system type... " >&6; }
++if test "${ac_cv_host+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test "x$host_alias" = x; then
++ ac_cv_host=$ac_cv_build
++else
++ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
++ as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
++fi
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
++$as_echo "$ac_cv_host" >&6; }
++case $ac_cv_host in
++*-*-*) ;;
++*) as_fn_error "invalid value of canonical host" "$LINENO" 5;;
++esac
++host=$ac_cv_host
++ac_save_IFS=$IFS; IFS='-'
++set x $ac_cv_host
++shift
++host_cpu=$1
++host_vendor=$2
++shift; shift
++# Remember, the first character of IFS is used to create $*,
++# except with old shells:
++host_os=$*
++IFS=$ac_save_IFS
++case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
++$as_echo_n "checking for a sed that does not truncate output... " >&6; }
++if test "${ac_cv_path_SED+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
++ for ac_i in 1 2 3 4 5 6 7; do
++ ac_script="$ac_script$as_nl$ac_script"
++ done
++ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
++ { ac_script=; unset ac_script;}
++ if test -z "$SED"; then
++ ac_path_SED_found=false
++ # Loop through the user's path and test for each of PROGNAME-LIST
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_prog in sed gsed; do
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
++ { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
++# Check for GNU ac_path_SED and select it if it is found.
++ # Check for GNU $ac_path_SED
++case `"$ac_path_SED" --version 2>&1` in
++*GNU*)
++ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
++*)
++ ac_count=0
++ $as_echo_n 0123456789 >"conftest.in"
++ while :
++ do
++ cat "conftest.in" "conftest.in" >"conftest.tmp"
++ mv "conftest.tmp" "conftest.in"
++ cp "conftest.in" "conftest.nl"
++ $as_echo '' >> "conftest.nl"
++ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
++ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
++ as_fn_arith $ac_count + 1 && ac_count=$as_val
++ if test $ac_count -gt ${ac_path_SED_max-0}; then
++ # Best one so far, save it but keep looking for a better one
++ ac_cv_path_SED="$ac_path_SED"
++ ac_path_SED_max=$ac_count
++ fi
++ # 10*(2^10) chars as input seems more than enough
++ test $ac_count -gt 10 && break
++ done
++ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
++esac
++
++ $ac_path_SED_found && break 3
++ done
++ done
++ done
++IFS=$as_save_IFS
++ if test -z "$ac_cv_path_SED"; then
++ as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5
++ fi
++else
++ ac_cv_path_SED=$SED
++fi
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
++$as_echo "$ac_cv_path_SED" >&6; }
++ SED="$ac_cv_path_SED"
++ rm -f conftest.sed
++
++test -z "$SED" && SED=sed
++Xsed="$SED -e 1s/^X//"
++
++
++
++
++
++
++
++
++
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
++$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
++if test "${ac_cv_path_GREP+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -z "$GREP"; then
++ ac_path_GREP_found=false
++ # Loop through the user's path and test for each of PROGNAME-LIST
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_prog in grep ggrep; do
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
++ { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
++# Check for GNU ac_path_GREP and select it if it is found.
++ # Check for GNU $ac_path_GREP
++case `"$ac_path_GREP" --version 2>&1` in
++*GNU*)
++ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
++*)
++ ac_count=0
++ $as_echo_n 0123456789 >"conftest.in"
++ while :
++ do
++ cat "conftest.in" "conftest.in" >"conftest.tmp"
++ mv "conftest.tmp" "conftest.in"
++ cp "conftest.in" "conftest.nl"
++ $as_echo 'GREP' >> "conftest.nl"
++ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
++ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
++ as_fn_arith $ac_count + 1 && ac_count=$as_val
++ if test $ac_count -gt ${ac_path_GREP_max-0}; then
++ # Best one so far, save it but keep looking for a better one
++ ac_cv_path_GREP="$ac_path_GREP"
++ ac_path_GREP_max=$ac_count
++ fi
++ # 10*(2^10) chars as input seems more than enough
++ test $ac_count -gt 10 && break
++ done
++ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
++esac
++
++ $ac_path_GREP_found && break 3
++ done
++ done
++ done
++IFS=$as_save_IFS
++ if test -z "$ac_cv_path_GREP"; then
++ as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
++ fi
++else
++ ac_cv_path_GREP=$GREP
++fi
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
++$as_echo "$ac_cv_path_GREP" >&6; }
++ GREP="$ac_cv_path_GREP"
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
++$as_echo_n "checking for egrep... " >&6; }
++if test "${ac_cv_path_EGREP+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
++ then ac_cv_path_EGREP="$GREP -E"
++ else
++ if test -z "$EGREP"; then
++ ac_path_EGREP_found=false
++ # Loop through the user's path and test for each of PROGNAME-LIST
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_prog in egrep; do
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
++ { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
++# Check for GNU ac_path_EGREP and select it if it is found.
++ # Check for GNU $ac_path_EGREP
++case `"$ac_path_EGREP" --version 2>&1` in
++*GNU*)
++ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
++*)
++ ac_count=0
++ $as_echo_n 0123456789 >"conftest.in"
++ while :
++ do
++ cat "conftest.in" "conftest.in" >"conftest.tmp"
++ mv "conftest.tmp" "conftest.in"
++ cp "conftest.in" "conftest.nl"
++ $as_echo 'EGREP' >> "conftest.nl"
++ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
++ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
++ as_fn_arith $ac_count + 1 && ac_count=$as_val
++ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
++ # Best one so far, save it but keep looking for a better one
++ ac_cv_path_EGREP="$ac_path_EGREP"
++ ac_path_EGREP_max=$ac_count
++ fi
++ # 10*(2^10) chars as input seems more than enough
++ test $ac_count -gt 10 && break
++ done
++ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
++esac
++
++ $ac_path_EGREP_found && break 3
++ done
++ done
++ done
++IFS=$as_save_IFS
++ if test -z "$ac_cv_path_EGREP"; then
++ as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
++ fi
++else
++ ac_cv_path_EGREP=$EGREP
++fi
++
++ fi
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
++$as_echo "$ac_cv_path_EGREP" >&6; }
++ EGREP="$ac_cv_path_EGREP"
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
++$as_echo_n "checking for fgrep... " >&6; }
++if test "${ac_cv_path_FGREP+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
++ then ac_cv_path_FGREP="$GREP -F"
++ else
++ if test -z "$FGREP"; then
++ ac_path_FGREP_found=false
++ # Loop through the user's path and test for each of PROGNAME-LIST
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_prog in fgrep; do
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
++ { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
++# Check for GNU ac_path_FGREP and select it if it is found.
++ # Check for GNU $ac_path_FGREP
++case `"$ac_path_FGREP" --version 2>&1` in
++*GNU*)
++ ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
++*)
++ ac_count=0
++ $as_echo_n 0123456789 >"conftest.in"
++ while :
++ do
++ cat "conftest.in" "conftest.in" >"conftest.tmp"
++ mv "conftest.tmp" "conftest.in"
++ cp "conftest.in" "conftest.nl"
++ $as_echo 'FGREP' >> "conftest.nl"
++ "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
++ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
++ as_fn_arith $ac_count + 1 && ac_count=$as_val
++ if test $ac_count -gt ${ac_path_FGREP_max-0}; then
++ # Best one so far, save it but keep looking for a better one
++ ac_cv_path_FGREP="$ac_path_FGREP"
++ ac_path_FGREP_max=$ac_count
++ fi
++ # 10*(2^10) chars as input seems more than enough
++ test $ac_count -gt 10 && break
++ done
++ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
++esac
++
++ $ac_path_FGREP_found && break 3
++ done
++ done
++ done
++IFS=$as_save_IFS
++ if test -z "$ac_cv_path_FGREP"; then
++ as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
++ fi
++else
++ ac_cv_path_FGREP=$FGREP
++fi
++
++ fi
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
++$as_echo "$ac_cv_path_FGREP" >&6; }
++ FGREP="$ac_cv_path_FGREP"
++
++
++test -z "$GREP" && GREP=grep
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++# Check whether --with-gnu-ld was given.
++if test "${with_gnu_ld+set}" = set; then :
++ withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
++else
++ with_gnu_ld=no
++fi
++
++ac_prog=ld
++if test "$GCC" = yes; then
++ # Check if gcc -print-prog-name=ld gives a path.
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
++$as_echo_n "checking for ld used by $CC... " >&6; }
++ case $host in
++ *-*-mingw*)
++ # gcc leaves a trailing carriage return which upsets mingw
++ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
++ *)
++ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
++ esac
++ case $ac_prog in
++ # Accept absolute paths.
++ [\\/]* | ?:[\\/]*)
++ re_direlt='/[^/][^/]*/\.\./'
++ # Canonicalize the pathname of ld
++ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
++ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
++ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
++ done
++ test -z "$LD" && LD="$ac_prog"
++ ;;
++ "")
++ # If it fails, then pretend we aren't using GCC.
++ ac_prog=ld
++ ;;
++ *)
++ # If it is relative, then search for the first ld in PATH.
++ with_gnu_ld=unknown
++ ;;
++ esac
++elif test "$with_gnu_ld" = yes; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
++$as_echo_n "checking for GNU ld... " >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
++$as_echo_n "checking for non-GNU ld... " >&6; }
++fi
++if test "${lt_cv_path_LD+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -z "$LD"; then
++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
++ for ac_dir in $PATH; do
++ IFS="$lt_save_ifs"
++ test -z "$ac_dir" && ac_dir=.
++ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
++ lt_cv_path_LD="$ac_dir/$ac_prog"
++ # Check to see if the program is GNU ld. I'd rather use --version,
++ # but apparently some variants of GNU ld only accept -v.
++ # Break only if it was the GNU/non-GNU ld that we prefer.
++ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
++ *GNU* | *'with BFD'*)
++ test "$with_gnu_ld" != no && break
++ ;;
++ *)
++ test "$with_gnu_ld" != yes && break
++ ;;
++ esac
++ fi
++ done
++ IFS="$lt_save_ifs"
++else
++ lt_cv_path_LD="$LD" # Let the user override the test with a path.
++fi
++fi
++
++LD="$lt_cv_path_LD"
++if test -n "$LD"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
++$as_echo "$LD" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
++$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
++if test "${lt_cv_prog_gnu_ld+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ # I'd rather use --version here, but apparently some GNU lds only accept -v.
++case `$LD -v 2>&1 </dev/null` in
++*GNU* | *'with BFD'*)
++ lt_cv_prog_gnu_ld=yes
++ ;;
++*)
++ lt_cv_prog_gnu_ld=no
++ ;;
++esac
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
++$as_echo "$lt_cv_prog_gnu_ld" >&6; }
++with_gnu_ld=$lt_cv_prog_gnu_ld
++
++
++
++
++
++
++
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
++$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
++if test "${lt_cv_path_NM+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$NM"; then
++ # Let the user override the test.
++ lt_cv_path_NM="$NM"
++else
++ lt_nm_to_check="${ac_tool_prefix}nm"
++ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
++ lt_nm_to_check="$lt_nm_to_check nm"
++ fi
++ for lt_tmp_nm in $lt_nm_to_check; do
++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
++ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
++ IFS="$lt_save_ifs"
++ test -z "$ac_dir" && ac_dir=.
++ tmp_nm="$ac_dir/$lt_tmp_nm"
++ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
++ # Check to see if the nm accepts a BSD-compat flag.
++ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
++ # nm: unknown option "B" ignored
++ # Tru64's nm complains that /dev/null is an invalid object file
++ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
++ */dev/null* | *'Invalid file or object type'*)
++ lt_cv_path_NM="$tmp_nm -B"
++ break
++ ;;
++ *)
++ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
++ */dev/null*)
++ lt_cv_path_NM="$tmp_nm -p"
++ break
++ ;;
++ *)
++ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
++ continue # so that we can try to find one that supports BSD flags
++ ;;
++ esac
++ ;;
++ esac
++ fi
++ done
++ IFS="$lt_save_ifs"
++ done
++ : ${lt_cv_path_NM=no}
++fi
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
++$as_echo "$lt_cv_path_NM" >&6; }
++if test "$lt_cv_path_NM" != "no"; then
++ NM="$lt_cv_path_NM"
++else
++ # Didn't find any BSD compatible name lister, look for dumpbin.
++ if test -n "$ac_tool_prefix"; then
++ for ac_prog in "dumpbin -symbols" "link -dump -symbols"
++ do
++ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
++set dummy $ac_tool_prefix$ac_prog; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_DUMPBIN+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$DUMPBIN"; then
++ ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++DUMPBIN=$ac_cv_prog_DUMPBIN
++if test -n "$DUMPBIN"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
++$as_echo "$DUMPBIN" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++ test -n "$DUMPBIN" && break
++ done
++fi
++if test -z "$DUMPBIN"; then
++ ac_ct_DUMPBIN=$DUMPBIN
++ for ac_prog in "dumpbin -symbols" "link -dump -symbols"
++do
++ # Extract the first word of "$ac_prog", so it can be a program name with args.
++set dummy $ac_prog; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$ac_ct_DUMPBIN"; then
++ ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
++if test -n "$ac_ct_DUMPBIN"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
++$as_echo "$ac_ct_DUMPBIN" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++ test -n "$ac_ct_DUMPBIN" && break
++done
++
++ if test "x$ac_ct_DUMPBIN" = x; then
++ DUMPBIN=":"
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ DUMPBIN=$ac_ct_DUMPBIN
++ fi
++fi
++
++
++ if test "$DUMPBIN" != ":"; then
++ NM="$DUMPBIN"
++ fi
++fi
++test -z "$NM" && NM=nm
++
++
++
++
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
++$as_echo_n "checking the name lister ($NM) interface... " >&6; }
++if test "${lt_cv_nm_interface+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ lt_cv_nm_interface="BSD nm"
++ echo "int some_variable = 0;" > conftest.$ac_ext
++ (eval echo "\"\$as_me:4755: $ac_compile\"" >&5)
++ (eval "$ac_compile" 2>conftest.err)
++ cat conftest.err >&5
++ (eval echo "\"\$as_me:4758: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
++ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
++ cat conftest.err >&5
++ (eval echo "\"\$as_me:4761: output\"" >&5)
++ cat conftest.out >&5
++ if $GREP 'External.*some_variable' conftest.out > /dev/null; then
++ lt_cv_nm_interface="MS dumpbin"
++ fi
++ rm -f conftest*
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
++$as_echo "$lt_cv_nm_interface" >&6; }
++
++# find the maximum length of command line arguments
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
++$as_echo_n "checking the maximum length of command line arguments... " >&6; }
++if test "${lt_cv_sys_max_cmd_len+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ i=0
++ teststring="ABCD"
++
++ case $build_os in
++ msdosdjgpp*)
++ # On DJGPP, this test can blow up pretty badly due to problems in libc
++ # (any single argument exceeding 2000 bytes causes a buffer overrun
++ # during glob expansion). Even if it were fixed, the result of this
++ # check would be larger than it should be.
++ lt_cv_sys_max_cmd_len=12288; # 12K is about right
++ ;;
++
++ gnu*)
++ # Under GNU Hurd, this test is not required because there is
++ # no limit to the length of command line arguments.
++ # Libtool will interpret -1 as no limit whatsoever
++ lt_cv_sys_max_cmd_len=-1;
++ ;;
++
++ cygwin* | mingw* | cegcc*)
++ # On Win9x/ME, this test blows up -- it succeeds, but takes
++ # about 5 minutes as the teststring grows exponentially.
++ # Worse, since 9x/ME are not pre-emptively multitasking,
++ # you end up with a "frozen" computer, even though with patience
++ # the test eventually succeeds (with a max line length of 256k).
++ # Instead, let's just punt: use the minimum linelength reported by
++ # all of the supported platforms: 8192 (on NT/2K/XP).
++ lt_cv_sys_max_cmd_len=8192;
++ ;;
++
++ amigaos*)
++ # On AmigaOS with pdksh, this test takes hours, literally.
++ # So we just punt and use a minimum line length of 8192.
++ lt_cv_sys_max_cmd_len=8192;
++ ;;
++
++ netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
++ # This has been around since 386BSD, at least. Likely further.
++ if test -x /sbin/sysctl; then
++ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
++ elif test -x /usr/sbin/sysctl; then
++ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
++ else
++ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
++ fi
++ # And add a safety zone
++ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
++ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
++ ;;
++
++ interix*)
++ # We know the value 262144 and hardcode it with a safety zone (like BSD)
++ lt_cv_sys_max_cmd_len=196608
++ ;;
++
++ osf*)
++ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
++ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
++ # nice to cause kernel panics so lets avoid the loop below.
++ # First set a reasonable default.
++ lt_cv_sys_max_cmd_len=16384
++ #
++ if test -x /sbin/sysconfig; then
++ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
++ *1*) lt_cv_sys_max_cmd_len=-1 ;;
++ esac
++ fi
++ ;;
++ sco3.2v5*)
++ lt_cv_sys_max_cmd_len=102400
++ ;;
++ sysv5* | sco5v6* | sysv4.2uw2*)
++ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
++ if test -n "$kargmax"; then
++ lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'`
++ else
++ lt_cv_sys_max_cmd_len=32768
++ fi
++ ;;
++ *)
++ lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
++ if test -n "$lt_cv_sys_max_cmd_len"; then
++ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
++ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
++ else
++ # Make teststring a little bigger before we do anything with it.
++ # a 1K string should be a reasonable start.
++ for i in 1 2 3 4 5 6 7 8 ; do
++ teststring=$teststring$teststring
++ done
++ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
++ # If test is not a shell built-in, we'll probably end up computing a
++ # maximum length that is only half of the actual maximum length, but
++ # we can't tell.
++ while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
++ = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
++ test $i != 17 # 1/2 MB should be enough
++ do
++ i=`expr $i + 1`
++ teststring=$teststring$teststring
++ done
++ # Only check the string length outside the loop.
++ lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
++ teststring=
++ # Add a significant safety factor because C++ compilers can tack on
++ # massive amounts of additional arguments before passing them to the
++ # linker. It appears as though 1/2 is a usable value.
++ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
++ fi
++ ;;
++ esac
++
++fi
++
++if test -n $lt_cv_sys_max_cmd_len ; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
++$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
++$as_echo "none" >&6; }
++fi
++max_cmd_len=$lt_cv_sys_max_cmd_len
++
++
++
++
++
++
++: ${CP="cp -f"}
++: ${MV="mv -f"}
++: ${RM="rm -f"}
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
++$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
++# Try some XSI features
++xsi_shell=no
++( _lt_dummy="a/b/c"
++ test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
++ = c,a/b,, \
++ && eval 'test $(( 1 + 1 )) -eq 2 \
++ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
++ && xsi_shell=yes
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
++$as_echo "$xsi_shell" >&6; }
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
++$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
++lt_shell_append=no
++( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
++ >/dev/null 2>&1 \
++ && lt_shell_append=yes
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
++$as_echo "$lt_shell_append" >&6; }
++
++
++if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
++ lt_unset=unset
++else
++ lt_unset=false
++fi
++
++
++
++
++
++# test EBCDIC or ASCII
++case `echo X|tr X '\101'` in
++ A) # ASCII based system
++ # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
++ lt_SP2NL='tr \040 \012'
++ lt_NL2SP='tr \015\012 \040\040'
++ ;;
++ *) # EBCDIC based system
++ lt_SP2NL='tr \100 \n'
++ lt_NL2SP='tr \r\n \100\100'
++ ;;
++esac
++
++
++
++
++
++
++
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
++$as_echo_n "checking for $LD option to reload object files... " >&6; }
++if test "${lt_cv_ld_reload_flag+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ lt_cv_ld_reload_flag='-r'
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
++$as_echo "$lt_cv_ld_reload_flag" >&6; }
++reload_flag=$lt_cv_ld_reload_flag
++case $reload_flag in
++"" | " "*) ;;
++*) reload_flag=" $reload_flag" ;;
++esac
++reload_cmds='$LD$reload_flag -o $output$reload_objs'
++case $host_os in
++ darwin*)
++ if test "$GCC" = yes; then
++ reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
++ else
++ reload_cmds='$LD$reload_flag -o $output$reload_objs'
++ fi
++ ;;
++esac
++
++
++
++
++
++
++
++
++
++if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
++set dummy ${ac_tool_prefix}objdump; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_OBJDUMP+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$OBJDUMP"; then
++ ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++OBJDUMP=$ac_cv_prog_OBJDUMP
++if test -n "$OBJDUMP"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
++$as_echo "$OBJDUMP" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_prog_OBJDUMP"; then
++ ac_ct_OBJDUMP=$OBJDUMP
++ # Extract the first word of "objdump", so it can be a program name with args.
++set dummy objdump; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$ac_ct_OBJDUMP"; then
++ ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_ac_ct_OBJDUMP="objdump"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
++if test -n "$ac_ct_OBJDUMP"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
++$as_echo "$ac_ct_OBJDUMP" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_ct_OBJDUMP" = x; then
++ OBJDUMP="false"
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ OBJDUMP=$ac_ct_OBJDUMP
++ fi
++else
++ OBJDUMP="$ac_cv_prog_OBJDUMP"
++fi
++
++test -z "$OBJDUMP" && OBJDUMP=objdump
++
++
++
++
++
++
++
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
++$as_echo_n "checking how to recognize dependent libraries... " >&6; }
++if test "${lt_cv_deplibs_check_method+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ lt_cv_file_magic_cmd='$MAGIC_CMD'
++lt_cv_file_magic_test_file=
++lt_cv_deplibs_check_method='unknown'
++# Need to set the preceding variable on all platforms that support
++# interlibrary dependencies.
++# 'none' -- dependencies not supported.
++# `unknown' -- same as none, but documents that we really don't know.
++# 'pass_all' -- all dependencies passed with no checks.
++# 'test_compile' -- check by making test program.
++# 'file_magic [[regex]]' -- check by looking for files in library path
++# which responds to the $file_magic_cmd with a given extended regex.
++# If you have `file' or equivalent on your system and you're not sure
++# whether `pass_all' will *always* work, you probably want this one.
++
++case $host_os in
++aix[4-9]*)
++ lt_cv_deplibs_check_method=pass_all
++ ;;
++
++beos*)
++ lt_cv_deplibs_check_method=pass_all
++ ;;
++
++bsdi[45]*)
++ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
++ lt_cv_file_magic_cmd='/usr/bin/file -L'
++ lt_cv_file_magic_test_file=/shlib/libc.so
++ ;;
++
++cygwin*)
++ # func_win32_libid is a shell function defined in ltmain.sh
++ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
++ lt_cv_file_magic_cmd='func_win32_libid'
++ ;;
++
++mingw* | pw32*)
++ # Base MSYS/MinGW do not provide the 'file' command needed by
++ # func_win32_libid shell function, so use a weaker test based on 'objdump',
++ # unless we find 'file', for example because we are cross-compiling.
++ if ( file / ) >/dev/null 2>&1; then
++ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
++ lt_cv_file_magic_cmd='func_win32_libid'
++ else
++ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
++ lt_cv_file_magic_cmd='$OBJDUMP -f'
++ fi
++ ;;
++
++cegcc)
++ # use the weaker test based on 'objdump'. See mingw*.
++ lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
++ lt_cv_file_magic_cmd='$OBJDUMP -f'
++ ;;
++
++darwin* | rhapsody*)
++ lt_cv_deplibs_check_method=pass_all
++ ;;
++
++freebsd* | dragonfly*)
++ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
++ case $host_cpu in
++ i*86 )
++ # Not sure whether the presence of OpenBSD here was a mistake.
++ # Let's accept both of them until this is cleared up.
++ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
++ lt_cv_file_magic_cmd=/usr/bin/file
++ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
++ ;;
++ esac
++ else
++ lt_cv_deplibs_check_method=pass_all
++ fi
++ ;;
++
++gnu*)
++ lt_cv_deplibs_check_method=pass_all
++ ;;
++
++hpux10.20* | hpux11*)
++ lt_cv_file_magic_cmd=/usr/bin/file
++ case $host_cpu in
++ ia64*)
++ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
++ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
++ ;;
++ hppa*64*)
++ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
++ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
++ ;;
++ *)
++ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
++ lt_cv_file_magic_test_file=/usr/lib/libc.sl
++ ;;
++ esac
++ ;;
++
++interix[3-9]*)
++ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
++ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
++ ;;
++
++irix5* | irix6* | nonstopux*)
++ case $LD in
++ *-32|*"-32 ") libmagic=32-bit;;
++ *-n32|*"-n32 ") libmagic=N32;;
++ *-64|*"-64 ") libmagic=64-bit;;
++ *) libmagic=never-match;;
++ esac
++ lt_cv_deplibs_check_method=pass_all
++ ;;
++
++# This must be Linux ELF.
++linux* | k*bsd*-gnu)
++ lt_cv_deplibs_check_method=pass_all
++ ;;
++
++netbsd* | netbsdelf*-gnu)
++ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
++ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
++ else
++ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
++ fi
++ ;;
++
++newos6*)
++ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
++ lt_cv_file_magic_cmd=/usr/bin/file
++ lt_cv_file_magic_test_file=/usr/lib/libnls.so
++ ;;
++
++*nto* | *qnx*)
++ lt_cv_deplibs_check_method=pass_all
++ ;;
++
++openbsd*)
++ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
++ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
++ else
++ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
++ fi
++ ;;
++
++osf3* | osf4* | osf5*)
++ lt_cv_deplibs_check_method=pass_all
++ ;;
++
++rdos*)
++ lt_cv_deplibs_check_method=pass_all
++ ;;
++
++solaris*)
++ lt_cv_deplibs_check_method=pass_all
++ ;;
++
++sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
++ lt_cv_deplibs_check_method=pass_all
++ ;;
++
++sysv4 | sysv4.3*)
++ case $host_vendor in
++ motorola)
++ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
++ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
++ ;;
++ ncr)
++ lt_cv_deplibs_check_method=pass_all
++ ;;
++ sequent)
++ lt_cv_file_magic_cmd='/bin/file'
++ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
++ ;;
++ sni)
++ lt_cv_file_magic_cmd='/bin/file'
++ lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
++ lt_cv_file_magic_test_file=/lib/libc.so
++ ;;
++ siemens)
++ lt_cv_deplibs_check_method=pass_all
++ ;;
++ pc)
++ lt_cv_deplibs_check_method=pass_all
++ ;;
++ esac
++ ;;
++
++tpf*)
++ lt_cv_deplibs_check_method=pass_all
++ ;;
++esac
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
++$as_echo "$lt_cv_deplibs_check_method" >&6; }
++file_magic_cmd=$lt_cv_file_magic_cmd
++deplibs_check_method=$lt_cv_deplibs_check_method
++test -z "$deplibs_check_method" && deplibs_check_method=unknown
++
++
++
++
++
++
++
++
++
++
++
++
++if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
++set dummy ${ac_tool_prefix}ar; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_AR+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$AR"; then
++ ac_cv_prog_AR="$AR" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_AR="${ac_tool_prefix}ar"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++AR=$ac_cv_prog_AR
++if test -n "$AR"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
++$as_echo "$AR" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_prog_AR"; then
++ ac_ct_AR=$AR
++ # Extract the first word of "ar", so it can be a program name with args.
++set dummy ar; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$ac_ct_AR"; then
++ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_ac_ct_AR="ar"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++ac_ct_AR=$ac_cv_prog_ac_ct_AR
++if test -n "$ac_ct_AR"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
++$as_echo "$ac_ct_AR" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_ct_AR" = x; then
++ AR="false"
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ AR=$ac_ct_AR
++ fi
++else
++ AR="$ac_cv_prog_AR"
++fi
++
++test -z "$AR" && AR=ar
++test -z "$AR_FLAGS" && AR_FLAGS=cru
++
++
++
++
++
++
++
++
++
++
++
++if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
++set dummy ${ac_tool_prefix}strip; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_STRIP+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$STRIP"; then
++ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++STRIP=$ac_cv_prog_STRIP
++if test -n "$STRIP"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
++$as_echo "$STRIP" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_prog_STRIP"; then
++ ac_ct_STRIP=$STRIP
++ # Extract the first word of "strip", so it can be a program name with args.
++set dummy strip; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$ac_ct_STRIP"; then
++ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_ac_ct_STRIP="strip"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
++if test -n "$ac_ct_STRIP"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
++$as_echo "$ac_ct_STRIP" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_ct_STRIP" = x; then
++ STRIP=":"
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ STRIP=$ac_ct_STRIP
++ fi
++else
++ STRIP="$ac_cv_prog_STRIP"
++fi
++
++test -z "$STRIP" && STRIP=:
++
++
++
++
++
++
++if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
++set dummy ${ac_tool_prefix}ranlib; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_RANLIB+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$RANLIB"; then
++ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++RANLIB=$ac_cv_prog_RANLIB
++if test -n "$RANLIB"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
++$as_echo "$RANLIB" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_prog_RANLIB"; then
++ ac_ct_RANLIB=$RANLIB
++ # Extract the first word of "ranlib", so it can be a program name with args.
++set dummy ranlib; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$ac_ct_RANLIB"; then
++ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_ac_ct_RANLIB="ranlib"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
++if test -n "$ac_ct_RANLIB"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
++$as_echo "$ac_ct_RANLIB" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_ct_RANLIB" = x; then
++ RANLIB=":"
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ RANLIB=$ac_ct_RANLIB
++ fi
++else
++ RANLIB="$ac_cv_prog_RANLIB"
++fi
++
++test -z "$RANLIB" && RANLIB=:
++
++
++
++
++
++
++# Determine commands to create old-style static archives.
++old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
++old_postinstall_cmds='chmod 644 $oldlib'
++old_postuninstall_cmds=
++
++if test -n "$RANLIB"; then
++ case $host_os in
++ openbsd*)
++ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
++ ;;
++ *)
++ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
++ ;;
++ esac
++ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
++fi
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++# If no C compiler was specified, use CC.
++LTCC=${LTCC-"$CC"}
++
++# If no C compiler flags were specified, use CFLAGS.
++LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
++
++# Allow CC to be a program name with arguments.
++compiler=$CC
++
++
++# Check for command to grab the raw symbol name followed by C symbol from nm.
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
++$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
++if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++
++# These are sane defaults that work on at least a few old systems.
++# [They come from Ultrix. What could be older than Ultrix?!! ;)]
++
++# Character class describing NM global symbol codes.
++symcode='[BCDEGRST]'
++
++# Regexp to match symbols that can be accessed directly from C.
++sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
++
++# Define system-specific variables.
++case $host_os in
++aix*)
++ symcode='[BCDT]'
++ ;;
++cygwin* | mingw* | pw32* | cegcc*)
++ symcode='[ABCDGISTW]'
++ ;;
++hpux*)
++ if test "$host_cpu" = ia64; then
++ symcode='[ABCDEGRST]'
++ fi
++ ;;
++irix* | nonstopux*)
++ symcode='[BCDEGRST]'
++ ;;
++osf*)
++ symcode='[BCDEGQRST]'
++ ;;
++solaris*)
++ symcode='[BDRT]'
++ ;;
++sco3.2v5*)
++ symcode='[DT]'
++ ;;
++sysv4.2uw2*)
++ symcode='[DT]'
++ ;;
++sysv5* | sco5v6* | unixware* | OpenUNIX*)
++ symcode='[ABDT]'
++ ;;
++sysv4)
++ symcode='[DFNSTU]'
++ ;;
++esac
++
++# If we're using GNU nm, then use its standard symbol codes.
++case `$NM -V 2>&1` in
++*GNU* | *'with BFD'*)
++ symcode='[ABCDGIRSTW]' ;;
++esac
++
++# Transform an extracted symbol line into a proper C declaration.
++# Some systems (esp. on ia64) link data and code symbols differently,
++# so use this general approach.
++lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
++
++# Transform an extracted symbol line into symbol name and symbol address
++lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'"
++lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'"
++
++# Handle CRLF in mingw tool chain
++opt_cr=
++case $build_os in
++mingw*)
++ opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
++ ;;
++esac
++
++# Try without a prefix underscore, then with it.
++for ac_symprfx in "" "_"; do
++
++ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
++ symxfrm="\\1 $ac_symprfx\\2 \\2"
++
++ # Write the raw and C identifiers.
++ if test "$lt_cv_nm_interface" = "MS dumpbin"; then
++ # Fake it for dumpbin and say T for any non-static function
++ # and D for any global variable.
++ # Also find C++ and __fastcall symbols from MSVC++,
++ # which start with @ or ?.
++ lt_cv_sys_global_symbol_pipe="$AWK '"\
++" {last_section=section; section=\$ 3};"\
++" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
++" \$ 0!~/External *\|/{next};"\
++" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
++" {if(hide[section]) next};"\
++" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
++" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
++" s[1]~/^[@?]/{print s[1], s[1]; next};"\
++" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
++" ' prfx=^$ac_symprfx"
++ else
++ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
++ fi
++
++ # Check to see that the pipe works correctly.
++ pipe_works=no
++
++ rm -f conftest*
++ cat > conftest.$ac_ext <<_LT_EOF
++#ifdef __cplusplus
++extern "C" {
++#endif
++char nm_test_var;
++void nm_test_func(void);
++void nm_test_func(void){}
++#ifdef __cplusplus
++}
++#endif
++int main(){nm_test_var='a';nm_test_func();return(0);}
++_LT_EOF
++
++ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
++ (eval $ac_compile) 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; }; then
++ # Now try to grab the symbols.
++ nlist=conftest.nm
++ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5
++ (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; } && test -s "$nlist"; then
++ # Try sorting and uniquifying the output.
++ if sort "$nlist" | uniq > "$nlist"T; then
++ mv -f "$nlist"T "$nlist"
++ else
++ rm -f "$nlist"T
++ fi
++
++ # Make sure that we snagged all the symbols we need.
++ if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
++ if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
++ cat <<_LT_EOF > conftest.$ac_ext
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++_LT_EOF
++ # Now generate the symbol file.
++ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
++
++ cat <<_LT_EOF >> conftest.$ac_ext
++
++/* The mapping between symbol names and symbols. */
++const struct {
++ const char *name;
++ void *address;
++}
++lt__PROGRAM__LTX_preloaded_symbols[] =
++{
++ { "@PROGRAM@", (void *) 0 },
++_LT_EOF
++ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
++ cat <<\_LT_EOF >> conftest.$ac_ext
++ {0, (void *) 0}
++};
++
++/* This works around a problem in FreeBSD linker */
++#ifdef FREEBSD_WORKAROUND
++static const void *lt_preloaded_setup() {
++ return lt__PROGRAM__LTX_preloaded_symbols;
++}
++#endif
++
++#ifdef __cplusplus
++}
++#endif
++_LT_EOF
++ # Now try linking the two files.
++ mv conftest.$ac_objext conftstm.$ac_objext
++ lt_save_LIBS="$LIBS"
++ lt_save_CFLAGS="$CFLAGS"
++ LIBS="conftstm.$ac_objext"
++ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
++ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
++ (eval $ac_link) 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; } && test -s conftest${ac_exeext}; then
++ pipe_works=yes
++ fi
++ LIBS="$lt_save_LIBS"
++ CFLAGS="$lt_save_CFLAGS"
++ else
++ echo "cannot find nm_test_func in $nlist" >&5
++ fi
++ else
++ echo "cannot find nm_test_var in $nlist" >&5
++ fi
++ else
++ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
++ fi
++ else
++ echo "$progname: failed program was:" >&5
++ cat conftest.$ac_ext >&5
++ fi
++ rm -rf conftest* conftst*
++
++ # Do not use the global_symbol_pipe unless it works.
++ if test "$pipe_works" = yes; then
++ break
++ else
++ lt_cv_sys_global_symbol_pipe=
++ fi
++done
++
++fi
++
++if test -z "$lt_cv_sys_global_symbol_pipe"; then
++ lt_cv_sys_global_symbol_to_cdecl=
++fi
++if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
++$as_echo "failed" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
++$as_echo "ok" >&6; }
++fi
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++# Check whether --enable-libtool-lock was given.
++if test "${enable_libtool_lock+set}" = set; then :
++ enableval=$enable_libtool_lock;
++fi
++
++test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
++
++# Some flags need to be propagated to the compiler or linker for good
++# libtool support.
++case $host in
++ia64-*-hpux*)
++ # Find out which ABI we are using.
++ echo 'int i;' > conftest.$ac_ext
++ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
++ (eval $ac_compile) 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; }; then
++ case `/usr/bin/file conftest.$ac_objext` in
++ *ELF-32*)
++ HPUX_IA64_MODE="32"
++ ;;
++ *ELF-64*)
++ HPUX_IA64_MODE="64"
++ ;;
++ esac
++ fi
++ rm -rf conftest*
++ ;;
++*-*-irix6*)
++ # Find out which ABI we are using.
++ echo '#line 5956 "configure"' > conftest.$ac_ext
++ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
++ (eval $ac_compile) 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; }; then
++ if test "$lt_cv_prog_gnu_ld" = yes; then
++ case `/usr/bin/file conftest.$ac_objext` in
++ *32-bit*)
++ LD="${LD-ld} -melf32bsmip"
++ ;;
++ *N32*)
++ LD="${LD-ld} -melf32bmipn32"
++ ;;
++ *64-bit*)
++ LD="${LD-ld} -melf64bmip"
++ ;;
++ esac
++ else
++ case `/usr/bin/file conftest.$ac_objext` in
++ *32-bit*)
++ LD="${LD-ld} -32"
++ ;;
++ *N32*)
++ LD="${LD-ld} -n32"
++ ;;
++ *64-bit*)
++ LD="${LD-ld} -64"
++ ;;
++ esac
++ fi
++ fi
++ rm -rf conftest*
++ ;;
++
++x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
++s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
++ # Find out which ABI we are using.
++ echo 'int i;' > conftest.$ac_ext
++ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
++ (eval $ac_compile) 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; }; then
++ case `/usr/bin/file conftest.o` in
++ *32-bit*)
++ case $host in
++ x86_64-*kfreebsd*-gnu)
++ LD="${LD-ld} -m elf_i386_fbsd"
++ ;;
++ x86_64-*linux*)
++ LD="${LD-ld} -m elf_i386"
++ ;;
++ ppc64-*linux*|powerpc64-*linux*)
++ LD="${LD-ld} -m elf32ppclinux"
++ ;;
++ s390x-*linux*)
++ LD="${LD-ld} -m elf_s390"
++ ;;
++ sparc64-*linux*)
++ LD="${LD-ld} -m elf32_sparc"
++ ;;
++ esac
++ ;;
++ *64-bit*)
++ case $host in
++ x86_64-*kfreebsd*-gnu)
++ LD="${LD-ld} -m elf_x86_64_fbsd"
++ ;;
++ x86_64-*linux*)
++ LD="${LD-ld} -m elf_x86_64"
++ ;;
++ ppc*-*linux*|powerpc*-*linux*)
++ LD="${LD-ld} -m elf64ppc"
++ ;;
++ s390*-*linux*|s390*-*tpf*)
++ LD="${LD-ld} -m elf64_s390"
++ ;;
++ sparc*-*linux*)
++ LD="${LD-ld} -m elf64_sparc"
++ ;;
++ esac
++ ;;
++ esac
++ fi
++ rm -rf conftest*
++ ;;
++
++*-*-sco3.2v5*)
++ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
++ SAVE_CFLAGS="$CFLAGS"
++ CFLAGS="$CFLAGS -belf"
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
++$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
++if test "${lt_cv_cc_needs_belf+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++int
++main ()
++{
++
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++ lt_cv_cc_needs_belf=yes
++else
++ lt_cv_cc_needs_belf=no
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++ ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
++$as_echo "$lt_cv_cc_needs_belf" >&6; }
++ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
++ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
++ CFLAGS="$SAVE_CFLAGS"
++ fi
++ ;;
++sparc*-*solaris*)
++ # Find out which ABI we are using.
++ echo 'int i;' > conftest.$ac_ext
++ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
++ (eval $ac_compile) 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; }; then
++ case `/usr/bin/file conftest.o` in
++ *64-bit*)
++ case $lt_cv_prog_gnu_ld in
++ yes*) LD="${LD-ld} -m elf64_sparc" ;;
++ *)
++ if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
++ LD="${LD-ld} -64"
++ fi
++ ;;
++ esac
++ ;;
++ esac
++ fi
++ rm -rf conftest*
++ ;;
++esac
++
++need_locks="$enable_libtool_lock"
++
++
++ case $host_os in
++ rhapsody* | darwin*)
++ if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
++set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_DSYMUTIL+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$DSYMUTIL"; then
++ ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++DSYMUTIL=$ac_cv_prog_DSYMUTIL
++if test -n "$DSYMUTIL"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
++$as_echo "$DSYMUTIL" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_prog_DSYMUTIL"; then
++ ac_ct_DSYMUTIL=$DSYMUTIL
++ # Extract the first word of "dsymutil", so it can be a program name with args.
++set dummy dsymutil; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$ac_ct_DSYMUTIL"; then
++ ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
++if test -n "$ac_ct_DSYMUTIL"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
++$as_echo "$ac_ct_DSYMUTIL" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_ct_DSYMUTIL" = x; then
++ DSYMUTIL=":"
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ DSYMUTIL=$ac_ct_DSYMUTIL
++ fi
++else
++ DSYMUTIL="$ac_cv_prog_DSYMUTIL"
++fi
++
++ if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
++set dummy ${ac_tool_prefix}nmedit; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_NMEDIT+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$NMEDIT"; then
++ ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++NMEDIT=$ac_cv_prog_NMEDIT
++if test -n "$NMEDIT"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
++$as_echo "$NMEDIT" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_prog_NMEDIT"; then
++ ac_ct_NMEDIT=$NMEDIT
++ # Extract the first word of "nmedit", so it can be a program name with args.
++set dummy nmedit; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$ac_ct_NMEDIT"; then
++ ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_ac_ct_NMEDIT="nmedit"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
++if test -n "$ac_ct_NMEDIT"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
++$as_echo "$ac_ct_NMEDIT" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_ct_NMEDIT" = x; then
++ NMEDIT=":"
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ NMEDIT=$ac_ct_NMEDIT
++ fi
++else
++ NMEDIT="$ac_cv_prog_NMEDIT"
++fi
++
++ if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
++set dummy ${ac_tool_prefix}lipo; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_LIPO+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$LIPO"; then
++ ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++LIPO=$ac_cv_prog_LIPO
++if test -n "$LIPO"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
++$as_echo "$LIPO" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_prog_LIPO"; then
++ ac_ct_LIPO=$LIPO
++ # Extract the first word of "lipo", so it can be a program name with args.
++set dummy lipo; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$ac_ct_LIPO"; then
++ ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_ac_ct_LIPO="lipo"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
++if test -n "$ac_ct_LIPO"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
++$as_echo "$ac_ct_LIPO" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_ct_LIPO" = x; then
++ LIPO=":"
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ LIPO=$ac_ct_LIPO
++ fi
++else
++ LIPO="$ac_cv_prog_LIPO"
++fi
++
++ if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
++set dummy ${ac_tool_prefix}otool; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_OTOOL+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$OTOOL"; then
++ ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++OTOOL=$ac_cv_prog_OTOOL
++if test -n "$OTOOL"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
++$as_echo "$OTOOL" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_prog_OTOOL"; then
++ ac_ct_OTOOL=$OTOOL
++ # Extract the first word of "otool", so it can be a program name with args.
++set dummy otool; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$ac_ct_OTOOL"; then
++ ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_ac_ct_OTOOL="otool"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
++if test -n "$ac_ct_OTOOL"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
++$as_echo "$ac_ct_OTOOL" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_ct_OTOOL" = x; then
++ OTOOL=":"
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ OTOOL=$ac_ct_OTOOL
++ fi
++else
++ OTOOL="$ac_cv_prog_OTOOL"
++fi
++
++ if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
++set dummy ${ac_tool_prefix}otool64; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_OTOOL64+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$OTOOL64"; then
++ ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++OTOOL64=$ac_cv_prog_OTOOL64
++if test -n "$OTOOL64"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
++$as_echo "$OTOOL64" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_prog_OTOOL64"; then
++ ac_ct_OTOOL64=$OTOOL64
++ # Extract the first word of "otool64", so it can be a program name with args.
++set dummy otool64; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$ac_ct_OTOOL64"; then
++ ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_ac_ct_OTOOL64="otool64"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
++if test -n "$ac_ct_OTOOL64"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
++$as_echo "$ac_ct_OTOOL64" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_ct_OTOOL64" = x; then
++ OTOOL64=":"
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ OTOOL64=$ac_ct_OTOOL64
++ fi
++else
++ OTOOL64="$ac_cv_prog_OTOOL64"
++fi
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
++$as_echo_n "checking for -single_module linker flag... " >&6; }
++if test "${lt_cv_apple_cc_single_mod+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ lt_cv_apple_cc_single_mod=no
++ if test -z "${LT_MULTI_MODULE}"; then
++ # By default we will add the -single_module flag. You can override
++ # by either setting the environment variable LT_MULTI_MODULE
++ # non-empty at configure time, or by adding -multi_module to the
++ # link flags.
++ rm -rf libconftest.dylib*
++ echo "int foo(void){return 1;}" > conftest.c
++ echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
++-dynamiclib -Wl,-single_module conftest.c" >&5
++ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
++ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
++ _lt_result=$?
++ if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
++ lt_cv_apple_cc_single_mod=yes
++ else
++ cat conftest.err >&5
++ fi
++ rm -rf libconftest.dylib*
++ rm -f conftest.*
++ fi
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
++$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
++$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
++if test "${lt_cv_ld_exported_symbols_list+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ lt_cv_ld_exported_symbols_list=no
++ save_LDFLAGS=$LDFLAGS
++ echo "_main" > conftest.sym
++ LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++int
++main ()
++{
++
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++ lt_cv_ld_exported_symbols_list=yes
++else
++ lt_cv_ld_exported_symbols_list=no
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++ LDFLAGS="$save_LDFLAGS"
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
++$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
++ case $host_os in
++ rhapsody* | darwin1.[012])
++ _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
++ darwin1.*)
++ _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
++ darwin*) # darwin 5.x on
++ # if running on 10.5 or later, the deployment target defaults
++ # to the OS version, if on x86, and 10.4, the deployment
++ # target defaults to 10.4. Don't you love it?
++ case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
++ 10.0,*86*-darwin8*|10.0,*-darwin[91]*)
++ _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
++ 10.[012]*)
++ _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
++ 10.*)
++ _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
++ esac
++ ;;
++ esac
++ if test "$lt_cv_apple_cc_single_mod" = "yes"; then
++ _lt_dar_single_mod='$single_module'
++ fi
++ if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
++ _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
++ else
++ _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
++ fi
++ if test "$DSYMUTIL" != ":"; then
++ _lt_dsymutil='~$DSYMUTIL $lib || :'
++ else
++ _lt_dsymutil=
++ fi
++ ;;
++ esac
++
++ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
++$as_echo_n "checking how to run the C preprocessor... " >&6; }
++# On Suns, sometimes $CPP names a directory.
++if test -n "$CPP" && test -d "$CPP"; then
++ CPP=
++fi
++if test -z "$CPP"; then
++ if test "${ac_cv_prog_CPP+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ # Double quotes because CPP needs to be expanded
++ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
++ do
++ ac_preproc_ok=false
++for ac_c_preproc_warn_flag in '' yes
++do
++ # Use a header file that comes with gcc, so configuring glibc
++ # with a fresh cross-compiler works.
++ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
++ # <limits.h> exists even on freestanding compilers.
++ # On the NeXT, cc -E runs the code through the compiler's parser,
++ # not just through cpp. "Syntax error" is here to catch this case.
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++#ifdef __STDC__
++# include <limits.h>
++#else
++# include <assert.h>
++#endif
++ Syntax error
++_ACEOF
++if ac_fn_c_try_cpp "$LINENO"; then :
++
++else
++ # Broken: fails on valid input.
++continue
++fi
++rm -f conftest.err conftest.$ac_ext
++
++ # OK, works on sane cases. Now check whether nonexistent headers
++ # can be detected and how.
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++#include <ac_nonexistent.h>
++_ACEOF
++if ac_fn_c_try_cpp "$LINENO"; then :
++ # Broken: success on invalid input.
++continue
++else
++ # Passes both tests.
++ac_preproc_ok=:
++break
++fi
++rm -f conftest.err conftest.$ac_ext
++
++done
++# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
++rm -f conftest.err conftest.$ac_ext
++if $ac_preproc_ok; then :
++ break
++fi
++
++ done
++ ac_cv_prog_CPP=$CPP
++
++fi
++ CPP=$ac_cv_prog_CPP
++else
++ ac_cv_prog_CPP=$CPP
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
++$as_echo "$CPP" >&6; }
++ac_preproc_ok=false
++for ac_c_preproc_warn_flag in '' yes
++do
++ # Use a header file that comes with gcc, so configuring glibc
++ # with a fresh cross-compiler works.
++ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
++ # <limits.h> exists even on freestanding compilers.
++ # On the NeXT, cc -E runs the code through the compiler's parser,
++ # not just through cpp. "Syntax error" is here to catch this case.
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++#ifdef __STDC__
++# include <limits.h>
++#else
++# include <assert.h>
++#endif
++ Syntax error
++_ACEOF
++if ac_fn_c_try_cpp "$LINENO"; then :
++
++else
++ # Broken: fails on valid input.
++continue
++fi
++rm -f conftest.err conftest.$ac_ext
++
++ # OK, works on sane cases. Now check whether nonexistent headers
++ # can be detected and how.
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++#include <ac_nonexistent.h>
++_ACEOF
++if ac_fn_c_try_cpp "$LINENO"; then :
++ # Broken: success on invalid input.
++continue
++else
++ # Passes both tests.
++ac_preproc_ok=:
++break
++fi
++rm -f conftest.err conftest.$ac_ext
++
++done
++# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
++rm -f conftest.err conftest.$ac_ext
++if $ac_preproc_ok; then :
++
++else
++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++as_fn_error "C preprocessor \"$CPP\" fails sanity check
++See \`config.log' for more details." "$LINENO" 5; }
++fi
++
++ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
++$as_echo_n "checking for ANSI C header files... " >&6; }
++if test "${ac_cv_header_stdc+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++#include <stdlib.h>
++#include <stdarg.h>
++#include <string.h>
++#include <float.h>
++
++int
++main ()
++{
++
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_compile "$LINENO"; then :
++ ac_cv_header_stdc=yes
++else
++ ac_cv_header_stdc=no
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++
++if test $ac_cv_header_stdc = yes; then
++ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++#include <string.h>
++
++_ACEOF
++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
++ $EGREP "memchr" >/dev/null 2>&1; then :
++
++else
++ ac_cv_header_stdc=no
++fi
++rm -f conftest*
++
++fi
++
++if test $ac_cv_header_stdc = yes; then
++ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++#include <stdlib.h>
++
++_ACEOF
++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
++ $EGREP "free" >/dev/null 2>&1; then :
++
++else
++ ac_cv_header_stdc=no
++fi
++rm -f conftest*
++
++fi
++
++if test $ac_cv_header_stdc = yes; then
++ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
++ if test "$cross_compiling" = yes; then :
++ :
++else
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++#include <ctype.h>
++#include <stdlib.h>
++#if ((' ' & 0x0FF) == 0x020)
++# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
++# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
++#else
++# define ISLOWER(c) \
++ (('a' <= (c) && (c) <= 'i') \
++ || ('j' <= (c) && (c) <= 'r') \
++ || ('s' <= (c) && (c) <= 'z'))
++# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
++#endif
++
++#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
++int
++main ()
++{
++ int i;
++ for (i = 0; i < 256; i++)
++ if (XOR (islower (i), ISLOWER (i))
++ || toupper (i) != TOUPPER (i))
++ return 2;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_run "$LINENO"; then :
++
++else
++ ac_cv_header_stdc=no
++fi
++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
++ conftest.$ac_objext conftest.beam conftest.$ac_ext
++fi
++
++fi
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
++$as_echo "$ac_cv_header_stdc" >&6; }
++if test $ac_cv_header_stdc = yes; then
++
++$as_echo "#define STDC_HEADERS 1" >>confdefs.h
++
++fi
++
++# On IRIX 5.3, sys/types and inttypes.h are conflicting.
++for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
++ inttypes.h stdint.h unistd.h
++do :
++ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
++ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
++"
++eval as_val=\$$as_ac_Header
++ if test "x$as_val" = x""yes; then :
++ cat >>confdefs.h <<_ACEOF
++#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
++_ACEOF
++
++fi
++
++done
++
++
++for ac_header in dlfcn.h
++do :
++ ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
++"
++if test "x$ac_cv_header_dlfcn_h" = x""yes; then :
++ cat >>confdefs.h <<_ACEOF
++#define HAVE_DLFCN_H 1
++_ACEOF
++
++fi
++
++done
++
++
++
++# Set options
++
++
++
++ enable_dlopen=no
++
++
++ enable_win32_dll=no
++
++
++ # Check whether --enable-shared was given.
++if test "${enable_shared+set}" = set; then :
++ enableval=$enable_shared; p=${PACKAGE-default}
++ case $enableval in
++ yes) enable_shared=yes ;;
++ no) enable_shared=no ;;
++ *)
++ enable_shared=no
++ # Look at the argument we got. We use all the common list separators.
++ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
++ for pkg in $enableval; do
++ IFS="$lt_save_ifs"
++ if test "X$pkg" = "X$p"; then
++ enable_shared=yes
++ fi
++ done
++ IFS="$lt_save_ifs"
++ ;;
++ esac
++else
++ enable_shared=yes
++fi
++
++
++
++
++
++
++
++
++
++ # Check whether --enable-static was given.
++if test "${enable_static+set}" = set; then :
++ enableval=$enable_static; p=${PACKAGE-default}
++ case $enableval in
++ yes) enable_static=yes ;;
++ no) enable_static=no ;;
++ *)
++ enable_static=no
++ # Look at the argument we got. We use all the common list separators.
++ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
++ for pkg in $enableval; do
++ IFS="$lt_save_ifs"
++ if test "X$pkg" = "X$p"; then
++ enable_static=yes
++ fi
++ done
++ IFS="$lt_save_ifs"
++ ;;
++ esac
++else
++ enable_static=yes
++fi
++
++
++
++
++
++
++
++
++
++
++# Check whether --with-pic was given.
++if test "${with_pic+set}" = set; then :
++ withval=$with_pic; pic_mode="$withval"
++else
++ pic_mode=default
++fi
++
++
++test -z "$pic_mode" && pic_mode=default
++
++
++
++
++
++
++
++ # Check whether --enable-fast-install was given.
++if test "${enable_fast_install+set}" = set; then :
++ enableval=$enable_fast_install; p=${PACKAGE-default}
++ case $enableval in
++ yes) enable_fast_install=yes ;;
++ no) enable_fast_install=no ;;
++ *)
++ enable_fast_install=no
++ # Look at the argument we got. We use all the common list separators.
++ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
++ for pkg in $enableval; do
++ IFS="$lt_save_ifs"
++ if test "X$pkg" = "X$p"; then
++ enable_fast_install=yes
++ fi
++ done
++ IFS="$lt_save_ifs"
++ ;;
++ esac
++else
++ enable_fast_install=yes
++fi
++
++
++
++
++
++
++
++
++
++
++
++# This can be used to rebuild libtool when needed
++LIBTOOL_DEPS="$ltmain"
++
++# Always use our own libtool.
++LIBTOOL='$(SHELL) $(top_builddir)/libtool'
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++test -z "$LN_S" && LN_S="ln -s"
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++if test -n "${ZSH_VERSION+set}" ; then
++ setopt NO_GLOB_SUBST
++fi
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
++$as_echo_n "checking for objdir... " >&6; }
++if test "${lt_cv_objdir+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ rm -f .libs 2>/dev/null
++mkdir .libs 2>/dev/null
++if test -d .libs; then
++ lt_cv_objdir=.libs
++else
++ # MS-DOS does not allow filenames that begin with a dot.
++ lt_cv_objdir=_libs
++fi
++rmdir .libs 2>/dev/null
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
++$as_echo "$lt_cv_objdir" >&6; }
++objdir=$lt_cv_objdir
++
++
++
++
++
++cat >>confdefs.h <<_ACEOF
++#define LT_OBJDIR "$lt_cv_objdir/"
++_ACEOF
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++case $host_os in
++aix3*)
++ # AIX sometimes has problems with the GCC collect2 program. For some
++ # reason, if we set the COLLECT_NAMES environment variable, the problems
++ # vanish in a puff of smoke.
++ if test "X${COLLECT_NAMES+set}" != Xset; then
++ COLLECT_NAMES=
++ export COLLECT_NAMES
++ fi
++ ;;
++esac
++
++# Sed substitution that helps us do robust quoting. It backslashifies
++# metacharacters that are still active within double-quoted strings.
++sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
++
++# Same as above, but do not quote variable references.
++double_quote_subst='s/\(["`\\]\)/\\\1/g'
++
++# Sed substitution to delay expansion of an escaped shell variable in a
++# double_quote_subst'ed string.
++delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
++
++# Sed substitution to delay expansion of an escaped single quote.
++delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
++
++# Sed substitution to avoid accidental globbing in evaled expressions
++no_glob_subst='s/\*/\\\*/g'
++
++# Global variables:
++ofile=libtool
++can_build_shared=yes
++
++# All known linkers require a `.a' archive for static linking (except MSVC,
++# which needs '.lib').
++libext=a
++
++with_gnu_ld="$lt_cv_prog_gnu_ld"
++
++old_CC="$CC"
++old_CFLAGS="$CFLAGS"
++
++# Set sane defaults for various variables
++test -z "$CC" && CC=cc
++test -z "$LTCC" && LTCC=$CC
++test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
++test -z "$LD" && LD=ld
++test -z "$ac_objext" && ac_objext=o
++
++for cc_temp in $compiler""; do
++ case $cc_temp in
++ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
++ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
++ \-*) ;;
++ *) break;;
++ esac
++done
++cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
++
++
++# Only perform the check for file, if the check method requires it
++test -z "$MAGIC_CMD" && MAGIC_CMD=file
++case $deplibs_check_method in
++file_magic*)
++ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
++$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
++if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $MAGIC_CMD in
++[\\/*] | ?:[\\/]*)
++ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
++ ;;
++*)
++ lt_save_MAGIC_CMD="$MAGIC_CMD"
++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
++ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
++ for ac_dir in $ac_dummy; do
++ IFS="$lt_save_ifs"
++ test -z "$ac_dir" && ac_dir=.
++ if test -f $ac_dir/${ac_tool_prefix}file; then
++ lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
++ if test -n "$file_magic_test_file"; then
++ case $deplibs_check_method in
++ "file_magic "*)
++ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
++ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
++ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
++ $EGREP "$file_magic_regex" > /dev/null; then
++ :
++ else
++ cat <<_LT_EOF 1>&2
++
++*** Warning: the command libtool uses to detect shared libraries,
++*** $file_magic_cmd, produces output that libtool cannot recognize.
++*** The result is that libtool may fail to recognize shared libraries
++*** as such. This will affect the creation of libtool libraries that
++*** depend on shared libraries, but programs linked with such libtool
++*** libraries will work regardless of this problem. Nevertheless, you
++*** may want to report the problem to your system manager and/or to
++*** bug-libtool@gnu.org
++
++_LT_EOF
++ fi ;;
++ esac
++ fi
++ break
++ fi
++ done
++ IFS="$lt_save_ifs"
++ MAGIC_CMD="$lt_save_MAGIC_CMD"
++ ;;
++esac
++fi
++
++MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
++if test -n "$MAGIC_CMD"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
++$as_echo "$MAGIC_CMD" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++
++
++
++if test -z "$lt_cv_path_MAGIC_CMD"; then
++ if test -n "$ac_tool_prefix"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
++$as_echo_n "checking for file... " >&6; }
++if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $MAGIC_CMD in
++[\\/*] | ?:[\\/]*)
++ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
++ ;;
++*)
++ lt_save_MAGIC_CMD="$MAGIC_CMD"
++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
++ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
++ for ac_dir in $ac_dummy; do
++ IFS="$lt_save_ifs"
++ test -z "$ac_dir" && ac_dir=.
++ if test -f $ac_dir/file; then
++ lt_cv_path_MAGIC_CMD="$ac_dir/file"
++ if test -n "$file_magic_test_file"; then
++ case $deplibs_check_method in
++ "file_magic "*)
++ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
++ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
++ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
++ $EGREP "$file_magic_regex" > /dev/null; then
++ :
++ else
++ cat <<_LT_EOF 1>&2
++
++*** Warning: the command libtool uses to detect shared libraries,
++*** $file_magic_cmd, produces output that libtool cannot recognize.
++*** The result is that libtool may fail to recognize shared libraries
++*** as such. This will affect the creation of libtool libraries that
++*** depend on shared libraries, but programs linked with such libtool
++*** libraries will work regardless of this problem. Nevertheless, you
++*** may want to report the problem to your system manager and/or to
++*** bug-libtool@gnu.org
++
++_LT_EOF
++ fi ;;
++ esac
++ fi
++ break
++ fi
++ done
++ IFS="$lt_save_ifs"
++ MAGIC_CMD="$lt_save_MAGIC_CMD"
++ ;;
++esac
++fi
++
++MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
++if test -n "$MAGIC_CMD"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
++$as_echo "$MAGIC_CMD" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++ else
++ MAGIC_CMD=:
++ fi
++fi
++
++ fi
++ ;;
++esac
++
++# Use C for the default configuration in the libtool script
++
++lt_save_CC="$CC"
++ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++
++
++# Source file extension for C test sources.
++ac_ext=c
++
++# Object file extension for compiled C test sources.
++objext=o
++objext=$objext
++
++# Code to be used in simple compile tests
++lt_simple_compile_test_code="int some_variable = 0;"
++
++# Code to be used in simple link tests
++lt_simple_link_test_code='int main(){return(0);}'
++
++
++
++
++
++
++
++# If no C compiler was specified, use CC.
++LTCC=${LTCC-"$CC"}
++
++# If no C compiler flags were specified, use CFLAGS.
++LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
++
++# Allow CC to be a program name with arguments.
++compiler=$CC
++
++# Save the default compiler, since it gets overwritten when the other
++# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
++compiler_DEFAULT=$CC
++
++# save warnings/boilerplate of simple test code
++ac_outfile=conftest.$ac_objext
++echo "$lt_simple_compile_test_code" >conftest.$ac_ext
++eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
++_lt_compiler_boilerplate=`cat conftest.err`
++$RM conftest*
++
++ac_outfile=conftest.$ac_objext
++echo "$lt_simple_link_test_code" >conftest.$ac_ext
++eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
++_lt_linker_boilerplate=`cat conftest.err`
++$RM -r conftest*
++
++
++## CAVEAT EMPTOR:
++## There is no encapsulation within the following macros, do not change
++## the running order or otherwise move them around unless you know exactly
++## what you are doing...
++if test -n "$compiler"; then
++
++lt_prog_compiler_no_builtin_flag=
++
++if test "$GCC" = yes; then
++ lt_prog_compiler_no_builtin_flag=' -fno-builtin'
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
++$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
++if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ lt_cv_prog_compiler_rtti_exceptions=no
++ ac_outfile=conftest.$ac_objext
++ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
++ lt_compiler_flag="-fno-rtti -fno-exceptions"
++ # Insert the option either (1) after the last *FLAGS variable, or
++ # (2) before a word containing "conftest.", or (3) at the end.
++ # Note that $ac_compile itself does not contain backslashes and begins
++ # with a dollar sign (not a hyphen), so the echo should work correctly.
++ # The option is referenced via a variable to avoid confusing sed.
++ lt_compile=`echo "$ac_compile" | $SED \
++ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
++ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
++ -e 's:$: $lt_compiler_flag:'`
++ (eval echo "\"\$as_me:7486: $lt_compile\"" >&5)
++ (eval "$lt_compile" 2>conftest.err)
++ ac_status=$?
++ cat conftest.err >&5
++ echo "$as_me:7490: \$? = $ac_status" >&5
++ if (exit $ac_status) && test -s "$ac_outfile"; then
++ # The compiler can only warn and ignore the option if not recognized
++ # So say no if there are warnings other than the usual output.
++ $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
++ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
++ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
++ lt_cv_prog_compiler_rtti_exceptions=yes
++ fi
++ fi
++ $RM conftest*
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
++$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
++
++if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
++ lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
++else
++ :
++fi
++
++fi
++
++
++
++
++
++
++ lt_prog_compiler_wl=
++lt_prog_compiler_pic=
++lt_prog_compiler_static=
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
++$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
++
++ if test "$GCC" = yes; then
++ lt_prog_compiler_wl='-Wl,'
++ lt_prog_compiler_static='-static'
++
++ case $host_os in
++ aix*)
++ # All AIX code is PIC.
++ if test "$host_cpu" = ia64; then
++ # AIX 5 now supports IA64 processor
++ lt_prog_compiler_static='-Bstatic'
++ fi
++ ;;
++
++ amigaos*)
++ case $host_cpu in
++ powerpc)
++ # see comment about AmigaOS4 .so support
++ lt_prog_compiler_pic='-fPIC'
++ ;;
++ m68k)
++ # FIXME: we need at least 68020 code to build shared libraries, but
++ # adding the `-m68020' flag to GCC prevents building anything better,
++ # like `-m68040'.
++ lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
++ ;;
++ esac
++ ;;
++
++ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
++ # PIC is the default for these OSes.
++ ;;
++
++ mingw* | cygwin* | pw32* | os2* | cegcc*)
++ # This hack is so that the source file can tell whether it is being
++ # built for inclusion in a dll (and should export symbols for example).
++ # Although the cygwin gcc ignores -fPIC, still need this for old-style
++ # (--disable-auto-import) libraries
++ lt_prog_compiler_pic='-DDLL_EXPORT'
++ ;;
++
++ darwin* | rhapsody*)
++ # PIC is the default on this platform
++ # Common symbols not allowed in MH_DYLIB files
++ lt_prog_compiler_pic='-fno-common'
++ ;;
++
++ hpux*)
++ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
++ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
++ # sets the default TLS model and affects inlining.
++ case $host_cpu in
++ hppa*64*)
++ # +Z the default
++ ;;
++ *)
++ lt_prog_compiler_pic='-fPIC'
++ ;;
++ esac
++ ;;
++
++ interix[3-9]*)
++ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
++ # Instead, we relocate shared libraries at runtime.
++ ;;
++
++ msdosdjgpp*)
++ # Just because we use GCC doesn't mean we suddenly get shared libraries
++ # on systems that don't support them.
++ lt_prog_compiler_can_build_shared=no
++ enable_shared=no
++ ;;
++
++ *nto* | *qnx*)
++ # QNX uses GNU C++, but need to define -shared option too, otherwise
++ # it will coredump.
++ lt_prog_compiler_pic='-fPIC -shared'
++ ;;
++
++ sysv4*MP*)
++ if test -d /usr/nec; then
++ lt_prog_compiler_pic=-Kconform_pic
++ fi
++ ;;
++
++ *)
++ lt_prog_compiler_pic='-fPIC'
++ ;;
++ esac
++ else
++ # PORTME Check for flag to pass linker flags through the system compiler.
++ case $host_os in
++ aix*)
++ lt_prog_compiler_wl='-Wl,'
++ if test "$host_cpu" = ia64; then
++ # AIX 5 now supports IA64 processor
++ lt_prog_compiler_static='-Bstatic'
++ else
++ lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
++ fi
++ ;;
++
++ mingw* | cygwin* | pw32* | os2* | cegcc*)
++ # This hack is so that the source file can tell whether it is being
++ # built for inclusion in a dll (and should export symbols for example).
++ lt_prog_compiler_pic='-DDLL_EXPORT'
++ ;;
++
++ hpux9* | hpux10* | hpux11*)
++ lt_prog_compiler_wl='-Wl,'
++ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
++ # not for PA HP-UX.
++ case $host_cpu in
++ hppa*64*|ia64*)
++ # +Z the default
++ ;;
++ *)
++ lt_prog_compiler_pic='+Z'
++ ;;
++ esac
++ # Is there a better lt_prog_compiler_static that works with the bundled CC?
++ lt_prog_compiler_static='${wl}-a ${wl}archive'
++ ;;
++
++ irix5* | irix6* | nonstopux*)
++ lt_prog_compiler_wl='-Wl,'
++ # PIC (with -KPIC) is the default.
++ lt_prog_compiler_static='-non_shared'
++ ;;
++
++ linux* | k*bsd*-gnu)
++ case $cc_basename in
++ # old Intel for x86_64 which still supported -KPIC.
++ ecc*)
++ lt_prog_compiler_wl='-Wl,'
++ lt_prog_compiler_pic='-KPIC'
++ lt_prog_compiler_static='-static'
++ ;;
++ # icc used to be incompatible with GCC.
++ # ICC 10 doesn't accept -KPIC any more.
++ icc* | ifort*)
++ lt_prog_compiler_wl='-Wl,'
++ lt_prog_compiler_pic='-fPIC'
++ lt_prog_compiler_static='-static'
++ ;;
++ # Lahey Fortran 8.1.
++ lf95*)
++ lt_prog_compiler_wl='-Wl,'
++ lt_prog_compiler_pic='--shared'
++ lt_prog_compiler_static='--static'
++ ;;
++ pgcc* | pgf77* | pgf90* | pgf95*)
++ # Portland Group compilers (*not* the Pentium gcc compiler,
++ # which looks to be a dead project)
++ lt_prog_compiler_wl='-Wl,'
++ lt_prog_compiler_pic='-fpic'
++ lt_prog_compiler_static='-Bstatic'
++ ;;
++ ccc*)
++ lt_prog_compiler_wl='-Wl,'
++ # All Alpha code is PIC.
++ lt_prog_compiler_static='-non_shared'
++ ;;
++ xl*)
++ # IBM XL C 8.0/Fortran 10.1 on PPC
++ lt_prog_compiler_wl='-Wl,'
++ lt_prog_compiler_pic='-qpic'
++ lt_prog_compiler_static='-qstaticlink'
++ ;;
++ *)
++ case `$CC -V 2>&1 | sed 5q` in
++ *Sun\ C*)
++ # Sun C 5.9
++ lt_prog_compiler_pic='-KPIC'
++ lt_prog_compiler_static='-Bstatic'
++ lt_prog_compiler_wl='-Wl,'
++ ;;
++ *Sun\ F*)
++ # Sun Fortran 8.3 passes all unrecognized flags to the linker
++ lt_prog_compiler_pic='-KPIC'
++ lt_prog_compiler_static='-Bstatic'
++ lt_prog_compiler_wl=''
++ ;;
++ esac
++ ;;
++ esac
++ ;;
++
++ newsos6)
++ lt_prog_compiler_pic='-KPIC'
++ lt_prog_compiler_static='-Bstatic'
++ ;;
++
++ *nto* | *qnx*)
++ # QNX uses GNU C++, but need to define -shared option too, otherwise
++ # it will coredump.
++ lt_prog_compiler_pic='-fPIC -shared'
++ ;;
++
++ osf3* | osf4* | osf5*)
++ lt_prog_compiler_wl='-Wl,'
++ # All OSF/1 code is PIC.
++ lt_prog_compiler_static='-non_shared'
++ ;;
++
++ rdos*)
++ lt_prog_compiler_static='-non_shared'
++ ;;
++
++ solaris*)
++ lt_prog_compiler_pic='-KPIC'
++ lt_prog_compiler_static='-Bstatic'
++ case $cc_basename in
++ f77* | f90* | f95*)
++ lt_prog_compiler_wl='-Qoption ld ';;
++ *)
++ lt_prog_compiler_wl='-Wl,';;
++ esac
++ ;;
++
++ sunos4*)
++ lt_prog_compiler_wl='-Qoption ld '
++ lt_prog_compiler_pic='-PIC'
++ lt_prog_compiler_static='-Bstatic'
++ ;;
++
++ sysv4 | sysv4.2uw2* | sysv4.3*)
++ lt_prog_compiler_wl='-Wl,'
++ lt_prog_compiler_pic='-KPIC'
++ lt_prog_compiler_static='-Bstatic'
++ ;;
++
++ sysv4*MP*)
++ if test -d /usr/nec ;then
++ lt_prog_compiler_pic='-Kconform_pic'
++ lt_prog_compiler_static='-Bstatic'
++ fi
++ ;;
++
++ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
++ lt_prog_compiler_wl='-Wl,'
++ lt_prog_compiler_pic='-KPIC'
++ lt_prog_compiler_static='-Bstatic'
++ ;;
++
++ unicos*)
++ lt_prog_compiler_wl='-Wl,'
++ lt_prog_compiler_can_build_shared=no
++ ;;
++
++ uts4*)
++ lt_prog_compiler_pic='-pic'
++ lt_prog_compiler_static='-Bstatic'
++ ;;
++
++ *)
++ lt_prog_compiler_can_build_shared=no
++ ;;
++ esac
++ fi
++
++case $host_os in
++ # For platforms which do not support PIC, -DPIC is meaningless:
++ *djgpp*)
++ lt_prog_compiler_pic=
++ ;;
++ *)
++ lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
++ ;;
++esac
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5
++$as_echo "$lt_prog_compiler_pic" >&6; }
++
++
++
++
++
++
++#
++# Check to make sure the PIC flag actually works.
++#
++if test -n "$lt_prog_compiler_pic"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
++$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
++if test "${lt_cv_prog_compiler_pic_works+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ lt_cv_prog_compiler_pic_works=no
++ ac_outfile=conftest.$ac_objext
++ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
++ lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
++ # Insert the option either (1) after the last *FLAGS variable, or
++ # (2) before a word containing "conftest.", or (3) at the end.
++ # Note that $ac_compile itself does not contain backslashes and begins
++ # with a dollar sign (not a hyphen), so the echo should work correctly.
++ # The option is referenced via a variable to avoid confusing sed.
++ lt_compile=`echo "$ac_compile" | $SED \
++ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
++ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
++ -e 's:$: $lt_compiler_flag:'`
++ (eval echo "\"\$as_me:7825: $lt_compile\"" >&5)
++ (eval "$lt_compile" 2>conftest.err)
++ ac_status=$?
++ cat conftest.err >&5
++ echo "$as_me:7829: \$? = $ac_status" >&5
++ if (exit $ac_status) && test -s "$ac_outfile"; then
++ # The compiler can only warn and ignore the option if not recognized
++ # So say no if there are warnings other than the usual output.
++ $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
++ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
++ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
++ lt_cv_prog_compiler_pic_works=yes
++ fi
++ fi
++ $RM conftest*
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
++$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
++
++if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
++ case $lt_prog_compiler_pic in
++ "" | " "*) ;;
++ *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
++ esac
++else
++ lt_prog_compiler_pic=
++ lt_prog_compiler_can_build_shared=no
++fi
++
++fi
++
++
++
++
++
++
++#
++# Check to make sure the static flag actually works.
++#
++wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
++$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
++if test "${lt_cv_prog_compiler_static_works+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ lt_cv_prog_compiler_static_works=no
++ save_LDFLAGS="$LDFLAGS"
++ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
++ echo "$lt_simple_link_test_code" > conftest.$ac_ext
++ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
++ # The linker can only warn and ignore the option if not recognized
++ # So say no if there are warnings
++ if test -s conftest.err; then
++ # Append any errors to the config.log.
++ cat conftest.err 1>&5
++ $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
++ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
++ if diff conftest.exp conftest.er2 >/dev/null; then
++ lt_cv_prog_compiler_static_works=yes
++ fi
++ else
++ lt_cv_prog_compiler_static_works=yes
++ fi
++ fi
++ $RM -r conftest*
++ LDFLAGS="$save_LDFLAGS"
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
++$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
++
++if test x"$lt_cv_prog_compiler_static_works" = xyes; then
++ :
++else
++ lt_prog_compiler_static=
++fi
++
++
++
++
++
++
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
++$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
++if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ lt_cv_prog_compiler_c_o=no
++ $RM -r conftest 2>/dev/null
++ mkdir conftest
++ cd conftest
++ mkdir out
++ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
++
++ lt_compiler_flag="-o out/conftest2.$ac_objext"
++ # Insert the option either (1) after the last *FLAGS variable, or
++ # (2) before a word containing "conftest.", or (3) at the end.
++ # Note that $ac_compile itself does not contain backslashes and begins
++ # with a dollar sign (not a hyphen), so the echo should work correctly.
++ lt_compile=`echo "$ac_compile" | $SED \
++ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
++ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
++ -e 's:$: $lt_compiler_flag:'`
++ (eval echo "\"\$as_me:7930: $lt_compile\"" >&5)
++ (eval "$lt_compile" 2>out/conftest.err)
++ ac_status=$?
++ cat out/conftest.err >&5
++ echo "$as_me:7934: \$? = $ac_status" >&5
++ if (exit $ac_status) && test -s out/conftest2.$ac_objext
++ then
++ # The compiler can only warn and ignore the option if not recognized
++ # So say no if there are warnings
++ $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
++ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
++ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
++ lt_cv_prog_compiler_c_o=yes
++ fi
++ fi
++ chmod u+w . 2>&5
++ $RM conftest*
++ # SGI C++ compiler will create directory out/ii_files/ for
++ # template instantiation
++ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
++ $RM out/* && rmdir out
++ cd ..
++ $RM -r conftest
++ $RM conftest*
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
++$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
++
++
++
++
++
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
++$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
++if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ lt_cv_prog_compiler_c_o=no
++ $RM -r conftest 2>/dev/null
++ mkdir conftest
++ cd conftest
++ mkdir out
++ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
++
++ lt_compiler_flag="-o out/conftest2.$ac_objext"
++ # Insert the option either (1) after the last *FLAGS variable, or
++ # (2) before a word containing "conftest.", or (3) at the end.
++ # Note that $ac_compile itself does not contain backslashes and begins
++ # with a dollar sign (not a hyphen), so the echo should work correctly.
++ lt_compile=`echo "$ac_compile" | $SED \
++ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
++ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
++ -e 's:$: $lt_compiler_flag:'`
++ (eval echo "\"\$as_me:7985: $lt_compile\"" >&5)
++ (eval "$lt_compile" 2>out/conftest.err)
++ ac_status=$?
++ cat out/conftest.err >&5
++ echo "$as_me:7989: \$? = $ac_status" >&5
++ if (exit $ac_status) && test -s out/conftest2.$ac_objext
++ then
++ # The compiler can only warn and ignore the option if not recognized
++ # So say no if there are warnings
++ $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
++ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
++ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
++ lt_cv_prog_compiler_c_o=yes
++ fi
++ fi
++ chmod u+w . 2>&5
++ $RM conftest*
++ # SGI C++ compiler will create directory out/ii_files/ for
++ # template instantiation
++ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
++ $RM out/* && rmdir out
++ cd ..
++ $RM -r conftest
++ $RM conftest*
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
++$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
++
++
++
++
++hard_links="nottested"
++if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
++ # do not overwrite the value of need_locks provided by the user
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
++$as_echo_n "checking if we can lock with hard links... " >&6; }
++ hard_links=yes
++ $RM conftest*
++ ln conftest.a conftest.b 2>/dev/null && hard_links=no
++ touch conftest.a
++ ln conftest.a conftest.b 2>&5 || hard_links=no
++ ln conftest.a conftest.b 2>/dev/null && hard_links=no
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
++$as_echo "$hard_links" >&6; }
++ if test "$hard_links" = no; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
++$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
++ need_locks=warn
++ fi
++else
++ need_locks=no
++fi
++
++
++
++
++
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
++$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
++
++ runpath_var=
++ allow_undefined_flag=
++ always_export_symbols=no
++ archive_cmds=
++ archive_expsym_cmds=
++ compiler_needs_object=no
++ enable_shared_with_static_runtimes=no
++ export_dynamic_flag_spec=
++ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
++ hardcode_automatic=no
++ hardcode_direct=no
++ hardcode_direct_absolute=no
++ hardcode_libdir_flag_spec=
++ hardcode_libdir_flag_spec_ld=
++ hardcode_libdir_separator=
++ hardcode_minus_L=no
++ hardcode_shlibpath_var=unsupported
++ inherit_rpath=no
++ link_all_deplibs=unknown
++ module_cmds=
++ module_expsym_cmds=
++ old_archive_from_new_cmds=
++ old_archive_from_expsyms_cmds=
++ thread_safe_flag_spec=
++ whole_archive_flag_spec=
++ # include_expsyms should be a list of space-separated symbols to be *always*
++ # included in the symbol list
++ include_expsyms=
++ # exclude_expsyms can be an extended regexp of symbols to exclude
++ # it will be wrapped by ` (' and `)$', so one must not match beginning or
++ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
++ # as well as any symbol that contains `d'.
++ exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
++ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
++ # platforms (ab)use it in PIC code, but their linkers get confused if
++ # the symbol is explicitly referenced. Since portable code cannot
++ # rely on this symbol name, it's probably fine to never include it in
++ # preloaded symbol tables.
++ # Exclude shared library initialization/finalization symbols.
++ extract_expsyms_cmds=
++
++ case $host_os in
++ cygwin* | mingw* | pw32* | cegcc*)
++ # FIXME: the MSVC++ port hasn't been tested in a loooong time
++ # When not using gcc, we currently assume that we are using
++ # Microsoft Visual C++.
++ if test "$GCC" != yes; then
++ with_gnu_ld=no
++ fi
++ ;;
++ interix*)
++ # we just hope/assume this is gcc and not c89 (= MSVC++)
++ with_gnu_ld=yes
++ ;;
++ openbsd*)
++ with_gnu_ld=no
++ ;;
++ linux* | k*bsd*-gnu)
++ link_all_deplibs=no
++ ;;
++ esac
++
++ ld_shlibs=yes
++ if test "$with_gnu_ld" = yes; then
++ # If archive_cmds runs LD, not CC, wlarc should be empty
++ wlarc='${wl}'
++
++ # Set some defaults for GNU ld with shared library support. These
++ # are reset later if shared libraries are not supported. Putting them
++ # here allows them to be overridden if necessary.
++ runpath_var=LD_RUN_PATH
++ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
++ export_dynamic_flag_spec='${wl}--export-dynamic'
++ # ancient GNU ld didn't support --whole-archive et. al.
++ if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
++ whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
++ else
++ whole_archive_flag_spec=
++ fi
++ supports_anon_versioning=no
++ case `$LD -v 2>&1` in
++ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
++ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
++ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
++ *\ 2.11.*) ;; # other 2.11 versions
++ *) supports_anon_versioning=yes ;;
++ esac
++
++ # See if GNU ld supports shared libraries.
++ case $host_os in
++ aix[3-9]*)
++ # On AIX/PPC, the GNU linker is very broken
++ if test "$host_cpu" != ia64; then
++ ld_shlibs=no
++ cat <<_LT_EOF 1>&2
++
++*** Warning: the GNU linker, at least up to release 2.9.1, is reported
++*** to be unable to reliably create shared libraries on AIX.
++*** Therefore, libtool is disabling shared libraries support. If you
++*** really care for shared libraries, you may want to modify your PATH
++*** so that a non-GNU linker is found, and then restart.
++
++_LT_EOF
++ fi
++ ;;
++
++ amigaos*)
++ case $host_cpu in
++ powerpc)
++ # see comment about AmigaOS4 .so support
++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
++ archive_expsym_cmds=''
++ ;;
++ m68k)
++ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
++ hardcode_libdir_flag_spec='-L$libdir'
++ hardcode_minus_L=yes
++ ;;
++ esac
++ ;;
++
++ beos*)
++ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
++ allow_undefined_flag=unsupported
++ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
++ # support --undefined. This deserves some investigation. FIXME
++ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
++ else
++ ld_shlibs=no
++ fi
++ ;;
++
++ cygwin* | mingw* | pw32* | cegcc*)
++ # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
++ # as there is no search path for DLLs.
++ hardcode_libdir_flag_spec='-L$libdir'
++ allow_undefined_flag=unsupported
++ always_export_symbols=no
++ enable_shared_with_static_runtimes=yes
++ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
++
++ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
++ # If the export-symbols file already is a .def file (1st line
++ # is EXPORTS), use it as is; otherwise, prepend...
++ archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
++ cp $export_symbols $output_objdir/$soname.def;
++ else
++ echo EXPORTS > $output_objdir/$soname.def;
++ cat $export_symbols >> $output_objdir/$soname.def;
++ fi~
++ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
++ else
++ ld_shlibs=no
++ fi
++ ;;
++
++ interix[3-9]*)
++ hardcode_direct=no
++ hardcode_shlibpath_var=no
++ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
++ export_dynamic_flag_spec='${wl}-E'
++ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
++ # Instead, shared libraries are loaded at an image base (0x10000000 by
++ # default) and relocated if they conflict, which is a slow very memory
++ # consuming and fragmenting process. To avoid this, we pick a random,
++ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
++ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
++ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
++ archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
++ ;;
++
++ gnu* | linux* | tpf* | k*bsd*-gnu)
++ tmp_diet=no
++ if test "$host_os" = linux-dietlibc; then
++ case $cc_basename in
++ diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
++ esac
++ fi
++ if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
++ && test "$tmp_diet" = no
++ then
++ tmp_addflag=
++ tmp_sharedflag='-shared'
++ case $cc_basename,$host_cpu in
++ pgcc*) # Portland Group C compiler
++ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
++ tmp_addflag=' $pic_flag'
++ ;;
++ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
++ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
++ tmp_addflag=' $pic_flag -Mnomain' ;;
++ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
++ tmp_addflag=' -i_dynamic' ;;
++ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
++ tmp_addflag=' -i_dynamic -nofor_main' ;;
++ ifc* | ifort*) # Intel Fortran compiler
++ tmp_addflag=' -nofor_main' ;;
++ lf95*) # Lahey Fortran 8.1
++ whole_archive_flag_spec=
++ tmp_sharedflag='--shared' ;;
++ xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
++ tmp_sharedflag='-qmkshrobj'
++ tmp_addflag= ;;
++ esac
++ case `$CC -V 2>&1 | sed 5q` in
++ *Sun\ C*) # Sun C 5.9
++ whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
++ compiler_needs_object=yes
++ tmp_sharedflag='-G' ;;
++ *Sun\ F*) # Sun Fortran 8.3
++ tmp_sharedflag='-G' ;;
++ esac
++ archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
++
++ if test "x$supports_anon_versioning" = xyes; then
++ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
++ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
++ echo "local: *; };" >> $output_objdir/$libname.ver~
++ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
++ fi
++
++ case $cc_basename in
++ xlf*)
++ # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
++ whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
++ hardcode_libdir_flag_spec=
++ hardcode_libdir_flag_spec_ld='-rpath $libdir'
++ archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
++ if test "x$supports_anon_versioning" = xyes; then
++ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
++ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
++ echo "local: *; };" >> $output_objdir/$libname.ver~
++ $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
++ fi
++ ;;
++ esac
++ else
++ ld_shlibs=no
++ fi
++ ;;
++
++ netbsd* | netbsdelf*-gnu)
++ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
++ archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
++ wlarc=
++ else
++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
++ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
++ fi
++ ;;
++
++ solaris*)
++ if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
++ ld_shlibs=no
++ cat <<_LT_EOF 1>&2
++
++*** Warning: The releases 2.8.* of the GNU linker cannot reliably
++*** create shared libraries on Solaris systems. Therefore, libtool
++*** is disabling shared libraries support. We urge you to upgrade GNU
++*** binutils to release 2.9.1 or newer. Another option is to modify
++*** your PATH or compiler configuration so that the native linker is
++*** used, and then restart.
++
++_LT_EOF
++ elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
++ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
++ else
++ ld_shlibs=no
++ fi
++ ;;
++
++ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
++ case `$LD -v 2>&1` in
++ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
++ ld_shlibs=no
++ cat <<_LT_EOF 1>&2
++
++*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
++*** reliably create shared libraries on SCO systems. Therefore, libtool
++*** is disabling shared libraries support. We urge you to upgrade GNU
++*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
++*** your PATH or compiler configuration so that the native linker is
++*** used, and then restart.
++
++_LT_EOF
++ ;;
++ *)
++ # For security reasons, it is highly recommended that you always
++ # use absolute paths for naming shared libraries, and exclude the
++ # DT_RUNPATH tag from executables and libraries. But doing so
++ # requires that you compile everything twice, which is a pain.
++ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
++ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
++ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
++ else
++ ld_shlibs=no
++ fi
++ ;;
++ esac
++ ;;
++
++ sunos4*)
++ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
++ wlarc=
++ hardcode_direct=yes
++ hardcode_shlibpath_var=no
++ ;;
++
++ *)
++ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
++ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
++ else
++ ld_shlibs=no
++ fi
++ ;;
++ esac
++
++ if test "$ld_shlibs" = no; then
++ runpath_var=
++ hardcode_libdir_flag_spec=
++ export_dynamic_flag_spec=
++ whole_archive_flag_spec=
++ fi
++ else
++ # PORTME fill in a description of your system's linker (not GNU ld)
++ case $host_os in
++ aix3*)
++ allow_undefined_flag=unsupported
++ always_export_symbols=yes
++ archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
++ # Note: this linker hardcodes the directories in LIBPATH if there
++ # are no directories specified by -L.
++ hardcode_minus_L=yes
++ if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
++ # Neither direct hardcoding nor static linking is supported with a
++ # broken collect2.
++ hardcode_direct=unsupported
++ fi
++ ;;
++
++ aix[4-9]*)
++ if test "$host_cpu" = ia64; then
++ # On IA64, the linker does run time linking by default, so we don't
++ # have to do anything special.
++ aix_use_runtimelinking=no
++ exp_sym_flag='-Bexport'
++ no_entry_flag=""
++ else
++ # If we're using GNU nm, then we don't want the "-C" option.
++ # -C means demangle to AIX nm, but means don't demangle with GNU nm
++ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
++ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
++ else
++ export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
++ fi
++ aix_use_runtimelinking=no
++
++ # Test if we are trying to use run time linking or normal
++ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
++ # need to do runtime linking.
++ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
++ for ld_flag in $LDFLAGS; do
++ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
++ aix_use_runtimelinking=yes
++ break
++ fi
++ done
++ ;;
++ esac
++
++ exp_sym_flag='-bexport'
++ no_entry_flag='-bnoentry'
++ fi
++
++ # When large executables or shared objects are built, AIX ld can
++ # have problems creating the table of contents. If linking a library
++ # or program results in "error TOC overflow" add -mminimal-toc to
++ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
++ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
++
++ archive_cmds=''
++ hardcode_direct=yes
++ hardcode_direct_absolute=yes
++ hardcode_libdir_separator=':'
++ link_all_deplibs=yes
++ file_list_spec='${wl}-f,'
++
++ if test "$GCC" = yes; then
++ case $host_os in aix4.[012]|aix4.[012].*)
++ # We only want to do this on AIX 4.2 and lower, the check
++ # below for broken collect2 doesn't work under 4.3+
++ collect2name=`${CC} -print-prog-name=collect2`
++ if test -f "$collect2name" &&
++ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
++ then
++ # We have reworked collect2
++ :
++ else
++ # We have old collect2
++ hardcode_direct=unsupported
++ # It fails to find uninstalled libraries when the uninstalled
++ # path is not listed in the libpath. Setting hardcode_minus_L
++ # to unsupported forces relinking
++ hardcode_minus_L=yes
++ hardcode_libdir_flag_spec='-L$libdir'
++ hardcode_libdir_separator=
++ fi
++ ;;
++ esac
++ shared_flag='-shared'
++ if test "$aix_use_runtimelinking" = yes; then
++ shared_flag="$shared_flag "'${wl}-G'
++ fi
++ link_all_deplibs=no
++ else
++ # not using gcc
++ if test "$host_cpu" = ia64; then
++ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
++ # chokes on -Wl,-G. The following line is correct:
++ shared_flag='-G'
++ else
++ if test "$aix_use_runtimelinking" = yes; then
++ shared_flag='${wl}-G'
++ else
++ shared_flag='${wl}-bM:SRE'
++ fi
++ fi
++ fi
++
++ export_dynamic_flag_spec='${wl}-bexpall'
++ # It seems that -bexpall does not export symbols beginning with
++ # underscore (_), so it is better to generate a list of symbols to export.
++ always_export_symbols=yes
++ if test "$aix_use_runtimelinking" = yes; then
++ # Warning - without using the other runtime loading flags (-brtl),
++ # -berok will link without error, but may produce a broken library.
++ allow_undefined_flag='-berok'
++ # Determine the default libpath from the value encoded in an
++ # empty executable.
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++int
++main ()
++{
++
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++
++lt_aix_libpath_sed='
++ /Import File Strings/,/^$/ {
++ /^0/ {
++ s/^0 *\(.*\)$/\1/
++ p
++ }
++ }'
++aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
++# Check for a 64-bit object if we didn't find anything.
++if test -z "$aix_libpath"; then
++ aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
++fi
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
++
++ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
++ archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
++ else
++ if test "$host_cpu" = ia64; then
++ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
++ allow_undefined_flag="-z nodefs"
++ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
++ else
++ # Determine the default libpath from the value encoded in an
++ # empty executable.
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++int
++main ()
++{
++
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++
++lt_aix_libpath_sed='
++ /Import File Strings/,/^$/ {
++ /^0/ {
++ s/^0 *\(.*\)$/\1/
++ p
++ }
++ }'
++aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
++# Check for a 64-bit object if we didn't find anything.
++if test -z "$aix_libpath"; then
++ aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
++fi
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
++
++ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
++ # Warning - without using the other run time loading flags,
++ # -berok will link without error, but may produce a broken library.
++ no_undefined_flag=' ${wl}-bernotok'
++ allow_undefined_flag=' ${wl}-berok'
++ # Exported symbols can be pulled into shared objects from archives
++ whole_archive_flag_spec='$convenience'
++ archive_cmds_need_lc=yes
++ # This is similar to how AIX traditionally builds its shared libraries.
++ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
++ fi
++ fi
++ ;;
++
++ amigaos*)
++ case $host_cpu in
++ powerpc)
++ # see comment about AmigaOS4 .so support
++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
++ archive_expsym_cmds=''
++ ;;
++ m68k)
++ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
++ hardcode_libdir_flag_spec='-L$libdir'
++ hardcode_minus_L=yes
++ ;;
++ esac
++ ;;
++
++ bsdi[45]*)
++ export_dynamic_flag_spec=-rdynamic
++ ;;
++
++ cygwin* | mingw* | pw32* | cegcc*)
++ # When not using gcc, we currently assume that we are using
++ # Microsoft Visual C++.
++ # hardcode_libdir_flag_spec is actually meaningless, as there is
++ # no search path for DLLs.
++ hardcode_libdir_flag_spec=' '
++ allow_undefined_flag=unsupported
++ # Tell ltmain to make .lib files, not .a files.
++ libext=lib
++ # Tell ltmain to make .dll files, not .so files.
++ shrext_cmds=".dll"
++ # FIXME: Setting linknames here is a bad hack.
++ archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
++ # The linker will automatically build a .lib file if we build a DLL.
++ old_archive_from_new_cmds='true'
++ # FIXME: Should let the user specify the lib program.
++ old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
++ fix_srcfile_path='`cygpath -w "$srcfile"`'
++ enable_shared_with_static_runtimes=yes
++ ;;
++
++ darwin* | rhapsody*)
++
++
++ archive_cmds_need_lc=no
++ hardcode_direct=no
++ hardcode_automatic=yes
++ hardcode_shlibpath_var=unsupported
++ whole_archive_flag_spec=''
++ link_all_deplibs=yes
++ allow_undefined_flag="$_lt_dar_allow_undefined"
++ case $cc_basename in
++ ifort*) _lt_dar_can_shared=yes ;;
++ *) _lt_dar_can_shared=$GCC ;;
++ esac
++ if test "$_lt_dar_can_shared" = "yes"; then
++ output_verbose_link_cmd=echo
++ archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
++ module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
++ archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
++ module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
++
++ else
++ ld_shlibs=no
++ fi
++
++ ;;
++
++ dgux*)
++ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
++ hardcode_libdir_flag_spec='-L$libdir'
++ hardcode_shlibpath_var=no
++ ;;
++
++ freebsd1*)
++ ld_shlibs=no
++ ;;
++
++ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
++ # support. Future versions do this automatically, but an explicit c++rt0.o
++ # does not break anything, and helps significantly (at the cost of a little
++ # extra space).
++ freebsd2.2*)
++ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
++ hardcode_libdir_flag_spec='-R$libdir'
++ hardcode_direct=yes
++ hardcode_shlibpath_var=no
++ ;;
++
++ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
++ freebsd2*)
++ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
++ hardcode_direct=yes
++ hardcode_minus_L=yes
++ hardcode_shlibpath_var=no
++ ;;
++
++ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
++ freebsd* | dragonfly*)
++ archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
++ hardcode_libdir_flag_spec='-R$libdir'
++ hardcode_direct=yes
++ hardcode_shlibpath_var=no
++ ;;
++
++ hpux9*)
++ if test "$GCC" = yes; then
++ archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
++ else
++ archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
++ fi
++ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
++ hardcode_libdir_separator=:
++ hardcode_direct=yes
++
++ # hardcode_minus_L: Not really in the search PATH,
++ # but as the default location of the library.
++ hardcode_minus_L=yes
++ export_dynamic_flag_spec='${wl}-E'
++ ;;
++
++ hpux10*)
++ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
++ archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
++ else
++ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
++ fi
++ if test "$with_gnu_ld" = no; then
++ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
++ hardcode_libdir_flag_spec_ld='+b $libdir'
++ hardcode_libdir_separator=:
++ hardcode_direct=yes
++ hardcode_direct_absolute=yes
++ export_dynamic_flag_spec='${wl}-E'
++ # hardcode_minus_L: Not really in the search PATH,
++ # but as the default location of the library.
++ hardcode_minus_L=yes
++ fi
++ ;;
++
++ hpux11*)
++ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
++ case $host_cpu in
++ hppa*64*)
++ archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
++ ;;
++ ia64*)
++ archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
++ ;;
++ *)
++ archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
++ ;;
++ esac
++ else
++ case $host_cpu in
++ hppa*64*)
++ archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
++ ;;
++ ia64*)
++ archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
++ ;;
++ *)
++ archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
++ ;;
++ esac
++ fi
++ if test "$with_gnu_ld" = no; then
++ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
++ hardcode_libdir_separator=:
++
++ case $host_cpu in
++ hppa*64*|ia64*)
++ hardcode_direct=no
++ hardcode_shlibpath_var=no
++ ;;
++ *)
++ hardcode_direct=yes
++ hardcode_direct_absolute=yes
++ export_dynamic_flag_spec='${wl}-E'
++
++ # hardcode_minus_L: Not really in the search PATH,
++ # but as the default location of the library.
++ hardcode_minus_L=yes
++ ;;
++ esac
++ fi
++ ;;
++
++ irix5* | irix6* | nonstopux*)
++ if test "$GCC" = yes; then
++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
++ # Try to use the -exported_symbol ld option, if it does not
++ # work, assume that -exports_file does not work either and
++ # implicitly export all symbols.
++ save_LDFLAGS="$LDFLAGS"
++ LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++int foo(void) {}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
++
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++ LDFLAGS="$save_LDFLAGS"
++ else
++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
++ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
++ fi
++ archive_cmds_need_lc='no'
++ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
++ hardcode_libdir_separator=:
++ inherit_rpath=yes
++ link_all_deplibs=yes
++ ;;
++
++ netbsd* | netbsdelf*-gnu)
++ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
++ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
++ else
++ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
++ fi
++ hardcode_libdir_flag_spec='-R$libdir'
++ hardcode_direct=yes
++ hardcode_shlibpath_var=no
++ ;;
++
++ newsos6)
++ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
++ hardcode_direct=yes
++ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
++ hardcode_libdir_separator=:
++ hardcode_shlibpath_var=no
++ ;;
++
++ *nto* | *qnx*)
++ ;;
++
++ openbsd*)
++ if test -f /usr/libexec/ld.so; then
++ hardcode_direct=yes
++ hardcode_shlibpath_var=no
++ hardcode_direct_absolute=yes
++ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
++ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
++ archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
++ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
++ export_dynamic_flag_spec='${wl}-E'
++ else
++ case $host_os in
++ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
++ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
++ hardcode_libdir_flag_spec='-R$libdir'
++ ;;
++ *)
++ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
++ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
++ ;;
++ esac
++ fi
++ else
++ ld_shlibs=no
++ fi
++ ;;
++
++ os2*)
++ hardcode_libdir_flag_spec='-L$libdir'
++ hardcode_minus_L=yes
++ allow_undefined_flag=unsupported
++ archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
++ old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
++ ;;
++
++ osf3*)
++ if test "$GCC" = yes; then
++ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
++ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
++ else
++ allow_undefined_flag=' -expect_unresolved \*'
++ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
++ fi
++ archive_cmds_need_lc='no'
++ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
++ hardcode_libdir_separator=:
++ ;;
++
++ osf4* | osf5*) # as osf3* with the addition of -msym flag
++ if test "$GCC" = yes; then
++ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
++ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
++ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
++ else
++ allow_undefined_flag=' -expect_unresolved \*'
++ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
++ archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
++ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
++
++ # Both c and cxx compiler support -rpath directly
++ hardcode_libdir_flag_spec='-rpath $libdir'
++ fi
++ archive_cmds_need_lc='no'
++ hardcode_libdir_separator=:
++ ;;
++
++ solaris*)
++ no_undefined_flag=' -z defs'
++ if test "$GCC" = yes; then
++ wlarc='${wl}'
++ archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
++ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
++ $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
++ else
++ case `$CC -V 2>&1` in
++ *"Compilers 5.0"*)
++ wlarc=''
++ archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
++ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
++ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
++ ;;
++ *)
++ wlarc='${wl}'
++ archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
++ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
++ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
++ ;;
++ esac
++ fi
++ hardcode_libdir_flag_spec='-R$libdir'
++ hardcode_shlibpath_var=no
++ case $host_os in
++ solaris2.[0-5] | solaris2.[0-5].*) ;;
++ *)
++ # The compiler driver will combine and reorder linker options,
++ # but understands `-z linker_flag'. GCC discards it without `$wl',
++ # but is careful enough not to reorder.
++ # Supported since Solaris 2.6 (maybe 2.5.1?)
++ if test "$GCC" = yes; then
++ whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
++ else
++ whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
++ fi
++ ;;
++ esac
++ link_all_deplibs=yes
++ ;;
++
++ sunos4*)
++ if test "x$host_vendor" = xsequent; then
++ # Use $CC to link under sequent, because it throws in some extra .o
++ # files that make .init and .fini sections work.
++ archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
++ else
++ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
++ fi
++ hardcode_libdir_flag_spec='-L$libdir'
++ hardcode_direct=yes
++ hardcode_minus_L=yes
++ hardcode_shlibpath_var=no
++ ;;
++
++ sysv4)
++ case $host_vendor in
++ sni)
++ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
++ hardcode_direct=yes # is this really true???
++ ;;
++ siemens)
++ ## LD is ld it makes a PLAMLIB
++ ## CC just makes a GrossModule.
++ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
++ reload_cmds='$CC -r -o $output$reload_objs'
++ hardcode_direct=no
++ ;;
++ motorola)
++ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
++ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
++ ;;
++ esac
++ runpath_var='LD_RUN_PATH'
++ hardcode_shlibpath_var=no
++ ;;
++
++ sysv4.3*)
++ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
++ hardcode_shlibpath_var=no
++ export_dynamic_flag_spec='-Bexport'
++ ;;
++
++ sysv4*MP*)
++ if test -d /usr/nec; then
++ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
++ hardcode_shlibpath_var=no
++ runpath_var=LD_RUN_PATH
++ hardcode_runpath_var=yes
++ ld_shlibs=yes
++ fi
++ ;;
++
++ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
++ no_undefined_flag='${wl}-z,text'
++ archive_cmds_need_lc=no
++ hardcode_shlibpath_var=no
++ runpath_var='LD_RUN_PATH'
++
++ if test "$GCC" = yes; then
++ archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
++ archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
++ else
++ archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
++ archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
++ fi
++ ;;
++
++ sysv5* | sco3.2v5* | sco5v6*)
++ # Note: We can NOT use -z defs as we might desire, because we do not
++ # link with -lc, and that would cause any symbols used from libc to
++ # always be unresolved, which means just about no library would
++ # ever link correctly. If we're not using GNU ld we use -z text
++ # though, which does catch some bad symbols but isn't as heavy-handed
++ # as -z defs.
++ no_undefined_flag='${wl}-z,text'
++ allow_undefined_flag='${wl}-z,nodefs'
++ archive_cmds_need_lc=no
++ hardcode_shlibpath_var=no
++ hardcode_libdir_flag_spec='${wl}-R,$libdir'
++ hardcode_libdir_separator=':'
++ link_all_deplibs=yes
++ export_dynamic_flag_spec='${wl}-Bexport'
++ runpath_var='LD_RUN_PATH'
++
++ if test "$GCC" = yes; then
++ archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
++ archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
++ else
++ archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
++ archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
++ fi
++ ;;
++
++ uts4*)
++ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
++ hardcode_libdir_flag_spec='-L$libdir'
++ hardcode_shlibpath_var=no
++ ;;
++
++ *)
++ ld_shlibs=no
++ ;;
++ esac
++
++ if test x$host_vendor = xsni; then
++ case $host in
++ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
++ export_dynamic_flag_spec='${wl}-Blargedynsym'
++ ;;
++ esac
++ fi
++ fi
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
++$as_echo "$ld_shlibs" >&6; }
++test "$ld_shlibs" = no && can_build_shared=no
++
++with_gnu_ld=$with_gnu_ld
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++#
++# Do we need to explicitly link libc?
++#
++case "x$archive_cmds_need_lc" in
++x|xyes)
++ # Assume -lc should be added
++ archive_cmds_need_lc=yes
++
++ if test "$enable_shared" = yes && test "$GCC" = yes; then
++ case $archive_cmds in
++ *'~'*)
++ # FIXME: we may have to deal with multi-command sequences.
++ ;;
++ '$CC '*)
++ # Test whether the compiler implicitly links with -lc since on some
++ # systems, -lgcc has to come before -lc. If gcc already passes -lc
++ # to ld, don't add -lc before -lgcc.
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
++$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
++ $RM conftest*
++ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
++
++ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
++ (eval $ac_compile) 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; } 2>conftest.err; then
++ soname=conftest
++ lib=conftest
++ libobjs=conftest.$ac_objext
++ deplibs=
++ wl=$lt_prog_compiler_wl
++ pic_flag=$lt_prog_compiler_pic
++ compiler_flags=-v
++ linker_flags=-v
++ verstring=
++ output_objdir=.
++ libname=conftest
++ lt_save_allow_undefined_flag=$allow_undefined_flag
++ allow_undefined_flag=
++ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
++ (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; }
++ then
++ archive_cmds_need_lc=no
++ else
++ archive_cmds_need_lc=yes
++ fi
++ allow_undefined_flag=$lt_save_allow_undefined_flag
++ else
++ cat conftest.err 1>&5
++ fi
++ $RM conftest*
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5
++$as_echo "$archive_cmds_need_lc" >&6; }
++ ;;
++ esac
++ fi
++ ;;
++esac
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
++$as_echo_n "checking dynamic linker characteristics... " >&6; }
++
++if test "$GCC" = yes; then
++ case $host_os in
++ darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
++ *) lt_awk_arg="/^libraries:/" ;;
++ esac
++ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
++ if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
++ # if the path contains ";" then we assume it to be the separator
++ # otherwise default to the standard path separator (i.e. ":") - it is
++ # assumed that no part of a normal pathname contains ";" but that should
++ # okay in the real world where ";" in dirpaths is itself problematic.
++ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
++ else
++ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
++ fi
++ # Ok, now we have the path, separated by spaces, we can step through it
++ # and add multilib dir if necessary.
++ lt_tmp_lt_search_path_spec=
++ lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
++ for lt_sys_path in $lt_search_path_spec; do
++ if test -d "$lt_sys_path/$lt_multi_os_dir"; then
++ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
++ else
++ test -d "$lt_sys_path" && \
++ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
++ fi
++ done
++ lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
++BEGIN {RS=" "; FS="/|\n";} {
++ lt_foo="";
++ lt_count=0;
++ for (lt_i = NF; lt_i > 0; lt_i--) {
++ if ($lt_i != "" && $lt_i != ".") {
++ if ($lt_i == "..") {
++ lt_count++;
++ } else {
++ if (lt_count == 0) {
++ lt_foo="/" $lt_i lt_foo;
++ } else {
++ lt_count--;
++ }
++ }
++ }
++ }
++ if (lt_foo != "") { lt_freq[lt_foo]++; }
++ if (lt_freq[lt_foo] == 1) { print lt_foo; }
++}'`
++ sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
++else
++ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
++fi
++library_names_spec=
++libname_spec='lib$name'
++soname_spec=
++shrext_cmds=".so"
++postinstall_cmds=
++postuninstall_cmds=
++finish_cmds=
++finish_eval=
++shlibpath_var=
++shlibpath_overrides_runpath=unknown
++version_type=none
++dynamic_linker="$host_os ld.so"
++sys_lib_dlsearch_path_spec="/lib /usr/lib"
++need_lib_prefix=unknown
++hardcode_into_libs=no
++
++# when you set need_version to no, make sure it does not cause -set_version
++# flags to be left without arguments
++need_version=unknown
++
++case $host_os in
++aix3*)
++ version_type=linux
++ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
++ shlibpath_var=LIBPATH
++
++ # AIX 3 has no versioning support, so we append a major version to the name.
++ soname_spec='${libname}${release}${shared_ext}$major'
++ ;;
++
++aix[4-9]*)
++ version_type=linux
++ need_lib_prefix=no
++ need_version=no
++ hardcode_into_libs=yes
++ if test "$host_cpu" = ia64; then
++ # AIX 5 supports IA64
++ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
++ shlibpath_var=LD_LIBRARY_PATH
++ else
++ # With GCC up to 2.95.x, collect2 would create an import file
++ # for dependence libraries. The import file would start with
++ # the line `#! .'. This would cause the generated library to
++ # depend on `.', always an invalid library. This was fixed in
++ # development snapshots of GCC prior to 3.0.
++ case $host_os in
++ aix4 | aix4.[01] | aix4.[01].*)
++ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
++ echo ' yes '
++ echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
++ :
++ else
++ can_build_shared=no
++ fi
++ ;;
++ esac
++ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
++ # soname into executable. Probably we can add versioning support to
++ # collect2, so additional links can be useful in future.
++ if test "$aix_use_runtimelinking" = yes; then
++ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
++ # instead of lib<name>.a to let people know that these are not
++ # typical AIX shared libraries.
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
++ else
++ # We preserve .a as extension for shared libraries through AIX4.2
++ # and later when we are not doing run time linking.
++ library_names_spec='${libname}${release}.a $libname.a'
++ soname_spec='${libname}${release}${shared_ext}$major'
++ fi
++ shlibpath_var=LIBPATH
++ fi
++ ;;
++
++amigaos*)
++ case $host_cpu in
++ powerpc)
++ # Since July 2007 AmigaOS4 officially supports .so libraries.
++ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
++ ;;
++ m68k)
++ library_names_spec='$libname.ixlibrary $libname.a'
++ # Create ${libname}_ixlibrary.a entries in /sys/libs.
++ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
++ ;;
++ esac
++ ;;
++
++beos*)
++ library_names_spec='${libname}${shared_ext}'
++ dynamic_linker="$host_os ld.so"
++ shlibpath_var=LIBRARY_PATH
++ ;;
++
++bsdi[45]*)
++ version_type=linux
++ need_version=no
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
++ soname_spec='${libname}${release}${shared_ext}$major'
++ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
++ shlibpath_var=LD_LIBRARY_PATH
++ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
++ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
++ # the default ld.so.conf also contains /usr/contrib/lib and
++ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
++ # libtool to hard-code these into programs
++ ;;
++
++cygwin* | mingw* | pw32* | cegcc*)
++ version_type=windows
++ shrext_cmds=".dll"
++ need_version=no
++ need_lib_prefix=no
++
++ case $GCC,$host_os in
++ yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
++ library_names_spec='$libname.dll.a'
++ # DLL is installed to $(libdir)/../bin by postinstall_cmds
++ postinstall_cmds='base_file=`basename \${file}`~
++ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
++ dldir=$destdir/`dirname \$dlpath`~
++ test -d \$dldir || mkdir -p \$dldir~
++ $install_prog $dir/$dlname \$dldir/$dlname~
++ chmod a+x \$dldir/$dlname~
++ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
++ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
++ fi'
++ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
++ dlpath=$dir/\$dldll~
++ $RM \$dlpath'
++ shlibpath_overrides_runpath=yes
++
++ case $host_os in
++ cygwin*)
++ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
++ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
++ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
++ ;;
++ mingw* | cegcc*)
++ # MinGW DLLs use traditional 'lib' prefix
++ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
++ sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
++ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
++ # It is most probably a Windows format PATH printed by
++ # mingw gcc, but we are running on Cygwin. Gcc prints its search
++ # path with ; separators, and with drive letters. We can handle the
++ # drive letters (cygwin fileutils understands them), so leave them,
++ # especially as we might pass files found there to a mingw objdump,
++ # which wouldn't understand a cygwinified path. Ahh.
++ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
++ else
++ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
++ fi
++ ;;
++ pw32*)
++ # pw32 DLLs use 'pw' prefix rather than 'lib'
++ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
++ ;;
++ esac
++ ;;
++
++ *)
++ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
++ ;;
++ esac
++ dynamic_linker='Win32 ld.exe'
++ # FIXME: first we should search . and the directory the executable is in
++ shlibpath_var=PATH
++ ;;
++
++darwin* | rhapsody*)
++ dynamic_linker="$host_os dyld"
++ version_type=darwin
++ need_lib_prefix=no
++ need_version=no
++ library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
++ soname_spec='${libname}${release}${major}$shared_ext'
++ shlibpath_overrides_runpath=yes
++ shlibpath_var=DYLD_LIBRARY_PATH
++ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
++
++ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
++ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
++ ;;
++
++dgux*)
++ version_type=linux
++ need_lib_prefix=no
++ need_version=no
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
++ soname_spec='${libname}${release}${shared_ext}$major'
++ shlibpath_var=LD_LIBRARY_PATH
++ ;;
++
++freebsd1*)
++ dynamic_linker=no
++ ;;
++
++freebsd* | dragonfly*)
++ # DragonFly does not have aout. When/if they implement a new
++ # versioning mechanism, adjust this.
++ if test -x /usr/bin/objformat; then
++ objformat=`/usr/bin/objformat`
++ else
++ case $host_os in
++ freebsd[123]*) objformat=aout ;;
++ *) objformat=elf ;;
++ esac
++ fi
++ version_type=freebsd-$objformat
++ case $version_type in
++ freebsd-elf*)
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
++ need_version=no
++ need_lib_prefix=no
++ ;;
++ freebsd-*)
++ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
++ need_version=yes
++ ;;
++ esac
++ shlibpath_var=LD_LIBRARY_PATH
++ case $host_os in
++ freebsd2*)
++ shlibpath_overrides_runpath=yes
++ ;;
++ freebsd3.[01]* | freebsdelf3.[01]*)
++ shlibpath_overrides_runpath=yes
++ hardcode_into_libs=yes
++ ;;
++ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
++ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
++ shlibpath_overrides_runpath=no
++ hardcode_into_libs=yes
++ ;;
++ *) # from 4.6 on, and DragonFly
++ shlibpath_overrides_runpath=yes
++ hardcode_into_libs=yes
++ ;;
++ esac
++ ;;
++
++gnu*)
++ version_type=linux
++ need_lib_prefix=no
++ need_version=no
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
++ soname_spec='${libname}${release}${shared_ext}$major'
++ shlibpath_var=LD_LIBRARY_PATH
++ hardcode_into_libs=yes
++ ;;
++
++hpux9* | hpux10* | hpux11*)
++ # Give a soname corresponding to the major version so that dld.sl refuses to
++ # link against other versions.
++ version_type=sunos
++ need_lib_prefix=no
++ need_version=no
++ case $host_cpu in
++ ia64*)
++ shrext_cmds='.so'
++ hardcode_into_libs=yes
++ dynamic_linker="$host_os dld.so"
++ shlibpath_var=LD_LIBRARY_PATH
++ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
++ soname_spec='${libname}${release}${shared_ext}$major'
++ if test "X$HPUX_IA64_MODE" = X32; then
++ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
++ else
++ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
++ fi
++ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
++ ;;
++ hppa*64*)
++ shrext_cmds='.sl'
++ hardcode_into_libs=yes
++ dynamic_linker="$host_os dld.sl"
++ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
++ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
++ soname_spec='${libname}${release}${shared_ext}$major'
++ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
++ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
++ ;;
++ *)
++ shrext_cmds='.sl'
++ dynamic_linker="$host_os dld.sl"
++ shlibpath_var=SHLIB_PATH
++ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
++ soname_spec='${libname}${release}${shared_ext}$major'
++ ;;
++ esac
++ # HP-UX runs *really* slowly unless shared libraries are mode 555.
++ postinstall_cmds='chmod 555 $lib'
++ ;;
++
++interix[3-9]*)
++ version_type=linux
++ need_lib_prefix=no
++ need_version=no
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
++ soname_spec='${libname}${release}${shared_ext}$major'
++ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
++ shlibpath_var=LD_LIBRARY_PATH
++ shlibpath_overrides_runpath=no
++ hardcode_into_libs=yes
++ ;;
++
++irix5* | irix6* | nonstopux*)
++ case $host_os in
++ nonstopux*) version_type=nonstopux ;;
++ *)
++ if test "$lt_cv_prog_gnu_ld" = yes; then
++ version_type=linux
++ else
++ version_type=irix
++ fi ;;
++ esac
++ need_lib_prefix=no
++ need_version=no
++ soname_spec='${libname}${release}${shared_ext}$major'
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
++ case $host_os in
++ irix5* | nonstopux*)
++ libsuff= shlibsuff=
++ ;;
++ *)
++ case $LD in # libtool.m4 will add one of these switches to LD
++ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
++ libsuff= shlibsuff= libmagic=32-bit;;
++ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
++ libsuff=32 shlibsuff=N32 libmagic=N32;;
++ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
++ libsuff=64 shlibsuff=64 libmagic=64-bit;;
++ *) libsuff= shlibsuff= libmagic=never-match;;
++ esac
++ ;;
++ esac
++ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
++ shlibpath_overrides_runpath=no
++ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
++ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
++ hardcode_into_libs=yes
++ ;;
++
++# No shared lib support for Linux oldld, aout, or coff.
++linux*oldld* | linux*aout* | linux*coff*)
++ dynamic_linker=no
++ ;;
++
++# This must be Linux ELF.
++linux* | k*bsd*-gnu)
++ version_type=linux
++ need_lib_prefix=no
++ need_version=no
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
++ soname_spec='${libname}${release}${shared_ext}$major'
++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
++ shlibpath_var=LD_LIBRARY_PATH
++ shlibpath_overrides_runpath=no
++ # Some binutils ld are patched to set DT_RUNPATH
++ save_LDFLAGS=$LDFLAGS
++ save_libdir=$libdir
++ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
++ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++int
++main ()
++{
++
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
++ shlibpath_overrides_runpath=yes
++fi
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++ LDFLAGS=$save_LDFLAGS
++ libdir=$save_libdir
++
++ # This implies no fast_install, which is unacceptable.
++ # Some rework will be needed to allow for fast_install
++ # before this can be enabled.
++ hardcode_into_libs=yes
++
++ # Append ld.so.conf contents to the search path
++ if test -f /etc/ld.so.conf; then
++ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
++ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
++ fi
++
++ # We used to test for /lib/ld.so.1 and disable shared libraries on
++ # powerpc, because MkLinux only supported shared libraries with the
++ # GNU dynamic linker. Since this was broken with cross compilers,
++ # most powerpc-linux boxes support dynamic linking these days and
++ # people can always --disable-shared, the test was removed, and we
++ # assume the GNU/Linux dynamic linker is in use.
++ dynamic_linker='GNU/Linux ld.so'
++ ;;
++
++netbsdelf*-gnu)
++ version_type=linux
++ need_lib_prefix=no
++ need_version=no
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
++ soname_spec='${libname}${release}${shared_ext}$major'
++ shlibpath_var=LD_LIBRARY_PATH
++ shlibpath_overrides_runpath=no
++ hardcode_into_libs=yes
++ dynamic_linker='NetBSD ld.elf_so'
++ ;;
++
++netbsd*)
++ version_type=sunos
++ need_lib_prefix=no
++ need_version=no
++ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
++ dynamic_linker='NetBSD (a.out) ld.so'
++ else
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
++ soname_spec='${libname}${release}${shared_ext}$major'
++ dynamic_linker='NetBSD ld.elf_so'
++ fi
++ shlibpath_var=LD_LIBRARY_PATH
++ shlibpath_overrides_runpath=yes
++ hardcode_into_libs=yes
++ ;;
++
++newsos6)
++ version_type=linux
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
++ shlibpath_var=LD_LIBRARY_PATH
++ shlibpath_overrides_runpath=yes
++ ;;
++
++*nto* | *qnx*)
++ version_type=qnx
++ need_lib_prefix=no
++ need_version=no
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
++ soname_spec='${libname}${release}${shared_ext}$major'
++ shlibpath_var=LD_LIBRARY_PATH
++ shlibpath_overrides_runpath=no
++ hardcode_into_libs=yes
++ dynamic_linker='ldqnx.so'
++ ;;
++
++openbsd*)
++ version_type=sunos
++ sys_lib_dlsearch_path_spec="/usr/lib"
++ need_lib_prefix=no
++ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
++ case $host_os in
++ openbsd3.3 | openbsd3.3.*) need_version=yes ;;
++ *) need_version=no ;;
++ esac
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
++ shlibpath_var=LD_LIBRARY_PATH
++ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
++ case $host_os in
++ openbsd2.[89] | openbsd2.[89].*)
++ shlibpath_overrides_runpath=no
++ ;;
++ *)
++ shlibpath_overrides_runpath=yes
++ ;;
++ esac
++ else
++ shlibpath_overrides_runpath=yes
++ fi
++ ;;
++
++os2*)
++ libname_spec='$name'
++ shrext_cmds=".dll"
++ need_lib_prefix=no
++ library_names_spec='$libname${shared_ext} $libname.a'
++ dynamic_linker='OS/2 ld.exe'
++ shlibpath_var=LIBPATH
++ ;;
++
++osf3* | osf4* | osf5*)
++ version_type=osf
++ need_lib_prefix=no
++ need_version=no
++ soname_spec='${libname}${release}${shared_ext}$major'
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
++ shlibpath_var=LD_LIBRARY_PATH
++ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
++ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
++ ;;
++
++rdos*)
++ dynamic_linker=no
++ ;;
++
++solaris*)
++ version_type=linux
++ need_lib_prefix=no
++ need_version=no
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
++ soname_spec='${libname}${release}${shared_ext}$major'
++ shlibpath_var=LD_LIBRARY_PATH
++ shlibpath_overrides_runpath=yes
++ hardcode_into_libs=yes
++ # ldd complains unless libraries are executable
++ postinstall_cmds='chmod +x $lib'
++ ;;
++
++sunos4*)
++ version_type=sunos
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
++ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
++ shlibpath_var=LD_LIBRARY_PATH
++ shlibpath_overrides_runpath=yes
++ if test "$with_gnu_ld" = yes; then
++ need_lib_prefix=no
++ fi
++ need_version=yes
++ ;;
++
++sysv4 | sysv4.3*)
++ version_type=linux
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
++ soname_spec='${libname}${release}${shared_ext}$major'
++ shlibpath_var=LD_LIBRARY_PATH
++ case $host_vendor in
++ sni)
++ shlibpath_overrides_runpath=no
++ need_lib_prefix=no
++ runpath_var=LD_RUN_PATH
++ ;;
++ siemens)
++ need_lib_prefix=no
++ ;;
++ motorola)
++ need_lib_prefix=no
++ need_version=no
++ shlibpath_overrides_runpath=no
++ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
++ ;;
++ esac
++ ;;
++
++sysv4*MP*)
++ if test -d /usr/nec ;then
++ version_type=linux
++ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
++ soname_spec='$libname${shared_ext}.$major'
++ shlibpath_var=LD_LIBRARY_PATH
++ fi
++ ;;
++
++sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
++ version_type=freebsd-elf
++ need_lib_prefix=no
++ need_version=no
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
++ soname_spec='${libname}${release}${shared_ext}$major'
++ shlibpath_var=LD_LIBRARY_PATH
++ shlibpath_overrides_runpath=yes
++ hardcode_into_libs=yes
++ if test "$with_gnu_ld" = yes; then
++ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
++ else
++ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
++ case $host_os in
++ sco3.2v5*)
++ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
++ ;;
++ esac
++ fi
++ sys_lib_dlsearch_path_spec='/usr/lib'
++ ;;
++
++tpf*)
++ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
++ version_type=linux
++ need_lib_prefix=no
++ need_version=no
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
++ shlibpath_var=LD_LIBRARY_PATH
++ shlibpath_overrides_runpath=no
++ hardcode_into_libs=yes
++ ;;
++
++uts4*)
++ version_type=linux
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
++ soname_spec='${libname}${release}${shared_ext}$major'
++ shlibpath_var=LD_LIBRARY_PATH
++ ;;
++
++*)
++ dynamic_linker=no
++ ;;
++esac
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
++$as_echo "$dynamic_linker" >&6; }
++test "$dynamic_linker" = no && can_build_shared=no
++
++variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
++if test "$GCC" = yes; then
++ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
++fi
++
++if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
++ sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
++fi
++if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
++ sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
++fi
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
++$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
++hardcode_action=
++if test -n "$hardcode_libdir_flag_spec" ||
++ test -n "$runpath_var" ||
++ test "X$hardcode_automatic" = "Xyes" ; then
++
++ # We can hardcode non-existent directories.
++ if test "$hardcode_direct" != no &&
++ # If the only mechanism to avoid hardcoding is shlibpath_var, we
++ # have to relink, otherwise we might link with an installed library
++ # when we should be linking with a yet-to-be-installed one
++ ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
++ test "$hardcode_minus_L" != no; then
++ # Linking always hardcodes the temporary library directory.
++ hardcode_action=relink
++ else
++ # We can link without hardcoding, and we can hardcode nonexisting dirs.
++ hardcode_action=immediate
++ fi
++else
++ # We cannot hardcode anything, or else we can only hardcode existing
++ # directories.
++ hardcode_action=unsupported
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
++$as_echo "$hardcode_action" >&6; }
++
++if test "$hardcode_action" = relink ||
++ test "$inherit_rpath" = yes; then
++ # Fast installation is not supported
++ enable_fast_install=no
++elif test "$shlibpath_overrides_runpath" = yes ||
++ test "$enable_shared" = no; then
++ # Fast installation is not necessary
++ enable_fast_install=needless
++fi
++
++
++
++
++
++
++ if test "x$enable_dlopen" != xyes; then
++ enable_dlopen=unknown
++ enable_dlopen_self=unknown
++ enable_dlopen_self_static=unknown
++else
++ lt_cv_dlopen=no
++ lt_cv_dlopen_libs=
++
++ case $host_os in
++ beos*)
++ lt_cv_dlopen="load_add_on"
++ lt_cv_dlopen_libs=
++ lt_cv_dlopen_self=yes
++ ;;
++
++ mingw* | pw32* | cegcc*)
++ lt_cv_dlopen="LoadLibrary"
++ lt_cv_dlopen_libs=
++ ;;
++
++ cygwin*)
++ lt_cv_dlopen="dlopen"
++ lt_cv_dlopen_libs=
++ ;;
++
++ darwin*)
++ # if libdl is installed we need to link against it
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
++$as_echo_n "checking for dlopen in -ldl... " >&6; }
++if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ ac_check_lib_save_LIBS=$LIBS
++LIBS="-ldl $LIBS"
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++/* Override any GCC internal prototype to avoid an error.
++ Use char because int might match the return type of a GCC
++ builtin and then its argument prototype would still apply. */
++#ifdef __cplusplus
++extern "C"
++#endif
++char dlopen ();
++int
++main ()
++{
++return dlopen ();
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++ ac_cv_lib_dl_dlopen=yes
++else
++ ac_cv_lib_dl_dlopen=no
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++LIBS=$ac_check_lib_save_LIBS
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
++$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
++if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
++ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
++else
++
++ lt_cv_dlopen="dyld"
++ lt_cv_dlopen_libs=
++ lt_cv_dlopen_self=yes
++
++fi
++
++ ;;
++
++ *)
++ ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
++if test "x$ac_cv_func_shl_load" = x""yes; then :
++ lt_cv_dlopen="shl_load"
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
++$as_echo_n "checking for shl_load in -ldld... " >&6; }
++if test "${ac_cv_lib_dld_shl_load+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ ac_check_lib_save_LIBS=$LIBS
++LIBS="-ldld $LIBS"
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++/* Override any GCC internal prototype to avoid an error.
++ Use char because int might match the return type of a GCC
++ builtin and then its argument prototype would still apply. */
++#ifdef __cplusplus
++extern "C"
++#endif
++char shl_load ();
++int
++main ()
++{
++return shl_load ();
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++ ac_cv_lib_dld_shl_load=yes
++else
++ ac_cv_lib_dld_shl_load=no
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++LIBS=$ac_check_lib_save_LIBS
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
++$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
++if test "x$ac_cv_lib_dld_shl_load" = x""yes; then :
++ lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
++else
++ ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
++if test "x$ac_cv_func_dlopen" = x""yes; then :
++ lt_cv_dlopen="dlopen"
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
++$as_echo_n "checking for dlopen in -ldl... " >&6; }
++if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ ac_check_lib_save_LIBS=$LIBS
++LIBS="-ldl $LIBS"
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++/* Override any GCC internal prototype to avoid an error.
++ Use char because int might match the return type of a GCC
++ builtin and then its argument prototype would still apply. */
++#ifdef __cplusplus
++extern "C"
++#endif
++char dlopen ();
++int
++main ()
++{
++return dlopen ();
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++ ac_cv_lib_dl_dlopen=yes
++else
++ ac_cv_lib_dl_dlopen=no
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++LIBS=$ac_check_lib_save_LIBS
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
++$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
++if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
++ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
++$as_echo_n "checking for dlopen in -lsvld... " >&6; }
++if test "${ac_cv_lib_svld_dlopen+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ ac_check_lib_save_LIBS=$LIBS
++LIBS="-lsvld $LIBS"
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++/* Override any GCC internal prototype to avoid an error.
++ Use char because int might match the return type of a GCC
++ builtin and then its argument prototype would still apply. */
++#ifdef __cplusplus
++extern "C"
++#endif
++char dlopen ();
++int
++main ()
++{
++return dlopen ();
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++ ac_cv_lib_svld_dlopen=yes
++else
++ ac_cv_lib_svld_dlopen=no
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++LIBS=$ac_check_lib_save_LIBS
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
++$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
++if test "x$ac_cv_lib_svld_dlopen" = x""yes; then :
++ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
++$as_echo_n "checking for dld_link in -ldld... " >&6; }
++if test "${ac_cv_lib_dld_dld_link+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ ac_check_lib_save_LIBS=$LIBS
++LIBS="-ldld $LIBS"
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++/* Override any GCC internal prototype to avoid an error.
++ Use char because int might match the return type of a GCC
++ builtin and then its argument prototype would still apply. */
++#ifdef __cplusplus
++extern "C"
++#endif
++char dld_link ();
++int
++main ()
++{
++return dld_link ();
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++ ac_cv_lib_dld_dld_link=yes
++else
++ ac_cv_lib_dld_dld_link=no
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++LIBS=$ac_check_lib_save_LIBS
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
++$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
++if test "x$ac_cv_lib_dld_dld_link" = x""yes; then :
++ lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
++fi
++
++
++fi
++
++
++fi
++
++
++fi
++
++
++fi
++
++
++fi
++
++ ;;
++ esac
++
++ if test "x$lt_cv_dlopen" != xno; then
++ enable_dlopen=yes
++ else
++ enable_dlopen=no
++ fi
++
++ case $lt_cv_dlopen in
++ dlopen)
++ save_CPPFLAGS="$CPPFLAGS"
++ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
++
++ save_LDFLAGS="$LDFLAGS"
++ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
++
++ save_LIBS="$LIBS"
++ LIBS="$lt_cv_dlopen_libs $LIBS"
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
++$as_echo_n "checking whether a program can dlopen itself... " >&6; }
++if test "${lt_cv_dlopen_self+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test "$cross_compiling" = yes; then :
++ lt_cv_dlopen_self=cross
++else
++ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
++ lt_status=$lt_dlunknown
++ cat > conftest.$ac_ext <<_LT_EOF
++#line 10368 "configure"
++#include "confdefs.h"
++
++#if HAVE_DLFCN_H
++#include <dlfcn.h>
++#endif
++
++#include <stdio.h>
++
++#ifdef RTLD_GLOBAL
++# define LT_DLGLOBAL RTLD_GLOBAL
++#else
++# ifdef DL_GLOBAL
++# define LT_DLGLOBAL DL_GLOBAL
++# else
++# define LT_DLGLOBAL 0
++# endif
++#endif
++
++/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
++ find out it does not work in some platform. */
++#ifndef LT_DLLAZY_OR_NOW
++# ifdef RTLD_LAZY
++# define LT_DLLAZY_OR_NOW RTLD_LAZY
++# else
++# ifdef DL_LAZY
++# define LT_DLLAZY_OR_NOW DL_LAZY
++# else
++# ifdef RTLD_NOW
++# define LT_DLLAZY_OR_NOW RTLD_NOW
++# else
++# ifdef DL_NOW
++# define LT_DLLAZY_OR_NOW DL_NOW
++# else
++# define LT_DLLAZY_OR_NOW 0
++# endif
++# endif
++# endif
++# endif
++#endif
++
++void fnord() { int i=42;}
++int main ()
++{
++ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
++ int status = $lt_dlunknown;
++
++ if (self)
++ {
++ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
++ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
++ /* dlclose (self); */
++ }
++ else
++ puts (dlerror ());
++
++ return status;
++}
++_LT_EOF
++ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
++ (eval $ac_link) 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
++ (./conftest; exit; ) >&5 2>/dev/null
++ lt_status=$?
++ case x$lt_status in
++ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
++ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
++ x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
++ esac
++ else :
++ # compilation failed
++ lt_cv_dlopen_self=no
++ fi
++fi
++rm -fr conftest*
++
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
++$as_echo "$lt_cv_dlopen_self" >&6; }
++
++ if test "x$lt_cv_dlopen_self" = xyes; then
++ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
++$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
++if test "${lt_cv_dlopen_self_static+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test "$cross_compiling" = yes; then :
++ lt_cv_dlopen_self_static=cross
++else
++ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
++ lt_status=$lt_dlunknown
++ cat > conftest.$ac_ext <<_LT_EOF
++#line 10464 "configure"
++#include "confdefs.h"
++
++#if HAVE_DLFCN_H
++#include <dlfcn.h>
++#endif
++
++#include <stdio.h>
++
++#ifdef RTLD_GLOBAL
++# define LT_DLGLOBAL RTLD_GLOBAL
++#else
++# ifdef DL_GLOBAL
++# define LT_DLGLOBAL DL_GLOBAL
++# else
++# define LT_DLGLOBAL 0
++# endif
++#endif
++
++/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
++ find out it does not work in some platform. */
++#ifndef LT_DLLAZY_OR_NOW
++# ifdef RTLD_LAZY
++# define LT_DLLAZY_OR_NOW RTLD_LAZY
++# else
++# ifdef DL_LAZY
++# define LT_DLLAZY_OR_NOW DL_LAZY
++# else
++# ifdef RTLD_NOW
++# define LT_DLLAZY_OR_NOW RTLD_NOW
++# else
++# ifdef DL_NOW
++# define LT_DLLAZY_OR_NOW DL_NOW
++# else
++# define LT_DLLAZY_OR_NOW 0
++# endif
++# endif
++# endif
++# endif
++#endif
++
++void fnord() { int i=42;}
++int main ()
++{
++ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
++ int status = $lt_dlunknown;
++
++ if (self)
++ {
++ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
++ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
++ /* dlclose (self); */
++ }
++ else
++ puts (dlerror ());
++
++ return status;
++}
++_LT_EOF
++ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
++ (eval $ac_link) 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
++ (./conftest; exit; ) >&5 2>/dev/null
++ lt_status=$?
++ case x$lt_status in
++ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
++ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
++ x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
++ esac
++ else :
++ # compilation failed
++ lt_cv_dlopen_self_static=no
++ fi
++fi
++rm -fr conftest*
++
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
++$as_echo "$lt_cv_dlopen_self_static" >&6; }
++ fi
++
++ CPPFLAGS="$save_CPPFLAGS"
++ LDFLAGS="$save_LDFLAGS"
++ LIBS="$save_LIBS"
++ ;;
++ esac
++
++ case $lt_cv_dlopen_self in
++ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
++ *) enable_dlopen_self=unknown ;;
++ esac
++
++ case $lt_cv_dlopen_self_static in
++ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
++ *) enable_dlopen_self_static=unknown ;;
++ esac
++fi
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++striplib=
++old_striplib=
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
++$as_echo_n "checking whether stripping libraries is possible... " >&6; }
++if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
++ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
++ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
++$as_echo "yes" >&6; }
++else
++# FIXME - insert some real tests, host_os isn't really good enough
++ case $host_os in
++ darwin*)
++ if test -n "$STRIP" ; then
++ striplib="$STRIP -x"
++ old_striplib="$STRIP -S"
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
++$as_echo "yes" >&6; }
++ else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++ fi
++ ;;
++ *)
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++ ;;
++ esac
++fi
++
++
++
++
++
++
++
++
++
++
++
++
++ # Report which library types will actually be built
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
++$as_echo_n "checking if libtool supports shared libraries... " >&6; }
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
++$as_echo "$can_build_shared" >&6; }
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
++$as_echo_n "checking whether to build shared libraries... " >&6; }
++ test "$can_build_shared" = "no" && enable_shared=no
++
++ # On AIX, shared libraries and static libraries use the same namespace, and
++ # are all built from PIC.
++ case $host_os in
++ aix3*)
++ test "$enable_shared" = yes && enable_static=no
++ if test -n "$RANLIB"; then
++ archive_cmds="$archive_cmds~\$RANLIB \$lib"
++ postinstall_cmds='$RANLIB $lib'
++ fi
++ ;;
++
++ aix[4-9]*)
++ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
++ test "$enable_shared" = yes && enable_static=no
++ fi
++ ;;
++ esac
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
++$as_echo "$enable_shared" >&6; }
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
++$as_echo_n "checking whether to build static libraries... " >&6; }
++ # Make sure either enable_shared or enable_static is yes.
++ test "$enable_shared" = yes || enable_static=yes
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
++$as_echo "$enable_static" >&6; }
++
++
++
++
++fi
++ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++
++CC="$lt_save_CC"
++
++
++
++
++
++
++
++
++
++
++
++
++
++ ac_config_commands="$ac_config_commands libtool"
++
++
++
++
++# Only expand once:
++
++
++
++# Checks for net-snmp-config
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Searching for net-snmp lib" >&5
++$as_echo_n "checking Searching for net-snmp lib... " >&6; }
++# Extract the first word of "net-snmp-config", so it can be a program name with args.
++set dummy net-snmp-config; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_SNMP_LIBS+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$SNMP_LIBS"; then
++ ac_cv_prog_SNMP_LIBS="$SNMP_LIBS" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_SNMP_LIBS="`net-snmp-config --libs`"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ test -z "$ac_cv_prog_SNMP_LIBS" && ac_cv_prog_SNMP_LIBS="none"
++fi
++fi
++SNMP_LIBS=$ac_cv_prog_SNMP_LIBS
++if test -n "$SNMP_LIBS"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SNMP_LIBS" >&5
++$as_echo "$SNMP_LIBS" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++# Extract the first word of "net-snmp-config", so it can be a program name with args.
++set dummy net-snmp-config; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_SNMP_CFLGAS+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$SNMP_CFLGAS"; then
++ ac_cv_prog_SNMP_CFLGAS="$SNMP_CFLGAS" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_SNMP_CFLGAS="`net-snmp-config --cflags`"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ test -z "$ac_cv_prog_SNMP_CFLGAS" && ac_cv_prog_SNMP_CFLGAS="none"
++fi
++fi
++SNMP_CFLGAS=$ac_cv_prog_SNMP_CFLGAS
++if test -n "$SNMP_CFLGAS"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SNMP_CFLGAS" >&5
++$as_echo "$SNMP_CFLGAS" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++if test x"${SNMP_LIBS}" = "xnone"; then
++as_fn_error "net-snmp-config not found, please install the development package of net-snmp" "$LINENO" 5
++else
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: found net-snmp-config" >&5
++$as_echo "found net-snmp-config" >&6; }
++fi
++
++
++
++
++
++# Checks for pcap
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Searching for pcap lib" >&5
++$as_echo_n "checking Searching for pcap lib... " >&6; }
++# Extract the first word of "pcap-config", so it can be a program name with args.
++set dummy pcap-config; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_PCAP_LIBS+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$PCAP_LIBS"; then
++ ac_cv_prog_PCAP_LIBS="$PCAP_LIBS" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_PCAP_LIBS="`pcap-config --libs`"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ test -z "$ac_cv_prog_PCAP_LIBS" && ac_cv_prog_PCAP_LIBS="none"
++fi
++fi
++PCAP_LIBS=$ac_cv_prog_PCAP_LIBS
++if test -n "$PCAP_LIBS"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PCAP_LIBS" >&5
++$as_echo "$PCAP_LIBS" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++# Extract the first word of "pcap-config", so it can be a program name with args.
++set dummy pcap-config; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_PCAP_CFLGAS+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$PCAP_CFLGAS"; then
++ ac_cv_prog_PCAP_CFLGAS="$PCAP_CFLGAS" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_PCAP_CFLGAS="`pcap-config --cflags`"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ test -z "$ac_cv_prog_PCAP_CFLGAS" && ac_cv_prog_PCAP_CFLGAS="none"
++fi
++fi
++PCAP_CFLGAS=$ac_cv_prog_PCAP_CFLGAS
++if test -n "$PCAP_CFLGAS"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PCAP_CFLGAS" >&5
++$as_echo "$PCAP_CFLGAS" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++if test x"${PCAP_LIBS}" = "xnone"; then
++as_fn_error "pcap-config not found, please install the development package of libpcap" "$LINENO" 5
++else
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: found pcap" >&5
++$as_echo "found pcap" >&6; }
++fi
++
++
++
++
++
++# Checks for libcli
++
++for ac_header in libcli.h
++do :
++ ac_fn_c_check_header_mongrel "$LINENO" "libcli.h" "ac_cv_header_libcli_h" "$ac_includes_default"
++if test "x$ac_cv_header_libcli_h" = x""yes; then :
++ cat >>confdefs.h <<_ACEOF
++#define HAVE_LIBCLI_H 1
++_ACEOF
++
++fi
++
++done
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing cli_print" >&5
++$as_echo_n "checking for library containing cli_print... " >&6; }
++if test "${ac_cv_search_cli_print+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ ac_func_search_save_LIBS=$LIBS
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++/* Override any GCC internal prototype to avoid an error.
++ Use char because int might match the return type of a GCC
++ builtin and then its argument prototype would still apply. */
++#ifdef __cplusplus
++extern "C"
++#endif
++char cli_print ();
++int
++main ()
++{
++return cli_print ();
++ ;
++ return 0;
++}
++_ACEOF
++for ac_lib in '' libcli; do
++ if test -z "$ac_lib"; then
++ ac_res="none required"
++ else
++ ac_res=-l$ac_lib
++ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
++ fi
++ if ac_fn_c_try_link "$LINENO"; then :
++ ac_cv_search_cli_print=$ac_res
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext
++ if test "${ac_cv_search_cli_print+set}" = set; then :
++ break
++fi
++done
++if test "${ac_cv_search_cli_print+set}" = set; then :
++
++else
++ ac_cv_search_cli_print=no
++fi
++rm conftest.$ac_ext
++LIBS=$ac_func_search_save_LIBS
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_cli_print" >&5
++$as_echo "$ac_cv_search_cli_print" >&6; }
++ac_res=$ac_cv_search_cli_print
++if test "$ac_res" != no; then :
++ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
++ as_fn_error "libcli could not found, please install development package of libcli" "$LINENO" 5
++
++fi
++
++
++# Checks for libraries.
++
++
++
++
++ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++
++ax_pthread_ok=no
++
++# We used to check for pthread.h first, but this fails if pthread.h
++# requires special compiler flags (e.g. on True64 or Sequent).
++# It gets checked for in the link test anyway.
++
++# First of all, check if the user has set any of the PTHREAD_LIBS,
++# etcetera environment variables, and if threads linking works using
++# them:
++if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
++ save_CFLAGS="$CFLAGS"
++ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
++ save_LIBS="$LIBS"
++ LIBS="$PTHREAD_LIBS $LIBS"
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5
++$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; }
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++/* Override any GCC internal prototype to avoid an error.
++ Use char because int might match the return type of a GCC
++ builtin and then its argument prototype would still apply. */
++#ifdef __cplusplus
++extern "C"
++#endif
++char pthread_join ();
++int
++main ()
++{
++return pthread_join ();
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++ ax_pthread_ok=yes
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
++$as_echo "$ax_pthread_ok" >&6; }
++ if test x"$ax_pthread_ok" = xno; then
++ PTHREAD_LIBS=""
++ PTHREAD_CFLAGS=""
++ fi
++ LIBS="$save_LIBS"
++ CFLAGS="$save_CFLAGS"
++fi
++
++# We must check for the threads library under a number of different
++# names; the ordering is very important because some systems
++# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
++# libraries is broken (non-POSIX).
++
++# Create a list of thread flags to try. Items starting with a "-" are
++# C compiler flags, and other items are library names, except for "none"
++# which indicates that we try without any flags at all, and "pthread-config"
++# which is a program returning the flags for the Pth emulation library.
++
++ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
++
++# The ordering *is* (sometimes) important. Some notes on the
++# individual items follow:
++
++# pthreads: AIX (must check this before -lpthread)
++# none: in case threads are in libc; should be tried before -Kthread and
++# other compiler flags to prevent continual compiler warnings
++# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
++# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
++# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
++# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
++# -pthreads: Solaris/gcc
++# -mthreads: Mingw32/gcc, Lynx/gcc
++# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
++# doesn't hurt to check since this sometimes defines pthreads too;
++# also defines -D_REENTRANT)
++# ... -mt is also the pthreads flag for HP/aCC
++# pthread: Linux, etcetera
++# --thread-safe: KAI C++
++# pthread-config: use pthread-config program (for GNU Pth library)
++
++case "${host_cpu}-${host_os}" in
++ *solaris*)
++
++ # On Solaris (at least, for some versions), libc contains stubbed
++ # (non-functional) versions of the pthreads routines, so link-based
++ # tests will erroneously succeed. (We need to link with -pthreads/-mt/
++ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
++ # a function called by this macro, so we could check for that, but
++ # who knows whether they'll stub that too in a future libc.) So,
++ # we'll just look for -pthreads and -lpthread first:
++
++ ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags"
++ ;;
++esac
++
++if test x"$ax_pthread_ok" = xno; then
++for flag in $ax_pthread_flags; do
++
++ case $flag in
++ none)
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5
++$as_echo_n "checking whether pthreads work without any flags... " >&6; }
++ ;;
++
++ -*)
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5
++$as_echo_n "checking whether pthreads work with $flag... " >&6; }
++ PTHREAD_CFLAGS="$flag"
++ ;;
++
++ pthread-config)
++ # Extract the first word of "pthread-config", so it can be a program name with args.
++set dummy pthread-config; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ax_pthread_config+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$ax_pthread_config"; then
++ ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_ax_pthread_config="yes"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no"
++fi
++fi
++ax_pthread_config=$ac_cv_prog_ax_pthread_config
++if test -n "$ax_pthread_config"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5
++$as_echo "$ax_pthread_config" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++ if test x"$ax_pthread_config" = xno; then continue; fi
++ PTHREAD_CFLAGS="`pthread-config --cflags`"
++ PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
++ ;;
++
++ *)
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5
++$as_echo_n "checking for the pthreads library -l$flag... " >&6; }
++ PTHREAD_LIBS="-l$flag"
++ ;;
++ esac
++
++ save_LIBS="$LIBS"
++ save_CFLAGS="$CFLAGS"
++ LIBS="$PTHREAD_LIBS $LIBS"
++ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
++
++ # Check for various functions. We must include pthread.h,
++ # since some functions may be macros. (On the Sequent, we
++ # need a special flag -Kthread to make this header compile.)
++ # We check for pthread_join because it is in -lpthread on IRIX
++ # while pthread_create is in libc. We check for pthread_attr_init
++ # due to DEC craziness with -lpthreads. We check for
++ # pthread_cleanup_push because it is one of the few pthread
++ # functions on Solaris that doesn't have a non-functional libc stub.
++ # We try pthread_create on general principles.
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++#include <pthread.h>
++int
++main ()
++{
++pthread_t th; pthread_join(th, 0);
++ pthread_attr_init(0); pthread_cleanup_push(0, 0);
++ pthread_create(0,0,0,0); pthread_cleanup_pop(0);
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++ ax_pthread_ok=yes
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++
++ LIBS="$save_LIBS"
++ CFLAGS="$save_CFLAGS"
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
++$as_echo "$ax_pthread_ok" >&6; }
++ if test "x$ax_pthread_ok" = xyes; then
++ break;
++ fi
++
++ PTHREAD_LIBS=""
++ PTHREAD_CFLAGS=""
++done
++fi
++
++# Various other checks:
++if test "x$ax_pthread_ok" = xyes; then
++ save_LIBS="$LIBS"
++ LIBS="$PTHREAD_LIBS $LIBS"
++ save_CFLAGS="$CFLAGS"
++ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
++
++ # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5
++$as_echo_n "checking for joinable pthread attribute... " >&6; }
++ attr_name=unknown
++ for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++#include <pthread.h>
++int
++main ()
++{
++int attr=$attr; return attr;
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++ attr_name=$attr; break
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++ done
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5
++$as_echo "$attr_name" >&6; }
++ if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
++
++cat >>confdefs.h <<_ACEOF
++#define PTHREAD_CREATE_JOINABLE $attr_name
++_ACEOF
++
++ fi
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5
++$as_echo_n "checking if more special flags are required for pthreads... " >&6; }
++ flag=no
++ case "${host_cpu}-${host_os}" in
++ *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
++ *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
++ esac
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5
++$as_echo "${flag}" >&6; }
++ if test "x$flag" != xno; then
++ PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
++ fi
++
++ LIBS="$save_LIBS"
++ CFLAGS="$save_CFLAGS"
++
++ # More AIX lossage: must compile with xlc_r or cc_r
++ if test x"$GCC" != xyes; then
++ for ac_prog in xlc_r cc_r
++do
++ # Extract the first word of "$ac_prog", so it can be a program name with args.
++set dummy $ac_prog; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_PTHREAD_CC+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$PTHREAD_CC"; then
++ ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_PTHREAD_CC="$ac_prog"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++PTHREAD_CC=$ac_cv_prog_PTHREAD_CC
++if test -n "$PTHREAD_CC"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5
++$as_echo "$PTHREAD_CC" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++ test -n "$PTHREAD_CC" && break
++done
++test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}"
++
++ else
++ PTHREAD_CC=$CC
++ fi
++else
++ PTHREAD_CC="$CC"
++fi
++
++
++
++
++
++# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
++if test x"$ax_pthread_ok" = xyes; then
++
++$as_echo "#define HAVE_PTHREAD 1" >>confdefs.h
++
++ :
++else
++ ax_pthread_ok=no
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: your system does not support a pthread variant maybee libdessert will not work" >&5
++$as_echo "$as_me: WARNING: your system does not support a pthread variant maybee libdessert will not work" >&2;}
++
++fi
++ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++
++
++
++# Checks for header files.
++for ac_header in arpa/inet.h fcntl.h netinet/in.h stdint.h stdlib.h string.h sys/ioctl.h sys/socket.h syslog.h unistd.h
++do :
++ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
++ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
++eval as_val=\$$as_ac_Header
++ if test "x$as_val" = x""yes; then :
++ cat >>confdefs.h <<_ACEOF
++#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
++_ACEOF
++
++fi
++
++done
++
++
++# Checks for typedefs, structures, and compiler characteristics.
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5
++$as_echo_n "checking for stdbool.h that conforms to C99... " >&6; }
++if test "${ac_cv_header_stdbool_h+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++#include <stdbool.h>
++#ifndef bool
++ "error: bool is not defined"
++#endif
++#ifndef false
++ "error: false is not defined"
++#endif
++#if false
++ "error: false is not 0"
++#endif
++#ifndef true
++ "error: true is not defined"
++#endif
++#if true != 1
++ "error: true is not 1"
++#endif
++#ifndef __bool_true_false_are_defined
++ "error: __bool_true_false_are_defined is not defined"
++#endif
++
++ struct s { _Bool s: 1; _Bool t; } s;
++
++ char a[true == 1 ? 1 : -1];
++ char b[false == 0 ? 1 : -1];
++ char c[__bool_true_false_are_defined == 1 ? 1 : -1];
++ char d[(bool) 0.5 == true ? 1 : -1];
++ bool e = &s;
++ char f[(_Bool) 0.0 == false ? 1 : -1];
++ char g[true];
++ char h[sizeof (_Bool)];
++ char i[sizeof s.t];
++ enum { j = false, k = true, l = false * true, m = true * 256 };
++ /* The following fails for
++ HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
++ _Bool n[m];
++ char o[sizeof n == m * sizeof n[0] ? 1 : -1];
++ char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
++# if defined __xlc__ || defined __GNUC__
++ /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0
++ reported by James Lemley on 2005-10-05; see
++ http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
++ This test is not quite right, since xlc is allowed to
++ reject this program, as the initializer for xlcbug is
++ not one of the forms that C requires support for.
++ However, doing the test right would require a runtime
++ test, and that would make cross-compilation harder.
++ Let us hope that IBM fixes the xlc bug, and also adds
++ support for this kind of constant expression. In the
++ meantime, this test will reject xlc, which is OK, since
++ our stdbool.h substitute should suffice. We also test
++ this with GCC, where it should work, to detect more
++ quickly whether someone messes up the test in the
++ future. */
++ char digs[] = "0123456789";
++ int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1);
++# endif
++ /* Catch a bug in an HP-UX C compiler. See
++ http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
++ http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
++ */
++ _Bool q = true;
++ _Bool *pq = &q;
++
++int
++main ()
++{
++
++ *pq |= q;
++ *pq |= ! q;
++ /* Refer to every declared value, to avoid compiler optimizations. */
++ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
++ + !m + !n + !o + !p + !q + !pq);
++
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_compile "$LINENO"; then :
++ ac_cv_header_stdbool_h=yes
++else
++ ac_cv_header_stdbool_h=no
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5
++$as_echo "$ac_cv_header_stdbool_h" >&6; }
++ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default"
++if test "x$ac_cv_type__Bool" = x""yes; then :
++
++cat >>confdefs.h <<_ACEOF
++#define HAVE__BOOL 1
++_ACEOF
++
++
++fi
++
++if test $ac_cv_header_stdbool_h = yes; then
++
++$as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h
++
++fi
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
++$as_echo_n "checking for inline... " >&6; }
++if test "${ac_cv_c_inline+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ ac_cv_c_inline=no
++for ac_kw in inline __inline__ __inline; do
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++#ifndef __cplusplus
++typedef int foo_t;
++static $ac_kw foo_t static_foo () {return 0; }
++$ac_kw foo_t foo () {return 0; }
++#endif
++
++_ACEOF
++if ac_fn_c_try_compile "$LINENO"; then :
++ ac_cv_c_inline=$ac_kw
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++ test "$ac_cv_c_inline" != no && break
++done
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
++$as_echo "$ac_cv_c_inline" >&6; }
++
++case $ac_cv_c_inline in
++ inline | yes) ;;
++ *)
++ case $ac_cv_c_inline in
++ no) ac_val=;;
++ *) ac_val=$ac_cv_c_inline;;
++ esac
++ cat >>confdefs.h <<_ACEOF
++#ifndef __cplusplus
++#define inline $ac_val
++#endif
++_ACEOF
++ ;;
++esac
++
++ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t"
++case $ac_cv_c_int32_t in #(
++ no|yes) ;; #(
++ *)
++
++cat >>confdefs.h <<_ACEOF
++#define int32_t $ac_cv_c_int32_t
++_ACEOF
++;;
++esac
++
++ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
++if test "x$ac_cv_type_pid_t" = x""yes; then :
++
++else
++
++cat >>confdefs.h <<_ACEOF
++#define pid_t int
++_ACEOF
++
++fi
++
++ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
++if test "x$ac_cv_type_size_t" = x""yes; then :
++
++else
++
++cat >>confdefs.h <<_ACEOF
++#define size_t unsigned int
++_ACEOF
++
++fi
++
++ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default"
++if test "x$ac_cv_type_ssize_t" = x""yes; then :
++
++else
++
++cat >>confdefs.h <<_ACEOF
++#define ssize_t int
++_ACEOF
++
++fi
++
++ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t"
++case $ac_cv_c_uint16_t in #(
++ no|yes) ;; #(
++ *)
++
++
++cat >>confdefs.h <<_ACEOF
++#define uint16_t $ac_cv_c_uint16_t
++_ACEOF
++;;
++ esac
++
++ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t"
++case $ac_cv_c_uint32_t in #(
++ no|yes) ;; #(
++ *)
++
++$as_echo "#define _UINT32_T 1" >>confdefs.h
++
++
++cat >>confdefs.h <<_ACEOF
++#define uint32_t $ac_cv_c_uint32_t
++_ACEOF
++;;
++ esac
++
++ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t"
++case $ac_cv_c_uint64_t in #(
++ no|yes) ;; #(
++ *)
++
++$as_echo "#define _UINT64_T 1" >>confdefs.h
++
++
++cat >>confdefs.h <<_ACEOF
++#define uint64_t $ac_cv_c_uint64_t
++_ACEOF
++;;
++ esac
++
++ac_fn_c_find_uintX_t "$LINENO" "8" "ac_cv_c_uint8_t"
++case $ac_cv_c_uint8_t in #(
++ no|yes) ;; #(
++ *)
++
++$as_echo "#define _UINT8_T 1" >>confdefs.h
++
++
++cat >>confdefs.h <<_ACEOF
++#define uint8_t $ac_cv_c_uint8_t
++_ACEOF
++;;
++ esac
++
++
++# Checks for library functions.
++for ac_header in vfork.h
++do :
++ ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default"
++if test "x$ac_cv_header_vfork_h" = x""yes; then :
++ cat >>confdefs.h <<_ACEOF
++#define HAVE_VFORK_H 1
++_ACEOF
++
++fi
++
++done
++
++for ac_func in fork vfork
++do :
++ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
++ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
++eval as_val=\$$as_ac_var
++ if test "x$as_val" = x""yes; then :
++ cat >>confdefs.h <<_ACEOF
++#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
++_ACEOF
++
++fi
++done
++
++if test "x$ac_cv_func_fork" = xyes; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5
++$as_echo_n "checking for working fork... " >&6; }
++if test "${ac_cv_func_fork_works+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test "$cross_compiling" = yes; then :
++ ac_cv_func_fork_works=cross
++else
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++$ac_includes_default
++int
++main ()
++{
++
++ /* By Ruediger Kuhlmann. */
++ return fork () < 0;
++
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_run "$LINENO"; then :
++ ac_cv_func_fork_works=yes
++else
++ ac_cv_func_fork_works=no
++fi
++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
++ conftest.$ac_objext conftest.beam conftest.$ac_ext
++fi
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5
++$as_echo "$ac_cv_func_fork_works" >&6; }
++
++else
++ ac_cv_func_fork_works=$ac_cv_func_fork
++fi
++if test "x$ac_cv_func_fork_works" = xcross; then
++ case $host in
++ *-*-amigaos* | *-*-msdosdjgpp*)
++ # Override, as these systems have only a dummy fork() stub
++ ac_cv_func_fork_works=no
++ ;;
++ *)
++ ac_cv_func_fork_works=yes
++ ;;
++ esac
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5
++$as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;}
++fi
++ac_cv_func_vfork_works=$ac_cv_func_vfork
++if test "x$ac_cv_func_vfork" = xyes; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5
++$as_echo_n "checking for working vfork... " >&6; }
++if test "${ac_cv_func_vfork_works+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test "$cross_compiling" = yes; then :
++ ac_cv_func_vfork_works=cross
++else
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++/* Thanks to Paul Eggert for this test. */
++$ac_includes_default
++#include <sys/wait.h>
++#ifdef HAVE_VFORK_H
++# include <vfork.h>
++#endif
++/* On some sparc systems, changes by the child to local and incoming
++ argument registers are propagated back to the parent. The compiler
++ is told about this with #include <vfork.h>, but some compilers
++ (e.g. gcc -O) don't grok <vfork.h>. Test for this by using a
++ static variable whose address is put into a register that is
++ clobbered by the vfork. */
++static void
++#ifdef __cplusplus
++sparc_address_test (int arg)
++# else
++sparc_address_test (arg) int arg;
++#endif
++{
++ static pid_t child;
++ if (!child) {
++ child = vfork ();
++ if (child < 0) {
++ perror ("vfork");
++ _exit(2);
++ }
++ if (!child) {
++ arg = getpid();
++ write(-1, "", 0);
++ _exit (arg);
++ }
++ }
++}
++
++int
++main ()
++{
++ pid_t parent = getpid ();
++ pid_t child;
++
++ sparc_address_test (0);
++
++ child = vfork ();
++
++ if (child == 0) {
++ /* Here is another test for sparc vfork register problems. This
++ test uses lots of local variables, at least as many local
++ variables as main has allocated so far including compiler
++ temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris
++ 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should
++ reuse the register of parent for one of the local variables,
++ since it will think that parent can't possibly be used any more
++ in this routine. Assigning to the local variable will thus
++ munge parent in the parent process. */
++ pid_t
++ p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(),
++ p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid();
++ /* Convince the compiler that p..p7 are live; otherwise, it might
++ use the same hardware register for all 8 local variables. */
++ if (p != p1 || p != p2 || p != p3 || p != p4
++ || p != p5 || p != p6 || p != p7)
++ _exit(1);
++
++ /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent
++ from child file descriptors. If the child closes a descriptor
++ before it execs or exits, this munges the parent's descriptor
++ as well. Test for this by closing stdout in the child. */
++ _exit(close(fileno(stdout)) != 0);
++ } else {
++ int status;
++ struct stat st;
++
++ while (wait(&status) != child)
++ ;
++ return (
++ /* Was there some problem with vforking? */
++ child < 0
++
++ /* Did the child fail? (This shouldn't happen.) */
++ || status
++
++ /* Did the vfork/compiler bug occur? */
++ || parent != getpid()
++
++ /* Did the file descriptor bug occur? */
++ || fstat(fileno(stdout), &st) != 0
++ );
++ }
++}
++_ACEOF
++if ac_fn_c_try_run "$LINENO"; then :
++ ac_cv_func_vfork_works=yes
++else
++ ac_cv_func_vfork_works=no
++fi
++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
++ conftest.$ac_objext conftest.beam conftest.$ac_ext
++fi
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5
++$as_echo "$ac_cv_func_vfork_works" >&6; }
++
++fi;
++if test "x$ac_cv_func_fork_works" = xcross; then
++ ac_cv_func_vfork_works=$ac_cv_func_vfork
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5
++$as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;}
++fi
++
++if test "x$ac_cv_func_vfork_works" = xyes; then
++
++$as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h
++
++else
++
++$as_echo "#define vfork fork" >>confdefs.h
++
++fi
++if test "x$ac_cv_func_fork_works" = xyes; then
++
++$as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h
++
++fi
++
++for ac_header in stdlib.h
++do :
++ ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
++if test "x$ac_cv_header_stdlib_h" = x""yes; then :
++ cat >>confdefs.h <<_ACEOF
++#define HAVE_STDLIB_H 1
++_ACEOF
++
++fi
++
++done
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5
++$as_echo_n "checking for GNU libc compatible malloc... " >&6; }
++if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test "$cross_compiling" = yes; then :
++ ac_cv_func_malloc_0_nonnull=no
++else
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++#if defined STDC_HEADERS || defined HAVE_STDLIB_H
++# include <stdlib.h>
++#else
++char *malloc ();
++#endif
++
++int
++main ()
++{
++return ! malloc (0);
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_run "$LINENO"; then :
++ ac_cv_func_malloc_0_nonnull=yes
++else
++ ac_cv_func_malloc_0_nonnull=no
++fi
++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
++ conftest.$ac_objext conftest.beam conftest.$ac_ext
++fi
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5
++$as_echo "$ac_cv_func_malloc_0_nonnull" >&6; }
++if test $ac_cv_func_malloc_0_nonnull = yes; then :
++
++$as_echo "#define HAVE_MALLOC 1" >>confdefs.h
++
++else
++ $as_echo "#define HAVE_MALLOC 0" >>confdefs.h
++
++ case " $LIBOBJS " in
++ *" malloc.$ac_objext "* ) ;;
++ *) LIBOBJS="$LIBOBJS malloc.$ac_objext"
++ ;;
++esac
++
++
++$as_echo "#define malloc rpl_malloc" >>confdefs.h
++
++fi
++
++
++for ac_header in stdlib.h
++do :
++ ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
++if test "x$ac_cv_header_stdlib_h" = x""yes; then :
++ cat >>confdefs.h <<_ACEOF
++#define HAVE_STDLIB_H 1
++_ACEOF
++
++fi
++
++done
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5
++$as_echo_n "checking for GNU libc compatible realloc... " >&6; }
++if test "${ac_cv_func_realloc_0_nonnull+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test "$cross_compiling" = yes; then :
++ ac_cv_func_realloc_0_nonnull=no
++else
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++#if defined STDC_HEADERS || defined HAVE_STDLIB_H
++# include <stdlib.h>
++#else
++char *realloc ();
++#endif
++
++int
++main ()
++{
++return ! realloc (0, 0);
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_run "$LINENO"; then :
++ ac_cv_func_realloc_0_nonnull=yes
++else
++ ac_cv_func_realloc_0_nonnull=no
++fi
++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
++ conftest.$ac_objext conftest.beam conftest.$ac_ext
++fi
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5
++$as_echo "$ac_cv_func_realloc_0_nonnull" >&6; }
++if test $ac_cv_func_realloc_0_nonnull = yes; then :
++
++$as_echo "#define HAVE_REALLOC 1" >>confdefs.h
++
++else
++ $as_echo "#define HAVE_REALLOC 0" >>confdefs.h
++
++ case " $LIBOBJS " in
++ *" realloc.$ac_objext "* ) ;;
++ *) LIBOBJS="$LIBOBJS realloc.$ac_objext"
++ ;;
++esac
++
++
++$as_echo "#define realloc rpl_realloc" >>confdefs.h
++
++fi
++
++
++for ac_func in gethostname gettimeofday localtime_r memmove memset socket strdup strerror strtol
++do :
++ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
++ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
++eval as_val=\$$as_ac_var
++ if test "x$as_val" = x""yes; then :
++ cat >>confdefs.h <<_ACEOF
++#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
++_ACEOF
++
++fi
++done
++
++
++# Checking for documentation generation
++
++
++
++
++
++
++
++
++
++
++
++# Files:
++DX_PROJECT=${PACKAGE_NAME}
++
++DX_CONFIG=DES-SERT.doxyfile
++
++DX_DOCDIR=doxygen
++
++
++# Environment variables used inside doxygen.cfg:
++DX_ENV="$DX_ENV SRCDIR='$srcdir'"
++
++DX_ENV="$DX_ENV PROJECT='$DX_PROJECT'"
++
++DX_ENV="$DX_ENV DOCDIR='$DX_DOCDIR'"
++
++DX_ENV="$DX_ENV VERSION='$PACKAGE_VERSION'"
++
++
++# Doxygen itself:
++
++
++
++ # Check whether --enable-doxygen-doc was given.
++if test "${enable_doxygen_doc+set}" = set; then :
++ enableval=$enable_doxygen_doc;
++case "$enableval" in
++#(
++y|Y|yes|Yes|YES)
++ DX_FLAG_doc=1
++
++
++;; #(
++n|N|no|No|NO)
++ DX_FLAG_doc=0
++
++;; #(
++*)
++ as_fn_error "invalid value '$enableval' given to doxygen-doc" "$LINENO" 5
++;;
++esac
++
++else
++
++DX_FLAG_doc=1
++
++
++
++fi
++
++if test "$DX_FLAG_doc" = 1; then
++
++if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}doxygen", so it can be a program name with args.
++set dummy ${ac_tool_prefix}doxygen; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_DX_DOXYGEN+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $DX_DOXYGEN in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_DX_DOXYGEN="$DX_DOXYGEN" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++DX_DOXYGEN=$ac_cv_path_DX_DOXYGEN
++if test -n "$DX_DOXYGEN"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOXYGEN" >&5
++$as_echo "$DX_DOXYGEN" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_path_DX_DOXYGEN"; then
++ ac_pt_DX_DOXYGEN=$DX_DOXYGEN
++ # Extract the first word of "doxygen", so it can be a program name with args.
++set dummy doxygen; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_ac_pt_DX_DOXYGEN+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $ac_pt_DX_DOXYGEN in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_ac_pt_DX_DOXYGEN="$ac_pt_DX_DOXYGEN" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_ac_pt_DX_DOXYGEN="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++ac_pt_DX_DOXYGEN=$ac_cv_path_ac_pt_DX_DOXYGEN
++if test -n "$ac_pt_DX_DOXYGEN"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOXYGEN" >&5
++$as_echo "$ac_pt_DX_DOXYGEN" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_pt_DX_DOXYGEN" = x; then
++ DX_DOXYGEN=""
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ DX_DOXYGEN=$ac_pt_DX_DOXYGEN
++ fi
++else
++ DX_DOXYGEN="$ac_cv_path_DX_DOXYGEN"
++fi
++
++if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOXYGEN" = 1; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: doxygen not found - will not generate any doxygen documentation" >&5
++$as_echo "$as_me: WARNING: doxygen not found - will not generate any doxygen documentation" >&2;}
++ DX_FLAG_doc=0
++
++fi
++
++
++if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}perl", so it can be a program name with args.
++set dummy ${ac_tool_prefix}perl; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_DX_PERL+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $DX_PERL in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_DX_PERL="$DX_PERL" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_DX_PERL="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++DX_PERL=$ac_cv_path_DX_PERL
++if test -n "$DX_PERL"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PERL" >&5
++$as_echo "$DX_PERL" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_path_DX_PERL"; then
++ ac_pt_DX_PERL=$DX_PERL
++ # Extract the first word of "perl", so it can be a program name with args.
++set dummy perl; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_ac_pt_DX_PERL+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $ac_pt_DX_PERL in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_ac_pt_DX_PERL="$ac_pt_DX_PERL" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_ac_pt_DX_PERL="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++ac_pt_DX_PERL=$ac_cv_path_ac_pt_DX_PERL
++if test -n "$ac_pt_DX_PERL"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PERL" >&5
++$as_echo "$ac_pt_DX_PERL" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_pt_DX_PERL" = x; then
++ DX_PERL=""
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ DX_PERL=$ac_pt_DX_PERL
++ fi
++else
++ DX_PERL="$ac_cv_path_DX_PERL"
++fi
++
++if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PERL" = 1; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: perl not found - will not generate any doxygen documentation" >&5
++$as_echo "$as_me: WARNING: perl not found - will not generate any doxygen documentation" >&2;}
++ DX_FLAG_doc=0
++
++fi
++
++ :
++fi
++if test "$DX_FLAG_doc" = 1; then
++ if :; then
++ DX_COND_doc_TRUE=
++ DX_COND_doc_FALSE='#'
++else
++ DX_COND_doc_TRUE='#'
++ DX_COND_doc_FALSE=
++fi
++
++ DX_ENV="$DX_ENV PERL_PATH='$DX_PERL'"
++
++ :
++else
++ if false; then
++ DX_COND_doc_TRUE=
++ DX_COND_doc_FALSE='#'
++else
++ DX_COND_doc_TRUE='#'
++ DX_COND_doc_FALSE=
++fi
++
++
++ :
++fi
++
++
++# Dot for graphics:
++
++
++
++ # Check whether --enable-doxygen-dot was given.
++if test "${enable_doxygen_dot+set}" = set; then :
++ enableval=$enable_doxygen_dot;
++case "$enableval" in
++#(
++y|Y|yes|Yes|YES)
++ DX_FLAG_dot=1
++
++
++test "$DX_FLAG_doc" = "1" \
++|| as_fn_error "doxygen-dot requires doxygen-dot" "$LINENO" 5
++
++;; #(
++n|N|no|No|NO)
++ DX_FLAG_dot=0
++
++;; #(
++*)
++ as_fn_error "invalid value '$enableval' given to doxygen-dot" "$LINENO" 5
++;;
++esac
++
++else
++
++DX_FLAG_dot=1
++
++
++test "$DX_FLAG_doc" = "1" || DX_FLAG_dot=0
++
++
++
++fi
++
++if test "$DX_FLAG_dot" = 1; then
++
++if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}dot", so it can be a program name with args.
++set dummy ${ac_tool_prefix}dot; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_DX_DOT+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $DX_DOT in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_DX_DOT="$DX_DOT" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_DX_DOT="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++DX_DOT=$ac_cv_path_DX_DOT
++if test -n "$DX_DOT"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DOT" >&5
++$as_echo "$DX_DOT" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_path_DX_DOT"; then
++ ac_pt_DX_DOT=$DX_DOT
++ # Extract the first word of "dot", so it can be a program name with args.
++set dummy dot; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_ac_pt_DX_DOT+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $ac_pt_DX_DOT in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_ac_pt_DX_DOT="$ac_pt_DX_DOT" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_ac_pt_DX_DOT="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++ac_pt_DX_DOT=$ac_cv_path_ac_pt_DX_DOT
++if test -n "$ac_pt_DX_DOT"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DOT" >&5
++$as_echo "$ac_pt_DX_DOT" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_pt_DX_DOT" = x; then
++ DX_DOT=""
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ DX_DOT=$ac_pt_DX_DOT
++ fi
++else
++ DX_DOT="$ac_cv_path_DX_DOT"
++fi
++
++if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DOT" = 1; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dot not found - will not generate graphics for doxygen documentation" >&5
++$as_echo "$as_me: WARNING: dot not found - will not generate graphics for doxygen documentation" >&2;}
++ DX_FLAG_dot=0
++
++fi
++
++ :
++fi
++if test "$DX_FLAG_dot" = 1; then
++ if :; then
++ DX_COND_dot_TRUE=
++ DX_COND_dot_FALSE='#'
++else
++ DX_COND_dot_TRUE='#'
++ DX_COND_dot_FALSE=
++fi
++
++ DX_ENV="$DX_ENV HAVE_DOT='YES'"
++
++ DX_ENV="$DX_ENV DOT_PATH='`expr ".$DX_DOT" : '\(\.\)[^/]*$' \| "x$DX_DOT" : 'x\(.*\)/[^/]*$'`'"
++
++ :
++else
++ if false; then
++ DX_COND_dot_TRUE=
++ DX_COND_dot_FALSE='#'
++else
++ DX_COND_dot_TRUE='#'
++ DX_COND_dot_FALSE=
++fi
++
++ DX_ENV="$DX_ENV HAVE_DOT='NO'"
++
++ :
++fi
++
++
++# Man pages generation:
++
++
++
++ # Check whether --enable-doxygen-man was given.
++if test "${enable_doxygen_man+set}" = set; then :
++ enableval=$enable_doxygen_man;
++case "$enableval" in
++#(
++y|Y|yes|Yes|YES)
++ DX_FLAG_man=1
++
++
++test "$DX_FLAG_doc" = "1" \
++|| as_fn_error "doxygen-man requires doxygen-man" "$LINENO" 5
++
++;; #(
++n|N|no|No|NO)
++ DX_FLAG_man=0
++
++;; #(
++*)
++ as_fn_error "invalid value '$enableval' given to doxygen-man" "$LINENO" 5
++;;
++esac
++
++else
++
++DX_FLAG_man=0
++
++
++test "$DX_FLAG_doc" = "1" || DX_FLAG_man=0
++
++
++
++fi
++
++if test "$DX_FLAG_man" = 1; then
++
++ :
++fi
++if test "$DX_FLAG_man" = 1; then
++ if :; then
++ DX_COND_man_TRUE=
++ DX_COND_man_FALSE='#'
++else
++ DX_COND_man_TRUE='#'
++ DX_COND_man_FALSE=
++fi
++
++ DX_ENV="$DX_ENV GENERATE_MAN='YES'"
++
++ :
++else
++ if false; then
++ DX_COND_man_TRUE=
++ DX_COND_man_FALSE='#'
++else
++ DX_COND_man_TRUE='#'
++ DX_COND_man_FALSE=
++fi
++
++ DX_ENV="$DX_ENV GENERATE_MAN='NO'"
++
++ :
++fi
++
++
++# RTF file generation:
++
++
++
++ # Check whether --enable-doxygen-rtf was given.
++if test "${enable_doxygen_rtf+set}" = set; then :
++ enableval=$enable_doxygen_rtf;
++case "$enableval" in
++#(
++y|Y|yes|Yes|YES)
++ DX_FLAG_rtf=1
++
++
++test "$DX_FLAG_doc" = "1" \
++|| as_fn_error "doxygen-rtf requires doxygen-rtf" "$LINENO" 5
++
++;; #(
++n|N|no|No|NO)
++ DX_FLAG_rtf=0
++
++;; #(
++*)
++ as_fn_error "invalid value '$enableval' given to doxygen-rtf" "$LINENO" 5
++;;
++esac
++
++else
++
++DX_FLAG_rtf=0
++
++
++test "$DX_FLAG_doc" = "1" || DX_FLAG_rtf=0
++
++
++
++fi
++
++if test "$DX_FLAG_rtf" = 1; then
++
++ :
++fi
++if test "$DX_FLAG_rtf" = 1; then
++ if :; then
++ DX_COND_rtf_TRUE=
++ DX_COND_rtf_FALSE='#'
++else
++ DX_COND_rtf_TRUE='#'
++ DX_COND_rtf_FALSE=
++fi
++
++ DX_ENV="$DX_ENV GENERATE_RTF='YES'"
++
++ :
++else
++ if false; then
++ DX_COND_rtf_TRUE=
++ DX_COND_rtf_FALSE='#'
++else
++ DX_COND_rtf_TRUE='#'
++ DX_COND_rtf_FALSE=
++fi
++
++ DX_ENV="$DX_ENV GENERATE_RTF='NO'"
++
++ :
++fi
++
++
++# XML file generation:
++
++
++
++ # Check whether --enable-doxygen-xml was given.
++if test "${enable_doxygen_xml+set}" = set; then :
++ enableval=$enable_doxygen_xml;
++case "$enableval" in
++#(
++y|Y|yes|Yes|YES)
++ DX_FLAG_xml=1
++
++
++test "$DX_FLAG_doc" = "1" \
++|| as_fn_error "doxygen-xml requires doxygen-xml" "$LINENO" 5
++
++;; #(
++n|N|no|No|NO)
++ DX_FLAG_xml=0
++
++;; #(
++*)
++ as_fn_error "invalid value '$enableval' given to doxygen-xml" "$LINENO" 5
++;;
++esac
++
++else
++
++DX_FLAG_xml=0
++
++
++test "$DX_FLAG_doc" = "1" || DX_FLAG_xml=0
++
++
++
++fi
++
++if test "$DX_FLAG_xml" = 1; then
++
++ :
++fi
++if test "$DX_FLAG_xml" = 1; then
++ if :; then
++ DX_COND_xml_TRUE=
++ DX_COND_xml_FALSE='#'
++else
++ DX_COND_xml_TRUE='#'
++ DX_COND_xml_FALSE=
++fi
++
++ DX_ENV="$DX_ENV GENERATE_XML='YES'"
++
++ :
++else
++ if false; then
++ DX_COND_xml_TRUE=
++ DX_COND_xml_FALSE='#'
++else
++ DX_COND_xml_TRUE='#'
++ DX_COND_xml_FALSE=
++fi
++
++ DX_ENV="$DX_ENV GENERATE_XML='NO'"
++
++ :
++fi
++
++
++# (Compressed) HTML help generation:
++
++
++
++ # Check whether --enable-doxygen-chm was given.
++if test "${enable_doxygen_chm+set}" = set; then :
++ enableval=$enable_doxygen_chm;
++case "$enableval" in
++#(
++y|Y|yes|Yes|YES)
++ DX_FLAG_chm=1
++
++
++test "$DX_FLAG_doc" = "1" \
++|| as_fn_error "doxygen-chm requires doxygen-chm" "$LINENO" 5
++
++;; #(
++n|N|no|No|NO)
++ DX_FLAG_chm=0
++
++;; #(
++*)
++ as_fn_error "invalid value '$enableval' given to doxygen-chm" "$LINENO" 5
++;;
++esac
++
++else
++
++DX_FLAG_chm=0
++
++
++test "$DX_FLAG_doc" = "1" || DX_FLAG_chm=0
++
++
++
++fi
++
++if test "$DX_FLAG_chm" = 1; then
++
++if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}hhc", so it can be a program name with args.
++set dummy ${ac_tool_prefix}hhc; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_DX_HHC+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $DX_HHC in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_DX_HHC="$DX_HHC" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_DX_HHC="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++DX_HHC=$ac_cv_path_DX_HHC
++if test -n "$DX_HHC"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_HHC" >&5
++$as_echo "$DX_HHC" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_path_DX_HHC"; then
++ ac_pt_DX_HHC=$DX_HHC
++ # Extract the first word of "hhc", so it can be a program name with args.
++set dummy hhc; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_ac_pt_DX_HHC+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $ac_pt_DX_HHC in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_ac_pt_DX_HHC="$ac_pt_DX_HHC" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_ac_pt_DX_HHC="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++ac_pt_DX_HHC=$ac_cv_path_ac_pt_DX_HHC
++if test -n "$ac_pt_DX_HHC"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_HHC" >&5
++$as_echo "$ac_pt_DX_HHC" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_pt_DX_HHC" = x; then
++ DX_HHC=""
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ DX_HHC=$ac_pt_DX_HHC
++ fi
++else
++ DX_HHC="$ac_cv_path_DX_HHC"
++fi
++
++if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_HHC" = 1; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&5
++$as_echo "$as_me: WARNING: hhc not found - will not generate doxygen compressed HTML help documentation" >&2;}
++ DX_FLAG_chm=0
++
++fi
++
++ :
++fi
++if test "$DX_FLAG_chm" = 1; then
++ if :; then
++ DX_COND_chm_TRUE=
++ DX_COND_chm_FALSE='#'
++else
++ DX_COND_chm_TRUE='#'
++ DX_COND_chm_FALSE=
++fi
++
++ DX_ENV="$DX_ENV HHC_PATH='$DX_HHC'"
++
++ DX_ENV="$DX_ENV GENERATE_HTML='YES'"
++
++ DX_ENV="$DX_ENV GENERATE_HTMLHELP='YES'"
++
++ :
++else
++ if false; then
++ DX_COND_chm_TRUE=
++ DX_COND_chm_FALSE='#'
++else
++ DX_COND_chm_TRUE='#'
++ DX_COND_chm_FALSE=
++fi
++
++ DX_ENV="$DX_ENV GENERATE_HTMLHELP='NO'"
++
++ :
++fi
++
++
++# Seperate CHI file generation.
++
++
++
++ # Check whether --enable-doxygen-chi was given.
++if test "${enable_doxygen_chi+set}" = set; then :
++ enableval=$enable_doxygen_chi;
++case "$enableval" in
++#(
++y|Y|yes|Yes|YES)
++ DX_FLAG_chi=1
++
++
++test "$DX_FLAG_chm" = "1" \
++|| as_fn_error "doxygen-chi requires doxygen-chi" "$LINENO" 5
++
++;; #(
++n|N|no|No|NO)
++ DX_FLAG_chi=0
++
++;; #(
++*)
++ as_fn_error "invalid value '$enableval' given to doxygen-chi" "$LINENO" 5
++;;
++esac
++
++else
++
++DX_FLAG_chi=0
++
++
++test "$DX_FLAG_chm" = "1" || DX_FLAG_chi=0
++
++
++
++fi
++
++if test "$DX_FLAG_chi" = 1; then
++
++ :
++fi
++if test "$DX_FLAG_chi" = 1; then
++ if :; then
++ DX_COND_chi_TRUE=
++ DX_COND_chi_FALSE='#'
++else
++ DX_COND_chi_TRUE='#'
++ DX_COND_chi_FALSE=
++fi
++
++ DX_ENV="$DX_ENV GENERATE_CHI='YES'"
++
++ :
++else
++ if false; then
++ DX_COND_chi_TRUE=
++ DX_COND_chi_FALSE='#'
++else
++ DX_COND_chi_TRUE='#'
++ DX_COND_chi_FALSE=
++fi
++
++ DX_ENV="$DX_ENV GENERATE_CHI='NO'"
++
++ :
++fi
++
++
++# Plain HTML pages generation:
++
++
++
++ # Check whether --enable-doxygen-html was given.
++if test "${enable_doxygen_html+set}" = set; then :
++ enableval=$enable_doxygen_html;
++case "$enableval" in
++#(
++y|Y|yes|Yes|YES)
++ DX_FLAG_html=1
++
++
++test "$DX_FLAG_doc" = "1" \
++|| as_fn_error "doxygen-html requires doxygen-html" "$LINENO" 5
++
++test "$DX_FLAG_chm" = "0" \
++|| as_fn_error "doxygen-html contradicts doxygen-html" "$LINENO" 5
++
++;; #(
++n|N|no|No|NO)
++ DX_FLAG_html=0
++
++;; #(
++*)
++ as_fn_error "invalid value '$enableval' given to doxygen-html" "$LINENO" 5
++;;
++esac
++
++else
++
++DX_FLAG_html=1
++
++
++test "$DX_FLAG_doc" = "1" || DX_FLAG_html=0
++
++
++test "$DX_FLAG_chm" = "0" || DX_FLAG_html=0
++
++
++
++fi
++
++if test "$DX_FLAG_html" = 1; then
++
++ :
++fi
++if test "$DX_FLAG_html" = 1; then
++ if :; then
++ DX_COND_html_TRUE=
++ DX_COND_html_FALSE='#'
++else
++ DX_COND_html_TRUE='#'
++ DX_COND_html_FALSE=
++fi
++
++ DX_ENV="$DX_ENV GENERATE_HTML='YES'"
++
++ :
++else
++ if false; then
++ DX_COND_html_TRUE=
++ DX_COND_html_FALSE='#'
++else
++ DX_COND_html_TRUE='#'
++ DX_COND_html_FALSE=
++fi
++
++ test "$DX_FLAG_chm" = 1 || DX_ENV="$DX_ENV GENERATE_HTML='NO'"
++
++ :
++fi
++
++
++# PostScript file generation:
++
++
++
++ # Check whether --enable-doxygen-ps was given.
++if test "${enable_doxygen_ps+set}" = set; then :
++ enableval=$enable_doxygen_ps;
++case "$enableval" in
++#(
++y|Y|yes|Yes|YES)
++ DX_FLAG_ps=1
++
++
++test "$DX_FLAG_doc" = "1" \
++|| as_fn_error "doxygen-ps requires doxygen-ps" "$LINENO" 5
++
++;; #(
++n|N|no|No|NO)
++ DX_FLAG_ps=0
++
++;; #(
++*)
++ as_fn_error "invalid value '$enableval' given to doxygen-ps" "$LINENO" 5
++;;
++esac
++
++else
++
++DX_FLAG_ps=0
++
++
++test "$DX_FLAG_doc" = "1" || DX_FLAG_ps=0
++
++
++
++fi
++
++if test "$DX_FLAG_ps" = 1; then
++
++if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}latex", so it can be a program name with args.
++set dummy ${ac_tool_prefix}latex; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_DX_LATEX+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $DX_LATEX in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_DX_LATEX="$DX_LATEX" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_DX_LATEX="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++DX_LATEX=$ac_cv_path_DX_LATEX
++if test -n "$DX_LATEX"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_LATEX" >&5
++$as_echo "$DX_LATEX" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_path_DX_LATEX"; then
++ ac_pt_DX_LATEX=$DX_LATEX
++ # Extract the first word of "latex", so it can be a program name with args.
++set dummy latex; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_ac_pt_DX_LATEX+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $ac_pt_DX_LATEX in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_ac_pt_DX_LATEX="$ac_pt_DX_LATEX" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_ac_pt_DX_LATEX="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++ac_pt_DX_LATEX=$ac_cv_path_ac_pt_DX_LATEX
++if test -n "$ac_pt_DX_LATEX"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_LATEX" >&5
++$as_echo "$ac_pt_DX_LATEX" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_pt_DX_LATEX" = x; then
++ DX_LATEX=""
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ DX_LATEX=$ac_pt_DX_LATEX
++ fi
++else
++ DX_LATEX="$ac_cv_path_DX_LATEX"
++fi
++
++if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_LATEX" = 1; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: latex not found - will not generate doxygen PostScript documentation" >&5
++$as_echo "$as_me: WARNING: latex not found - will not generate doxygen PostScript documentation" >&2;}
++ DX_FLAG_ps=0
++
++fi
++
++
++if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args.
++set dummy ${ac_tool_prefix}makeindex; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_DX_MAKEINDEX+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $DX_MAKEINDEX in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX
++if test -n "$DX_MAKEINDEX"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5
++$as_echo "$DX_MAKEINDEX" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_path_DX_MAKEINDEX"; then
++ ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX
++ # Extract the first word of "makeindex", so it can be a program name with args.
++set dummy makeindex; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_ac_pt_DX_MAKEINDEX+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $ac_pt_DX_MAKEINDEX in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX
++if test -n "$ac_pt_DX_MAKEINDEX"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5
++$as_echo "$ac_pt_DX_MAKEINDEX" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_pt_DX_MAKEINDEX" = x; then
++ DX_MAKEINDEX=""
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX
++ fi
++else
++ DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX"
++fi
++
++if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&5
++$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PostScript documentation" >&2;}
++ DX_FLAG_ps=0
++
++fi
++
++
++if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}dvips", so it can be a program name with args.
++set dummy ${ac_tool_prefix}dvips; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_DX_DVIPS+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $DX_DVIPS in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_DX_DVIPS="$DX_DVIPS" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++DX_DVIPS=$ac_cv_path_DX_DVIPS
++if test -n "$DX_DVIPS"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_DVIPS" >&5
++$as_echo "$DX_DVIPS" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_path_DX_DVIPS"; then
++ ac_pt_DX_DVIPS=$DX_DVIPS
++ # Extract the first word of "dvips", so it can be a program name with args.
++set dummy dvips; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_ac_pt_DX_DVIPS+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $ac_pt_DX_DVIPS in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_ac_pt_DX_DVIPS="$ac_pt_DX_DVIPS" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_ac_pt_DX_DVIPS="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++ac_pt_DX_DVIPS=$ac_cv_path_ac_pt_DX_DVIPS
++if test -n "$ac_pt_DX_DVIPS"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_DVIPS" >&5
++$as_echo "$ac_pt_DX_DVIPS" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_pt_DX_DVIPS" = x; then
++ DX_DVIPS=""
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ DX_DVIPS=$ac_pt_DX_DVIPS
++ fi
++else
++ DX_DVIPS="$ac_cv_path_DX_DVIPS"
++fi
++
++if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_DVIPS" = 1; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&5
++$as_echo "$as_me: WARNING: dvips not found - will not generate doxygen PostScript documentation" >&2;}
++ DX_FLAG_ps=0
++
++fi
++
++
++if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args.
++set dummy ${ac_tool_prefix}egrep; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_DX_EGREP+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $DX_EGREP in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++DX_EGREP=$ac_cv_path_DX_EGREP
++if test -n "$DX_EGREP"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5
++$as_echo "$DX_EGREP" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_path_DX_EGREP"; then
++ ac_pt_DX_EGREP=$DX_EGREP
++ # Extract the first word of "egrep", so it can be a program name with args.
++set dummy egrep; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_ac_pt_DX_EGREP+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $ac_pt_DX_EGREP in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP
++if test -n "$ac_pt_DX_EGREP"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5
++$as_echo "$ac_pt_DX_EGREP" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_pt_DX_EGREP" = x; then
++ DX_EGREP=""
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ DX_EGREP=$ac_pt_DX_EGREP
++ fi
++else
++ DX_EGREP="$ac_cv_path_DX_EGREP"
++fi
++
++if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&5
++$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PostScript documentation" >&2;}
++ DX_FLAG_ps=0
++
++fi
++
++ :
++fi
++if test "$DX_FLAG_ps" = 1; then
++ if :; then
++ DX_COND_ps_TRUE=
++ DX_COND_ps_FALSE='#'
++else
++ DX_COND_ps_TRUE='#'
++ DX_COND_ps_FALSE=
++fi
++
++
++ :
++else
++ if false; then
++ DX_COND_ps_TRUE=
++ DX_COND_ps_FALSE='#'
++else
++ DX_COND_ps_TRUE='#'
++ DX_COND_ps_FALSE=
++fi
++
++
++ :
++fi
++
++
++# PDF file generation:
++
++
++
++ # Check whether --enable-doxygen-pdf was given.
++if test "${enable_doxygen_pdf+set}" = set; then :
++ enableval=$enable_doxygen_pdf;
++case "$enableval" in
++#(
++y|Y|yes|Yes|YES)
++ DX_FLAG_pdf=1
++
++
++test "$DX_FLAG_doc" = "1" \
++|| as_fn_error "doxygen-pdf requires doxygen-pdf" "$LINENO" 5
++
++;; #(
++n|N|no|No|NO)
++ DX_FLAG_pdf=0
++
++;; #(
++*)
++ as_fn_error "invalid value '$enableval' given to doxygen-pdf" "$LINENO" 5
++;;
++esac
++
++else
++
++DX_FLAG_pdf=1
++
++
++test "$DX_FLAG_doc" = "1" || DX_FLAG_pdf=0
++
++
++
++fi
++
++if test "$DX_FLAG_pdf" = 1; then
++
++if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}pdflatex", so it can be a program name with args.
++set dummy ${ac_tool_prefix}pdflatex; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_DX_PDFLATEX+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $DX_PDFLATEX in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_DX_PDFLATEX="$DX_PDFLATEX" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++DX_PDFLATEX=$ac_cv_path_DX_PDFLATEX
++if test -n "$DX_PDFLATEX"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_PDFLATEX" >&5
++$as_echo "$DX_PDFLATEX" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_path_DX_PDFLATEX"; then
++ ac_pt_DX_PDFLATEX=$DX_PDFLATEX
++ # Extract the first word of "pdflatex", so it can be a program name with args.
++set dummy pdflatex; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_ac_pt_DX_PDFLATEX+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $ac_pt_DX_PDFLATEX in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_ac_pt_DX_PDFLATEX="$ac_pt_DX_PDFLATEX" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_ac_pt_DX_PDFLATEX="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++ac_pt_DX_PDFLATEX=$ac_cv_path_ac_pt_DX_PDFLATEX
++if test -n "$ac_pt_DX_PDFLATEX"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_PDFLATEX" >&5
++$as_echo "$ac_pt_DX_PDFLATEX" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_pt_DX_PDFLATEX" = x; then
++ DX_PDFLATEX=""
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ DX_PDFLATEX=$ac_pt_DX_PDFLATEX
++ fi
++else
++ DX_PDFLATEX="$ac_cv_path_DX_PDFLATEX"
++fi
++
++if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_PDFLATEX" = 1; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&5
++$as_echo "$as_me: WARNING: pdflatex not found - will not generate doxygen PDF documentation" >&2;}
++ DX_FLAG_pdf=0
++
++fi
++
++
++if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}makeindex", so it can be a program name with args.
++set dummy ${ac_tool_prefix}makeindex; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_DX_MAKEINDEX+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $DX_MAKEINDEX in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_DX_MAKEINDEX="$DX_MAKEINDEX" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++DX_MAKEINDEX=$ac_cv_path_DX_MAKEINDEX
++if test -n "$DX_MAKEINDEX"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_MAKEINDEX" >&5
++$as_echo "$DX_MAKEINDEX" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_path_DX_MAKEINDEX"; then
++ ac_pt_DX_MAKEINDEX=$DX_MAKEINDEX
++ # Extract the first word of "makeindex", so it can be a program name with args.
++set dummy makeindex; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_ac_pt_DX_MAKEINDEX+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $ac_pt_DX_MAKEINDEX in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_ac_pt_DX_MAKEINDEX="$ac_pt_DX_MAKEINDEX" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_ac_pt_DX_MAKEINDEX="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++ac_pt_DX_MAKEINDEX=$ac_cv_path_ac_pt_DX_MAKEINDEX
++if test -n "$ac_pt_DX_MAKEINDEX"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_MAKEINDEX" >&5
++$as_echo "$ac_pt_DX_MAKEINDEX" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_pt_DX_MAKEINDEX" = x; then
++ DX_MAKEINDEX=""
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ DX_MAKEINDEX=$ac_pt_DX_MAKEINDEX
++ fi
++else
++ DX_MAKEINDEX="$ac_cv_path_DX_MAKEINDEX"
++fi
++
++if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_MAKEINDEX" = 1; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&5
++$as_echo "$as_me: WARNING: makeindex not found - will not generate doxygen PDF documentation" >&2;}
++ DX_FLAG_pdf=0
++
++fi
++
++
++if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}egrep", so it can be a program name with args.
++set dummy ${ac_tool_prefix}egrep; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_DX_EGREP+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $DX_EGREP in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_DX_EGREP="$DX_EGREP" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_DX_EGREP="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++DX_EGREP=$ac_cv_path_DX_EGREP
++if test -n "$DX_EGREP"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DX_EGREP" >&5
++$as_echo "$DX_EGREP" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_path_DX_EGREP"; then
++ ac_pt_DX_EGREP=$DX_EGREP
++ # Extract the first word of "egrep", so it can be a program name with args.
++set dummy egrep; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_ac_pt_DX_EGREP+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ case $ac_pt_DX_EGREP in
++ [\\/]* | ?:[\\/]*)
++ ac_cv_path_ac_pt_DX_EGREP="$ac_pt_DX_EGREP" # Let the user override the test with a path.
++ ;;
++ *)
++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_path_ac_pt_DX_EGREP="$as_dir/$ac_word$ac_exec_ext"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++fi
++ac_pt_DX_EGREP=$ac_cv_path_ac_pt_DX_EGREP
++if test -n "$ac_pt_DX_EGREP"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_DX_EGREP" >&5
++$as_echo "$ac_pt_DX_EGREP" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++ if test "x$ac_pt_DX_EGREP" = x; then
++ DX_EGREP=""
++ else
++ case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++ DX_EGREP=$ac_pt_DX_EGREP
++ fi
++else
++ DX_EGREP="$ac_cv_path_DX_EGREP"
++fi
++
++if test "$DX_FLAG_$DX_CURRENT_FEATURE$DX_EGREP" = 1; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: egrep not found - will not generate doxygen PDF documentation" >&5
++$as_echo "$as_me: WARNING: egrep not found - will not generate doxygen PDF documentation" >&2;}
++ DX_FLAG_pdf=0
++
++fi
++
++ :
++fi
++if test "$DX_FLAG_pdf" = 1; then
++ if :; then
++ DX_COND_pdf_TRUE=
++ DX_COND_pdf_FALSE='#'
++else
++ DX_COND_pdf_TRUE='#'
++ DX_COND_pdf_FALSE=
++fi
++
++
++ :
++else
++ if false; then
++ DX_COND_pdf_TRUE=
++ DX_COND_pdf_FALSE='#'
++else
++ DX_COND_pdf_TRUE='#'
++ DX_COND_pdf_FALSE=
++fi
++
++
++ :
++fi
++
++
++# LaTeX generation for PS and/or PDF:
++if test "$DX_FLAG_ps" = 1 || test "$DX_FLAG_pdf" = 1; then
++ if :; then
++ DX_COND_latex_TRUE=
++ DX_COND_latex_FALSE='#'
++else
++ DX_COND_latex_TRUE='#'
++ DX_COND_latex_FALSE=
++fi
++
++ DX_ENV="$DX_ENV GENERATE_LATEX='YES'"
++
++else
++ if false; then
++ DX_COND_latex_TRUE=
++ DX_COND_latex_FALSE='#'
++else
++ DX_COND_latex_TRUE='#'
++ DX_COND_latex_FALSE=
++fi
++
++ DX_ENV="$DX_ENV GENERATE_LATEX='NO'"
++
++fi
++
++# Paper size for PS and/or PDF:
++
++case "$DOXYGEN_PAPER_SIZE" in
++#(
++"")
++ DOXYGEN_PAPER_SIZE=""
++
++;; #(
++a4wide|a4|letter|legal|executive)
++ DX_ENV="$DX_ENV PAPER_SIZE='$DOXYGEN_PAPER_SIZE'"
++
++;; #(
++*)
++ as_fn_error "unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE'" "$LINENO" 5
++;;
++esac
++
++#For debugging:
++#echo DX_FLAG_doc=$DX_FLAG_doc
++#echo DX_FLAG_dot=$DX_FLAG_dot
++#echo DX_FLAG_man=$DX_FLAG_man
++#echo DX_FLAG_html=$DX_FLAG_html
++#echo DX_FLAG_chm=$DX_FLAG_chm
++#echo DX_FLAG_chi=$DX_FLAG_chi
++#echo DX_FLAG_rtf=$DX_FLAG_rtf
++#echo DX_FLAG_xml=$DX_FLAG_xml
++#echo DX_FLAG_pdf=$DX_FLAG_pdf
++#echo DX_FLAG_ps=$DX_FLAG_ps
++#echo DX_ENV=$DX_ENV
++
++
++ac_config_files="$ac_config_files Makefile src/Makefile src/snmp/Makefile src/libdessert/Makefile include/Makefile libdessert.pc"
++
++cat >confcache <<\_ACEOF
++# This file is a shell script that caches the results of configure
++# tests run on this system so they can be shared between configure
++# scripts and configure runs, see configure's option --config-cache.
++# It is not useful on other systems. If it contains results you don't
++# want to keep, you may remove or edit it.
++#
++# config.status only pays attention to the cache file if you give it
++# the --recheck option to rerun configure.
++#
++# `ac_cv_env_foo' variables (set or unset) will be overridden when
++# loading this file, other *unset* `ac_cv_foo' will be assigned the
++# following values.
++
++_ACEOF
++
++# The following way of writing the cache mishandles newlines in values,
++# but we know of no workaround that is simple, portable, and efficient.
++# So, we kill variables containing newlines.
++# Ultrix sh set writes to stderr and can't be redirected directly,
++# and sets the high bit in the cache file unless we assign to the vars.
++(
++ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
++ eval ac_val=\$$ac_var
++ case $ac_val in #(
++ *${as_nl}*)
++ case $ac_var in #(
++ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
++$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
++ esac
++ case $ac_var in #(
++ _ | IFS | as_nl) ;; #(
++ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
++ *) { eval $ac_var=; unset $ac_var;} ;;
++ esac ;;
++ esac
++ done
++
++ (set) 2>&1 |
++ case $as_nl`(ac_space=' '; set) 2>&1` in #(
++ *${as_nl}ac_space=\ *)
++ # `set' does not quote correctly, so add quotes: double-quote
++ # substitution turns \\\\ into \\, and sed turns \\ into \.
++ sed -n \
++ "s/'/'\\\\''/g;
++ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
++ ;; #(
++ *)
++ # `set' quotes correctly as required by POSIX, so do not add quotes.
++ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
++ ;;
++ esac |
++ sort
++) |
++ sed '
++ /^ac_cv_env_/b end
++ t clear
++ :clear
++ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
++ t end
++ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
++ :end' >>confcache
++if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
++ if test -w "$cache_file"; then
++ test "x$cache_file" != "x/dev/null" &&
++ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
++$as_echo "$as_me: updating cache $cache_file" >&6;}
++ cat confcache >$cache_file
++ else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
++$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
++ fi
++fi
++rm -f confcache
++
++test "x$prefix" = xNONE && prefix=$ac_default_prefix
++# Let make expand exec_prefix.
++test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
++
++DEFS=-DHAVE_CONFIG_H
++
++ac_libobjs=
++ac_ltlibobjs=
++for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
++ # 1. Remove the extension, and $U if already installed.
++ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
++ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
++ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
++ # will be set to the directory where LIBOBJS objects are built.
++ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
++ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
++done
++LIBOBJS=$ac_libobjs
++
++LTLIBOBJS=$ac_ltlibobjs
++
++
++ if test -n "$EXEEXT"; then
++ am__EXEEXT_TRUE=
++ am__EXEEXT_FALSE='#'
++else
++ am__EXEEXT_TRUE='#'
++ am__EXEEXT_FALSE=
++fi
++
++if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
++ as_fn_error "conditional \"AMDEP\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
++ as_fn_error "conditional \"am__fastdepCC\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_doc\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_doc_TRUE}" && test -z "${DX_COND_doc_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_doc\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_dot\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_dot_TRUE}" && test -z "${DX_COND_dot_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_dot\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_man\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_man_TRUE}" && test -z "${DX_COND_man_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_man\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_rtf\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_rtf_TRUE}" && test -z "${DX_COND_rtf_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_rtf\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_xml\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_xml_TRUE}" && test -z "${DX_COND_xml_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_xml\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_chm\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_chm_TRUE}" && test -z "${DX_COND_chm_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_chm\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_chi\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_chi_TRUE}" && test -z "${DX_COND_chi_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_chi\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_html\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_html_TRUE}" && test -z "${DX_COND_html_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_html\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_ps\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_ps_TRUE}" && test -z "${DX_COND_ps_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_ps\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_pdf\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_pdf_TRUE}" && test -z "${DX_COND_pdf_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_pdf\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_latex\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++if test -z "${DX_COND_latex_TRUE}" && test -z "${DX_COND_latex_FALSE}"; then
++ as_fn_error "conditional \"DX_COND_latex\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
++
++: ${CONFIG_STATUS=./config.status}
++ac_write_fail=0
++ac_clean_files_save=$ac_clean_files
++ac_clean_files="$ac_clean_files $CONFIG_STATUS"
++{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
++$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
++as_write_fail=0
++cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
++#! $SHELL
++# Generated by $as_me.
++# Run this file to recreate the current configuration.
++# Compiler output produced by configure, useful for debugging
++# configure, is in config.log if it exists.
++
++debug=false
++ac_cs_recheck=false
++ac_cs_silent=false
++
++SHELL=\${CONFIG_SHELL-$SHELL}
++export SHELL
++_ASEOF
++cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
++## -------------------- ##
++## M4sh Initialization. ##
++## -------------------- ##
++
++# Be more Bourne compatible
++DUALCASE=1; export DUALCASE # for MKS sh
++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
++ emulate sh
++ NULLCMD=:
++ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
++ # is contrary to our usage. Disable this feature.
++ alias -g '${1+"$@"}'='"$@"'
++ setopt NO_GLOB_SUBST
++else
++ case `(set -o) 2>/dev/null` in #(
++ *posix*) :
++ set -o posix ;; #(
++ *) :
++ ;;
++esac
++fi
++
++
++as_nl='
++'
++export as_nl
++# Printing a long string crashes Solaris 7 /usr/bin/printf.
++as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
++as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
++as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
++# Prefer a ksh shell builtin over an external printf program on Solaris,
++# but without wasting forks for bash or zsh.
++if test -z "$BASH_VERSION$ZSH_VERSION" \
++ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
++ as_echo='print -r --'
++ as_echo_n='print -rn --'
++elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
++ as_echo='printf %s\n'
++ as_echo_n='printf %s'
++else
++ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
++ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
++ as_echo_n='/usr/ucb/echo -n'
++ else
++ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
++ as_echo_n_body='eval
++ arg=$1;
++ case $arg in #(
++ *"$as_nl"*)
++ expr "X$arg" : "X\\(.*\\)$as_nl";
++ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
++ esac;
++ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
++ '
++ export as_echo_n_body
++ as_echo_n='sh -c $as_echo_n_body as_echo'
++ fi
++ export as_echo_body
++ as_echo='sh -c $as_echo_body as_echo'
++fi
++
++# The user is always right.
++if test "${PATH_SEPARATOR+set}" != set; then
++ PATH_SEPARATOR=:
++ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
++ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
++ PATH_SEPARATOR=';'
++ }
++fi
++
++
++# IFS
++# We need space, tab and new line, in precisely that order. Quoting is
++# there to prevent editors from complaining about space-tab.
++# (If _AS_PATH_WALK were called with IFS unset, it would disable word
++# splitting by setting IFS to empty value.)
++IFS=" "" $as_nl"
++
++# Find who we are. Look in the path if we contain no directory separator.
++case $0 in #((
++ *[\\/]* ) as_myself=$0 ;;
++ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
++ done
++IFS=$as_save_IFS
++
++ ;;
++esac
++# We did not find ourselves, most probably we were run as `sh COMMAND'
++# in which case we are not to be found in the path.
++if test "x$as_myself" = x; then
++ as_myself=$0
++fi
++if test ! -f "$as_myself"; then
++ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
++ exit 1
++fi
++
++# Unset variables that we do not need and which cause bugs (e.g. in
++# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
++# suppresses any "Segmentation fault" message there. '((' could
++# trigger a bug in pdksh 5.2.14.
++for as_var in BASH_ENV ENV MAIL MAILPATH
++do eval test x\${$as_var+set} = xset \
++ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
++done
++PS1='$ '
++PS2='> '
++PS4='+ '
++
++# NLS nuisances.
++LC_ALL=C
++export LC_ALL
++LANGUAGE=C
++export LANGUAGE
++
++# CDPATH.
++(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
++
++
++# as_fn_error ERROR [LINENO LOG_FD]
++# ---------------------------------
++# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
++# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
++# script with status $?, using 1 if that was 0.
++as_fn_error ()
++{
++ as_status=$?; test $as_status -eq 0 && as_status=1
++ if test "$3"; then
++ as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
++ $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
++ fi
++ $as_echo "$as_me: error: $1" >&2
++ as_fn_exit $as_status
++} # as_fn_error
++
++
++# as_fn_set_status STATUS
++# -----------------------
++# Set $? to STATUS, without forking.
++as_fn_set_status ()
++{
++ return $1
++} # as_fn_set_status
++
++# as_fn_exit STATUS
++# -----------------
++# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
++as_fn_exit ()
++{
++ set +e
++ as_fn_set_status $1
++ exit $1
++} # as_fn_exit
++
++# as_fn_unset VAR
++# ---------------
++# Portably unset VAR.
++as_fn_unset ()
++{
++ { eval $1=; unset $1;}
++}
++as_unset=as_fn_unset
++# as_fn_append VAR VALUE
++# ----------------------
++# Append the text in VALUE to the end of the definition contained in VAR. Take
++# advantage of any shell optimizations that allow amortized linear growth over
++# repeated appends, instead of the typical quadratic growth present in naive
++# implementations.
++if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
++ eval 'as_fn_append ()
++ {
++ eval $1+=\$2
++ }'
++else
++ as_fn_append ()
++ {
++ eval $1=\$$1\$2
++ }
++fi # as_fn_append
++
++# as_fn_arith ARG...
++# ------------------
++# Perform arithmetic evaluation on the ARGs, and store the result in the
++# global $as_val. Take advantage of shells that can avoid forks. The arguments
++# must be portable across $(()) and expr.
++if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
++ eval 'as_fn_arith ()
++ {
++ as_val=$(( $* ))
++ }'
++else
++ as_fn_arith ()
++ {
++ as_val=`expr "$@" || test $? -eq 1`
++ }
++fi # as_fn_arith
++
++
++if expr a : '\(a\)' >/dev/null 2>&1 &&
++ test "X`expr 00001 : '.*\(...\)'`" = X001; then
++ as_expr=expr
++else
++ as_expr=false
++fi
++
++if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
++ as_basename=basename
++else
++ as_basename=false
++fi
++
++if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
++ as_dirname=dirname
++else
++ as_dirname=false
++fi
++
++as_me=`$as_basename -- "$0" ||
++$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
++ X"$0" : 'X\(//\)$' \| \
++ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
++$as_echo X/"$0" |
++ sed '/^.*\/\([^/][^/]*\)\/*$/{
++ s//\1/
++ q
++ }
++ /^X\/\(\/\/\)$/{
++ s//\1/
++ q
++ }
++ /^X\/\(\/\).*/{
++ s//\1/
++ q
++ }
++ s/.*/./; q'`
++
++# Avoid depending upon Character Ranges.
++as_cr_letters='abcdefghijklmnopqrstuvwxyz'
++as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
++as_cr_Letters=$as_cr_letters$as_cr_LETTERS
++as_cr_digits='0123456789'
++as_cr_alnum=$as_cr_Letters$as_cr_digits
++
++ECHO_C= ECHO_N= ECHO_T=
++case `echo -n x` in #(((((
++-n*)
++ case `echo 'xy\c'` in
++ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
++ xy) ECHO_C='\c';;
++ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
++ ECHO_T=' ';;
++ esac;;
++*)
++ ECHO_N='-n';;
++esac
++
++rm -f conf$$ conf$$.exe conf$$.file
++if test -d conf$$.dir; then
++ rm -f conf$$.dir/conf$$.file
++else
++ rm -f conf$$.dir
++ mkdir conf$$.dir 2>/dev/null
++fi
++if (echo >conf$$.file) 2>/dev/null; then
++ if ln -s conf$$.file conf$$ 2>/dev/null; then
++ as_ln_s='ln -s'
++ # ... but there are two gotchas:
++ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
++ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
++ # In both cases, we have to default to `cp -p'.
++ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
++ as_ln_s='cp -p'
++ elif ln conf$$.file conf$$ 2>/dev/null; then
++ as_ln_s=ln
++ else
++ as_ln_s='cp -p'
++ fi
++else
++ as_ln_s='cp -p'
++fi
++rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
++rmdir conf$$.dir 2>/dev/null
++
++
++# as_fn_mkdir_p
++# -------------
++# Create "$as_dir" as a directory, including parents if necessary.
++as_fn_mkdir_p ()
++{
++
++ case $as_dir in #(
++ -*) as_dir=./$as_dir;;
++ esac
++ test -d "$as_dir" || eval $as_mkdir_p || {
++ as_dirs=
++ while :; do
++ case $as_dir in #(
++ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
++ *) as_qdir=$as_dir;;
++ esac
++ as_dirs="'$as_qdir' $as_dirs"
++ as_dir=`$as_dirname -- "$as_dir" ||
++$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
++ X"$as_dir" : 'X\(//\)[^/]' \| \
++ X"$as_dir" : 'X\(//\)$' \| \
++ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
++$as_echo X"$as_dir" |
++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
++ s//\1/
++ q
++ }
++ /^X\(\/\/\)[^/].*/{
++ s//\1/
++ q
++ }
++ /^X\(\/\/\)$/{
++ s//\1/
++ q
++ }
++ /^X\(\/\).*/{
++ s//\1/
++ q
++ }
++ s/.*/./; q'`
++ test -d "$as_dir" && break
++ done
++ test -z "$as_dirs" || eval "mkdir $as_dirs"
++ } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
++
++
++} # as_fn_mkdir_p
++if mkdir -p . 2>/dev/null; then
++ as_mkdir_p='mkdir -p "$as_dir"'
++else
++ test -d ./-p && rmdir ./-p
++ as_mkdir_p=false
++fi
++
++if test -x / >/dev/null 2>&1; then
++ as_test_x='test -x'
++else
++ if ls -dL / >/dev/null 2>&1; then
++ as_ls_L_option=L
++ else
++ as_ls_L_option=
++ fi
++ as_test_x='
++ eval sh -c '\''
++ if test -d "$1"; then
++ test -d "$1/.";
++ else
++ case $1 in #(
++ -*)set "./$1";;
++ esac;
++ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
++ ???[sx]*):;;*)false;;esac;fi
++ '\'' sh
++ '
++fi
++as_executable_p=$as_test_x
++
++# Sed expression to map a string onto a valid CPP name.
++as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
++
++# Sed expression to map a string onto a valid variable name.
++as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
++
++
++exec 6>&1
++## ----------------------------------- ##
++## Main body of $CONFIG_STATUS script. ##
++## ----------------------------------- ##
++_ASEOF
++test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
++
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++# Save the log message, to keep $0 and so on meaningful, and to
++# report actual input values of CONFIG_FILES etc. instead of their
++# values after options handling.
++ac_log="
++This file was extended by libdessert $as_me 0.86.14, which was
++generated by GNU Autoconf 2.65. Invocation command line was
++
++ CONFIG_FILES = $CONFIG_FILES
++ CONFIG_HEADERS = $CONFIG_HEADERS
++ CONFIG_LINKS = $CONFIG_LINKS
++ CONFIG_COMMANDS = $CONFIG_COMMANDS
++ $ $0 $@
++
++on `(hostname || uname -n) 2>/dev/null | sed 1q`
++"
++
++_ACEOF
++
++case $ac_config_files in *"
++"*) set x $ac_config_files; shift; ac_config_files=$*;;
++esac
++
++case $ac_config_headers in *"
++"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
++esac
++
++
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++# Files that config.status was made for.
++config_files="$ac_config_files"
++config_headers="$ac_config_headers"
++config_commands="$ac_config_commands"
++
++_ACEOF
++
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++ac_cs_usage="\
++\`$as_me' instantiates files and other configuration actions
++from templates according to the current configuration. Unless the files
++and actions are specified as TAGs, all are instantiated by default.
++
++Usage: $0 [OPTION]... [TAG]...
++
++ -h, --help print this help, then exit
++ -V, --version print version number and configuration settings, then exit
++ --config print configuration, then exit
++ -q, --quiet, --silent
++ do not print progress messages
++ -d, --debug don't remove temporary files
++ --recheck update $as_me by reconfiguring in the same conditions
++ --file=FILE[:TEMPLATE]
++ instantiate the configuration file FILE
++ --header=FILE[:TEMPLATE]
++ instantiate the configuration header FILE
++
++Configuration files:
++$config_files
++
++Configuration headers:
++$config_headers
++
++Configuration commands:
++$config_commands
++
++Report bugs to <des-sert@spline.inf.fu-berlin.de>."
++
++_ACEOF
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
++ac_cs_version="\\
++libdessert config.status 0.86.14
++configured by $0, generated by GNU Autoconf 2.65,
++ with options \\"\$ac_cs_config\\"
++
++Copyright (C) 2009 Free Software Foundation, Inc.
++This config.status script is free software; the Free Software Foundation
++gives unlimited permission to copy, distribute and modify it."
++
++ac_pwd='$ac_pwd'
++srcdir='$srcdir'
++INSTALL='$INSTALL'
++MKDIR_P='$MKDIR_P'
++AWK='$AWK'
++test -n "\$AWK" || AWK=awk
++_ACEOF
++
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++# The default lists apply if the user does not specify any file.
++ac_need_defaults=:
++while test $# != 0
++do
++ case $1 in
++ --*=*)
++ ac_option=`expr "X$1" : 'X\([^=]*\)='`
++ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
++ ac_shift=:
++ ;;
++ *)
++ ac_option=$1
++ ac_optarg=$2
++ ac_shift=shift
++ ;;
++ esac
++
++ case $ac_option in
++ # Handling of the options.
++ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
++ ac_cs_recheck=: ;;
++ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
++ $as_echo "$ac_cs_version"; exit ;;
++ --config | --confi | --conf | --con | --co | --c )
++ $as_echo "$ac_cs_config"; exit ;;
++ --debug | --debu | --deb | --de | --d | -d )
++ debug=: ;;
++ --file | --fil | --fi | --f )
++ $ac_shift
++ case $ac_optarg in
++ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
++ esac
++ as_fn_append CONFIG_FILES " '$ac_optarg'"
++ ac_need_defaults=false;;
++ --header | --heade | --head | --hea )
++ $ac_shift
++ case $ac_optarg in
++ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
++ esac
++ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
++ ac_need_defaults=false;;
++ --he | --h)
++ # Conflict between --help and --header
++ as_fn_error "ambiguous option: \`$1'
++Try \`$0 --help' for more information.";;
++ --help | --hel | -h )
++ $as_echo "$ac_cs_usage"; exit ;;
++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
++ | -silent | --silent | --silen | --sile | --sil | --si | --s)
++ ac_cs_silent=: ;;
++
++ # This is an error.
++ -*) as_fn_error "unrecognized option: \`$1'
++Try \`$0 --help' for more information." ;;
++
++ *) as_fn_append ac_config_targets " $1"
++ ac_need_defaults=false ;;
++
++ esac
++ shift
++done
++
++ac_configure_extra_args=
++
++if $ac_cs_silent; then
++ exec 6>/dev/null
++ ac_configure_extra_args="$ac_configure_extra_args --silent"
++fi
++
++_ACEOF
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++if \$ac_cs_recheck; then
++ set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
++ shift
++ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
++ CONFIG_SHELL='$SHELL'
++ export CONFIG_SHELL
++ exec "\$@"
++fi
++
++_ACEOF
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++exec 5>>config.log
++{
++ echo
++ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
++## Running $as_me. ##
++_ASBOX
++ $as_echo "$ac_log"
++} >&5
++
++_ACEOF
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++#
++# INIT-COMMANDS
++#
++AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
++
++
++# The HP-UX ksh and POSIX shell print the target directory to stdout
++# if CDPATH is set.
++(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
++
++sed_quote_subst='$sed_quote_subst'
++double_quote_subst='$double_quote_subst'
++delay_variable_subst='$delay_variable_subst'
++macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`'
++macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`'
++enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`'
++enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`'
++pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`'
++enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`'
++host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`'
++host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`'
++host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`'
++build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`'
++build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`'
++build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`'
++SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`'
++Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`'
++GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`'
++EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`'
++FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`'
++LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`'
++NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`'
++LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`'
++max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`'
++ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`'
++exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`'
++lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`'
++lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`'
++lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`'
++reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`'
++reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`'
++OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`'
++deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`'
++file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`'
++AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`'
++AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`'
++STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`'
++RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`'
++old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
++old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
++old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
++CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`'
++CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`'
++compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`'
++GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`'
++lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`'
++lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`'
++lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`'
++lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
++objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`'
++SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`'
++ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`'
++MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`'
++lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`'
++lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`'
++lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`'
++lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`'
++lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`'
++need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`'
++DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`'
++NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`'
++LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`'
++OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`'
++OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`'
++libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`'
++shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`'
++extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
++archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`'
++enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`'
++export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
++whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
++compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`'
++old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`'
++old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
++archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
++archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
++module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`'
++module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
++with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`'
++allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
++no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
++hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
++hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`'
++hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`'
++hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`'
++hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`'
++hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`'
++hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
++hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`'
++inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`'
++link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`'
++fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`'
++always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`'
++export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`'
++exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
++include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
++prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`'
++file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`'
++variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`'
++need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
++need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`'
++version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`'
++runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`'
++shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
++shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`'
++libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`'
++library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`'
++soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`'
++postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
++postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
++finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`'
++finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`'
++hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`'
++sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
++sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
++hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`'
++enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`'
++enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`'
++enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`'
++old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`'
++striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`'
++
++LTCC='$LTCC'
++LTCFLAGS='$LTCFLAGS'
++compiler='$compiler_DEFAULT'
++
++# Quote evaled strings.
++for var in SED \
++GREP \
++EGREP \
++FGREP \
++LD \
++NM \
++LN_S \
++lt_SP2NL \
++lt_NL2SP \
++reload_flag \
++OBJDUMP \
++deplibs_check_method \
++file_magic_cmd \
++AR \
++AR_FLAGS \
++STRIP \
++RANLIB \
++CC \
++CFLAGS \
++compiler \
++lt_cv_sys_global_symbol_pipe \
++lt_cv_sys_global_symbol_to_cdecl \
++lt_cv_sys_global_symbol_to_c_name_address \
++lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
++SHELL \
++ECHO \
++lt_prog_compiler_no_builtin_flag \
++lt_prog_compiler_wl \
++lt_prog_compiler_pic \
++lt_prog_compiler_static \
++lt_cv_prog_compiler_c_o \
++need_locks \
++DSYMUTIL \
++NMEDIT \
++LIPO \
++OTOOL \
++OTOOL64 \
++shrext_cmds \
++export_dynamic_flag_spec \
++whole_archive_flag_spec \
++compiler_needs_object \
++with_gnu_ld \
++allow_undefined_flag \
++no_undefined_flag \
++hardcode_libdir_flag_spec \
++hardcode_libdir_flag_spec_ld \
++hardcode_libdir_separator \
++fix_srcfile_path \
++exclude_expsyms \
++include_expsyms \
++file_list_spec \
++variables_saved_for_relink \
++libname_spec \
++library_names_spec \
++soname_spec \
++finish_eval \
++old_striplib \
++striplib; do
++ case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
++ *[\\\\\\\`\\"\\\$]*)
++ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
++ ;;
++ *)
++ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
++ ;;
++ esac
++done
++
++# Double-quote double-evaled strings.
++for var in reload_cmds \
++old_postinstall_cmds \
++old_postuninstall_cmds \
++old_archive_cmds \
++extract_expsyms_cmds \
++old_archive_from_new_cmds \
++old_archive_from_expsyms_cmds \
++archive_cmds \
++archive_expsym_cmds \
++module_cmds \
++module_expsym_cmds \
++export_symbols_cmds \
++prelink_cmds \
++postinstall_cmds \
++postuninstall_cmds \
++finish_cmds \
++sys_lib_search_path_spec \
++sys_lib_dlsearch_path_spec; do
++ case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
++ *[\\\\\\\`\\"\\\$]*)
++ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
++ ;;
++ *)
++ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
++ ;;
++ esac
++done
++
++# Fix-up fallback echo if it was mangled by the above quoting rules.
++case \$lt_ECHO in
++*'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\`
++ ;;
++esac
++
++ac_aux_dir='$ac_aux_dir'
++xsi_shell='$xsi_shell'
++lt_shell_append='$lt_shell_append'
++
++# See if we are running on zsh, and set the options which allow our
++# commands through without removal of \ escapes INIT.
++if test -n "\${ZSH_VERSION+set}" ; then
++ setopt NO_GLOB_SUBST
++fi
++
++
++ PACKAGE='$PACKAGE'
++ VERSION='$VERSION'
++ TIMESTAMP='$TIMESTAMP'
++ RM='$RM'
++ ofile='$ofile'
++
++
++
++
++_ACEOF
++
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++
++# Handling of arguments.
++for ac_config_target in $ac_config_targets
++do
++ case $ac_config_target in
++ "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
++ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
++ "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
++ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
++ "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
++ "src/snmp/Makefile") CONFIG_FILES="$CONFIG_FILES src/snmp/Makefile" ;;
++ "src/libdessert/Makefile") CONFIG_FILES="$CONFIG_FILES src/libdessert/Makefile" ;;
++ "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;;
++ "libdessert.pc") CONFIG_FILES="$CONFIG_FILES libdessert.pc" ;;
++
++ *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
++ esac
++done
++
++
++# If the user did not use the arguments to specify the items to instantiate,
++# then the envvar interface is used. Set only those that are not.
++# We use the long form for the default assignment because of an extremely
++# bizarre bug on SunOS 4.1.3.
++if $ac_need_defaults; then
++ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
++ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
++ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
++fi
++
++# Have a temporary directory for convenience. Make it in the build tree
++# simply because there is no reason against having it here, and in addition,
++# creating and moving files from /tmp can sometimes cause problems.
++# Hook for its removal unless debugging.
++# Note that there is a small window in which the directory will not be cleaned:
++# after its creation but before its name has been assigned to `$tmp'.
++$debug ||
++{
++ tmp=
++ trap 'exit_status=$?
++ { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
++' 0
++ trap 'as_fn_exit 1' 1 2 13 15
++}
++# Create a (secure) tmp directory for tmp files.
++
++{
++ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
++ test -n "$tmp" && test -d "$tmp"
++} ||
++{
++ tmp=./conf$$-$RANDOM
++ (umask 077 && mkdir "$tmp")
++} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5
++
++# Set up the scripts for CONFIG_FILES section.
++# No need to generate them if there are no CONFIG_FILES.
++# This happens for instance with `./config.status config.h'.
++if test -n "$CONFIG_FILES"; then
++
++
++ac_cr=`echo X | tr X '\015'`
++# On cygwin, bash can eat \r inside `` if the user requested igncr.
++# But we know of no other shell where ac_cr would be empty at this
++# point, so we can use a bashism as a fallback.
++if test "x$ac_cr" = x; then
++ eval ac_cr=\$\'\\r\'
++fi
++ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
++if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
++ ac_cs_awk_cr='\r'
++else
++ ac_cs_awk_cr=$ac_cr
++fi
++
++echo 'BEGIN {' >"$tmp/subs1.awk" &&
++_ACEOF
++
++
++{
++ echo "cat >conf$$subs.awk <<_ACEOF" &&
++ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
++ echo "_ACEOF"
++} >conf$$subs.sh ||
++ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
++ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
++ac_delim='%!_!# '
++for ac_last_try in false false false false false :; do
++ . ./conf$$subs.sh ||
++ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
++
++ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
++ if test $ac_delim_n = $ac_delim_num; then
++ break
++ elif $ac_last_try; then
++ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
++ else
++ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
++ fi
++done
++rm -f conf$$subs.sh
++
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
++_ACEOF
++sed -n '
++h
++s/^/S["/; s/!.*/"]=/
++p
++g
++s/^[^!]*!//
++:repl
++t repl
++s/'"$ac_delim"'$//
++t delim
++:nl
++h
++s/\(.\{148\}\)..*/\1/
++t more1
++s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
++p
++n
++b repl
++:more1
++s/["\\]/\\&/g; s/^/"/; s/$/"\\/
++p
++g
++s/.\{148\}//
++t nl
++:delim
++h
++s/\(.\{148\}\)..*/\1/
++t more2
++s/["\\]/\\&/g; s/^/"/; s/$/"/
++p
++b
++:more2
++s/["\\]/\\&/g; s/^/"/; s/$/"\\/
++p
++g
++s/.\{148\}//
++t delim
++' <conf$$subs.awk | sed '
++/^[^""]/{
++ N
++ s/\n//
++}
++' >>$CONFIG_STATUS || ac_write_fail=1
++rm -f conf$$subs.awk
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++_ACAWK
++cat >>"\$tmp/subs1.awk" <<_ACAWK &&
++ for (key in S) S_is_set[key] = 1
++ FS = ""
++
++}
++{
++ line = $ 0
++ nfields = split(line, field, "@")
++ substed = 0
++ len = length(field[1])
++ for (i = 2; i < nfields; i++) {
++ key = field[i]
++ keylen = length(key)
++ if (S_is_set[key]) {
++ value = S[key]
++ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
++ len += length(value) + length(field[++i])
++ substed = 1
++ } else
++ len += 1 + keylen
++ }
++
++ print line
++}
++
++_ACAWK
++_ACEOF
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
++ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
++else
++ cat
++fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
++ || as_fn_error "could not setup config files machinery" "$LINENO" 5
++_ACEOF
++
++# VPATH may cause trouble with some makes, so we remove $(srcdir),
++# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
++# trailing colons and then remove the whole line if VPATH becomes empty
++# (actually we leave an empty line to preserve line numbers).
++if test "x$srcdir" = x.; then
++ ac_vpsub='/^[ ]*VPATH[ ]*=/{
++s/:*\$(srcdir):*/:/
++s/:*\${srcdir}:*/:/
++s/:*@srcdir@:*/:/
++s/^\([^=]*=[ ]*\):*/\1/
++s/:*$//
++s/^[^=]*=[ ]*$//
++}'
++fi
++
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++fi # test -n "$CONFIG_FILES"
++
++# Set up the scripts for CONFIG_HEADERS section.
++# No need to generate them if there are no CONFIG_HEADERS.
++# This happens for instance with `./config.status Makefile'.
++if test -n "$CONFIG_HEADERS"; then
++cat >"$tmp/defines.awk" <<\_ACAWK ||
++BEGIN {
++_ACEOF
++
++# Transform confdefs.h into an awk script `defines.awk', embedded as
++# here-document in config.status, that substitutes the proper values into
++# config.h.in to produce config.h.
++
++# Create a delimiter string that does not exist in confdefs.h, to ease
++# handling of long lines.
++ac_delim='%!_!# '
++for ac_last_try in false false :; do
++ ac_t=`sed -n "/$ac_delim/p" confdefs.h`
++ if test -z "$ac_t"; then
++ break
++ elif $ac_last_try; then
++ as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5
++ else
++ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
++ fi
++done
++
++# For the awk script, D is an array of macro values keyed by name,
++# likewise P contains macro parameters if any. Preserve backslash
++# newline sequences.
++
++ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
++sed -n '
++s/.\{148\}/&'"$ac_delim"'/g
++t rset
++:rset
++s/^[ ]*#[ ]*define[ ][ ]*/ /
++t def
++d
++:def
++s/\\$//
++t bsnl
++s/["\\]/\\&/g
++s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
++D["\1"]=" \3"/p
++s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
++d
++:bsnl
++s/["\\]/\\&/g
++s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
++D["\1"]=" \3\\\\\\n"\\/p
++t cont
++s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
++t cont
++d
++:cont
++n
++s/.\{148\}/&'"$ac_delim"'/g
++t clear
++:clear
++s/\\$//
++t bsnlc
++s/["\\]/\\&/g; s/^/"/; s/$/"/p
++d
++:bsnlc
++s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
++b cont
++' <confdefs.h | sed '
++s/'"$ac_delim"'/"\\\
++"/g' >>$CONFIG_STATUS || ac_write_fail=1
++
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++ for (key in D) D_is_set[key] = 1
++ FS = ""
++}
++/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
++ line = \$ 0
++ split(line, arg, " ")
++ if (arg[1] == "#") {
++ defundef = arg[2]
++ mac1 = arg[3]
++ } else {
++ defundef = substr(arg[1], 2)
++ mac1 = arg[2]
++ }
++ split(mac1, mac2, "(") #)
++ macro = mac2[1]
++ prefix = substr(line, 1, index(line, defundef) - 1)
++ if (D_is_set[macro]) {
++ # Preserve the white space surrounding the "#".
++ print prefix "define", macro P[macro] D[macro]
++ next
++ } else {
++ # Replace #undef with comments. This is necessary, for example,
++ # in the case of _POSIX_SOURCE, which is predefined and required
++ # on some systems where configure will not decide to define it.
++ if (defundef == "undef") {
++ print "/*", prefix defundef, macro, "*/"
++ next
++ }
++ }
++}
++{ print }
++_ACAWK
++_ACEOF
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++ as_fn_error "could not setup config headers machinery" "$LINENO" 5
++fi # test -n "$CONFIG_HEADERS"
++
++
++eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
++shift
++for ac_tag
++do
++ case $ac_tag in
++ :[FHLC]) ac_mode=$ac_tag; continue;;
++ esac
++ case $ac_mode$ac_tag in
++ :[FHL]*:*);;
++ :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;;
++ :[FH]-) ac_tag=-:-;;
++ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
++ esac
++ ac_save_IFS=$IFS
++ IFS=:
++ set x $ac_tag
++ IFS=$ac_save_IFS
++ shift
++ ac_file=$1
++ shift
++
++ case $ac_mode in
++ :L) ac_source=$1;;
++ :[FH])
++ ac_file_inputs=
++ for ac_f
++ do
++ case $ac_f in
++ -) ac_f="$tmp/stdin";;
++ *) # Look for the file first in the build tree, then in the source tree
++ # (if the path is not absolute). The absolute path cannot be DOS-style,
++ # because $ac_f cannot contain `:'.
++ test -f "$ac_f" ||
++ case $ac_f in
++ [\\/$]*) false;;
++ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
++ esac ||
++ as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;;
++ esac
++ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
++ as_fn_append ac_file_inputs " '$ac_f'"
++ done
++
++ # Let's still pretend it is `configure' which instantiates (i.e., don't
++ # use $as_me), people would be surprised to read:
++ # /* config.h. Generated by config.status. */
++ configure_input='Generated from '`
++ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
++ `' by configure.'
++ if test x"$ac_file" != x-; then
++ configure_input="$ac_file. $configure_input"
++ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
++$as_echo "$as_me: creating $ac_file" >&6;}
++ fi
++ # Neutralize special characters interpreted by sed in replacement strings.
++ case $configure_input in #(
++ *\&* | *\|* | *\\* )
++ ac_sed_conf_input=`$as_echo "$configure_input" |
++ sed 's/[\\\\&|]/\\\\&/g'`;; #(
++ *) ac_sed_conf_input=$configure_input;;
++ esac
++
++ case $ac_tag in
++ *:-:* | *:-) cat >"$tmp/stdin" \
++ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
++ esac
++ ;;
++ esac
++
++ ac_dir=`$as_dirname -- "$ac_file" ||
++$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
++ X"$ac_file" : 'X\(//\)[^/]' \| \
++ X"$ac_file" : 'X\(//\)$' \| \
++ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
++$as_echo X"$ac_file" |
++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
++ s//\1/
++ q
++ }
++ /^X\(\/\/\)[^/].*/{
++ s//\1/
++ q
++ }
++ /^X\(\/\/\)$/{
++ s//\1/
++ q
++ }
++ /^X\(\/\).*/{
++ s//\1/
++ q
++ }
++ s/.*/./; q'`
++ as_dir="$ac_dir"; as_fn_mkdir_p
++ ac_builddir=.
++
++case "$ac_dir" in
++.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
++*)
++ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
++ # A ".." for each directory in $ac_dir_suffix.
++ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
++ case $ac_top_builddir_sub in
++ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
++ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
++ esac ;;
++esac
++ac_abs_top_builddir=$ac_pwd
++ac_abs_builddir=$ac_pwd$ac_dir_suffix
++# for backward compatibility:
++ac_top_builddir=$ac_top_build_prefix
++
++case $srcdir in
++ .) # We are building in place.
++ ac_srcdir=.
++ ac_top_srcdir=$ac_top_builddir_sub
++ ac_abs_top_srcdir=$ac_pwd ;;
++ [\\/]* | ?:[\\/]* ) # Absolute name.
++ ac_srcdir=$srcdir$ac_dir_suffix;
++ ac_top_srcdir=$srcdir
++ ac_abs_top_srcdir=$srcdir ;;
++ *) # Relative name.
++ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
++ ac_top_srcdir=$ac_top_build_prefix$srcdir
++ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
++esac
++ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
++
++
++ case $ac_mode in
++ :F)
++ #
++ # CONFIG_FILE
++ #
++
++ case $INSTALL in
++ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
++ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
++ esac
++ ac_MKDIR_P=$MKDIR_P
++ case $MKDIR_P in
++ [\\/$]* | ?:[\\/]* ) ;;
++ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
++ esac
++_ACEOF
++
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++# If the template does not know about datarootdir, expand it.
++# FIXME: This hack should be removed a few years after 2.60.
++ac_datarootdir_hack=; ac_datarootdir_seen=
++ac_sed_dataroot='
++/datarootdir/ {
++ p
++ q
++}
++/@datadir@/p
++/@docdir@/p
++/@infodir@/p
++/@localedir@/p
++/@mandir@/p'
++case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
++*datarootdir*) ac_datarootdir_seen=yes;;
++*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
++$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
++_ACEOF
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++ ac_datarootdir_hack='
++ s&@datadir@&$datadir&g
++ s&@docdir@&$docdir&g
++ s&@infodir@&$infodir&g
++ s&@localedir@&$localedir&g
++ s&@mandir@&$mandir&g
++ s&\\\${datarootdir}&$datarootdir&g' ;;
++esac
++_ACEOF
++
++# Neutralize VPATH when `$srcdir' = `.'.
++# Shell code in configure.ac might set extrasub.
++# FIXME: do we really want to maintain this feature?
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++ac_sed_extra="$ac_vpsub
++$extrasub
++_ACEOF
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++:t
++/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
++s|@configure_input@|$ac_sed_conf_input|;t t
++s&@top_builddir@&$ac_top_builddir_sub&;t t
++s&@top_build_prefix@&$ac_top_build_prefix&;t t
++s&@srcdir@&$ac_srcdir&;t t
++s&@abs_srcdir@&$ac_abs_srcdir&;t t
++s&@top_srcdir@&$ac_top_srcdir&;t t
++s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
++s&@builddir@&$ac_builddir&;t t
++s&@abs_builddir@&$ac_abs_builddir&;t t
++s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
++s&@INSTALL@&$ac_INSTALL&;t t
++s&@MKDIR_P@&$ac_MKDIR_P&;t t
++$ac_datarootdir_hack
++"
++eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
++ || as_fn_error "could not create $ac_file" "$LINENO" 5
++
++test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
++ { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
++ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
++which seems to be undefined. Please make sure it is defined." >&5
++$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
++which seems to be undefined. Please make sure it is defined." >&2;}
++
++ rm -f "$tmp/stdin"
++ case $ac_file in
++ -) cat "$tmp/out" && rm -f "$tmp/out";;
++ *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
++ esac \
++ || as_fn_error "could not create $ac_file" "$LINENO" 5
++ ;;
++ :H)
++ #
++ # CONFIG_HEADER
++ #
++ if test x"$ac_file" != x-; then
++ {
++ $as_echo "/* $configure_input */" \
++ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
++ } >"$tmp/config.h" \
++ || as_fn_error "could not create $ac_file" "$LINENO" 5
++ if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
++$as_echo "$as_me: $ac_file is unchanged" >&6;}
++ else
++ rm -f "$ac_file"
++ mv "$tmp/config.h" "$ac_file" \
++ || as_fn_error "could not create $ac_file" "$LINENO" 5
++ fi
++ else
++ $as_echo "/* $configure_input */" \
++ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
++ || as_fn_error "could not create -" "$LINENO" 5
++ fi
++# Compute "$ac_file"'s index in $config_headers.
++_am_arg="$ac_file"
++_am_stamp_count=1
++for _am_header in $config_headers :; do
++ case $_am_header in
++ $_am_arg | $_am_arg:* )
++ break ;;
++ * )
++ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
++ esac
++done
++echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
++$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
++ X"$_am_arg" : 'X\(//\)[^/]' \| \
++ X"$_am_arg" : 'X\(//\)$' \| \
++ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
++$as_echo X"$_am_arg" |
++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
++ s//\1/
++ q
++ }
++ /^X\(\/\/\)[^/].*/{
++ s//\1/
++ q
++ }
++ /^X\(\/\/\)$/{
++ s//\1/
++ q
++ }
++ /^X\(\/\).*/{
++ s//\1/
++ q
++ }
++ s/.*/./; q'`/stamp-h$_am_stamp_count
++ ;;
++
++ :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
++$as_echo "$as_me: executing $ac_file commands" >&6;}
++ ;;
++ esac
++
++
++ case $ac_file$ac_mode in
++ "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
++ # Autoconf 2.62 quotes --file arguments for eval, but not when files
++ # are listed without --file. Let's play safe and only enable the eval
++ # if we detect the quoting.
++ case $CONFIG_FILES in
++ *\'*) eval set x "$CONFIG_FILES" ;;
++ *) set x $CONFIG_FILES ;;
++ esac
++ shift
++ for mf
++ do
++ # Strip MF so we end up with the name of the file.
++ mf=`echo "$mf" | sed -e 's/:.*$//'`
++ # Check whether this is an Automake generated Makefile or not.
++ # We used to match only the files named `Makefile.in', but
++ # some people rename them; so instead we look at the file content.
++ # Grep'ing the first line is not enough: some people post-process
++ # each Makefile.in and add a new line on top of each file to say so.
++ # Grep'ing the whole file is not good either: AIX grep has a line
++ # limit of 2048, but all sed's we know have understand at least 4000.
++ if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
++ dirpart=`$as_dirname -- "$mf" ||
++$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
++ X"$mf" : 'X\(//\)[^/]' \| \
++ X"$mf" : 'X\(//\)$' \| \
++ X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
++$as_echo X"$mf" |
++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
++ s//\1/
++ q
++ }
++ /^X\(\/\/\)[^/].*/{
++ s//\1/
++ q
++ }
++ /^X\(\/\/\)$/{
++ s//\1/
++ q
++ }
++ /^X\(\/\).*/{
++ s//\1/
++ q
++ }
++ s/.*/./; q'`
++ else
++ continue
++ fi
++ # Extract the definition of DEPDIR, am__include, and am__quote
++ # from the Makefile without running `make'.
++ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
++ test -z "$DEPDIR" && continue
++ am__include=`sed -n 's/^am__include = //p' < "$mf"`
++ test -z "am__include" && continue
++ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
++ # When using ansi2knr, U may be empty or an underscore; expand it
++ U=`sed -n 's/^U = //p' < "$mf"`
++ # Find all dependency output files, they are included files with
++ # $(DEPDIR) in their names. We invoke sed twice because it is the
++ # simplest approach to changing $(DEPDIR) to its actual value in the
++ # expansion.
++ for file in `sed -n "
++ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
++ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
++ # Make sure the directory exists.
++ test -f "$dirpart/$file" && continue
++ fdir=`$as_dirname -- "$file" ||
++$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
++ X"$file" : 'X\(//\)[^/]' \| \
++ X"$file" : 'X\(//\)$' \| \
++ X"$file" : 'X\(/\)' \| . 2>/dev/null ||
++$as_echo X"$file" |
++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
++ s//\1/
++ q
++ }
++ /^X\(\/\/\)[^/].*/{
++ s//\1/
++ q
++ }
++ /^X\(\/\/\)$/{
++ s//\1/
++ q
++ }
++ /^X\(\/\).*/{
++ s//\1/
++ q
++ }
++ s/.*/./; q'`
++ as_dir=$dirpart/$fdir; as_fn_mkdir_p
++ # echo "creating $dirpart/$file"
++ echo '# dummy' > "$dirpart/$file"
++ done
++ done
++}
++ ;;
++ "libtool":C)
++
++ # See if we are running on zsh, and set the options which allow our
++ # commands through without removal of \ escapes.
++ if test -n "${ZSH_VERSION+set}" ; then
++ setopt NO_GLOB_SUBST
++ fi
++
++ cfgfile="${ofile}T"
++ trap "$RM \"$cfgfile\"; exit 1" 1 2 15
++ $RM "$cfgfile"
++
++ cat <<_LT_EOF >> "$cfgfile"
++#! $SHELL
++
++# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
++# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
++# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
++# NOTE: Changes made to this file will be lost: look at ltmain.sh.
++#
++# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
++# 2006, 2007, 2008 Free Software Foundation, Inc.
++# Written by Gordon Matzigkeit, 1996
++#
++# This file is part of GNU Libtool.
++#
++# GNU Libtool is free software; you can redistribute it and/or
++# modify it under the terms of the GNU General Public License as
++# published by the Free Software Foundation; either version 2 of
++# the License, or (at your option) any later version.
++#
++# As a special exception to the GNU General Public License,
++# if you distribute this file as part of a program or library that
++# is built using GNU Libtool, you may include this file under the
++# same distribution terms that you use for the rest of that program.
++#
++# GNU Libtool is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with GNU Libtool; see the file COPYING. If not, a copy
++# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
++# obtained by writing to the Free Software Foundation, Inc.,
++# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
++
++
++# The names of the tagged configurations supported by this script.
++available_tags=""
++
++# ### BEGIN LIBTOOL CONFIG
++
++# Which release of libtool.m4 was used?
++macro_version=$macro_version
++macro_revision=$macro_revision
++
++# Whether or not to build shared libraries.
++build_libtool_libs=$enable_shared
++
++# Whether or not to build static libraries.
++build_old_libs=$enable_static
++
++# What type of objects to build.
++pic_mode=$pic_mode
++
++# Whether or not to optimize for fast installation.
++fast_install=$enable_fast_install
++
++# The host system.
++host_alias=$host_alias
++host=$host
++host_os=$host_os
++
++# The build system.
++build_alias=$build_alias
++build=$build
++build_os=$build_os
++
++# A sed program that does not truncate output.
++SED=$lt_SED
++
++# Sed that helps us avoid accidentally triggering echo(1) options like -n.
++Xsed="\$SED -e 1s/^X//"
++
++# A grep program that handles long lines.
++GREP=$lt_GREP
++
++# An ERE matcher.
++EGREP=$lt_EGREP
++
++# A literal string matcher.
++FGREP=$lt_FGREP
++
++# A BSD- or MS-compatible name lister.
++NM=$lt_NM
++
++# Whether we need soft or hard links.
++LN_S=$lt_LN_S
++
++# What is the maximum length of a command?
++max_cmd_len=$max_cmd_len
++
++# Object file suffix (normally "o").
++objext=$ac_objext
++
++# Executable file suffix (normally "").
++exeext=$exeext
++
++# whether the shell understands "unset".
++lt_unset=$lt_unset
++
++# turn spaces into newlines.
++SP2NL=$lt_lt_SP2NL
++
++# turn newlines into spaces.
++NL2SP=$lt_lt_NL2SP
++
++# How to create reloadable object files.
++reload_flag=$lt_reload_flag
++reload_cmds=$lt_reload_cmds
++
++# An object symbol dumper.
++OBJDUMP=$lt_OBJDUMP
++
++# Method to check whether dependent libraries are shared objects.
++deplibs_check_method=$lt_deplibs_check_method
++
++# Command to use when deplibs_check_method == "file_magic".
++file_magic_cmd=$lt_file_magic_cmd
++
++# The archiver.
++AR=$lt_AR
++AR_FLAGS=$lt_AR_FLAGS
++
++# A symbol stripping program.
++STRIP=$lt_STRIP
++
++# Commands used to install an old-style archive.
++RANLIB=$lt_RANLIB
++old_postinstall_cmds=$lt_old_postinstall_cmds
++old_postuninstall_cmds=$lt_old_postuninstall_cmds
++
++# A C compiler.
++LTCC=$lt_CC
++
++# LTCC compiler flags.
++LTCFLAGS=$lt_CFLAGS
++
++# Take the output of nm and produce a listing of raw symbols and C names.
++global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
++
++# Transform the output of nm in a proper C declaration.
++global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
++
++# Transform the output of nm in a C name address pair.
++global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
++
++# Transform the output of nm in a C name address pair when lib prefix is needed.
++global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
++
++# The name of the directory that contains temporary libtool files.
++objdir=$objdir
++
++# Shell to use when invoking shell scripts.
++SHELL=$lt_SHELL
++
++# An echo program that does not interpret backslashes.
++ECHO=$lt_ECHO
++
++# Used to examine libraries when file_magic_cmd begins with "file".
++MAGIC_CMD=$MAGIC_CMD
++
++# Must we lock files when doing compilation?
++need_locks=$lt_need_locks
++
++# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
++DSYMUTIL=$lt_DSYMUTIL
++
++# Tool to change global to local symbols on Mac OS X.
++NMEDIT=$lt_NMEDIT
++
++# Tool to manipulate fat objects and archives on Mac OS X.
++LIPO=$lt_LIPO
++
++# ldd/readelf like tool for Mach-O binaries on Mac OS X.
++OTOOL=$lt_OTOOL
++
++# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
++OTOOL64=$lt_OTOOL64
++
++# Old archive suffix (normally "a").
++libext=$libext
++
++# Shared library suffix (normally ".so").
++shrext_cmds=$lt_shrext_cmds
++
++# The commands to extract the exported symbol list from a shared archive.
++extract_expsyms_cmds=$lt_extract_expsyms_cmds
++
++# Variables whose values should be saved in libtool wrapper scripts and
++# restored at link time.
++variables_saved_for_relink=$lt_variables_saved_for_relink
++
++# Do we need the "lib" prefix for modules?
++need_lib_prefix=$need_lib_prefix
++
++# Do we need a version for libraries?
++need_version=$need_version
++
++# Library versioning type.
++version_type=$version_type
++
++# Shared library runtime path variable.
++runpath_var=$runpath_var
++
++# Shared library path variable.
++shlibpath_var=$shlibpath_var
++
++# Is shlibpath searched before the hard-coded library search path?
++shlibpath_overrides_runpath=$shlibpath_overrides_runpath
++
++# Format of library name prefix.
++libname_spec=$lt_libname_spec
++
++# List of archive names. First name is the real one, the rest are links.
++# The last name is the one that the linker finds with -lNAME
++library_names_spec=$lt_library_names_spec
++
++# The coded name of the library, if different from the real name.
++soname_spec=$lt_soname_spec
++
++# Command to use after installation of a shared archive.
++postinstall_cmds=$lt_postinstall_cmds
++
++# Command to use after uninstallation of a shared archive.
++postuninstall_cmds=$lt_postuninstall_cmds
++
++# Commands used to finish a libtool library installation in a directory.
++finish_cmds=$lt_finish_cmds
++
++# As "finish_cmds", except a single script fragment to be evaled but
++# not shown.
++finish_eval=$lt_finish_eval
++
++# Whether we should hardcode library paths into libraries.
++hardcode_into_libs=$hardcode_into_libs
++
++# Compile-time system search path for libraries.
++sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
++
++# Run-time system search path for libraries.
++sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
++
++# Whether dlopen is supported.
++dlopen_support=$enable_dlopen
++
++# Whether dlopen of programs is supported.
++dlopen_self=$enable_dlopen_self
++
++# Whether dlopen of statically linked programs is supported.
++dlopen_self_static=$enable_dlopen_self_static
++
++# Commands to strip libraries.
++old_striplib=$lt_old_striplib
++striplib=$lt_striplib
++
++
++# The linker used to build libraries.
++LD=$lt_LD
++
++# Commands used to build an old-style archive.
++old_archive_cmds=$lt_old_archive_cmds
++
++# A language specific compiler.
++CC=$lt_compiler
++
++# Is the compiler the GNU compiler?
++with_gcc=$GCC
++
++# Compiler flag to turn off builtin functions.
++no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
++
++# How to pass a linker flag through the compiler.
++wl=$lt_lt_prog_compiler_wl
++
++# Additional compiler flags for building library objects.
++pic_flag=$lt_lt_prog_compiler_pic
++
++# Compiler flag to prevent dynamic linking.
++link_static_flag=$lt_lt_prog_compiler_static
++
++# Does compiler simultaneously support -c and -o options?
++compiler_c_o=$lt_lt_cv_prog_compiler_c_o
++
++# Whether or not to add -lc for building shared libraries.
++build_libtool_need_lc=$archive_cmds_need_lc
++
++# Whether or not to disallow shared libs when runtime libs are static.
++allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
++
++# Compiler flag to allow reflexive dlopens.
++export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
++
++# Compiler flag to generate shared objects directly from archives.
++whole_archive_flag_spec=$lt_whole_archive_flag_spec
++
++# Whether the compiler copes with passing no objects directly.
++compiler_needs_object=$lt_compiler_needs_object
++
++# Create an old-style archive from a shared archive.
++old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
++
++# Create a temporary old-style archive to link instead of a shared archive.
++old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
++
++# Commands used to build a shared archive.
++archive_cmds=$lt_archive_cmds
++archive_expsym_cmds=$lt_archive_expsym_cmds
++
++# Commands used to build a loadable module if different from building
++# a shared archive.
++module_cmds=$lt_module_cmds
++module_expsym_cmds=$lt_module_expsym_cmds
++
++# Whether we are building with GNU ld or not.
++with_gnu_ld=$lt_with_gnu_ld
++
++# Flag that allows shared libraries with undefined symbols to be built.
++allow_undefined_flag=$lt_allow_undefined_flag
++
++# Flag that enforces no undefined symbols.
++no_undefined_flag=$lt_no_undefined_flag
++
++# Flag to hardcode \$libdir into a binary during linking.
++# This must work even if \$libdir does not exist
++hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
++
++# If ld is used when linking, flag to hardcode \$libdir into a binary
++# during linking. This must work even if \$libdir does not exist.
++hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
++
++# Whether we need a single "-rpath" flag with a separated argument.
++hardcode_libdir_separator=$lt_hardcode_libdir_separator
++
++# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
++# DIR into the resulting binary.
++hardcode_direct=$hardcode_direct
++
++# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
++# DIR into the resulting binary and the resulting library dependency is
++# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
++# library is relocated.
++hardcode_direct_absolute=$hardcode_direct_absolute
++
++# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
++# into the resulting binary.
++hardcode_minus_L=$hardcode_minus_L
++
++# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
++# into the resulting binary.
++hardcode_shlibpath_var=$hardcode_shlibpath_var
++
++# Set to "yes" if building a shared library automatically hardcodes DIR
++# into the library and all subsequent libraries and executables linked
++# against it.
++hardcode_automatic=$hardcode_automatic
++
++# Set to yes if linker adds runtime paths of dependent libraries
++# to runtime path list.
++inherit_rpath=$inherit_rpath
++
++# Whether libtool must link a program against all its dependency libraries.
++link_all_deplibs=$link_all_deplibs
++
++# Fix the shell variable \$srcfile for the compiler.
++fix_srcfile_path=$lt_fix_srcfile_path
++
++# Set to "yes" if exported symbols are required.
++always_export_symbols=$always_export_symbols
++
++# The commands to list exported symbols.
++export_symbols_cmds=$lt_export_symbols_cmds
++
++# Symbols that should not be listed in the preloaded symbols.
++exclude_expsyms=$lt_exclude_expsyms
++
++# Symbols that must always be exported.
++include_expsyms=$lt_include_expsyms
++
++# Commands necessary for linking programs (against libraries) with templates.
++prelink_cmds=$lt_prelink_cmds
++
++# Specify filename containing input files.
++file_list_spec=$lt_file_list_spec
++
++# How to hardcode a shared library path into an executable.
++hardcode_action=$hardcode_action
++
++# ### END LIBTOOL CONFIG
++
++_LT_EOF
++
++ case $host_os in
++ aix3*)
++ cat <<\_LT_EOF >> "$cfgfile"
++# AIX sometimes has problems with the GCC collect2 program. For some
++# reason, if we set the COLLECT_NAMES environment variable, the problems
++# vanish in a puff of smoke.
++if test "X${COLLECT_NAMES+set}" != Xset; then
++ COLLECT_NAMES=
++ export COLLECT_NAMES
++fi
++_LT_EOF
++ ;;
++ esac
++
++
++ltmain="$ac_aux_dir/ltmain.sh"
++
++
++ # We use sed instead of cat because bash on DJGPP gets confused if
++ # if finds mixed CR/LF and LF-only lines. Since sed operates in
++ # text mode, it properly converts lines to CR/LF. This bash problem
++ # is reportedly fixed, but why not run on old versions too?
++ sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
++ || (rm -f "$cfgfile"; exit 1)
++
++ case $xsi_shell in
++ yes)
++ cat << \_LT_EOF >> "$cfgfile"
++
++# func_dirname file append nondir_replacement
++# Compute the dirname of FILE. If nonempty, add APPEND to the result,
++# otherwise set result to NONDIR_REPLACEMENT.
++func_dirname ()
++{
++ case ${1} in
++ */*) func_dirname_result="${1%/*}${2}" ;;
++ * ) func_dirname_result="${3}" ;;
++ esac
++}
++
++# func_basename file
++func_basename ()
++{
++ func_basename_result="${1##*/}"
++}
++
++# func_dirname_and_basename file append nondir_replacement
++# perform func_basename and func_dirname in a single function
++# call:
++# dirname: Compute the dirname of FILE. If nonempty,
++# add APPEND to the result, otherwise set result
++# to NONDIR_REPLACEMENT.
++# value returned in "$func_dirname_result"
++# basename: Compute filename of FILE.
++# value retuned in "$func_basename_result"
++# Implementation must be kept synchronized with func_dirname
++# and func_basename. For efficiency, we do not delegate to
++# those functions but instead duplicate the functionality here.
++func_dirname_and_basename ()
++{
++ case ${1} in
++ */*) func_dirname_result="${1%/*}${2}" ;;
++ * ) func_dirname_result="${3}" ;;
++ esac
++ func_basename_result="${1##*/}"
++}
++
++# func_stripname prefix suffix name
++# strip PREFIX and SUFFIX off of NAME.
++# PREFIX and SUFFIX must not contain globbing or regex special
++# characters, hashes, percent signs, but SUFFIX may contain a leading
++# dot (in which case that matches only a dot).
++func_stripname ()
++{
++ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
++ # positional parameters, so assign one to ordinary parameter first.
++ func_stripname_result=${3}
++ func_stripname_result=${func_stripname_result#"${1}"}
++ func_stripname_result=${func_stripname_result%"${2}"}
++}
++
++# func_opt_split
++func_opt_split ()
++{
++ func_opt_split_opt=${1%%=*}
++ func_opt_split_arg=${1#*=}
++}
++
++# func_lo2o object
++func_lo2o ()
++{
++ case ${1} in
++ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
++ *) func_lo2o_result=${1} ;;
++ esac
++}
++
++# func_xform libobj-or-source
++func_xform ()
++{
++ func_xform_result=${1%.*}.lo
++}
++
++# func_arith arithmetic-term...
++func_arith ()
++{
++ func_arith_result=$(( $* ))
++}
++
++# func_len string
++# STRING may not start with a hyphen.
++func_len ()
++{
++ func_len_result=${#1}
++}
++
++_LT_EOF
++ ;;
++ *) # Bourne compatible functions.
++ cat << \_LT_EOF >> "$cfgfile"
++
++# func_dirname file append nondir_replacement
++# Compute the dirname of FILE. If nonempty, add APPEND to the result,
++# otherwise set result to NONDIR_REPLACEMENT.
++func_dirname ()
++{
++ # Extract subdirectory from the argument.
++ func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
++ if test "X$func_dirname_result" = "X${1}"; then
++ func_dirname_result="${3}"
++ else
++ func_dirname_result="$func_dirname_result${2}"
++ fi
++}
++
++# func_basename file
++func_basename ()
++{
++ func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
++}
++
++
++# func_stripname prefix suffix name
++# strip PREFIX and SUFFIX off of NAME.
++# PREFIX and SUFFIX must not contain globbing or regex special
++# characters, hashes, percent signs, but SUFFIX may contain a leading
++# dot (in which case that matches only a dot).
++# func_strip_suffix prefix name
++func_stripname ()
++{
++ case ${2} in
++ .*) func_stripname_result=`$ECHO "X${3}" \
++ | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
++ *) func_stripname_result=`$ECHO "X${3}" \
++ | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
++ esac
++}
++
++# sed scripts:
++my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
++my_sed_long_arg='1s/^-[^=]*=//'
++
++# func_opt_split
++func_opt_split ()
++{
++ func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
++ func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
++}
++
++# func_lo2o object
++func_lo2o ()
++{
++ func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
++}
++
++# func_xform libobj-or-source
++func_xform ()
++{
++ func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'`
++}
++
++# func_arith arithmetic-term...
++func_arith ()
++{
++ func_arith_result=`expr "$@"`
++}
++
++# func_len string
++# STRING may not start with a hyphen.
++func_len ()
++{
++ func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
++}
++
++_LT_EOF
++esac
++
++case $lt_shell_append in
++ yes)
++ cat << \_LT_EOF >> "$cfgfile"
++
++# func_append var value
++# Append VALUE to the end of shell variable VAR.
++func_append ()
++{
++ eval "$1+=\$2"
++}
++_LT_EOF
++ ;;
++ *)
++ cat << \_LT_EOF >> "$cfgfile"
++
++# func_append var value
++# Append VALUE to the end of shell variable VAR.
++func_append ()
++{
++ eval "$1=\$$1\$2"
++}
++
++_LT_EOF
++ ;;
++ esac
++
++
++ sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
++ || (rm -f "$cfgfile"; exit 1)
++
++ mv -f "$cfgfile" "$ofile" ||
++ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
++ chmod +x "$ofile"
++
++ ;;
++
++ esac
++done # for ac_tag
++
++
++as_fn_exit 0
++_ACEOF
++ac_clean_files=$ac_clean_files_save
++
++test $ac_write_fail = 0 ||
++ as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
++
++
++# configure is writing to config.log, and then calls config.status.
++# config.status does its own redirection, appending to config.log.
++# Unfortunately, on DOS this fails, as config.log is still kept open
++# by configure, so config.status won't be able to write to it; its
++# output is simply discarded. So we exec the FD to /dev/null,
++# effectively closing config.log, so it can be properly (re)opened and
++# appended to by config.status. When coming back to configure, we
++# need to make the FD available again.
++if test "$no_create" != yes; then
++ ac_cs_success=:
++ ac_config_status_args=
++ test "$silent" = yes &&
++ ac_config_status_args="$ac_config_status_args --quiet"
++ exec 5>/dev/null
++ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
++ exec 5>>config.log
++ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
++ # would make configure fail if this is the last instruction.
++ $ac_cs_success || as_fn_exit $?
++fi
++if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
++$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
++fi
++
++
+diff --git a/configure.ac b/configure.ac
+new file mode 100644
+index 0000000..0542606
+--- /dev/null
++++ b/configure.ac
+@@ -0,0 +1,93 @@
++# -*- Autoconf -*-
++# Process this file with autoconf to produce a configure script.
++
++AC_PREREQ([2.61])
++AC_INIT([libdessert], [0.86.14], [des-sert@spline.inf.fu-berlin.de])
++AM_INIT_AUTOMAKE([-Wall gnu dist-bzip2])
++AC_CONFIG_MACRO_DIR([m4])
++
++AC_CONFIG_SRCDIR([src/libdessert/dessert_core.c])
++AC_CONFIG_HEADERS([config.h])
++
++LIBDESSERT_LIBRARY_VERSION=0:86:14
++AC_SUBST([LIBDESSERT_LIBRARY_VERSION])
++
++# Checks for programs.
++AC_PROG_CC
++AC_PROG_INSTALL
++AC_PROG_LN_S
++
++# Checks for libtool
++
++# Debian Stable has no libtool2 yet so use old invocation
++#LT_INIT
++AM_PROG_LIBTOOL
++
++# Checks for net-snmp-config
++AC_CHECK_NET_SNMP
++
++AC_SUBST([SNMP_LIBS])
++AC_SUBST([SNMP_CFLAGS])
++
++# Checks for pcap
++AC_CHECK_PCAP
++
++AC_SUBST([PCAP_LIBS])
++AC_SUBST([PCAP_CFLAGS])
++
++# Checks for libcli
++
++AC_CHECK_HEADERS([libcli.h])
++
++AC_SEARCH_LIBS([cli_print], [libcli],
++ [AC_MSG_ERROR([libcli could not found, please install development package of libcli])
++])
++
++# Checks for libraries.
++
++AX_PTHREAD(,[
++AC_MSG_WARN([your system does not support a pthread variant maybee libdessert will not work])
++])
++
++# Checks for header files.
++AC_CHECK_HEADERS([arpa/inet.h fcntl.h netinet/in.h stdint.h stdlib.h string.h sys/ioctl.h sys/socket.h syslog.h unistd.h])
++
++# Checks for typedefs, structures, and compiler characteristics.
++AC_HEADER_STDBOOL
++AC_C_INLINE
++AC_TYPE_INT32_T
++AC_TYPE_PID_T
++AC_TYPE_SIZE_T
++AC_TYPE_SSIZE_T
++AC_TYPE_UINT16_T
++AC_TYPE_UINT32_T
++AC_TYPE_UINT64_T
++AC_TYPE_UINT8_T
++
++# Checks for library functions.
++AC_FUNC_FORK
++AC_FUNC_MALLOC
++AC_FUNC_REALLOC
++AC_CHECK_FUNCS([gethostname gettimeofday localtime_r memmove memset socket strdup strerror strtol])
++
++# Checking for documentation generation
++
++DX_HTML_FEATURE([ON])
++DX_CHM_FEATURE([OFF])
++DX_CHI_FEATURE([OFF])
++DX_MAN_FEATURE([OFF])
++DX_RTF_FEATURE([OFF])
++DX_XML_FEATURE([OFF])
++DX_PDF_FEATURE([ON])
++DX_PS_FEATURE([OFF])
++DX_INIT_DOXYGEN([${PACKAGE_NAME}], [DES-SERT.doxyfile], [doxygen])
++
++AC_CONFIG_FILES([Makefile
++ src/Makefile
++ src/snmp/Makefile
++ src/libdessert/Makefile
++ include/Makefile
++ libdessert.pc
++ ])
++AC_OUTPUT
++
+diff --git a/depcomp b/depcomp
+new file mode 100755
+index 0000000..df8eea7
+--- /dev/null
++++ b/depcomp
+@@ -0,0 +1,630 @@
++#! /bin/sh
++# depcomp - compile a program generating dependencies as side-effects
++
++scriptversion=2009-04-28.21; # UTC
++
++# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
++# Software Foundation, Inc.
++
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2, or (at your option)
++# any later version.
++
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++
++# You should have received a copy of the GNU General Public License
++# along with this program. If not, see <http://www.gnu.org/licenses/>.
++
++# As a special exception to the GNU General Public License, if you
++# distribute this file as part of a program that contains a
++# configuration script generated by Autoconf, you may include it under
++# the same distribution terms that you use for the rest of that program.
++
++# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
++
++case $1 in
++ '')
++ echo "$0: No command. Try \`$0 --help' for more information." 1>&2
++ exit 1;
++ ;;
++ -h | --h*)
++ cat <<\EOF
++Usage: depcomp [--help] [--version] PROGRAM [ARGS]
++
++Run PROGRAMS ARGS to compile a file, generating dependencies
++as side-effects.
++
++Environment variables:
++ depmode Dependency tracking mode.
++ source Source file read by `PROGRAMS ARGS'.
++ object Object file output by `PROGRAMS ARGS'.
++ DEPDIR directory where to store dependencies.
++ depfile Dependency file to output.
++ tmpdepfile Temporary file to use when outputing dependencies.
++ libtool Whether libtool is used (yes/no).
++
++Report bugs to <bug-automake@gnu.org>.
++EOF
++ exit $?
++ ;;
++ -v | --v*)
++ echo "depcomp $scriptversion"
++ exit $?
++ ;;
++esac
++
++if test -z "$depmode" || test -z "$source" || test -z "$object"; then
++ echo "depcomp: Variables source, object and depmode must be set" 1>&2
++ exit 1
++fi
++
++# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
++depfile=${depfile-`echo "$object" |
++ sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
++tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
++
++rm -f "$tmpdepfile"
++
++# Some modes work just like other modes, but use different flags. We
++# parameterize here, but still list the modes in the big case below,
++# to make depend.m4 easier to write. Note that we *cannot* use a case
++# here, because this file can only contain one case statement.
++if test "$depmode" = hp; then
++ # HP compiler uses -M and no extra arg.
++ gccflag=-M
++ depmode=gcc
++fi
++
++if test "$depmode" = dashXmstdout; then
++ # This is just like dashmstdout with a different argument.
++ dashmflag=-xM
++ depmode=dashmstdout
++fi
++
++cygpath_u="cygpath -u -f -"
++if test "$depmode" = msvcmsys; then
++ # This is just like msvisualcpp but w/o cygpath translation.
++ # Just convert the backslash-escaped backslashes to single forward
++ # slashes to satisfy depend.m4
++ cygpath_u="sed s,\\\\\\\\,/,g"
++ depmode=msvisualcpp
++fi
++
++case "$depmode" in
++gcc3)
++## gcc 3 implements dependency tracking that does exactly what
++## we want. Yay! Note: for some reason libtool 1.4 doesn't like
++## it if -MD -MP comes after the -MF stuff. Hmm.
++## Unfortunately, FreeBSD c89 acceptance of flags depends upon
++## the command line argument order; so add the flags where they
++## appear in depend2.am. Note that the slowdown incurred here
++## affects only configure: in makefiles, %FASTDEP% shortcuts this.
++ for arg
++ do
++ case $arg in
++ -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
++ *) set fnord "$@" "$arg" ;;
++ esac
++ shift # fnord
++ shift # $arg
++ done
++ "$@"
++ stat=$?
++ if test $stat -eq 0; then :
++ else
++ rm -f "$tmpdepfile"
++ exit $stat
++ fi
++ mv "$tmpdepfile" "$depfile"
++ ;;
++
++gcc)
++## There are various ways to get dependency output from gcc. Here's
++## why we pick this rather obscure method:
++## - Don't want to use -MD because we'd like the dependencies to end
++## up in a subdir. Having to rename by hand is ugly.
++## (We might end up doing this anyway to support other compilers.)
++## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
++## -MM, not -M (despite what the docs say).
++## - Using -M directly means running the compiler twice (even worse
++## than renaming).
++ if test -z "$gccflag"; then
++ gccflag=-MD,
++ fi
++ "$@" -Wp,"$gccflag$tmpdepfile"
++ stat=$?
++ if test $stat -eq 0; then :
++ else
++ rm -f "$tmpdepfile"
++ exit $stat
++ fi
++ rm -f "$depfile"
++ echo "$object : \\" > "$depfile"
++ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
++## The second -e expression handles DOS-style file names with drive letters.
++ sed -e 's/^[^:]*: / /' \
++ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
++## This next piece of magic avoids the `deleted header file' problem.
++## The problem is that when a header file which appears in a .P file
++## is deleted, the dependency causes make to die (because there is
++## typically no way to rebuild the header). We avoid this by adding
++## dummy dependencies for each header file. Too bad gcc doesn't do
++## this for us directly.
++ tr ' ' '
++' < "$tmpdepfile" |
++## Some versions of gcc put a space before the `:'. On the theory
++## that the space means something, we add a space to the output as
++## well.
++## Some versions of the HPUX 10.20 sed can't process this invocation
++## correctly. Breaking it into two sed invocations is a workaround.
++ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
++ rm -f "$tmpdepfile"
++ ;;
++
++hp)
++ # This case exists only to let depend.m4 do its work. It works by
++ # looking at the text of this script. This case will never be run,
++ # since it is checked for above.
++ exit 1
++ ;;
++
++sgi)
++ if test "$libtool" = yes; then
++ "$@" "-Wp,-MDupdate,$tmpdepfile"
++ else
++ "$@" -MDupdate "$tmpdepfile"
++ fi
++ stat=$?
++ if test $stat -eq 0; then :
++ else
++ rm -f "$tmpdepfile"
++ exit $stat
++ fi
++ rm -f "$depfile"
++
++ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
++ echo "$object : \\" > "$depfile"
++
++ # Clip off the initial element (the dependent). Don't try to be
++ # clever and replace this with sed code, as IRIX sed won't handle
++ # lines with more than a fixed number of characters (4096 in
++ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
++ # the IRIX cc adds comments like `#:fec' to the end of the
++ # dependency line.
++ tr ' ' '
++' < "$tmpdepfile" \
++ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
++ tr '
++' ' ' >> "$depfile"
++ echo >> "$depfile"
++
++ # The second pass generates a dummy entry for each header file.
++ tr ' ' '
++' < "$tmpdepfile" \
++ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
++ >> "$depfile"
++ else
++ # The sourcefile does not contain any dependencies, so just
++ # store a dummy comment line, to avoid errors with the Makefile
++ # "include basename.Plo" scheme.
++ echo "#dummy" > "$depfile"
++ fi
++ rm -f "$tmpdepfile"
++ ;;
++
++aix)
++ # The C for AIX Compiler uses -M and outputs the dependencies
++ # in a .u file. In older versions, this file always lives in the
++ # current directory. Also, the AIX compiler puts `$object:' at the
++ # start of each line; $object doesn't have directory information.
++ # Version 6 uses the directory in both cases.
++ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
++ test "x$dir" = "x$object" && dir=
++ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
++ if test "$libtool" = yes; then
++ tmpdepfile1=$dir$base.u
++ tmpdepfile2=$base.u
++ tmpdepfile3=$dir.libs/$base.u
++ "$@" -Wc,-M
++ else
++ tmpdepfile1=$dir$base.u
++ tmpdepfile2=$dir$base.u
++ tmpdepfile3=$dir$base.u
++ "$@" -M
++ fi
++ stat=$?
++
++ if test $stat -eq 0; then :
++ else
++ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
++ exit $stat
++ fi
++
++ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
++ do
++ test -f "$tmpdepfile" && break
++ done
++ if test -f "$tmpdepfile"; then
++ # Each line is of the form `foo.o: dependent.h'.
++ # Do two passes, one to just change these to
++ # `$object: dependent.h' and one to simply `dependent.h:'.
++ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
++ # That's a tab and a space in the [].
++ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
++ else
++ # The sourcefile does not contain any dependencies, so just
++ # store a dummy comment line, to avoid errors with the Makefile
++ # "include basename.Plo" scheme.
++ echo "#dummy" > "$depfile"
++ fi
++ rm -f "$tmpdepfile"
++ ;;
++
++icc)
++ # Intel's C compiler understands `-MD -MF file'. However on
++ # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
++ # ICC 7.0 will fill foo.d with something like
++ # foo.o: sub/foo.c
++ # foo.o: sub/foo.h
++ # which is wrong. We want:
++ # sub/foo.o: sub/foo.c
++ # sub/foo.o: sub/foo.h
++ # sub/foo.c:
++ # sub/foo.h:
++ # ICC 7.1 will output
++ # foo.o: sub/foo.c sub/foo.h
++ # and will wrap long lines using \ :
++ # foo.o: sub/foo.c ... \
++ # sub/foo.h ... \
++ # ...
++
++ "$@" -MD -MF "$tmpdepfile"
++ stat=$?
++ if test $stat -eq 0; then :
++ else
++ rm -f "$tmpdepfile"
++ exit $stat
++ fi
++ rm -f "$depfile"
++ # Each line is of the form `foo.o: dependent.h',
++ # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
++ # Do two passes, one to just change these to
++ # `$object: dependent.h' and one to simply `dependent.h:'.
++ sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
++ # Some versions of the HPUX 10.20 sed can't process this invocation
++ # correctly. Breaking it into two sed invocations is a workaround.
++ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
++ sed -e 's/$/ :/' >> "$depfile"
++ rm -f "$tmpdepfile"
++ ;;
++
++hp2)
++ # The "hp" stanza above does not work with aCC (C++) and HP's ia64
++ # compilers, which have integrated preprocessors. The correct option
++ # to use with these is +Maked; it writes dependencies to a file named
++ # 'foo.d', which lands next to the object file, wherever that
++ # happens to be.
++ # Much of this is similar to the tru64 case; see comments there.
++ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
++ test "x$dir" = "x$object" && dir=
++ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
++ if test "$libtool" = yes; then
++ tmpdepfile1=$dir$base.d
++ tmpdepfile2=$dir.libs/$base.d
++ "$@" -Wc,+Maked
++ else
++ tmpdepfile1=$dir$base.d
++ tmpdepfile2=$dir$base.d
++ "$@" +Maked
++ fi
++ stat=$?
++ if test $stat -eq 0; then :
++ else
++ rm -f "$tmpdepfile1" "$tmpdepfile2"
++ exit $stat
++ fi
++
++ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
++ do
++ test -f "$tmpdepfile" && break
++ done
++ if test -f "$tmpdepfile"; then
++ sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
++ # Add `dependent.h:' lines.
++ sed -ne '2,${
++ s/^ *//
++ s/ \\*$//
++ s/$/:/
++ p
++ }' "$tmpdepfile" >> "$depfile"
++ else
++ echo "#dummy" > "$depfile"
++ fi
++ rm -f "$tmpdepfile" "$tmpdepfile2"
++ ;;
++
++tru64)
++ # The Tru64 compiler uses -MD to generate dependencies as a side
++ # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
++ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
++ # dependencies in `foo.d' instead, so we check for that too.
++ # Subdirectories are respected.
++ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
++ test "x$dir" = "x$object" && dir=
++ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
++
++ if test "$libtool" = yes; then
++ # With Tru64 cc, shared objects can also be used to make a
++ # static library. This mechanism is used in libtool 1.4 series to
++ # handle both shared and static libraries in a single compilation.
++ # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
++ #
++ # With libtool 1.5 this exception was removed, and libtool now
++ # generates 2 separate objects for the 2 libraries. These two
++ # compilations output dependencies in $dir.libs/$base.o.d and
++ # in $dir$base.o.d. We have to check for both files, because
++ # one of the two compilations can be disabled. We should prefer
++ # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
++ # automatically cleaned when .libs/ is deleted, while ignoring
++ # the former would cause a distcleancheck panic.
++ tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
++ tmpdepfile2=$dir$base.o.d # libtool 1.5
++ tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
++ tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
++ "$@" -Wc,-MD
++ else
++ tmpdepfile1=$dir$base.o.d
++ tmpdepfile2=$dir$base.d
++ tmpdepfile3=$dir$base.d
++ tmpdepfile4=$dir$base.d
++ "$@" -MD
++ fi
++
++ stat=$?
++ if test $stat -eq 0; then :
++ else
++ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
++ exit $stat
++ fi
++
++ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
++ do
++ test -f "$tmpdepfile" && break
++ done
++ if test -f "$tmpdepfile"; then
++ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
++ # That's a tab and a space in the [].
++ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
++ else
++ echo "#dummy" > "$depfile"
++ fi
++ rm -f "$tmpdepfile"
++ ;;
++
++#nosideeffect)
++ # This comment above is used by automake to tell side-effect
++ # dependency tracking mechanisms from slower ones.
++
++dashmstdout)
++ # Important note: in order to support this mode, a compiler *must*
++ # always write the preprocessed file to stdout, regardless of -o.
++ "$@" || exit $?
++
++ # Remove the call to Libtool.
++ if test "$libtool" = yes; then
++ while test "X$1" != 'X--mode=compile'; do
++ shift
++ done
++ shift
++ fi
++
++ # Remove `-o $object'.
++ IFS=" "
++ for arg
++ do
++ case $arg in
++ -o)
++ shift
++ ;;
++ $object)
++ shift
++ ;;
++ *)
++ set fnord "$@" "$arg"
++ shift # fnord
++ shift # $arg
++ ;;
++ esac
++ done
++
++ test -z "$dashmflag" && dashmflag=-M
++ # Require at least two characters before searching for `:'
++ # in the target name. This is to cope with DOS-style filenames:
++ # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
++ "$@" $dashmflag |
++ sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
++ rm -f "$depfile"
++ cat < "$tmpdepfile" > "$depfile"
++ tr ' ' '
++' < "$tmpdepfile" | \
++## Some versions of the HPUX 10.20 sed can't process this invocation
++## correctly. Breaking it into two sed invocations is a workaround.
++ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
++ rm -f "$tmpdepfile"
++ ;;
++
++dashXmstdout)
++ # This case only exists to satisfy depend.m4. It is never actually
++ # run, as this mode is specially recognized in the preamble.
++ exit 1
++ ;;
++
++makedepend)
++ "$@" || exit $?
++ # Remove any Libtool call
++ if test "$libtool" = yes; then
++ while test "X$1" != 'X--mode=compile'; do
++ shift
++ done
++ shift
++ fi
++ # X makedepend
++ shift
++ cleared=no eat=no
++ for arg
++ do
++ case $cleared in
++ no)
++ set ""; shift
++ cleared=yes ;;
++ esac
++ if test $eat = yes; then
++ eat=no
++ continue
++ fi
++ case "$arg" in
++ -D*|-I*)
++ set fnord "$@" "$arg"; shift ;;
++ # Strip any option that makedepend may not understand. Remove
++ # the object too, otherwise makedepend will parse it as a source file.
++ -arch)
++ eat=yes ;;
++ -*|$object)
++ ;;
++ *)
++ set fnord "$@" "$arg"; shift ;;
++ esac
++ done
++ obj_suffix=`echo "$object" | sed 's/^.*\././'`
++ touch "$tmpdepfile"
++ ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
++ rm -f "$depfile"
++ cat < "$tmpdepfile" > "$depfile"
++ sed '1,2d' "$tmpdepfile" | tr ' ' '
++' | \
++## Some versions of the HPUX 10.20 sed can't process this invocation
++## correctly. Breaking it into two sed invocations is a workaround.
++ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
++ rm -f "$tmpdepfile" "$tmpdepfile".bak
++ ;;
++
++cpp)
++ # Important note: in order to support this mode, a compiler *must*
++ # always write the preprocessed file to stdout.
++ "$@" || exit $?
++
++ # Remove the call to Libtool.
++ if test "$libtool" = yes; then
++ while test "X$1" != 'X--mode=compile'; do
++ shift
++ done
++ shift
++ fi
++
++ # Remove `-o $object'.
++ IFS=" "
++ for arg
++ do
++ case $arg in
++ -o)
++ shift
++ ;;
++ $object)
++ shift
++ ;;
++ *)
++ set fnord "$@" "$arg"
++ shift # fnord
++ shift # $arg
++ ;;
++ esac
++ done
++
++ "$@" -E |
++ sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
++ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
++ sed '$ s: \\$::' > "$tmpdepfile"
++ rm -f "$depfile"
++ echo "$object : \\" > "$depfile"
++ cat < "$tmpdepfile" >> "$depfile"
++ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
++ rm -f "$tmpdepfile"
++ ;;
++
++msvisualcpp)
++ # Important note: in order to support this mode, a compiler *must*
++ # always write the preprocessed file to stdout.
++ "$@" || exit $?
++
++ # Remove the call to Libtool.
++ if test "$libtool" = yes; then
++ while test "X$1" != 'X--mode=compile'; do
++ shift
++ done
++ shift
++ fi
++
++ IFS=" "
++ for arg
++ do
++ case "$arg" in
++ -o)
++ shift
++ ;;
++ $object)
++ shift
++ ;;
++ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
++ set fnord "$@"
++ shift
++ shift
++ ;;
++ *)
++ set fnord "$@" "$arg"
++ shift
++ shift
++ ;;
++ esac
++ done
++ "$@" -E 2>/dev/null |
++ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
++ rm -f "$depfile"
++ echo "$object : \\" > "$depfile"
++ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
++ echo " " >> "$depfile"
++ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
++ rm -f "$tmpdepfile"
++ ;;
++
++msvcmsys)
++ # This case exists only to let depend.m4 do its work. It works by
++ # looking at the text of this script. This case will never be run,
++ # since it is checked for above.
++ exit 1
++ ;;
++
++none)
++ exec "$@"
++ ;;
++
++*)
++ echo "Unknown depmode $depmode" 1>&2
++ exit 1
++ ;;
++esac
++
++exit 0
++
++# Local Variables:
++# mode: shell-script
++# sh-indentation: 2
++# eval: (add-hook 'write-file-hooks 'time-stamp)
++# time-stamp-start: "scriptversion="
++# time-stamp-format: "%:y-%02m-%02d.%02H"
++# time-stamp-time-zone: "UTC"
++# time-stamp-end: "; # UTC"
++# End:
+diff --git a/dessert.h b/dessert.h
+deleted file mode 100644
+index 4e0dea4..0000000
+--- a/dessert.h
++++ /dev/null
+@@ -1,1334 +0,0 @@
+-/***************************************************************************//**
+- @file
+-
+- @page license License
+-
+- @brief Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB). \n
+- All rights reserved. \n
+-
+- These sources were originally developed by Philipp Schmidt
+- at Freie Universitaet Berlin (http://www.fu-berlin.de/),
+- Computer Systems and Telematics / Distributed, Embedded Systems (DES) group \n
+- (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/) \n
+- -----------------------------------------------------------------------------\n
+- This program is free software: you can redistribute it and/or modify it under
+- the terms of the GNU General Public License as published by the Free Software
+- Foundation, either version 3 of the License, or (at your option) any later
+- version. \n
+- \n
+- This program is distributed in the hope that it will be useful, but WITHOUT
+- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n
+- \n
+- You should have received a copy of the GNU General Public License along with
+- this program. If not, see http://www.gnu.org/licenses/ . \n
+- -----------------------------------------------------------------------------\n
+- For further information and questions please use the web site \n
+- http://www.des-testbed.net/
+-*******************************************************************************/
+-
+-/***************************************************************************//**
+- *
+- * @mainpage DES-SERT
+- *
+- *
+- * @section intro_sec Introduction
+- *
+- * DES-SERT, the DES Simple and Extensible Routing-Framework for Testbeds,
+- * is a framework designed to assist researchers implementing routing
+- * protocols for testbeds.
+- *
+- * DES-SERT enables the implementation of routing protocols on top of
+- * Ethernet via an underlay (Layer 2.5) in user space.
+- * It introduces an abstraction from OS specific issues and provides
+- * functionality and data structures to implement proactive, reactive,
+- * and hybrid routing protocols.
+-
+- * While generally usable in many application scenarios, it is primarily
+- * used in DES-Mesh (http://www.des-testbed.net/), the multi-transceiver
+- * wireless mesh network testbed part of the DES-Testbed at Freie
+- * Universitaet Berlin, Germany.
+- *
+- * @section arch_sec DES-SERT Architecture
+- *
+- * DES-SERT introduces some concepts to implement routing protocols.
+- * When implementing a routing protocol with DES-SERT, you should be
+- * familiar with these concepts to structure and tailor your implementation.
+- *
+- *
+- * @subsection messages_subsec DES-SERT Messages
+- *
+- * Every packet you send or receive on the mesh is represented as a
+- * DES-SERT message. From a programmers point of view, a DES-SERT message
+- * is just a C-structure:
+- *
+- * @code
+- * typedef struct __attribute__ ((__packed__)) dessert_msg {
+- * struct ether_header l2h;
+- * char proto[DESSERT_PROTO_STRLEN];
+- * uint8_t ver;
+- * uint8_t flags;
+- * union {
+- * uint32_t u32;
+- * struct __attribute__ ((__packed__)) {
+- * uint8_t ttl;
+- * uint8_t u8;
+- * uint16_t u16;
+- * };
+- * };
+- * uint16_t hlen;
+- * uint16_t plen;
+- * } dessert_msg_t;
+- * @endcode
+- *
+- * Every message sent via the underlay carries this structure as a packet
+- * header. All data in a "dessert_msg" is stored in network byte order.
+- * DES-SERT tries to care as automatically as possible of this structure.
+- * Nevertheless you will have to care at least about: "l2h.ether_dhost" and
+- * "ttl".
+- *
+- * If you need to send some data along with every packet, e.g. some kind of
+- * metric or cost your routing protocol uses, you should try to fit this
+- * data into the "u8", "u16" and the upper 4 bits of the "flags" field.
+- * These fields will never be touched by DES-SERT except on initialization
+- * via "dessert_msg_new".
+- *
+- * Because just a C-structure is not really usable as a packet, there are some
+- * utility functions around - please have a look around in "dessert.h" and the
+- * doxygen documentation. The most important ones are: "dessert_msg_new" and
+- * "dessert_msg_destroy", which do not simply allocate memory for a DES-SERT
+- * message, but for a whole packet of maximum size and initialize the
+- * structures for further packet construction/processing.
+- *
+- * @code
+- * int dessert_msg_new(dessert_msg_t **msgout);
+- *
+- * void dessert_msg_destroy(dessert_msg_t* msg);
+- * @endcode
+- *
+- *
+- * @subsection extensions_subsec DES-SERT Extensions
+- *
+- * A DES-SERT extension is some structure used to piggyback data on a
+- * DES-SERT message. It consists of a 8-bit user supplied type field (with
+- * some reserved values), an 8-bit length field and user supplied data of
+- * arbitrary length of 253 bytes at most.
+- *
+- * It can be added to a message via dessert_msg_addext(), retrieved via
+- * dessert_msg_getext() and removed via dessert_msg_delext().
+- *
+- * @code
+- * int dessert_msg_addext(dessert_msg_t* msg, dessert_ext_t** ext,
+- * uint8_t type, size_t len);
+- *
+- * int dessert_msg_delext(dessert_msg_t *msg, dessert_ext_t *ext);
+- *
+- * int dessert_msg_getext(const dessert_msg_t* msg, dessert_ext_t** ext,
+- * uint8_t type, int index);
+- *
+- * @endcode
+- *
+- * It is recommended not to put single data fields in extensions, but
+- * combine semantically related data in a struct and attach this struct
+- * as an extension because every extension carried introduces an 16-bit
+- * overhead to the packet.
+- *
+- *
+- * @subsection pipelines_subsec Processing Pipelines
+- *
+- * Routing algorithms are often split up in several parts like packet
+- * validation, loop-detection or routing table lookup.
+- * To implement these as independent and clear as possible, DES-SERT enables
+- * you to split up your packet processing in as many parts as you like.
+- *
+- * There are two separate processing pipelines - one for packets received
+- * from the kernel via a TUN or TAP interface and one for packets received
+- * via an interface used on the mesh network.
+- *
+- * You can register callbacks to be added to one of these pipelines with
+- * "dessert_sysrxcb_add" or "dessert_meshrxcb_add". Both take an additional
+- * integer argument ("priority") specifying the order the callbacks should
+- * be called. Higher "priority" value results in being called later
+- * within the pipeline.
+- *
+- * @code
+- * int dessert_sysrxcb_add(dessert_sysrxcb_t* c, int prio);
+- *
+- * int dessert_meshrxcb_add(dessert_meshrxcb_t* c, int prio);
+- * @endcode
+- *
+- * If a callback returns "DESSERT_MSG_KEEP" the packed will be processed by
+- * further callbacks, if it returns "DESSERT_MSG_DROP" the message will be
+- * dropped and no further callbacks will be called.
+- *
+- * You do not need to care about the management of the buffers for incoming
+- * messages - DES-SERT does this for you. Nevertheless if you need to add
+- * extensions or enlarge the payload of a message, you need to tell DES-SERT
+- * to enlarge the buffer for you if the flag "DESSERT_FLAG_SPARSE" is set on
+- * the message. You can do this by returning "DESSERT_MSG_NEEDNOSPARSE" from
+- * within a callback. The callback will be called again with a larger buffer
+- * and no "DESSERT_FLAG_SPARSE" flag being set.
+- *
+- *
+- * @subsection buffer_subsec Processing Buffer
+- *
+- * If you need to pass information along several callbacks, you can do this
+- * in the processing buffer passed to the the callbacks. This buffer contains
+- * some local processing flags ("lflags") set by the builtin callback
+- * "dessert_msg_ifaceflags_cb" (e.g. telling you about packet origin or if
+- * the packet is multicast) and 1KB of space for your callbacks to pass
+- * along arbitrary data.
+- *
+- * This buffer might only be allocated after you explicitly request it - in
+- * this case the proc argument is NULL and you can return the value
+- * "DESSERT_MSG_NEEDMSGPROC" from within your callback. The callback will
+- * be called again with a valid processing buffer.
+- *
+- *
+- * @section interfaces_sec Using Interfaces
+- *
+- *
+- * @subsection sysif_subsec Using a TUN/TAP interface
+- *
+- * First you have to choose whether to use a TUN or TAP interface. TUN
+- * interfaces are used to exchange IPv4 / IPv6 datagrams with the kernel
+- * network stack. TAP interfaces are used to exchange Ethernet frames
+- * with the kernel network stack. If you want to route Ethernet frames,
+- * you should choose a TAP interface. If you intend to implement
+- * a custom layer 2 to layer 3 mapping, you should use a TUN interface.
+-
+- * Currently, you can only initialize and use a single sys (TUN/TAP) interface.
+- * This is done by "dessert_sysif_init". You must then set up the interface
+- * config in the kernel yourself e.g. by calling "ifconfig".
+- *
+- * @code
+- *
+- * int dessert_sysif_init(char* name, uint8_t flags);
+- *
+- * @endcode
+- *
+- * In either case, frames you receive from a TUN/TAP interface will be
+- * passed along the callbacks added by "dessert_sysrxcb_add" to the
+- * processing pipeline. Each of them will be called with a pointer to an
+- * Ethernet frame. In case of a TUN interface, "ether_shost" and "ether_dhost"
+- * are set to "00:00:00:00:00:00", and ether_type reflects whether the packet
+- * received is IPv4 oder IPv6.
+- *
+- * Packets are sent to the kernel network stack with "dessert_syssend".
+- * In case of a TUN Interface "ether_shost" and "ether_dhost" will be
+- * ignored.
+- *
+- * @code
+- * int dessert_syssend_msg(dessert_msg_t *msg);
+- *
+- * int dessert_syssend(const struct ether_header *eth, size_t len);
+- * @endcode
+- *
+- *
+- * @subsection meshif_subsec Using a Mesh Interface
+- *
+- * Mesh interfaces are used similar to the TUN/TAP interface with two major
+- * differences: You can have multiple mesh interfaces and they send and
+- * receive DES-SERT messages instead of Ethernet frames.
+- *
+- * You add an mesh interface using "dessert_meshif_add" and can send to it
+- * by calling "dessert_meshsend". If the interface parameter is NULL, the
+- * packet will be transmitted over every interface (good for flooding).
+- *
+- * @code
+- * int dessert_meshif_add(const char* dev, uint8_t flags);
+- *
+- *
+- * int dessert_meshsend(const dessert_msg_t* msgin,
+- * const dessert_meshif_t *iface);
+- *
+- * int dessert_meshsend_hwaddr(const dessert_msg_t* msgin,
+- * const uint8_t hwaddr[ETHER_ADDR_LEN]);
+- *
+- * int dessert_meshsend_allbutone(const dessert_msg_t* msgin,
+- * const dessert_meshif_t *iface);
+- *
+- * int dessert_meshsend_fast(dessert_msg_t* msg,
+- * const dessert_meshif_t *iface);
+- *
+- * int dessert_meshsend_fast_hwaddr(dessert_msg_t* msg,
+- * const uint8_t hwaddr[ETHER_ADDR_LEN]);
+- *
+- * int dessert_meshsend_fast_allbutone(dessert_msg_t* msg,
+- * const dessert_meshif_t *iface);
+- *
+- * int dessert_meshsend_raw(dessert_msg_t* msg,
+- * const dessert_meshif_t *iface);
+- * @endcode
+- *
+- * @section logging_sec Logging
+- *
+- * You can write log messages easily with a bunch of macros provided
+- * by DES-SERT ("dessert_debug", "dessert_info" ,"dessert_notice",
+- * "dessert_warn", "dessert_warning", "dessert_err", "dessert_crit",
+- * "dessert_alert" and "dessert_emerg"). Each of them can be used like
+- * "printf" and logs to Syslog, STDERR, file or a ringbuffer depending
+- * on your configuration.
+- *
+- * DES-SERT also ships with a custom "assert" macro which acts like
+- * the original macro from the standard C library and uses the logging
+- * mechanism described above.
+- *
+- *
+- * @section periodics_sec Periodics
+- *
+- * Periodics help you to perform maintenance or delayed tasks. A task
+- * consists of a callback, which will be called at the time you requested,
+- * and a void pointer the callback is passed. You can add these tasks by
+- * calling "dessert_periodic_add" or "dessert_periodic_add_delayed".
+- *
+- *
+- * @section cli_sec CLI - Command Line Interface
+- *
+- * DES-SERT supports simple configuration and debugging of your routing
+- * protocol implementation by providing a Cisco like command line interface
+- * (cli) and a config file parser based upon it.
+- * This cli is realized through libcli (http://code.google.com/p/libcli/).
+- *
+- * DES-SERT does some of the initialization of libcli. Therefore, it provides
+- * the main cli anchor "dessert_cli" and some anchors to add commands below
+- * "dessert_cli_.*". Because DES-SERT only loosely wraps libcli, you should
+- * make yourself familiar with libcli itself. This may be improved in further
+- * DES-SERT releases.
+- *
+- * You can evaluate a config file by calling "cli_file" and start a thread
+- * enabling a telnet-interface for DES-SERT by calling "dessert_cli_run".
+- *
+- *
+- * @section all_sec Putting it all together
+- *
+- * Now you have learned about the most important aspects of DES-SERT.
+- * To write your own routing protocol implementation, you need to know
+- * how to put all this together.
+- *
+- * You should start with a main() program parsing the command line options
+- * and then calling "dessert_init()". This is needed to set up DES-SERT
+- * correctly. Afterwards you can register callbacks, read the config file
+- * and do what you like. If everything is set up, you call "dessert_run()"
+- * and let the event based framework do its job.
+- *
+- * If you would like to see a complete protocol implementation sample,
+- * have a look at the "gossiping" directory.
+- *
+- *
+- * @section feedback_sec Contact & Feedback
+- *
+- * We love feedback - if you have patches, comments or questions,
+- * please contact us! Recent contact information is available on
+- * http://www.des-testbed.net/des-sert/
+- *
+- ******************************************************************************/
+-
+-#ifndef DESSERT_H
+-#define DESSERT_H
+-
+-#ifdef TARGET_DARWIN
+-#include <net/if_dl.h>
+-#define TUN_BSD
+-#endif
+-
+-#ifdef TARGET_LINUX
+-#define TUN_LINUX
+-#endif
+-
+-#include <net/if.h>
+-#include <net/ethernet.h>
+-#include <pcap.h>
+-#include <stdint.h>
+-#include <syslog.h>
+-#include <stdlib.h>
+-#include <libcli.h>
+-
+-/***************************************************************************//**
+- *
+- * @defgroup global G L O B A L # D E F I N E S and T Y P E D E F S / S T R U C T U R E S
+- *
+- * @brief EXTERNAL / PUBLIC
+- *
+- * @{
+- ******************************************************************************/
+-
+-/******************************************************************************
+- * #defines
+- ******************************************************************************/
+-
+-/** ethernet protocol used on layer 2 */
+-#define DESSERT_ETHPROTO 0x8042
+-
+-/** maximum frame size to assemble as dessert_msg */
+-#define DESSERT_MAXFRAMELEN ETHER_MAX_LEN
+-
+-/** maximum size of the data part in dessert_ext */
+-#define DESSERT_MAXEXTDATALEN 130
+-
+-/** length of protocol string used in dessert_msg */
+-#define DESSERT_PROTO_STRLEN 4
+-
+-/** size of local message processing buffer */
+-#define DESSERT_LBUF_LEN 1024
+-
+-/** return code for many dessert_* functions */
+-#define DESSERT_OK 0
+-
+-/** return code for many dessert_* functions */
+-#define DESSERT_ERR 1
+-
+-/******************************************************************************
+- * typedefs
+- ******************************************************************************/
+-/** runtime-unique frame id */
+-typedef uint64_t dessert_frameid_t;
+-
+-/** A basic message send on des-sert layer2.5. */
+-typedef struct __attribute__ ((__packed__)) dessert_msg {
+- /** the layer2 header on the wire */
+- struct ether_header l2h;
+- /** short name of the protocol as passed to dessert_init() */
+- char proto[DESSERT_PROTO_STRLEN];
+- /** version of the app as passed to dessert_init() */
+- uint8_t ver;
+- /** flags - bits 1-4 reserved for dessert, bits 5-8 for app usage */
+- uint8_t flags;
+- union {
+- /** reserved for app usage */
+- uint32_t u32;
+- struct __attribute__ ((__packed__)) {
+- /** ttl or hopcount field for app usage - 0xff if not used*/
+- uint8_t ttl;
+- /** reserved for app usage - 0x00 if not used */
+- uint8_t u8;
+- /** reserved for app usage - 0xbeef if not used */
+- uint16_t u16;
+- };
+- };
+- /** header length incl. extensions - in network byte order */
+- uint16_t hlen;
+- /** payload length - in network byte order */
+- uint16_t plen;
+-} dessert_msg_t;
+-
+-/** local processing struct for dessert_msg_t */
+-typedef struct dessert_msg_proc {
+- /** 16 bits for local processing flags */
+- uint16_t lflags;
+- /** 16 bits reserved */
+- uint16_t lreserved;
+- /** DESSERT_LBUF_LEN bytes buffer */
+- char lbuf[DESSERT_LBUF_LEN];
+-} dessert_msg_proc_t;
+-
+-/** a extension record to add to a dessert_msg */
+-typedef struct __attribute__ ((__packed__)) dessert_ext {
+- /** type of the extension
+- * user supplied types must be >= DESSERT_EXT_USER */
+- uint8_t type;
+-
+- /** length of the extension in bytes
+- * including the 2 bytes of the extension
+- * header itself*/
+- uint8_t len;
+-
+- /** pointer to the data - real length is len-2 bytes */
+- uint8_t data[DESSERT_MAXEXTDATALEN];
+-} dessert_ext_t;
+-
+-/** an interface used for dessert_msg frames */
+-typedef struct dessert_meshif {
+- /** pointer to next interface */
+- struct dessert_meshif *next;
+- /** pointer to next interface */
+- struct dessert_meshif *prev;
+- /** name of interface */
+- char if_name[IFNAMSIZ];
+- /** system ifindex */
+- unsigned int if_index;
+- /** hardware address of interface */
+- uint8_t hwaddr[ETHER_ADDR_LEN]; /* uthash key*/
+- /** counter mutex */
+- pthread_mutex_t cnt_mutex;
+- /** packet counter in */
+- uint64_t ipkts;
+- /** packet counter out */
+- uint64_t opkts;
+- /** packet counter in */
+- uint64_t ibytes;
+- /** packet counter out */
+- uint64_t obytes;
+- /** libpcap descriptor for the interface */
+- pcap_t *pcap;
+- /** libpcap error message buffer */
+- char pcap_err[PCAP_ERRBUF_SIZE];
+- /** pthread running the request loop */
+- pthread_t worker;
+-} dessert_meshif_t;
+-
+-/** A tun/tap interface used to inject packets to dessert implemented daemons.
+- *
+- * \note Please make sure first fields are equal to dessert_meshif to re-use
+- * _dessert_meshif_gethwaddr().
+- *
+- */
+-typedef struct dessert_sysif {
+- /** pointer to next interface */
+- struct dessert_sysif *next;
+- /** name of interface */
+- char if_name[IFNAMSIZ];
+- /** system ifindex */
+- unsigned int if_index;
+- /** hardware address of the interface */
+- uint8_t hwaddr[ETHER_ADDR_LEN];
+- /** counter mutex */
+- pthread_mutex_t cnt_mutex;
+- /** packet counter in */
+- uint64_t ipkts;
+- /** packet counter out */
+- uint64_t opkts;
+- /** packet counter in */
+- uint64_t ibytes;
+- /** packet counter out */
+- uint64_t obytes;
+- /** file descriptor to read/write from/to */
+- int fd;
+- /** if it is a tun or tap interface */
+- uint8_t flags;
+- /** pthread running the request loop */
+- pthread_t worker;
+-} dessert_sysif_t;
+-
+-/** Callback type to call if a packed is received via a dessert mesh interface.
+- *
+- * @param *msg dessert_msg_t frame received
+- * @param len length of the buffer pointed to from dessert_msg_t
+- * @param *proc local processing buffer passed along the callback pipeline - may be NULL
+- * @param *iface interface received packet on - may be NULL
+- * @param id unique internal frame id of the packet
+- *
+- * @retval DESSERT_MSG_KEEP to continue processing the packet
+- * @retval DESSERT_MSG_DROP to drop it
+- * @retval DESSERT_MSG_NEEDMSGPROC to get a processing buffer
+- * @retval DESSERT_MSG_NEEDNOSPARSE to get a full packet buffer (e.g. needed to add extensions)
+- *
+- * \warning The callbacks are invoked with no locks hold by the thread,
+- * \warning YOU MUST make sure the thread holds no locks after the callback exits.
+- * \warning YOU MUST also make sure not to do anything blocking in a callback!
+- *
+- * If the callback exits with DESSERT_MSG_NEEDMSGPROC or DESSERT_MSG_NEEDNOSPARSE
+- * and the respective buffer is NULL or sparse, the callback is called again after
+- * providing the requested resource.
+- *
+- */
+-typedef int dessert_meshrxcb_t(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
+-
+-/** Callback type to call if a packed should be injected into dessert via a tun/tap interface.
+- *
+- * @param *msg dessert msg received - original ethernet frame is encapsulated within
+- * @param len length of ethernet frame received
+- * @param *proc local processing buffer passed along the callback pipeline - may be NULL
+- * @param *sysif interface received packet on
+- * @param id unique internal frame id of the packet
+- *
+- * @retval DESSERT_MSG_KEEP to continue processing the packet
+- * @retval DESSERT_MSG_DROP to drop it
+- *
+- * \warning The callbacks are invoked with no locks hold by the thread,
+- * \warning YOU MUST make sure the thread holds no locks after the callback exits.
+- * \warning YOU MUST also make sure not to do anything blocking in a callback!
+- *
+-*/
+-typedef int dessert_sysrxcb_t(dessert_msg_t *msg, size_t len, dessert_msg_proc_t *proc, dessert_sysif_t *sysif, dessert_frameid_t id);
+-
+-/** callbacks type to call in a periodic task
+- *
+- * The callbacks are invoked with no locks hold by the thread,
+- * YOU MUST make sure the thread holds no locks after the callback exits.
+- * YOU MUST also make sure not to do anything blocking in a callback!
+- *
+- * @arg *data void pointer to pass to the callback
+- * @arg scheduled when this call was scheduled
+- * @arg interval how often this call should be scheduled
+- * ®return should be 0, otherwise the callback is unregistered
+- */
+-typedef int dessert_periodiccallback_t(void *data, struct timeval *scheduled, struct timeval *interval);
+-
+-/** definition of a periodic tasklist entry */
+-typedef struct dessert_periodic {
+- /** callback to call */
+- dessert_periodiccallback_t *c;
+- /** when to call next */
+- struct timeval scheduled;
+- /** call every */
+- struct timeval interval;
+- /** data pointer to pass to callback */
+- void *data;
+- /** internal pointer for task list */
+- struct dessert_periodic *next;
+-} dessert_periodic_t;
+-
+-/***************************************************************************//**
+- * @}
+- *
+- * @defgroup core C O R E
+- *
+- * @brief EXTERNAL / PUBLIC
+- *
+- * @{
+- ******************************************************************************/
+-
+-/******************************************************************************
+- * #defines
+- ******************************************************************************/
+-
+-/** type for local unique packet identification */
+-#define DESSERT_FRAMEID_MAX ((uint64_t)-1)
+-
+-/** flag for dessert_init - daemonize when calling
+- * disables logging to STDERR */
+-#define DESSERT_OPT_DAEMONIZE 0x0100
+-
+-/** flag for dessert_init - do not daemonize when calling */
+-#define DESSERT_OPT_NODAEMONIZE 0x0200
+-
+-/** flag for dessert_init - create and write pid file */
+-#define DESSERT_OPT_PID 0x0400
+-
+-/** flag for dessert_init - do not create and write pid file */
+-#define DESSERT_OPT_NOPID 0x0800
+-
+-/******************************************************************************
+- * globals
+- ******************************************************************************/
+-
+-/** protocol string used in dessert_msg frames */
+-extern char dessert_proto[DESSERT_PROTO_STRLEN+1];
+-
+-/** version int used in dessert_msg frames */
+-extern u_int8_t dessert_ver;
+-
+-/** default src address used for local generated dessert_msg frames */
+-extern u_int8_t dessert_l25_defsrc[ETHER_ADDR_LEN];
+-
+-
+-/** constant holding ethernet broadcast address after dessert_init */
+-extern u_char ether_broadcast[ETHER_ADDR_LEN];
+-
+-/** constant holding ethernet null address after dessert_init */
+-extern u_char ether_null[ETHER_ADDR_LEN];
+-
+-/** the config funnel */
+-extern pthread_rwlock_t dessert_cfglock;
+-
+-/******************************************************************************
+- * functions
+- ******************************************************************************/
+-
+-int dessert_init(const char* proto, int version, uint16_t opts, char* pidfile);
+-
+-int dessert_run(void);
+-void dessert_exit(void);
+-
+-/***************************************************************************//**
+- * @}
+- *
+- * @defgroup cli C L I - C O M M A N D _ L I N E _ I N T E R F A C E
+- *
+- * @brief EXTERNAL / PUBLIC
+- *
+- * @{
+- ******************************************************************************/
+-
+-/******************************************************************************
+- * globals
+- ******************************************************************************/
+-
+-extern struct cli_def *dessert_cli;
+-
+-extern struct cli_command *dessert_cli_show;
+-extern struct cli_command *dessert_cli_cfg_iface;
+-extern struct cli_command *dessert_cli_cfg_no;
+-extern struct cli_command *dessert_cli_cfg_no_iface;
+-extern struct cli_command *dessert_cli_cfg_set;
+-extern struct cli_command *dessert_cli_cfg_logging;
+-extern struct cli_command *dessert_cli_cfg_no_logging;
+-
+-/******************************************************************************
+- * functions
+- ******************************************************************************/
+-
+-int dessert_cli_run(int port);
+-
+-/***************************************************************************//**
+- * @}
+- *
+- * @defgroup log L O G _ F A C I L I T Y
+- *
+- * @brief EXTERNAL / PUBLIC
+- *
+- * @{
+- ******************************************************************************/
+-
+-/******************************************************************************
+- * #defines
+- ******************************************************************************/
+-
+-/** flag for dessert_logcfg - enable syslog logging */
+-#define DESSERT_LOG_SYSLOG 0x0001
+-
+-/** flag for dessert_logcfg - disable syslog logging */
+-#define DESSERT_LOG_NOSYSLOG 0x0002
+-
+-/** flag for dessert_logcfg - enable logfile logging
+- * @warning before using this you MUST use fopen(dessert_logfd, ...) to open the logfile */
+-#define DESSERT_LOG_FILE 0x0004
+-
+-/** flag for dessert_logcfg - disable logfile logging */
+-#define DESSERT_LOG_NOFILE 0x0008
+-
+-/** flag for dessert_logcfg - enable logging to stderr */
+-#define DESSERT_LOG_STDERR 0x0010
+-
+-/** flag for dessert_logcfg - disable logging to stderr */
+-#define DESSERT_LOG_NOSTDERR 0x0020
+-
+-/** flag for dessert_logcfg - enable logging to ringbuffer */
+-#define DESSERT_LOG_RBUF 0x0040
+-
+-/** flag for dessert_logcfg - disable logging to ringbuffer */
+-#define DESSERT_LOG_NORBUF 0x0080
+-
+-/** flag for dessert_logcfg - enable debug loglevel */
+-#define DESSERT_LOG_DEBUG 0x0100
+-
+-/** flag for dessert_logcfg - disable debug loglevel */
+-#define DESSERT_LOG_NODEBUG 0x0200
+-
+-/******************************************************************************
+- * functions
+- ******************************************************************************/
+-int dessert_logcfg(uint16_t opts);
+-void _dessert_log(int level, const char* func, const char* file, int line, const char *fmt, ...);
+-/** log at DEBUG level */
+-#define dessert_debug(...) _dessert_log(LOG_DEBUG, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
+-/** log at INFO level */
+-#define dessert_info(...) _dessert_log(LOG_INFO, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
+-/** log at NOTICE level */
+-#define dessert_notice(...) _dessert_log(LOG_NOTICE, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
+-/** log at WARNING level */
+-#define dessert_warn(...) _dessert_log(LOG_WARNING, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
+-/** log at WARNING level */
+-#define dessert_warning(...) _dessert_log(LOG_WARNING, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
+-/** log at ERR level */
+-#define dessert_err(...) _dessert_log(LOG_ERR, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
+-/** log at CRIT level */
+-#define dessert_crit(...) _dessert_log(LOG_CRIT, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
+-/** log at ALERT level */
+-#define dessert_alert(...) _dessert_log(LOG_ALERT, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
+-/** log at EMERG level */
+-#define dessert_emerg(...) _dessert_log(LOG_EMERG, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
+-
+-/***************************************************************************//**
+- * @}
+- *
+- * @defgroup mesh M E S H - I N T E R F A C E S
+- *
+- * @brief EXTERNAL / PUBLIC
+- *
+- * @{
+- ******************************************************************************/
+-
+-/******************************************************************************
+- * #defines
+- ******************************************************************************/
+-
+-/** return code for dessert_meshrxcb_t - forces to copy the message and call again*/
+-#define DESSERT_MSG_NEEDNOSPARSE 1
+-
+-/** return code for dessert_meshrxcb_t - forces to generate processing info and call again*/
+-#define DESSERT_MSG_NEEDMSGPROC 2
+-
+-/** return code for dessert_meshrxcb_t and dessert_sysrxcb_t */
+-#define DESSERT_MSG_KEEP 0
+-
+-/** return code for dessert_meshrxcb_t and dessert_sysrxcb_t */
+-#define DESSERT_MSG_DROP -1
+-
+-/** flag for dessert_meshif_add - set interface in promiscuous-mode (default) */
+-#define DESSERT_IF_PROMISC 0x0
+-
+-/** flag for dessert_meshif_add - do not set interface in promiscuous-mode */
+-#define DESSERT_IF_NOPROMISC 0x1
+-
+-/** flag for dessert_meshif_add - filter out non-des-sert frames in libpcap (default) */
+-#define DESSERT_IF_FILTER 0x0
+-
+-/** flag for dessert_meshif_add - do not filter out non-des-sert frames in libpcap */
+-#define DESSERT_IF_NOFILTER 0x2
+-
+-/******************************************************************************
+- * functions
+- ******************************************************************************/
+-
+-/* sending messages */
+-int dessert_meshsend(const dessert_msg_t* msgin, const dessert_meshif_t *iface);
+-int dessert_meshsend_allbutone(const dessert_msg_t* msgin, const dessert_meshif_t *iface);
+-int dessert_meshsend_hwaddr(const dessert_msg_t* msgin, const uint8_t hwaddr[ETHER_ADDR_LEN]);
+-int dessert_meshsend_randomized(const dessert_msg_t* msgin);
+-
+-int dessert_meshsend_fast(dessert_msg_t* msg, const dessert_meshif_t *iface);
+-int dessert_meshsend_fast_allbutone(dessert_msg_t* msg, const dessert_meshif_t *iface);
+-int dessert_meshsend_fast_hwaddr(dessert_msg_t* msg, const uint8_t hwaddr[ETHER_ADDR_LEN]);
+-int dessert_meshsend_fast_randomized(dessert_msg_t* msgin);
+-int dessert_meshsend_raw(dessert_msg_t* msg, const dessert_meshif_t *iface);
+-
+-/* meshrx-callback handling */
+-int dessert_meshrxcb_add(dessert_meshrxcb_t* c, int prio);
+-int dessert_meshrxcb_del(dessert_meshrxcb_t* c);
+-
+-/* mesh interface handling */
+-int dessert_meshif_add(const char* dev, uint8_t flags);
+-int dessert_meshif_del(const char* dev);
+-
+-dessert_meshif_t * dessert_meshif_get_name(const char* dev);
+-dessert_meshif_t * dessert_meshif_get_hwaddr(const uint8_t hwaddr[ETHER_ADDR_LEN]);
+-dessert_meshif_t * dessert_meshiflist_get(void);
+-/*\}*/
+-/***************************************************************************//**
+- * @}
+- *
+- * @defgroup sys S Y S - I N T E R F A C E S
+- *
+- * @brief EXTERNAL / PUBLIC
+- *
+- * @{
+- ******************************************************************************/
+-
+-/******************************************************************************
+- * #defines
+- ******************************************************************************/
+-
+-/** flag for dessert_sysif_init - open tun (ip/ipv6) device */
+-#define DESSERT_TUN 0x00
+-
+-/** flag for dessert_sysif_init - open tap (ethernet) device */
+-#define DESSERT_TAP 0x01
+-
+-/** flag for dessert_sysif_init - set dessert_l25_defsrc to mac of tap device */
+-#define DESSERT_MAKE_DEFSRC 0x02
+-
+-/** flag for dessert_sysif_init - get mac for tap failed - try mac in src of first packet */
+-#define _DESSERT_TAP_NOMAC 0x80
+-
+-/******************************************************************************
+- * functions
+- ******************************************************************************/
+-
+-int dessert_sysif_init(char* name, uint8_t flags);
+-
+-int dessert_sysrxcb_add(dessert_sysrxcb_t* c, int prio);
+-int dessert_sysrxcb_del(dessert_sysrxcb_t* c);
+-
+-int dessert_syssend_msg(dessert_msg_t *msg);
+-int dessert_syssend(const struct ether_header *eth, size_t len);
+-
+-/***************************************************************************//**
+- * @}
+- *
+- * @defgroup msg M E S S A G E _ H A N D L I N G
+- *
+- * @brief EXTERNAL / PUBLIC
+- *
+- * @{
+- ******************************************************************************/
+-
+-/******************************************************************************
+- * #defines
+- ******************************************************************************/
+-
+-/** flag for dessert_msg.flags - message len is hlen+plen
+- * if not set buffer len is assumed as DESSERT_MAXFRAMELEN + DESSERT_MSGPROCLEN */
+-#define DESSERT_FLAG_SPARSE 0x1
+-
+-/* *********************** */
+-
+-/** flag for dessert_msg_proc.lflags - l25 src is one of our interfaces */
+-#define DESSERT_LFLAG_SRC_SELF 0x0002
+-
+-/** flag for dessert_msg_proc.lflags - l25 dst is multicast address*/
+-#define DESSERT_LFLAG_DST_MULTICAST 0x0004
+-
+-/** flag for dessert_msg_proc.lflags - l25 dst is one of our interfaces */
+-#define DESSERT_LFLAG_DST_SELF 0x0008
+-
+-/** flag for dessert_msg_proc.lflags - l25 dst is broadcast */
+-#define DESSERT_LFLAG_DST_BROADCAST 0x0010
+-
+-/** flag for dessert_msg_proc.lflags - l2 src is one of our interfaces */
+-#define DESSERT_LFLAG_PREVHOP_SELF 0x0020
+-
+-/** flag for dessert_msg_proc.lflags - l2 dst is one of our interfaces */
+-#define DESSERT_LFLAG_NEXTHOP_SELF 0x0040
+-
+-/** flag for dessert_msg_proc.lflags - l2 dst is broadcast */
+-#define DESSERT_LFLAG_NEXTHOP_BROADCAST 0x0080
+-
+-/** flag for dessert_msg_proc.lflags - l25 dst is one of our interfaces,
+- * but we received the message not via the indented interface, e.g. we
+- * overheard it */
+-#define DESSERT_LFLAG_DST_SELF_OVERHEARD 0x0100
+-
+-/** flag for dessert_msg_proc.lflags - l2 dst is one of our interfaces,
+- * but we received the message not via the indented interface, e.g. we
+- * overheard it */
+-#define DESSERT_LFLAG_NEXTHOP_SELF_OVERHEARD 0x0200
+-
+-/* *********************** */
+-
+-/** length of dessert_ext header */
+-#define DESSERT_EXTLEN (sizeof(struct dessert_ext) - DESSERT_MAXEXTDATALEN)
+-
+-/** dessert_ext type wildcard - any extension */
+-#define DESSERT_EXT_ANY 0x00
+-
+-/** dessert_ext type for ethernet header */
+-#define DESSERT_EXT_ETH 0x01
+-
+-/** dessert_ext type for packet tracing */
+-#define DESSERT_EXT_TRACE 0x02
+-
+-/** first dessert_ext type for usage by the user */
+-#define DESSERT_EXT_USER 0x40
+-
+-/* *********************** */
+-
+-/** packet tracing flag - only record hosts */
+-#define DESSERT_MSG_TRACE_HOST (ETHER_ADDR_LEN)
+-
+-/** packet tracing flag - record interfaces */
+-#define DESSERT_MSG_TRACE_IFACE (3*ETHER_ADDR_LEN)
+-
+-/* *********************** */
+-
+-/** Returns the length of a given extension. */
+-#define dessert_ext_getdatalen(ext) (ext->len - DESSERT_EXTLEN)
+-
+-/******************************************************************************
+- * functions
+- ******************************************************************************/
+-
+-int dessert_msg_new(dessert_msg_t **msgout);
+-int dessert_msg_clone(dessert_msg_t **msgnew, const dessert_msg_t *msgold, uint8_t sparse);
+-int dessert_msg_check(const dessert_msg_t* msg, size_t len);
+-void dessert_msg_dump(const dessert_msg_t* msg, size_t len, char *buf, size_t blen);
+-void dessert_msg_destroy(dessert_msg_t* msg);
+-
+-int dessert_msg_ethencap(const struct ether_header* eth, size_t eth_len, dessert_msg_t **msgout);
+-int dessert_msg_ethdecap(const dessert_msg_t* msg, struct ether_header** ethout);
+-struct ether_header* dessert_msg_getl25ether (const dessert_msg_t* msg);
+-
+-int dessert_msg_proc_clone(dessert_msg_proc_t **procnew, const dessert_msg_proc_t *procold);
+-void dessert_msg_proc_dump(const dessert_msg_t* msg, size_t len, const dessert_msg_proc_t *proc, char *buf, size_t blen);
+-void dessert_msg_proc_destroy(dessert_msg_proc_t* proc);
+-
+-int dessert_msg_addpayload(dessert_msg_t* msg, void** payload, int len);
+-int dessert_msg_getpayload(dessert_msg_t *msg, void **payload);
+-int dessert_msg_addext(dessert_msg_t* msg, dessert_ext_t** ext, uint8_t type, size_t len);
+-int dessert_msg_delext(dessert_msg_t *msg, dessert_ext_t *ext);
+-int dessert_msg_resizeext(dessert_msg_t *msg, dessert_ext_t *ext, size_t new_len);
+-int dessert_msg_getext(const dessert_msg_t* msg, dessert_ext_t** ext, uint8_t type, int index);
+-int dessert_msg_get_ext_count(const dessert_msg_t* msg, uint8_t type);
+-
+-int dessert_msg_trace_initiate(dessert_msg_t* msg, int mode);
+-int dessert_msg_trace_dump(const dessert_msg_t* msg, char* buf, int blen);
+-
+-int dessert_msg_dump_cb(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
+-int dessert_msg_check_cb(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
+-int dessert_msg_trace_cb(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
+-int dessert_msg_ifaceflags_cb(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *riface, dessert_frameid_t id);
+-
+-/***************************************************************************//**
+- * @}
+- *
+- * @defgroup periodic P E R I O D I C _ T A S K S
+- *
+- * @brief EXTERNAL / PUBLIC
+- *
+- * @{
+- ******************************************************************************/
+-
+-dessert_periodic_t *dessert_periodic_add(dessert_periodiccallback_t* c, void *data, const struct timeval *scheduled, const struct timeval *interval);
+-dessert_periodic_t *dessert_periodic_add_delayed(dessert_periodiccallback_t* c, void *data, int delay);
+-int dessert_periodic_del(dessert_periodic_t *p);
+-
+-/***************************************************************************//**
+- * @}
+- *
+- * @defgroup agentx NET - S N M P // A G E N T _ X
+- *
+- * @brief EXTERNAL / PUBLIC
+- *
+- * @{
+- ******************************************************************************/
+-
+-/******************************************************************************
+- * #defines
+- ******************************************************************************/
+-/** Flag indicating the dessert_agentx_appstats_t is of type bool. */
+-#define DESSERT_APPSTATS_VALUETYPE_BOOL 0
+-
+-/** Flag indicating the dessert_agentx_appstats_t is of type int32. */
+-#define DESSERT_APPSTATS_VALUETYPE_INT32 1
+-
+-/** Flag indicating the dessert_agentx_appstats_t is of type uint32. */
+-#define DESSERT_APPSTATS_VALUETYPE_UINT32 2
+-
+-/** Flag indicating the dessert_agentx_appstats_t is of type counter64. */
+-#define DESSERT_APPSTATS_VALUETYPE_COUNTER64 3
+-
+-/** Flag indicating the dessert_agentx_appstats_t is of type octetstring. */
+-#define DESSERT_APPSTATS_VALUETYPE_OCTETSTRING 4
+-
+-/* *********************** */
+-
+-/** Flag indicating the dessert_agentx_appstats_t does not contain information regarding a node or a link. */
+-#define DESSERT_APPSTATS_NODEORLINK_NONE 0
+-
+-/** Flag indicating the dessert_agentx_appstats_t contains information regarding a node. */
+-#define DESSERT_APPSTATS_NODEORLINK_NODE 1
+-
+-/** Flag indicating the dessert_agentx_appstats_t contains information regarding a link. */
+-#define DESSERT_APPSTATS_NODEORLINK_LINK 2
+-
+-/* *********************** */
+-
+-/** What is considered to be TRUE in a dessert_agentx_appstats_t. */
+-#define DESSERT_APPSTATS_BOOL_TRUE 1
+-
+-/** What is considered to be FALSE in a dessert_agentx_appstats_t. */
+-#define DESSERT_APPSTATS_BOOL_FALSE 0
+-
+-/* *********************** */
+-
+-/** Flag indicating the dessert_agentx_appparams_t is of type bool. */
+-#define DESSERT_APPPARAMS_VALUETYPE_BOOL 0
+-
+-/** Flag indicating the dessert_agentx_appparams_t is of type int32. */
+-#define DESSERT_APPPARAMS_VALUETYPE_INT32 1
+-
+-/** Flag indicating the dessert_agentx_appparams_t is of type uint32. */
+-#define DESSERT_APPPARAMS_VALUETYPE_UINT32 2
+-
+-/** Flag indicating the dessert_agentx_appparams_t is of type octetstring. */
+-#define DESSERT_APPPARAMS_VALUETYPE_OCTETSTRING 3
+-
+-/* *********************** */
+-
+-/** What is considered to be TRUE in a dessert_agentx_appparams_t. */
+-#define DESSERT_APPPARAMS_BOOL_TRUE 1
+-
+-/** What is considered to be FALSE in a dessert_agentx_appparams_t. */
+-#define DESSERT_APPPARAMS_BOOL_FALSE 0
+-
+-/* *********************** */
+-
+-/** Flag indicating if a appstats callback entry is of type bulk. */
+-#define DESSERT_APPSTATS_CB_BULK 1
+-/** Flag indicating if a appstats callback entry is of type nobulk. */
+-#define DESSERT_APPSTATS_CB_NOBULK 2
+-
+-/******************************************************************************
+- * typedefs
+- ******************************************************************************/
+-
+-/** An abstract data type representing some statistical datum.*/
+-typedef struct dessert_agentx_appstats {
+-
+- /** A prev pointer. @internal */
+- struct dessert_agentx_appstats *prev;
+- /** A next pointer. @internal */
+- struct dessert_agentx_appstats *next;
+-
+- /** The name of the datum. */
+- char name[256];
+- /** A description of the datum*/
+- char desc[256];
+-
+- /** The type of the datum.
+- *
+- * @see For valid values please refer to: \n DESSERT_APPSTATS_VALUETYPE_BOOL
+- * @see DESSERT_APPSTATS_VALUETYPE_INT32
+- * @see DESSERT_APPSTATS_VALUETYPE_UINT32
+- * @see DESSERT_APPSTATS_VALUETYPE_COUNTER64
+- * @see DESSERT_APPSTATS_VALUETYPE_OCTETSTRING
+- */
+- int value_type;
+- /** Indicates if this datum contains information about a node or a link
+- *
+- * @see For valid values please refer to: \n DESSERT_APPSTATS_NODEORLINK_NONE
+- * @see DESSERT_APPSTATS_NODEORLINK_NODE
+- * @see DESSERT_APPSTATS_NODEORLINK_LINK
+- */
+- int node_or_link;
+-
+- /** Field representing a mac address if this datum contains information about a node or a link. */
+- uint8_t macaddress1 [ETHER_ADDR_LEN];
+- /** Field representing a mac address if this datum contains information about a link. */
+- uint8_t macaddress2 [ETHER_ADDR_LEN];
+-
+- union {
+- /** A boolean.
+- *
+- * @see For valid values please refer to: \n DESSERT_APPSTATS_BOOL_TRUE
+- * @see DESSERT_APPSTATS_BOOL_FALSE
+- */
+- uint8_t bool;
+- /** A 32bit signed integer. */
+- int32_t int32;
+- /** A 32bit unsigned integer. */
+- uint32_t uint32;
+- /** A 64bit unsigned integer with counter semantics */
+- uint64_t counter64;
+-
+- struct {
+- /** The length of the octetstring field. */
+- uint8_t octetstring_len;
+- /** Character pointer to some raw bytes. */
+- char *octetstring;
+- };
+- };
+-
+-} dessert_agentx_appstats_t;
+-
+-/** An abstract data type representing some parameter.*/
+-typedef struct dessert_agentx_appparams {
+-
+- /** Internal. @internal */
+- struct dessert_agentx_appparams *prev;
+- /** Internal. @internal */
+- struct dessert_agentx_appparams *next;
+-
+- /** Internal. @internal Internal. */
+- uint8_t index;
+-
+- /** The name of the datum. */
+- char name[256];
+- /** A description of the datum*/
+- char desc[256];
+-
+- /** The type of the parameter.
+- *
+- * @see For valid values please refer to: \n DESSERT_APPPARAMS_VALUETYPE_BOOL
+- * @see DESSERT_APPPARAMS_VALUETYPE_INT32
+- * @see DESSERT_APPPARAMS_VALUETYPE_UINT32
+- * @see DESSERT_APPPARAMS_VALUETYPE_OCTETSTRING
+- */
+- int value_type;
+-
+- union {
+- /** A boolean.
+- *
+- * @see For valid values please refer to: \n DESSERT_APPPARAMS_BOOL_TRUE
+- * @see DESSERT_APPPARAMS_BOOL_FALSE
+- */
+- uint8_t bool;
+- /** A 32bit signed integer. */
+- int32_t int32;
+- /** A 32bit unsigned integer. */
+- uint32_t uint32;
+-
+- struct {
+- /** The length of the octetstring field. */
+- uint16_t octetstring_len;
+- /** Character pointer to some raw bytes. */
+- char *octetstring;
+- };
+- };
+-
+-} dessert_agentx_appparams_t;
+-
+-/** Callback type to call if the AppstatsTable is asked for by some snmp client.
+- *
+- * @param *appstats dessert_agentx_appstats_t the statistical datum to be filled out
+- *
+- *
+- * @retval DESSERT_OK on success
+- * @retval DESSERT_ERR to remove the corresponding callback entry
+- *
+- */
+-typedef int dessert_agentx_appstatscb_get_t(struct dessert_agentx_appstats *appstats);
+-
+-/** Callback type to call if the AppparamsTable is asked for by some snmp client.
+- *
+- * @param *appstats dessert_agentx_appparams_t the parameter to be filled out
+- *
+- *
+- * @retval DESSERT_OK on success
+- * @retval DESSERT_ERR to remove the corresponding callback entry
+- *
+- */
+-typedef int dessert_agentx_appparamscb_get_t(struct dessert_agentx_appparams *appparams);
+-
+-/** Callback type to call if the specific row represented by this callback is
+- * going to be set by some snmp client.
+- *
+- * @param *appstats dessert_agentx_appparams_t the new value
+- *
+- *
+- * @retval DESSERT_OK on success
+- * @retval DESSERT_ERR otherwise
+- *
+- */
+-typedef int dessert_agentx_appparamscb_set_t(struct dessert_agentx_appparams *appparams);
+-
+-/** A callback entry representing a statistical datum. */
+-typedef struct dessert_agentx_appstats_cb_entry {
+-
+- /** Interal. @internal */
+- struct dessert_agentx_appstats_cb_entry *prev;
+- /** Interal. @internal */
+- struct dessert_agentx_appstats_cb_entry *next;
+-
+- /** Flag indicating whether this entry represents a bulk entry.*/
+- uint8_t isbulk_flag;
+-
+- /** The getter callback. */
+- dessert_agentx_appstatscb_get_t *c;
+-
+-} dessert_agentx_appstats_cb_entry_t;
+-
+-/** A callback entry representing a parameter. */
+-typedef struct dessert_agentx_appparams_cb_entry {
+-
+- /** Internal. @internal */
+- struct dessert_agentx_appparams_cb_entry *prev;
+- /** Internal. @internal*/
+- struct dessert_agentx_appparams_cb_entry *next;
+-
+- /** Internal. @internal */
+- uint8_t index;
+-
+- /** The getter callback. */
+- dessert_agentx_appparamscb_get_t *get;
+- /** The setter callback. */
+- dessert_agentx_appparamscb_set_t *set;
+-
+-} dessert_agentx_appparams_cb_entry_t;
+-
+-
+-/******************************************************************************
+- * globals
+- ******************************************************************************/
+-
+-
+-/******************************************************************************
+- * functions
+- ******************************************************************************/
+-dessert_agentx_appstats_t *dessert_agentx_appstats_new(void);
+-void dessert_agentx_appstats_destroy(dessert_agentx_appstats_t *appstat);
+-
+-dessert_agentx_appstats_cb_entry_t *dessert_agentx_appstats_add(dessert_agentx_appstatscb_get_t *c);
+-dessert_agentx_appstats_cb_entry_t *dessert_agentx_appstats_add_bulk(dessert_agentx_appstatscb_get_t *c);
+-int dessert_agentx_appstats_del(dessert_agentx_appstats_cb_entry_t *e);
+-
+-dessert_agentx_appparams_t *dessert_agentx_appparam_new(void);
+-void dessert_agentx_appparam_destroy(dessert_agentx_appparams_t *appparam);
+-
+-dessert_agentx_appparams_cb_entry_t *dessert_agentx_appparams_add(dessert_agentx_appparamscb_get_t *get, dessert_agentx_appparamscb_set_t *set);
+-int dessert_agentx_appparams_del(dessert_agentx_appparams_cb_entry_t *e);
+-
+-/**************************************************************************//**
+- * @}
+- *
+- * @defgroup macros U S E F U L L _ MA C R O S
+- *
+- * @brief EXTERNAL / PUBLIC
+- *
+- * @{
+- ******************************************************************************/
+-
+-/** A convenience macro to safely iterate the list of mesh interfaces.
+- *
+- * @param __interface pointer to a temporal dessert_meshif_t
+- *
+- * @warning You must pair it with an ending MESHIFLIST_ITERATOR_STOP() macro!
+- * Please find an usage example in the Examples paragraph below.
+- *
+- * @par Examples:
+- *
+- * @li The do_something() function will be called for every mesh interface in the list.
+- * @code
+- * dessert_meshif_t *iface;
+- *
+- * MESHIFLIST_ITERATOR_START(iface)
+- * do_something(iface); // do something to every iface
+- * MESHIFLIST_ITERATOR_STOP;
+- * @endcode
+- */
+-#define MESHIFLIST_ITERATOR_START(__interface) \
+-pthread_rwlock_rdlock(&dessert_cfglock); \
+-DL_FOREACH(dessert_meshiflist_get(), __interface) {
+-
+-/** A convenience macro to safely iterate the list of mesh interfaces.
+- *
+- * @see MESHIFLIST_ITERATOR_START()
+- */
+-#define MESHIFLIST_ITERATOR_STOP } pthread_rwlock_unlock(&dessert_cfglock)
+-
+-/** A convenience macro to safely add @a __sec seconds and @a __usec microseconds
+- * to the @c struct @c timeval @a __tv in an <em>invariant respecting</em> manner.
+- *
+- * @param __tv the @c struct @c timeval to add to
+- * @param __sec the number of seconds to add up to @a __tv->tv_sec
+- * @param __usec the number of microseconds to add up to @a __tv.->tv_usec
+- *
+- * %DESCRIPTION: \n
+- * The <a href="http://www.gnu.org/s/libc/manual/html_node/Elapsed-Time.html#Elapsed-Time">GNU C Library Documentation</a>
+- * states about the @c tv_usec member of the @c struct @c timeval: <em>This is the
+- * rest of the elapsed time (a fraction of a second), represented as the number
+- * of microseconds. It is always less than one @a million.</em>
+- *
+- */
+-#define TIMEVAL_ADD(__tv, __sec, __usec) \
+- do { \
+- (__tv)->tv_sec += __sec; \
+- (__tv)->tv_usec += __usec; \
+- if((__tv)->tv_usec >= 1000000) { \
+- ++(__tv)->tv_sec; \
+- (__tv)->tv_usec -= 1000000; \
+- } \
+- } while(0)
+-
+-#define likely(x) (__builtin_expect((x),1))
+-#define unlikely(x) (__builtin_expect((x),0))
+-
+-#define __dessert_assert(func, file, line, e) \
+- ((void)_dessert_log(LOG_EMERG, func, file, line, "assertion `%s' failed!\n", e), abort)
+-
+-#ifdef NDEBUG
+-#define assert(e) ((void)0)
+-#else
+-#define assert(e) \
+- (__builtin_expect(!(e), 0) ? __dessert_assert(__FUNCTION__, __FILE__, __LINE__, #e) : (void)0)
+-#endif
+-
+-/** @} */
+-
+-/******************************************************************************
+- *
+- * ! ! ! ! O L D ! ! ! T O D O ! ! ! !
+- *
+- ******************************************************************************/
+-
+-/** the config-flag variable */
+-//extern uint16_t dessert_cfgflags; // TODO not used! to be removed??!?
+-
+-/** size of a dessert_msg buffer */
+-//#define dessert_msg_buflen(x) ((x->flags&DESSERT_FLAG_SPARSE)?(x->hlen+x->plen):(DESSERT_MAXFRAMELEN+DESSERT_MSGPROCLEN))
+-
+-//#define dessert_frameid_overflow(x, y) ((x>y)&&((x-y)>(DESSERT_FRAMEID_MAX/2)))
+-
+-
+-#endif /* DESSERT_H*/
+diff --git a/dessert_agentx.c b/dessert_agentx.c
+deleted file mode 100644
+index f68dbe4..0000000
+--- a/dessert_agentx.c
++++ /dev/null
+@@ -1,563 +0,0 @@
+-/******************************************************************************
+- Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
+- All rights reserved.
+-
+- These sources were originally developed by David Gutzmann
+- at Freie Universitaet Berlin (http://www.fu-berlin.de/),
+- Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
+- (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
+- ------------------------------------------------------------------------------
+- This program is free software: you can redistribute it and/or modify it under
+- the terms of the GNU General Public License as published by the Free Software
+- Foundation, either version 3 of the License, or (at your option) any later
+- version.
+-
+- This program is distributed in the hope that it will be useful, but WITHOUT
+- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+-
+- You should have received a copy of the GNU General Public License along with
+- this program. If not, see http://www.gnu.org/licenses/ .
+- ------------------------------------------------------------------------------
+- For further information and questions please use the web site
+- http://www.des-testbed.net/
+- *******************************************************************************/
+-
+-#include "dessert_internal.h"
+-#include "dessert.h"
+-
+-/* global data storage // P U B L I C */
+-
+-/* global data storage // P R I V A T E */
+-pthread_rwlock_t _dessert_appstats_cblist_lock = PTHREAD_RWLOCK_INITIALIZER;
+-dessert_agentx_appstats_cb_entry_t *_dessert_appstats_cblist = NULL;
+-
+-pthread_rwlock_t _dessert_appparams_cblist_lock = PTHREAD_RWLOCK_INITIALIZER;
+-dessert_agentx_appparams_cb_entry_t *_dessert_appparams_cblist = NULL;
+-
+-/* local data storage*/
+-int keep_snmp_running = 1;
+-
+-pthread_mutex_t _dessert_agentx_appparams_nextindex_mutex =
+- PTHREAD_MUTEX_INITIALIZER;
+-uint8_t _dessert_agentx_appparams_nextindex = 0;
+-
+-/* internal functions forward declarations*/
+-static void *_dessert_agentx_worker(void *arg);
+-static dessert_agentx_appstats_cb_entry_t *_dessert_agentx_appstats_add(
+- dessert_agentx_appstatscb_get_t *c, uint8_t bulknobulk_flag);
+-static uint8_t _dessert_agentx_appparams_new_index(void);
+-
+-/******************************************************************************
+- *
+- * EXTERNAL / PUBLIC
+- *
+- * NET - S N M P // A G E N T _ X
+- *
+- ******************************************************************************/
+-
+-/******************************************************************************
+- * appStats
+- ******************************************************************************/
+-
+-/** Creates and initializes a new dessert_agentx_appstats_t.
+- *
+- * @return the new dessert_agentx_appstats_t
+- *
+- * @warning A dessert_agentx_appstats_t allocated with this function must be
+- * freed with dessert_agentx_appstats_destroy().
+- *
+- * @see dessert_agentx_appstats_destroy()
+- *
+- * @par Description:\n
+- *
+- */
+-dessert_agentx_appstats_t *dessert_agentx_appstats_new() {
+- dessert_agentx_appstats_t *appstat;
+-
+- appstat = malloc(sizeof(dessert_agentx_appstats_t));
+-
+- appstat->prev = appstat;
+- appstat->next = NULL;
+-
+- memset(appstat->name,0, sizeof(appstat->name));
+- memset(appstat->desc,0, sizeof(appstat->desc));
+-
+- appstat->value_type = DESSERT_APPSTATS_VALUETYPE_BOOL;
+- appstat->node_or_link = DESSERT_APPSTATS_NODEORLINK_NONE;
+- memset(appstat->macaddress1, 0, ETHER_ADDR_LEN);
+- memset(appstat->macaddress2, 0, ETHER_ADDR_LEN);
+-
+- appstat->bool = DESSERT_APPSTATS_BOOL_FALSE;
+-
+- return appstat;
+-}
+-
+-/** Frees a dessert_agentx_appstats_t.
+- *
+- * @param appstat the dessert_agentx_appstats_t to be freed
+- *
+- * @warning Only use this method to free a dessert_agentx_appstats_t which was allocated with dessert_agentx_appstats_new().
+- *
+- * @see dessert_agentx_appstats_new()
+- *
+- * @par Description:\n
+- */
+-void dessert_agentx_appstats_destroy(dessert_agentx_appstats_t *appstat) {
+- free(appstat);
+-}
+-
+-/** Adds an application statistics callback.
+- *
+- * @param[in] *c the callback to add
+- *
+- * @retval pointer to the corresponding callback entry on success
+- * @retval NULL otherwise
+- *
+- * @par Description:\n
+- *
+- */
+-dessert_agentx_appstats_cb_entry_t *dessert_agentx_appstats_add(
+- dessert_agentx_appstatscb_get_t *c) {
+-
+- return (_dessert_agentx_appstats_add(c, DESSERT_APPSTATS_CB_NOBULK));
+-}
+-
+-/** Adds an application statistics bulk callback.
+- *
+- * @param[in] *c the callback to add
+- *
+- * @retval pointer to the corresponding callback entry on success
+- * @retval NULL otherwise
+- *
+- * @par Description:\n
+- *
+- */
+-dessert_agentx_appstats_cb_entry_t *dessert_agentx_appstats_add_bulk(
+- dessert_agentx_appstatscb_get_t *c) {
+-
+- return (_dessert_agentx_appstats_add(c, DESSERT_APPSTATS_CB_BULK));
+-}
+-
+-/** Deletes an application statistics callback.
+- *
+- * @param *e pointer to a callback entry
+- *
+- * @retval DESSERT_OK on success
+- * @retval DESSERT_ERR otherwise
+- *
+- * @see dessert_agentx_appstats_add()
+- * @see dessert_agentx_appstats_add_bulk()
+- *
+- * @par Description:\n
+- */
+-int dessert_agentx_appstats_del(dessert_agentx_appstats_cb_entry_t *e) {
+-
+- if (e == NULL) {
+- return DESSERT_ERR;
+- }
+-
+- pthread_rwlock_wrlock(&_dessert_appstats_cblist_lock);
+- DL_DELETE(_dessert_appstats_cblist, e);
+- pthread_rwlock_unlock(&_dessert_appstats_cblist_lock);
+-
+- free(e);
+-
+- return DESSERT_OK;
+-}
+-
+-/******************************************************************************
+- * appParams
+- ******************************************************************************/
+-
+-/** Creates and initializes a new dessert_agentx_appparams_t.
+- *
+- * @return the new dessert_agentx_appparams_t
+- *
+- * @warning A dessert_agentx_appparams_t allocated with this function must be
+- * freed with dessert_agentx_appparams_destroy().
+- *
+- * @see dessert_agentx_appparams_destroy()
+- *
+- * @par Description:\n
+- *
+- */
+-dessert_agentx_appparams_t *dessert_agentx_appparam_new() {
+- dessert_agentx_appparams_t *appparam;
+-
+- appparam = malloc(sizeof(dessert_agentx_appparams_t));
+-
+- memset(appparam->name,0, sizeof(appparam->name));
+- memset(appparam->desc,0, sizeof(appparam->desc));
+-
+- appparam->value_type = DESSERT_APPPARAMS_VALUETYPE_BOOL;
+-
+- appparam->bool = DESSERT_APPSTATS_BOOL_FALSE;
+-
+- return appparam;
+-}
+-
+-/** Frees a dessert_agentx_appparams_t.
+- *
+- * @param appparam the dessert_agentx_appparams_t to be freed
+- *
+- * @warning Only use this method to free a dessert_agentx_appparams_t which was
+- * allocated with dessert_agentx_appparams_new().
+- *
+- * @see dessert_agentx_appparams_new()
+- *
+- * @par Description:\n
+- */
+-void dessert_agentx_appparam_destroy(dessert_agentx_appparams_t *appparam) {
+- free(appparam);
+-}
+-
+-/** Adds an application parameter callback.
+- *
+- * @param[in] *c the callback to add
+- *
+- * @retval pointer to the corresponding callback entry on success
+- * @retval NULL otherwise
+- *
+- * @par Description:\n
+- *
+- */
+-dessert_agentx_appparams_cb_entry_t *dessert_agentx_appparams_add(
+- dessert_agentx_appparamscb_get_t *get,
+- dessert_agentx_appparamscb_set_t *set) {
+-
+- dessert_agentx_appparams_cb_entry_t *e;
+-
+- e = malloc(sizeof(dessert_agentx_appparams_cb_entry_t));
+-
+- if (e == NULL) {
+- dessert_err("failed to allocate buffer for new dessert_agentx_appparams_entry_t");
+- return (NULL);
+- }
+-
+- e->index = _dessert_agentx_appparams_new_index();
+- e->get = get;
+- e->set = set;
+-
+- pthread_rwlock_wrlock(&_dessert_appparams_cblist_lock);
+- DL_APPEND(_dessert_appparams_cblist, e);
+- pthread_rwlock_unlock(&_dessert_appparams_cblist_lock);
+-
+- return (e);
+-}
+-
+-/** Deletes an application parameter callback.
+- *
+- * @param *e pointer to a callback entry
+- *
+- * @retval DESSERT_OK on success
+- * @retval DESSERT_ERR otherwise
+- *
+- * @see dessert_agentx_appparams_add()
+- *
+- * @par Description:\n
+- */
+-int dessert_agentx_appparams_del(dessert_agentx_appparams_cb_entry_t *e) {
+-
+- if (e == NULL) {
+- return DESSERT_ERR;
+- }
+-
+- pthread_rwlock_wrlock(&_dessert_appparams_cblist_lock);
+- DL_DELETE(_dessert_appparams_cblist, e);
+- pthread_rwlock_unlock(&_dessert_appparams_cblist_lock);
+-
+- /* TODO: invalidate row*/
+-
+- return DESSERT_OK;
+-}
+-
+-/******************************************************************************
+- *
+- * INTERNAL / PRIVATE
+- *
+- * NET - S N M P // A G E N T _ X
+- *
+- ******************************************************************************/
+-
+-/******************************************************************************
+- * appStats
+- ******************************************************************************/
+-
+-void _dessert_agentx_appstats_free(dessert_agentx_appstats_t *appstat){
+- if (appstat->value_type == DESSERT_APPSTATS_VALUETYPE_OCTETSTRING
+- && appstat->octetstring != NULL) {
+- free(appstat->octetstring);
+- }
+- dessert_agentx_appstats_destroy(appstat);
+-}
+-
+-void _dessert_agentx_appstats_free_list(
+- dessert_agentx_appstats_t **appstats_list) {
+- dessert_agentx_appstats_t *appstat;
+- dessert_agentx_appstats_t *tbf;
+-
+- for (appstat = (*appstats_list); appstat;) {
+- tbf = appstat;
+- appstat = appstat->next;
+- _dessert_agentx_appstats_free(tbf);
+- }
+-}
+-
+-int _dessert_agentx_appstats_harvest_callbacks(
+- dessert_agentx_appstats_t **appstats_list) {
+- dessert_agentx_appstats_cb_entry_t *cbe;
+- dessert_agentx_appstats_t *new_appstat;
+- dessert_agentx_appstats_t *appstat;
+- int res = 0;
+-
+- pthread_rwlock_rdlock(&_dessert_appstats_cblist_lock);
+- DL_FOREACH(_dessert_appstats_cblist, cbe) {
+-
+- new_appstat = dessert_agentx_appstats_new();
+- if (new_appstat == NULL) {
+- dessert_err("failed to allocate buffer for new dessert_agentx_appstats_entry_t");
+-
+- dessert_err("freeing appstats harvested so far...");
+- _dessert_agentx_appstats_free_list(appstats_list);
+-
+- return DESSERT_ERR;
+- }
+-
+- res = cbe->c(new_appstat);
+-
+- if (res == DESSERT_OK) {
+- if (cbe->isbulk_flag & DESSERT_APPSTATS_CB_NOBULK) {
+-
+- DL_APPEND(*appstats_list, new_appstat);
+- } else { // DESSERT_APPSTATS_BULK
+- dessert_agentx_appstats_t temp;
+- DL_FOREACH(new_appstat, appstat ) {
+- temp.next = appstat->next;
+- temp.prev = appstat->prev;
+- DL_APPEND(*appstats_list, appstat);
+- appstat = &temp;
+- }
+- }
+- } else {
+- dessert_err("freeing list of appstats received from callback...");
+- _dessert_agentx_appstats_free_list(&new_appstat);
+- pthread_rwlock_unlock(&_dessert_appstats_cblist_lock);
+- dessert_agentx_appstats_del(cbe);
+- pthread_rwlock_rdlock(&_dessert_appstats_cblist_lock);
+- }
+-
+- }
+- pthread_rwlock_unlock(&_dessert_appstats_cblist_lock);
+-
+- return DESSERT_OK;
+-}
+-
+-/******************************************************************************
+- * appParams
+- ******************************************************************************/
+-
+-void _dessert_agentx_appparams_free(dessert_agentx_appparams_t *appparam) {
+- if (appparam->value_type == DESSERT_APPPARAMS_VALUETYPE_OCTETSTRING
+- && appparam->octetstring != NULL) {
+- free(appparam->octetstring);
+- }
+- dessert_agentx_appparam_destroy(appparam);
+-}
+-
+-void _dessert_agentx_appparams_free_list(
+- dessert_agentx_appparams_t **appparams_list) {
+- dessert_agentx_appparams_t *appparam;
+- dessert_agentx_appparams_t *tbf;
+-
+- for (appparam = (*appparams_list); appparam;) {
+- tbf = appparam;
+- appparam = appparam->next;
+- _dessert_agentx_appparams_free(tbf);
+- }
+-}
+-
+-int _dessert_agentx_appparams_harvest_callbacks(
+- dessert_agentx_appparams_t **appparams_list) {
+- dessert_agentx_appparams_cb_entry_t *cbe;
+- dessert_agentx_appparams_t *new_appparam;
+- int res = 0;
+-
+- pthread_rwlock_rdlock(&_dessert_appparams_cblist_lock);
+- DL_FOREACH(_dessert_appparams_cblist, cbe) {
+- new_appparam = dessert_agentx_appparam_new();
+-
+- if (new_appparam == NULL) {
+- dessert_err("failed to allocate buffer for new dessert_agentx_appparams_entry_t");
+-
+- dessert_err("freeing appstats harvested so far...");
+- _dessert_agentx_appparams_free_list(appparams_list);
+-
+- return DESSERT_ERR;
+- }
+-
+- res = cbe->get(new_appparam);
+- new_appparam->index = cbe->index;
+-
+- if (res == DESSERT_OK) {
+- DL_APPEND(*appparams_list, new_appparam);
+- } else {
+- _dessert_agentx_appparams_free(new_appparam);
+- pthread_rwlock_unlock(&_dessert_appparams_cblist_lock);
+- dessert_agentx_appparams_del(cbe);
+- pthread_rwlock_rdlock(&_dessert_appparams_cblist_lock);
+- }
+-
+- } // DL_FOREACH
+-
+- pthread_rwlock_unlock(&_dessert_appparams_cblist_lock);
+-
+- return DESSERT_OK;
+-}
+-
+-dessert_agentx_appparamscb_set_t *_dessert_agentx_appparams_getsettercbforindex(
+- int index) {
+- dessert_agentx_appparams_cb_entry_t *cbe;
+-
+- pthread_rwlock_rdlock(&_dessert_appparams_cblist_lock);
+- DL_FOREACH(_dessert_appparams_cblist, cbe)
+- if (cbe->index == index)
+- break;
+- pthread_rwlock_unlock(&_dessert_appparams_cblist_lock);
+-
+- if (cbe->index == index)
+-
+- return cbe->set;
+- else {
+-
+- return NULL;
+- }
+-}
+-
+-/******************************************************************************
+- * other
+- ******************************************************************************/
+-
+-/** setup and initialize net-snmp subagent (via agent x)*/
+-void _dessert_agentx_init_subagent() {
+- /**************************************************************************
+- * setup snmp handling....
+- *************************************************************************/
+-
+- pthread_t snmp_worker;
+-
+- snmp_enable_calllog();
+- //debug_register_tokens("trace");
+- //debug_register_tokens("tdomain");
+- debug_register_tokens(AGENT);
+- //debug_register_tokens("snmp_agent");
+- //debug_register_tokens("helper:table:req");
+-
+- debug_register_tokens("dessertAppParamsTable");
+- debug_register_tokens("verbose:dessertAppParamsTable");
+- debug_register_tokens("internal:dessertAppParamsTable");
+-
+- debug_register_tokens("dessertAppParamsTable");
+- debug_register_tokens("verbose:dessertAppStatsTable");
+- debug_register_tokens("internal:dessertAppStatsTable");
+-
+- snmp_set_do_debugging(1);
+-
+- netsnmp_log_handler *logh;
+-
+- logh = netsnmp_register_loghandler(NETSNMP_LOGHANDLER_FILE, LOG_DEBUG);
+- if (logh) {
+- logh->pri_max = LOG_EMERG;
+- logh->token = strdup("/tmp/dessertAGENTX.log");
+- }
+-
+- netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_ROLE, 1);
+-
+- //SOCK_STARTUP;
+- init_agent(AGENT);
+-
+- /*
+- * initialize the scalars
+- */
+- init_dessertObjects();
+-
+- /*
+- * init dessert{Mesh, Sys}ifTable mib code
+- */
+- init_dessertMeshifTable();
+- init_dessertSysifTable();
+-
+- /*
+- * init dessertApp{Stats, Param}Table mib code
+- */
+- init_dessertAppParamsTable();
+- init_dessertAppStatsTable();
+-
+- init_snmp(AGENT);
+- DEBUGMSGTL((AGENT, "Initialized agent and snmp.\n"));
+-
+- pthread_create(&snmp_worker, NULL, _dessert_agentx_worker, NULL);
+-}
+-
+-void dessert_agentx_stop_subagent() {
+- keep_snmp_running = 0;
+-}
+-
+-/******************************************************************************
+- *
+- * LOCAL
+- *
+- * NET - S N M P // A G E N T _ X
+- *
+- ******************************************************************************/
+-
+-static dessert_agentx_appstats_cb_entry_t *_dessert_agentx_appstats_add(
+- dessert_agentx_appstatscb_get_t *c, uint8_t bulknobulk_flag) {
+-
+- dessert_agentx_appstats_cb_entry_t *e;
+-
+- e = malloc(sizeof(dessert_agentx_appstats_cb_entry_t));
+-
+- if (e == NULL) {
+- dessert_err("failed to allocate buffer for new dessert_agentx_appstats_entry_t");
+- return (NULL);
+- }
+-
+- e->isbulk_flag |= bulknobulk_flag;
+- e->c = c;
+-
+- pthread_rwlock_wrlock(&_dessert_appstats_cblist_lock);
+- DL_APPEND(_dessert_appstats_cblist, e);
+- pthread_rwlock_unlock(&_dessert_appstats_cblist_lock);
+-
+- return (e);
+-}
+-
+-static uint8_t _dessert_agentx_appparams_new_index(void) {
+- uint8_t index;
+-
+- pthread_mutex_lock(&_dessert_agentx_appparams_nextindex_mutex);
+- index = _dessert_agentx_appparams_nextindex++;
+- pthread_mutex_unlock(&_dessert_agentx_appparams_nextindex_mutex);
+-
+- return index;
+-}
+-
+-static void *_dessert_agentx_worker(void *arg) {
+- DEBUGMSGTL((AGENT, "snmp_worker running...\n"));
+- dessert_info("snmp_worker running...");
+-
+- while (keep_snmp_running) {
+- /*
+- * if you use select(), see snmp_select_info() in snmp_api(3)
+- */
+- /*
+- * --- OR ---
+- */
+- agent_check_and_process(1); /* 0 == don't block */
+- }
+-
+- dessert_info("snmp_worker exiting...");
+-
+- return (NULL);
+-}
+diff --git a/dessert_cli.c b/dessert_cli.c
+deleted file mode 100644
+index b2369fb..0000000
+--- a/dessert_cli.c
++++ /dev/null
+@@ -1,255 +0,0 @@
+-/******************************************************************************
+- Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
+- All rights reserved.
+-
+- These sources were originally developed by Philipp Schmidt
+- at Freie Universitaet Berlin (http://www.fu-berlin.de/),
+- Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
+- (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
+- ------------------------------------------------------------------------------
+- This program is free software: you can redistribute it and/or modify it under
+- the terms of the GNU General Public License as published by the Free Software
+- Foundation, either version 3 of the License, or (at your option) any later
+- version.
+-
+- This program is distributed in the hope that it will be useful, but WITHOUT
+- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+-
+- You should have received a copy of the GNU General Public License along with
+- this program. If not, see http://www.gnu.org/licenses/ .
+- ------------------------------------------------------------------------------
+- For further information and questions please use the web site
+- http://www.des-testbed.net/
+- *******************************************************************************/
+-
+-#include "dessert_internal.h"
+-#include "dessert.h"
+-
+-#ifndef HOST_NAME_MAX
+-#define HOST_NAME_MAX 32
+-#endif
+-
+-/* global data storage // P U B L I C */
+-struct cli_def *dessert_cli;
+-struct cli_command *dessert_cli_show;
+-struct cli_command *dessert_cli_cfg_iface;
+-struct cli_command *dessert_cli_cfg_no;
+-struct cli_command *dessert_cli_cfg_no_iface;
+-struct cli_command *dessert_cli_cfg_logging;
+-struct cli_command *dessert_cli_cfg_no_logging;
+-
+-/* global data storage // P R I V A T E */
+-/* nothing here - yet */
+-
+-/* local data storage*/
+-int _dessert_cli_sock;
+-struct sockaddr_in6 _dessert_cli_addr;
+-char _dessert_cli_hostname[HOST_NAME_MAX + DESSERT_PROTO_STRLEN + 1];
+-pthread_t _dessert_cli_worker;
+-
+-/* internal functions forward declarations*/
+-static void *_dessert_cli_accept_thread(void* arg);
+-static int _dessert_cli_cmd_dessertinfo(struct cli_def *cli, char *command,
+- char *argv[], int argc);
+-
+-/******************************************************************************
+- *
+- * EXTERNAL / PUBLIC
+- *
+- * C L I - C O M M A N D L I N E I N T E R F A C E
+- *
+- ******************************************************************************/
+-
+-/** Start up the command line interface.
+- *
+- * @param[in] port port to listen on
+- *
+- * @retval DESSERT_OK on success
+- * @retval -errno otherwise
+- *
+- * %DESCRIPTION:
+- *
+- */
+-int dessert_cli_run(int port) {
+- int on = 1;
+-
+- /* listen for connections */
+- _dessert_cli_sock = socket(AF_INET6, SOCK_STREAM, 0);
+- setsockopt(_dessert_cli_sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
+- memset(&_dessert_cli_addr, 0, sizeof(_dessert_cli_addr));
+- _dessert_cli_addr.sin6_family = AF_INET6;
+- _dessert_cli_addr.sin6_addr = in6addr_any;
+- _dessert_cli_addr.sin6_port = htons(port);
+- if (bind(_dessert_cli_sock, (struct sockaddr *) &_dessert_cli_addr,
+- sizeof(_dessert_cli_addr))) {
+- dessert_err("cli socket bind to port %d failed - %s", port, strerror(errno));
+- return -errno;
+- }
+- listen(_dessert_cli_sock, 8);
+- dessert_debug("starting worker thread for cli");
+- pthread_create(&_dessert_cli_worker, NULL, _dessert_cli_accept_thread,
+- &_dessert_cli_sock);
+- return DESSERT_OK;
+-}
+-
+-/******************************************************************************
+- *
+- * INTERNAL / PRIVATE
+- *
+- * C L I - C O M M A N D L I N E I N T E R F A C E
+- *
+- ******************************************************************************/
+-
+-/** internal function to initialize libcli */
+-int _dessert_cli_init() {
+-
+- dessert_cli = cli_init();
+-
+- /* set host name */
+- memset(_dessert_cli_hostname, 0x0, HOST_NAME_MAX + DESSERT_PROTO_STRLEN + 1);
+- gethostname(_dessert_cli_hostname, HOST_NAME_MAX);
+- strncpy(_dessert_cli_hostname + strlen(_dessert_cli_hostname), ":", 1);
+- strncpy(_dessert_cli_hostname + strlen(_dessert_cli_hostname),
+- dessert_proto, DESSERT_PROTO_STRLEN);
+- cli_set_hostname(dessert_cli, _dessert_cli_hostname);
+-
+- /* initialize show commands */
+- dessert_cli_show = cli_register_command(dessert_cli, NULL, "show", NULL,
+- PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "display information");
+- cli_register_command(dessert_cli, dessert_cli_show, "dessert-info",
+- _dessert_cli_cmd_dessertinfo, PRIVILEGE_UNPRIVILEGED, MODE_EXEC,
+- "display information about this program");
+- cli_register_command(dessert_cli, dessert_cli_show, "logging",
+- _dessert_cli_cmd_logging, PRIVILEGE_UNPRIVILEGED, MODE_EXEC,
+- "show logging ringbuffer");
+-
+- /* initialize config mode commands */
+- dessert_cli_cfg_iface = cli_register_command(dessert_cli, NULL,
+- "interface", NULL, PRIVILEGE_PRIVILEGED, MODE_CONFIG,
+- "create or configure interfaces");
+- dessert_cli_cfg_no = cli_register_command(dessert_cli, NULL, "no", NULL,
+- PRIVILEGE_PRIVILEGED, MODE_CONFIG, "negate command");
+- dessert_cli_cfg_no_iface = cli_register_command(dessert_cli,
+- dessert_cli_cfg_no, "interface", NULL, PRIVILEGE_PRIVILEGED,
+- MODE_CONFIG, "remove interface or negate interface config");
+- dessert_cli_cfg_logging = cli_register_command(dessert_cli, NULL,
+- "logging", NULL, PRIVILEGE_PRIVILEGED, MODE_CONFIG,
+- "change logging config");
+- dessert_cli_cfg_no_logging = cli_register_command(dessert_cli,
+- dessert_cli_cfg_no, "logging", NULL, PRIVILEGE_PRIVILEGED,
+- MODE_CONFIG, "disable logging for...");
+- cli_register_command(dessert_cli, dessert_cli_cfg_logging, "ringbuffer",
+- _dessert_cli_logging_ringbuffer, PRIVILEGE_PRIVILEGED, MODE_CONFIG,
+- "set logging ringbuffer size (in lines)");
+- cli_register_command(dessert_cli, dessert_cli_cfg_no_logging, "ringbuffer",
+- _dessert_cli_logging_ringbuffer, PRIVILEGE_PRIVILEGED, MODE_CONFIG,
+- "disable logging to ringbuffer");
+- cli_register_command(dessert_cli, dessert_cli_cfg_logging, "file",
+- _dessert_cli_logging_file, PRIVILEGE_PRIVILEGED, MODE_CONFIG,
+- "set logfile and enable file logging");
+- cli_register_command(dessert_cli, dessert_cli_cfg_no_logging, "file",
+- _dessert_cli_logging_file, PRIVILEGE_PRIVILEGED, MODE_CONFIG,
+- "set logfile disable file logging");
+-
+- /* initialize other commands */
+- cli_register_command(dessert_cli, NULL, "shutdown",
+- _dessert_cli_cmd_shutdown, PRIVILEGE_PRIVILEGED, MODE_EXEC,
+- "shut daemon down");
+-
+- return DESSERT_OK;
+-}
+-
+-/******************************************************************************
+- *
+- * LOCAL
+- *
+- * C L I - C O M M A N D L I N E I N T E R F A C E
+- *
+- ******************************************************************************/
+-
+-/** command "show dessert-info" */
+-static int _dessert_cli_cmd_dessertinfo(struct cli_def *cli, char *command,
+- char *argv[], int argc) {
+- cli_print(cli, "\nprotocol running: %s v %d", dessert_proto, dessert_ver);
+- cli_print(cli, "libdessert version: %s", SHLIB_VERSION);
+- cli_print(
+- cli,
+- " ------------------------------------------------------------------------------ ");
+- cli_print(
+- cli,
+- " Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB). ");
+- cli_print(
+- cli,
+- " All rights reserved. ");
+- cli_print(
+- cli,
+- " ");
+- cli_print(
+- cli,
+- " These sources were originally developed by Philipp Schmidt ");
+- cli_print(
+- cli,
+- " at Freie Universitaet Berlin (http://www.fu-berlin.de/), ");
+- cli_print(
+- cli,
+- " Computer Systems and Telematics / Distributed, Embedded Systems (DES) group ");
+- cli_print(
+- cli,
+- " (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/) ");
+- cli_print(
+- cli,
+- " ------------------------------------------------------------------------------ ");
+- cli_print(
+- cli,
+- " This program is free software: you can redistribute it and/or modify it under ");
+- cli_print(
+- cli,
+- " the terms of the GNU General Public License as published by the Free Software ");
+- cli_print(
+- cli,
+- " Foundation, either version 3 of the License, or (at your option) any later ");
+- cli_print(
+- cli,
+- " version. ");
+- cli_print(
+- cli,
+- " ");
+- cli_print(
+- cli,
+- " This program is distributed in the hope that it will be useful, but WITHOUT ");
+- cli_print(
+- cli,
+- " ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ");
+- cli_print(
+- cli,
+- " FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ");
+- cli_print(
+- cli,
+- " ");
+- cli_print(
+- cli,
+- " You should have received a copy of the GNU General Public License along with ");
+- cli_print(
+- cli,
+- " this program. If not, see http://www.gnu.org/licenses/ . ");
+- cli_print(
+- cli,
+- " ------------------------------------------------------------------------------ ");
+- return CLI_OK;
+-}
+-
+-/** internal thread function running the cli */
+-static void *_dessert_cli_accept_thread(void* arg) {
+- int *s = (int *) arg;
+- int c;
+-
+- while ((c = accept(*s, NULL, 0))) {
+- cli_loop(dessert_cli, c); /* pass the connection off to libcli */
+- close(c);
+- }
+-
+- cli_done(dessert_cli); /* free data structures */
+-
+- return (NULL);
+-}
+diff --git a/dessert_core.c b/dessert_core.c
+deleted file mode 100644
+index 05ecaa8..0000000
+--- a/dessert_core.c
++++ /dev/null
+@@ -1,241 +0,0 @@
+-/******************************************************************************
+- Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
+- All rights reserved.
+-
+- These sources were originally developed by Philipp Schmidt
+- at Freie Universitaet Berlin (http://www.fu-berlin.de/),
+- Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
+- (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
+- ------------------------------------------------------------------------------
+- This program is free software: you can redistribute it and/or modify it under
+- the terms of the GNU General Public License as published by the Free Software
+- Foundation, either version 3 of the License, or (at your option) any later
+- version.
+-
+- This program is distributed in the hope that it will be useful, but WITHOUT
+- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+-
+- You should have received a copy of the GNU General Public License along with
+- this program. If not, see http://www.gnu.org/licenses/ .
+- ------------------------------------------------------------------------------
+- For further information and questions please use the web site
+- http://www.des-testbed.net/
+- *******************************************************************************/
+-
+-#include "dessert_internal.h"
+-#include "dessert.h"
+-#include <sys/stat.h>
+-
+-/* global data storage // P U B L I C */
+-char dessert_proto[DESSERT_PROTO_STRLEN + 1];
+-u_int8_t dessert_ver;
+-u_int8_t dessert_l25_defsrc[ETHER_ADDR_LEN];
+-u_char ether_broadcast[ETHER_ADDR_LEN];
+-u_char ether_null[ETHER_ADDR_LEN];
+-pthread_rwlock_t dessert_cfglock = PTHREAD_RWLOCK_INITIALIZER;
+-
+-/* global data storage // P R I V A T E */
+-int _dessert_status = 0x0;
+-
+-/* local data storage*/
+-dessert_frameid_t _dessert_nextframeid = 0;
+-pthread_mutex_t _dessert_nextframeid_mutex = PTHREAD_MUTEX_INITIALIZER;
+-pthread_mutex_t _dessert_exit_mutex = PTHREAD_MUTEX_INITIALIZER;
+-pthread_cond_t _dessert_exit_do = PTHREAD_COND_INITIALIZER;
+-int _dessert_exit_code = 0;
+-char *dessert_pidfile_name;
+-
+-/* internal functions forward declarations*/
+-static void _dessert_cleanup(void);
+-static void _dessert_daemonize(void);
+-static int _dessert_pid(char* pidfile);
+-
+-/******************************************************************************
+- *
+- * EXTERNAL / PUBLIC
+- *
+- * C O R E
+- *
+- ******************************************************************************/
+-
+-/** Initializes dessert framework and sets up logging
+- * @arg *proto 4 char string for protocol name
+- * @arg version version number of protocol
+- * @arg opts @see DESSERT_OPT_*
+- * @returns DESSERT_OK on success, DESSERT_ERR otherwise
+- **/
+-int dessert_init(const char* proto, int version, uint16_t opts, char* pidfile) {
+-
+- pthread_rwlock_wrlock(&dessert_cfglock);
+-
+- /* save global config */
+- memset(dessert_proto, 0x0, DESSERT_PROTO_STRLEN + 1);
+- strncpy(dessert_proto, proto, DESSERT_PROTO_STRLEN);
+- dessert_ver = version;
+-
+- /* initialize pseudo constants */
+- memset(ether_broadcast, 255, ETHER_ADDR_LEN);
+- memset(ether_null, 0, ETHER_ADDR_LEN);
+-
+- pthread_rwlock_unlock(&dessert_cfglock);
+-
+- /* daemonize if needed */
+- if ((opts & DESSERT_OPT_DAEMONIZE) && !(opts & DESSERT_OPT_NODAEMONIZE)) {
+- _dessert_daemonize();
+- }
+-
+- /* write pid to file if needed */
+- if (pidfile != NULL) {
+- dessert_pidfile_name = pidfile;
+- _dessert_pid(pidfile);
+- }
+-
+- /* initialize cli */
+- _dessert_cli_init();
+-
+- /* start periodic thread */
+- _dessert_periodic_init();
+-
+- /* initialize net-snmp subagent */
+- _dessert_agentx_init_subagent();
+-
+- return DESSERT_OK;
+-}
+-
+-/** main loop - wait until dessert_exit() is called or killed
+- * @return arg to dessert_exit
+- */
+-int dessert_run() {
+- pthread_mutex_lock(&_dessert_exit_mutex);
+- pthread_cond_wait(&_dessert_exit_do, &_dessert_exit_mutex);
+- _dessert_cleanup();
+- pthread_mutex_unlock(&_dessert_exit_mutex);
+- return (_dessert_exit_code);
+-}
+-
+-/**Causes dessert_run() to break out of the main loop.
+- */
+-void dessert_exit() {
+- /* kill snmp_worker thread */
+- dessert_agentx_stop_subagent();
+- pthread_cond_signal(&_dessert_exit_do);
+-}
+-
+-/** generates a new, runtime-unique frame id
+- * @returns runtime-unique frame id
+- **/
+-dessert_frameid_t _dessert_newframeid() {
+- dessert_frameid_t x;
+- pthread_mutex_lock(&_dessert_nextframeid_mutex);
+- x = _dessert_nextframeid++;
+- pthread_mutex_unlock(&_dessert_nextframeid_mutex);
+- return (x);
+-}
+-
+-/******************************************************************************
+- *
+- * INTERNAL / PRIVATE
+- *
+- * C O R E
+- *
+- ******************************************************************************/
+-
+-/** command "shutdown" */
+-int _dessert_cli_cmd_shutdown(struct cli_def *cli, char *command, char *argv[],
+- int argc) {
+- cli_print(cli, "daemon will shut down now!");
+- pthread_mutex_lock(&_dessert_exit_mutex);
+- pthread_cond_broadcast(&_dessert_exit_do);
+- pthread_mutex_unlock(&_dessert_exit_mutex);
+-
+- return CLI_OK;
+-}
+-
+-/******************************************************************************
+- *
+- * LOCAL
+- *
+- * C O R E
+- *
+- ******************************************************************************/
+-
+-/** internal function to clean up things */
+-void _dessert_cleanup(void) {
+- /* remove pidfile */
+- if (dessert_pidfile_name != NULL) {
+- unlink(dessert_pidfile_name);
+- }
+-}
+-
+-/** internal daemonize helper */
+-void _dessert_daemonize(void) {
+- pid_t pid, sid;
+-
+- /* Fork off the parent process */
+- pid = fork();
+- if (pid < 0) {
+- perror("could not create daemon process!");
+- exit(EXIT_FAILURE);
+- }
+- /* If we got a good PID, then
+- we can exit the parent process. */
+- if (pid > 0) {
+- exit(EXIT_SUCCESS);
+- }
+-
+- /* Change the file mode mask */
+- umask(0);
+-
+- /* Open any logs here */
+-
+- /* Create a new SID for the child process */
+- sid = setsid();
+- if (sid < 0) {
+- perror("could not set sid!");
+- exit(EXIT_FAILURE);
+- }
+-
+- /* Change the current working directory */
+- if ((chdir("/")) < 0) {
+- perror("could not chdir /!");
+- exit(EXIT_FAILURE);
+- }
+-
+- /* Close out the standard file descriptors */
+- close(STDIN_FILENO);
+- close(STDOUT_FILENO);
+- close(STDERR_FILENO);
+-
+- /* write config */
+- pthread_rwlock_wrlock(&dessert_cfglock);
+- _dessert_status |= _DESSERT_STATUS_DAEMON;
+- pthread_rwlock_unlock(&dessert_cfglock);
+-
+- /* adopt logging */
+- dessert_logcfg(0x0);
+-}
+-
+-/** internal pid-write helper */
+-int _dessert_pid(char* pidfile) {
+- FILE *fd;
+-
+- fd = fopen(pidfile, "w");
+- if (fd == 0) {
+- dessert_warn("could not open pid file");
+- return 1;
+- } else {
+- int r;
+- r = fprintf(fd, "%d\n", getpid());
+- if (r < 0) {
+- dessert_warn("could not write to pid file");
+- return DESSERT_ERR;
+- }
+-
+- if (fclose(fd) != 0) {
+- dessert_warn("failed to close pid file");
+- }
+- }
+-
+- return DESSERT_OK;
+-}
+diff --git a/dessert_internal.h b/dessert_internal.h
+deleted file mode 100644
+index 93dde60..0000000
+--- a/dessert_internal.h
++++ /dev/null
+@@ -1,219 +0,0 @@
+-/******************************************************************************
+- Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
+- All rights reserved.
+-
+- These sources were originally developed by Philipp Schmidt
+- at Freie Universitaet Berlin (http://www.fu-berlin.de/),
+- Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
+- (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
+- ------------------------------------------------------------------------------
+- This program is free software: you can redistribute it and/or modify it under
+- the terms of the GNU General Public License as published by the Free Software
+- Foundation, either version 3 of the License, or (at your option) any later
+- version.
+-
+- This program is distributed in the hope that it will be useful, but WITHOUT
+- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+-
+- You should have received a copy of the GNU General Public License along with
+- this program. If not, see http://www.gnu.org/licenses/ .
+- ------------------------------------------------------------------------------
+- For further information and questions please use the web site
+- http://www.des-testbed.net/
+-*******************************************************************************/
+-
+-#ifndef DESSERT_INTERNAL_H
+-#define DESSERT_INTERNAL_H
+-
+-/* load needed libs - quite dirty */
+-#include <stdlib.h>
+-#include <stdio.h>
+-#include <fcntl.h>
+-#include <string.h>
+-#include <stdarg.h>
+-#include <unistd.h>
+-#include <errno.h>
+-#include <pthread.h>
+-#include <syslog.h>
+-#include <sys/socket.h>
+-#include <sys/ioctl.h>
+-#include <sys/sysctl.h>
+-#include <net/route.h>
+-#include <arpa/inet.h>
+-#include <netinet/in.h>
+-#include <libcli.h>
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-#include "utlist.h"
+-
+-
+-#include "snmp/dessertObjects.h"
+-#include "snmp/dessertMeshifTable.h"
+-#include "snmp/dessertSysifTable.h"
+-#include "snmp/dessertAppStatsTable.h"
+-#include "snmp/dessertAppParamsTable.h"
+-
+-/******************************************************************************
+- *
+- * INTERNAL / PRIVATE
+- *
+- * C O R E
+- *
+- ******************************************************************************/
+-
+-/** flag for _dessert_status - program is daemon */
+-#define _DESSERT_STATUS_DAEMON 0x1
+-
+-/** global status flag holder */
+-extern int _dessert_status;
+-
+-dessert_frameid_t _dessert_newframeid(void);
+-
+-int _dessert_cli_cmd_shutdown(struct cli_def *cli, char *command, char *argv[], int argc);
+-
+-/******************************************************************************
+- *
+- * INTERNAL / PRIVATE
+- *
+- * C L I - C O M M A N D L I N E I N T E R F A C E
+- *
+- ******************************************************************************/
+-
+-int _dessert_cli_init(void);
+-
+-/******************************************************************************
+- *
+- * INTERNAL / PRIVATE
+- *
+- * L O G F A C I L I T Y
+- *
+- ******************************************************************************/
+-
+-/** maximum size of a log line */
+-#define DESSERT_LOGLINE_MAX 1024
+-
+-/** logfile file pointer to use with DESSERT_OPT_LOGFILE */
+-extern FILE *dessert_logfd;
+-
+-int _dessert_cli_cmd_logging(struct cli_def *cli, char *command, char *argv[], int argc);
+-int _dessert_cli_logging_file(struct cli_def *cli, char *command, char *argv[], int argc);
+-int _dessert_cli_no_logging_file(struct cli_def *cli, char *command, char *argv[], int argc);
+-int _dessert_cli_logging_ringbuffer(struct cli_def *cli, char *command, char *argv[], int argc);
+-int _dessert_cli_no_logging_ringbuffer(struct cli_def *cli, char *command, char *argv[], int argc);
+-
+-/******************************************************************************
+- *
+- * INTERNAL / PRIVATE
+- *
+- * M E S H - I N T E R F A C E S
+- *
+- ******************************************************************************/
+-
+-/** callback list entry for dessert mesh interface callbacks */
+-typedef struct dessert_meshrxcbe {
+- /** pointer to callback to call */
+- dessert_meshrxcb_t *c;
+- /** priority - lowest first */
+- int prio;
+- /** next entry in list */
+- struct dessert_meshrxcbe *next;
+-} dessert_meshrxcbe_t;
+-
+-int _dessert_meshif_gethwaddr(dessert_meshif_t *meshif);
+-int _dessert_meshrxcb_runall(dessert_msg_t* msg_in, size_t len, dessert_msg_proc_t *proc_in, const dessert_meshif_t *meshif, dessert_frameid_t id);
+-
+-/******************************************************************************
+- *
+- * INTERNAL / PRIVATE
+- *
+- * S Y S - I N T E R F A C E S
+- *
+- ******************************************************************************/
+-
+-/** callback list entry for tun/tap callbacks */
+-typedef struct dessert_sysrxcbe {
+- /** pointer to callback to call */
+- dessert_sysrxcb_t *c;
+- /** priority - lowest first */
+- int prio;
+- /** next entry in list */
+- struct dessert_sysrxcbe *next;
+-} dessert_sysrxcbe_t;
+-
+-extern struct dessert_sysif *_dessert_sysif;
+-
+-/******************************************************************************
+- *
+- * INTERNAL / PRIVATE
+- *
+- * M E S S A G E H A N D L I N G
+- *
+- ******************************************************************************/
+-
+-/** size of a dessert_msg struct */
+-#define DESSERT_MSGLEN sizeof(struct dessert_msg)
+-
+-/** size of a dessert_msg_proc struct */
+-#define DESSERT_MSGPROCLEN sizeof(struct dessert_msg_proc)
+-
+-/** maximum frame size to assemble as dessert_msg */
+-#define DESSERT_MAXFRAMEBUFLEN DESSERT_MAXFRAMELEN
+-
+-/******************************************************************************
+- *
+- * INTERNAL / PRIVATE
+- *
+- * P E R I O D I C T A S K S
+- *
+- ******************************************************************************/
+-
+-void _dessert_periodic_init(void);
+-
+-/******************************************************************************
+- *
+- * INTERNAL / PRIVATE
+- *
+- * NET - S N M P // A G E N T _ X
+- *
+- ******************************************************************************/
+-
+-/******************************************************************************
+- * #defines
+- ******************************************************************************/
+-
+-#define AGENT "dessertAGENTX"
+-
+-#define DESSERT_AGENTX_SYSIFTABLE_CACHE_TIMEOUT 10
+-#define DESSERT_AGENTX_MESHIFTABLE_CACHE_TIMEOUT 10
+-#define DESSERT_AGENTX_APPSTATSTABLE_CACHE_TIMEOUT 10
+-#define DESSERT_AGENTX_APPPARAMTABLE_CACHE_TIMEOUT 1
+-
+-/******************************************************************************
+- * globals
+- ******************************************************************************/
+-
+-extern pthread_rwlock_t _dessert_appstats_cblist_lock;
+-extern dessert_agentx_appstats_cb_entry_t *_dessert_appstats_cblist;
+-
+-extern pthread_rwlock_t _dessert_appparams_cblist_lock;
+-extern dessert_agentx_appparams_cb_entry_t *_dessert_appparams_cblist;
+-
+-/******************************************************************************
+- * functions
+- ******************************************************************************/
+-int _dessert_agentx_appstats_harvest_callbacks(dessert_agentx_appstats_t **appstats_list);
+-void _dessert_agentx_appstats_free(dessert_agentx_appstats_t *appstat);
+-void _dessert_agentx_appstats_free_list(dessert_agentx_appstats_t **appstats_list);
+-
+-int _dessert_agentx_appparams_harvest_callbacks(dessert_agentx_appparams_t **appparams_list);
+-void _dessert_agentx_appparams_free(dessert_agentx_appparams_t *appparam);
+-void _dessert_agentx_appparams_free_list(dessert_agentx_appparams_t **appparams_list);
+-dessert_agentx_appparamscb_set_t *_dessert_agentx_appparams_getsettercbforindex(int index);
+-
+-void _dessert_agentx_init_subagent(void);
+-void dessert_agentx_stop_subagent(void);
+-
+-
+-#endif /* DESSERT_INTERNAL_H */
+diff --git a/dessert_log.c b/dessert_log.c
+deleted file mode 100644
+index a354ed0..0000000
+--- a/dessert_log.c
++++ /dev/null
+@@ -1,417 +0,0 @@
+-/******************************************************************************
+- Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
+- All rights reserved.
+-
+- These sources were originally developed by Philipp Schmidt
+- at Freie Universitaet Berlin (http://www.fu-berlin.de/),
+- Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
+- (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
+- ------------------------------------------------------------------------------
+- This program is free software: you can redistribute it and/or modify it under
+- the terms of the GNU General Public License as published by the Free Software
+- Foundation, either version 3 of the License, or (at your option) any later
+- version.
+-
+- This program is distributed in the hope that it will be useful, but WITHOUT
+- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+-
+- You should have received a copy of the GNU General Public License along with
+- this program. If not, see http://www.gnu.org/licenses/ .
+- ------------------------------------------------------------------------------
+- For further information and questions please use the web site
+- http://www.des-testbed.net/
+- *******************************************************************************/
+-
+-#include "dessert_internal.h"
+-#include "dessert.h"
+-#include <sys/stat.h>
+-
+-/* data storage */
+-FILE *dessert_logfd = NULL;
+-char dessert_logprefix[12];
+-
+-#define _DESSERT_LOGFLAG_SYSLOG 0x1
+-#define _DESSERT_LOGFLAG_LOGFILE 0x2
+-#define _DESSERT_LOGFLAG_STDERR 0x4
+-#define _DESSERT_LOGFLAG_RBUF 0x8
+-int _dessert_logflags = _DESSERT_LOGFLAG_STDERR;
+-int _dessert_loglevel = LOG_DEBUG;
+-
+-/* the logging ringbuffer */
+-char *_dessert_logrbuf = NULL; /* pointer to begin */
+-int _dessert_logrbuf_len = 0; /* length in lines (DESSERT_LOGLINE_MAX*_dessert_logrbuf_len*sizeof(char) would be in bytes) */
+-int _dessert_logrbuf_cur = 0; /* current position */
+-int _dessert_logrbuf_used = 0; /* used slots */
+-pthread_rwlock_t _dessert_logrbuf_len_lock = PTHREAD_RWLOCK_INITIALIZER; /* for resizing */
+-pthread_mutex_t _dessert_logrbuf_mutex = PTHREAD_MUTEX_INITIALIZER; /* for moving _dessert_logrbuf_cur */
+-
+-/* internal functions forward declarations TODO: cleanup */
+-
+-/******************************************************************************
+- *
+- * EXTERNAL / PUBLIC
+- *
+- * L O G F A C I L I T Y
+- *
+- ******************************************************************************/
+-
+-/** Configure dessert logging framework and sets up logging.
+- *
+- * @arg opts OR'd flags - @see DESSERT_LOG_*
+- *
+- * %DESCRIPTION:
+- *
+- **/
+-int dessert_logcfg(uint16_t opts) {
+- snprintf(dessert_logprefix, 12, "dessert/%s", dessert_proto);
+-
+- pthread_rwlock_wrlock(&dessert_cfglock);
+-
+- /* configure logging */
+- if ((opts & DESSERT_LOG_SYSLOG) && !(opts & DESSERT_LOG_NOSYSLOG)) {
+- if (!(_dessert_logflags & _DESSERT_LOGFLAG_SYSLOG)) {
+- /* initialize syslog channel */
+- openlog(dessert_logprefix, LOG_PID, LOG_DAEMON);
+- }
+- _dessert_logflags |= _DESSERT_LOGFLAG_SYSLOG;
+- } else if (!(opts & DESSERT_LOG_SYSLOG) && (opts & DESSERT_LOG_NOSYSLOG)) {
+- if (_dessert_logflags & _DESSERT_LOGFLAG_SYSLOG) {
+- /* close syslog channel */
+- closelog();
+- }
+- _dessert_logflags &= ~_DESSERT_LOGFLAG_SYSLOG;
+- }
+- if ((opts & DESSERT_LOG_STDERR) && !(opts & DESSERT_LOG_NOSTDERR)
+- && !(_dessert_status & _DESSERT_STATUS_DAEMON)) {
+- _dessert_logflags |= _DESSERT_LOGFLAG_STDERR;
+- } else if ((!(opts & DESSERT_LOG_STDERR) && (opts & DESSERT_LOG_NOSTDERR))
+- || (_dessert_status & _DESSERT_STATUS_DAEMON)) {
+- _dessert_logflags &= ~_DESSERT_LOGFLAG_STDERR;
+- }
+- if ((opts & DESSERT_LOG_FILE) && !(opts & DESSERT_LOG_NOFILE)
+- && dessert_logfd != NULL) {
+- _dessert_logflags |= _DESSERT_LOGFLAG_LOGFILE;
+- } else if ((!(opts & DESSERT_LOG_FILE) && (opts & DESSERT_LOG_NOFILE))
+- || dessert_logfd == NULL) {
+- _dessert_logflags &= ~_DESSERT_LOGFLAG_LOGFILE;
+- }
+- if ((opts & DESSERT_LOG_DEBUG) && !(opts & DESSERT_LOG_NODEBUG)) {
+- _dessert_loglevel = LOG_DEBUG;
+- } else if (!(opts & DESSERT_LOG_DEBUG) && (opts & DESSERT_LOG_NODEBUG)) {
+- _dessert_loglevel = LOG_INFO;
+- }
+- if ((opts & DESSERT_LOG_RBUF) && !(opts & DESSERT_LOG_NORBUF)) {
+- _dessert_logflags |= _DESSERT_LOGFLAG_RBUF;
+- } else if (!(opts & DESSERT_LOG_RBUF) && (opts & DESSERT_LOG_NORBUF)) {
+- _dessert_logflags &= ~_DESSERT_LOGFLAG_RBUF;
+- }
+-
+- pthread_rwlock_unlock(&dessert_cfglock);
+-
+- return 0;
+-}
+-
+-/******************************************************************************
+- *
+- * INTERNAL / PRIVATE
+- *
+- * L O G F A C I L I T Y
+- *
+- ******************************************************************************/
+-
+-char* _dessert_log_rbuf_nextline(void) {
+- char* r = NULL;
+- pthread_mutex_lock(&_dessert_logrbuf_mutex);
+- if (_dessert_logrbuf_len > 0) {
+- if (_dessert_logrbuf_cur >= _dessert_logrbuf_len) {
+- _dessert_logrbuf_cur = 0;
+- }
+- r = _dessert_logrbuf + (DESSERT_LOGLINE_MAX * _dessert_logrbuf_cur);
+- _dessert_logrbuf_cur++;
+- if (_dessert_logrbuf_used < _dessert_logrbuf_len - 1) {
+- _dessert_logrbuf_used++;
+- }
+- }
+- pthread_mutex_unlock(&_dessert_logrbuf_mutex);
+-
+- return (r);
+-}
+-
+-/** internal log function
+- *
+- * @internal
+- *
+- * @param[in] level loglevel from <syslog.h>
+- * @param[in] *func function name called from
+- * @param[in] *file file name called from
+- * @param[in] *line line called from
+- * @param[in] *fmt printf format string
+- * @param[in] ... (var-arg) printf like variables
+- **/
+-void _dessert_log(int level, const char* func, const char* file, int line,
+- const char *fmt, ...) {
+- va_list args;
+- char *rbuf_line = NULL;
+- char buf[DESSERT_LOGLINE_MAX];
+- char lf[80];
+- char *lt;
+- char lds[27];
+- struct tm ldd;
+- time_t ldi;
+- int lf_slen, buf_slen;
+-
+- if (_dessert_loglevel < level)
+- return;
+-
+- snprintf(lf, 80, " (%s@%s:%d)", func, file, line);
+- lf_slen = strlen(lf);
+-
+- va_start(args, fmt);
+- vsnprintf(buf, DESSERT_LOGLINE_MAX, fmt, args);
+- va_end(args);
+- buf_slen = strlen(buf);
+-
+- if (_dessert_logflags | _DESSERT_LOGFLAG_SYSLOG) {
+- syslog(level, "%s%s", buf, lf);
+- }
+-
+- if (_dessert_logflags & _DESSERT_LOGFLAG_RBUF) {
+- pthread_rwlock_rdlock(&_dessert_logrbuf_len_lock);
+- rbuf_line = _dessert_log_rbuf_nextline();
+- }
+-
+- if (_dessert_logflags | (_DESSERT_LOGFLAG_LOGFILE | _DESSERT_LOGFLAG_STDERR
+- | _DESSERT_LOGFLAG_RBUF)) {
+-
+- time(&ldi);
+- localtime_r(&ldi, &ldd);
+- snprintf(lds, 26, "%04d-%02d-%02d %02d:%02d:%02d%+05.1f ", ldd.tm_year
+- + 1900, ldd.tm_mon + 1, ldd.tm_mday, ldd.tm_hour, ldd.tm_min,
+- ldd.tm_sec, (double) ldd.tm_gmtoff / 3600);
+-
+- switch (level) {
+- case LOG_EMERG:
+- lt = "EMERG: ";
+- break;
+- case LOG_ALERT:
+- lt = "ALERT: ";
+- break;
+- case LOG_CRIT:
+- lt = "CRIT: ";
+- break;
+- case LOG_ERR:
+- lt = "ERR: ";
+- break;
+- case LOG_WARNING:
+- lt = "WARN: ";
+- break;
+- case LOG_NOTICE:
+- lt = "NOTICE:";
+- break;
+- case LOG_INFO:
+- lt = "INFO: ";
+- break;
+- default:
+- lt = "DEBUG: ";
+- break;
+- }
+-
+- if (32 + buf_slen + lf_slen > 80) {
+- if (_dessert_logflags & _DESSERT_LOGFLAG_LOGFILE && dessert_logfd
+- != NULL)
+- fprintf(dessert_logfd, "%s%s%s\n%80s\n", lds, lt, buf, lf);
+- if (_dessert_logflags & _DESSERT_LOGFLAG_STDERR)
+- fprintf(stderr, "%s%s%s\n%80s\n", lds, lt, buf, lf);
+- if (_dessert_logflags & _DESSERT_LOGFLAG_RBUF && rbuf_line != NULL)
+- snprintf(rbuf_line, DESSERT_LOGLINE_MAX, "%s%s%s\n%80s", lds,
+- lt, buf, lf);
+- } else {
+- while (32 + buf_slen + lf_slen < 80) {
+- buf[buf_slen++] = ' ';
+- }
+- buf[buf_slen] = '\0';
+- if (_dessert_logflags & _DESSERT_LOGFLAG_LOGFILE && dessert_logfd
+- != NULL)
+- fprintf(dessert_logfd, "%s%s%s%s\n", lds, lt, buf, lf);
+- if (_dessert_logflags & _DESSERT_LOGFLAG_STDERR)
+- fprintf(stderr, "%s%s%s%s\n", lds, lt, buf, lf);
+- if (_dessert_logflags & _DESSERT_LOGFLAG_RBUF && rbuf_line != NULL)
+- snprintf(rbuf_line, DESSERT_LOGLINE_MAX, "%s%s%s%s", lds, lt,
+- buf, lf);
+- }
+-
+- if (_dessert_logflags & _DESSERT_LOGFLAG_LOGFILE && dessert_logfd
+- != NULL) {
+- fflush(dessert_logfd);
+- }
+- if (_dessert_logflags & _DESSERT_LOGFLAG_RBUF) {
+- pthread_rwlock_unlock(&_dessert_logrbuf_len_lock);
+- }
+-
+- }
+-}
+-
+-/** command "logging file" */
+-int _dessert_cli_logging_file(struct cli_def *cli, char *command, char *argv[],
+- int argc) {
+- FILE *newlogdf;
+-
+- if (argc != 1) {
+- cli_print(cli, "usage %s filename\n", command);
+- return CLI_ERROR;
+- }
+-
+- newlogdf = fopen(argv[0], "a");
+-
+- if (newlogdf == NULL) {
+- dessert_err("failed o open %s as logfile\n", argv[0]);
+- cli_print(cli, "failed o open %s as logfile\n", argv[0]);
+- return CLI_ERROR;
+- }
+-
+- /* clean up old logfile first */
+- if (dessert_logfd != NULL) {
+- dessert_logcfg(DESSERT_LOG_NOFILE);
+- fclose(dessert_logfd);
+- }
+-
+- dessert_logfd = newlogdf;
+- dessert_logcfg(DESSERT_LOG_FILE);
+-
+- return CLI_OK;
+-}
+-
+-/** command "logging file" */
+-int _dessert_cli_no_logging_file(struct cli_def *cli, char *command,
+- char *argv[], int argc) {
+- dessert_logcfg(DESSERT_LOG_NOFILE);
+- if (dessert_logfd != NULL) {
+- fclose(dessert_logfd);
+- }
+- dessert_logfd = NULL;
+- return CLI_OK;
+-}
+-
+-/** command "logging ringbuffer" */
+-int _dessert_cli_logging_ringbuffer(struct cli_def *cli, char *command,
+- char *argv[], int argc) {
+- int newlen = -1;
+- if (argc != 1 || (newlen = (int) strtol(argv[0], NULL, 10)) < 0) {
+- cli_print(cli, "usage %s [buffer length]\n", command);
+- return CLI_ERROR;
+- }
+-
+- if (newlen == _dessert_logrbuf_len)
+- return CLI_OK;
+-
+- if (newlen == 0) {
+- cli_print(cli,
+- "will not set buffer length to 0 - use no logging ringbuffer instead\n");
+- return CLI_ERROR;
+- }
+-
+- pthread_rwlock_wrlock(&_dessert_logrbuf_len_lock);
+-
+- /* make logging buffer larger - easy if not ENOMEM*/
+- if (newlen > _dessert_logrbuf_len) {
+- _dessert_logrbuf = realloc(_dessert_logrbuf, newlen
+- * DESSERT_LOGLINE_MAX * sizeof(char));
+- if (_dessert_logrbuf == NULL) {
+- _dessert_logrbuf_len = 0;
+- _dessert_logrbuf_cur = 0;
+- } else {
+- _dessert_logrbuf_len = newlen;
+- }
+- dessert_logcfg(DESSERT_LOG_RBUF);
+- /* make logging buffer smaller - pain in the ass */
+- } else if (newlen < _dessert_logrbuf_len) {
+- /* move current log buffer if needed */
+- if (_dessert_logrbuf_cur > newlen) {
+- memmove(_dessert_logrbuf, _dessert_logrbuf + (DESSERT_LOGLINE_MAX
+- * (_dessert_logrbuf_cur - newlen)), newlen
+- * DESSERT_LOGLINE_MAX * sizeof(char));
+- _dessert_logrbuf_cur -= newlen;
+- }
+- _dessert_logrbuf = realloc(_dessert_logrbuf, newlen
+- * DESSERT_LOGLINE_MAX * sizeof(char));
+- if (_dessert_logrbuf == NULL) {
+- _dessert_logrbuf_len = 0;
+- _dessert_logrbuf_cur = 0;
+- } else {
+- _dessert_logrbuf_len = newlen;
+- }
+- } else {
+- dessert_err("this never happens");
+- }
+- if (_dessert_logrbuf_used > _dessert_logrbuf_len - 1)
+- _dessert_logrbuf_used = _dessert_logrbuf_len - 1;
+- pthread_rwlock_unlock(&_dessert_logrbuf_len_lock);
+- return CLI_OK;
+-
+-}
+-
+-/** command "no logging ringbuffer" */
+-int _dessert_cli_no_logging_ringbuffer(struct cli_def *cli, char *command,
+- char *argv[], int argc) {
+- if (_dessert_logrbuf == NULL) {
+- return CLI_OK;
+- } else {
+- pthread_rwlock_wrlock(&_dessert_logrbuf_len_lock);
+- dessert_logcfg(DESSERT_LOG_NORBUF);
+- free(_dessert_logrbuf);
+- _dessert_logrbuf = NULL;
+- _dessert_logrbuf_len = 0;
+- _dessert_logrbuf_cur = 0;
+- pthread_rwlock_unlock(&_dessert_logrbuf_len_lock);
+- return CLI_OK;
+- }
+-
+-}
+-
+-/** command "show logging" */
+-int _dessert_cli_cmd_logging(struct cli_def *cli, char *command, char *argv[],
+- int argc) {
+- pthread_rwlock_rdlock(&_dessert_logrbuf_len_lock);
+- int i = 0;
+- int max = _dessert_logrbuf_len - 1;
+- char* line;
+-
+- if (_dessert_logrbuf_len < 1) {
+- cli_print(
+- cli,
+- "logging to ringbuffer is disables - use \"logging ringbuffer [int]\" in config-mode first");
+- pthread_rwlock_unlock(&_dessert_logrbuf_len_lock);
+- return CLI_ERROR;
+- }
+-
+- if (argc == 1) {
+- int max2 = (int) strtol(argv[0], NULL, 10);
+- if (max2 > 0) {
+- max = max2;
+- }
+- }
+-
+- /* where to start and print? */
+- if (max > _dessert_logrbuf_used) {
+- max = _dessert_logrbuf_used;
+- }
+- i = _dessert_logrbuf_cur - max - 1;
+- if (i < 0) {
+- i += _dessert_logrbuf_len;
+- }
+-
+- while (max > 0) {
+- i++;
+- max--;
+- if (i == _dessert_logrbuf_len) {
+- i = 0;
+- }
+- line = _dessert_logrbuf + (DESSERT_LOGLINE_MAX * i);
+- cli_print(cli, "%s", line);
+- }
+-
+- pthread_rwlock_unlock(&_dessert_logrbuf_len_lock);
+-
+- return CLI_OK;
+-}
+diff --git a/dessert_meshiface.c b/dessert_meshiface.c
+deleted file mode 100644
+index bebce54..0000000
+--- a/dessert_meshiface.c
++++ /dev/null
+@@ -1,1220 +0,0 @@
+-/******************************************************************************
+- Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
+- All rights reserved.
+-
+- These sources were originally developed by Philipp Schmidt
+- at Freie Universitaet Berlin (http://www.fu-berlin.de/),
+- Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
+- (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
+- ------------------------------------------------------------------------------
+- This program is free software: you can redistribute it and/or modify it under
+- the terms of the GNU General Public License as published by the Free Software
+- Foundation, either version 3 of the License, or (at your option) any later
+- version.
+-
+- This program is distributed in the hope that it will be useful, but WITHOUT
+- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+-
+- You should have received a copy of the GNU General Public License along with
+- this program. If not, see http://www.gnu.org/licenses/ .
+- ------------------------------------------------------------------------------
+- For further information and questions please use the web site
+- http://www.des-testbed.net/
+- *******************************************************************************/
+-
+-#include "dessert_internal.h"
+-#include "dessert.h"
+-#ifdef TARGET_FREEBSD
+-#include <ifaddrs.h>
+-#include <net/if_dl.h>
+-#endif
+-
+-/* global data storage // P U B L I C */
+-/* nothing here - yet */
+-
+-/* global data storage // P R I V A T E */
+-/* nothing here - yet */
+-
+-/* local data storage*/
+-dessert_meshif_t *_dessert_meshiflist = NULL;
+-
+-pthread_mutex_t _dessert_meshiflist_mutex = PTHREAD_MUTEX_INITIALIZER;
+-int _dessert_meshiflist_len = 0;
+-int _dessert_meshiflist_perm_count = 0;
+-int _dessert_meshiflist_current_perm = 0;
+-dessert_meshif_t ***_dessert_meshiflist_perms = NULL;
+-
+-dessert_meshrxcbe_t *_dessert_meshrxcblist;
+-int _dessert_meshrxcblistver = 0;
+-
+-/* internal functions forward declarations*/
+-static void _dessert_packet_process(u_char *args,
+- const struct pcap_pkthdr *header, const u_char *packet);
+-static void *_dessert_meshif_add_thread(void* arg);
+-static inline int _dessert_meshsend_if2(dessert_msg_t* msg,
+- dessert_meshif_t *iface);
+-static void _dessert_meshif_cleanup(dessert_meshif_t *meshif);
+-static void _dessert_meshiflist_update_permutations(void);
+-static inline int DL_LENGTH(dessert_meshif_t *l);
+-static inline void list2array(dessert_meshif_t *l, dessert_meshif_t **a,
+- int len);
+-static inline int fact(int i);
+-static inline void permutation(int k, int len, dessert_meshif_t **a);
+-
+-/******************************************************************************
+- *
+- * EXTERNAL / PUBLIC
+- *
+- * M E S H - I N T E R F A C E S
+- *
+- ******************************************************************************/
+-
+-/******************************************************************************
+- * sending messages
+- ******************************************************************************/
+-
+-/** Sends a \b dessert \b message via the specified interface or all interfaces.
+- *
+- * The original message buffer will not be altered, and the ethernet src address
+- * will be set correctly
+- *
+- * @param[in] *msgin message to send
+- * @param[in] *iface interface to send from - use NULL for all interfaces
+- *
+- * @retval DESSERT_OK on success
+- * @retval EINVAL if message is broken
+- * @retval EIO if message was not sent successfully
+- *
+- * %DESCRIPTION:
+- *
+- **/
+-int dessert_meshsend(const dessert_msg_t* msgin, const dessert_meshif_t *iface) {
+- dessert_msg_t* msg;
+- int res;
+-
+- /* check message - we only send valid messages! */
+- if (dessert_msg_check(msgin, msgin->hlen + msgin->plen)) {
+- dessert_warn("will not send invalid message - aborting");
+- return EINVAL;
+- }
+-
+- /* clone message */
+- dessert_msg_clone(&msg, msgin, 1);
+- res = dessert_meshsend_fast(msg, iface);
+- dessert_msg_destroy(msg);
+-
+- return res;
+-
+-}
+-
+-/** Sends a \b dessert \b message via all interfaces, except via the specified interface.
+- *
+- * The original message buffer will not be altered, and the ethernet src address will be set correctly.
+- *
+- * @param[in] *msgin message to send
+- * @param[in] *iface interface NOT to send from - use NULL for all interfaces
+-
+- * @retval DESSERT_OK on success
+- * @retval EINVAL if message is broken
+- * @retval EIO if message was not sent successfully
+- *
+- * %DESCRIPTION:
+- *
+- **/
+-int dessert_meshsend_allbutone(const dessert_msg_t* msgin,
+- const dessert_meshif_t *iface) {
+- dessert_msg_t* msg;
+- int res;
+-
+- /* check message - we only send valid messages! */
+- if (dessert_msg_check(msgin, msgin->hlen + msgin->plen)) {
+- dessert_warn("will not send invalid message - aborting");
+- return EINVAL;
+- }
+-
+- /* clone message */
+- dessert_msg_clone(&msg, msgin, 1);
+- res = dessert_meshsend_fast_allbutone(msg, iface);
+- dessert_msg_destroy(msg);
+-
+- return res;
+-
+-}
+-
+-/** Sends a \b dessert \b message via the interface which is identified by the given hardware address.
+- *
+- * The original message buffer will not be altered, and the ethernet src address
+- * will be set correctly.
+- *
+- * @param[in] *msgin message to send
+- * @param[in] *hwaddr hardware address of the interface to send from
+- *
+- * @retval DESSERT_OK on success
+- * @retval EINVAL if message is broken
+- * @retval EIO if message was not sent successfully
+- *
+- * %DESCRIPTION:
+- *
+- **/
+-int dessert_meshsend_hwaddr(const dessert_msg_t* msgin,
+- const uint8_t hwaddr[ETHER_ADDR_LEN]) {
+- dessert_msg_t* msg;
+- int res;
+-
+- /* check message - we only send valid messages! */
+- if (dessert_msg_check(msgin, msgin->hlen + msgin->plen)) {
+- dessert_warn("will not send invalid message - aborting");
+- return EINVAL;
+- }
+-
+- /* clone message */
+- dessert_msg_clone(&msg, msgin, 1);
+- res = dessert_meshsend_fast_hwaddr(msg, hwaddr);
+- dessert_msg_destroy(msg);
+-
+- return res;
+-}
+-
+-/** Sends a \b dessert \b message via all interfaces in a randomized fashion.
+- *
+- * The original message buffer will not be altered, and the ethernet src address
+- * will be set correctly.
+- *
+- * @param[in] *msgin message to send
+- *
+- * @retval DESSERT_OK on success
+- * @retval EINVAL if message is broken
+- * @retval EIO if message was not sent successfully
+- *
+- * %DESCRIPTION:
+- *
+- **/
+-int dessert_meshsend_randomized(const dessert_msg_t* msgin) {
+- dessert_msg_t* msg;
+- int res;
+-
+- /* check message - we only send valid messages! */
+- if (dessert_msg_check(msgin, msgin->hlen + msgin->plen)) {
+- dessert_warn("will not send invalid message - aborting");
+- return EINVAL;
+- }
+-
+- /* clone message */
+- dessert_msg_clone(&msg, msgin, 1);
+- res = dessert_meshsend_fast_randomized(msg);
+- dessert_msg_destroy(msg);
+-
+- return res;
+-}
+-
+-/** Sends a \b dessert \b message fast via the specified interface or all interfaces.
+- *
+- * This method is faster than dessert_meshsend(), but does not check the message
+- * and may alter the message buffer.
+- *
+- * @param[in] *msg message to send
+- * @param[in] *iface interface to send from
+- *
+- * @retval DESSERT_OK on success
+- * @retval EINVAL if message is broken
+- * @retval EIO if message was not sent successfully
+- *
+- * %DESCRIPTION:
+- *
+- **/
+-int dessert_meshsend_fast(dessert_msg_t* msg, const dessert_meshif_t *iface) {
+- int res = 0;
+-
+- /* we have no iface - send on all! */
+- if (iface == NULL) {
+- pthread_rwlock_rdlock(&dessert_cfglock);
+- DL_FOREACH(_dessert_meshiflist, iface) {
+- /* set shost */
+- memcpy(msg->l2h.ether_shost, iface->hwaddr, ETHER_ADDR_LEN);
+- /* send */
+- res = _dessert_meshsend_if2(msg, iface);
+- if (res) {
+- break;
+- }
+- }
+- pthread_rwlock_unlock(&dessert_cfglock);
+- } else {
+- /* set shost */
+- memcpy(msg->l2h.ether_shost, iface->hwaddr, ETHER_ADDR_LEN);
+- /* send */
+- res = _dessert_meshsend_if2(msg, iface);
+- }
+-
+- return (res);
+-
+-}
+-
+-/** Sends a \b dessert \b message fast via all interfaces, except the specified interface.
+- *
+- * This method is faster than dessert_meshsend_allbutone(), but does not check the message
+- * and may alter the message buffer.
+- *
+- * @param[in] *msg message to send
+- * @param[in] *iface interface to NOT send from - use NULL for all interfaces
+- *
+- * @retval DESSERT_OK on success
+- * @retval EINVAL if message is broken
+- * @retval EIO if message was not sent successfully
+- *
+- * %DESCRIPTION:
+- *
+- **/
+-int dessert_meshsend_fast_allbutone(dessert_msg_t* msg,
+- const dessert_meshif_t *iface) {
+- dessert_meshif_t *curr_iface;
+- int res = 0;
+-
+- /* we have no iface - send on all! */
+- if (iface == NULL) {
+- pthread_rwlock_rdlock(&dessert_cfglock);
+- DL_FOREACH(_dessert_meshiflist, curr_iface) {
+- /* set shost */
+- memcpy(msg->l2h.ether_shost, iface->hwaddr, ETHER_ADDR_LEN);
+- /* send */
+- res = _dessert_meshsend_if2(msg, iface);
+- if (res) {
+- break;
+- }
+- }
+- pthread_rwlock_unlock(&dessert_cfglock);
+- } else {
+- pthread_rwlock_rdlock(&dessert_cfglock);
+- DL_FOREACH(_dessert_meshiflist, curr_iface) {
+-
+- /* skip if it is the 'allbutone' interface */
+- if (curr_iface == iface)
+- curr_iface = curr_iface->next;
+-
+- /* set shost */
+- memcpy(msg->l2h.ether_shost, iface->hwaddr, ETHER_ADDR_LEN);
+- /* send */
+- res = _dessert_meshsend_if2(msg, iface);
+- if (res) {
+- break;
+- }
+- }
+- pthread_rwlock_unlock(&dessert_cfglock);
+- }
+-
+- return (res);
+-
+-}
+-
+-/** Sends a \b dessert \b message fast via the interface specified by the given
+- * hardware address.
+- *
+- * This method is faster than dessert_meshsend_hwaddr(), but does not check the message
+- * and may alter the message buffer.
+- *
+- * @param[in] *msg message to send
+- * @param[in] *hwaddr hardware address of the interface to send from
+- *
+- * @retval DESSERT_OK on success
+- * @retval EINVAL if message is broken
+- * @retval EIO if message was not sent successfully
+- *
+- * %DESCRIPTION:
+- *
+- **/
+-int dessert_meshsend_fast_hwaddr(dessert_msg_t* msg,
+- const uint8_t hwaddr[ETHER_ADDR_LEN]) {
+- int res;
+- dessert_meshif_t *meshif;
+-
+- pthread_rwlock_rdlock(&dessert_cfglock);
+- DL_FOREACH(_dessert_meshiflist, meshif) {
+- if (memcmp(meshif->hwaddr, hwaddr, ETHER_ADDR_LEN) == 0)
+- break;
+- }
+- pthread_rwlock_unlock(&dessert_cfglock);
+- if (likely(meshif != NULL)) {
+- /* set shost */
+- memcpy(msg->l2h.ether_shost, meshif->hwaddr, ETHER_ADDR_LEN);
+- /* send */
+- res = _dessert_meshsend_if2(msg, meshif);
+- } else {
+- dessert_err("No such interface - aborting");
+- return ENODEV;
+- }
+-
+- return (res);
+-}
+-
+-/** Sends a \b dessert \b message fast via all interfaces in a randomized fashion.
+- *
+- * This method is faster than dessert_meshsend_randomized(), but does not check
+- * the message and may alter the message buffer.
+- *
+- * @param[in] *msgin message to send
+- *
+- * @retval DESSERT_OK on success
+- * @retval EINVAL if message is broken
+- * @retval EIO if message was not sent successfully
+- *
+- * %DESCRIPTION:
+- *
+- **/
+-int dessert_meshsend_fast_randomized(dessert_msg_t* msgin) {
+- int i;
+- int res = 0;
+-
+- pthread_mutex_lock(&_dessert_meshiflist_mutex);
+- for (i = 0; i < _dessert_meshiflist_len; i++) {
+- res = dessert_meshsend_fast(msgin, _dessert_meshiflist_perms[_dessert_meshiflist_current_perm][i]);
+- if (res) {
+- break;
+- }
+- }
+- _dessert_meshiflist_current_perm = (_dessert_meshiflist_current_perm+1) % _dessert_meshiflist_perm_count;
+- pthread_mutex_unlock(&_dessert_meshiflist_mutex);
+-
+- return res;
+-}
+-
+-/** Sends a @b dessert @b message @a msg via the specified interface @a iface or
+- * all interfaces.
+- *
+- * This method is faster than dessert_meshsend(), but does not check the message
+- * and may alter the message buffer. In contrast to dessert_meshsend_fast() it
+- * does not write the ether_shost address.
+- *
+- * @param[in] *msg message to send
+- * @param[in] *iface interface to send from
+- *
+- * @retval DESSERT_OK on success
+- * @retval EINVAL if message is broken
+- * @retval EIO if message was not sent successfully
+- *
+- * %DESCRIPTION:
+- *
+- **/
+-int dessert_meshsend_raw(dessert_msg_t* msg, const dessert_meshif_t *iface) {
+- int res = 0;
+-
+- if (iface == NULL) {
+- pthread_rwlock_rdlock(&dessert_cfglock);
+- DL_FOREACH(_dessert_meshiflist, iface) {
+- res = _dessert_meshsend_if2(msg, iface);
+- if (res) {
+- break;
+- }
+- }
+- pthread_rwlock_unlock(&dessert_cfglock);
+- } else {
+- res = _dessert_meshsend_if2(msg, iface);
+- }
+-
+- return (res);
+-
+-}
+-
+-/******************************************************************************
+- * meshrx-callback handling
+- ******************************************************************************/
+-
+-/** Removes all occurrences of the given callback function @a c from the meshrx
+- * pipeline.
+- *
+- * @param[in] c callback function pointer
+- *
+- * @retval DESSERT_OK on success
+- * @retval DESSERT_ERR otherwise
+- *
+- * %DESCRIPTION:
+- *
+- **/
+-int dessert_meshrxcb_del(dessert_meshrxcb_t* c) {
+- int count = 0;
+- dessert_meshrxcbe_t *i, *last;
+-
+- pthread_rwlock_wrlock(&dessert_cfglock);
+-
+- if (_dessert_meshrxcblist == NULL) {
+- count++;
+- goto dessert_meshrxcb_del_out;
+- }
+-
+- while (_dessert_meshrxcblist->c == c) {
+- count++;
+- i = _dessert_meshrxcblist;
+- _dessert_meshrxcblist = _dessert_meshrxcblist->next;
+- free(i);
+- if (_dessert_meshrxcblist == NULL) {
+- goto dessert_meshrxcb_del_out;
+- }
+- }
+-
+- for (i = _dessert_meshrxcblist; i->next != NULL; i = i->next) {
+- if (i->c == c) {
+- count++;
+- last->next = i->next;
+- free(i);
+- i = last;
+- }
+- last = i;
+- }
+-
+- dessert_meshrxcb_del_out: _dessert_meshrxcblistver++;
+- pthread_rwlock_unlock(&dessert_cfglock);
+- return ((count > 0) ? DESSERT_OK : DESSERT_ERR);
+-
+-}
+-
+-/** Adds a callback function to the meshrx pipeline.
+- *
+- * The callback going to get called if a packet is received via a dessert interface.
+- *
+- * @param[in] c callback function
+- * @param[in] prio priority of the function - lower first!
+- *
+- * @retval DESSERT_OK on success
+- * @retval -errno on error
+- *
+- * %DESCRIPTION:
+- *
+- **/
+-int dessert_meshrxcb_add(dessert_meshrxcb_t* c, int prio) {
+- dessert_meshrxcbe_t *cb, *i;
+-
+- cb = (dessert_meshrxcbe_t *) malloc(sizeof(dessert_meshrxcbe_t));
+- if (cb == NULL)
+- return (-errno);
+-
+- pthread_rwlock_wrlock(&dessert_cfglock);
+-
+- cb->c = c;
+- cb->prio = prio;
+- cb->next = NULL;
+-
+- if (_dessert_meshrxcblist == NULL) {
+- _dessert_meshrxcblist = cb;
+- _dessert_meshrxcblistver++;
+-
+- pthread_rwlock_unlock(&dessert_cfglock);
+- return DESSERT_OK;
+- }
+-
+- if (_dessert_meshrxcblist->prio > cb->prio) {
+- cb->next = _dessert_meshrxcblist;
+- _dessert_meshrxcblist = cb;
+- _dessert_meshrxcblistver++;
+-
+- pthread_rwlock_unlock(&dessert_cfglock);
+- return DESSERT_OK;
+- }
+-
+- /* find right place for callback */
+- for (i = _dessert_meshrxcblist; i->next != NULL && i->next->prio
+- <= cb->prio; i = i->next)
+- ;
+-
+- /* insert it */
+- cb->next = i->next;
+- i->next = cb;
+- _dessert_meshrxcblistver++;
+-
+- pthread_rwlock_unlock(&dessert_cfglock);
+- return DESSERT_OK;
+-}
+-
+-/******************************************************************************
+- * mesh interface handling
+- ******************************************************************************/
+-
+-/** Returns the head of the list of mesh interfaces (_desert_meshiflist).
+- *
+- * @retval pointer if list is not empty
+- * @retval NULL otherwise
+- *
+- * %DESCRIPTION:
+- *
+- */
+-dessert_meshif_t* dessert_meshiflist_get() {
+- return _dessert_meshiflist;
+-}
+-
+-/** Looks for mesh interface with name @a dev in the list of mesh interfaces and
+- * returns a pointer to it.
+- *
+- * @param[in] *dev interface name
+- *
+- * @retval pointer if the interface is found
+- * @retval NULL otherwise
+- *
+- * %DESCRIPTION:
+- *
+- **/
+-dessert_meshif_t* dessert_meshif_get_name(const char* dev) {
+- dessert_meshif_t *meshif = NULL;
+-
+- /* search dev name in iflist */
+- //meshif = _dessert_meshiflist;
+- pthread_rwlock_rdlock(&dessert_cfglock);
+- DL_FOREACH(_dessert_meshiflist, meshif) {
+- if (strncmp(meshif->if_name, dev, IF_NAMESIZE) == 0)
+- break;
+- }
+- pthread_rwlock_unlock(&dessert_cfglock);
+-
+- return (meshif);
+-}
+-
+-/** Looks for mesh interface with hardware address @a hwaddr in the list of mesh
+- * interfaces and returns a pointer to it.
+- *
+- * @param[in] *hwaddr interface hardware address
+- *
+- * @retval pointer if the interface is found
+- * @retval NULL otherwise
+- *
+- * %DESCRIPTION:
+- *
+- */
+-dessert_meshif_t* dessert_meshif_get_hwaddr(const uint8_t hwaddr[ETHER_ADDR_LEN]) {
+- dessert_meshif_t *meshif = NULL;
+-
+- pthread_rwlock_rdlock(&dessert_cfglock);
+- DL_FOREACH(_dessert_meshiflist, meshif) {
+- if (memcmp(meshif->hwaddr, hwaddr, ETHER_ADDR_LEN) == 0)
+- break;
+- }
+- pthread_rwlock_unlock(&dessert_cfglock);
+-
+- return meshif;
+-}
+-
+-/** Removes the corresponding dessert_meshif struct from _dessert_meshiflist and does some cleanup.
+- *
+- * @param[in] dev interface name to remove from list
+- *
+- * @retval DESSERT_OK on success
+- * @retval -errno on error
+- *
+- * %DESCRIPTION:
+- *
+- */
+-int dessert_meshif_del(const char* dev) {
+- dessert_meshif_t *meshif;
+- // dessert_meshif_t *meshif_prev; TODO MESHIF_HASH
+-
+- /* lock the list */
+- pthread_rwlock_wrlock(&dessert_cfglock);
+- /* search dev name in iflist */
+- DL_FOREACH(_dessert_meshiflist, meshif) {
+- if (strncmp(meshif->if_name, dev, IF_NAMESIZE) == 0)
+- break;
+- }
+-
+- if (meshif == NULL) {
+- pthread_rwlock_unlock(&dessert_cfglock);
+- return (ENODEV);
+- }
+-
+- /* remove it from list */
+- DL_DELETE(_dessert_meshiflist, meshif);
+- _dessert_meshiflist_update_permutations();
+- pthread_rwlock_unlock(&dessert_cfglock);
+-
+- /* tell pcap not to further process packets */
+- pcap_breakloop(meshif->pcap);
+-
+- /* the remaining cleanup is done in the interface thread *
+- * using _dessert_meshif_cleanup */
+-
+- return DESSERT_OK;
+-
+-}
+-
+-/** Initializes given mesh interface, starts up the packet processor thread.
+-
+- * @param[in] *dev interface name
+- * @param[in] flags @todo Document the flags parameter.
+- *
+- * @retval DESSERT_OK on success
+- * @retval DESSERT_ERR on error
+- *
+- *
+- *
+- * %DESCRIPTION:
+- *
+- */
+-int dessert_meshif_add(const char* dev, uint8_t flags) {
+- dessert_meshif_t *meshif;
+-
+- uint8_t promisc = (flags & DESSERT_IF_NOPROMISC) ? 0 : 1;
+- struct bpf_program fp; /* filter program for libpcap */
+- char fe[64]; /* filter expression for libpcap */
+-
+- snprintf(fe, 64, "ether proto 0x%04x", DESSERT_ETHPROTO);
+-
+- /* init new interface entry */
+- meshif = (dessert_meshif_t*) malloc(sizeof(dessert_meshif_t));
+- if (meshif == NULL)
+- return (-errno);
+- memset((void *) meshif, 0, sizeof(dessert_meshif_t));
+- strncpy(meshif->if_name, dev, IF_NAMESIZE);
+- meshif->if_name[IF_NAMESIZE - 1] = '\0';
+- meshif->if_index = if_nametoindex(dev);
+- pthread_mutex_init(&(meshif->cnt_mutex), NULL);
+-
+- /* check if interface exists */
+- if (!meshif->if_index) {
+- dessert_err("interface %s - no such interface", meshif->if_name);
+- goto dessert_meshif_add_err;
+- }
+-
+- /* initialize libpcap */
+- meshif->pcap = pcap_open_live(meshif->if_name, DESSERT_MAXFRAMELEN,
+- promisc, 10, meshif->pcap_err);
+- if (meshif->pcap == NULL) {
+- dessert_err("pcap_open_live failed for interface %s(%d):\n%s",
+- meshif->if_name, meshif->if_index, meshif->pcap_err);
+- goto dessert_meshif_add_err;
+- }
+- if (pcap_datalink(meshif->pcap) != DLT_EN10MB) {
+- dessert_err("interface %s(%d) is not an ethernet interface!",
+- meshif->if_name, meshif->if_index);
+- goto dessert_meshif_add_err;
+- }
+-
+- /* pcap filter */
+- if (!(flags & DESSERT_IF_NOFILTER)) {
+- if (pcap_compile(meshif->pcap, &fp, fe, 0, 0) == -1) {
+- dessert_err("couldn't parse filter %s: %s\n", fe, pcap_geterr(meshif->pcap));
+- goto dessert_meshif_add_err;
+- }
+- if (pcap_setfilter(meshif->pcap, &fp) == -1) {
+- dessert_err("couldn't install filter %s: %s\n", fe, pcap_geterr(meshif->pcap));
+- goto dessert_meshif_add_err;
+- }
+- /* else { TODO: pcap_freecode() } */
+- }
+-
+- /* get hardware address */
+- if (_dessert_meshif_gethwaddr(meshif) != 0) {
+- dessert_err("failed to get hwaddr of interface %s(%d)",
+- meshif->if_name, meshif->if_index);
+- goto dessert_meshif_add_err;
+- }
+-
+- /* check whether we need to set defsrc (default source) */
+- if (memcmp(dessert_l25_defsrc, ether_null, ETHER_ADDR_LEN) == 0) {
+- memcpy(dessert_l25_defsrc, meshif->hwaddr, ETHER_ADDR_LEN);
+- dessert_info("set dessert_l25_defsrc to hwaddr %02x:%02x:%02x:%02x:%02x:%02x",
+- dessert_l25_defsrc[0], dessert_l25_defsrc[1],dessert_l25_defsrc[2],
+- dessert_l25_defsrc[3], dessert_l25_defsrc[4], dessert_l25_defsrc[5]);
+- }
+-
+- dessert_info("starting worker thread for interface %s(%d) hwaddr %02x:%02x:%02x:%02x:%02x:%02x",
+- meshif->if_name, meshif->if_index,
+- meshif->hwaddr[0], meshif->hwaddr[1], meshif->hwaddr[2],
+- meshif->hwaddr[3], meshif->hwaddr[4], meshif->hwaddr[5]);
+-
+- /* start worker thread */
+- if (pthread_create(&(meshif->worker), NULL, _dessert_meshif_add_thread,
+- (void *) meshif)) {
+- dessert_err("creating worker thread failed for interface %s(%d)",
+- meshif->if_name, meshif->if_index);
+- goto dessert_meshif_add_err;
+- }
+-
+- /* prepend to interface list */
+- pthread_rwlock_wrlock(&dessert_cfglock);
+- DL_PREPEND(_dessert_meshiflist, meshif);
+- _dessert_meshiflist_update_permutations();
+- pthread_rwlock_unlock(&dessert_cfglock);
+-
+- return (DESSERT_OK);
+-
+- dessert_meshif_add_err:
+-
+- if (meshif->pcap != NULL) {
+- pcap_close(meshif->pcap);
+- }
+- free(meshif);
+- return (DESSERT_ERR);
+-}
+-
+-/*****************************************************************************
+- *
+- * INTERNAL / PRIVATE
+- *
+- * M E S H - I N T E R F A C E S
+- *
+- ******************************************************************************/
+-
+-/** Run all registered callbacks.
+- *
+- * @internal
+- *
+- * @return the return status of the last callback called
+- *
+- * @warning Use with care - never register as callback!
+- *
+- * %DESCRIPTION:
+- *
+- */
+-int _dessert_meshrxcb_runall(dessert_msg_t* msg_in, size_t len,
+- dessert_msg_proc_t *proc_in, const dessert_meshif_t *meshif,
+- dessert_frameid_t id) {
+- dessert_msg_t *msg = msg_in;
+- dessert_msg_proc_t *proc = proc_in;
+- dessert_meshrxcbe_t *cb;
+- int res = 0;
+- dessert_meshrxcb_t **cbl = NULL;
+- int cbllen = 0;
+- int cblcur = -1;
+-
+- /* copy callbacks to internal list to release dessert_cfglock before invoking callbacks*/
+- pthread_rwlock_rdlock(&dessert_cfglock);
+- cbllen = 0;
+- for (cb = _dessert_meshrxcblist; cb != NULL; cb = cb->next)
+- cbllen++;
+- cbl = malloc(cbllen * sizeof(dessert_meshrxcb_t *));
+- if (cbl == NULL) {
+- dessert_err("failed to allocate memory for internal callback list");
+- pthread_rwlock_unlock(&dessert_cfglock);
+- return DESSERT_MSG_DROP;
+- }
+-
+- cblcur = 0;
+- for (cb = _dessert_meshrxcblist; cb != NULL; cb = cb->next)
+- cbl[cblcur++] = cb->c;
+-
+- pthread_rwlock_unlock(&dessert_cfglock);
+-
+- /* call the interested */
+- res = 0;
+- cblcur = 0;
+- while (res > DESSERT_MSG_DROP && cblcur < cbllen) {
+-
+- _dessert_packet_process_cbagain: res = cbl[cblcur](msg, len, proc,
+- meshif, id);
+-
+- if (res == DESSERT_MSG_NEEDNOSPARSE && msg == msg_in) {
+- dessert_msg_clone(&msg, msg_in, 0);
+- len = DESSERT_MAXFRAMEBUFLEN;
+- goto _dessert_packet_process_cbagain;
+- } else if (res == DESSERT_MSG_NEEDNOSPARSE && msg != msg_in) {
+- dessert_warn("bogus DESSERT_MSG_NEEDNOSPARSE returned from callback!");
+- }
+-
+- if (res == DESSERT_MSG_NEEDMSGPROC && proc == NULL) {
+- proc = malloc(DESSERT_MSGPROCLEN);
+- memset(proc, 0, DESSERT_MSGPROCLEN);
+- goto _dessert_packet_process_cbagain;
+- } else if (res == DESSERT_MSG_NEEDMSGPROC && proc != NULL) {
+- dessert_warn("bogus DESSERT_MSG_NEEDMSGPROC returned from callback!");
+- }
+-
+- cblcur++;
+- }
+-
+- free(cbl);
+-
+- if (msg != msg_in)
+- dessert_msg_destroy(msg);
+-
+- if (proc != proc_in)
+- free(proc);
+-
+- return (res);
+-}
+-
+-/** Get the hardware address of the ethernet device behind meshif.
+- *
+- * @internal
+- *
+- * @param *meshif pointer to dessert_meshif_t to query
+- *
+- * @retval DESSERT_OK on success
+- *
+- * \warning This is a platform depended function!
+- *
+- * %DESCRIPTION:
+- *
+- **/
+-int _dessert_meshif_gethwaddr(dessert_meshif_t *meshif)
+-#ifdef TARGET_DARWIN
+-{
+- /* the Apple way... */
+-
+- int mib[6];
+- size_t len;
+- uint8_t *buf, *next;
+- struct if_msghdr *ifm;
+- struct sockaddr_dl *sdl;
+- int ret = DESSERT_ERR;
+-
+- mib[0] = CTL_NET;
+- mib[1] = AF_ROUTE;
+- mib[2] = 0;
+- mib[3] = AF_LINK;
+- mib[4] = NET_RT_IFLIST;
+- mib[5] = 0;
+-
+- if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
+- dessert_err("Acquiring hwaddr failed: sysctl 1 error");
+- return(DESSERT_ERR);
+- }
+-
+- if ((buf = malloc(len)) == NULL) {
+- dessert_err("acquiring hwaddr failed: malloc error");
+- return(DESSERT_ERR);
+- }
+-
+- if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
+- dessert_err("acquiring hwaddr failed: sysctl 2 error");
+- return(DESSERT_ERR);
+- }
+-
+- for (next = buf; next < buf+len; next += ifm->ifm_msglen) {
+- ifm = (struct if_msghdr *)next;
+- if (ifm->ifm_type == RTM_IFINFO) {
+- sdl = (struct sockaddr_dl *)(ifm + 1);
+- if (strncmp(&sdl->sdl_data[0], meshif->if_name, sdl->sdl_len) == 0) {
+- memcpy(meshif->hwaddr, LLADDR(sdl), ETHER_ADDR_LEN);
+- ret = DESSERT_OK;
+- break;
+- }
+- }
+- }
+-
+- free(buf);
+- return ret;
+-}
+-#elif TARGET_FREEBSD
+-{
+- struct ifaddrs *ifaphead;
+- struct ifaddrs *ifap;
+- struct sockaddr_dl *sdl = NULL;
+-
+- if (getifaddrs(&ifaphead) != 0)
+- {
+- dessert_err("getifaddrs() failed");
+- return(DESSERT_ERR);
+- }
+-
+- for (ifap = ifaphead; ifap; ifap = ifap->ifa_next)
+- {
+- if ((ifap->ifa_addr->sa_family == AF_LINK))
+- {
+- if (strcmp(ifap->ifa_name,meshif->if_name) == 0)
+- {
+- sdl = (struct sockaddr_dl *)ifap->ifa_addr;
+- if (sdl)
+- {
+- memcpy(meshif->hwaddr, LLADDR(sdl), ETHER_ADDR_LEN);
+- return(DESSERT_OK);
+- }
+- }
+- }
+- }
+- return(DESSERT_ERR);
+-}
+-#elif TARGET_LINUX
+-{
+- /* the linux and solaris way */
+- int sockfd;
+- struct ifreq ifr;
+-
+- /* we need some socket to do that */
+- sockfd = socket(AF_INET, SOCK_STREAM, 0);
+-
+- /* set interface options and get hardware address */
+- strncpy(ifr.ifr_name, meshif->if_name, sizeof(ifr.ifr_name));
+-
+-#ifdef SIOCGIFHWADDR
+- if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) >= 0) {
+- memcpy(meshif->hwaddr, &ifr.ifr_hwaddr.sa_data, ETHER_ADDR_LEN);
+- /* } */
+-#elif defined SIOCGENADDR
+- if ( ioctl(sd, SIOCGENADDR, &ifr_work) >= 0 ) {
+- memcpy( meshif->hwaddr, &ifr.ifr_enaddr, ETHER_ADDR_LEN );
+- /* } */
+-#else
+- if (false) {
+-#endif
+- close(sockfd);
+- return (DESSERT_OK);
+- } else {
+- dessert_err("acquiring hwaddr failed");
+- close(sockfd);
+- return (DESSERT_ERR);
+- }
+-}
+-#else
+-{
+- dessert_err("acquiring hwaddr failed - platform not supported");
+- return(DESSERT_ERR);
+-}
+-#endif
+-
+-/******************************************************************************
+- *
+- * LOCAL
+- *
+- * M E S H - I N T E R F A C E S
+- *
+- ******************************************************************************/
+-
+-/** Function to send packet via a single interface.
+- *
+- * @internal
+- *
+- * @param[in] *msg the message to send
+- * @param[in] *iface the interface the message should be send via
+- *
+- * @retval DESSERT_OK on success
+- * @retval EINVAL if *iface is NULL
+- * @retval EIO if there was a problem sending the message
+- *
+- * %DESCRIPTION:
+- *
+- */
+-static inline int _dessert_meshsend_if2(dessert_msg_t* msg,
+- dessert_meshif_t *iface) {
+- int res;
+- uint8_t oldflags;
+- size_t msglen = ntohs(msg->hlen) + ntohs(msg->plen);
+-
+- /* check for null meshInterface */
+- if (iface == NULL) {
+- dessert_err("NULL-pointer given as interface - programming error!");
+- return EINVAL;
+- }
+-
+- /* send packet - temporally setting DESSERT_FLAG_SPARSE */
+- oldflags = msg->flags;
+- msg->flags &= ~DESSERT_FLAG_SPARSE;
+- res = pcap_inject(iface->pcap, (u_char *) msg, msglen);
+- msg->flags = oldflags;
+-
+- if (res != msglen) {
+- if (res == -1) {
+- dessert_warn("couldn't send message: %s\n", pcap_geterr(iface->pcap));
+- } else {
+- dessert_warn("couldn't send message: sent only %d of %d bytes\n",
+- res, msglen);
+- }
+- return (EIO);
+- }
+-
+- pthread_mutex_lock(&(iface->cnt_mutex));
+- iface->opkts++;
+- iface->obytes += res;
+- pthread_mutex_unlock(&(iface->cnt_mutex));
+-
+- return (DESSERT_OK);
+-
+-}
+-
+-/** Callback doing the main work for packets received through a dessert interface.
+- *
+- * @internal
+- *
+- * @param arg - meshif-pointer carried by libpcap in something else
+- * @param header - pointer to the header by libpcap
+- * @param packet - pointer to the packet by libpcap
+- *
+- * %DESCRIPTION:
+- *
+- */
+-static void _dessert_packet_process(u_char *args,
+- const struct pcap_pkthdr *header, const u_char *packet) {
+- dessert_meshif_t *meshif = (dessert_meshif_t *) args;
+- dessert_msg_t *msg = (dessert_msg_t *) packet;
+- size_t len = header->caplen;
+- dessert_frameid_t id;
+- dessert_msg_proc_t proc;
+-
+- /* is it something I understand? */
+- if (ntohs(msg->l2h.ether_type) != DESSERT_ETHPROTO) {
+- dessert_debug("got packet with ethertype %04x - discarding", ntohs(msg->l2h.ether_type));
+- return;
+- }
+-
+- /* check message */
+- if (header->caplen < header->len) {
+- dessert_warn("packet too short - check pcap_open_live() parameters");
+- return;
+- }
+- if (header->caplen < DESSERT_MSGLEN) {
+- dessert_notice("packet too short - shorter than DESSERT_MSGLEN");
+- return;
+- }
+-
+- /* generate frame id */
+- id = _dessert_newframeid();
+- memset(&proc, 0, DESSERT_MSGPROCLEN);
+-
+- /* count packet */
+- pthread_mutex_lock(&(meshif->cnt_mutex));
+- meshif->ipkts++;
+- meshif->ibytes += header->caplen;
+- pthread_mutex_unlock(&(meshif->cnt_mutex));
+-
+- _dessert_meshrxcb_runall(msg, len, &proc, meshif, id);
+-
+-}
+-
+-/** Internal routine called before interface thread finishes.
+- *
+- * @internal
+- *
+- * @param *meshif the interface to be cleaned up
+- *
+- * %DESCRIPTION:
+- *
+- */
+-static void _dessert_meshif_cleanup(dessert_meshif_t *meshif) {
+- pcap_close(meshif->pcap);
+- free(meshif);
+-}
+-
+-/** Internal thread function running the capture loop.
+- *
+- * @internal
+- *
+- * @param *arg a void pointer representing a dessert_meshif_t interface
+- *
+- * %DESCRIPTION:
+- */
+-static void *_dessert_meshif_add_thread(void* arg) {
+-
+- dessert_meshif_t *meshif = (dessert_meshif_t *) arg;
+-
+- pcap_loop(meshif->pcap, -1, _dessert_packet_process, (u_char *) meshif);
+-
+- _dessert_meshif_cleanup(meshif);
+-
+- return (NULL);
+-
+-}
+-
+-/** Internal function to update the lookup table of permutations of the current _dessert_meshiflist.
+- *
+- * @internal
+- *
+- * %DESCRIPTION: \n
+- */
+-static void _dessert_meshiflist_update_permutations() {
+- int i, r;
+-
+- pthread_mutex_lock(&_dessert_meshiflist_mutex);
+- _dessert_meshiflist_len = DL_LENGTH(_dessert_meshiflist);
+-
+- dessert_meshif_t **a = calloc(sizeof(a) * _dessert_meshiflist_len, 1);
+- list2array(_dessert_meshiflist, a, _dessert_meshiflist_len);
+-
+- _dessert_meshiflist_perm_count = fact(_dessert_meshiflist_len);
+-
+- if (_dessert_meshiflist_perms != NULL) {
+- free(_dessert_meshiflist_perms);
+- }
+- _dessert_meshiflist_perms = calloc(sizeof(dessert_meshif_t **) * _dessert_meshiflist_perm_count + sizeof(dessert_meshif_t *) * _dessert_meshiflist_perm_count * _dessert_meshiflist_len, 1);
+- for (i = 0; i < _dessert_meshiflist_perm_count; ++i) {
+- _dessert_meshiflist_perms[i]
+- = (dessert_meshif_t **) (((char *) _dessert_meshiflist_perms)
+- + sizeof(dessert_meshif_t **)
+- * _dessert_meshiflist_perm_count + i
+- * _dessert_meshiflist_len * sizeof(dessert_meshif_t *));
+- }
+-
+- for (r = 0; r < _dessert_meshiflist_perm_count; r++) {
+- memcpy(_dessert_meshiflist_perms[r], a, sizeof(dessert_meshif_t *)
+- * _dessert_meshiflist_len);
+- }
+- free(a);
+-
+- for(r = 0; r < _dessert_meshiflist_perm_count; r++){
+- permutation(r, _dessert_meshiflist_len, _dessert_meshiflist_perms[r]);
+- }
+-
+- pthread_mutex_unlock(&_dessert_meshiflist_mutex);
+-}
+-
+-/** Internal function to get the length of a double-linked utlist.
+- *
+- * @internal
+- *
+- * @param[in] *l a pointer to the list head
+- *
+- * @return the number of elements in the list
+- *
+- * %DESCRIPTION: \n
+- */
+-static inline int DL_LENGTH(dessert_meshif_t *l) {
+- int len = 0;
+- dessert_meshif_t *temp;
+- DL_FOREACH(l, temp)
+- len++;
+- return len;
+-}
+-
+-/** Internal function to copy the element pointers of the _dessert_meshiflist to an array.
+- *
+- * @internal
+- *
+- * @param[in] *l a pointer to the list head
+- * @param[out] **a a pointer to an array of dessert_meshif_t
+- *
+- * %DESCRIPTION: \n
+- */
+-static inline void list2array(dessert_meshif_t *l, dessert_meshif_t **a,
+- int len) {
+- dessert_meshif_t *t;
+- int i = 0;
+- DL_FOREACH(l, t) {
+- a[i++] = t;
+- if (--len == 0)
+- break;
+- }
+-}
+-
+-/** Internal function to compute the factorial of a given number.
+- *
+- * @internal
+- *
+- * @param[in] i the number
+- *
+- * @return the factorial
+- *
+- * %DESCRIPTION: \n
+- */
+-static inline int fact(int i){
+- int fact = 1;
+- while (i > 0) fact *= i--;
+- return fact;
+-}
+-
+-/** Internal function to produce a permutation of @a a.
+- *
+- * @internal
+- *
+- * @param[in] k the permutation to generate
+- * @param[in] len the number of elements in the array
+- * @param[out] the array to permute
+- *
+- * @note Algorithm adopted from the Wikipedia article on
+- * <a href="http://en.wikipedia.org/wiki/Permutation">Permutations</a>.
+- *
+- * %DESCRIPTION: \n
+- */
+-static inline void permutation(int k, int len, dessert_meshif_t **a) {
+- dessert_meshif_t *temp;
+- int j;
+-
+- for(j = 2 ; j <= len; j++ ) {
+- temp = a[(k%j)];
+- a[(k%j)] = a[j-1];
+- a[j-1] = temp;
+- k = k / j;
+- }
+-}
+diff --git a/dessert_msg.c b/dessert_msg.c
+deleted file mode 100644
+index 75ed217..0000000
+--- a/dessert_msg.c
++++ /dev/null
+@@ -1,876 +0,0 @@
+-/******************************************************************************
+- Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
+- All rights reserved.
+-
+- These sources were originally developed by Philipp Schmidt
+- at Freie Universitaet Berlin (http://www.fu-berlin.de/),
+- Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
+- (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
+- ------------------------------------------------------------------------------
+- This program is free software: you can redistribute it and/or modify it under
+- the terms of the GNU General Public License as published by the Free Software
+- Foundation, either version 3 of the License, or (at your option) any later
+- version.
+-
+- This program is distributed in the hope that it will be useful, but WITHOUT
+- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+-
+- You should have received a copy of the GNU General Public License along with
+- this program. If not, see http://www.gnu.org/licenses/ .
+- ------------------------------------------------------------------------------
+- For further information and questions please use the web site
+- http://www.des-testbed.net/
+- *******************************************************************************/
+-
+-#include "dessert_internal.h"
+-#include "dessert.h"
+-
+-/* global data storage // P U B L I C */
+-
+-/* global data storage // P R I V A T E */
+-
+-/* local data storage*/
+-
+-/* internal functions forward declarations*/
+-
+-/******************************************************************************
+- *
+- * EXTERNAL / PUBLIC
+- *
+- * M E S S A G E H A N D L I N G
+- *
+- ******************************************************************************/
+-
+-/** creates a new dessert_msg_t and initializes it.
+- * @arg **msgout (out) pointer to return message address
+- * @return 0 on success, -errno on error
+- **/
+-int dessert_msg_new(dessert_msg_t **msgout) {
+- dessert_msg_t *msg;
+-
+- msg = malloc(DESSERT_MAXFRAMEBUFLEN);
+-
+- if (msg == NULL) {
+- dessert_err("failed to allocate buffer for new message!");
+- return (-ENOMEM);
+- }
+-
+- memset(msg, 0, DESSERT_MAXFRAMEBUFLEN);
+- msg->l2h.ether_type = htons(DESSERT_ETHPROTO);
+- memset(msg->l2h.ether_dhost, 255, ETHER_ADDR_LEN);
+- memcpy(msg->proto, dessert_proto, DESSERT_PROTO_STRLEN);
+- msg->ver = dessert_ver;
+- msg->ttl = 0xff;
+- msg->u8 = 0x00;
+- msg->u16 = htons(0xbeef);
+- msg->hlen = htons(sizeof(dessert_msg_t));
+- msg->plen = htons(0);
+-
+- *msgout = msg;
+- return (DESSERT_OK);
+-
+-}
+-
+-/** generates a copy of a dessert_msg
+- * @arg **msgnew (out) pointer to return message address
+- * @arg *msgold pointer to the message to clone
+- * @arg sparse whether to allocate DESSERT_MAXFRAMELEN or only hlen+plen
+- * @return DESSERT_OK on success, -errno otherwise
+- **/
+-int dessert_msg_clone(dessert_msg_t **msgnew, const dessert_msg_t *msgold,
+- uint8_t sparse) {
+- dessert_msg_t *msg;
+- size_t msglen = ntohs(msgold->hlen) + ntohs(msgold->plen);
+-
+- if (sparse) {
+- msg = malloc(msglen);
+- } else {
+- msg = malloc(DESSERT_MAXFRAMEBUFLEN);
+- }
+-
+- if (msg == NULL) {
+- return (-errno);
+- }
+-
+- memcpy(msg, msgold, msglen);
+-
+- if (sparse) {
+- msg->flags |= DESSERT_FLAG_SPARSE;
+- } else {
+- msg->flags &= DESSERT_FLAG_SPARSE ^ DESSERT_FLAG_SPARSE;
+- }
+-
+- *msgnew = msg;
+- return (DESSERT_OK);
+-
+-}
+-
+-/** checks whether a dessert_msg is consistent
+- * @arg msg the message to be checked
+- * @arg len the length of the buffer
+- * @return DESSERT_OK on success
+- * @return -1 of the message is too large for the buffer
+- * @return -2 if the message was not intended to this daemon
+- * @return -3 if some extension is not consistent
+- * %DESCRIPTION:
+- ***********************************************************************/
+-int dessert_msg_check(const dessert_msg_t* msg, size_t len) {
+- dessert_ext_t *ext;
+-
+- /* is the message large enough to at least carry the header */
+- if (len < DESSERT_MSGLEN) {
+- dessert_info("message too short - shorter than DESSERT_MSGLEN");
+- return (-1);
+- }
+- if (ntohs(msg->hlen) + ntohs(msg->plen) > len) {
+- dessert_info("message too short - shorter than header + payload");
+- return (-1);
+- }
+-
+- /* right protocol and version */
+- if (msg->proto[0] != dessert_proto[0] || msg->proto[1] != dessert_proto[1]
+- || msg->proto[2] != dessert_proto[2] || msg->proto[3]
+- != dessert_proto[3]) {
+- dessert_info("wrong dessert protocol");
+- return (-2);
+- }
+- if (msg->ver != dessert_ver) {
+- dessert_info("wrong dessert protocol version");
+- return (-2);
+- }
+-
+- /* now check extensions.... */
+- ext = (dessert_ext_t *) ((uint8_t *) msg + DESSERT_MSGLEN);
+- while ((uint8_t *) ext < ((uint8_t *) msg + (size_t) ntohs(msg->hlen))) {
+- /* does current extension fit into the header? */
+- if (((uint8_t *) ext + (size_t) ext->len) > ((uint8_t *) msg
+- + (size_t) ntohs(msg->hlen))) {
+- dessert_info("extension %x too long", ext->type);
+- return (-3);
+- }
+- if (ext->len < 2) {
+- dessert_info("extension %x too short", ext->type);
+- return (-3);
+- }
+-
+- ext = (dessert_ext_t *) ((uint8_t *) ext + (size_t) ext->len);
+- }
+-
+- /* message is valid */
+- return DESSERT_OK;
+-}
+-
+-/** dump a dessert_msg_t to a string
+- * @arg *msg the message to be dumped
+- * @arg len the length of the buffer
+- * @arg *buf text output buffer
+- * @arg blen text output buffer length
+- **/
+-void dessert_msg_dump(const dessert_msg_t* msg, size_t len, char *buf,
+- size_t blen) {
+- dessert_msg_proc_dump(msg, len, NULL, buf, blen);
+-}
+-
+-/** free a dessert_msg
+- * @arg *msg message to free
+- **/
+-void dessert_msg_destroy(dessert_msg_t* msg) {
+- free(msg);
+-}
+-
+-/** creates a new dessert_msg from an ethernet frame.
+- * @arg *eth ethernet frame to encapsulate
+- * @arg len length of the ethernet frame
+- * @arg **msgout (out) pointer to return message address
+- * @return DESSERT_OK on success, -errno otherwise
+- **/
+-int dessert_msg_ethencap(const struct ether_header* eth, size_t eth_len,
+- dessert_msg_t** msgout) {
+- int res;
+- dessert_ext_t *ext;
+- void *payload;
+-
+- /* check len */
+- if (eth_len > DESSERT_MAXFRAMELEN - DESSERT_MSGLEN + ETHER_HDR_LEN) {
+- dessert_debug("failed to encapsulate ethernet frame of %d bytes (max=%d)",
+- eth_len, DESSERT_MAXFRAMELEN - DESSERT_MSGLEN + ETHER_HDR_LEN);
+- return (-EMSGSIZE);
+- }
+-
+- /* create message */
+- res = dessert_msg_new(msgout);
+- if (res) {
+- return res;
+- }
+-
+- /* add ether header */
+- res = dessert_msg_addext(*msgout, &ext, DESSERT_EXT_ETH, ETHER_HDR_LEN);
+- if (res) {
+- return res;
+- }
+- memcpy(ext->data, eth, ETHER_HDR_LEN);
+-
+- /* copy message */
+- dessert_msg_addpayload(*msgout, &payload, (eth_len - ETHER_HDR_LEN));
+- memcpy(payload, ((uint8_t *) eth) + ETHER_HDR_LEN,
+- (eth_len - ETHER_HDR_LEN));
+-
+- return (DESSERT_OK);
+-}
+-
+-/** extracts an ethernet frame from a dessert_msg
+- * @arg *msg pointer to dessert_msg message to decapsulate
+- * @arg **ethout (out) pointer to return ethernet message
+- * @return eth_len on success, -1 otherwise
+- **/
+-int dessert_msg_ethdecap(const dessert_msg_t* msg, struct ether_header** ethout) {
+- dessert_ext_t *ext;
+- int res;
+-
+- /* create message */
+- size_t eth_len = ntohs(msg->plen) + ETHER_HDR_LEN;
+- *ethout = malloc(eth_len);
+- if (*ethout == NULL) {
+- return (-1);
+- }
+-
+- /* copy header */
+- res = dessert_msg_getext(msg, &ext, DESSERT_EXT_ETH, 0);
+- if (res != 1) {
+- free(ethout);
+- return (-1);
+- }
+- memcpy(*ethout, ext->data, ETHER_HDR_LEN);
+-
+- /* copy message */
+- memcpy(((uint8_t *) (*ethout)) + ETHER_HDR_LEN, (((uint8_t *) msg)
+- +ntohs(msg->hlen)), ntohs(msg->plen));
+-
+- return (eth_len);
+-}
+-
+-/** get the ether_header sent as DESSERT_EXT_ETH in a dessert_msg
+- * @arg *msg the message
+- * @return pointer to ether_header data, NULL if DESSERT_EXT_ETH not present
+- **/
+-struct ether_header* dessert_msg_getl25ether(const dessert_msg_t* msg) {
+- dessert_ext_t *ext;
+- struct ether_header *l25h;
+- int res;
+-
+- res = dessert_msg_getext(msg, &ext, DESSERT_EXT_ETH, 0);
+- if (res != 1) {
+- l25h = NULL;
+- } else {
+- l25h = (struct ether_header *) ext->data;
+- }
+-
+- return l25h;
+-}
+-
+-/** generates a copy of a dessert_msg_proc
+- * @arg **procnew (out) pointer to return message address
+- * @arg *procold pointer to the message to clone
+- * @return DESSERT_OK on success, -errno otherwise
+- **/
+-int dessert_msg_proc_clone(dessert_msg_proc_t **procnew,
+- const dessert_msg_proc_t *procold) {
+- if (procold == NULL) {
+- *procnew = procold;
+- return (DESSERT_OK);
+- }
+-
+- dessert_msg_proc_t *proc;
+-
+- proc = malloc(DESSERT_MSGPROCLEN);
+-
+- if (proc == NULL) {
+- return (-errno);
+- }
+-
+- memcpy(proc, procold, DESSERT_MSGPROCLEN);
+-
+- *procnew = proc;
+- return (DESSERT_OK);
+-
+-}
+-
+-/** dump a dessert_msg_t to a string
+- * @arg *msg the message to be dumped
+- * @arg len the length of the buffer
+- * @arg *proc the processing buffer
+- * @arg *buf text output buffer
+- * @arg blen text output buffer length
+- **/
+-void dessert_msg_proc_dump(const dessert_msg_t* msg, size_t len,
+- const dessert_msg_proc_t *proc, char *buf, size_t blen) {
+- dessert_ext_t *ext;
+- int extidx = 0;
+- int i;
+- struct ether_header *l25h;
+-
+-#define _dessert_msg_check_append(...) snprintf(buf+strlen(buf), blen-strlen(buf), __VA_ARGS__)
+- memset((void *) buf, 0, blen);
+-
+- _dessert_msg_check_append("\tl2_dhost: %02x:%02x:%02x:%02x:%02x:%02x\n",
+- msg->l2h.ether_dhost[0], msg->l2h.ether_dhost[1], msg->l2h.ether_dhost[2],
+- msg->l2h.ether_dhost[3], msg->l2h.ether_dhost[4], msg->l2h.ether_dhost[5]);
+- _dessert_msg_check_append("\tl2_shost: %02x:%02x:%02x:%02x:%02x:%02x\n",
+- msg->l2h.ether_shost[0], msg->l2h.ether_shost[1], msg->l2h.ether_shost[2],
+- msg->l2h.ether_shost[3], msg->l2h.ether_shost[4], msg->l2h.ether_shost[5]);
+- _dessert_msg_check_append("\tl2_type: %x\n\n", ntohs(msg->l2h.ether_type));
+-
+- _dessert_msg_check_append("\tproto: ");
+- strncpy(buf + strlen(buf), msg->proto, DESSERT_PROTO_STRLEN);
+- _dessert_msg_check_append("\n\tver: %d\n", msg->ver);
+-
+- _dessert_msg_check_append("\tflags: ");
+- if (msg->flags & DESSERT_FLAG_SPARSE)
+- _dessert_msg_check_append(" SPARSE");
+-
+- _dessert_msg_check_append("\n\tttl: %x\n", (msg->ttl));
+- _dessert_msg_check_append("\tu8: %x\n", (msg->u8));
+- _dessert_msg_check_append("\tu16: %x\n", ntohs(msg->u16));
+- _dessert_msg_check_append("\thlen: %d\n", ntohs(msg->hlen));
+- _dessert_msg_check_append("\tplen: %d\n\n", ntohs(msg->plen));
+-
+- /* get l2.5 header if possible */
+- if ((l25h = dessert_msg_getl25ether(msg)) != NULL) {
+- _dessert_msg_check_append("\tl25 proto: ethernet\n");
+-
+- _dessert_msg_check_append("\tl25_dhost: %02x:%02x:%02x:%02x:%02x:%02x\n",
+- l25h->ether_dhost[0], l25h->ether_dhost[1], l25h->ether_dhost[2],
+- l25h->ether_dhost[3], l25h->ether_dhost[4], l25h->ether_dhost[5]);
+- _dessert_msg_check_append("\tl25_shost: %02x:%02x:%02x:%02x:%02x:%02x\n",
+- l25h->ether_shost[0], l25h->ether_shost[1], l25h->ether_shost[2],
+- l25h->ether_shost[3], l25h->ether_shost[4], l25h->ether_shost[5]);
+- _dessert_msg_check_append("\tl25_type: %x\n\n", ntohs(l25h->ether_type));
+-
+- }
+-
+- /* we have a trace */
+- if (dessert_msg_trace_dump(msg, buf, blen - strlen(buf)) > 1)
+- _dessert_msg_check_append("\n");
+-
+- /* now other extensions.... */
+- ext = (dessert_ext_t *) ((uint8_t *) msg + DESSERT_MSGLEN);
+- while ((uint8_t *) ext < ((uint8_t *) msg + (size_t) ntohs(msg->hlen))) {
+- _dessert_msg_check_append("\textension %d:\n", extidx);
+-
+- /* does current extension fit into the header? */
+- if ((((uint8_t *) ext + (size_t) ext->len) > ((uint8_t *) msg
+- + (size_t) ntohs(msg->hlen))) || (ext->len < 2)) {
+- _dessert_msg_check_append("\t\tbroken extension - giving up!\n");
+- break;
+- }
+-
+- _dessert_msg_check_append("\t\ttype: 0x%02x\n", ext->type);
+- _dessert_msg_check_append("\t\tlen: %d\n", ext->len);
+-
+- if (ext->type != DESSERT_EXT_ETH && ext->type != DESSERT_EXT_TRACE) {
+- _dessert_msg_check_append("\t\tdata: ");
+- for (i = 0; i < dessert_ext_getdatalen(ext); i++) {
+- _dessert_msg_check_append("0x%x ", ext->data[i]);
+- if (i % 12 == 1 && i != 1)
+- _dessert_msg_check_append("\t\t ");
+- }
+- }
+- _dessert_msg_check_append("\n");
+-
+- ext = (dessert_ext_t *) ((uint8_t *) ext + (size_t) ext->len);
+- extidx++;
+- }
+-
+- if (proc != NULL) {
+- _dessert_msg_check_append("\tlocal processing header:\n");
+- _dessert_msg_check_append("\tlflags: ");
+-
+- if (proc->lflags & DESSERT_LFLAG_SRC_SELF)
+- _dessert_msg_check_append(" DESSERT_FLAG_SRC_SELF");
+- if (proc->lflags & DESSERT_LFLAG_DST_SELF)
+- _dessert_msg_check_append(" DESSERT_FLAG_DST_MULTICAST");
+- if (proc->lflags & DESSERT_LFLAG_DST_MULTICAST)
+- _dessert_msg_check_append(" DESSERT_FLAG_DST_SELF");
+- if (proc->lflags & DESSERT_LFLAG_DST_BROADCAST)
+- _dessert_msg_check_append(" DESSERT_FLAG_DST_BROADCAST");
+- if (proc->lflags & DESSERT_LFLAG_PREVHOP_SELF)
+- _dessert_msg_check_append(" DESSERT_FLAG_PREVHOP_SELF");
+- if (proc->lflags & DESSERT_LFLAG_NEXTHOP_SELF)
+- _dessert_msg_check_append(" NEXTHOP_SELF");
+- if (proc->lflags & DESSERT_LFLAG_NEXTHOP_BROADCAST)
+- _dessert_msg_check_append(" NEXTHOP_BROADCAST");
+- }
+-
+-}
+-
+-/** free a dessert_prc_msg
+- * @arg *proc processing buffer to free
+- **/
+-void dessert_msg_proc_destroy(dessert_msg_proc_t* proc) {
+- free(proc);
+-}
+-
+-/** add or replace payload to a dessert_msg
+- * @arg *msg the message the payload should be added to
+- * @arg **payload (out) the pointer to place the payload
+- * @arg len the length of the payload
+- * @return DESSERT_OK on success, DESSERT_ERR otherwise
+- **/
+-int dessert_msg_addpayload(dessert_msg_t* msg, void** payload, int len) {
+- /* check payload */
+- if (len > DESSERT_MAXFRAMELEN - ntohs(msg->hlen)) {
+- return DESSERT_ERR; /* too big */
+- }
+-
+- /* export payload pointer */
+- *payload = ((uint8_t *) msg + ntohs(msg->hlen));
+- msg->plen = htons(len);
+-
+- return DESSERT_OK;
+-}
+-
+-/** Retrieves a pointer to the payload of a dessert message @a msg.
+- *
+- * @param[in] *msg the message the payload should be retrieved from
+- * @param[out] **payload the pointer to place the payload in
+- *
+- * @return the length of the payload in bytes if any, 0 otherwise
+- */
+-int dessert_msg_getpayload(dessert_msg_t *msg, void** payload) {
+-
+- /* test if payload is present in msg */
+- if (msg->plen == 0) {
+- *payload = NULL;
+- return 0;
+- }
+-
+- *payload = (uint8_t *) msg + ntohs(msg->hlen);
+-
+- return msg->plen;
+-}
+-
+-
+-/** add an extension record to a dessert_msg
+- * @arg *msg the message the extension should be added to
+- * @arg **ext (out) the extension pointer to the reserved extension space
+- * @arg type the type of the extension
+- * @arg len the length of the ext data (without 2 byte extension header)
+- * @return DESSERT_OK on success,
+- **/
+-int dessert_msg_addext(dessert_msg_t *msg, dessert_ext_t **ext, uint8_t type,
+- size_t len) {
+-
+- /* check if sparse message */
+- if ((msg->flags & DESSERT_FLAG_SPARSE) > 0) {
+- dessert_debug("tried to add extension to a sparse message - use dessert_msg_clone() first!");
+- return -1;
+- }
+-
+- /* add DESSERT_EXTLEN to len for convenience*/
+- len += DESSERT_EXTLEN;
+-
+- /* check ext */
+- if (len > DESSERT_MAXFRAMELEN - ntohs(msg->hlen) - ntohs(msg->plen)) {
+- dessert_debug("message would be too large after adding extension!");
+- return -2; /* too big */
+- } else if (len < DESSERT_EXTLEN) {
+- dessert_debug("extension too small!");
+- return -3; /* too small */
+- } else if (len > 255) {
+- dessert_debug("extension too big!");
+- return -2; /* too big */
+- }
+-
+- /* move payload if necessary */
+- if (ntohs(msg->plen) > 0) {
+- memmove(((uint8_t *) msg + ntohs(msg->hlen) + len), ((uint8_t *) msg
+- + ntohs(msg->hlen)), ntohs(msg->plen));
+- }
+-
+- /* get ext addr */
+- *ext = (dessert_ext_t *) ((uint8_t *) msg + ntohs(msg->hlen));
+-
+- /* update msg hlen */
+- msg->hlen = htons(ntohs(msg->hlen) + len);
+-
+- /* copy in extension data */
+- (*ext)->len = len;
+- (*ext)->type = type;
+-
+- return DESSERT_OK;
+-}
+-
+-/** remove an extension record from a dessert_msg
+- * @arg *msg the message the extension should be added to
+- * @arg *ext (out) the extension pointer to the extension to be removed
+- * @return DESSERT_OK on success,
+- **/
+-int dessert_msg_delext(dessert_msg_t *msg, dessert_ext_t *ext) {
+-
+- /* check ext */
+- if ((((uint8_t *) ext) < ((uint8_t *) msg)) || (((uint8_t *) ext)
+- > (((uint8_t *) msg) + ntohs(msg->hlen)))) {
+- dessert_debug("extension not within packet header - won't remove");
+- return DESSERT_ERR;
+- }
+-
+- msg->hlen = htons(ntohs(msg->hlen) - ext->len);
+-
+- memmove(ext, ((uint8_t *) ext) + ext->len, (ntohs(msg->hlen)
+- + ntohs(msg->plen)) - (((uint8_t *) ext) - ((uint8_t *) msg)));
+-
+- return DESSERT_OK;
+-}
+-
+-/** Resizes a given extension record @a ext within in a @b dessert @b message
+- * @a msg to the new length @a new_len.
+- *
+- * @param[in] *msg the message
+- * @param[in] *ext the extension record
+- * @param[in] new_len the new length of the extension record
+- *
+- * @retval DESSERT_OK on success
+- *
+- * %DESCRIPTION:
+- *
+- **/
+-int dessert_msg_resizeext(dessert_msg_t *msg, dessert_ext_t *ext, size_t new_len) {
+-
+- int old_len = ext->len;
+-
+- /* check ext */
+- if (new_len > DESSERT_MAXFRAMELEN - ntohs(msg->hlen) - ntohs(msg->plen) - old_len) {
+- dessert_debug("message would be too large after adding extension!");
+- return -2; /* too big */
+- } else if (new_len < DESSERT_EXTLEN) {
+- dessert_debug("extension too small!");
+- return -3; /* too small */
+- } else if (new_len > 255) {
+- dessert_debug("extension too big!");
+- return -2; /* too big */
+- }
+-
+- memmove(((uint8_t *)ext) + new_len,((uint8_t *)ext) + ext->len, ntohs(msg->hlen)
+- + ntohs(msg->plen) - (((uint8_t *) ext) - ((uint8_t *) msg)) - ext->len);
+-
+- msg->hlen = htons(ntohs(msg->hlen) - (ext->len - new_len));
+- ext->len = new_len;
+-
+- return DESSERT_OK;
+-}
+-
+-/** get an specific or all extensions
+- *
+- * @arg *msg the message
+- * @arg **ext (out) pointer to extracted extension
+- * sets *ext=NULL if extension not found
+- * may be NULL in this case only count/existence matters
+- * @arg type type of the ext to retrieve - use DESSERT_EXT_ANY to get any ext
+- * @arg index the index of the extension of that type, starting with 0
+- * @return 0 if the message has no such extension,
+- * @return count of extensions of that type if count > index
+- * @return -count of extensions of that type if count <= index
+- **/
+-int dessert_msg_getext(const dessert_msg_t* msg, dessert_ext_t** ext,
+- uint8_t type, int index) {
+- int i = 0;
+- dessert_ext_t *exti;
+-
+- if (ext != NULL)
+- *ext = NULL;
+-
+- exti = (dessert_ext_t *) ((uint8_t *) msg + DESSERT_MSGLEN);
+- while ((uint8_t *) exti < ((uint8_t *) msg + (size_t) ntohs(msg->hlen))) {
+- /* does current extension fit into the header? */
+- if (type == exti->type || type == DESSERT_EXT_ANY) {
+- if (i == index && ext != NULL) {
+- *ext = exti;
+- }
+- i++;
+- }
+- exti = (dessert_ext_t *) (((uint8_t *) exti) + (size_t) exti->len);
+- }
+-
+- if (i <= index) {
+- i = -i;
+- }
+- return (i);
+-
+-}
+-
+-/** get an specific or all extensions
+- *
+- * @arg *msg the message
+- * @arg type type of the ext to retrieve - use DESSERT_EXT_ANY to get any ext
+- * @return 0 if the message has no such extension,
+- * @return count of extensions of that type
+- **/
+-int dessert_msg_get_ext_count(const dessert_msg_t* msg, uint8_t type) {
+- return dessert_msg_getext(msg, NULL, type, 0);
+-}
+-
+-/** add initial trace header to dessert message
+- * @arg *msg dessert_msg_t message used for tracing
+- * @arg mode trace mode
+- * use DESSERT_MSG_TRACE_HOST to only record default mac of hosts on the way
+- * use DESSERT_MSG_TRACE_IFACE to also trace input interface and last hop
+- * ®return DESSERT_OK on success
+- **/
+-int dessert_msg_trace_initiate(dessert_msg_t* msg, int mode) {
+-
+- dessert_ext_t *ext;
+- struct ether_header *l25h;
+-
+- if (mode != DESSERT_MSG_TRACE_HOST && mode != DESSERT_MSG_TRACE_IFACE)
+- return EINVAL;
+-
+- if (msg->flags & DESSERT_FLAG_SPARSE)
+- return DESSERT_MSG_NEEDNOSPARSE;
+-
+- dessert_msg_addext(msg, &ext, DESSERT_EXT_TRACE, mode);
+- memcpy((ext->data), dessert_l25_defsrc, ETHER_ADDR_LEN);
+- if (mode == DESSERT_MSG_TRACE_IFACE) {
+- memcpy((ext->data) + ETHER_ADDR_LEN, msg->l2h.ether_shost,
+- ETHER_ADDR_LEN);
+- l25h = dessert_msg_getl25ether(msg);
+- if (l25h == NULL) {
+- memcpy((ext->data) + ETHER_ADDR_LEN, ether_null, ETHER_ADDR_LEN);
+- } else {
+- memcpy((ext->data) + ETHER_ADDR_LEN * 2, l25h->ether_shost,
+- ETHER_ADDR_LEN);
+- }
+- }
+-
+- return DESSERT_OK;
+-
+-}
+-
+-/** dump packet trace to string
+- * @arg *msg dessert_msg_t message used for tracing
+- * @arg *buf char buffer to place string
+- * use DESSERT_MSG_TRACE_HOST to only record default mac of hosts on the way
+- * use DESSERT_MSG_TRACE_IFACE to also trace input interface and last hop
+- * ®return length of the string - 0 if msg has no trace header
+- **/
+-int dessert_msg_trace_dump(const dessert_msg_t* msg, char* buf, int blen) {
+-
+- dessert_ext_t *ext;
+- int x, i = 0;
+-
+-#define _dessert_msg_trace_dump_append(...) snprintf(buf+strlen(buf), blen-strlen(buf), __VA_ARGS__)
+-
+- x = dessert_msg_getext(msg, &ext, DESSERT_EXT_TRACE, 0);
+- if (x < 1)
+- return 0;
+-
+- _dessert_msg_trace_dump_append("\tpacket trace:\n");
+- _dessert_msg_trace_dump_append("\t\tfrom %02x:%02x:%02x:%02x:%02x:%02x\n",
+- ext->data[0], ext->data[1], ext->data[2],
+- ext->data[3], ext->data[4], ext->data[5]);
+-
+- if (dessert_ext_getdatalen(ext) == DESSERT_MSG_TRACE_IFACE) {
+- _dessert_msg_trace_dump_append("\t\t received on %02x:%02x:%02x:%02x:%02x:%02x\n",
+- ext->data[6], ext->data[7], ext->data[8],
+- ext->data[9], ext->data[10], ext->data[11]);
+- _dessert_msg_trace_dump_append("\t\t l2.5 src %02x:%02x:%02x:%02x:%02x:%02x\n",
+- ext->data[12], ext->data[13], ext->data[14],
+- ext->data[15], ext->data[16], ext->data[17]);
+- }
+-
+- for (i = 1; i < x; i++) {
+- dessert_msg_getext(msg, &ext, DESSERT_EXT_TRACE, i);
+- _dessert_msg_trace_dump_append("\t\t#%3d %02x:%02x:%02x:%02x:%02x:%02x\n", i,
+- ext->data[0], ext->data[1], ext->data[2],
+- ext->data[3], ext->data[4], ext->data[5]);
+-
+- if (dessert_ext_getdatalen(ext) == DESSERT_MSG_TRACE_IFACE) {
+- _dessert_msg_trace_dump_append("\t\t received from %02x:%02x:%02x:%02x:%02x:%02x\n",
+- ext->data[12], ext->data[13], ext->data[14],
+- ext->data[15], ext->data[16], ext->data[17]);
+- _dessert_msg_trace_dump_append("\t\t receiving iface %02x:%02x:%02x:%02x:%02x:%02x\n",
+- ext->data[6], ext->data[7], ext->data[8],
+- ext->data[9], ext->data[10], ext->data[11]);
+- }
+- }
+-
+- return strlen(buf);
+-
+-}
+-
+-/** callback that checks whether a dessert_msg is consistent
+- * @arg *msg dessert_msg_t frame received
+- * @arg len length of ethernet frame received
+- * @arg *iface interface received packet on
+- * @return DESSERT_MSG_KEEP if message is valid, DESSERT_MSG_DROP otherwise
+- **/
+-int dessert_msg_check_cb(dessert_msg_t* msg, size_t len,
+- dessert_msg_proc_t *proc, const dessert_meshif_t *iface,
+- dessert_frameid_t id) {
+- if (dessert_msg_check(msg, len)) {
+- dessert_debug("invalid package - discarding");
+- return DESSERT_MSG_DROP;
+- }
+- return DESSERT_MSG_KEEP;
+-}
+-
+-/** dump a dessert_msg_t to debug log
+- * @arg *msg dessert_msg_t frame received
+- * @arg len length of ethernet frame received
+- * @arg *iface interface received packet on
+- * ®return DESSERT_MSG_KEEP always
+- **/
+-int dessert_msg_dump_cb(dessert_msg_t* msg, size_t len,
+- dessert_msg_proc_t *proc, const dessert_meshif_t *iface,
+- dessert_frameid_t id) {
+- char buf[1024];
+-
+- dessert_msg_proc_dump(msg, len, proc, buf, 1024);
+- dessert_debug("received frame #%lu on interface %s - dump:\n%s", (unsigned long) id, iface->if_name, buf);
+-
+- return DESSERT_MSG_KEEP;
+-}
+-
+-/** check if the message carries a trace extension and add the current trace info
+- * if iface is NULL, the packet is ignored
+- * @arg *msg dessert_msg_t frame received
+- * @arg len length of ethernet frame received
+- * @arg *iface interface received packet on
+- * ®return DESSERT_MSG_KEEP always
+- **/
+-int dessert_msg_trace_cb(dessert_msg_t* msg, size_t len,
+- dessert_msg_proc_t *proc, const dessert_meshif_t *iface,
+- dessert_frameid_t id) {
+- dessert_ext_t *ext;
+-
+- /* abort if message has no trace extension */
+- if (dessert_msg_getext(msg, &ext, DESSERT_EXT_TRACE, 0) == 0)
+- return DESSERT_MSG_KEEP;
+-
+- /* abort if iface is NULL */
+- if (iface == NULL)
+- return DESSERT_MSG_KEEP;
+-
+- /* we cannot add header to sparse messages */
+- if (msg->flags & DESSERT_FLAG_SPARSE)
+- return DESSERT_MSG_NEEDNOSPARSE;
+-
+- /* get the trace mode (hop vs interface) */
+- if (dessert_ext_getdatalen(ext) == DESSERT_MSG_TRACE_HOST) {
+- dessert_msg_addext(msg, &ext, DESSERT_EXT_TRACE, DESSERT_MSG_TRACE_HOST);
+- memcpy((ext->data), dessert_l25_defsrc, ETHER_ADDR_LEN);
+- } else if (dessert_ext_getdatalen(ext) == DESSERT_MSG_TRACE_IFACE) {
+- dessert_msg_addext(msg, &ext, DESSERT_EXT_TRACE,
+- DESSERT_MSG_TRACE_IFACE);
+- memcpy((ext->data), dessert_l25_defsrc, ETHER_ADDR_LEN);
+- memcpy((ext->data) + ETHER_ADDR_LEN, iface->hwaddr, ETHER_ADDR_LEN);
+- memcpy((ext->data) + ETHER_ADDR_LEN * 2, msg->l2h.ether_shost,
+- ETHER_ADDR_LEN);
+- } else {
+- dessert_warn("got packet with %d bytes trace extension - ignoring");
+- }
+- return DESSERT_MSG_KEEP;
+-}
+-
+-/** callback to set the local processing flags in dessert_msg_proc_t on an arriving dessert_msg_t
+- * @arg *msg dessert_msg_t frame received
+- * @arg len length of ethernet frame received
+- * @arg *iface interface received packet on
+- * ®return DESSERT_MSG_KEEP or DESSERT_MSG_NEEDMSGPROC
+- **/
+-int dessert_msg_ifaceflags_cb(dessert_msg_t* msg, size_t len,
+- dessert_msg_proc_t *proc, const dessert_meshif_t *riface,
+- dessert_frameid_t id) {
+-
+- dessert_meshif_t *iface;
+- struct ether_header *l25h;
+-
+- /* check if we have an processing header */
+- if (proc == NULL)
+- return DESSERT_MSG_NEEDMSGPROC;
+-
+- /* get l2.5 header if possible */
+- l25h = dessert_msg_getl25ether(msg);
+-
+- /* clear flags */
+- proc->lflags &= ~(DESSERT_LFLAG_DST_SELF | DESSERT_LFLAG_SRC_SELF
+- | DESSERT_LFLAG_NEXTHOP_SELF | DESSERT_LFLAG_PREVHOP_SELF
+- | DESSERT_LFLAG_NEXTHOP_BROADCAST
+- | DESSERT_LFLAG_DST_SELF_OVERHEARD
+- | DESSERT_LFLAG_NEXTHOP_SELF_OVERHEARD);
+-
+- /* checks against defaults */
+- if (l25h != NULL && memcmp(l25h->ether_dhost, ether_broadcast,
+- ETHER_ADDR_LEN) == 0) {
+- proc->lflags |= DESSERT_LFLAG_DST_BROADCAST;
+- } else if (l25h != NULL && l25h->ether_dhost[0] & 0x01) { /* broadcast also has this bit set */
+- proc->lflags |= DESSERT_LFLAG_DST_MULTICAST;
+- }
+-
+- if (l25h != NULL && memcmp(l25h->ether_dhost, dessert_l25_defsrc,
+- ETHER_ADDR_LEN) == 0) {
+- proc->lflags |= DESSERT_LFLAG_DST_SELF;
+- }
+- if (l25h != NULL && memcmp(l25h->ether_shost, dessert_l25_defsrc,
+- ETHER_ADDR_LEN) == 0) {
+- proc->lflags |= DESSERT_LFLAG_SRC_SELF;
+- }
+- if (memcmp(msg->l2h.ether_dhost, dessert_l25_defsrc, ETHER_ADDR_LEN) == 0) {
+- proc->lflags |= DESSERT_LFLAG_NEXTHOP_SELF;
+- }
+- if (memcmp(msg->l2h.ether_shost, dessert_l25_defsrc, ETHER_ADDR_LEN) == 0) {
+- proc->lflags |= DESSERT_LFLAG_PREVHOP_SELF;
+- }
+- if (memcmp(msg->l2h.ether_dhost, ether_broadcast, ETHER_ADDR_LEN) == 0) {
+- proc->lflags |= DESSERT_LFLAG_NEXTHOP_BROADCAST;
+- }
+-
+- /* checks against interfaces in list */
+- pthread_rwlock_rdlock(&dessert_cfglock);
+- DL_FOREACH(dessert_meshiflist_get(), iface) {
+- if (l25h != NULL && memcmp(l25h->ether_dhost, iface->hwaddr,
+- ETHER_ADDR_LEN) == 0) {
+- proc->lflags |= DESSERT_LFLAG_DST_SELF;
+- if (memcmp(l25h->ether_dhost, riface->hwaddr, ETHER_ADDR_LEN) != 0) {
+- proc->lflags |= DESSERT_LFLAG_DST_SELF_OVERHEARD;
+- }
+- }
+- if (l25h != NULL && memcmp(l25h->ether_shost, iface->hwaddr,
+- ETHER_ADDR_LEN) == 0) {
+- proc->lflags |= DESSERT_LFLAG_SRC_SELF;
+- }
+- if (memcmp(msg->l2h.ether_dhost, iface->hwaddr, ETHER_ADDR_LEN) == 0) {
+- proc->lflags |= DESSERT_LFLAG_NEXTHOP_SELF;
+- if (memcmp(msg->l2h.ether_dhost, riface->hwaddr, ETHER_ADDR_LEN)
+- != 0) {
+- proc->lflags |= DESSERT_LFLAG_NEXTHOP_SELF_OVERHEARD;
+- }
+- }
+- if (memcmp(msg->l2h.ether_shost, iface->hwaddr, ETHER_ADDR_LEN) == 0) {
+- proc->lflags |= DESSERT_LFLAG_PREVHOP_SELF;
+- }
+- }
+- pthread_rwlock_unlock(&dessert_cfglock);
+-
+- return DESSERT_MSG_KEEP;
+-}
+-
+-/******************************************************************************
+- *
+- * INTERNAL / PRIVATE
+- *
+- * M E S S A G E H A N D L I N G
+- *
+- ******************************************************************************/
+-
+-/* nothing here - yet */
+-
+-/******************************************************************************
+- *
+- * LOCAL
+- *
+- * M E S S A G E H A N D L I N G
+- *
+- ******************************************************************************/
+-
+-/* nothing here - yet */
+diff --git a/dessert_periodic.c b/dessert_periodic.c
+deleted file mode 100644
+index a704a89..0000000
+--- a/dessert_periodic.c
++++ /dev/null
+@@ -1,326 +0,0 @@
+-/******************************************************************************
+- Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
+- All rights reserved.
+-
+- These sources were originally developed by Philipp Schmidt
+- at Freie Universitaet Berlin (http://www.fu-berlin.de/),
+- Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
+- (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
+- ------------------------------------------------------------------------------
+- This program is free software: you can redistribute it and/or modify it under
+- the terms of the GNU General Public License as published by the Free Software
+- Foundation, either version 3 of the License, or (at your option) any later
+- version.
+-
+- This program is distributed in the hope that it will be useful, but WITHOUT
+- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+-
+- You should have received a copy of the GNU General Public License along with
+- this program. If not, see http://www.gnu.org/licenses/ .
+- ------------------------------------------------------------------------------
+- For further information and questions please use the web site
+- http://www.des-testbed.net/
+- *******************************************************************************/
+-
+-#include "dessert_internal.h"
+-#include "dessert.h"
+-
+-/* global data storage // P U B L I C */
+-
+-/* global data storage // P R I V A T E */
+-dessert_periodic_t *_tasklist = NULL;
+-pthread_mutex_t _dessert_periodic_mutex = PTHREAD_MUTEX_INITIALIZER;
+-pthread_cond_t _dessert_periodic_changed = PTHREAD_COND_INITIALIZER;
+-pthread_t _dessert_periodic_worker;
+-int _dessert_periodic_worker_running = 0;
+-
+-/* local data storage*/
+-
+-/* local functions forward declarations*/
+-static int _dessert_periodic_add_periodic_t(dessert_periodic_t *task);
+-static void *_dessert_periodic_thread(void* arg);
+-
+-/******************************************************************************
+- *
+- * EXTERNAL / PUBLIC
+- *
+- * P E R I O D I C T A S K S
+- *
+- ******************************************************************************/
+-
+-/** Adds a delayed/periodic task to the task list
+- *
+- * @param[in] c callback to call when task is scheduled
+- * @param[in] data data to give to the callback
+- * @param[in] scheduled when should the callback be called the first time
+- * @param[in] interval how often should it be called (set to NULL if only once)
+- *
+- * @retval pointer if the callback was added successfully
+- * @retval NULL otherwise
+- *
+- * @note The <a href="http://www.gnu.org/s/libc/manual/html_node/Elapsed-Time.html#Elapsed-Time">GNU C Library Documentation</a>
+- * states about the @c tv_usec member of the @c struct @c timeval: <em>This is the
+- * rest of the elapsed time (a fraction of a second), represented as the number
+- * of microseconds. It is always less than one @a million.</em> So, to make sure
+- * this invariant is always met, consider using the provided TIMEVAL_ADD() macro.
+- *
+- * @par Description:
+- *
+- * @par Examples:
+- * @li Register a callback function to be executed every 1.5 seconds - and
+- * delay the first call to it for another 1.5 seconds:
+- * @code
+- * struct timeval interval;
+- * interval.tv_sec = 1;
+- * interval.tv_usec = 500000;
+- *
+- * struct timeval schedule;
+- * gettimeofday(&schedule, NULL);
+- * TIMEVAL_ADD(&schedule, 1, 500000);
+- *
+- * dessert_periodic_add(callback, NULL, &schedule, &interval);
+- * @endcode
+- *
+- *
+- */
+-dessert_periodic_t *dessert_periodic_add(dessert_periodiccallback_t* c,
+- void *data, const struct timeval *scheduled,
+- const struct timeval *interval) {
+- struct timeval now;
+- dessert_periodic_t *task;
+-
+- if (scheduled == NULL) {
+- gettimeofday(&now, NULL);
+- scheduled = &now;
+- }
+- assert(scheduled != NULL);
+-
+- /* sanity checks */
+- if (c == NULL) {
+- return (NULL);
+- }
+-
+- /* get task memory */
+- task = malloc(sizeof(dessert_periodic_t));
+- if (task == NULL) {
+- return NULL;
+- }
+-
+- /* copy data */
+- task->c = c;
+- task->data = data;
+- memcpy(&(task->scheduled), scheduled, sizeof(struct timeval));
+- if (interval == NULL) {
+- task->interval.tv_sec = 0;
+- task->interval.tv_usec = 0;
+- } else {
+- memcpy(&(task->interval), interval, sizeof(struct timeval));
+- }
+- task->next = NULL;
+-
+- pthread_mutex_lock(&_dessert_periodic_mutex);
+- _dessert_periodic_add_periodic_t(task);
+- pthread_mutex_unlock(&_dessert_periodic_mutex);
+-
+- return (task);
+-}
+-
+-/** Adds a delayed task to the task list
+- *
+- * This is an easier version of dessert_periodic_add() taking a single delay as parameter.
+- *
+- * @param[in] c callback to call when task is scheduled
+- * @param[in] data data to give to the callback
+- * @param[in] delay the delay in seconds
+- *
+- * %DESCRIPTION: \n
+- */
+-dessert_periodic_t *dessert_periodic_add_delayed(dessert_periodiccallback_t* c,
+- void *data, int delay) {
+- struct timeval at;
+- gettimeofday(&at, NULL);
+-
+- at.tv_sec += delay;
+-
+- return (dessert_periodic_add(c, data, &at, NULL));
+-}
+-
+-/** Removes a delayed/periodic task from the task list.
+- *
+- * @param[in] p pointer to task description
+- *
+- * @return -1 on failure, 0 if the task was removed
+- *
+- * %DESCRIPTION: \n
+- */
+-int dessert_periodic_del(dessert_periodic_t *p) {
+- dessert_periodic_t *i;
+- int x = -1;
+-
+- assert(p != NULL);
+-
+- pthread_mutex_lock(&_dessert_periodic_mutex);
+-
+- if (p == _tasklist) {
+- _tasklist = _tasklist->next;
+- x++;
+- }
+-
+- i = _tasklist;
+- while (i != NULL) {
+- if (i->next == p) {
+- i->next = p->next;
+- x++;
+- }
+- i = i->next;
+- }
+-
+- pthread_mutex_unlock(&_dessert_periodic_mutex);
+-
+- assert(x < 2);
+-
+- free(p);
+- return (x);
+-
+-}
+-
+-/******************************************************************************
+- *
+- * INTERNAL / PRIVATE
+- *
+- * P E R I O D I C T A S K S
+- *
+- ******************************************************************************/
+-
+-/** internal function to start periodic worker */
+-void _dessert_periodic_init() {
+- if (_dessert_periodic_worker_running == 0) {
+- _dessert_periodic_worker_running = 1;
+- pthread_create(&_dessert_periodic_worker, NULL,
+- _dessert_periodic_thread, NULL);
+- }
+-}
+-
+-/******************************************************************************
+- *
+- * LOCAL / PRIVATE
+- *
+- * P E R I O D I C T A S K S
+- *
+- ******************************************************************************/
+-
+-/* internal task list modifier - only call while holding _dessert_periodic_mutex */
+-static int _dessert_periodic_add_periodic_t(dessert_periodic_t *task) {
+-
+- dessert_periodic_t *i;
+-
+- /* first task? */
+- if (_tasklist == task) {
+- dessert_err("infinite loop in periodic tasklist requested - aborting!");
+- return (-1);
+- } else if (_tasklist == NULL) {
+- _tasklist = task;
+- pthread_cond_broadcast(&_dessert_periodic_changed);
+- }
+- /* is next task.... */
+- else if (task->scheduled.tv_sec < _tasklist->scheduled.tv_sec
+- || (task->scheduled.tv_sec == _tasklist->scheduled.tv_sec
+- && task->scheduled.tv_usec < _tasklist->scheduled.tv_usec)) {
+- task->next = _tasklist;
+- _tasklist = task;
+- pthread_cond_broadcast(&_dessert_periodic_changed);
+- }
+- /* search right place */
+- else {
+- i = _tasklist;
+- while (i->next != NULL && (i->next->scheduled.tv_sec
+- < task->scheduled.tv_sec || (i->next->scheduled.tv_sec
+- == task->scheduled.tv_sec && i->next->scheduled.tv_usec
+- <= task->scheduled.tv_usec))) {
+- i = i->next;
+- if (i->next == task) {
+- dessert_err("infinite loop in periodic tasklist requested - aborting!");
+- return (-1);
+- }
+- }
+- /* last or right place */
+- task->next = i->next;
+- i->next = task;
+- /* no need to tell periodic thread to check
+- again - next task has not changed */
+- }
+-
+- return (0);
+-
+-}
+-
+-/* internal worker for the task list */
+-static void *_dessert_periodic_thread(void* arg) {
+- dessert_periodic_t *next_task;
+- dessert_periodic_t task;
+- struct timeval now;
+- struct timespec ts;
+-
+- pthread_mutex_lock(&_dessert_periodic_mutex);
+-
+- while (1) {
+-
+- gettimeofday(&now, NULL);
+-
+- if (_tasklist == NULL) {
+- if (pthread_cond_wait(&_dessert_periodic_changed,
+- &_dessert_periodic_mutex) == EINVAL) {
+- dessert_err("sleeping failed in periodic scheduler - scheduler died");
+- break;
+- }
+- continue;
+- } else if (now.tv_sec < _tasklist->scheduled.tv_sec || (now.tv_sec
+- == _tasklist->scheduled.tv_sec && now.tv_usec
+- < _tasklist->scheduled.tv_usec)) {
+- ts.tv_sec = _tasklist->scheduled.tv_sec;
+- ts.tv_nsec = _tasklist->scheduled.tv_usec * 1000;
+- if (pthread_cond_timedwait(&_dessert_periodic_changed,
+- &_dessert_periodic_mutex, &ts) == EINVAL) {
+- dessert_err("sleeping failed in periodic scheduler - scheduler died");
+- break;
+- }
+- continue;
+- }
+-
+- /* run next task */
+- next_task = _tasklist;
+- _tasklist = next_task->next;
+-
+- /* safe task to local variable */
+- memcpy(&task, next_task, sizeof(dessert_periodic_t));
+-
+- /* periodic task - re-add */
+- if (next_task->interval.tv_sec != 0 || next_task->interval.tv_usec != 0) {
+- next_task->scheduled.tv_sec += next_task->interval.tv_sec;
+- next_task->scheduled.tv_usec += next_task->interval.tv_usec;
+- if (next_task->scheduled.tv_usec >= 1000000) {
+- next_task->scheduled.tv_sec += 1;
+- next_task->scheduled.tv_usec -= 1000000;
+- }
+- _dessert_periodic_add_periodic_t(next_task);
+- }
+- /* otherwise free memory */
+- else {
+- free(next_task);
+- }
+-
+- /* run the callback */
+- pthread_mutex_unlock(&_dessert_periodic_mutex);
+- /* call the callback - remove it from list if exits with nonzero code */
+- if (task.c(task.data, &(task.scheduled), &(task.interval))) {
+- dessert_periodic_del(next_task);
+- }
+- pthread_mutex_lock(&_dessert_periodic_mutex);
+- }
+-
+- pthread_mutex_unlock(&_dessert_periodic_mutex);
+- _dessert_periodic_worker_running = 0;
+-
+- return (NULL);
+-}
+diff --git a/dessert_sysiface.c b/dessert_sysiface.c
+deleted file mode 100644
+index 27c6f6c..0000000
+--- a/dessert_sysiface.c
++++ /dev/null
+@@ -1,487 +0,0 @@
+-/******************************************************************************
+- Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
+- All rights reserved.
+-
+- These sources were originally developed by Philipp Schmidt
+- at Freie Universitaet Berlin (http://www.fu-berlin.de/),
+- Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
+- (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
+- ------------------------------------------------------------------------------
+- This program is free software: you can redistribute it and/or modify it under
+- the terms of the GNU General Public License as published by the Free Software
+- Foundation, either version 3 of the License, or (at your option) any later
+- version.
+-
+- This program is distributed in the hope that it will be useful, but WITHOUT
+- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+-
+- You should have received a copy of the GNU General Public License along with
+- this program. If not, see http://www.gnu.org/licenses/ .
+- ------------------------------------------------------------------------------
+- For further information and questions please use the web site
+- http://www.des-testbed.net/
+- *******************************************************************************/
+-
+-#include "dessert_internal.h"
+-#include "dessert.h"
+-
+-#ifdef TARGET_DARWIN
+-#define TUNSIFHEAD _IOW('t', 96, int)
+-#define TUNGIFHEAD _IOR('t', 97, int)
+-#endif
+-
+-#ifdef TARGET_FREEBSD
+-#include <net/if_tun.h>
+-#endif
+-
+-#ifdef TARGET_LINUX
+-#include <linux/if_tun.h>
+-#endif
+-
+-uint8_t dessert_sysif_hwaddr[ETHER_ADDR_LEN]; // TODO unused! to be removed ??!?
+-
+-/* global data storage // P U B L I C */
+-/* nothing here - yet */
+-
+-/* global data storage // P R I V A T E */
+-dessert_sysif_t *_dessert_sysif = NULL;
+-
+-/* local data storage*/
+-dessert_sysrxcbe_t *_dessert_sysrxcblist = NULL;
+-int _dessert_sysrxcblistver = 0;
+-
+-/* internal functions forward declarations*/
+-static void *_dessert_sysif_init_thread(void* arg);
+-static int _dessert_sysif_init_getmachack(dessert_msg_t *msg, size_t len,
+- dessert_msg_proc_t *proc, dessert_sysif_t *sysif, dessert_frameid_t id);
+-
+-/******************************************************************************
+- *
+- * EXTERNAL / PUBLIC
+- *
+- * S Y S - I N T E R F A C E S
+- *
+- ******************************************************************************/
+-
+-/** Initializes the tun/tap Interface dev for des-sert.
+- * @arg *device interface name
+- * @arg flags @see DESSERT_TUN @see DESSERT_TAP @see DESSERT_MAKE_DEFSRC
+- * @return 0 -- on success
+- * @return EINVAL -- if message is broken
+- * @return EFAULT -- if interface not specified and not guessed
+- **/
+-int dessert_sysif_init(char* device, uint8_t flags) {
+-
+- char *buf;
+-
+-#ifdef TARGET_LINUX
+- struct ifreq ifr;
+-#endif
+-
+- /* initialize _dessert_sysif */
+- _dessert_sysif = malloc(sizeof(dessert_sysif_t));
+- if (_dessert_sysif == NULL)
+- return (-errno);
+- memset((void *) _dessert_sysif, 0, sizeof(dessert_sysif_t));
+- _dessert_sysif->flags = flags;
+- strncpy(_dessert_sysif->if_name, device, IF_NAMESIZE);
+- _dessert_sysif->if_name[IF_NAMESIZE - 1] = '\0';
+- pthread_mutex_init(&(_dessert_sysif->cnt_mutex), NULL);
+-
+-#ifdef TARGET_BSD
+-
+- /* open device */
+- buf = malloc(IF_NAMESIZE+6);
+- snprintf(buf, IF_NAMESIZE+6, "/dev/%s", device);
+- _dessert_sysif->fd = open(buf, O_RDWR);
+- if(_dessert_sysif->fd < 0) {
+- dessert_err("could not open interface %s using %s: %s", device, buf, strerror(errno));
+- free(buf);
+- return (-errno);
+- }
+- free(buf);
+-
+- /* set header mode on for mode tun */
+- if(flags & DESSERT_TUN) {
+- const int one = 1;
+- if(ioctl(_dessert_sysif->fd, TUNSIFHEAD, &one, sizeof one) == -1) {
+- dessert_err("setting TUNSIFHEAD failed: %s",strerror(errno));
+- goto dessert_sysif_init_err;
+- return (-errno);
+- }
+- }
+-
+-#elif TARGET_LINUX
+-
+- /* open device */
+- buf = "/dev/net/tun";
+- _dessert_sysif->fd = open(buf, O_RDWR);
+- memset(&ifr, 0, sizeof(ifr));
+- if (flags & DESSERT_TUN) {
+- ifr.ifr_flags = IFF_TUN; /* we want the service flag - no IFF_NO_PI */
+- } else {
+- ifr.ifr_flags = IFF_TAP | IFF_NO_PI; /* we want the service flag and IFF_NO_PI */
+- }
+- strcpy(ifr.ifr_name, _dessert_sysif->if_name);
+- if (ioctl(_dessert_sysif->fd, TUNSETIFF, (void *) &ifr) < 0) {
+- dessert_err("ioctl(TUNSETIFF) failed: %s", strerror(errno));
+- goto dessert_sysif_init_err;
+- return (-errno);
+- }
+- strcpy(_dessert_sysif->if_name, ifr.ifr_name);
+-
+-#else
+-
+- goto not_implemented;
+-
+-#endif
+-
+- /* check interface - abusing dessert_meshif methods */
+- _dessert_sysif->if_index = if_nametoindex(device);
+- if (!_dessert_sysif->if_index) {
+- dessert_err("interface %s - no such interface", _dessert_sysif->if_name);
+- goto dessert_sysif_init_err;
+- }
+-
+- /* do ifconfig to set the interface up - strange things happen otherwise */
+- buf = malloc(IF_NAMESIZE + 16);
+- snprintf(buf, IF_NAMESIZE + 15, "ifconfig %s up", _dessert_sysif->if_name);
+- system(buf);
+- free(buf);
+-
+- /* get hardware address in tap mode if possible */
+- if (flags & DESSERT_TAP) {
+- if (_dessert_meshif_gethwaddr((dessert_meshif_t *) _dessert_sysif) != 0) {
+- dessert_err("failed to get hwaddr of interface %s(%d) - hope src of first packet received from is it",
+- _dessert_sysif->if_name, _dessert_sysif->if_index, _dessert_sysif);
+- _dessert_sysif->flags |= _DESSERT_TAP_NOMAC;
+- dessert_sysrxcb_add(_dessert_sysif_init_getmachack, 0);
+- } else {
+- /* check whether we need to set defsrc */
+- if ((flags & DESSERT_MAKE_DEFSRC) || memcmp(dessert_l25_defsrc,
+- ether_null, ETHER_ADDR_LEN) == 0) {
+- memcpy(dessert_l25_defsrc, _dessert_sysif->hwaddr,
+- ETHER_ADDR_LEN);
+- dessert_info("set dessert_l25_defsrc to hwaddr %02x:%02x:%02x:%02x:%02x:%02x",
+- dessert_l25_defsrc[0], dessert_l25_defsrc[1],dessert_l25_defsrc[2],
+- dessert_l25_defsrc[3], dessert_l25_defsrc[4], dessert_l25_defsrc[5]);
+- }
+- }
+- }
+-
+- /* info message */
+- if (flags & DESSERT_TAP) {
+- dessert_info("starting worker thread for tap interface %s(%d) hwaddr %02x:%02x:%02x:%02x:%02x:%02x",
+- _dessert_sysif->if_name, _dessert_sysif->if_index,
+- _dessert_sysif->hwaddr[0], _dessert_sysif->hwaddr[1], _dessert_sysif->hwaddr[2],
+- _dessert_sysif->hwaddr[3], _dessert_sysif->hwaddr[4], _dessert_sysif->hwaddr[5]);
+- } else {
+- dessert_info("starting worker thread for tap interface %s(%d) fd %d",
+- _dessert_sysif->if_name, _dessert_sysif->if_index, _dessert_sysif->fd);
+- }
+-
+- /* start worker thread */
+- if (pthread_create(&(_dessert_sysif->worker), NULL,
+- _dessert_sysif_init_thread, (void *) _dessert_sysif)) {
+- dessert_err("creating worker thread failed for interface %s(%d)",
+- _dessert_sysif->if_name, _dessert_sysif->if_index);
+- goto dessert_sysif_init_err;
+- }
+-
+- /* done */
+- return (DESSERT_OK);
+-
+- dessert_sysif_init_err: close(_dessert_sysif->fd);
+-
+- return (-errno);
+-}
+-
+-/** adds a callback function to call if a packet should be injected into dessert via a tun/tap interface
+- * @arg *c callback function
+- * @arg prio priority of the function - lower first!
+- * @return DESSERT_OK on success
+- * @return -errno on error
+- **/
+-int dessert_sysrxcb_add(dessert_sysrxcb_t* c, int prio) {
+- dessert_sysrxcbe_t *cb, *i;
+-
+- cb = (struct dessert_sysrxcbe*) malloc(sizeof(struct dessert_sysrxcbe));
+- if (cb == NULL) {
+- dessert_err("failed to allocate memory for registering sys callback: %s", strerror(errno));
+- return (-errno);
+- }
+-
+- if (c == NULL) {
+- dessert_err("tried to add a null pointer as dessert_sysrxcb");
+- return (-EINVAL);
+- }
+-
+- pthread_rwlock_wrlock(&dessert_cfglock);
+-
+- cb->c = c;
+- cb->prio = prio;
+- cb->next = NULL;
+-
+- if (_dessert_sysrxcblist == NULL) {
+- _dessert_sysrxcblist = cb;
+- _dessert_sysrxcblistver++;
+-
+- pthread_rwlock_unlock(&dessert_cfglock);
+- return DESSERT_OK;
+- }
+-
+- if (_dessert_sysrxcblist->prio > cb->prio) {
+- cb->next = _dessert_sysrxcblist;
+- _dessert_sysrxcblist = cb;
+- _dessert_sysrxcblistver++;
+-
+- pthread_rwlock_unlock(&dessert_cfglock);
+- return DESSERT_OK;
+- }
+-
+- /* find right place for callback */
+- for (i = _dessert_sysrxcblist; i->next != NULL && i->next->prio <= cb->prio; i
+- = i->next)
+- ;
+-
+- /* insert it */
+- cb->next = i->next;
+- i->next = cb;
+- _dessert_sysrxcblistver++;
+-
+- pthread_rwlock_unlock(&dessert_cfglock);
+- return DESSERT_OK;
+-}
+-
+-/** removes all occurrences of the callback function from the list of callbacks.
+- * @arg c callback function
+- * @return DESSERT_OK on success, DESSERT_ERR on error
+- **/
+-int dessert_sysrxcb_del(dessert_sysrxcb_t* c) {
+- int count = 0;
+- dessert_sysrxcbe_t *i, *last;
+-
+- pthread_rwlock_wrlock(&dessert_cfglock);
+-
+- if (_dessert_sysrxcblist == NULL) {
+- goto dessert_sysrxcb_del_out;
+- }
+-
+- while (_dessert_sysrxcblist->c == c) {
+- count++;
+- i = _dessert_sysrxcblist;
+- _dessert_sysrxcblist = _dessert_sysrxcblist->next;
+- free(i);
+- if (_dessert_sysrxcblist == NULL) {
+- goto dessert_sysrxcb_del_out;
+- }
+- }
+-
+- for (i = _dessert_sysrxcblist; i->next != NULL; i = i->next) {
+- if (i->c == c) {
+- count++;
+- last->next = i->next;
+- free(i);
+- i = last;
+- }
+- last = i;
+- }
+-
+- dessert_sysrxcb_del_out: _dessert_sysrxcblistver++;
+- pthread_rwlock_unlock(&dessert_cfglock);
+- return ((count > 0) ? DESSERT_OK : DESSERT_ERR);
+-
+-}
+-
+-/** sends a packet via tun/tap interface to the kernel
+- * @arg *msg message to send
+- * @return DESSERT_OK on success
+- * @return -EIO if message failed to be sent
+- **/
+-int dessert_syssend_msg(dessert_msg_t *msg) {
+- struct ether_header *eth;
+- size_t eth_len;
+-
+- eth_len = dessert_msg_ethdecap(msg, &eth);
+- if (eth_len == -1) {
+- return (-EIO);
+- }
+- dessert_syssend(eth, eth_len);
+- free(eth);
+-
+- return DESSERT_OK;
+-}
+-
+-/** sends a packet via tun/tap interface to the kernel
+- * @arg *eth message to send
+- * @arg len length of message to send
+- * @return DESSERT_OK on success
+- * @return -EIO if message failed to be sent
+- **/
+-int dessert_syssend(const struct ether_header *eth, size_t len) {
+- ssize_t res = 0;
+-
+- if (_dessert_sysif == NULL)
+- return (-EIO);
+-
+- if (_dessert_sysif->flags & DESSERT_TUN) {
+- eth
+- = (struct ether_header *) (((uint8_t *) eth) + (ETHER_ADDR_LEN
+- * 2));
+- len -= (ETHER_ADDR_LEN * 2);
+- }
+-
+- res = write(_dessert_sysif->fd, (const void *) eth, len);
+-
+- if (res == len) {
+- pthread_mutex_lock(&(_dessert_sysif->cnt_mutex));
+- _dessert_sysif->opkts++;
+- _dessert_sysif->obytes += res;
+- pthread_mutex_unlock(&(_dessert_sysif->cnt_mutex));
+- return (DESSERT_OK);
+- } else {
+-
+- return (-EIO);
+- }
+-}
+-
+-/******************************************************************************
+- *
+- * INTERNAL / PRIVATE
+- *
+- * S Y S - I N T E R F A C E S
+- *
+- ******************************************************************************/
+-
+-/* nothing here - yet */
+-
+-/******************************************************************************
+- *
+- * LOCAL
+- *
+- * S Y S - I N T E R F A C E S
+- *
+- ******************************************************************************/
+-
+-/** internal callback which gets registered if we can't find out mac address of tap interface */
+-static int _dessert_sysif_init_getmachack(dessert_msg_t *msg, size_t len,
+- dessert_msg_proc_t *proc, dessert_sysif_t *sysif, dessert_frameid_t id) {
+-
+- struct ether_header *eth;
+- dessert_msg_ethdecap(msg, &eth);
+-
+- /* hack to get the hardware address */
+- if (sysif->flags & _DESSERT_TAP_NOMAC) {
+- /* copy from first packet received */
+- memcpy(sysif->hwaddr, eth->ether_shost, ETHER_ADDR_LEN);
+- dessert_info("guessed hwaddr for %s: %02x:%02x:%02x:%02x:%02x:%02x", sysif->if_name,
+- sysif->hwaddr[0], sysif->hwaddr[1], sysif->hwaddr[2],
+- sysif->hwaddr[3], sysif->hwaddr[4], sysif->hwaddr[5]);
+- /* check whether we need to set defsrc */
+- if ((sysif->flags & DESSERT_MAKE_DEFSRC) || memcmp(dessert_l25_defsrc,
+- ether_null, ETHER_ADDR_LEN) == 0) {
+- memcpy(dessert_l25_defsrc, sysif->hwaddr, ETHER_ADDR_LEN);
+- dessert_info("set dessert_l25_defsrc to hwaddr %02x:%02x:%02x:%02x:%02x:%02x",
+- dessert_l25_defsrc[0], dessert_l25_defsrc[1],dessert_l25_defsrc[2],
+- dessert_l25_defsrc[3], dessert_l25_defsrc[4], dessert_l25_defsrc[5]);
+- }
+- sysif->flags &= ~_DESSERT_TAP_NOMAC;
+- }
+-
+- /* unregister me */
+- dessert_sysrxcb_del(_dessert_sysif_init_getmachack);
+-
+- return DESSERT_MSG_KEEP;
+-}
+-
+-/** internal packet processing thread body */
+-static void *_dessert_sysif_init_thread(void* arg) {
+-
+- dessert_sysif_t *sysif = (dessert_sysif_t *) arg;
+- size_t len;
+- size_t buflen = ETHER_MAX_LEN;
+- char buf[buflen];
+- dessert_msg_proc_t proc;
+- dessert_frameid_t id;
+- dessert_sysrxcbe_t *cb;
+- int res;
+- int ex = 0;
+- dessert_sysrxcb_t **cbl = NULL;
+- int cbllen = 0;
+- int cblcur = -1;
+- int cblver = -1;
+-
+- while (!ex) {
+-
+- memset(buf, 0, buflen);
+-
+- if (sysif->flags & DESSERT_TUN) {
+- len = read((sysif->fd), buf + (ETHER_ADDR_LEN * 2), buflen
+- - (ETHER_ADDR_LEN * 2));
+- } else {
+- len = read((sysif->fd), buf, buflen);
+- }
+-
+- if (len == -1) {
+- dessert_debug("got %s while reading on %s (fd %d) - is the sys (tun/tap) interface up?", strerror(errno), sysif->if_name, sysif->fd);
+- sleep(1);
+- continue;
+- }
+- if (sysif->flags & DESSERT_TUN) {
+- len += (ETHER_ADDR_LEN * 2);
+- }
+-
+- /* copy callbacks to internal list to release dessert_cfglock before invoking callbacks*/
+- pthread_rwlock_rdlock(&dessert_cfglock);
+- if (cblver < _dessert_sysrxcblistver) {
+- /* callback list changed - rebuild it */
+- cbllen = 0;
+- for (cb = _dessert_sysrxcblist; cb != NULL; cb = cb->next)
+- cbllen++;
+- cbl = realloc(cbl, cbllen * sizeof(dessert_sysrxcb_t *));
+- if (cbl == NULL) {
+- dessert_err("failed to allocate memory for internal callback list");
+- pthread_rwlock_unlock(&dessert_cfglock);
+- return (NULL);
+- }
+-
+- cblcur = 0;
+- for (cb = _dessert_sysrxcblist; cb != NULL; cb = cb->next)
+- cbl[cblcur++] = cb->c;
+-
+- cblver = _dessert_sysrxcblistver;
+- }
+- pthread_rwlock_unlock(&dessert_cfglock);
+-
+- /* generate frame id */
+- id = _dessert_newframeid();
+-
+- /* count packet */
+- pthread_mutex_lock(&(sysif->cnt_mutex));
+- sysif->ipkts++;
+- sysif->ibytes += len;
+- pthread_mutex_unlock(&(sysif->cnt_mutex));
+-
+- /* call the interested */
+- res = 0;
+- cblcur = 0;
+- memset(&proc, 0, DESSERT_MSGPROCLEN);
+- dessert_msg_t *msg;
+- while (res > DESSERT_MSG_DROP && cblcur < cbllen) {
+- if (dessert_msg_ethencap((struct ether_header *) buf, len, &msg)
+- < 0) {
+- dessert_err("failed to encapsulate ethernet frame on host-to-network-pipeline: %s", errno);
+- };
+- res = cbl[cblcur++](msg, len, &proc, sysif, id);
+- }
+- dessert_msg_destroy(msg);
+-
+- }
+- dessert_info("stopped reading on %s (fd %d): %s", sysif->if_name, sysif->fd, strerror(errno));
+-
+- free(cbl);
+- close(sysif->fd);
+-
+- return (NULL);
+-}
+diff --git a/doxygen-include.am b/doxygen-include.am
+new file mode 100644
+index 0000000..ab87a45
+--- /dev/null
++++ b/doxygen-include.am
+@@ -0,0 +1,203 @@
++# ---------------------------------------------------------------------------
++# Licensed to the Apache Software Foundation (ASF) under one or more
++# contributor license agreements. See the NOTICE file distributed with
++# this work for additional information regarding copyright ownership.
++# The ASF licenses this file to You under the Apache License, Version 2.0
++# (the "License"); you may not use this file except in compliance with
++# the License. You may obtain a copy of the License at
++#
++# http://www.apache.org/licenses/LICENSE-2.0
++#
++# Unless required by applicable law or agreed to in writing, software
++# distributed under the License is distributed on an "AS IS" BASIS,
++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++# See the License for the specific language governing permissions and
++# limitations under the License.
++# ---------------------------------------------------------------------------
++
++# Copyright (C) 2004 Oren Ben-Kiki
++# This file is distributed under the same terms as the Automake macro files.
++
++# Generate automatic documentation using Doxygen. Goals and variables values
++# are controlled by the various DX_COND_??? conditionals set by autoconf.
++#
++# The provided goals are:
++# doxygen-doc: Generate all doxygen documentation.
++# doxygen-run: Run doxygen, which will generate some of the documentation
++# (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post
++# processing required for the rest of it (PS, PDF, and some MAN).
++# doxygen-man: Rename some doxygen generated man pages.
++# doxygen-ps: Generate doxygen PostScript documentation.
++# doxygen-pdf: Generate doxygen PDF documentation.
++#
++# Note that by default these are not integrated into the automake goals. If
++# doxygen is used to generate man pages, you can achieve this integration by
++# setting man3_MANS to the list of man pages generated and then adding the
++# dependency:
++#
++# $(man3_MANS): doxygen-doc
++#
++# This will cause make to run doxygen and generate all the documentation.
++#
++# The following variable is intended for use in Makefile.am:
++#
++# DX_CLEANFILES = everything to clean.
++#
++# This is usually added to MOSTLYCLEANFILES.
++
++## --------------------------------- ##
++## Format-independent Doxygen rules. ##
++## --------------------------------- ##
++
++if DX_COND_doc
++
++## ------------------------------- ##
++## Rules specific for HTML output. ##
++## ------------------------------- ##
++
++if DX_COND_html
++
++DX_CLEAN_HTML = @DX_DOCDIR@/html
++
++endif DX_COND_html
++
++## ------------------------------ ##
++## Rules specific for CHM output. ##
++## ------------------------------ ##
++
++if DX_COND_chm
++
++DX_CLEAN_CHM = @DX_DOCDIR@/chm
++
++if DX_COND_chi
++
++DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi
++
++endif DX_COND_chi
++
++endif DX_COND_chm
++
++## ------------------------------ ##
++## Rules specific for MAN output. ##
++## ------------------------------ ##
++
++if DX_COND_man
++
++DX_CLEAN_MAN = @DX_DOCDIR@/man
++
++endif DX_COND_man
++
++## ------------------------------ ##
++## Rules specific for RTF output. ##
++## ------------------------------ ##
++
++if DX_COND_rtf
++
++DX_CLEAN_RTF = @DX_DOCDIR@/rtf
++
++endif DX_COND_rtf
++
++## ------------------------------ ##
++## Rules specific for XML output. ##
++## ------------------------------ ##
++
++if DX_COND_xml
++
++DX_CLEAN_XML = @DX_DOCDIR@/xml
++
++endif DX_COND_xml
++
++## ----------------------------- ##
++## Rules specific for PS output. ##
++## ----------------------------- ##
++
++if DX_COND_ps
++
++DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps
++
++DX_PS_GOAL = doxygen-ps
++
++doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps
++
++@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag
++ cd @DX_DOCDIR@/latex; \
++ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \
++ $(DX_LATEX) refman.tex; \
++ $(MAKEINDEX_PATH) refman.idx; \
++ $(DX_LATEX) refman.tex; \
++ countdown=5; \
++ while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \
++ refman.log > /dev/null 2>&1 \
++ && test $$countdown -gt 0; do \
++ $(DX_LATEX) refman.tex; \
++ countdown=`expr $$countdown - 1`; \
++ done; \
++ $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi
++
++endif DX_COND_ps
++
++## ------------------------------ ##
++## Rules specific for PDF output. ##
++## ------------------------------ ##
++
++if DX_COND_pdf
++
++DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf
++
++DX_PDF_GOAL = doxygen-pdf
++
++doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf
++
++@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag
++ cd @DX_DOCDIR@/latex; \
++ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \
++ $(DX_PDFLATEX) refman.tex; \
++ $(DX_MAKEINDEX) refman.idx; \
++ $(DX_PDFLATEX) refman.tex; \
++ countdown=5; \
++ while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \
++ refman.log > /dev/null 2>&1 \
++ && test $$countdown -gt 0; do \
++ $(DX_PDFLATEX) refman.tex; \
++ countdown=`expr $$countdown - 1`; \
++ done; \
++ mv refman.pdf ../@PACKAGE@.pdf
++
++endif DX_COND_pdf
++
++## ------------------------------------------------- ##
++## Rules specific for LaTeX (shared for PS and PDF). ##
++## ------------------------------------------------- ##
++
++if DX_COND_latex
++
++DX_CLEAN_LATEX = @DX_DOCDIR@/latex
++
++endif DX_COND_latex
++
++.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL)
++
++.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL)
++
++doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag
++
++doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL)
++
++@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS)
++ rm -rf @DX_DOCDIR@
++ $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG)
++
++DX_CLEANFILES = \
++ @DX_DOCDIR@/@PACKAGE@.tag \
++ -r \
++ $(DX_CLEAN_HTML) \
++ $(DX_CLEAN_CHM) \
++ $(DX_CLEAN_CHI) \
++ $(DX_CLEAN_MAN) \
++ $(DX_CLEAN_RTF) \
++ $(DX_CLEAN_XML) \
++ $(DX_CLEAN_PS) \
++ $(DX_CLEAN_PDF) \
++ $(DX_CLEAN_LATEX)
++
++endif DX_COND_doc
+diff --git a/include/Makefile.am b/include/Makefile.am
+new file mode 100644
+index 0000000..f65afe7
+--- /dev/null
++++ b/include/Makefile.am
+@@ -0,0 +1,3 @@
++
++nobase_include_HEADERS = dessert/dessert.h dessert/utlist.h
++
+diff --git a/include/Makefile.in b/include/Makefile.in
+new file mode 100644
+index 0000000..6ccd9e7
+--- /dev/null
++++ b/include/Makefile.in
+@@ -0,0 +1,489 @@
++# Makefile.in generated by automake 1.11 from Makefile.am.
++# @configure_input@
++
++# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
++# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
++# Inc.
++# This Makefile.in is free software; the Free Software Foundation
++# gives unlimited permission to copy and/or distribute it,
++# with or without modifications, as long as this notice is preserved.
++
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
++# PARTICULAR PURPOSE.
++
++@SET_MAKE@
++
++VPATH = @srcdir@
++pkgdatadir = $(datadir)/@PACKAGE@
++pkgincludedir = $(includedir)/@PACKAGE@
++pkglibdir = $(libdir)/@PACKAGE@
++pkglibexecdir = $(libexecdir)/@PACKAGE@
++am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
++install_sh_DATA = $(install_sh) -c -m 644
++install_sh_PROGRAM = $(install_sh) -c
++install_sh_SCRIPT = $(install_sh) -c
++INSTALL_HEADER = $(INSTALL_DATA)
++transform = $(program_transform_name)
++NORMAL_INSTALL = :
++PRE_INSTALL = :
++POST_INSTALL = :
++NORMAL_UNINSTALL = :
++PRE_UNINSTALL = :
++POST_UNINSTALL = :
++build_triplet = @build@
++host_triplet = @host@
++subdir = include
++DIST_COMMON = $(nobase_include_HEADERS) $(srcdir)/Makefile.am \
++ $(srcdir)/Makefile.in
++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
++am__aclocal_m4_deps = $(top_srcdir)/m4/ac_doxygen.m4 \
++ $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \
++ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
++ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
++ $(top_srcdir)/m4/net-snmp.m4 $(top_srcdir)/m4/pcap.m4 \
++ $(top_srcdir)/configure.ac
++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
++ $(ACLOCAL_M4)
++mkinstalldirs = $(install_sh) -d
++CONFIG_HEADER = $(top_builddir)/config.h
++CONFIG_CLEAN_FILES =
++CONFIG_CLEAN_VPATH_FILES =
++SOURCES =
++DIST_SOURCES =
++am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
++am__vpath_adj = case $$p in \
++ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
++ *) f=$$p;; \
++ esac;
++am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
++am__install_max = 40
++am__nobase_strip_setup = \
++ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
++am__nobase_strip = \
++ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
++am__nobase_list = $(am__nobase_strip_setup); \
++ for p in $$list; do echo "$$p $$p"; done | \
++ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
++ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
++ if (++n[$$2] == $(am__install_max)) \
++ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
++ END { for (dir in files) print dir, files[dir] }'
++am__base_list = \
++ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
++ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
++am__installdirs = "$(DESTDIR)$(includedir)"
++HEADERS = $(nobase_include_HEADERS)
++ETAGS = etags
++CTAGS = ctags
++DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
++ACLOCAL = @ACLOCAL@
++AMTAR = @AMTAR@
++AR = @AR@
++AUTOCONF = @AUTOCONF@
++AUTOHEADER = @AUTOHEADER@
++AUTOMAKE = @AUTOMAKE@
++AWK = @AWK@
++CC = @CC@
++CCDEPMODE = @CCDEPMODE@
++CFLAGS = @CFLAGS@
++CPP = @CPP@
++CPPFLAGS = @CPPFLAGS@
++CYGPATH_W = @CYGPATH_W@
++DEFS = @DEFS@
++DEPDIR = @DEPDIR@
++DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@
++DSYMUTIL = @DSYMUTIL@
++DUMPBIN = @DUMPBIN@
++DX_CONFIG = @DX_CONFIG@
++DX_DOCDIR = @DX_DOCDIR@
++DX_DOT = @DX_DOT@
++DX_DOXYGEN = @DX_DOXYGEN@
++DX_DVIPS = @DX_DVIPS@
++DX_EGREP = @DX_EGREP@
++DX_ENV = @DX_ENV@
++DX_FLAG_chi = @DX_FLAG_chi@
++DX_FLAG_chm = @DX_FLAG_chm@
++DX_FLAG_doc = @DX_FLAG_doc@
++DX_FLAG_dot = @DX_FLAG_dot@
++DX_FLAG_html = @DX_FLAG_html@
++DX_FLAG_man = @DX_FLAG_man@
++DX_FLAG_pdf = @DX_FLAG_pdf@
++DX_FLAG_ps = @DX_FLAG_ps@
++DX_FLAG_rtf = @DX_FLAG_rtf@
++DX_FLAG_xml = @DX_FLAG_xml@
++DX_HHC = @DX_HHC@
++DX_LATEX = @DX_LATEX@
++DX_MAKEINDEX = @DX_MAKEINDEX@
++DX_PDFLATEX = @DX_PDFLATEX@
++DX_PERL = @DX_PERL@
++DX_PROJECT = @DX_PROJECT@
++ECHO_C = @ECHO_C@
++ECHO_N = @ECHO_N@
++ECHO_T = @ECHO_T@
++EGREP = @EGREP@
++EXEEXT = @EXEEXT@
++FGREP = @FGREP@
++GREP = @GREP@
++INSTALL = @INSTALL@
++INSTALL_DATA = @INSTALL_DATA@
++INSTALL_PROGRAM = @INSTALL_PROGRAM@
++INSTALL_SCRIPT = @INSTALL_SCRIPT@
++INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
++LD = @LD@
++LDFLAGS = @LDFLAGS@
++LIBDESSERT_LIBRARY_VERSION = @LIBDESSERT_LIBRARY_VERSION@
++LIBOBJS = @LIBOBJS@
++LIBS = @LIBS@
++LIBTOOL = @LIBTOOL@
++LIPO = @LIPO@
++LN_S = @LN_S@
++LTLIBOBJS = @LTLIBOBJS@
++MAKEINFO = @MAKEINFO@
++MKDIR_P = @MKDIR_P@
++NM = @NM@
++NMEDIT = @NMEDIT@
++OBJDUMP = @OBJDUMP@
++OBJEXT = @OBJEXT@
++OTOOL = @OTOOL@
++OTOOL64 = @OTOOL64@
++PACKAGE = @PACKAGE@
++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
++PACKAGE_NAME = @PACKAGE_NAME@
++PACKAGE_STRING = @PACKAGE_STRING@
++PACKAGE_TARNAME = @PACKAGE_TARNAME@
++PACKAGE_URL = @PACKAGE_URL@
++PACKAGE_VERSION = @PACKAGE_VERSION@
++PATH_SEPARATOR = @PATH_SEPARATOR@
++PCAP_CFLAGS = @PCAP_CFLAGS@
++PCAP_CFLGAS = @PCAP_CFLGAS@
++PCAP_LIBS = @PCAP_LIBS@
++PTHREAD_CC = @PTHREAD_CC@
++PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
++PTHREAD_LIBS = @PTHREAD_LIBS@
++RANLIB = @RANLIB@
++SED = @SED@
++SET_MAKE = @SET_MAKE@
++SHELL = @SHELL@
++SNMP_CFLAGS = @SNMP_CFLAGS@
++SNMP_CFLGAS = @SNMP_CFLGAS@
++SNMP_LIBS = @SNMP_LIBS@
++STRIP = @STRIP@
++VERSION = @VERSION@
++abs_builddir = @abs_builddir@
++abs_srcdir = @abs_srcdir@
++abs_top_builddir = @abs_top_builddir@
++abs_top_srcdir = @abs_top_srcdir@
++ac_ct_CC = @ac_ct_CC@
++ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
++am__include = @am__include@
++am__leading_dot = @am__leading_dot@
++am__quote = @am__quote@
++am__tar = @am__tar@
++am__untar = @am__untar@
++ax_pthread_config = @ax_pthread_config@
++bindir = @bindir@
++build = @build@
++build_alias = @build_alias@
++build_cpu = @build_cpu@
++build_os = @build_os@
++build_vendor = @build_vendor@
++builddir = @builddir@
++datadir = @datadir@
++datarootdir = @datarootdir@
++docdir = @docdir@
++dvidir = @dvidir@
++exec_prefix = @exec_prefix@
++host = @host@
++host_alias = @host_alias@
++host_cpu = @host_cpu@
++host_os = @host_os@
++host_vendor = @host_vendor@
++htmldir = @htmldir@
++includedir = @includedir@
++infodir = @infodir@
++install_sh = @install_sh@
++libdir = @libdir@
++libexecdir = @libexecdir@
++localedir = @localedir@
++localstatedir = @localstatedir@
++lt_ECHO = @lt_ECHO@
++mandir = @mandir@
++mkdir_p = @mkdir_p@
++oldincludedir = @oldincludedir@
++pdfdir = @pdfdir@
++prefix = @prefix@
++program_transform_name = @program_transform_name@
++psdir = @psdir@
++sbindir = @sbindir@
++sharedstatedir = @sharedstatedir@
++srcdir = @srcdir@
++sysconfdir = @sysconfdir@
++target_alias = @target_alias@
++top_build_prefix = @top_build_prefix@
++top_builddir = @top_builddir@
++top_srcdir = @top_srcdir@
++nobase_include_HEADERS = dessert/dessert.h dessert/utlist.h
++all: all-am
++
++.SUFFIXES:
++$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
++ @for dep in $?; do \
++ case '$(am__configure_deps)' in \
++ *$$dep*) \
++ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
++ && { if test -f $@; then exit 0; else break; fi; }; \
++ exit 1;; \
++ esac; \
++ done; \
++ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/Makefile'; \
++ $(am__cd) $(top_srcdir) && \
++ $(AUTOMAKE) --gnu include/Makefile
++.PRECIOUS: Makefile
++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
++ @case '$?' in \
++ *config.status*) \
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
++ *) \
++ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
++ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
++ esac;
++
++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++
++$(top_srcdir)/configure: $(am__configure_deps)
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++$(ACLOCAL_M4): $(am__aclocal_m4_deps)
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++$(am__aclocal_m4_deps):
++
++mostlyclean-libtool:
++ -rm -f *.lo
++
++clean-libtool:
++ -rm -rf .libs _libs
++install-nobase_includeHEADERS: $(nobase_include_HEADERS)
++ @$(NORMAL_INSTALL)
++ test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
++ @list='$(nobase_include_HEADERS)'; test -n "$(includedir)" || list=; \
++ $(am__nobase_list) | while read dir files; do \
++ xfiles=; for file in $$files; do \
++ if test -f "$$file"; then xfiles="$$xfiles $$file"; \
++ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \
++ test -z "$$xfiles" || { \
++ test "x$$dir" = x. || { \
++ echo "$(MKDIR_P) '$(DESTDIR)$(includedir)/$$dir'"; \
++ $(MKDIR_P) "$(DESTDIR)$(includedir)/$$dir"; }; \
++ echo " $(INSTALL_HEADER) $$xfiles '$(DESTDIR)$(includedir)/$$dir'"; \
++ $(INSTALL_HEADER) $$xfiles "$(DESTDIR)$(includedir)/$$dir" || exit $$?; }; \
++ done
++
++uninstall-nobase_includeHEADERS:
++ @$(NORMAL_UNINSTALL)
++ @list='$(nobase_include_HEADERS)'; test -n "$(includedir)" || list=; \
++ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \
++ test -n "$$files" || exit 0; \
++ echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \
++ cd "$(DESTDIR)$(includedir)" && rm -f $$files
++
++ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
++ unique=`for i in $$list; do \
++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
++ done | \
++ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
++ END { if (nonempty) { for (i in files) print i; }; }'`; \
++ mkid -fID $$unique
++tags: TAGS
++
++TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
++ $(TAGS_FILES) $(LISP)
++ set x; \
++ here=`pwd`; \
++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
++ unique=`for i in $$list; do \
++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
++ done | \
++ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
++ END { if (nonempty) { for (i in files) print i; }; }'`; \
++ shift; \
++ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
++ test -n "$$unique" || unique=$$empty_fix; \
++ if test $$# -gt 0; then \
++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
++ "$$@" $$unique; \
++ else \
++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
++ $$unique; \
++ fi; \
++ fi
++ctags: CTAGS
++CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
++ $(TAGS_FILES) $(LISP)
++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
++ unique=`for i in $$list; do \
++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
++ done | \
++ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
++ END { if (nonempty) { for (i in files) print i; }; }'`; \
++ test -z "$(CTAGS_ARGS)$$unique" \
++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
++ $$unique
++
++GTAGS:
++ here=`$(am__cd) $(top_builddir) && pwd` \
++ && $(am__cd) $(top_srcdir) \
++ && gtags -i $(GTAGS_ARGS) "$$here"
++
++distclean-tags:
++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
++
++distdir: $(DISTFILES)
++ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++ list='$(DISTFILES)'; \
++ dist_files=`for file in $$list; do echo $$file; done | \
++ sed -e "s|^$$srcdirstrip/||;t" \
++ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
++ case $$dist_files in \
++ */*) $(MKDIR_P) `echo "$$dist_files" | \
++ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
++ sort -u` ;; \
++ esac; \
++ for file in $$dist_files; do \
++ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
++ if test -d $$d/$$file; then \
++ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
++ if test -d "$(distdir)/$$file"; then \
++ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++ fi; \
++ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
++ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
++ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++ fi; \
++ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
++ else \
++ test -f "$(distdir)/$$file" \
++ || cp -p $$d/$$file "$(distdir)/$$file" \
++ || exit 1; \
++ fi; \
++ done
++check-am: all-am
++check: check-am
++all-am: Makefile $(HEADERS)
++installdirs:
++ for dir in "$(DESTDIR)$(includedir)"; do \
++ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
++ done
++install: install-am
++install-exec: install-exec-am
++install-data: install-data-am
++uninstall: uninstall-am
++
++install-am: all-am
++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
++
++installcheck: installcheck-am
++install-strip:
++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
++ `test -z '$(STRIP)' || \
++ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
++mostlyclean-generic:
++
++clean-generic:
++
++distclean-generic:
++ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
++ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
++
++maintainer-clean-generic:
++ @echo "This command is intended for maintainers to use"
++ @echo "it deletes files that may require special tools to rebuild."
++clean: clean-am
++
++clean-am: clean-generic clean-libtool mostlyclean-am
++
++distclean: distclean-am
++ -rm -f Makefile
++distclean-am: clean-am distclean-generic distclean-tags
++
++dvi: dvi-am
++
++dvi-am:
++
++html: html-am
++
++html-am:
++
++info: info-am
++
++info-am:
++
++install-data-am: install-nobase_includeHEADERS
++
++install-dvi: install-dvi-am
++
++install-dvi-am:
++
++install-exec-am:
++
++install-html: install-html-am
++
++install-html-am:
++
++install-info: install-info-am
++
++install-info-am:
++
++install-man:
++
++install-pdf: install-pdf-am
++
++install-pdf-am:
++
++install-ps: install-ps-am
++
++install-ps-am:
++
++installcheck-am:
++
++maintainer-clean: maintainer-clean-am
++ -rm -f Makefile
++maintainer-clean-am: distclean-am maintainer-clean-generic
++
++mostlyclean: mostlyclean-am
++
++mostlyclean-am: mostlyclean-generic mostlyclean-libtool
++
++pdf: pdf-am
++
++pdf-am:
++
++ps: ps-am
++
++ps-am:
++
++uninstall-am: uninstall-nobase_includeHEADERS
++
++.MAKE: install-am install-strip
++
++.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
++ clean-libtool ctags distclean distclean-generic \
++ distclean-libtool distclean-tags distdir dvi dvi-am html \
++ html-am info info-am install install-am install-data \
++ install-data-am install-dvi install-dvi-am install-exec \
++ install-exec-am install-html install-html-am install-info \
++ install-info-am install-man install-nobase_includeHEADERS \
++ install-pdf install-pdf-am install-ps install-ps-am \
++ install-strip installcheck installcheck-am installdirs \
++ maintainer-clean maintainer-clean-generic mostlyclean \
++ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
++ tags uninstall uninstall-am uninstall-nobase_includeHEADERS
++
++
++# Tell versions [3.59,3.63) of GNU make to not export all variables.
++# Otherwise a system limit (for SysV at least) may be exceeded.
++.NOEXPORT:
+diff --git a/include/dessert/dessert.h b/include/dessert/dessert.h
+new file mode 100644
+index 0000000..9b7a7d9
+--- /dev/null
++++ b/include/dessert/dessert.h
+@@ -0,0 +1,1334 @@
++/***************************************************************************//**
++ @file
++
++ @page license License
++
++ @brief Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB). \n
++ All rights reserved. \n
++
++ These sources were originally developed by Philipp Schmidt
++ at Freie Universitaet Berlin (http://www.fu-berlin.de/),
++ Computer Systems and Telematics / Distributed, Embedded Systems (DES) group \n
++ (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/) \n
++ -----------------------------------------------------------------------------\n
++ This program is free software: you can redistribute it and/or modify it under
++ the terms of the GNU General Public License as published by the Free Software
++ Foundation, either version 3 of the License, or (at your option) any later
++ version. \n
++ \n
++ This program is distributed in the hope that it will be useful, but WITHOUT
++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
++ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n
++ \n
++ You should have received a copy of the GNU General Public License along with
++ this program. If not, see http://www.gnu.org/licenses/ . \n
++ -----------------------------------------------------------------------------\n
++ For further information and questions please use the web site \n
++ http://www.des-testbed.net/
++*******************************************************************************/
++
++/***************************************************************************//**
++ *
++ * @mainpage DES-SERT
++ *
++ *
++ * @section intro_sec Introduction
++ *
++ * DES-SERT, the DES Simple and Extensible Routing-Framework for Testbeds,
++ * is a framework designed to assist researchers implementing routing
++ * protocols for testbeds.
++ *
++ * DES-SERT enables the implementation of routing protocols on top of
++ * Ethernet via an underlay (Layer 2.5) in user space.
++ * It introduces an abstraction from OS specific issues and provides
++ * functionality and data structures to implement proactive, reactive,
++ * and hybrid routing protocols.
++
++ * While generally usable in many application scenarios, it is primarily
++ * used in DES-Mesh (http://www.des-testbed.net/), the multi-transceiver
++ * wireless mesh network testbed part of the DES-Testbed at Freie
++ * Universitaet Berlin, Germany.
++ *
++ * @section arch_sec DES-SERT Architecture
++ *
++ * DES-SERT introduces some concepts to implement routing protocols.
++ * When implementing a routing protocol with DES-SERT, you should be
++ * familiar with these concepts to structure and tailor your implementation.
++ *
++ *
++ * @subsection messages_subsec DES-SERT Messages
++ *
++ * Every packet you send or receive on the mesh is represented as a
++ * DES-SERT message. From a programmers point of view, a DES-SERT message
++ * is just a C-structure:
++ *
++ * @code
++ * typedef struct __attribute__ ((__packed__)) dessert_msg {
++ * struct ether_header l2h;
++ * char proto[DESSERT_PROTO_STRLEN];
++ * uint8_t ver;
++ * uint8_t flags;
++ * union {
++ * uint32_t u32;
++ * struct __attribute__ ((__packed__)) {
++ * uint8_t ttl;
++ * uint8_t u8;
++ * uint16_t u16;
++ * };
++ * };
++ * uint16_t hlen;
++ * uint16_t plen;
++ * } dessert_msg_t;
++ * @endcode
++ *
++ * Every message sent via the underlay carries this structure as a packet
++ * header. All data in a "dessert_msg" is stored in network byte order.
++ * DES-SERT tries to care as automatically as possible of this structure.
++ * Nevertheless you will have to care at least about: "l2h.ether_dhost" and
++ * "ttl".
++ *
++ * If you need to send some data along with every packet, e.g. some kind of
++ * metric or cost your routing protocol uses, you should try to fit this
++ * data into the "u8", "u16" and the upper 4 bits of the "flags" field.
++ * These fields will never be touched by DES-SERT except on initialization
++ * via "dessert_msg_new".
++ *
++ * Because just a C-structure is not really usable as a packet, there are some
++ * utility functions around - please have a look around in "dessert.h" and the
++ * doxygen documentation. The most important ones are: "dessert_msg_new" and
++ * "dessert_msg_destroy", which do not simply allocate memory for a DES-SERT
++ * message, but for a whole packet of maximum size and initialize the
++ * structures for further packet construction/processing.
++ *
++ * @code
++ * int dessert_msg_new(dessert_msg_t **msgout);
++ *
++ * void dessert_msg_destroy(dessert_msg_t* msg);
++ * @endcode
++ *
++ *
++ * @subsection extensions_subsec DES-SERT Extensions
++ *
++ * A DES-SERT extension is some structure used to piggyback data on a
++ * DES-SERT message. It consists of a 8-bit user supplied type field (with
++ * some reserved values), an 8-bit length field and user supplied data of
++ * arbitrary length of 253 bytes at most.
++ *
++ * It can be added to a message via dessert_msg_addext(), retrieved via
++ * dessert_msg_getext() and removed via dessert_msg_delext().
++ *
++ * @code
++ * int dessert_msg_addext(dessert_msg_t* msg, dessert_ext_t** ext,
++ * uint8_t type, size_t len);
++ *
++ * int dessert_msg_delext(dessert_msg_t *msg, dessert_ext_t *ext);
++ *
++ * int dessert_msg_getext(const dessert_msg_t* msg, dessert_ext_t** ext,
++ * uint8_t type, int index);
++ *
++ * @endcode
++ *
++ * It is recommended not to put single data fields in extensions, but
++ * combine semantically related data in a struct and attach this struct
++ * as an extension because every extension carried introduces an 16-bit
++ * overhead to the packet.
++ *
++ *
++ * @subsection pipelines_subsec Processing Pipelines
++ *
++ * Routing algorithms are often split up in several parts like packet
++ * validation, loop-detection or routing table lookup.
++ * To implement these as independent and clear as possible, DES-SERT enables
++ * you to split up your packet processing in as many parts as you like.
++ *
++ * There are two separate processing pipelines - one for packets received
++ * from the kernel via a TUN or TAP interface and one for packets received
++ * via an interface used on the mesh network.
++ *
++ * You can register callbacks to be added to one of these pipelines with
++ * "dessert_sysrxcb_add" or "dessert_meshrxcb_add". Both take an additional
++ * integer argument ("priority") specifying the order the callbacks should
++ * be called. Higher "priority" value results in being called later
++ * within the pipeline.
++ *
++ * @code
++ * int dessert_sysrxcb_add(dessert_sysrxcb_t* c, int prio);
++ *
++ * int dessert_meshrxcb_add(dessert_meshrxcb_t* c, int prio);
++ * @endcode
++ *
++ * If a callback returns "DESSERT_MSG_KEEP" the packed will be processed by
++ * further callbacks, if it returns "DESSERT_MSG_DROP" the message will be
++ * dropped and no further callbacks will be called.
++ *
++ * You do not need to care about the management of the buffers for incoming
++ * messages - DES-SERT does this for you. Nevertheless if you need to add
++ * extensions or enlarge the payload of a message, you need to tell DES-SERT
++ * to enlarge the buffer for you if the flag "DESSERT_FLAG_SPARSE" is set on
++ * the message. You can do this by returning "DESSERT_MSG_NEEDNOSPARSE" from
++ * within a callback. The callback will be called again with a larger buffer
++ * and no "DESSERT_FLAG_SPARSE" flag being set.
++ *
++ *
++ * @subsection buffer_subsec Processing Buffer
++ *
++ * If you need to pass information along several callbacks, you can do this
++ * in the processing buffer passed to the the callbacks. This buffer contains
++ * some local processing flags ("lflags") set by the builtin callback
++ * "dessert_msg_ifaceflags_cb" (e.g. telling you about packet origin or if
++ * the packet is multicast) and 1KB of space for your callbacks to pass
++ * along arbitrary data.
++ *
++ * This buffer might only be allocated after you explicitly request it - in
++ * this case the proc argument is NULL and you can return the value
++ * "DESSERT_MSG_NEEDMSGPROC" from within your callback. The callback will
++ * be called again with a valid processing buffer.
++ *
++ *
++ * @section interfaces_sec Using Interfaces
++ *
++ *
++ * @subsection sysif_subsec Using a TUN/TAP interface
++ *
++ * First you have to choose whether to use a TUN or TAP interface. TUN
++ * interfaces are used to exchange IPv4 / IPv6 datagrams with the kernel
++ * network stack. TAP interfaces are used to exchange Ethernet frames
++ * with the kernel network stack. If you want to route Ethernet frames,
++ * you should choose a TAP interface. If you intend to implement
++ * a custom layer 2 to layer 3 mapping, you should use a TUN interface.
++
++ * Currently, you can only initialize and use a single sys (TUN/TAP) interface.
++ * This is done by "dessert_sysif_init". You must then set up the interface
++ * config in the kernel yourself e.g. by calling "ifconfig".
++ *
++ * @code
++ *
++ * int dessert_sysif_init(char* name, uint8_t flags);
++ *
++ * @endcode
++ *
++ * In either case, frames you receive from a TUN/TAP interface will be
++ * passed along the callbacks added by "dessert_sysrxcb_add" to the
++ * processing pipeline. Each of them will be called with a pointer to an
++ * Ethernet frame. In case of a TUN interface, "ether_shost" and "ether_dhost"
++ * are set to "00:00:00:00:00:00", and ether_type reflects whether the packet
++ * received is IPv4 oder IPv6.
++ *
++ * Packets are sent to the kernel network stack with "dessert_syssend".
++ * In case of a TUN Interface "ether_shost" and "ether_dhost" will be
++ * ignored.
++ *
++ * @code
++ * int dessert_syssend_msg(dessert_msg_t *msg);
++ *
++ * int dessert_syssend(const struct ether_header *eth, size_t len);
++ * @endcode
++ *
++ *
++ * @subsection meshif_subsec Using a Mesh Interface
++ *
++ * Mesh interfaces are used similar to the TUN/TAP interface with two major
++ * differences: You can have multiple mesh interfaces and they send and
++ * receive DES-SERT messages instead of Ethernet frames.
++ *
++ * You add an mesh interface using "dessert_meshif_add" and can send to it
++ * by calling "dessert_meshsend". If the interface parameter is NULL, the
++ * packet will be transmitted over every interface (good for flooding).
++ *
++ * @code
++ * int dessert_meshif_add(const char* dev, uint8_t flags);
++ *
++ *
++ * int dessert_meshsend(const dessert_msg_t* msgin,
++ * const dessert_meshif_t *iface);
++ *
++ * int dessert_meshsend_hwaddr(const dessert_msg_t* msgin,
++ * const uint8_t hwaddr[ETHER_ADDR_LEN]);
++ *
++ * int dessert_meshsend_allbutone(const dessert_msg_t* msgin,
++ * const dessert_meshif_t *iface);
++ *
++ * int dessert_meshsend_fast(dessert_msg_t* msg,
++ * const dessert_meshif_t *iface);
++ *
++ * int dessert_meshsend_fast_hwaddr(dessert_msg_t* msg,
++ * const uint8_t hwaddr[ETHER_ADDR_LEN]);
++ *
++ * int dessert_meshsend_fast_allbutone(dessert_msg_t* msg,
++ * const dessert_meshif_t *iface);
++ *
++ * int dessert_meshsend_raw(dessert_msg_t* msg,
++ * const dessert_meshif_t *iface);
++ * @endcode
++ *
++ * @section logging_sec Logging
++ *
++ * You can write log messages easily with a bunch of macros provided
++ * by DES-SERT ("dessert_debug", "dessert_info" ,"dessert_notice",
++ * "dessert_warn", "dessert_warning", "dessert_err", "dessert_crit",
++ * "dessert_alert" and "dessert_emerg"). Each of them can be used like
++ * "printf" and logs to Syslog, STDERR, file or a ringbuffer depending
++ * on your configuration.
++ *
++ * DES-SERT also ships with a custom "assert" macro which acts like
++ * the original macro from the standard C library and uses the logging
++ * mechanism described above.
++ *
++ *
++ * @section periodics_sec Periodics
++ *
++ * Periodics help you to perform maintenance or delayed tasks. A task
++ * consists of a callback, which will be called at the time you requested,
++ * and a void pointer the callback is passed. You can add these tasks by
++ * calling "dessert_periodic_add" or "dessert_periodic_add_delayed".
++ *
++ *
++ * @section cli_sec CLI - Command Line Interface
++ *
++ * DES-SERT supports simple configuration and debugging of your routing
++ * protocol implementation by providing a Cisco like command line interface
++ * (cli) and a config file parser based upon it.
++ * This cli is realized through libcli (http://code.google.com/p/libcli/).
++ *
++ * DES-SERT does some of the initialization of libcli. Therefore, it provides
++ * the main cli anchor "dessert_cli" and some anchors to add commands below
++ * "dessert_cli_.*". Because DES-SERT only loosely wraps libcli, you should
++ * make yourself familiar with libcli itself. This may be improved in further
++ * DES-SERT releases.
++ *
++ * You can evaluate a config file by calling "cli_file" and start a thread
++ * enabling a telnet-interface for DES-SERT by calling "dessert_cli_run".
++ *
++ *
++ * @section all_sec Putting it all together
++ *
++ * Now you have learned about the most important aspects of DES-SERT.
++ * To write your own routing protocol implementation, you need to know
++ * how to put all this together.
++ *
++ * You should start with a main() program parsing the command line options
++ * and then calling "dessert_init()". This is needed to set up DES-SERT
++ * correctly. Afterwards you can register callbacks, read the config file
++ * and do what you like. If everything is set up, you call "dessert_run()"
++ * and let the event based framework do its job.
++ *
++ * If you would like to see a complete protocol implementation sample,
++ * have a look at the "gossiping" directory.
++ *
++ *
++ * @section feedback_sec Contact & Feedback
++ *
++ * We love feedback - if you have patches, comments or questions,
++ * please contact us! Recent contact information is available on
++ * http://www.des-testbed.net/des-sert/
++ *
++ ******************************************************************************/
++
++#ifndef DESSERT_H
++#define DESSERT_H
++
++#ifdef __DARWIN__
++#include <net/if_dl.h>
++#define TUN_BSD
++#endif
++
++#ifdef __linux__
++#define TUN_LINUX
++#endif
++
++#include <net/if.h>
++#include <net/ethernet.h>
++#include <pcap.h>
++#include <stdint.h>
++#include <syslog.h>
++#include <stdlib.h>
++#include <libcli.h>
++
++/***************************************************************************//**
++ *
++ * @defgroup global G L O B A L # D E F I N E S and T Y P E D E F S / S T R U C T U R E S
++ *
++ * @brief EXTERNAL / PUBLIC
++ *
++ * @{
++ ******************************************************************************/
++
++/******************************************************************************
++ * #defines
++ ******************************************************************************/
++
++/** ethernet protocol used on layer 2 */
++#define DESSERT_ETHPROTO 0x8042
++
++/** maximum frame size to assemble as dessert_msg */
++#define DESSERT_MAXFRAMELEN ETHER_MAX_LEN
++
++/** maximum size of the data part in dessert_ext */
++#define DESSERT_MAXEXTDATALEN 130
++
++/** length of protocol string used in dessert_msg */
++#define DESSERT_PROTO_STRLEN 4
++
++/** size of local message processing buffer */
++#define DESSERT_LBUF_LEN 1024
++
++/** return code for many dessert_* functions */
++#define DESSERT_OK 0
++
++/** return code for many dessert_* functions */
++#define DESSERT_ERR 1
++
++/******************************************************************************
++ * typedefs
++ ******************************************************************************/
++/** runtime-unique frame id */
++typedef uint64_t dessert_frameid_t;
++
++/** A basic message send on des-sert layer2.5. */
++typedef struct __attribute__ ((__packed__)) dessert_msg {
++ /** the layer2 header on the wire */
++ struct ether_header l2h;
++ /** short name of the protocol as passed to dessert_init() */
++ char proto[DESSERT_PROTO_STRLEN];
++ /** version of the app as passed to dessert_init() */
++ uint8_t ver;
++ /** flags - bits 1-4 reserved for dessert, bits 5-8 for app usage */
++ uint8_t flags;
++ union {
++ /** reserved for app usage */
++ uint32_t u32;
++ struct __attribute__ ((__packed__)) {
++ /** ttl or hopcount field for app usage - 0xff if not used*/
++ uint8_t ttl;
++ /** reserved for app usage - 0x00 if not used */
++ uint8_t u8;
++ /** reserved for app usage - 0xbeef if not used */
++ uint16_t u16;
++ };
++ };
++ /** header length incl. extensions - in network byte order */
++ uint16_t hlen;
++ /** payload length - in network byte order */
++ uint16_t plen;
++} dessert_msg_t;
++
++/** local processing struct for dessert_msg_t */
++typedef struct dessert_msg_proc {
++ /** 16 bits for local processing flags */
++ uint16_t lflags;
++ /** 16 bits reserved */
++ uint16_t lreserved;
++ /** DESSERT_LBUF_LEN bytes buffer */
++ char lbuf[DESSERT_LBUF_LEN];
++} dessert_msg_proc_t;
++
++/** a extension record to add to a dessert_msg */
++typedef struct __attribute__ ((__packed__)) dessert_ext {
++ /** type of the extension
++ * user supplied types must be >= DESSERT_EXT_USER */
++ uint8_t type;
++
++ /** length of the extension in bytes
++ * including the 2 bytes of the extension
++ * header itself*/
++ uint8_t len;
++
++ /** pointer to the data - real length is len-2 bytes */
++ uint8_t data[DESSERT_MAXEXTDATALEN];
++} dessert_ext_t;
++
++/** an interface used for dessert_msg frames */
++typedef struct dessert_meshif {
++ /** pointer to next interface */
++ struct dessert_meshif *next;
++ /** pointer to next interface */
++ struct dessert_meshif *prev;
++ /** name of interface */
++ char if_name[IFNAMSIZ];
++ /** system ifindex */
++ unsigned int if_index;
++ /** hardware address of interface */
++ uint8_t hwaddr[ETHER_ADDR_LEN]; /* uthash key*/
++ /** counter mutex */
++ pthread_mutex_t cnt_mutex;
++ /** packet counter in */
++ uint64_t ipkts;
++ /** packet counter out */
++ uint64_t opkts;
++ /** packet counter in */
++ uint64_t ibytes;
++ /** packet counter out */
++ uint64_t obytes;
++ /** libpcap descriptor for the interface */
++ pcap_t *pcap;
++ /** libpcap error message buffer */
++ char pcap_err[PCAP_ERRBUF_SIZE];
++ /** pthread running the request loop */
++ pthread_t worker;
++} dessert_meshif_t;
++
++/** A tun/tap interface used to inject packets to dessert implemented daemons.
++ *
++ * \note Please make sure first fields are equal to dessert_meshif to re-use
++ * _dessert_meshif_gethwaddr().
++ *
++ */
++typedef struct dessert_sysif {
++ /** pointer to next interface */
++ struct dessert_sysif *next;
++ /** name of interface */
++ char if_name[IFNAMSIZ];
++ /** system ifindex */
++ unsigned int if_index;
++ /** hardware address of the interface */
++ uint8_t hwaddr[ETHER_ADDR_LEN];
++ /** counter mutex */
++ pthread_mutex_t cnt_mutex;
++ /** packet counter in */
++ uint64_t ipkts;
++ /** packet counter out */
++ uint64_t opkts;
++ /** packet counter in */
++ uint64_t ibytes;
++ /** packet counter out */
++ uint64_t obytes;
++ /** file descriptor to read/write from/to */
++ int fd;
++ /** if it is a tun or tap interface */
++ uint8_t flags;
++ /** pthread running the request loop */
++ pthread_t worker;
++} dessert_sysif_t;
++
++/** Callback type to call if a packed is received via a dessert mesh interface.
++ *
++ * @param *msg dessert_msg_t frame received
++ * @param len length of the buffer pointed to from dessert_msg_t
++ * @param *proc local processing buffer passed along the callback pipeline - may be NULL
++ * @param *iface interface received packet on - may be NULL
++ * @param id unique internal frame id of the packet
++ *
++ * @retval DESSERT_MSG_KEEP to continue processing the packet
++ * @retval DESSERT_MSG_DROP to drop it
++ * @retval DESSERT_MSG_NEEDMSGPROC to get a processing buffer
++ * @retval DESSERT_MSG_NEEDNOSPARSE to get a full packet buffer (e.g. needed to add extensions)
++ *
++ * \warning The callbacks are invoked with no locks hold by the thread,
++ * \warning YOU MUST make sure the thread holds no locks after the callback exits.
++ * \warning YOU MUST also make sure not to do anything blocking in a callback!
++ *
++ * If the callback exits with DESSERT_MSG_NEEDMSGPROC or DESSERT_MSG_NEEDNOSPARSE
++ * and the respective buffer is NULL or sparse, the callback is called again after
++ * providing the requested resource.
++ *
++ */
++typedef int dessert_meshrxcb_t(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
++
++/** Callback type to call if a packed should be injected into dessert via a tun/tap interface.
++ *
++ * @param *msg dessert msg received - original ethernet frame is encapsulated within
++ * @param len length of ethernet frame received
++ * @param *proc local processing buffer passed along the callback pipeline - may be NULL
++ * @param *sysif interface received packet on
++ * @param id unique internal frame id of the packet
++ *
++ * @retval DESSERT_MSG_KEEP to continue processing the packet
++ * @retval DESSERT_MSG_DROP to drop it
++ *
++ * \warning The callbacks are invoked with no locks hold by the thread,
++ * \warning YOU MUST make sure the thread holds no locks after the callback exits.
++ * \warning YOU MUST also make sure not to do anything blocking in a callback!
++ *
++*/
++typedef int dessert_sysrxcb_t(dessert_msg_t *msg, size_t len, dessert_msg_proc_t *proc, dessert_sysif_t *sysif, dessert_frameid_t id);
++
++/** callbacks type to call in a periodic task
++ *
++ * The callbacks are invoked with no locks hold by the thread,
++ * YOU MUST make sure the thread holds no locks after the callback exits.
++ * YOU MUST also make sure not to do anything blocking in a callback!
++ *
++ * @arg *data void pointer to pass to the callback
++ * @arg scheduled when this call was scheduled
++ * @arg interval how often this call should be scheduled
++ * ®return should be 0, otherwise the callback is unregistered
++ */
++typedef int dessert_periodiccallback_t(void *data, struct timeval *scheduled, struct timeval *interval);
++
++/** definition of a periodic tasklist entry */
++typedef struct dessert_periodic {
++ /** callback to call */
++ dessert_periodiccallback_t *c;
++ /** when to call next */
++ struct timeval scheduled;
++ /** call every */
++ struct timeval interval;
++ /** data pointer to pass to callback */
++ void *data;
++ /** internal pointer for task list */
++ struct dessert_periodic *next;
++} dessert_periodic_t;
++
++/***************************************************************************//**
++ * @}
++ *
++ * @defgroup core C O R E
++ *
++ * @brief EXTERNAL / PUBLIC
++ *
++ * @{
++ ******************************************************************************/
++
++/******************************************************************************
++ * #defines
++ ******************************************************************************/
++
++/** type for local unique packet identification */
++#define DESSERT_FRAMEID_MAX ((uint64_t)-1)
++
++/** flag for dessert_init - daemonize when calling
++ * disables logging to STDERR */
++#define DESSERT_OPT_DAEMONIZE 0x0100
++
++/** flag for dessert_init - do not daemonize when calling */
++#define DESSERT_OPT_NODAEMONIZE 0x0200
++
++/** flag for dessert_init - create and write pid file */
++#define DESSERT_OPT_PID 0x0400
++
++/** flag for dessert_init - do not create and write pid file */
++#define DESSERT_OPT_NOPID 0x0800
++
++/******************************************************************************
++ * globals
++ ******************************************************************************/
++
++/** protocol string used in dessert_msg frames */
++extern char dessert_proto[DESSERT_PROTO_STRLEN+1];
++
++/** version int used in dessert_msg frames */
++extern u_int8_t dessert_ver;
++
++/** default src address used for local generated dessert_msg frames */
++extern u_int8_t dessert_l25_defsrc[ETHER_ADDR_LEN];
++
++
++/** constant holding ethernet broadcast address after dessert_init */
++extern u_char ether_broadcast[ETHER_ADDR_LEN];
++
++/** constant holding ethernet null address after dessert_init */
++extern u_char ether_null[ETHER_ADDR_LEN];
++
++/** the config funnel */
++extern pthread_rwlock_t dessert_cfglock;
++
++/******************************************************************************
++ * functions
++ ******************************************************************************/
++
++int dessert_init(const char* proto, int version, uint16_t opts, char* pidfile);
++
++int dessert_run(void);
++void dessert_exit(void);
++
++/***************************************************************************//**
++ * @}
++ *
++ * @defgroup cli C L I - C O M M A N D _ L I N E _ I N T E R F A C E
++ *
++ * @brief EXTERNAL / PUBLIC
++ *
++ * @{
++ ******************************************************************************/
++
++/******************************************************************************
++ * globals
++ ******************************************************************************/
++
++extern struct cli_def *dessert_cli;
++
++extern struct cli_command *dessert_cli_show;
++extern struct cli_command *dessert_cli_cfg_iface;
++extern struct cli_command *dessert_cli_cfg_no;
++extern struct cli_command *dessert_cli_cfg_no_iface;
++extern struct cli_command *dessert_cli_cfg_set;
++extern struct cli_command *dessert_cli_cfg_logging;
++extern struct cli_command *dessert_cli_cfg_no_logging;
++
++/******************************************************************************
++ * functions
++ ******************************************************************************/
++
++int dessert_cli_run(int port);
++
++/***************************************************************************//**
++ * @}
++ *
++ * @defgroup log L O G _ F A C I L I T Y
++ *
++ * @brief EXTERNAL / PUBLIC
++ *
++ * @{
++ ******************************************************************************/
++
++/******************************************************************************
++ * #defines
++ ******************************************************************************/
++
++/** flag for dessert_logcfg - enable syslog logging */
++#define DESSERT_LOG_SYSLOG 0x0001
++
++/** flag for dessert_logcfg - disable syslog logging */
++#define DESSERT_LOG_NOSYSLOG 0x0002
++
++/** flag for dessert_logcfg - enable logfile logging
++ * @warning before using this you MUST use fopen(dessert_logfd, ...) to open the logfile */
++#define DESSERT_LOG_FILE 0x0004
++
++/** flag for dessert_logcfg - disable logfile logging */
++#define DESSERT_LOG_NOFILE 0x0008
++
++/** flag for dessert_logcfg - enable logging to stderr */
++#define DESSERT_LOG_STDERR 0x0010
++
++/** flag for dessert_logcfg - disable logging to stderr */
++#define DESSERT_LOG_NOSTDERR 0x0020
++
++/** flag for dessert_logcfg - enable logging to ringbuffer */
++#define DESSERT_LOG_RBUF 0x0040
++
++/** flag for dessert_logcfg - disable logging to ringbuffer */
++#define DESSERT_LOG_NORBUF 0x0080
++
++/** flag for dessert_logcfg - enable debug loglevel */
++#define DESSERT_LOG_DEBUG 0x0100
++
++/** flag for dessert_logcfg - disable debug loglevel */
++#define DESSERT_LOG_NODEBUG 0x0200
++
++/******************************************************************************
++ * functions
++ ******************************************************************************/
++int dessert_logcfg(uint16_t opts);
++void _dessert_log(int level, const char* func, const char* file, int line, const char *fmt, ...);
++/** log at DEBUG level */
++#define dessert_debug(...) _dessert_log(LOG_DEBUG, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
++/** log at INFO level */
++#define dessert_info(...) _dessert_log(LOG_INFO, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
++/** log at NOTICE level */
++#define dessert_notice(...) _dessert_log(LOG_NOTICE, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
++/** log at WARNING level */
++#define dessert_warn(...) _dessert_log(LOG_WARNING, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
++/** log at WARNING level */
++#define dessert_warning(...) _dessert_log(LOG_WARNING, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
++/** log at ERR level */
++#define dessert_err(...) _dessert_log(LOG_ERR, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
++/** log at CRIT level */
++#define dessert_crit(...) _dessert_log(LOG_CRIT, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
++/** log at ALERT level */
++#define dessert_alert(...) _dessert_log(LOG_ALERT, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
++/** log at EMERG level */
++#define dessert_emerg(...) _dessert_log(LOG_EMERG, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
++
++/***************************************************************************//**
++ * @}
++ *
++ * @defgroup mesh M E S H - I N T E R F A C E S
++ *
++ * @brief EXTERNAL / PUBLIC
++ *
++ * @{
++ ******************************************************************************/
++
++/******************************************************************************
++ * #defines
++ ******************************************************************************/
++
++/** return code for dessert_meshrxcb_t - forces to copy the message and call again*/
++#define DESSERT_MSG_NEEDNOSPARSE 1
++
++/** return code for dessert_meshrxcb_t - forces to generate processing info and call again*/
++#define DESSERT_MSG_NEEDMSGPROC 2
++
++/** return code for dessert_meshrxcb_t and dessert_sysrxcb_t */
++#define DESSERT_MSG_KEEP 0
++
++/** return code for dessert_meshrxcb_t and dessert_sysrxcb_t */
++#define DESSERT_MSG_DROP -1
++
++/** flag for dessert_meshif_add - set interface in promiscuous-mode (default) */
++#define DESSERT_IF_PROMISC 0x0
++
++/** flag for dessert_meshif_add - do not set interface in promiscuous-mode */
++#define DESSERT_IF_NOPROMISC 0x1
++
++/** flag for dessert_meshif_add - filter out non-des-sert frames in libpcap (default) */
++#define DESSERT_IF_FILTER 0x0
++
++/** flag for dessert_meshif_add - do not filter out non-des-sert frames in libpcap */
++#define DESSERT_IF_NOFILTER 0x2
++
++/******************************************************************************
++ * functions
++ ******************************************************************************/
++
++/* sending messages */
++int dessert_meshsend(const dessert_msg_t* msgin, const dessert_meshif_t *iface);
++int dessert_meshsend_allbutone(const dessert_msg_t* msgin, const dessert_meshif_t *iface);
++int dessert_meshsend_hwaddr(const dessert_msg_t* msgin, const uint8_t hwaddr[ETHER_ADDR_LEN]);
++int dessert_meshsend_randomized(const dessert_msg_t* msgin);
++
++int dessert_meshsend_fast(dessert_msg_t* msg, const dessert_meshif_t *iface);
++int dessert_meshsend_fast_allbutone(dessert_msg_t* msg, const dessert_meshif_t *iface);
++int dessert_meshsend_fast_hwaddr(dessert_msg_t* msg, const uint8_t hwaddr[ETHER_ADDR_LEN]);
++int dessert_meshsend_fast_randomized(dessert_msg_t* msgin);
++int dessert_meshsend_raw(dessert_msg_t* msg, const dessert_meshif_t *iface);
++
++/* meshrx-callback handling */
++int dessert_meshrxcb_add(dessert_meshrxcb_t* c, int prio);
++int dessert_meshrxcb_del(dessert_meshrxcb_t* c);
++
++/* mesh interface handling */
++int dessert_meshif_add(const char* dev, uint8_t flags);
++int dessert_meshif_del(const char* dev);
++
++dessert_meshif_t * dessert_meshif_get_name(const char* dev);
++dessert_meshif_t * dessert_meshif_get_hwaddr(const uint8_t hwaddr[ETHER_ADDR_LEN]);
++dessert_meshif_t * dessert_meshiflist_get(void);
++/*\}*/
++/***************************************************************************//**
++ * @}
++ *
++ * @defgroup sys S Y S - I N T E R F A C E S
++ *
++ * @brief EXTERNAL / PUBLIC
++ *
++ * @{
++ ******************************************************************************/
++
++/******************************************************************************
++ * #defines
++ ******************************************************************************/
++
++/** flag for dessert_sysif_init - open tun (ip/ipv6) device */
++#define DESSERT_TUN 0x00
++
++/** flag for dessert_sysif_init - open tap (ethernet) device */
++#define DESSERT_TAP 0x01
++
++/** flag for dessert_sysif_init - set dessert_l25_defsrc to mac of tap device */
++#define DESSERT_MAKE_DEFSRC 0x02
++
++/** flag for dessert_sysif_init - get mac for tap failed - try mac in src of first packet */
++#define _DESSERT_TAP_NOMAC 0x80
++
++/******************************************************************************
++ * functions
++ ******************************************************************************/
++
++int dessert_sysif_init(char* name, uint8_t flags);
++
++int dessert_sysrxcb_add(dessert_sysrxcb_t* c, int prio);
++int dessert_sysrxcb_del(dessert_sysrxcb_t* c);
++
++int dessert_syssend_msg(dessert_msg_t *msg);
++int dessert_syssend(const struct ether_header *eth, size_t len);
++
++/***************************************************************************//**
++ * @}
++ *
++ * @defgroup msg M E S S A G E _ H A N D L I N G
++ *
++ * @brief EXTERNAL / PUBLIC
++ *
++ * @{
++ ******************************************************************************/
++
++/******************************************************************************
++ * #defines
++ ******************************************************************************/
++
++/** flag for dessert_msg.flags - message len is hlen+plen
++ * if not set buffer len is assumed as DESSERT_MAXFRAMELEN + DESSERT_MSGPROCLEN */
++#define DESSERT_FLAG_SPARSE 0x1
++
++/* *********************** */
++
++/** flag for dessert_msg_proc.lflags - l25 src is one of our interfaces */
++#define DESSERT_LFLAG_SRC_SELF 0x0002
++
++/** flag for dessert_msg_proc.lflags - l25 dst is multicast address*/
++#define DESSERT_LFLAG_DST_MULTICAST 0x0004
++
++/** flag for dessert_msg_proc.lflags - l25 dst is one of our interfaces */
++#define DESSERT_LFLAG_DST_SELF 0x0008
++
++/** flag for dessert_msg_proc.lflags - l25 dst is broadcast */
++#define DESSERT_LFLAG_DST_BROADCAST 0x0010
++
++/** flag for dessert_msg_proc.lflags - l2 src is one of our interfaces */
++#define DESSERT_LFLAG_PREVHOP_SELF 0x0020
++
++/** flag for dessert_msg_proc.lflags - l2 dst is one of our interfaces */
++#define DESSERT_LFLAG_NEXTHOP_SELF 0x0040
++
++/** flag for dessert_msg_proc.lflags - l2 dst is broadcast */
++#define DESSERT_LFLAG_NEXTHOP_BROADCAST 0x0080
++
++/** flag for dessert_msg_proc.lflags - l25 dst is one of our interfaces,
++ * but we received the message not via the indented interface, e.g. we
++ * overheard it */
++#define DESSERT_LFLAG_DST_SELF_OVERHEARD 0x0100
++
++/** flag for dessert_msg_proc.lflags - l2 dst is one of our interfaces,
++ * but we received the message not via the indented interface, e.g. we
++ * overheard it */
++#define DESSERT_LFLAG_NEXTHOP_SELF_OVERHEARD 0x0200
++
++/* *********************** */
++
++/** length of dessert_ext header */
++#define DESSERT_EXTLEN (sizeof(struct dessert_ext) - DESSERT_MAXEXTDATALEN)
++
++/** dessert_ext type wildcard - any extension */
++#define DESSERT_EXT_ANY 0x00
++
++/** dessert_ext type for ethernet header */
++#define DESSERT_EXT_ETH 0x01
++
++/** dessert_ext type for packet tracing */
++#define DESSERT_EXT_TRACE 0x02
++
++/** first dessert_ext type for usage by the user */
++#define DESSERT_EXT_USER 0x40
++
++/* *********************** */
++
++/** packet tracing flag - only record hosts */
++#define DESSERT_MSG_TRACE_HOST (ETHER_ADDR_LEN)
++
++/** packet tracing flag - record interfaces */
++#define DESSERT_MSG_TRACE_IFACE (3*ETHER_ADDR_LEN)
++
++/* *********************** */
++
++/** Returns the length of a given extension. */
++#define dessert_ext_getdatalen(ext) (ext->len - DESSERT_EXTLEN)
++
++/******************************************************************************
++ * functions
++ ******************************************************************************/
++
++int dessert_msg_new(dessert_msg_t **msgout);
++int dessert_msg_clone(dessert_msg_t **msgnew, const dessert_msg_t *msgold, uint8_t sparse);
++int dessert_msg_check(const dessert_msg_t* msg, size_t len);
++void dessert_msg_dump(const dessert_msg_t* msg, size_t len, char *buf, size_t blen);
++void dessert_msg_destroy(dessert_msg_t* msg);
++
++int dessert_msg_ethencap(const struct ether_header* eth, size_t eth_len, dessert_msg_t **msgout);
++int dessert_msg_ethdecap(const dessert_msg_t* msg, struct ether_header** ethout);
++struct ether_header* dessert_msg_getl25ether (const dessert_msg_t* msg);
++
++int dessert_msg_proc_clone(dessert_msg_proc_t **procnew, const dessert_msg_proc_t *procold);
++void dessert_msg_proc_dump(const dessert_msg_t* msg, size_t len, const dessert_msg_proc_t *proc, char *buf, size_t blen);
++void dessert_msg_proc_destroy(dessert_msg_proc_t* proc);
++
++int dessert_msg_addpayload(dessert_msg_t* msg, void** payload, int len);
++int dessert_msg_getpayload(dessert_msg_t *msg, void **payload);
++int dessert_msg_addext(dessert_msg_t* msg, dessert_ext_t** ext, uint8_t type, size_t len);
++int dessert_msg_delext(dessert_msg_t *msg, dessert_ext_t *ext);
++int dessert_msg_resizeext(dessert_msg_t *msg, dessert_ext_t *ext, size_t new_len);
++int dessert_msg_getext(const dessert_msg_t* msg, dessert_ext_t** ext, uint8_t type, int index);
++int dessert_msg_get_ext_count(const dessert_msg_t* msg, uint8_t type);
++
++int dessert_msg_trace_initiate(dessert_msg_t* msg, int mode);
++int dessert_msg_trace_dump(const dessert_msg_t* msg, char* buf, int blen);
++
++int dessert_msg_dump_cb(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
++int dessert_msg_check_cb(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
++int dessert_msg_trace_cb(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
++int dessert_msg_ifaceflags_cb(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *riface, dessert_frameid_t id);
++
++/***************************************************************************//**
++ * @}
++ *
++ * @defgroup periodic P E R I O D I C _ T A S K S
++ *
++ * @brief EXTERNAL / PUBLIC
++ *
++ * @{
++ ******************************************************************************/
++
++dessert_periodic_t *dessert_periodic_add(dessert_periodiccallback_t* c, void *data, const struct timeval *scheduled, const struct timeval *interval);
++dessert_periodic_t *dessert_periodic_add_delayed(dessert_periodiccallback_t* c, void *data, int delay);
++int dessert_periodic_del(dessert_periodic_t *p);
++
++/***************************************************************************//**
++ * @}
++ *
++ * @defgroup agentx NET - S N M P // A G E N T _ X
++ *
++ * @brief EXTERNAL / PUBLIC
++ *
++ * @{
++ ******************************************************************************/
++
++/******************************************************************************
++ * #defines
++ ******************************************************************************/
++/** Flag indicating the dessert_agentx_appstats_t is of type bool. */
++#define DESSERT_APPSTATS_VALUETYPE_BOOL 0
++
++/** Flag indicating the dessert_agentx_appstats_t is of type int32. */
++#define DESSERT_APPSTATS_VALUETYPE_INT32 1
++
++/** Flag indicating the dessert_agentx_appstats_t is of type uint32. */
++#define DESSERT_APPSTATS_VALUETYPE_UINT32 2
++
++/** Flag indicating the dessert_agentx_appstats_t is of type counter64. */
++#define DESSERT_APPSTATS_VALUETYPE_COUNTER64 3
++
++/** Flag indicating the dessert_agentx_appstats_t is of type octetstring. */
++#define DESSERT_APPSTATS_VALUETYPE_OCTETSTRING 4
++
++/* *********************** */
++
++/** Flag indicating the dessert_agentx_appstats_t does not contain information regarding a node or a link. */
++#define DESSERT_APPSTATS_NODEORLINK_NONE 0
++
++/** Flag indicating the dessert_agentx_appstats_t contains information regarding a node. */
++#define DESSERT_APPSTATS_NODEORLINK_NODE 1
++
++/** Flag indicating the dessert_agentx_appstats_t contains information regarding a link. */
++#define DESSERT_APPSTATS_NODEORLINK_LINK 2
++
++/* *********************** */
++
++/** What is considered to be TRUE in a dessert_agentx_appstats_t. */
++#define DESSERT_APPSTATS_BOOL_TRUE 1
++
++/** What is considered to be FALSE in a dessert_agentx_appstats_t. */
++#define DESSERT_APPSTATS_BOOL_FALSE 0
++
++/* *********************** */
++
++/** Flag indicating the dessert_agentx_appparams_t is of type bool. */
++#define DESSERT_APPPARAMS_VALUETYPE_BOOL 0
++
++/** Flag indicating the dessert_agentx_appparams_t is of type int32. */
++#define DESSERT_APPPARAMS_VALUETYPE_INT32 1
++
++/** Flag indicating the dessert_agentx_appparams_t is of type uint32. */
++#define DESSERT_APPPARAMS_VALUETYPE_UINT32 2
++
++/** Flag indicating the dessert_agentx_appparams_t is of type octetstring. */
++#define DESSERT_APPPARAMS_VALUETYPE_OCTETSTRING 3
++
++/* *********************** */
++
++/** What is considered to be TRUE in a dessert_agentx_appparams_t. */
++#define DESSERT_APPPARAMS_BOOL_TRUE 1
++
++/** What is considered to be FALSE in a dessert_agentx_appparams_t. */
++#define DESSERT_APPPARAMS_BOOL_FALSE 0
++
++/* *********************** */
++
++/** Flag indicating if a appstats callback entry is of type bulk. */
++#define DESSERT_APPSTATS_CB_BULK 1
++/** Flag indicating if a appstats callback entry is of type nobulk. */
++#define DESSERT_APPSTATS_CB_NOBULK 2
++
++/******************************************************************************
++ * typedefs
++ ******************************************************************************/
++
++/** An abstract data type representing some statistical datum.*/
++typedef struct dessert_agentx_appstats {
++
++ /** A prev pointer. @internal */
++ struct dessert_agentx_appstats *prev;
++ /** A next pointer. @internal */
++ struct dessert_agentx_appstats *next;
++
++ /** The name of the datum. */
++ char name[256];
++ /** A description of the datum*/
++ char desc[256];
++
++ /** The type of the datum.
++ *
++ * @see For valid values please refer to: \n DESSERT_APPSTATS_VALUETYPE_BOOL
++ * @see DESSERT_APPSTATS_VALUETYPE_INT32
++ * @see DESSERT_APPSTATS_VALUETYPE_UINT32
++ * @see DESSERT_APPSTATS_VALUETYPE_COUNTER64
++ * @see DESSERT_APPSTATS_VALUETYPE_OCTETSTRING
++ */
++ int value_type;
++ /** Indicates if this datum contains information about a node or a link
++ *
++ * @see For valid values please refer to: \n DESSERT_APPSTATS_NODEORLINK_NONE
++ * @see DESSERT_APPSTATS_NODEORLINK_NODE
++ * @see DESSERT_APPSTATS_NODEORLINK_LINK
++ */
++ int node_or_link;
++
++ /** Field representing a mac address if this datum contains information about a node or a link. */
++ uint8_t macaddress1 [ETHER_ADDR_LEN];
++ /** Field representing a mac address if this datum contains information about a link. */
++ uint8_t macaddress2 [ETHER_ADDR_LEN];
++
++ union {
++ /** A boolean.
++ *
++ * @see For valid values please refer to: \n DESSERT_APPSTATS_BOOL_TRUE
++ * @see DESSERT_APPSTATS_BOOL_FALSE
++ */
++ uint8_t bool;
++ /** A 32bit signed integer. */
++ int32_t int32;
++ /** A 32bit unsigned integer. */
++ uint32_t uint32;
++ /** A 64bit unsigned integer with counter semantics */
++ uint64_t counter64;
++
++ struct {
++ /** The length of the octetstring field. */
++ uint8_t octetstring_len;
++ /** Character pointer to some raw bytes. */
++ char *octetstring;
++ };
++ };
++
++} dessert_agentx_appstats_t;
++
++/** An abstract data type representing some parameter.*/
++typedef struct dessert_agentx_appparams {
++
++ /** Internal. @internal */
++ struct dessert_agentx_appparams *prev;
++ /** Internal. @internal */
++ struct dessert_agentx_appparams *next;
++
++ /** Internal. @internal Internal. */
++ uint8_t index;
++
++ /** The name of the datum. */
++ char name[256];
++ /** A description of the datum*/
++ char desc[256];
++
++ /** The type of the parameter.
++ *
++ * @see For valid values please refer to: \n DESSERT_APPPARAMS_VALUETYPE_BOOL
++ * @see DESSERT_APPPARAMS_VALUETYPE_INT32
++ * @see DESSERT_APPPARAMS_VALUETYPE_UINT32
++ * @see DESSERT_APPPARAMS_VALUETYPE_OCTETSTRING
++ */
++ int value_type;
++
++ union {
++ /** A boolean.
++ *
++ * @see For valid values please refer to: \n DESSERT_APPPARAMS_BOOL_TRUE
++ * @see DESSERT_APPPARAMS_BOOL_FALSE
++ */
++ uint8_t bool;
++ /** A 32bit signed integer. */
++ int32_t int32;
++ /** A 32bit unsigned integer. */
++ uint32_t uint32;
++
++ struct {
++ /** The length of the octetstring field. */
++ uint16_t octetstring_len;
++ /** Character pointer to some raw bytes. */
++ char *octetstring;
++ };
++ };
++
++} dessert_agentx_appparams_t;
++
++/** Callback type to call if the AppstatsTable is asked for by some snmp client.
++ *
++ * @param *appstats dessert_agentx_appstats_t the statistical datum to be filled out
++ *
++ *
++ * @retval DESSERT_OK on success
++ * @retval DESSERT_ERR to remove the corresponding callback entry
++ *
++ */
++typedef int dessert_agentx_appstatscb_get_t(struct dessert_agentx_appstats *appstats);
++
++/** Callback type to call if the AppparamsTable is asked for by some snmp client.
++ *
++ * @param *appstats dessert_agentx_appparams_t the parameter to be filled out
++ *
++ *
++ * @retval DESSERT_OK on success
++ * @retval DESSERT_ERR to remove the corresponding callback entry
++ *
++ */
++typedef int dessert_agentx_appparamscb_get_t(struct dessert_agentx_appparams *appparams);
++
++/** Callback type to call if the specific row represented by this callback is
++ * going to be set by some snmp client.
++ *
++ * @param *appstats dessert_agentx_appparams_t the new value
++ *
++ *
++ * @retval DESSERT_OK on success
++ * @retval DESSERT_ERR otherwise
++ *
++ */
++typedef int dessert_agentx_appparamscb_set_t(struct dessert_agentx_appparams *appparams);
++
++/** A callback entry representing a statistical datum. */
++typedef struct dessert_agentx_appstats_cb_entry {
++
++ /** Interal. @internal */
++ struct dessert_agentx_appstats_cb_entry *prev;
++ /** Interal. @internal */
++ struct dessert_agentx_appstats_cb_entry *next;
++
++ /** Flag indicating whether this entry represents a bulk entry.*/
++ uint8_t isbulk_flag;
++
++ /** The getter callback. */
++ dessert_agentx_appstatscb_get_t *c;
++
++} dessert_agentx_appstats_cb_entry_t;
++
++/** A callback entry representing a parameter. */
++typedef struct dessert_agentx_appparams_cb_entry {
++
++ /** Internal. @internal */
++ struct dessert_agentx_appparams_cb_entry *prev;
++ /** Internal. @internal*/
++ struct dessert_agentx_appparams_cb_entry *next;
++
++ /** Internal. @internal */
++ uint8_t index;
++
++ /** The getter callback. */
++ dessert_agentx_appparamscb_get_t *get;
++ /** The setter callback. */
++ dessert_agentx_appparamscb_set_t *set;
++
++} dessert_agentx_appparams_cb_entry_t;
++
++
++/******************************************************************************
++ * globals
++ ******************************************************************************/
++
++
++/******************************************************************************
++ * functions
++ ******************************************************************************/
++dessert_agentx_appstats_t *dessert_agentx_appstats_new(void);
++void dessert_agentx_appstats_destroy(dessert_agentx_appstats_t *appstat);
++
++dessert_agentx_appstats_cb_entry_t *dessert_agentx_appstats_add(dessert_agentx_appstatscb_get_t *c);
++dessert_agentx_appstats_cb_entry_t *dessert_agentx_appstats_add_bulk(dessert_agentx_appstatscb_get_t *c);
++int dessert_agentx_appstats_del(dessert_agentx_appstats_cb_entry_t *e);
++
++dessert_agentx_appparams_t *dessert_agentx_appparam_new(void);
++void dessert_agentx_appparam_destroy(dessert_agentx_appparams_t *appparam);
++
++dessert_agentx_appparams_cb_entry_t *dessert_agentx_appparams_add(dessert_agentx_appparamscb_get_t *get, dessert_agentx_appparamscb_set_t *set);
++int dessert_agentx_appparams_del(dessert_agentx_appparams_cb_entry_t *e);
++
++/**************************************************************************//**
++ * @}
++ *
++ * @defgroup macros U S E F U L L _ MA C R O S
++ *
++ * @brief EXTERNAL / PUBLIC
++ *
++ * @{
++ ******************************************************************************/
++
++/** A convenience macro to safely iterate the list of mesh interfaces.
++ *
++ * @param __interface pointer to a temporal dessert_meshif_t
++ *
++ * @warning You must pair it with an ending MESHIFLIST_ITERATOR_STOP() macro!
++ * Please find an usage example in the Examples paragraph below.
++ *
++ * @par Examples:
++ *
++ * @li The do_something() function will be called for every mesh interface in the list.
++ * @code
++ * dessert_meshif_t *iface;
++ *
++ * MESHIFLIST_ITERATOR_START(iface)
++ * do_something(iface); // do something to every iface
++ * MESHIFLIST_ITERATOR_STOP;
++ * @endcode
++ */
++#define MESHIFLIST_ITERATOR_START(__interface) \
++pthread_rwlock_rdlock(&dessert_cfglock); \
++DL_FOREACH(dessert_meshiflist_get(), __interface) {
++
++/** A convenience macro to safely iterate the list of mesh interfaces.
++ *
++ * @see MESHIFLIST_ITERATOR_START()
++ */
++#define MESHIFLIST_ITERATOR_STOP } pthread_rwlock_unlock(&dessert_cfglock)
++
++/** A convenience macro to safely add @a __sec seconds and @a __usec microseconds
++ * to the @c struct @c timeval @a __tv in an <em>invariant respecting</em> manner.
++ *
++ * @param __tv the @c struct @c timeval to add to
++ * @param __sec the number of seconds to add up to @a __tv->tv_sec
++ * @param __usec the number of microseconds to add up to @a __tv.->tv_usec
++ *
++ * %DESCRIPTION: \n
++ * The <a href="http://www.gnu.org/s/libc/manual/html_node/Elapsed-Time.html#Elapsed-Time">GNU C Library Documentation</a>
++ * states about the @c tv_usec member of the @c struct @c timeval: <em>This is the
++ * rest of the elapsed time (a fraction of a second), represented as the number
++ * of microseconds. It is always less than one @a million.</em>
++ *
++ */
++#define TIMEVAL_ADD(__tv, __sec, __usec) \
++ do { \
++ (__tv)->tv_sec += __sec; \
++ (__tv)->tv_usec += __usec; \
++ if((__tv)->tv_usec >= 1000000) { \
++ ++(__tv)->tv_sec; \
++ (__tv)->tv_usec -= 1000000; \
++ } \
++ } while(0)
++
++#define likely(x) (__builtin_expect((x),1))
++#define unlikely(x) (__builtin_expect((x),0))
++
++#define __dessert_assert(func, file, line, e) \
++ ((void)_dessert_log(LOG_EMERG, func, file, line, "assertion `%s' failed!\n", e), abort)
++
++#ifdef NDEBUG
++#define assert(e) ((void)0)
++#else
++#define assert(e) \
++ (__builtin_expect(!(e), 0) ? __dessert_assert(__FUNCTION__, __FILE__, __LINE__, #e) : (void)0)
++#endif
++
++/** @} */
++
++/******************************************************************************
++ *
++ * ! ! ! ! O L D ! ! ! T O D O ! ! ! !
++ *
++ ******************************************************************************/
++
++/** the config-flag variable */
++//extern uint16_t dessert_cfgflags; // TODO not used! to be removed??!?
++
++/** size of a dessert_msg buffer */
++//#define dessert_msg_buflen(x) ((x->flags&DESSERT_FLAG_SPARSE)?(x->hlen+x->plen):(DESSERT_MAXFRAMELEN+DESSERT_MSGPROCLEN))
++
++//#define dessert_frameid_overflow(x, y) ((x>y)&&((x-y)>(DESSERT_FRAMEID_MAX/2)))
++
++
++#endif /* DESSERT_H*/
+diff --git a/include/dessert/utlist.h b/include/dessert/utlist.h
+new file mode 100644
+index 0000000..40ebbc6
+--- /dev/null
++++ b/include/dessert/utlist.h
+@@ -0,0 +1,349 @@
++/*
++Copyright (c) 2007-2009, Troy D. Hanson
++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.
++
++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.
++*/
++
++#ifndef UTLIST_H
++#define UTLIST_H
++
++#define UTLIST_VERSION 1.8
++
++/*
++ * This file contains macros to manipulate singly and doubly-linked lists.
++ *
++ * 1. LL_ macros: singly-linked lists.
++ * 2. DL_ macros: doubly-linked lists.
++ * 3. CDL_ macros: circular doubly-linked lists.
++ *
++ * To use singly-linked lists, your structure must have a "next" pointer.
++ * To use doubly-linked lists, your structure must "prev" and "next" pointers.
++ * Either way, the pointer to the head of the list must be initialized to NULL.
++ *
++ * ----------------.EXAMPLE -------------------------
++ * struct item {
++ * int id;
++ * struct item *prev, *next;
++ * }
++ *
++ * struct item *list = NULL:
++ *
++ * int main() {
++ * struct item *item;
++ * ... allocate and populate item ...
++ * DL_APPEND(list, item);
++ * }
++ * --------------------------------------------------
++ *
++ * For doubly-linked lists, the append and delete macros are O(1)
++ * For singly-linked lists, append and delete are O(n) but prepend is O(1)
++ * The sort macro is O(n log(n)) for all types of single/double/circular lists.
++ */
++
++/******************************************************************************
++ * The sort macro is an adaptation of Simon Tatham's O(n log(n)) mergesort *
++ * Unwieldy variable names used here to avoid shadowing passed-in variables. *
++ *****************************************************************************/
++#define LL_SORT(list, cmp) \
++do { \
++ __typeof__(list) _ls_p, _ls_q, _ls_e, _ls_tail, _ls_oldhead; \
++ int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \
++ if (list) { \
++ _ls_insize = 1; \
++ _ls_looping = 1; \
++ while (_ls_looping) { \
++ _ls_p = list; \
++ _ls_oldhead = list; \
++ list = NULL; \
++ _ls_tail = NULL; \
++ _ls_nmerges = 0; \
++ while (_ls_p) { \
++ _ls_nmerges++; \
++ _ls_q = _ls_p; \
++ _ls_psize = 0; \
++ for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \
++ _ls_psize++; \
++ _ls_q = _ls_q->next; \
++ if (!_ls_q) break; \
++ } \
++ _ls_qsize = _ls_insize; \
++ while (_ls_psize > 0 || (_ls_qsize > 0 && _ls_q)) { \
++ if (_ls_psize == 0) { \
++ _ls_e = _ls_q; _ls_q = _ls_q->next; _ls_qsize--; \
++ } else if (_ls_qsize == 0 || !_ls_q) { \
++ _ls_e = _ls_p; _ls_p = _ls_p->next; _ls_psize--; \
++ } else if (cmp(_ls_p,_ls_q) <= 0) { \
++ _ls_e = _ls_p; _ls_p = _ls_p->next; _ls_psize--; \
++ } else { \
++ _ls_e = _ls_q; _ls_q = _ls_q->next; _ls_qsize--; \
++ } \
++ if (_ls_tail) { \
++ _ls_tail->next = _ls_e; \
++ } else { \
++ list = _ls_e; \
++ } \
++ _ls_tail = _ls_e; \
++ } \
++ _ls_p = _ls_q; \
++ } \
++ _ls_tail->next = NULL; \
++ if (_ls_nmerges <= 1) { \
++ _ls_looping=0; \
++ } \
++ _ls_insize *= 2; \
++ } \
++ } \
++} while (0)
++
++#define DL_SORT(list, cmp) \
++do { \
++ __typeof__(list) _ls_p, _ls_q, _ls_e, _ls_tail, _ls_oldhead; \
++ int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \
++ if (list) { \
++ _ls_insize = 1; \
++ _ls_looping = 1; \
++ while (_ls_looping) { \
++ _ls_p = list; \
++ _ls_oldhead = list; \
++ list = NULL; \
++ _ls_tail = NULL; \
++ _ls_nmerges = 0; \
++ while (_ls_p) { \
++ _ls_nmerges++; \
++ _ls_q = _ls_p; \
++ _ls_psize = 0; \
++ for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \
++ _ls_psize++; \
++ _ls_q = _ls_q->next; \
++ if (!_ls_q) break; \
++ } \
++ _ls_qsize = _ls_insize; \
++ while (_ls_psize > 0 || (_ls_qsize > 0 && _ls_q)) { \
++ if (_ls_psize == 0) { \
++ _ls_e = _ls_q; _ls_q = _ls_q->next; _ls_qsize--; \
++ } else if (_ls_qsize == 0 || !_ls_q) { \
++ _ls_e = _ls_p; _ls_p = _ls_p->next; _ls_psize--; \
++ } else if (cmp(_ls_p,_ls_q) <= 0) { \
++ _ls_e = _ls_p; _ls_p = _ls_p->next; _ls_psize--; \
++ } else { \
++ _ls_e = _ls_q; _ls_q = _ls_q->next; _ls_qsize--; \
++ } \
++ if (_ls_tail) { \
++ _ls_tail->next = _ls_e; \
++ } else { \
++ list = _ls_e; \
++ } \
++ _ls_e->prev = _ls_tail; \
++ _ls_tail = _ls_e; \
++ } \
++ _ls_p = _ls_q; \
++ } \
++ list->prev = _ls_tail; \
++ _ls_tail->next = NULL; \
++ if (_ls_nmerges <= 1) { \
++ _ls_looping=0; \
++ } \
++ _ls_insize *= 2; \
++ } \
++ } \
++} while (0)
++
++#define CDL_SORT(list, cmp) \
++do { \
++ __typeof__(list) _ls_p, _ls_q, _ls_e, _ls_tail, _ls_oldhead; \
++ int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \
++ if (list) { \
++ _ls_insize = 1; \
++ _ls_looping = 1; \
++ while (_ls_looping) { \
++ _ls_p = list; \
++ _ls_oldhead = list; \
++ list = NULL; \
++ _ls_tail = NULL; \
++ _ls_nmerges = 0; \
++ while (_ls_p) { \
++ _ls_nmerges++; \
++ _ls_q = _ls_p; \
++ _ls_psize = 0; \
++ for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \
++ _ls_psize++; \
++ _ls_q = ((_ls_q->next == _ls_oldhead) ? NULL : _ls_q->next); \
++ if (!_ls_q) break; \
++ } \
++ _ls_qsize = _ls_insize; \
++ while (_ls_psize > 0 || (_ls_qsize > 0 && _ls_q)) { \
++ if (_ls_psize == 0) { \
++ _ls_e = _ls_q; _ls_q = _ls_q->next; _ls_qsize--; \
++ if (_ls_q == _ls_oldhead) { _ls_q = NULL; } \
++ } else if (_ls_qsize == 0 || !_ls_q) { \
++ _ls_e = _ls_p; _ls_p = _ls_p->next; _ls_psize--; \
++ if (_ls_p == _ls_oldhead) { _ls_p = NULL; } \
++ } else if (cmp(_ls_p,_ls_q) <= 0) { \
++ _ls_e = _ls_p; _ls_p = _ls_p->next; _ls_psize--; \
++ if (_ls_p == _ls_oldhead) { _ls_p = NULL; } \
++ } else { \
++ _ls_e = _ls_q; _ls_q = _ls_q->next; _ls_qsize--; \
++ if (_ls_q == _ls_oldhead) { _ls_q = NULL; } \
++ } \
++ if (_ls_tail) { \
++ _ls_tail->next = _ls_e; \
++ } else { \
++ list = _ls_e; \
++ } \
++ _ls_e->prev = _ls_tail; \
++ _ls_tail = _ls_e; \
++ } \
++ _ls_p = _ls_q; \
++ } \
++ list->prev = _ls_tail; \
++ _ls_tail->next = list; \
++ if (_ls_nmerges <= 1) { \
++ _ls_looping=0; \
++ } \
++ _ls_insize *= 2; \
++ } \
++ } \
++} while (0)
++
++/******************************************************************************
++ * singly linked list macros (non-circular) *
++ *****************************************************************************/
++#define LL_PREPEND(head,add) \
++do { \
++ (add)->next = head; \
++ head = add; \
++} while (0)
++
++#define LL_APPEND(head,add) \
++do { \
++ __typeof__(head) _tmp; \
++ (add)->next=NULL; \
++ if (head) { \
++ _tmp = head; \
++ while (_tmp->next) { _tmp = _tmp->next; } \
++ _tmp->next=(add); \
++ } else { \
++ (head)=(add); \
++ } \
++} while (0)
++
++#define LL_DELETE(head,del) \
++do { \
++ __typeof__(head) _tmp; \
++ if ((head) == (del)) { \
++ (head)=(head)->next; \
++ } else { \
++ _tmp = head; \
++ while (_tmp->next && (_tmp->next != (del))) { \
++ _tmp = _tmp->next; \
++ } \
++ if (_tmp->next) { \
++ _tmp->next = ((del)->next); \
++ } \
++ } \
++} while (0)
++
++#define LL_FOREACH(head,el) \
++ for(el=head;el;el=el->next)
++
++/******************************************************************************
++ * doubly linked list macros (non-circular) *
++ *****************************************************************************/
++#define DL_PREPEND(head,add) \
++do { \
++ (add)->next = head; \
++ if (head) { \
++ (add)->prev = (head)->prev; \
++ (head)->prev = (add); \
++ } else { \
++ (add)->prev = (add); \
++ } \
++ (head) = (add); \
++} while (0)
++
++#define DL_APPEND(head,add) \
++do { \
++ if (head) { \
++ (add)->prev = (head)->prev; \
++ (head)->prev->next = (add); \
++ (head)->prev = (add); \
++ (add)->next = NULL; \
++ } else { \
++ (head)=(add); \
++ (head)->prev = (head); \
++ (head)->next = NULL; \
++ } \
++} while (0);
++
++#define DL_DELETE(head,del) \
++do { \
++ if ((del)->prev == (del)) { \
++ (head)=NULL; \
++ } else if ((del)==(head)) { \
++ (del)->next->prev = (del)->prev; \
++ (head) = (del)->next; \
++ } else { \
++ (del)->prev->next = (del)->next; \
++ if ((del)->next) { \
++ (del)->next->prev = (del)->prev; \
++ } else { \
++ (head)->prev = (del)->prev; \
++ } \
++ } \
++} while (0);
++
++
++#define DL_FOREACH(head,el) \
++ for(el=head;el;el=el->next)
++
++/******************************************************************************
++ * circular doubly linked list macros *
++ *****************************************************************************/
++#define CDL_PREPEND(head,add) \
++do { \
++ if (head) { \
++ (add)->prev = (head)->prev; \
++ (add)->next = (head); \
++ (head)->prev = (add); \
++ (add)->prev->next = (add); \
++ } else { \
++ (add)->prev = (add); \
++ (add)->next = (add); \
++ } \
++(head)=(add); \
++} while (0)
++
++#define CDL_DELETE(head,del) \
++do { \
++ if ( ((head)==(del)) && ((head)->next == (head))) { \
++ (head) = 0L; \
++ } else { \
++ (del)->next->prev = (del)->prev; \
++ (del)->prev->next = (del)->next; \
++ if ((del) == (head)) (head)=(del)->next; \
++ } \
++} while (0);
++
++#define CDL_FOREACH(head,el) \
++ for(el=head;el;el= (el->next==head ? 0L : el->next))
++
++
++#endif /* UTLIST_H */
++
+diff --git a/install-sh b/install-sh
+new file mode 100755
+index 0000000..6781b98
+--- /dev/null
++++ b/install-sh
+@@ -0,0 +1,520 @@
++#!/bin/sh
++# install - install a program, script, or datafile
++
++scriptversion=2009-04-28.21; # UTC
++
++# This originates from X11R5 (mit/util/scripts/install.sh), which was
++# later released in X11R6 (xc/config/util/install.sh) with the
++# following copyright and license.
++#
++# Copyright (C) 1994 X Consortium
++#
++# Permission is hereby granted, free of charge, to any person obtaining a copy
++# of this software and associated documentation files (the "Software"), to
++# deal in the Software without restriction, including without limitation the
++# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
++# sell copies of the Software, and to permit persons to whom the Software is
++# furnished to do so, subject to the following conditions:
++#
++# The above copyright notice and this permission notice shall be included in
++# all copies or substantial portions of the Software.
++#
++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
++# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
++# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
++# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
++#
++# Except as contained in this notice, the name of the X Consortium shall not
++# be used in advertising or otherwise to promote the sale, use or other deal-
++# ings in this Software without prior written authorization from the X Consor-
++# tium.
++#
++#
++# FSF changes to this file are in the public domain.
++#
++# Calling this script install-sh is preferred over install.sh, to prevent
++# `make' implicit rules from creating a file called install from it
++# when there is no Makefile.
++#
++# This script is compatible with the BSD install script, but was written
++# from scratch.
++
++nl='
++'
++IFS=" "" $nl"
++
++# set DOITPROG to echo to test this script
++
++# Don't use :- since 4.3BSD and earlier shells don't like it.
++doit=${DOITPROG-}
++if test -z "$doit"; then
++ doit_exec=exec
++else
++ doit_exec=$doit
++fi
++
++# Put in absolute file names if you don't have them in your path;
++# or use environment vars.
++
++chgrpprog=${CHGRPPROG-chgrp}
++chmodprog=${CHMODPROG-chmod}
++chownprog=${CHOWNPROG-chown}
++cmpprog=${CMPPROG-cmp}
++cpprog=${CPPROG-cp}
++mkdirprog=${MKDIRPROG-mkdir}
++mvprog=${MVPROG-mv}
++rmprog=${RMPROG-rm}
++stripprog=${STRIPPROG-strip}
++
++posix_glob='?'
++initialize_posix_glob='
++ test "$posix_glob" != "?" || {
++ if (set -f) 2>/dev/null; then
++ posix_glob=
++ else
++ posix_glob=:
++ fi
++ }
++'
++
++posix_mkdir=
++
++# Desired mode of installed file.
++mode=0755
++
++chgrpcmd=
++chmodcmd=$chmodprog
++chowncmd=
++mvcmd=$mvprog
++rmcmd="$rmprog -f"
++stripcmd=
++
++src=
++dst=
++dir_arg=
++dst_arg=
++
++copy_on_change=false
++no_target_directory=
++
++usage="\
++Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
++ or: $0 [OPTION]... SRCFILES... DIRECTORY
++ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
++ or: $0 [OPTION]... -d DIRECTORIES...
++
++In the 1st form, copy SRCFILE to DSTFILE.
++In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
++In the 4th, create DIRECTORIES.
++
++Options:
++ --help display this help and exit.
++ --version display version info and exit.
++
++ -c (ignored)
++ -C install only if different (preserve the last data modification time)
++ -d create directories instead of installing files.
++ -g GROUP $chgrpprog installed files to GROUP.
++ -m MODE $chmodprog installed files to MODE.
++ -o USER $chownprog installed files to USER.
++ -s $stripprog installed files.
++ -t DIRECTORY install into DIRECTORY.
++ -T report an error if DSTFILE is a directory.
++
++Environment variables override the default commands:
++ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
++ RMPROG STRIPPROG
++"
++
++while test $# -ne 0; do
++ case $1 in
++ -c) ;;
++
++ -C) copy_on_change=true;;
++
++ -d) dir_arg=true;;
++
++ -g) chgrpcmd="$chgrpprog $2"
++ shift;;
++
++ --help) echo "$usage"; exit $?;;
++
++ -m) mode=$2
++ case $mode in
++ *' '* | *' '* | *'
++'* | *'*'* | *'?'* | *'['*)
++ echo "$0: invalid mode: $mode" >&2
++ exit 1;;
++ esac
++ shift;;
++
++ -o) chowncmd="$chownprog $2"
++ shift;;
++
++ -s) stripcmd=$stripprog;;
++
++ -t) dst_arg=$2
++ shift;;
++
++ -T) no_target_directory=true;;
++
++ --version) echo "$0 $scriptversion"; exit $?;;
++
++ --) shift
++ break;;
++
++ -*) echo "$0: invalid option: $1" >&2
++ exit 1;;
++
++ *) break;;
++ esac
++ shift
++done
++
++if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
++ # When -d is used, all remaining arguments are directories to create.
++ # When -t is used, the destination is already specified.
++ # Otherwise, the last argument is the destination. Remove it from $@.
++ for arg
++ do
++ if test -n "$dst_arg"; then
++ # $@ is not empty: it contains at least $arg.
++ set fnord "$@" "$dst_arg"
++ shift # fnord
++ fi
++ shift # arg
++ dst_arg=$arg
++ done
++fi
++
++if test $# -eq 0; then
++ if test -z "$dir_arg"; then
++ echo "$0: no input file specified." >&2
++ exit 1
++ fi
++ # It's OK to call `install-sh -d' without argument.
++ # This can happen when creating conditional directories.
++ exit 0
++fi
++
++if test -z "$dir_arg"; then
++ trap '(exit $?); exit' 1 2 13 15
++
++ # Set umask so as not to create temps with too-generous modes.
++ # However, 'strip' requires both read and write access to temps.
++ case $mode in
++ # Optimize common cases.
++ *644) cp_umask=133;;
++ *755) cp_umask=22;;
++
++ *[0-7])
++ if test -z "$stripcmd"; then
++ u_plus_rw=
++ else
++ u_plus_rw='% 200'
++ fi
++ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
++ *)
++ if test -z "$stripcmd"; then
++ u_plus_rw=
++ else
++ u_plus_rw=,u+rw
++ fi
++ cp_umask=$mode$u_plus_rw;;
++ esac
++fi
++
++for src
++do
++ # Protect names starting with `-'.
++ case $src in
++ -*) src=./$src;;
++ esac
++
++ if test -n "$dir_arg"; then
++ dst=$src
++ dstdir=$dst
++ test -d "$dstdir"
++ dstdir_status=$?
++ else
++
++ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
++ # might cause directories to be created, which would be especially bad
++ # if $src (and thus $dsttmp) contains '*'.
++ if test ! -f "$src" && test ! -d "$src"; then
++ echo "$0: $src does not exist." >&2
++ exit 1
++ fi
++
++ if test -z "$dst_arg"; then
++ echo "$0: no destination specified." >&2
++ exit 1
++ fi
++
++ dst=$dst_arg
++ # Protect names starting with `-'.
++ case $dst in
++ -*) dst=./$dst;;
++ esac
++
++ # If destination is a directory, append the input filename; won't work
++ # if double slashes aren't ignored.
++ if test -d "$dst"; then
++ if test -n "$no_target_directory"; then
++ echo "$0: $dst_arg: Is a directory" >&2
++ exit 1
++ fi
++ dstdir=$dst
++ dst=$dstdir/`basename "$src"`
++ dstdir_status=0
++ else
++ # Prefer dirname, but fall back on a substitute if dirname fails.
++ dstdir=`
++ (dirname "$dst") 2>/dev/null ||
++ expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
++ X"$dst" : 'X\(//\)[^/]' \| \
++ X"$dst" : 'X\(//\)$' \| \
++ X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
++ echo X"$dst" |
++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
++ s//\1/
++ q
++ }
++ /^X\(\/\/\)[^/].*/{
++ s//\1/
++ q
++ }
++ /^X\(\/\/\)$/{
++ s//\1/
++ q
++ }
++ /^X\(\/\).*/{
++ s//\1/
++ q
++ }
++ s/.*/./; q'
++ `
++
++ test -d "$dstdir"
++ dstdir_status=$?
++ fi
++ fi
++
++ obsolete_mkdir_used=false
++
++ if test $dstdir_status != 0; then
++ case $posix_mkdir in
++ '')
++ # Create intermediate dirs using mode 755 as modified by the umask.
++ # This is like FreeBSD 'install' as of 1997-10-28.
++ umask=`umask`
++ case $stripcmd.$umask in
++ # Optimize common cases.
++ *[2367][2367]) mkdir_umask=$umask;;
++ .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
++
++ *[0-7])
++ mkdir_umask=`expr $umask + 22 \
++ - $umask % 100 % 40 + $umask % 20 \
++ - $umask % 10 % 4 + $umask % 2
++ `;;
++ *) mkdir_umask=$umask,go-w;;
++ esac
++
++ # With -d, create the new directory with the user-specified mode.
++ # Otherwise, rely on $mkdir_umask.
++ if test -n "$dir_arg"; then
++ mkdir_mode=-m$mode
++ else
++ mkdir_mode=
++ fi
++
++ posix_mkdir=false
++ case $umask in
++ *[123567][0-7][0-7])
++ # POSIX mkdir -p sets u+wx bits regardless of umask, which
++ # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
++ ;;
++ *)
++ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
++ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
++
++ if (umask $mkdir_umask &&
++ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
++ then
++ if test -z "$dir_arg" || {
++ # Check for POSIX incompatibilities with -m.
++ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
++ # other-writeable bit of parent directory when it shouldn't.
++ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
++ ls_ld_tmpdir=`ls -ld "$tmpdir"`
++ case $ls_ld_tmpdir in
++ d????-?r-*) different_mode=700;;
++ d????-?--*) different_mode=755;;
++ *) false;;
++ esac &&
++ $mkdirprog -m$different_mode -p -- "$tmpdir" && {
++ ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
++ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
++ }
++ }
++ then posix_mkdir=:
++ fi
++ rmdir "$tmpdir/d" "$tmpdir"
++ else
++ # Remove any dirs left behind by ancient mkdir implementations.
++ rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
++ fi
++ trap '' 0;;
++ esac;;
++ esac
++
++ if
++ $posix_mkdir && (
++ umask $mkdir_umask &&
++ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
++ )
++ then :
++ else
++
++ # The umask is ridiculous, or mkdir does not conform to POSIX,
++ # or it failed possibly due to a race condition. Create the
++ # directory the slow way, step by step, checking for races as we go.
++
++ case $dstdir in
++ /*) prefix='/';;
++ -*) prefix='./';;
++ *) prefix='';;
++ esac
++
++ eval "$initialize_posix_glob"
++
++ oIFS=$IFS
++ IFS=/
++ $posix_glob set -f
++ set fnord $dstdir
++ shift
++ $posix_glob set +f
++ IFS=$oIFS
++
++ prefixes=
++
++ for d
++ do
++ test -z "$d" && continue
++
++ prefix=$prefix$d
++ if test -d "$prefix"; then
++ prefixes=
++ else
++ if $posix_mkdir; then
++ (umask=$mkdir_umask &&
++ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
++ # Don't fail if two instances are running concurrently.
++ test -d "$prefix" || exit 1
++ else
++ case $prefix in
++ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
++ *) qprefix=$prefix;;
++ esac
++ prefixes="$prefixes '$qprefix'"
++ fi
++ fi
++ prefix=$prefix/
++ done
++
++ if test -n "$prefixes"; then
++ # Don't fail if two instances are running concurrently.
++ (umask $mkdir_umask &&
++ eval "\$doit_exec \$mkdirprog $prefixes") ||
++ test -d "$dstdir" || exit 1
++ obsolete_mkdir_used=true
++ fi
++ fi
++ fi
++
++ if test -n "$dir_arg"; then
++ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
++ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
++ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
++ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
++ else
++
++ # Make a couple of temp file names in the proper directory.
++ dsttmp=$dstdir/_inst.$$_
++ rmtmp=$dstdir/_rm.$$_
++
++ # Trap to clean up those temp files at exit.
++ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
++
++ # Copy the file name to the temp name.
++ (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
++
++ # and set any options; do chmod last to preserve setuid bits.
++ #
++ # If any of these fail, we abort the whole thing. If we want to
++ # ignore errors from any of these, just make sure not to ignore
++ # errors from the above "$doit $cpprog $src $dsttmp" command.
++ #
++ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
++ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
++ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
++ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
++
++ # If -C, don't bother to copy if it wouldn't change the file.
++ if $copy_on_change &&
++ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
++ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
++
++ eval "$initialize_posix_glob" &&
++ $posix_glob set -f &&
++ set X $old && old=:$2:$4:$5:$6 &&
++ set X $new && new=:$2:$4:$5:$6 &&
++ $posix_glob set +f &&
++
++ test "$old" = "$new" &&
++ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
++ then
++ rm -f "$dsttmp"
++ else
++ # Rename the file to the real destination.
++ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
++
++ # The rename failed, perhaps because mv can't rename something else
++ # to itself, or perhaps because mv is so ancient that it does not
++ # support -f.
++ {
++ # Now remove or move aside any old file at destination location.
++ # We try this two ways since rm can't unlink itself on some
++ # systems and the destination file might be busy for other
++ # reasons. In this case, the final cleanup might fail but the new
++ # file should still install successfully.
++ {
++ test ! -f "$dst" ||
++ $doit $rmcmd -f "$dst" 2>/dev/null ||
++ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
++ { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
++ } ||
++ { echo "$0: cannot unlink or rename $dst" >&2
++ (exit 1); exit 1
++ }
++ } &&
++
++ # Now rename the file to the real destination.
++ $doit $mvcmd "$dsttmp" "$dst"
++ }
++ fi || exit 1
++
++ trap '' 0
++ fi
++done
++
++# Local variables:
++# eval: (add-hook 'write-file-hooks 'time-stamp)
++# time-stamp-start: "scriptversion="
++# time-stamp-format: "%:y-%02m-%02d.%02H"
++# time-stamp-time-zone: "UTC"
++# time-stamp-end: "; # UTC"
++# End:
+diff --git a/libdessert.pc.in b/libdessert.pc.in
+new file mode 100644
+index 0000000..ddea821
+--- /dev/null
++++ b/libdessert.pc.in
+@@ -0,0 +1,11 @@
++prefix=@prefix@
++exec_prefix=@exec_prefix@
++libdir=@libdir@
++includedir=@includedir@
++
++Name: @PACKAGE_NAME@
++Description: DES-SERT - an Extensible Routing-Framework for Testbeds
++Version: @VERSION@
++Libs: @PTHREAD_LIBS@ -L${libdir} -ldessert
++Cflags: @PTHREAD_CFLAGS@ -I${includedir}
++
+diff --git a/ltmain.sh b/ltmain.sh
+new file mode 100755
+index 0000000..3506ead
+--- /dev/null
++++ b/ltmain.sh
+@@ -0,0 +1,8413 @@
++# Generated from ltmain.m4sh.
++
++# ltmain.sh (GNU libtool) 2.2.6
++# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
++
++# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc.
++# This is free software; see the source for copying conditions. There is NO
++# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
++
++# GNU Libtool is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2 of the License, or
++# (at your option) any later version.
++#
++# As a special exception to the GNU General Public License,
++# if you distribute this file as part of a program or library that
++# is built using GNU Libtool, you may include this file under the
++# same distribution terms that you use for the rest of that program.
++#
++# GNU Libtool is distributed in the hope that it will be useful, but
++# WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++# General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with GNU Libtool; see the file COPYING. If not, a copy
++# can be downloaded from http://www.gnu.org/licenses/gpl.html,
++# or obtained by writing to the Free Software Foundation, Inc.,
++# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
++
++# Usage: $progname [OPTION]... [MODE-ARG]...
++#
++# Provide generalized library-building support services.
++#
++# --config show all configuration variables
++# --debug enable verbose shell tracing
++# -n, --dry-run display commands without modifying any files
++# --features display basic configuration information and exit
++# --mode=MODE use operation mode MODE
++# --preserve-dup-deps don't remove duplicate dependency libraries
++# --quiet, --silent don't print informational messages
++# --tag=TAG use configuration variables from tag TAG
++# -v, --verbose print informational messages (default)
++# --version print version information
++# -h, --help print short or long help message
++#
++# MODE must be one of the following:
++#
++# clean remove files from the build directory
++# compile compile a source file into a libtool object
++# execute automatically set library path, then run a program
++# finish complete the installation of libtool libraries
++# install install libraries or executables
++# link create a library or an executable
++# uninstall remove libraries from an installed directory
++#
++# MODE-ARGS vary depending on the MODE.
++# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
++#
++# When reporting a bug, please describe a test case to reproduce it and
++# include the following information:
++#
++# host-triplet: $host
++# shell: $SHELL
++# compiler: $LTCC
++# compiler flags: $LTCFLAGS
++# linker: $LD (gnu? $with_gnu_ld)
++# $progname: (GNU libtool) 2.2.6 Debian-2.2.6a-4
++# automake: $automake_version
++# autoconf: $autoconf_version
++#
++# Report bugs to <bug-libtool@gnu.org>.
++
++PROGRAM=ltmain.sh
++PACKAGE=libtool
++VERSION="2.2.6 Debian-2.2.6a-4"
++TIMESTAMP=""
++package_revision=1.3012
++
++# Be Bourne compatible
++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
++ emulate sh
++ NULLCMD=:
++ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
++ # is contrary to our usage. Disable this feature.
++ alias -g '${1+"$@"}'='"$@"'
++ setopt NO_GLOB_SUBST
++else
++ case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
++fi
++BIN_SH=xpg4; export BIN_SH # for Tru64
++DUALCASE=1; export DUALCASE # for MKS sh
++
++# NLS nuisances: We save the old values to restore during execute mode.
++# Only set LANG and LC_ALL to C if already set.
++# These must not be set unconditionally because not all systems understand
++# e.g. LANG=C (notably SCO).
++lt_user_locale=
++lt_safe_locale=
++for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
++do
++ eval "if test \"\${$lt_var+set}\" = set; then
++ save_$lt_var=\$$lt_var
++ $lt_var=C
++ export $lt_var
++ lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
++ lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
++ fi"
++done
++
++$lt_unset CDPATH
++
++
++
++
++
++: ${CP="cp -f"}
++: ${ECHO="echo"}
++: ${EGREP="/bin/grep -E"}
++: ${FGREP="/bin/grep -F"}
++: ${GREP="/bin/grep"}
++: ${LN_S="ln -s"}
++: ${MAKE="make"}
++: ${MKDIR="mkdir"}
++: ${MV="mv -f"}
++: ${RM="rm -f"}
++: ${SED="/bin/sed"}
++: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
++: ${Xsed="$SED -e 1s/^X//"}
++
++# Global variables:
++EXIT_SUCCESS=0
++EXIT_FAILURE=1
++EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing.
++EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake.
++
++exit_status=$EXIT_SUCCESS
++
++# Make sure IFS has a sensible default
++lt_nl='
++'
++IFS=" $lt_nl"
++
++dirname="s,/[^/]*$,,"
++basename="s,^.*/,,"
++
++# func_dirname_and_basename file append nondir_replacement
++# perform func_basename and func_dirname in a single function
++# call:
++# dirname: Compute the dirname of FILE. If nonempty,
++# add APPEND to the result, otherwise set result
++# to NONDIR_REPLACEMENT.
++# value returned in "$func_dirname_result"
++# basename: Compute filename of FILE.
++# value retuned in "$func_basename_result"
++# Implementation must be kept synchronized with func_dirname
++# and func_basename. For efficiency, we do not delegate to
++# those functions but instead duplicate the functionality here.
++func_dirname_and_basename ()
++{
++ # Extract subdirectory from the argument.
++ func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
++ if test "X$func_dirname_result" = "X${1}"; then
++ func_dirname_result="${3}"
++ else
++ func_dirname_result="$func_dirname_result${2}"
++ fi
++ func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
++}
++
++# Generated shell functions inserted here.
++
++# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
++# is ksh but when the shell is invoked as "sh" and the current value of
++# the _XPG environment variable is not equal to 1 (one), the special
++# positional parameter $0, within a function call, is the name of the
++# function.
++progpath="$0"
++
++# The name of this program:
++# In the unlikely event $progname began with a '-', it would play havoc with
++# func_echo (imagine progname=-n), so we prepend ./ in that case:
++func_dirname_and_basename "$progpath"
++progname=$func_basename_result
++case $progname in
++ -*) progname=./$progname ;;
++esac
++
++# Make sure we have an absolute path for reexecution:
++case $progpath in
++ [\\/]*|[A-Za-z]:\\*) ;;
++ *[\\/]*)
++ progdir=$func_dirname_result
++ progdir=`cd "$progdir" && pwd`
++ progpath="$progdir/$progname"
++ ;;
++ *)
++ save_IFS="$IFS"
++ IFS=:
++ for progdir in $PATH; do
++ IFS="$save_IFS"
++ test -x "$progdir/$progname" && break
++ done
++ IFS="$save_IFS"
++ test -n "$progdir" || progdir=`pwd`
++ progpath="$progdir/$progname"
++ ;;
++esac
++
++# Sed substitution that helps us do robust quoting. It backslashifies
++# metacharacters that are still active within double-quoted strings.
++Xsed="${SED}"' -e 1s/^X//'
++sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
++
++# Same as above, but do not quote variable references.
++double_quote_subst='s/\(["`\\]\)/\\\1/g'
++
++# Re-`\' parameter expansions in output of double_quote_subst that were
++# `\'-ed in input to the same. If an odd number of `\' preceded a '$'
++# in input to double_quote_subst, that '$' was protected from expansion.
++# Since each input `\' is now two `\'s, look for any number of runs of
++# four `\'s followed by two `\'s and then a '$'. `\' that '$'.
++bs='\\'
++bs2='\\\\'
++bs4='\\\\\\\\'
++dollar='\$'
++sed_double_backslash="\
++ s/$bs4/&\\
++/g
++ s/^$bs2$dollar/$bs&/
++ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
++ s/\n//g"
++
++# Standard options:
++opt_dry_run=false
++opt_help=false
++opt_quiet=false
++opt_verbose=false
++opt_warning=:
++
++# func_echo arg...
++# Echo program name prefixed message, along with the current mode
++# name if it has been set yet.
++func_echo ()
++{
++ $ECHO "$progname${mode+: }$mode: $*"
++}
++
++# func_verbose arg...
++# Echo program name prefixed message in verbose mode only.
++func_verbose ()
++{
++ $opt_verbose && func_echo ${1+"$@"}
++
++ # A bug in bash halts the script if the last line of a function
++ # fails when set -e is in force, so we need another command to
++ # work around that:
++ :
++}
++
++# func_error arg...
++# Echo program name prefixed message to standard error.
++func_error ()
++{
++ $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
++}
++
++# func_warning arg...
++# Echo program name prefixed warning message to standard error.
++func_warning ()
++{
++ $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2
++
++ # bash bug again:
++ :
++}
++
++# func_fatal_error arg...
++# Echo program name prefixed message to standard error, and exit.
++func_fatal_error ()
++{
++ func_error ${1+"$@"}
++ exit $EXIT_FAILURE
++}
++
++# func_fatal_help arg...
++# Echo program name prefixed message to standard error, followed by
++# a help hint, and exit.
++func_fatal_help ()
++{
++ func_error ${1+"$@"}
++ func_fatal_error "$help"
++}
++help="Try \`$progname --help' for more information." ## default
++
++
++# func_grep expression filename
++# Check whether EXPRESSION matches any line of FILENAME, without output.
++func_grep ()
++{
++ $GREP "$1" "$2" >/dev/null 2>&1
++}
++
++
++# func_mkdir_p directory-path
++# Make sure the entire path to DIRECTORY-PATH is available.
++func_mkdir_p ()
++{
++ my_directory_path="$1"
++ my_dir_list=
++
++ if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
++
++ # Protect directory names starting with `-'
++ case $my_directory_path in
++ -*) my_directory_path="./$my_directory_path" ;;
++ esac
++
++ # While some portion of DIR does not yet exist...
++ while test ! -d "$my_directory_path"; do
++ # ...make a list in topmost first order. Use a colon delimited
++ # list incase some portion of path contains whitespace.
++ my_dir_list="$my_directory_path:$my_dir_list"
++
++ # If the last portion added has no slash in it, the list is done
++ case $my_directory_path in */*) ;; *) break ;; esac
++
++ # ...otherwise throw away the child directory and loop
++ my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"`
++ done
++ my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'`
++
++ save_mkdir_p_IFS="$IFS"; IFS=':'
++ for my_dir in $my_dir_list; do
++ IFS="$save_mkdir_p_IFS"
++ # mkdir can fail with a `File exist' error if two processes
++ # try to create one of the directories concurrently. Don't
++ # stop in that case!
++ $MKDIR "$my_dir" 2>/dev/null || :
++ done
++ IFS="$save_mkdir_p_IFS"
++
++ # Bail out if we (or some other process) failed to create a directory.
++ test -d "$my_directory_path" || \
++ func_fatal_error "Failed to create \`$1'"
++ fi
++}
++
++
++# func_mktempdir [string]
++# Make a temporary directory that won't clash with other running
++# libtool processes, and avoids race conditions if possible. If
++# given, STRING is the basename for that directory.
++func_mktempdir ()
++{
++ my_template="${TMPDIR-/tmp}/${1-$progname}"
++
++ if test "$opt_dry_run" = ":"; then
++ # Return a directory name, but don't create it in dry-run mode
++ my_tmpdir="${my_template}-$$"
++ else
++
++ # If mktemp works, use that first and foremost
++ my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
++
++ if test ! -d "$my_tmpdir"; then
++ # Failing that, at least try and use $RANDOM to avoid a race
++ my_tmpdir="${my_template}-${RANDOM-0}$$"
++
++ save_mktempdir_umask=`umask`
++ umask 0077
++ $MKDIR "$my_tmpdir"
++ umask $save_mktempdir_umask
++ fi
++
++ # If we're not in dry-run mode, bomb out on failure
++ test -d "$my_tmpdir" || \
++ func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
++ fi
++
++ $ECHO "X$my_tmpdir" | $Xsed
++}
++
++
++# func_quote_for_eval arg
++# Aesthetically quote ARG to be evaled later.
++# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
++# is double-quoted, suitable for a subsequent eval, whereas
++# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
++# which are still active within double quotes backslashified.
++func_quote_for_eval ()
++{
++ case $1 in
++ *[\\\`\"\$]*)
++ func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;;
++ *)
++ func_quote_for_eval_unquoted_result="$1" ;;
++ esac
++
++ case $func_quote_for_eval_unquoted_result in
++ # Double-quote args containing shell metacharacters to delay
++ # word splitting, command substitution and and variable
++ # expansion for a subsequent eval.
++ # Many Bourne shells cannot handle close brackets correctly
++ # in scan sets, so we specify it separately.
++ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
++ func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
++ ;;
++ *)
++ func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
++ esac
++}
++
++
++# func_quote_for_expand arg
++# Aesthetically quote ARG to be evaled later; same as above,
++# but do not quote variable references.
++func_quote_for_expand ()
++{
++ case $1 in
++ *[\\\`\"]*)
++ my_arg=`$ECHO "X$1" | $Xsed \
++ -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
++ *)
++ my_arg="$1" ;;
++ esac
++
++ case $my_arg in
++ # Double-quote args containing shell metacharacters to delay
++ # word splitting and command substitution for a subsequent eval.
++ # Many Bourne shells cannot handle close brackets correctly
++ # in scan sets, so we specify it separately.
++ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
++ my_arg="\"$my_arg\""
++ ;;
++ esac
++
++ func_quote_for_expand_result="$my_arg"
++}
++
++
++# func_show_eval cmd [fail_exp]
++# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is
++# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP
++# is given, then evaluate it.
++func_show_eval ()
++{
++ my_cmd="$1"
++ my_fail_exp="${2-:}"
++
++ ${opt_silent-false} || {
++ func_quote_for_expand "$my_cmd"
++ eval "func_echo $func_quote_for_expand_result"
++ }
++
++ if ${opt_dry_run-false}; then :; else
++ eval "$my_cmd"
++ my_status=$?
++ if test "$my_status" -eq 0; then :; else
++ eval "(exit $my_status); $my_fail_exp"
++ fi
++ fi
++}
++
++
++# func_show_eval_locale cmd [fail_exp]
++# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is
++# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP
++# is given, then evaluate it. Use the saved locale for evaluation.
++func_show_eval_locale ()
++{
++ my_cmd="$1"
++ my_fail_exp="${2-:}"
++
++ ${opt_silent-false} || {
++ func_quote_for_expand "$my_cmd"
++ eval "func_echo $func_quote_for_expand_result"
++ }
++
++ if ${opt_dry_run-false}; then :; else
++ eval "$lt_user_locale
++ $my_cmd"
++ my_status=$?
++ eval "$lt_safe_locale"
++ if test "$my_status" -eq 0; then :; else
++ eval "(exit $my_status); $my_fail_exp"
++ fi
++ fi
++}
++
++
++
++
++
++# func_version
++# Echo version message to standard output and exit.
++func_version ()
++{
++ $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / {
++ s/^# //
++ s/^# *$//
++ s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
++ p
++ }' < "$progpath"
++ exit $?
++}
++
++# func_usage
++# Echo short help message to standard output and exit.
++func_usage ()
++{
++ $SED -n '/^# Usage:/,/# -h/ {
++ s/^# //
++ s/^# *$//
++ s/\$progname/'$progname'/
++ p
++ }' < "$progpath"
++ $ECHO
++ $ECHO "run \`$progname --help | more' for full usage"
++ exit $?
++}
++
++# func_help
++# Echo long help message to standard output and exit.
++func_help ()
++{
++ $SED -n '/^# Usage:/,/# Report bugs to/ {
++ s/^# //
++ s/^# *$//
++ s*\$progname*'$progname'*
++ s*\$host*'"$host"'*
++ s*\$SHELL*'"$SHELL"'*
++ s*\$LTCC*'"$LTCC"'*
++ s*\$LTCFLAGS*'"$LTCFLAGS"'*
++ s*\$LD*'"$LD"'*
++ s/\$with_gnu_ld/'"$with_gnu_ld"'/
++ s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
++ s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
++ p
++ }' < "$progpath"
++ exit $?
++}
++
++# func_missing_arg argname
++# Echo program name prefixed message to standard error and set global
++# exit_cmd.
++func_missing_arg ()
++{
++ func_error "missing argument for $1"
++ exit_cmd=exit
++}
++
++exit_cmd=:
++
++
++
++
++
++# Check that we have a working $ECHO.
++if test "X$1" = X--no-reexec; then
++ # Discard the --no-reexec flag, and continue.
++ shift
++elif test "X$1" = X--fallback-echo; then
++ # Avoid inline document here, it may be left over
++ :
++elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then
++ # Yippee, $ECHO works!
++ :
++else
++ # Restart under the correct shell, and then maybe $ECHO will work.
++ exec $SHELL "$progpath" --no-reexec ${1+"$@"}
++fi
++
++if test "X$1" = X--fallback-echo; then
++ # used as fallback echo
++ shift
++ cat <<EOF
++$*
++EOF
++ exit $EXIT_SUCCESS
++fi
++
++magic="%%%MAGIC variable%%%"
++magic_exe="%%%MAGIC EXE variable%%%"
++
++# Global variables.
++# $mode is unset
++nonopt=
++execute_dlfiles=
++preserve_args=
++lo2o="s/\\.lo\$/.${objext}/"
++o2lo="s/\\.${objext}\$/.lo/"
++extracted_archives=
++extracted_serial=0
++
++opt_dry_run=false
++opt_duplicate_deps=false
++opt_silent=false
++opt_debug=:
++
++# If this variable is set in any of the actions, the command in it
++# will be execed at the end. This prevents here-documents from being
++# left over by shells.
++exec_cmd=
++
++# func_fatal_configuration arg...
++# Echo program name prefixed message to standard error, followed by
++# a configuration failure hint, and exit.
++func_fatal_configuration ()
++{
++ func_error ${1+"$@"}
++ func_error "See the $PACKAGE documentation for more information."
++ func_fatal_error "Fatal configuration error."
++}
++
++
++# func_config
++# Display the configuration for all the tags in this script.
++func_config ()
++{
++ re_begincf='^# ### BEGIN LIBTOOL'
++ re_endcf='^# ### END LIBTOOL'
++
++ # Default configuration.
++ $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
++
++ # Now print the configurations for the tags.
++ for tagname in $taglist; do
++ $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
++ done
++
++ exit $?
++}
++
++# func_features
++# Display the features supported by this script.
++func_features ()
++{
++ $ECHO "host: $host"
++ if test "$build_libtool_libs" = yes; then
++ $ECHO "enable shared libraries"
++ else
++ $ECHO "disable shared libraries"
++ fi
++ if test "$build_old_libs" = yes; then
++ $ECHO "enable static libraries"
++ else
++ $ECHO "disable static libraries"
++ fi
++
++ exit $?
++}
++
++# func_enable_tag tagname
++# Verify that TAGNAME is valid, and either flag an error and exit, or
++# enable the TAGNAME tag. We also add TAGNAME to the global $taglist
++# variable here.
++func_enable_tag ()
++{
++ # Global variable:
++ tagname="$1"
++
++ re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
++ re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
++ sed_extractcf="/$re_begincf/,/$re_endcf/p"
++
++ # Validate tagname.
++ case $tagname in
++ *[!-_A-Za-z0-9,/]*)
++ func_fatal_error "invalid tag name: $tagname"
++ ;;
++ esac
++
++ # Don't test for the "default" C tag, as we know it's
++ # there but not specially marked.
++ case $tagname in
++ CC) ;;
++ *)
++ if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
++ taglist="$taglist $tagname"
++
++ # Evaluate the configuration. Be careful to quote the path
++ # and the sed script, to avoid splitting on whitespace, but
++ # also don't use non-portable quotes within backquotes within
++ # quotes we have to do it in 2 steps:
++ extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
++ eval "$extractedcf"
++ else
++ func_error "ignoring unknown tag $tagname"
++ fi
++ ;;
++ esac
++}
++
++# Parse options once, thoroughly. This comes as soon as possible in
++# the script to make things like `libtool --version' happen quickly.
++{
++
++ # Shorthand for --mode=foo, only valid as the first argument
++ case $1 in
++ clean|clea|cle|cl)
++ shift; set dummy --mode clean ${1+"$@"}; shift
++ ;;
++ compile|compil|compi|comp|com|co|c)
++ shift; set dummy --mode compile ${1+"$@"}; shift
++ ;;
++ execute|execut|execu|exec|exe|ex|e)
++ shift; set dummy --mode execute ${1+"$@"}; shift
++ ;;
++ finish|finis|fini|fin|fi|f)
++ shift; set dummy --mode finish ${1+"$@"}; shift
++ ;;
++ install|instal|insta|inst|ins|in|i)
++ shift; set dummy --mode install ${1+"$@"}; shift
++ ;;
++ link|lin|li|l)
++ shift; set dummy --mode link ${1+"$@"}; shift
++ ;;
++ uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
++ shift; set dummy --mode uninstall ${1+"$@"}; shift
++ ;;
++ esac
++
++ # Parse non-mode specific arguments:
++ while test "$#" -gt 0; do
++ opt="$1"
++ shift
++
++ case $opt in
++ --config) func_config ;;
++
++ --debug) preserve_args="$preserve_args $opt"
++ func_echo "enabling shell trace mode"
++ opt_debug='set -x'
++ $opt_debug
++ ;;
++
++ -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break
++ execute_dlfiles="$execute_dlfiles $1"
++ shift
++ ;;
++
++ --dry-run | -n) opt_dry_run=: ;;
++ --features) func_features ;;
++ --finish) mode="finish" ;;
++
++ --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break
++ case $1 in
++ # Valid mode arguments:
++ clean) ;;
++ compile) ;;
++ execute) ;;
++ finish) ;;
++ install) ;;
++ link) ;;
++ relink) ;;
++ uninstall) ;;
++
++ # Catch anything else as an error
++ *) func_error "invalid argument for $opt"
++ exit_cmd=exit
++ break
++ ;;
++ esac
++
++ mode="$1"
++ shift
++ ;;
++
++ --preserve-dup-deps)
++ opt_duplicate_deps=: ;;
++
++ --quiet|--silent) preserve_args="$preserve_args $opt"
++ opt_silent=:
++ ;;
++
++ --verbose| -v) preserve_args="$preserve_args $opt"
++ opt_silent=false
++ ;;
++
++ --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break
++ preserve_args="$preserve_args $opt $1"
++ func_enable_tag "$1" # tagname is set here
++ shift
++ ;;
++
++ # Separate optargs to long options:
++ -dlopen=*|--mode=*|--tag=*)
++ func_opt_split "$opt"
++ set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
++ shift
++ ;;
++
++ -\?|-h) func_usage ;;
++ --help) opt_help=: ;;
++ --version) func_version ;;
++
++ -*) func_fatal_help "unrecognized option \`$opt'" ;;
++
++ *) nonopt="$opt"
++ break
++ ;;
++ esac
++ done
++
++
++ case $host in
++ *cygwin* | *mingw* | *pw32* | *cegcc*)
++ # don't eliminate duplications in $postdeps and $predeps
++ opt_duplicate_compiler_generated_deps=:
++ ;;
++ *)
++ opt_duplicate_compiler_generated_deps=$opt_duplicate_deps
++ ;;
++ esac
++
++ # Having warned about all mis-specified options, bail out if
++ # anything was wrong.
++ $exit_cmd $EXIT_FAILURE
++}
++
++# func_check_version_match
++# Ensure that we are using m4 macros, and libtool script from the same
++# release of libtool.
++func_check_version_match ()
++{
++ if test "$package_revision" != "$macro_revision"; then
++ if test "$VERSION" != "$macro_version"; then
++ if test -z "$macro_version"; then
++ cat >&2 <<_LT_EOF
++$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
++$progname: definition of this LT_INIT comes from an older release.
++$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
++$progname: and run autoconf again.
++_LT_EOF
++ else
++ cat >&2 <<_LT_EOF
++$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
++$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
++$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
++$progname: and run autoconf again.
++_LT_EOF
++ fi
++ else
++ cat >&2 <<_LT_EOF
++$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision,
++$progname: but the definition of this LT_INIT comes from revision $macro_revision.
++$progname: You should recreate aclocal.m4 with macros from revision $package_revision
++$progname: of $PACKAGE $VERSION and run autoconf again.
++_LT_EOF
++ fi
++
++ exit $EXIT_MISMATCH
++ fi
++}
++
++
++## ----------- ##
++## Main. ##
++## ----------- ##
++
++$opt_help || {
++ # Sanity checks first:
++ func_check_version_match
++
++ if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
++ func_fatal_configuration "not configured to build any kind of library"
++ fi
++
++ test -z "$mode" && func_fatal_error "error: you must specify a MODE."
++
++
++ # Darwin sucks
++ eval std_shrext=\"$shrext_cmds\"
++
++
++ # Only execute mode is allowed to have -dlopen flags.
++ if test -n "$execute_dlfiles" && test "$mode" != execute; then
++ func_error "unrecognized option \`-dlopen'"
++ $ECHO "$help" 1>&2
++ exit $EXIT_FAILURE
++ fi
++
++ # Change the help message to a mode-specific one.
++ generic_help="$help"
++ help="Try \`$progname --help --mode=$mode' for more information."
++}
++
++
++# func_lalib_p file
++# True iff FILE is a libtool `.la' library or `.lo' object file.
++# This function is only a basic sanity check; it will hardly flush out
++# determined imposters.
++func_lalib_p ()
++{
++ test -f "$1" &&
++ $SED -e 4q "$1" 2>/dev/null \
++ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
++}
++
++# func_lalib_unsafe_p file
++# True iff FILE is a libtool `.la' library or `.lo' object file.
++# This function implements the same check as func_lalib_p without
++# resorting to external programs. To this end, it redirects stdin and
++# closes it afterwards, without saving the original file descriptor.
++# As a safety measure, use it only where a negative result would be
++# fatal anyway. Works if `file' does not exist.
++func_lalib_unsafe_p ()
++{
++ lalib_p=no
++ if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
++ for lalib_p_l in 1 2 3 4
++ do
++ read lalib_p_line
++ case "$lalib_p_line" in
++ \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
++ esac
++ done
++ exec 0<&5 5<&-
++ fi
++ test "$lalib_p" = yes
++}
++
++# func_ltwrapper_script_p file
++# True iff FILE is a libtool wrapper script
++# This function is only a basic sanity check; it will hardly flush out
++# determined imposters.
++func_ltwrapper_script_p ()
++{
++ func_lalib_p "$1"
++}
++
++# func_ltwrapper_executable_p file
++# True iff FILE is a libtool wrapper executable
++# This function is only a basic sanity check; it will hardly flush out
++# determined imposters.
++func_ltwrapper_executable_p ()
++{
++ func_ltwrapper_exec_suffix=
++ case $1 in
++ *.exe) ;;
++ *) func_ltwrapper_exec_suffix=.exe ;;
++ esac
++ $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
++}
++
++# func_ltwrapper_scriptname file
++# Assumes file is an ltwrapper_executable
++# uses $file to determine the appropriate filename for a
++# temporary ltwrapper_script.
++func_ltwrapper_scriptname ()
++{
++ func_ltwrapper_scriptname_result=""
++ if func_ltwrapper_executable_p "$1"; then
++ func_dirname_and_basename "$1" "" "."
++ func_stripname '' '.exe' "$func_basename_result"
++ func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
++ fi
++}
++
++# func_ltwrapper_p file
++# True iff FILE is a libtool wrapper script or wrapper executable
++# This function is only a basic sanity check; it will hardly flush out
++# determined imposters.
++func_ltwrapper_p ()
++{
++ func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
++}
++
++
++# func_execute_cmds commands fail_cmd
++# Execute tilde-delimited COMMANDS.
++# If FAIL_CMD is given, eval that upon failure.
++# FAIL_CMD may read-access the current command in variable CMD!
++func_execute_cmds ()
++{
++ $opt_debug
++ save_ifs=$IFS; IFS='~'
++ for cmd in $1; do
++ IFS=$save_ifs
++ eval cmd=\"$cmd\"
++ func_show_eval "$cmd" "${2-:}"
++ done
++ IFS=$save_ifs
++}
++
++
++# func_source file
++# Source FILE, adding directory component if necessary.
++# Note that it is not necessary on cygwin/mingw to append a dot to
++# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
++# behavior happens only for exec(3), not for open(2)! Also, sourcing
++# `FILE.' does not work on cygwin managed mounts.
++func_source ()
++{
++ $opt_debug
++ case $1 in
++ */* | *\\*) . "$1" ;;
++ *) . "./$1" ;;
++ esac
++}
++
++
++# func_infer_tag arg
++# Infer tagged configuration to use if any are available and
++# if one wasn't chosen via the "--tag" command line option.
++# Only attempt this if the compiler in the base compile
++# command doesn't match the default compiler.
++# arg is usually of the form 'gcc ...'
++func_infer_tag ()
++{
++ $opt_debug
++ if test -n "$available_tags" && test -z "$tagname"; then
++ CC_quoted=
++ for arg in $CC; do
++ func_quote_for_eval "$arg"
++ CC_quoted="$CC_quoted $func_quote_for_eval_result"
++ done
++ case $@ in
++ # Blanks in the command may have been stripped by the calling shell,
++ # but not from the CC environment variable when configure was run.
++ " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;;
++ # Blanks at the start of $base_compile will cause this to fail
++ # if we don't check for them as well.
++ *)
++ for z in $available_tags; do
++ if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
++ # Evaluate the configuration.
++ eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
++ CC_quoted=
++ for arg in $CC; do
++ # Double-quote args containing other shell metacharacters.
++ func_quote_for_eval "$arg"
++ CC_quoted="$CC_quoted $func_quote_for_eval_result"
++ done
++ case "$@ " in
++ " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*)
++ # The compiler in the base compile command matches
++ # the one in the tagged configuration.
++ # Assume this is the tagged configuration we want.
++ tagname=$z
++ break
++ ;;
++ esac
++ fi
++ done
++ # If $tagname still isn't set, then no tagged configuration
++ # was found and let the user know that the "--tag" command
++ # line option must be used.
++ if test -z "$tagname"; then
++ func_echo "unable to infer tagged configuration"
++ func_fatal_error "specify a tag with \`--tag'"
++# else
++# func_verbose "using $tagname tagged configuration"
++ fi
++ ;;
++ esac
++ fi
++}
++
++
++
++# func_write_libtool_object output_name pic_name nonpic_name
++# Create a libtool object file (analogous to a ".la" file),
++# but don't create it if we're doing a dry run.
++func_write_libtool_object ()
++{
++ write_libobj=${1}
++ if test "$build_libtool_libs" = yes; then
++ write_lobj=\'${2}\'
++ else
++ write_lobj=none
++ fi
++
++ if test "$build_old_libs" = yes; then
++ write_oldobj=\'${3}\'
++ else
++ write_oldobj=none
++ fi
++
++ $opt_dry_run || {
++ cat >${write_libobj}T <<EOF
++# $write_libobj - a libtool object file
++# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
++#
++# Please DO NOT delete this file!
++# It is necessary for linking the library.
++
++# Name of the PIC object.
++pic_object=$write_lobj
++
++# Name of the non-PIC object
++non_pic_object=$write_oldobj
++
++EOF
++ $MV "${write_libobj}T" "${write_libobj}"
++ }
++}
++
++# func_mode_compile arg...
++func_mode_compile ()
++{
++ $opt_debug
++ # Get the compilation command and the source file.
++ base_compile=
++ srcfile="$nonopt" # always keep a non-empty value in "srcfile"
++ suppress_opt=yes
++ suppress_output=
++ arg_mode=normal
++ libobj=
++ later=
++ pie_flag=
++
++ for arg
++ do
++ case $arg_mode in
++ arg )
++ # do not "continue". Instead, add this to base_compile
++ lastarg="$arg"
++ arg_mode=normal
++ ;;
++
++ target )
++ libobj="$arg"
++ arg_mode=normal
++ continue
++ ;;
++
++ normal )
++ # Accept any command-line options.
++ case $arg in
++ -o)
++ test -n "$libobj" && \
++ func_fatal_error "you cannot specify \`-o' more than once"
++ arg_mode=target
++ continue
++ ;;
++
++ -pie | -fpie | -fPIE)
++ pie_flag="$pie_flag $arg"
++ continue
++ ;;
++
++ -shared | -static | -prefer-pic | -prefer-non-pic)
++ later="$later $arg"
++ continue
++ ;;
++
++ -no-suppress)
++ suppress_opt=no
++ continue
++ ;;
++
++ -Xcompiler)
++ arg_mode=arg # the next one goes into the "base_compile" arg list
++ continue # The current "srcfile" will either be retained or
++ ;; # replaced later. I would guess that would be a bug.
++
++ -Wc,*)
++ func_stripname '-Wc,' '' "$arg"
++ args=$func_stripname_result
++ lastarg=
++ save_ifs="$IFS"; IFS=','
++ for arg in $args; do
++ IFS="$save_ifs"
++ func_quote_for_eval "$arg"
++ lastarg="$lastarg $func_quote_for_eval_result"
++ done
++ IFS="$save_ifs"
++ func_stripname ' ' '' "$lastarg"
++ lastarg=$func_stripname_result
++
++ # Add the arguments to base_compile.
++ base_compile="$base_compile $lastarg"
++ continue
++ ;;
++
++ *)
++ # Accept the current argument as the source file.
++ # The previous "srcfile" becomes the current argument.
++ #
++ lastarg="$srcfile"
++ srcfile="$arg"
++ ;;
++ esac # case $arg
++ ;;
++ esac # case $arg_mode
++
++ # Aesthetically quote the previous argument.
++ func_quote_for_eval "$lastarg"
++ base_compile="$base_compile $func_quote_for_eval_result"
++ done # for arg
++
++ case $arg_mode in
++ arg)
++ func_fatal_error "you must specify an argument for -Xcompile"
++ ;;
++ target)
++ func_fatal_error "you must specify a target with \`-o'"
++ ;;
++ *)
++ # Get the name of the library object.
++ test -z "$libobj" && {
++ func_basename "$srcfile"
++ libobj="$func_basename_result"
++ }
++ ;;
++ esac
++
++ # Recognize several different file suffixes.
++ # If the user specifies -o file.o, it is replaced with file.lo
++ case $libobj in
++ *.[cCFSifmso] | \
++ *.ada | *.adb | *.ads | *.asm | \
++ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
++ *.[fF][09]? | *.for | *.java | *.obj | *.sx)
++ func_xform "$libobj"
++ libobj=$func_xform_result
++ ;;
++ esac
++
++ case $libobj in
++ *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
++ *)
++ func_fatal_error "cannot determine name of library object from \`$libobj'"
++ ;;
++ esac
++
++ func_infer_tag $base_compile
++
++ for arg in $later; do
++ case $arg in
++ -shared)
++ test "$build_libtool_libs" != yes && \
++ func_fatal_configuration "can not build a shared library"
++ build_old_libs=no
++ continue
++ ;;
++
++ -static)
++ build_libtool_libs=no
++ build_old_libs=yes
++ continue
++ ;;
++
++ -prefer-pic)
++ pic_mode=yes
++ continue
++ ;;
++
++ -prefer-non-pic)
++ pic_mode=no
++ continue
++ ;;
++ esac
++ done
++
++ func_quote_for_eval "$libobj"
++ test "X$libobj" != "X$func_quote_for_eval_result" \
++ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \
++ && func_warning "libobj name \`$libobj' may not contain shell special characters."
++ func_dirname_and_basename "$obj" "/" ""
++ objname="$func_basename_result"
++ xdir="$func_dirname_result"
++ lobj=${xdir}$objdir/$objname
++
++ test -z "$base_compile" && \
++ func_fatal_help "you must specify a compilation command"
++
++ # Delete any leftover library objects.
++ if test "$build_old_libs" = yes; then
++ removelist="$obj $lobj $libobj ${libobj}T"
++ else
++ removelist="$lobj $libobj ${libobj}T"
++ fi
++
++ # On Cygwin there's no "real" PIC flag so we must build both object types
++ case $host_os in
++ cygwin* | mingw* | pw32* | os2* | cegcc*)
++ pic_mode=default
++ ;;
++ esac
++ if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
++ # non-PIC code in shared libraries is not supported
++ pic_mode=default
++ fi
++
++ # Calculate the filename of the output object if compiler does
++ # not support -o with -c
++ if test "$compiler_c_o" = no; then
++ output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
++ lockfile="$output_obj.lock"
++ else
++ output_obj=
++ need_locks=no
++ lockfile=
++ fi
++
++ # Lock this critical section if it is needed
++ # We use this script file to make the link, it avoids creating a new file
++ if test "$need_locks" = yes; then
++ until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
++ func_echo "Waiting for $lockfile to be removed"
++ sleep 2
++ done
++ elif test "$need_locks" = warn; then
++ if test -f "$lockfile"; then
++ $ECHO "\
++*** ERROR, $lockfile exists and contains:
++`cat $lockfile 2>/dev/null`
++
++This indicates that another process is trying to use the same
++temporary object file, and libtool could not work around it because
++your compiler does not support \`-c' and \`-o' together. If you
++repeat this compilation, it may succeed, by chance, but you had better
++avoid parallel builds (make -j) in this platform, or get a better
++compiler."
++
++ $opt_dry_run || $RM $removelist
++ exit $EXIT_FAILURE
++ fi
++ removelist="$removelist $output_obj"
++ $ECHO "$srcfile" > "$lockfile"
++ fi
++
++ $opt_dry_run || $RM $removelist
++ removelist="$removelist $lockfile"
++ trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
++
++ if test -n "$fix_srcfile_path"; then
++ eval srcfile=\"$fix_srcfile_path\"
++ fi
++ func_quote_for_eval "$srcfile"
++ qsrcfile=$func_quote_for_eval_result
++
++ # Only build a PIC object if we are building libtool libraries.
++ if test "$build_libtool_libs" = yes; then
++ # Without this assignment, base_compile gets emptied.
++ fbsd_hideous_sh_bug=$base_compile
++
++ if test "$pic_mode" != no; then
++ command="$base_compile $qsrcfile $pic_flag"
++ else
++ # Don't build PIC code
++ command="$base_compile $qsrcfile"
++ fi
++
++ func_mkdir_p "$xdir$objdir"
++
++ if test -z "$output_obj"; then
++ # Place PIC objects in $objdir
++ command="$command -o $lobj"
++ fi
++
++ func_show_eval_locale "$command" \
++ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
++
++ if test "$need_locks" = warn &&
++ test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
++ $ECHO "\
++*** ERROR, $lockfile contains:
++`cat $lockfile 2>/dev/null`
++
++but it should contain:
++$srcfile
++
++This indicates that another process is trying to use the same
++temporary object file, and libtool could not work around it because
++your compiler does not support \`-c' and \`-o' together. If you
++repeat this compilation, it may succeed, by chance, but you had better
++avoid parallel builds (make -j) in this platform, or get a better
++compiler."
++
++ $opt_dry_run || $RM $removelist
++ exit $EXIT_FAILURE
++ fi
++
++ # Just move the object if needed, then go on to compile the next one
++ if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
++ func_show_eval '$MV "$output_obj" "$lobj"' \
++ 'error=$?; $opt_dry_run || $RM $removelist; exit $error'
++ fi
++
++ # Allow error messages only from the first compilation.
++ if test "$suppress_opt" = yes; then
++ suppress_output=' >/dev/null 2>&1'
++ fi
++ fi
++
++ # Only build a position-dependent object if we build old libraries.
++ if test "$build_old_libs" = yes; then
++ if test "$pic_mode" != yes; then
++ # Don't build PIC code
++ command="$base_compile $qsrcfile$pie_flag"
++ else
++ command="$base_compile $qsrcfile $pic_flag"
++ fi
++ if test "$compiler_c_o" = yes; then
++ command="$command -o $obj"
++ fi
++
++ # Suppress compiler output if we already did a PIC compilation.
++ command="$command$suppress_output"
++ func_show_eval_locale "$command" \
++ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
++
++ if test "$need_locks" = warn &&
++ test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
++ $ECHO "\
++*** ERROR, $lockfile contains:
++`cat $lockfile 2>/dev/null`
++
++but it should contain:
++$srcfile
++
++This indicates that another process is trying to use the same
++temporary object file, and libtool could not work around it because
++your compiler does not support \`-c' and \`-o' together. If you
++repeat this compilation, it may succeed, by chance, but you had better
++avoid parallel builds (make -j) in this platform, or get a better
++compiler."
++
++ $opt_dry_run || $RM $removelist
++ exit $EXIT_FAILURE
++ fi
++
++ # Just move the object if needed
++ if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
++ func_show_eval '$MV "$output_obj" "$obj"' \
++ 'error=$?; $opt_dry_run || $RM $removelist; exit $error'
++ fi
++ fi
++
++ $opt_dry_run || {
++ func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
++
++ # Unlock the critical section if it was locked
++ if test "$need_locks" != no; then
++ removelist=$lockfile
++ $RM "$lockfile"
++ fi
++ }
++
++ exit $EXIT_SUCCESS
++}
++
++$opt_help || {
++test "$mode" = compile && func_mode_compile ${1+"$@"}
++}
++
++func_mode_help ()
++{
++ # We need to display help for each of the modes.
++ case $mode in
++ "")
++ # Generic help is extracted from the usage comments
++ # at the start of this file.
++ func_help
++ ;;
++
++ clean)
++ $ECHO \
++"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
++
++Remove files from the build directory.
++
++RM is the name of the program to use to delete files associated with each FILE
++(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
++to RM.
++
++If FILE is a libtool library, object or program, all the files associated
++with it are deleted. Otherwise, only FILE itself is deleted using RM."
++ ;;
++
++ compile)
++ $ECHO \
++"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
++
++Compile a source file into a libtool library object.
++
++This mode accepts the following additional options:
++
++ -o OUTPUT-FILE set the output file name to OUTPUT-FILE
++ -no-suppress do not suppress compiler output for multiple passes
++ -prefer-pic try to building PIC objects only
++ -prefer-non-pic try to building non-PIC objects only
++ -shared do not build a \`.o' file suitable for static linking
++ -static only build a \`.o' file suitable for static linking
++
++COMPILE-COMMAND is a command to be used in creating a \`standard' object file
++from the given SOURCEFILE.
++
++The output file name is determined by removing the directory component from
++SOURCEFILE, then substituting the C source code suffix \`.c' with the
++library object suffix, \`.lo'."
++ ;;
++
++ execute)
++ $ECHO \
++"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
++
++Automatically set library path, then run a program.
++
++This mode accepts the following additional options:
++
++ -dlopen FILE add the directory containing FILE to the library path
++
++This mode sets the library path environment variable according to \`-dlopen'
++flags.
++
++If any of the ARGS are libtool executable wrappers, then they are translated
++into their corresponding uninstalled binary, and any of their required library
++directories are added to the library path.
++
++Then, COMMAND is executed, with ARGS as arguments."
++ ;;
++
++ finish)
++ $ECHO \
++"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
++
++Complete the installation of libtool libraries.
++
++Each LIBDIR is a directory that contains libtool libraries.
++
++The commands that this mode executes may require superuser privileges. Use
++the \`--dry-run' option if you just want to see what would be executed."
++ ;;
++
++ install)
++ $ECHO \
++"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
++
++Install executables or libraries.
++
++INSTALL-COMMAND is the installation command. The first component should be
++either the \`install' or \`cp' program.
++
++The following components of INSTALL-COMMAND are treated specially:
++
++ -inst-prefix PREFIX-DIR Use PREFIX-DIR as a staging area for installation
++
++The rest of the components are interpreted as arguments to that command (only
++BSD-compatible install options are recognized)."
++ ;;
++
++ link)
++ $ECHO \
++"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
++
++Link object files or libraries together to form another library, or to
++create an executable program.
++
++LINK-COMMAND is a command using the C compiler that you would use to create
++a program from several object files.
++
++The following components of LINK-COMMAND are treated specially:
++
++ -all-static do not do any dynamic linking at all
++ -avoid-version do not add a version suffix if possible
++ -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime
++ -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols
++ -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
++ -export-symbols SYMFILE
++ try to export only the symbols listed in SYMFILE
++ -export-symbols-regex REGEX
++ try to export only the symbols matching REGEX
++ -LLIBDIR search LIBDIR for required installed libraries
++ -lNAME OUTPUT-FILE requires the installed library libNAME
++ -module build a library that can dlopened
++ -no-fast-install disable the fast-install mode
++ -no-install link a not-installable executable
++ -no-undefined declare that a library does not refer to external symbols
++ -o OUTPUT-FILE create OUTPUT-FILE from the specified objects
++ -objectlist FILE Use a list of object files found in FILE to specify objects
++ -precious-files-regex REGEX
++ don't remove output files matching REGEX
++ -release RELEASE specify package release information
++ -rpath LIBDIR the created library will eventually be installed in LIBDIR
++ -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries
++ -shared only do dynamic linking of libtool libraries
++ -shrext SUFFIX override the standard shared library file extension
++ -static do not do any dynamic linking of uninstalled libtool libraries
++ -static-libtool-libs
++ do not do any dynamic linking of libtool libraries
++ -version-info CURRENT[:REVISION[:AGE]]
++ specify library version info [each variable defaults to 0]
++ -weak LIBNAME declare that the target provides the LIBNAME interface
++
++All other options (arguments beginning with \`-') are ignored.
++
++Every other argument is treated as a filename. Files ending in \`.la' are
++treated as uninstalled libtool libraries, other files are standard or library
++object files.
++
++If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
++only library objects (\`.lo' files) may be specified, and \`-rpath' is
++required, except when creating a convenience library.
++
++If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
++using \`ar' and \`ranlib', or on Windows using \`lib'.
++
++If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
++is created, otherwise an executable program is created."
++ ;;
++
++ uninstall)
++ $ECHO \
++"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
++
++Remove libraries from an installation directory.
++
++RM is the name of the program to use to delete files associated with each FILE
++(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
++to RM.
++
++If FILE is a libtool library, all the files associated with it are deleted.
++Otherwise, only FILE itself is deleted using RM."
++ ;;
++
++ *)
++ func_fatal_help "invalid operation mode \`$mode'"
++ ;;
++ esac
++
++ $ECHO
++ $ECHO "Try \`$progname --help' for more information about other modes."
++
++ exit $?
++}
++
++ # Now that we've collected a possible --mode arg, show help if necessary
++ $opt_help && func_mode_help
++
++
++# func_mode_execute arg...
++func_mode_execute ()
++{
++ $opt_debug
++ # The first argument is the command name.
++ cmd="$nonopt"
++ test -z "$cmd" && \
++ func_fatal_help "you must specify a COMMAND"
++
++ # Handle -dlopen flags immediately.
++ for file in $execute_dlfiles; do
++ test -f "$file" \
++ || func_fatal_help "\`$file' is not a file"
++
++ dir=
++ case $file in
++ *.la)
++ # Check to see that this really is a libtool archive.
++ func_lalib_unsafe_p "$file" \
++ || func_fatal_help "\`$lib' is not a valid libtool archive"
++
++ # Read the libtool library.
++ dlname=
++ library_names=
++ func_source "$file"
++
++ # Skip this library if it cannot be dlopened.
++ if test -z "$dlname"; then
++ # Warn if it was a shared library.
++ test -n "$library_names" && \
++ func_warning "\`$file' was not linked with \`-export-dynamic'"
++ continue
++ fi
++
++ func_dirname "$file" "" "."
++ dir="$func_dirname_result"
++
++ if test -f "$dir/$objdir/$dlname"; then
++ dir="$dir/$objdir"
++ else
++ if test ! -f "$dir/$dlname"; then
++ func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
++ fi
++ fi
++ ;;
++
++ *.lo)
++ # Just add the directory containing the .lo file.
++ func_dirname "$file" "" "."
++ dir="$func_dirname_result"
++ ;;
++
++ *)
++ func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
++ continue
++ ;;
++ esac
++
++ # Get the absolute pathname.
++ absdir=`cd "$dir" && pwd`
++ test -n "$absdir" && dir="$absdir"
++
++ # Now add the directory to shlibpath_var.
++ if eval "test -z \"\$$shlibpath_var\""; then
++ eval "$shlibpath_var=\"\$dir\""
++ else
++ eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
++ fi
++ done
++
++ # This variable tells wrapper scripts just to set shlibpath_var
++ # rather than running their programs.
++ libtool_execute_magic="$magic"
++
++ # Check if any of the arguments is a wrapper script.
++ args=
++ for file
++ do
++ case $file in
++ -*) ;;
++ *)
++ # Do a test to see if this is really a libtool program.
++ if func_ltwrapper_script_p "$file"; then
++ func_source "$file"
++ # Transform arg to wrapped name.
++ file="$progdir/$program"
++ elif func_ltwrapper_executable_p "$file"; then
++ func_ltwrapper_scriptname "$file"
++ func_source "$func_ltwrapper_scriptname_result"
++ # Transform arg to wrapped name.
++ file="$progdir/$program"
++ fi
++ ;;
++ esac
++ # Quote arguments (to preserve shell metacharacters).
++ func_quote_for_eval "$file"
++ args="$args $func_quote_for_eval_result"
++ done
++
++ if test "X$opt_dry_run" = Xfalse; then
++ if test -n "$shlibpath_var"; then
++ # Export the shlibpath_var.
++ eval "export $shlibpath_var"
++ fi
++
++ # Restore saved environment variables
++ for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
++ do
++ eval "if test \"\${save_$lt_var+set}\" = set; then
++ $lt_var=\$save_$lt_var; export $lt_var
++ else
++ $lt_unset $lt_var
++ fi"
++ done
++
++ # Now prepare to actually exec the command.
++ exec_cmd="\$cmd$args"
++ else
++ # Display what would be done.
++ if test -n "$shlibpath_var"; then
++ eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
++ $ECHO "export $shlibpath_var"
++ fi
++ $ECHO "$cmd$args"
++ exit $EXIT_SUCCESS
++ fi
++}
++
++test "$mode" = execute && func_mode_execute ${1+"$@"}
++
++
++# func_mode_finish arg...
++func_mode_finish ()
++{
++ $opt_debug
++ libdirs="$nonopt"
++ admincmds=
++
++ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
++ for dir
++ do
++ libdirs="$libdirs $dir"
++ done
++
++ for libdir in $libdirs; do
++ if test -n "$finish_cmds"; then
++ # Do each command in the finish commands.
++ func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
++'"$cmd"'"'
++ fi
++ if test -n "$finish_eval"; then
++ # Do the single finish_eval.
++ eval cmds=\"$finish_eval\"
++ $opt_dry_run || eval "$cmds" || admincmds="$admincmds
++ $cmds"
++ fi
++ done
++ fi
++
++ # Exit here if they wanted silent mode.
++ $opt_silent && exit $EXIT_SUCCESS
++
++ $ECHO "X----------------------------------------------------------------------" | $Xsed
++ $ECHO "Libraries have been installed in:"
++ for libdir in $libdirs; do
++ $ECHO " $libdir"
++ done
++ $ECHO
++ $ECHO "If you ever happen to want to link against installed libraries"
++ $ECHO "in a given directory, LIBDIR, you must either use libtool, and"
++ $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'"
++ $ECHO "flag during linking and do at least one of the following:"
++ if test -n "$shlibpath_var"; then
++ $ECHO " - add LIBDIR to the \`$shlibpath_var' environment variable"
++ $ECHO " during execution"
++ fi
++ if test -n "$runpath_var"; then
++ $ECHO " - add LIBDIR to the \`$runpath_var' environment variable"
++ $ECHO " during linking"
++ fi
++ if test -n "$hardcode_libdir_flag_spec"; then
++ libdir=LIBDIR
++ eval flag=\"$hardcode_libdir_flag_spec\"
++
++ $ECHO " - use the \`$flag' linker flag"
++ fi
++ if test -n "$admincmds"; then
++ $ECHO " - have your system administrator run these commands:$admincmds"
++ fi
++ if test -f /etc/ld.so.conf; then
++ $ECHO " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
++ fi
++ $ECHO
++
++ $ECHO "See any operating system documentation about shared libraries for"
++ case $host in
++ solaris2.[6789]|solaris2.1[0-9])
++ $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual"
++ $ECHO "pages."
++ ;;
++ *)
++ $ECHO "more information, such as the ld(1) and ld.so(8) manual pages."
++ ;;
++ esac
++ $ECHO "X----------------------------------------------------------------------" | $Xsed
++ exit $EXIT_SUCCESS
++}
++
++test "$mode" = finish && func_mode_finish ${1+"$@"}
++
++
++# func_mode_install arg...
++func_mode_install ()
++{
++ $opt_debug
++ # There may be an optional sh(1) argument at the beginning of
++ # install_prog (especially on Windows NT).
++ if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
++ # Allow the use of GNU shtool's install command.
++ $ECHO "X$nonopt" | $GREP shtool >/dev/null; then
++ # Aesthetically quote it.
++ func_quote_for_eval "$nonopt"
++ install_prog="$func_quote_for_eval_result "
++ arg=$1
++ shift
++ else
++ install_prog=
++ arg=$nonopt
++ fi
++
++ # The real first argument should be the name of the installation program.
++ # Aesthetically quote it.
++ func_quote_for_eval "$arg"
++ install_prog="$install_prog$func_quote_for_eval_result"
++
++ # We need to accept at least all the BSD install flags.
++ dest=
++ files=
++ opts=
++ prev=
++ install_type=
++ isdir=no
++ stripme=
++ for arg
++ do
++ if test -n "$dest"; then
++ files="$files $dest"
++ dest=$arg
++ continue
++ fi
++
++ case $arg in
++ -d) isdir=yes ;;
++ -f)
++ case " $install_prog " in
++ *[\\\ /]cp\ *) ;;
++ *) prev=$arg ;;
++ esac
++ ;;
++ -g | -m | -o)
++ prev=$arg
++ ;;
++ -s)
++ stripme=" -s"
++ continue
++ ;;
++ -*)
++ ;;
++ *)
++ # If the previous option needed an argument, then skip it.
++ if test -n "$prev"; then
++ prev=
++ else
++ dest=$arg
++ continue
++ fi
++ ;;
++ esac
++
++ # Aesthetically quote the argument.
++ func_quote_for_eval "$arg"
++ install_prog="$install_prog $func_quote_for_eval_result"
++ done
++
++ test -z "$install_prog" && \
++ func_fatal_help "you must specify an install program"
++
++ test -n "$prev" && \
++ func_fatal_help "the \`$prev' option requires an argument"
++
++ if test -z "$files"; then
++ if test -z "$dest"; then
++ func_fatal_help "no file or destination specified"
++ else
++ func_fatal_help "you must specify a destination"
++ fi
++ fi
++
++ # Strip any trailing slash from the destination.
++ func_stripname '' '/' "$dest"
++ dest=$func_stripname_result
++
++ # Check to see that the destination is a directory.
++ test -d "$dest" && isdir=yes
++ if test "$isdir" = yes; then
++ destdir="$dest"
++ destname=
++ else
++ func_dirname_and_basename "$dest" "" "."
++ destdir="$func_dirname_result"
++ destname="$func_basename_result"
++
++ # Not a directory, so check to see that there is only one file specified.
++ set dummy $files; shift
++ test "$#" -gt 1 && \
++ func_fatal_help "\`$dest' is not a directory"
++ fi
++ case $destdir in
++ [\\/]* | [A-Za-z]:[\\/]*) ;;
++ *)
++ for file in $files; do
++ case $file in
++ *.lo) ;;
++ *)
++ func_fatal_help "\`$destdir' must be an absolute directory name"
++ ;;
++ esac
++ done
++ ;;
++ esac
++
++ # This variable tells wrapper scripts just to set variables rather
++ # than running their programs.
++ libtool_install_magic="$magic"
++
++ staticlibs=
++ future_libdirs=
++ current_libdirs=
++ for file in $files; do
++
++ # Do each installation.
++ case $file in
++ *.$libext)
++ # Do the static libraries later.
++ staticlibs="$staticlibs $file"
++ ;;
++
++ *.la)
++ # Check to see that this really is a libtool archive.
++ func_lalib_unsafe_p "$file" \
++ || func_fatal_help "\`$file' is not a valid libtool archive"
++
++ library_names=
++ old_library=
++ relink_command=
++ func_source "$file"
++
++ # Add the libdir to current_libdirs if it is the destination.
++ if test "X$destdir" = "X$libdir"; then
++ case "$current_libdirs " in
++ *" $libdir "*) ;;
++ *) current_libdirs="$current_libdirs $libdir" ;;
++ esac
++ else
++ # Note the libdir as a future libdir.
++ case "$future_libdirs " in
++ *" $libdir "*) ;;
++ *) future_libdirs="$future_libdirs $libdir" ;;
++ esac
++ fi
++
++ func_dirname "$file" "/" ""
++ dir="$func_dirname_result"
++ dir="$dir$objdir"
++
++ if test -n "$relink_command"; then
++ # Determine the prefix the user has applied to our future dir.
++ inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"`
++
++ # Don't allow the user to place us outside of our expected
++ # location b/c this prevents finding dependent libraries that
++ # are installed to the same prefix.
++ # At present, this check doesn't affect windows .dll's that
++ # are installed into $libdir/../bin (currently, that works fine)
++ # but it's something to keep an eye on.
++ test "$inst_prefix_dir" = "$destdir" && \
++ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
++
++ if test -n "$inst_prefix_dir"; then
++ # Stick the inst_prefix_dir data into the link command.
++ relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
++ else
++ relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"`
++ fi
++
++ func_warning "relinking \`$file'"
++ func_show_eval "$relink_command" \
++ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
++ fi
++
++ # See the names of the shared library.
++ set dummy $library_names; shift
++ if test -n "$1"; then
++ realname="$1"
++ shift
++
++ srcname="$realname"
++ test -n "$relink_command" && srcname="$realname"T
++
++ # Install the shared library and build the symlinks.
++ func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \
++ 'exit $?'
++ tstripme="$stripme"
++ case $host_os in
++ cygwin* | mingw* | pw32* | cegcc*)
++ case $realname in
++ *.dll.a)
++ tstripme=""
++ ;;
++ esac
++ ;;
++ esac
++ if test -n "$tstripme" && test -n "$striplib"; then
++ func_show_eval "$striplib $destdir/$realname" 'exit $?'
++ fi
++
++ if test "$#" -gt 0; then
++ # Delete the old symlinks, and create new ones.
++ # Try `ln -sf' first, because the `ln' binary might depend on
++ # the symlink we replace! Solaris /bin/ln does not understand -f,
++ # so we also need to try rm && ln -s.
++ for linkname
++ do
++ test "$linkname" != "$realname" \
++ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
++ done
++ fi
++
++ # Do each command in the postinstall commands.
++ lib="$destdir/$realname"
++ func_execute_cmds "$postinstall_cmds" 'exit $?'
++ fi
++
++ # Install the pseudo-library for information purposes.
++ func_basename "$file"
++ name="$func_basename_result"
++ instname="$dir/$name"i
++ func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
++
++ # Maybe install the static library, too.
++ test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
++ ;;
++
++ *.lo)
++ # Install (i.e. copy) a libtool object.
++
++ # Figure out destination file name, if it wasn't already specified.
++ if test -n "$destname"; then
++ destfile="$destdir/$destname"
++ else
++ func_basename "$file"
++ destfile="$func_basename_result"
++ destfile="$destdir/$destfile"
++ fi
++
++ # Deduce the name of the destination old-style object file.
++ case $destfile in
++ *.lo)
++ func_lo2o "$destfile"
++ staticdest=$func_lo2o_result
++ ;;
++ *.$objext)
++ staticdest="$destfile"
++ destfile=
++ ;;
++ *)
++ func_fatal_help "cannot copy a libtool object to \`$destfile'"
++ ;;
++ esac
++
++ # Install the libtool object if requested.
++ test -n "$destfile" && \
++ func_show_eval "$install_prog $file $destfile" 'exit $?'
++
++ # Install the old object if enabled.
++ if test "$build_old_libs" = yes; then
++ # Deduce the name of the old-style object file.
++ func_lo2o "$file"
++ staticobj=$func_lo2o_result
++ func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
++ fi
++ exit $EXIT_SUCCESS
++ ;;
++
++ *)
++ # Figure out destination file name, if it wasn't already specified.
++ if test -n "$destname"; then
++ destfile="$destdir/$destname"
++ else
++ func_basename "$file"
++ destfile="$func_basename_result"
++ destfile="$destdir/$destfile"
++ fi
++
++ # If the file is missing, and there is a .exe on the end, strip it
++ # because it is most likely a libtool script we actually want to
++ # install
++ stripped_ext=""
++ case $file in
++ *.exe)
++ if test ! -f "$file"; then
++ func_stripname '' '.exe' "$file"
++ file=$func_stripname_result
++ stripped_ext=".exe"
++ fi
++ ;;
++ esac
++
++ # Do a test to see if this is really a libtool program.
++ case $host in
++ *cygwin* | *mingw*)
++ if func_ltwrapper_executable_p "$file"; then
++ func_ltwrapper_scriptname "$file"
++ wrapper=$func_ltwrapper_scriptname_result
++ else
++ func_stripname '' '.exe' "$file"
++ wrapper=$func_stripname_result
++ fi
++ ;;
++ *)
++ wrapper=$file
++ ;;
++ esac
++ if func_ltwrapper_script_p "$wrapper"; then
++ notinst_deplibs=
++ relink_command=
++
++ func_source "$wrapper"
++
++ # Check the variables that should have been set.
++ test -z "$generated_by_libtool_version" && \
++ func_fatal_error "invalid libtool wrapper script \`$wrapper'"
++
++ finalize=yes
++ for lib in $notinst_deplibs; do
++ # Check to see that each library is installed.
++ libdir=
++ if test -f "$lib"; then
++ func_source "$lib"
++ fi
++ libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
++ if test -n "$libdir" && test ! -f "$libfile"; then
++ func_warning "\`$lib' has not been installed in \`$libdir'"
++ finalize=no
++ fi
++ done
++
++ relink_command=
++ func_source "$wrapper"
++
++ outputname=
++ if test "$fast_install" = no && test -n "$relink_command"; then
++ $opt_dry_run || {
++ if test "$finalize" = yes; then
++ tmpdir=`func_mktempdir`
++ func_basename "$file$stripped_ext"
++ file="$func_basename_result"
++ outputname="$tmpdir/$file"
++ # Replace the output file specification.
++ relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
++
++ $opt_silent || {
++ func_quote_for_expand "$relink_command"
++ eval "func_echo $func_quote_for_expand_result"
++ }
++ if eval "$relink_command"; then :
++ else
++ func_error "error: relink \`$file' with the above command before installing it"
++ $opt_dry_run || ${RM}r "$tmpdir"
++ continue
++ fi
++ file="$outputname"
++ else
++ func_warning "cannot relink \`$file'"
++ fi
++ }
++ else
++ # Install the binary that we compiled earlier.
++ file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
++ fi
++ fi
++
++ # remove .exe since cygwin /usr/bin/install will append another
++ # one anyway
++ case $install_prog,$host in
++ */usr/bin/install*,*cygwin*)
++ case $file:$destfile in
++ *.exe:*.exe)
++ # this is ok
++ ;;
++ *.exe:*)
++ destfile=$destfile.exe
++ ;;
++ *:*.exe)
++ func_stripname '' '.exe' "$destfile"
++ destfile=$func_stripname_result
++ ;;
++ esac
++ ;;
++ esac
++ func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
++ $opt_dry_run || if test -n "$outputname"; then
++ ${RM}r "$tmpdir"
++ fi
++ ;;
++ esac
++ done
++
++ for file in $staticlibs; do
++ func_basename "$file"
++ name="$func_basename_result"
++
++ # Set up the ranlib parameters.
++ oldlib="$destdir/$name"
++
++ func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
++
++ if test -n "$stripme" && test -n "$old_striplib"; then
++ func_show_eval "$old_striplib $oldlib" 'exit $?'
++ fi
++
++ # Do each command in the postinstall commands.
++ func_execute_cmds "$old_postinstall_cmds" 'exit $?'
++ done
++
++ test -n "$future_libdirs" && \
++ func_warning "remember to run \`$progname --finish$future_libdirs'"
++
++ if test -n "$current_libdirs"; then
++ # Maybe just do a dry run.
++ $opt_dry_run && current_libdirs=" -n$current_libdirs"
++ exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
++ else
++ exit $EXIT_SUCCESS
++ fi
++}
++
++test "$mode" = install && func_mode_install ${1+"$@"}
++
++
++# func_generate_dlsyms outputname originator pic_p
++# Extract symbols from dlprefiles and create ${outputname}S.o with
++# a dlpreopen symbol table.
++func_generate_dlsyms ()
++{
++ $opt_debug
++ my_outputname="$1"
++ my_originator="$2"
++ my_pic_p="${3-no}"
++ my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
++ my_dlsyms=
++
++ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
++ if test -n "$NM" && test -n "$global_symbol_pipe"; then
++ my_dlsyms="${my_outputname}S.c"
++ else
++ func_error "not configured to extract global symbols from dlpreopened files"
++ fi
++ fi
++
++ if test -n "$my_dlsyms"; then
++ case $my_dlsyms in
++ "") ;;
++ *.c)
++ # Discover the nlist of each of the dlfiles.
++ nlist="$output_objdir/${my_outputname}.nm"
++
++ func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
++
++ # Parse the name list into a source file.
++ func_verbose "creating $output_objdir/$my_dlsyms"
++
++ $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
++/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
++/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
++
++#ifdef __cplusplus
++extern \"C\" {
++#endif
++
++/* External symbol declarations for the compiler. */\
++"
++
++ if test "$dlself" = yes; then
++ func_verbose "generating symbol list for \`$output'"
++
++ $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
++
++ # Add our own program objects to the symbol list.
++ progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
++ for progfile in $progfiles; do
++ func_verbose "extracting global C symbols from \`$progfile'"
++ $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'"
++ done
++
++ if test -n "$exclude_expsyms"; then
++ $opt_dry_run || {
++ eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
++ eval '$MV "$nlist"T "$nlist"'
++ }
++ fi
++
++ if test -n "$export_symbols_regex"; then
++ $opt_dry_run || {
++ eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
++ eval '$MV "$nlist"T "$nlist"'
++ }
++ fi
++
++ # Prepare the list of exported symbols
++ if test -z "$export_symbols"; then
++ export_symbols="$output_objdir/$outputname.exp"
++ $opt_dry_run || {
++ $RM $export_symbols
++ eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
++ case $host in
++ *cygwin* | *mingw* | *cegcc* )
++ eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
++ eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
++ ;;
++ esac
++ }
++ else
++ $opt_dry_run || {
++ eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
++ eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
++ eval '$MV "$nlist"T "$nlist"'
++ case $host in
++ *cygwin | *mingw* | *cegcc* )
++ eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
++ eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
++ ;;
++ esac
++ }
++ fi
++ fi
++
++ for dlprefile in $dlprefiles; do
++ func_verbose "extracting global C symbols from \`$dlprefile'"
++ func_basename "$dlprefile"
++ name="$func_basename_result"
++ $opt_dry_run || {
++ eval '$ECHO ": $name " >> "$nlist"'
++ eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
++ }
++ done
++
++ $opt_dry_run || {
++ # Make sure we have at least an empty file.
++ test -f "$nlist" || : > "$nlist"
++
++ if test -n "$exclude_expsyms"; then
++ $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
++ $MV "$nlist"T "$nlist"
++ fi
++
++ # Try sorting and uniquifying the output.
++ if $GREP -v "^: " < "$nlist" |
++ if sort -k 3 </dev/null >/dev/null 2>&1; then
++ sort -k 3
++ else
++ sort +2
++ fi |
++ uniq > "$nlist"S; then
++ :
++ else
++ $GREP -v "^: " < "$nlist" > "$nlist"S
++ fi
++
++ if test -f "$nlist"S; then
++ eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
++ else
++ $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms"
++ fi
++
++ $ECHO >> "$output_objdir/$my_dlsyms" "\
++
++/* The mapping between symbol names and symbols. */
++typedef struct {
++ const char *name;
++ void *address;
++} lt_dlsymlist;
++"
++ case $host in
++ *cygwin* | *mingw* | *cegcc* )
++ $ECHO >> "$output_objdir/$my_dlsyms" "\
++/* DATA imports from DLLs on WIN32 con't be const, because
++ runtime relocations are performed -- see ld's documentation
++ on pseudo-relocs. */"
++ lt_dlsym_const= ;;
++ *osf5*)
++ echo >> "$output_objdir/$my_dlsyms" "\
++/* This system does not cope well with relocations in const data */"
++ lt_dlsym_const= ;;
++ *)
++ lt_dlsym_const=const ;;
++ esac
++
++ $ECHO >> "$output_objdir/$my_dlsyms" "\
++extern $lt_dlsym_const lt_dlsymlist
++lt_${my_prefix}_LTX_preloaded_symbols[];
++$lt_dlsym_const lt_dlsymlist
++lt_${my_prefix}_LTX_preloaded_symbols[] =
++{\
++ { \"$my_originator\", (void *) 0 },"
++
++ case $need_lib_prefix in
++ no)
++ eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
++ ;;
++ *)
++ eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
++ ;;
++ esac
++ $ECHO >> "$output_objdir/$my_dlsyms" "\
++ {0, (void *) 0}
++};
++
++/* This works around a problem in FreeBSD linker */
++#ifdef FREEBSD_WORKAROUND
++static const void *lt_preloaded_setup() {
++ return lt_${my_prefix}_LTX_preloaded_symbols;
++}
++#endif
++
++#ifdef __cplusplus
++}
++#endif\
++"
++ } # !$opt_dry_run
++
++ pic_flag_for_symtable=
++ case "$compile_command " in
++ *" -static "*) ;;
++ *)
++ case $host in
++ # compiling the symbol table file with pic_flag works around
++ # a FreeBSD bug that causes programs to crash when -lm is
++ # linked before any other PIC object. But we must not use
++ # pic_flag when linking with -static. The problem exists in
++ # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
++ *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
++ pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
++ *-*-hpux*)
++ pic_flag_for_symtable=" $pic_flag" ;;
++ *)
++ if test "X$my_pic_p" != Xno; then
++ pic_flag_for_symtable=" $pic_flag"
++ fi
++ ;;
++ esac
++ ;;
++ esac
++ symtab_cflags=
++ for arg in $LTCFLAGS; do
++ case $arg in
++ -pie | -fpie | -fPIE) ;;
++ *) symtab_cflags="$symtab_cflags $arg" ;;
++ esac
++ done
++
++ # Now compile the dynamic symbol file.
++ func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
++
++ # Clean up the generated files.
++ func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
++
++ # Transform the symbol file into the correct name.
++ symfileobj="$output_objdir/${my_outputname}S.$objext"
++ case $host in
++ *cygwin* | *mingw* | *cegcc* )
++ if test -f "$output_objdir/$my_outputname.def"; then
++ compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
++ finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
++ else
++ compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
++ finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
++ fi
++ ;;
++ *)
++ compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
++ finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
++ ;;
++ esac
++ ;;
++ *)
++ func_fatal_error "unknown suffix for \`$my_dlsyms'"
++ ;;
++ esac
++ else
++ # We keep going just in case the user didn't refer to
++ # lt_preloaded_symbols. The linker will fail if global_symbol_pipe
++ # really was required.
++
++ # Nullify the symbol file.
++ compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
++ finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
++ fi
++}
++
++# func_win32_libid arg
++# return the library type of file 'arg'
++#
++# Need a lot of goo to handle *both* DLLs and import libs
++# Has to be a shell function in order to 'eat' the argument
++# that is supplied when $file_magic_command is called.
++func_win32_libid ()
++{
++ $opt_debug
++ win32_libid_type="unknown"
++ win32_fileres=`file -L $1 2>/dev/null`
++ case $win32_fileres in
++ *ar\ archive\ import\ library*) # definitely import
++ win32_libid_type="x86 archive import"
++ ;;
++ *ar\ archive*) # could be an import, or static
++ if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
++ $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
++ win32_nmres=`eval $NM -f posix -A $1 |
++ $SED -n -e '
++ 1,100{
++ / I /{
++ s,.*,import,
++ p
++ q
++ }
++ }'`
++ case $win32_nmres in
++ import*) win32_libid_type="x86 archive import";;
++ *) win32_libid_type="x86 archive static";;
++ esac
++ fi
++ ;;
++ *DLL*)
++ win32_libid_type="x86 DLL"
++ ;;
++ *executable*) # but shell scripts are "executable" too...
++ case $win32_fileres in
++ *MS\ Windows\ PE\ Intel*)
++ win32_libid_type="x86 DLL"
++ ;;
++ esac
++ ;;
++ esac
++ $ECHO "$win32_libid_type"
++}
++
++
++
++# func_extract_an_archive dir oldlib
++func_extract_an_archive ()
++{
++ $opt_debug
++ f_ex_an_ar_dir="$1"; shift
++ f_ex_an_ar_oldlib="$1"
++ func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?'
++ if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
++ :
++ else
++ func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
++ fi
++}
++
++
++# func_extract_archives gentop oldlib ...
++func_extract_archives ()
++{
++ $opt_debug
++ my_gentop="$1"; shift
++ my_oldlibs=${1+"$@"}
++ my_oldobjs=""
++ my_xlib=""
++ my_xabs=""
++ my_xdir=""
++
++ for my_xlib in $my_oldlibs; do
++ # Extract the objects.
++ case $my_xlib in
++ [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
++ *) my_xabs=`pwd`"/$my_xlib" ;;
++ esac
++ func_basename "$my_xlib"
++ my_xlib="$func_basename_result"
++ my_xlib_u=$my_xlib
++ while :; do
++ case " $extracted_archives " in
++ *" $my_xlib_u "*)
++ func_arith $extracted_serial + 1
++ extracted_serial=$func_arith_result
++ my_xlib_u=lt$extracted_serial-$my_xlib ;;
++ *) break ;;
++ esac
++ done
++ extracted_archives="$extracted_archives $my_xlib_u"
++ my_xdir="$my_gentop/$my_xlib_u"
++
++ func_mkdir_p "$my_xdir"
++
++ case $host in
++ *-darwin*)
++ func_verbose "Extracting $my_xabs"
++ # Do not bother doing anything if just a dry run
++ $opt_dry_run || {
++ darwin_orig_dir=`pwd`
++ cd $my_xdir || exit $?
++ darwin_archive=$my_xabs
++ darwin_curdir=`pwd`
++ darwin_base_archive=`basename "$darwin_archive"`
++ darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
++ if test -n "$darwin_arches"; then
++ darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
++ darwin_arch=
++ func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
++ for darwin_arch in $darwin_arches ; do
++ func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
++ $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
++ cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
++ func_extract_an_archive "`pwd`" "${darwin_base_archive}"
++ cd "$darwin_curdir"
++ $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
++ done # $darwin_arches
++ ## Okay now we've a bunch of thin objects, gotta fatten them up :)
++ darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
++ darwin_file=
++ darwin_files=
++ for darwin_file in $darwin_filelist; do
++ darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
++ $LIPO -create -output "$darwin_file" $darwin_files
++ done # $darwin_filelist
++ $RM -rf unfat-$$
++ cd "$darwin_orig_dir"
++ else
++ cd $darwin_orig_dir
++ func_extract_an_archive "$my_xdir" "$my_xabs"
++ fi # $darwin_arches
++ } # !$opt_dry_run
++ ;;
++ *)
++ func_extract_an_archive "$my_xdir" "$my_xabs"
++ ;;
++ esac
++ my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
++ done
++
++ func_extract_archives_result="$my_oldobjs"
++}
++
++
++
++# func_emit_wrapper_part1 [arg=no]
++#
++# Emit the first part of a libtool wrapper script on stdout.
++# For more information, see the description associated with
++# func_emit_wrapper(), below.
++func_emit_wrapper_part1 ()
++{
++ func_emit_wrapper_part1_arg1=no
++ if test -n "$1" ; then
++ func_emit_wrapper_part1_arg1=$1
++ fi
++
++ $ECHO "\
++#! $SHELL
++
++# $output - temporary wrapper script for $objdir/$outputname
++# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
++#
++# The $output program cannot be directly executed until all the libtool
++# libraries that it depends on are installed.
++#
++# This wrapper script should never be moved out of the build directory.
++# If it is, it will not operate correctly.
++
++# Sed substitution that helps us do robust quoting. It backslashifies
++# metacharacters that are still active within double-quoted strings.
++Xsed='${SED} -e 1s/^X//'
++sed_quote_subst='$sed_quote_subst'
++
++# Be Bourne compatible
++if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
++ emulate sh
++ NULLCMD=:
++ # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
++ # is contrary to our usage. Disable this feature.
++ alias -g '\${1+\"\$@\"}'='\"\$@\"'
++ setopt NO_GLOB_SUBST
++else
++ case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
++fi
++BIN_SH=xpg4; export BIN_SH # for Tru64
++DUALCASE=1; export DUALCASE # for MKS sh
++
++# The HP-UX ksh and POSIX shell print the target directory to stdout
++# if CDPATH is set.
++(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
++
++relink_command=\"$relink_command\"
++
++# This environment variable determines our operation mode.
++if test \"\$libtool_install_magic\" = \"$magic\"; then
++ # install mode needs the following variables:
++ generated_by_libtool_version='$macro_version'
++ notinst_deplibs='$notinst_deplibs'
++else
++ # When we are sourced in execute mode, \$file and \$ECHO are already set.
++ if test \"\$libtool_execute_magic\" != \"$magic\"; then
++ ECHO=\"$qecho\"
++ file=\"\$0\"
++ # Make sure echo works.
++ if test \"X\$1\" = X--no-reexec; then
++ # Discard the --no-reexec flag, and continue.
++ shift
++ elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then
++ # Yippee, \$ECHO works!
++ :
++ else
++ # Restart under the correct shell, and then maybe \$ECHO will work.
++ exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
++ fi
++ fi\
++"
++ $ECHO "\
++
++ # Find the directory that this script lives in.
++ thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
++ test \"x\$thisdir\" = \"x\$file\" && thisdir=.
++
++ # Follow symbolic links until we get to the real thisdir.
++ file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
++ while test -n \"\$file\"; do
++ destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
++
++ # If there was a directory component, then change thisdir.
++ if test \"x\$destdir\" != \"x\$file\"; then
++ case \"\$destdir\" in
++ [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
++ *) thisdir=\"\$thisdir/\$destdir\" ;;
++ esac
++ fi
++
++ file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
++ file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
++ done
++"
++}
++# end: func_emit_wrapper_part1
++
++# func_emit_wrapper_part2 [arg=no]
++#
++# Emit the second part of a libtool wrapper script on stdout.
++# For more information, see the description associated with
++# func_emit_wrapper(), below.
++func_emit_wrapper_part2 ()
++{
++ func_emit_wrapper_part2_arg1=no
++ if test -n "$1" ; then
++ func_emit_wrapper_part2_arg1=$1
++ fi
++
++ $ECHO "\
++
++ # Usually 'no', except on cygwin/mingw when embedded into
++ # the cwrapper.
++ WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1
++ if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
++ # special case for '.'
++ if test \"\$thisdir\" = \".\"; then
++ thisdir=\`pwd\`
++ fi
++ # remove .libs from thisdir
++ case \"\$thisdir\" in
++ *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;;
++ $objdir ) thisdir=. ;;
++ esac
++ fi
++
++ # Try to get the absolute directory name.
++ absdir=\`cd \"\$thisdir\" && pwd\`
++ test -n \"\$absdir\" && thisdir=\"\$absdir\"
++"
++
++ if test "$fast_install" = yes; then
++ $ECHO "\
++ program=lt-'$outputname'$exeext
++ progdir=\"\$thisdir/$objdir\"
++
++ if test ! -f \"\$progdir/\$program\" ||
++ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
++ test \"X\$file\" != \"X\$progdir/\$program\"; }; then
++
++ file=\"\$\$-\$program\"
++
++ if test ! -d \"\$progdir\"; then
++ $MKDIR \"\$progdir\"
++ else
++ $RM \"\$progdir/\$file\"
++ fi"
++
++ $ECHO "\
++
++ # relink executable if necessary
++ if test -n \"\$relink_command\"; then
++ if relink_command_output=\`eval \$relink_command 2>&1\`; then :
++ else
++ $ECHO \"\$relink_command_output\" >&2
++ $RM \"\$progdir/\$file\"
++ exit 1
++ fi
++ fi
++
++ $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
++ { $RM \"\$progdir/\$program\";
++ $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
++ $RM \"\$progdir/\$file\"
++ fi"
++ else
++ $ECHO "\
++ program='$outputname'
++ progdir=\"\$thisdir/$objdir\"
++"
++ fi
++
++ $ECHO "\
++
++ if test -f \"\$progdir/\$program\"; then"
++
++ # Export our shlibpath_var if we have one.
++ if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
++ $ECHO "\
++ # Add our own library path to $shlibpath_var
++ $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
++
++ # Some systems cannot cope with colon-terminated $shlibpath_var
++ # The second colon is a workaround for a bug in BeOS R4 sed
++ $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
++
++ export $shlibpath_var
++"
++ fi
++
++ # fixup the dll searchpath if we need to.
++ if test -n "$dllsearchpath"; then
++ $ECHO "\
++ # Add the dll search path components to the executable PATH
++ PATH=$dllsearchpath:\$PATH
++"
++ fi
++
++ $ECHO "\
++ if test \"\$libtool_execute_magic\" != \"$magic\"; then
++ # Run the actual program with our arguments.
++"
++ case $host in
++ # Backslashes separate directories on plain windows
++ *-*-mingw | *-*-os2* | *-cegcc*)
++ $ECHO "\
++ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
++"
++ ;;
++
++ *)
++ $ECHO "\
++ exec \"\$progdir/\$program\" \${1+\"\$@\"}
++"
++ ;;
++ esac
++ $ECHO "\
++ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
++ exit 1
++ fi
++ else
++ # The program doesn't exist.
++ \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
++ \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
++ $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
++ exit 1
++ fi
++fi\
++"
++}
++# end: func_emit_wrapper_part2
++
++
++# func_emit_wrapper [arg=no]
++#
++# Emit a libtool wrapper script on stdout.
++# Don't directly open a file because we may want to
++# incorporate the script contents within a cygwin/mingw
++# wrapper executable. Must ONLY be called from within
++# func_mode_link because it depends on a number of variables
++# set therein.
++#
++# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
++# variable will take. If 'yes', then the emitted script
++# will assume that the directory in which it is stored is
++# the $objdir directory. This is a cygwin/mingw-specific
++# behavior.
++func_emit_wrapper ()
++{
++ func_emit_wrapper_arg1=no
++ if test -n "$1" ; then
++ func_emit_wrapper_arg1=$1
++ fi
++
++ # split this up so that func_emit_cwrapperexe_src
++ # can call each part independently.
++ func_emit_wrapper_part1 "${func_emit_wrapper_arg1}"
++ func_emit_wrapper_part2 "${func_emit_wrapper_arg1}"
++}
++
++
++# func_to_host_path arg
++#
++# Convert paths to host format when used with build tools.
++# Intended for use with "native" mingw (where libtool itself
++# is running under the msys shell), or in the following cross-
++# build environments:
++# $build $host
++# mingw (msys) mingw [e.g. native]
++# cygwin mingw
++# *nix + wine mingw
++# where wine is equipped with the `winepath' executable.
++# In the native mingw case, the (msys) shell automatically
++# converts paths for any non-msys applications it launches,
++# but that facility isn't available from inside the cwrapper.
++# Similar accommodations are necessary for $host mingw and
++# $build cygwin. Calling this function does no harm for other
++# $host/$build combinations not listed above.
++#
++# ARG is the path (on $build) that should be converted to
++# the proper representation for $host. The result is stored
++# in $func_to_host_path_result.
++func_to_host_path ()
++{
++ func_to_host_path_result="$1"
++ if test -n "$1" ; then
++ case $host in
++ *mingw* )
++ lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
++ case $build in
++ *mingw* ) # actually, msys
++ # awkward: cmd appends spaces to result
++ lt_sed_strip_trailing_spaces="s/[ ]*\$//"
++ func_to_host_path_tmp1=`( cmd //c echo "$1" |\
++ $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
++ func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
++ $SED -e "$lt_sed_naive_backslashify"`
++ ;;
++ *cygwin* )
++ func_to_host_path_tmp1=`cygpath -w "$1"`
++ func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
++ $SED -e "$lt_sed_naive_backslashify"`
++ ;;
++ * )
++ # Unfortunately, winepath does not exit with a non-zero
++ # error code, so we are forced to check the contents of
++ # stdout. On the other hand, if the command is not
++ # found, the shell will set an exit code of 127 and print
++ # *an error message* to stdout. So we must check for both
++ # error code of zero AND non-empty stdout, which explains
++ # the odd construction:
++ func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
++ if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
++ func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
++ $SED -e "$lt_sed_naive_backslashify"`
++ else
++ # Allow warning below.
++ func_to_host_path_result=""
++ fi
++ ;;
++ esac
++ if test -z "$func_to_host_path_result" ; then
++ func_error "Could not determine host path corresponding to"
++ func_error " '$1'"
++ func_error "Continuing, but uninstalled executables may not work."
++ # Fallback:
++ func_to_host_path_result="$1"
++ fi
++ ;;
++ esac
++ fi
++}
++# end: func_to_host_path
++
++# func_to_host_pathlist arg
++#
++# Convert pathlists to host format when used with build tools.
++# See func_to_host_path(), above. This function supports the
++# following $build/$host combinations (but does no harm for
++# combinations not listed here):
++# $build $host
++# mingw (msys) mingw [e.g. native]
++# cygwin mingw
++# *nix + wine mingw
++#
++# Path separators are also converted from $build format to
++# $host format. If ARG begins or ends with a path separator
++# character, it is preserved (but converted to $host format)
++# on output.
++#
++# ARG is a pathlist (on $build) that should be converted to
++# the proper representation on $host. The result is stored
++# in $func_to_host_pathlist_result.
++func_to_host_pathlist ()
++{
++ func_to_host_pathlist_result="$1"
++ if test -n "$1" ; then
++ case $host in
++ *mingw* )
++ lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
++ # Remove leading and trailing path separator characters from
++ # ARG. msys behavior is inconsistent here, cygpath turns them
++ # into '.;' and ';.', and winepath ignores them completely.
++ func_to_host_pathlist_tmp2="$1"
++ # Once set for this call, this variable should not be
++ # reassigned. It is used in tha fallback case.
++ func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\
++ $SED -e 's|^:*||' -e 's|:*$||'`
++ case $build in
++ *mingw* ) # Actually, msys.
++ # Awkward: cmd appends spaces to result.
++ lt_sed_strip_trailing_spaces="s/[ ]*\$//"
++ func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\
++ $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
++ func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
++ $SED -e "$lt_sed_naive_backslashify"`
++ ;;
++ *cygwin* )
++ func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"`
++ func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
++ $SED -e "$lt_sed_naive_backslashify"`
++ ;;
++ * )
++ # unfortunately, winepath doesn't convert pathlists
++ func_to_host_pathlist_result=""
++ func_to_host_pathlist_oldIFS=$IFS
++ IFS=:
++ for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
++ IFS=$func_to_host_pathlist_oldIFS
++ if test -n "$func_to_host_pathlist_f" ; then
++ func_to_host_path "$func_to_host_pathlist_f"
++ if test -n "$func_to_host_path_result" ; then
++ if test -z "$func_to_host_pathlist_result" ; then
++ func_to_host_pathlist_result="$func_to_host_path_result"
++ else
++ func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result"
++ fi
++ fi
++ fi
++ IFS=:
++ done
++ IFS=$func_to_host_pathlist_oldIFS
++ ;;
++ esac
++ if test -z "$func_to_host_pathlist_result" ; then
++ func_error "Could not determine the host path(s) corresponding to"
++ func_error " '$1'"
++ func_error "Continuing, but uninstalled executables may not work."
++ # Fallback. This may break if $1 contains DOS-style drive
++ # specifications. The fix is not to complicate the expression
++ # below, but for the user to provide a working wine installation
++ # with winepath so that path translation in the cross-to-mingw
++ # case works properly.
++ lt_replace_pathsep_nix_to_dos="s|:|;|g"
++ func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
++ $SED -e "$lt_replace_pathsep_nix_to_dos"`
++ fi
++ # Now, add the leading and trailing path separators back
++ case "$1" in
++ :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
++ ;;
++ esac
++ case "$1" in
++ *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;"
++ ;;
++ esac
++ ;;
++ esac
++ fi
++}
++# end: func_to_host_pathlist
++
++# func_emit_cwrapperexe_src
++# emit the source code for a wrapper executable on stdout
++# Must ONLY be called from within func_mode_link because
++# it depends on a number of variable set therein.
++func_emit_cwrapperexe_src ()
++{
++ cat <<EOF
++
++/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
++ Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
++
++ The $output program cannot be directly executed until all the libtool
++ libraries that it depends on are installed.
++
++ This wrapper executable should never be moved out of the build directory.
++ If it is, it will not operate correctly.
++
++ Currently, it simply execs the wrapper *script* "$SHELL $output",
++ but could eventually absorb all of the scripts functionality and
++ exec $objdir/$outputname directly.
++*/
++EOF
++ cat <<"EOF"
++#include <stdio.h>
++#include <stdlib.h>
++#ifdef _MSC_VER
++# include <direct.h>
++# include <process.h>
++# include <io.h>
++# define setmode _setmode
++#else
++# include <unistd.h>
++# include <stdint.h>
++# ifdef __CYGWIN__
++# include <io.h>
++# define HAVE_SETENV
++# ifdef __STRICT_ANSI__
++char *realpath (const char *, char *);
++int putenv (char *);
++int setenv (const char *, const char *, int);
++# endif
++# endif
++#endif
++#include <malloc.h>
++#include <stdarg.h>
++#include <assert.h>
++#include <string.h>
++#include <ctype.h>
++#include <errno.h>
++#include <fcntl.h>
++#include <sys/stat.h>
++
++#if defined(PATH_MAX)
++# define LT_PATHMAX PATH_MAX
++#elif defined(MAXPATHLEN)
++# define LT_PATHMAX MAXPATHLEN
++#else
++# define LT_PATHMAX 1024
++#endif
++
++#ifndef S_IXOTH
++# define S_IXOTH 0
++#endif
++#ifndef S_IXGRP
++# define S_IXGRP 0
++#endif
++
++#ifdef _MSC_VER
++# define S_IXUSR _S_IEXEC
++# define stat _stat
++# ifndef _INTPTR_T_DEFINED
++# define intptr_t int
++# endif
++#endif
++
++#ifndef DIR_SEPARATOR
++# define DIR_SEPARATOR '/'
++# define PATH_SEPARATOR ':'
++#endif
++
++#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
++ defined (__OS2__)
++# define HAVE_DOS_BASED_FILE_SYSTEM
++# define FOPEN_WB "wb"
++# ifndef DIR_SEPARATOR_2
++# define DIR_SEPARATOR_2 '\\'
++# endif
++# ifndef PATH_SEPARATOR_2
++# define PATH_SEPARATOR_2 ';'
++# endif
++#endif
++
++#ifndef DIR_SEPARATOR_2
++# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
++#else /* DIR_SEPARATOR_2 */
++# define IS_DIR_SEPARATOR(ch) \
++ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
++#endif /* DIR_SEPARATOR_2 */
++
++#ifndef PATH_SEPARATOR_2
++# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
++#else /* PATH_SEPARATOR_2 */
++# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
++#endif /* PATH_SEPARATOR_2 */
++
++#ifdef __CYGWIN__
++# define FOPEN_WB "wb"
++#endif
++
++#ifndef FOPEN_WB
++# define FOPEN_WB "w"
++#endif
++#ifndef _O_BINARY
++# define _O_BINARY 0
++#endif
++
++#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
++#define XFREE(stale) do { \
++ if (stale) { free ((void *) stale); stale = 0; } \
++} while (0)
++
++#undef LTWRAPPER_DEBUGPRINTF
++#if defined DEBUGWRAPPER
++# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args
++static void
++ltwrapper_debugprintf (const char *fmt, ...)
++{
++ va_list args;
++ va_start (args, fmt);
++ (void) vfprintf (stderr, fmt, args);
++ va_end (args);
++}
++#else
++# define LTWRAPPER_DEBUGPRINTF(args)
++#endif
++
++const char *program_name = NULL;
++
++void *xmalloc (size_t num);
++char *xstrdup (const char *string);
++const char *base_name (const char *name);
++char *find_executable (const char *wrapper);
++char *chase_symlinks (const char *pathspec);
++int make_executable (const char *path);
++int check_executable (const char *path);
++char *strendzap (char *str, const char *pat);
++void lt_fatal (const char *message, ...);
++void lt_setenv (const char *name, const char *value);
++char *lt_extend_str (const char *orig_value, const char *add, int to_end);
++void lt_opt_process_env_set (const char *arg);
++void lt_opt_process_env_prepend (const char *arg);
++void lt_opt_process_env_append (const char *arg);
++int lt_split_name_value (const char *arg, char** name, char** value);
++void lt_update_exe_path (const char *name, const char *value);
++void lt_update_lib_path (const char *name, const char *value);
++
++static const char *script_text_part1 =
++EOF
++
++ func_emit_wrapper_part1 yes |
++ $SED -e 's/\([\\"]\)/\\\1/g' \
++ -e 's/^/ "/' -e 's/$/\\n"/'
++ echo ";"
++ cat <<EOF
++
++static const char *script_text_part2 =
++EOF
++ func_emit_wrapper_part2 yes |
++ $SED -e 's/\([\\"]\)/\\\1/g' \
++ -e 's/^/ "/' -e 's/$/\\n"/'
++ echo ";"
++
++ cat <<EOF
++const char * MAGIC_EXE = "$magic_exe";
++const char * LIB_PATH_VARNAME = "$shlibpath_var";
++EOF
++
++ if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
++ func_to_host_pathlist "$temp_rpath"
++ cat <<EOF
++const char * LIB_PATH_VALUE = "$func_to_host_pathlist_result";
++EOF
++ else
++ cat <<"EOF"
++const char * LIB_PATH_VALUE = "";
++EOF
++ fi
++
++ if test -n "$dllsearchpath"; then
++ func_to_host_pathlist "$dllsearchpath:"
++ cat <<EOF
++const char * EXE_PATH_VARNAME = "PATH";
++const char * EXE_PATH_VALUE = "$func_to_host_pathlist_result";
++EOF
++ else
++ cat <<"EOF"
++const char * EXE_PATH_VARNAME = "";
++const char * EXE_PATH_VALUE = "";
++EOF
++ fi
++
++ if test "$fast_install" = yes; then
++ cat <<EOF
++const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
++EOF
++ else
++ cat <<EOF
++const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
++EOF
++ fi
++
++
++ cat <<"EOF"
++
++#define LTWRAPPER_OPTION_PREFIX "--lt-"
++#define LTWRAPPER_OPTION_PREFIX_LENGTH 5
++
++static const size_t opt_prefix_len = LTWRAPPER_OPTION_PREFIX_LENGTH;
++static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
++
++static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script";
++
++static const size_t env_set_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 7;
++static const char *env_set_opt = LTWRAPPER_OPTION_PREFIX "env-set";
++ /* argument is putenv-style "foo=bar", value of foo is set to bar */
++
++static const size_t env_prepend_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11;
++static const char *env_prepend_opt = LTWRAPPER_OPTION_PREFIX "env-prepend";
++ /* argument is putenv-style "foo=bar", new value of foo is bar${foo} */
++
++static const size_t env_append_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 10;
++static const char *env_append_opt = LTWRAPPER_OPTION_PREFIX "env-append";
++ /* argument is putenv-style "foo=bar", new value of foo is ${foo}bar */
++
++int
++main (int argc, char *argv[])
++{
++ char **newargz;
++ int newargc;
++ char *tmp_pathspec;
++ char *actual_cwrapper_path;
++ char *actual_cwrapper_name;
++ char *target_name;
++ char *lt_argv_zero;
++ intptr_t rval = 127;
++
++ int i;
++
++ program_name = (char *) xstrdup (base_name (argv[0]));
++ LTWRAPPER_DEBUGPRINTF (("(main) argv[0] : %s\n", argv[0]));
++ LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name));
++
++ /* very simple arg parsing; don't want to rely on getopt */
++ for (i = 1; i < argc; i++)
++ {
++ if (strcmp (argv[i], dumpscript_opt) == 0)
++ {
++EOF
++ case "$host" in
++ *mingw* | *cygwin* )
++ # make stdout use "unix" line endings
++ echo " setmode(1,_O_BINARY);"
++ ;;
++ esac
++
++ cat <<"EOF"
++ printf ("%s", script_text_part1);
++ printf ("%s", script_text_part2);
++ return 0;
++ }
++ }
++
++ newargz = XMALLOC (char *, argc + 1);
++ tmp_pathspec = find_executable (argv[0]);
++ if (tmp_pathspec == NULL)
++ lt_fatal ("Couldn't find %s", argv[0]);
++ LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n",
++ tmp_pathspec));
++
++ actual_cwrapper_path = chase_symlinks (tmp_pathspec);
++ LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n",
++ actual_cwrapper_path));
++ XFREE (tmp_pathspec);
++
++ actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path));
++ strendzap (actual_cwrapper_path, actual_cwrapper_name);
++
++ /* wrapper name transforms */
++ strendzap (actual_cwrapper_name, ".exe");
++ tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
++ XFREE (actual_cwrapper_name);
++ actual_cwrapper_name = tmp_pathspec;
++ tmp_pathspec = 0;
++
++ /* target_name transforms -- use actual target program name; might have lt- prefix */
++ target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
++ strendzap (target_name, ".exe");
++ tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
++ XFREE (target_name);
++ target_name = tmp_pathspec;
++ tmp_pathspec = 0;
++
++ LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n",
++ target_name));
++EOF
++
++ cat <<EOF
++ newargz[0] =
++ XMALLOC (char, (strlen (actual_cwrapper_path) +
++ strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
++ strcpy (newargz[0], actual_cwrapper_path);
++ strcat (newargz[0], "$objdir");
++ strcat (newargz[0], "/");
++EOF
++
++ cat <<"EOF"
++ /* stop here, and copy so we don't have to do this twice */
++ tmp_pathspec = xstrdup (newargz[0]);
++
++ /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
++ strcat (newargz[0], actual_cwrapper_name);
++
++ /* DO want the lt- prefix here if it exists, so use target_name */
++ lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
++ XFREE (tmp_pathspec);
++ tmp_pathspec = NULL;
++EOF
++
++ case $host_os in
++ mingw*)
++ cat <<"EOF"
++ {
++ char* p;
++ while ((p = strchr (newargz[0], '\\')) != NULL)
++ {
++ *p = '/';
++ }
++ while ((p = strchr (lt_argv_zero, '\\')) != NULL)
++ {
++ *p = '/';
++ }
++ }
++EOF
++ ;;
++ esac
++
++ cat <<"EOF"
++ XFREE (target_name);
++ XFREE (actual_cwrapper_path);
++ XFREE (actual_cwrapper_name);
++
++ lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
++ lt_setenv ("DUALCASE", "1"); /* for MSK sh */
++ lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
++ lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
++
++ newargc=0;
++ for (i = 1; i < argc; i++)
++ {
++ if (strncmp (argv[i], env_set_opt, env_set_opt_len) == 0)
++ {
++ if (argv[i][env_set_opt_len] == '=')
++ {
++ const char *p = argv[i] + env_set_opt_len + 1;
++ lt_opt_process_env_set (p);
++ }
++ else if (argv[i][env_set_opt_len] == '\0' && i + 1 < argc)
++ {
++ lt_opt_process_env_set (argv[++i]); /* don't copy */
++ }
++ else
++ lt_fatal ("%s missing required argument", env_set_opt);
++ continue;
++ }
++ if (strncmp (argv[i], env_prepend_opt, env_prepend_opt_len) == 0)
++ {
++ if (argv[i][env_prepend_opt_len] == '=')
++ {
++ const char *p = argv[i] + env_prepend_opt_len + 1;
++ lt_opt_process_env_prepend (p);
++ }
++ else if (argv[i][env_prepend_opt_len] == '\0' && i + 1 < argc)
++ {
++ lt_opt_process_env_prepend (argv[++i]); /* don't copy */
++ }
++ else
++ lt_fatal ("%s missing required argument", env_prepend_opt);
++ continue;
++ }
++ if (strncmp (argv[i], env_append_opt, env_append_opt_len) == 0)
++ {
++ if (argv[i][env_append_opt_len] == '=')
++ {
++ const char *p = argv[i] + env_append_opt_len + 1;
++ lt_opt_process_env_append (p);
++ }
++ else if (argv[i][env_append_opt_len] == '\0' && i + 1 < argc)
++ {
++ lt_opt_process_env_append (argv[++i]); /* don't copy */
++ }
++ else
++ lt_fatal ("%s missing required argument", env_append_opt);
++ continue;
++ }
++ if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)
++ {
++ /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
++ namespace, but it is not one of the ones we know about and
++ have already dealt with, above (inluding dump-script), then
++ report an error. Otherwise, targets might begin to believe
++ they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
++ namespace. The first time any user complains about this, we'll
++ need to make LTWRAPPER_OPTION_PREFIX a configure-time option
++ or a configure.ac-settable value.
++ */
++ lt_fatal ("Unrecognized option in %s namespace: '%s'",
++ ltwrapper_option_prefix, argv[i]);
++ }
++ /* otherwise ... */
++ newargz[++newargc] = xstrdup (argv[i]);
++ }
++ newargz[++newargc] = NULL;
++
++ LTWRAPPER_DEBUGPRINTF (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>")));
++ for (i = 0; i < newargc; i++)
++ {
++ LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>")));
++ }
++
++EOF
++
++ case $host_os in
++ mingw*)
++ cat <<"EOF"
++ /* execv doesn't actually work on mingw as expected on unix */
++ rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
++ if (rval == -1)
++ {
++ /* failed to start process */
++ LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno));
++ return 127;
++ }
++ return rval;
++EOF
++ ;;
++ *)
++ cat <<"EOF"
++ execv (lt_argv_zero, newargz);
++ return rval; /* =127, but avoids unused variable warning */
++EOF
++ ;;
++ esac
++
++ cat <<"EOF"
++}
++
++void *
++xmalloc (size_t num)
++{
++ void *p = (void *) malloc (num);
++ if (!p)
++ lt_fatal ("Memory exhausted");
++
++ return p;
++}
++
++char *
++xstrdup (const char *string)
++{
++ return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
++ string) : NULL;
++}
++
++const char *
++base_name (const char *name)
++{
++ const char *base;
++
++#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
++ /* Skip over the disk name in MSDOS pathnames. */
++ if (isalpha ((unsigned char) name[0]) && name[1] == ':')
++ name += 2;
++#endif
++
++ for (base = name; *name; name++)
++ if (IS_DIR_SEPARATOR (*name))
++ base = name + 1;
++ return base;
++}
++
++int
++check_executable (const char *path)
++{
++ struct stat st;
++
++ LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n",
++ path ? (*path ? path : "EMPTY!") : "NULL!"));
++ if ((!path) || (!*path))
++ return 0;
++
++ if ((stat (path, &st) >= 0)
++ && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
++ return 1;
++ else
++ return 0;
++}
++
++int
++make_executable (const char *path)
++{
++ int rval = 0;
++ struct stat st;
++
++ LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n",
++ path ? (*path ? path : "EMPTY!") : "NULL!"));
++ if ((!path) || (!*path))
++ return 0;
++
++ if (stat (path, &st) >= 0)
++ {
++ rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
++ }
++ return rval;
++}
++
++/* Searches for the full path of the wrapper. Returns
++ newly allocated full path name if found, NULL otherwise
++ Does not chase symlinks, even on platforms that support them.
++*/
++char *
++find_executable (const char *wrapper)
++{
++ int has_slash = 0;
++ const char *p;
++ const char *p_next;
++ /* static buffer for getcwd */
++ char tmp[LT_PATHMAX + 1];
++ int tmp_len;
++ char *concat_name;
++
++ LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n",
++ wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"));
++
++ if ((wrapper == NULL) || (*wrapper == '\0'))
++ return NULL;
++
++ /* Absolute path? */
++#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
++ if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
++ {
++ concat_name = xstrdup (wrapper);
++ if (check_executable (concat_name))
++ return concat_name;
++ XFREE (concat_name);
++ }
++ else
++ {
++#endif
++ if (IS_DIR_SEPARATOR (wrapper[0]))
++ {
++ concat_name = xstrdup (wrapper);
++ if (check_executable (concat_name))
++ return concat_name;
++ XFREE (concat_name);
++ }
++#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
++ }
++#endif
++
++ for (p = wrapper; *p; p++)
++ if (*p == '/')
++ {
++ has_slash = 1;
++ break;
++ }
++ if (!has_slash)
++ {
++ /* no slashes; search PATH */
++ const char *path = getenv ("PATH");
++ if (path != NULL)
++ {
++ for (p = path; *p; p = p_next)
++ {
++ const char *q;
++ size_t p_len;
++ for (q = p; *q; q++)
++ if (IS_PATH_SEPARATOR (*q))
++ break;
++ p_len = q - p;
++ p_next = (*q == '\0' ? q : q + 1);
++ if (p_len == 0)
++ {
++ /* empty path: current directory */
++ if (getcwd (tmp, LT_PATHMAX) == NULL)
++ lt_fatal ("getcwd failed");
++ tmp_len = strlen (tmp);
++ concat_name =
++ XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
++ memcpy (concat_name, tmp, tmp_len);
++ concat_name[tmp_len] = '/';
++ strcpy (concat_name + tmp_len + 1, wrapper);
++ }
++ else
++ {
++ concat_name =
++ XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
++ memcpy (concat_name, p, p_len);
++ concat_name[p_len] = '/';
++ strcpy (concat_name + p_len + 1, wrapper);
++ }
++ if (check_executable (concat_name))
++ return concat_name;
++ XFREE (concat_name);
++ }
++ }
++ /* not found in PATH; assume curdir */
++ }
++ /* Relative path | not found in path: prepend cwd */
++ if (getcwd (tmp, LT_PATHMAX) == NULL)
++ lt_fatal ("getcwd failed");
++ tmp_len = strlen (tmp);
++ concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
++ memcpy (concat_name, tmp, tmp_len);
++ concat_name[tmp_len] = '/';
++ strcpy (concat_name + tmp_len + 1, wrapper);
++
++ if (check_executable (concat_name))
++ return concat_name;
++ XFREE (concat_name);
++ return NULL;
++}
++
++char *
++chase_symlinks (const char *pathspec)
++{
++#ifndef S_ISLNK
++ return xstrdup (pathspec);
++#else
++ char buf[LT_PATHMAX];
++ struct stat s;
++ char *tmp_pathspec = xstrdup (pathspec);
++ char *p;
++ int has_symlinks = 0;
++ while (strlen (tmp_pathspec) && !has_symlinks)
++ {
++ LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n",
++ tmp_pathspec));
++ if (lstat (tmp_pathspec, &s) == 0)
++ {
++ if (S_ISLNK (s.st_mode) != 0)
++ {
++ has_symlinks = 1;
++ break;
++ }
++
++ /* search backwards for last DIR_SEPARATOR */
++ p = tmp_pathspec + strlen (tmp_pathspec) - 1;
++ while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
++ p--;
++ if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
++ {
++ /* no more DIR_SEPARATORS left */
++ break;
++ }
++ *p = '\0';
++ }
++ else
++ {
++ char *errstr = strerror (errno);
++ lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr);
++ }
++ }
++ XFREE (tmp_pathspec);
++
++ if (!has_symlinks)
++ {
++ return xstrdup (pathspec);
++ }
++
++ tmp_pathspec = realpath (pathspec, buf);
++ if (tmp_pathspec == 0)
++ {
++ lt_fatal ("Could not follow symlinks for %s", pathspec);
++ }
++ return xstrdup (tmp_pathspec);
++#endif
++}
++
++char *
++strendzap (char *str, const char *pat)
++{
++ size_t len, patlen;
++
++ assert (str != NULL);
++ assert (pat != NULL);
++
++ len = strlen (str);
++ patlen = strlen (pat);
++
++ if (patlen <= len)
++ {
++ str += len - patlen;
++ if (strcmp (str, pat) == 0)
++ *str = '\0';
++ }
++ return str;
++}
++
++static void
++lt_error_core (int exit_status, const char *mode,
++ const char *message, va_list ap)
++{
++ fprintf (stderr, "%s: %s: ", program_name, mode);
++ vfprintf (stderr, message, ap);
++ fprintf (stderr, ".\n");
++
++ if (exit_status >= 0)
++ exit (exit_status);
++}
++
++void
++lt_fatal (const char *message, ...)
++{
++ va_list ap;
++ va_start (ap, message);
++ lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
++ va_end (ap);
++}
++
++void
++lt_setenv (const char *name, const char *value)
++{
++ LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n",
++ (name ? name : "<NULL>"),
++ (value ? value : "<NULL>")));
++ {
++#ifdef HAVE_SETENV
++ /* always make a copy, for consistency with !HAVE_SETENV */
++ char *str = xstrdup (value);
++ setenv (name, str, 1);
++#else
++ int len = strlen (name) + 1 + strlen (value) + 1;
++ char *str = XMALLOC (char, len);
++ sprintf (str, "%s=%s", name, value);
++ if (putenv (str) != EXIT_SUCCESS)
++ {
++ XFREE (str);
++ }
++#endif
++ }
++}
++
++char *
++lt_extend_str (const char *orig_value, const char *add, int to_end)
++{
++ char *new_value;
++ if (orig_value && *orig_value)
++ {
++ int orig_value_len = strlen (orig_value);
++ int add_len = strlen (add);
++ new_value = XMALLOC (char, add_len + orig_value_len + 1);
++ if (to_end)
++ {
++ strcpy (new_value, orig_value);
++ strcpy (new_value + orig_value_len, add);
++ }
++ else
++ {
++ strcpy (new_value, add);
++ strcpy (new_value + add_len, orig_value);
++ }
++ }
++ else
++ {
++ new_value = xstrdup (add);
++ }
++ return new_value;
++}
++
++int
++lt_split_name_value (const char *arg, char** name, char** value)
++{
++ const char *p;
++ int len;
++ if (!arg || !*arg)
++ return 1;
++
++ p = strchr (arg, (int)'=');
++
++ if (!p)
++ return 1;
++
++ *value = xstrdup (++p);
++
++ len = strlen (arg) - strlen (*value);
++ *name = XMALLOC (char, len);
++ strncpy (*name, arg, len-1);
++ (*name)[len - 1] = '\0';
++
++ return 0;
++}
++
++void
++lt_opt_process_env_set (const char *arg)
++{
++ char *name = NULL;
++ char *value = NULL;
++
++ if (lt_split_name_value (arg, &name, &value) != 0)
++ {
++ XFREE (name);
++ XFREE (value);
++ lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg);
++ }
++
++ lt_setenv (name, value);
++ XFREE (name);
++ XFREE (value);
++}
++
++void
++lt_opt_process_env_prepend (const char *arg)
++{
++ char *name = NULL;
++ char *value = NULL;
++ char *new_value = NULL;
++
++ if (lt_split_name_value (arg, &name, &value) != 0)
++ {
++ XFREE (name);
++ XFREE (value);
++ lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg);
++ }
++
++ new_value = lt_extend_str (getenv (name), value, 0);
++ lt_setenv (name, new_value);
++ XFREE (new_value);
++ XFREE (name);
++ XFREE (value);
++}
++
++void
++lt_opt_process_env_append (const char *arg)
++{
++ char *name = NULL;
++ char *value = NULL;
++ char *new_value = NULL;
++
++ if (lt_split_name_value (arg, &name, &value) != 0)
++ {
++ XFREE (name);
++ XFREE (value);
++ lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg);
++ }
++
++ new_value = lt_extend_str (getenv (name), value, 1);
++ lt_setenv (name, new_value);
++ XFREE (new_value);
++ XFREE (name);
++ XFREE (value);
++}
++
++void
++lt_update_exe_path (const char *name, const char *value)
++{
++ LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
++ (name ? name : "<NULL>"),
++ (value ? value : "<NULL>")));
++
++ if (name && *name && value && *value)
++ {
++ char *new_value = lt_extend_str (getenv (name), value, 0);
++ /* some systems can't cope with a ':'-terminated path #' */
++ int len = strlen (new_value);
++ while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
++ {
++ new_value[len-1] = '\0';
++ }
++ lt_setenv (name, new_value);
++ XFREE (new_value);
++ }
++}
++
++void
++lt_update_lib_path (const char *name, const char *value)
++{
++ LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
++ (name ? name : "<NULL>"),
++ (value ? value : "<NULL>")));
++
++ if (name && *name && value && *value)
++ {
++ char *new_value = lt_extend_str (getenv (name), value, 0);
++ lt_setenv (name, new_value);
++ XFREE (new_value);
++ }
++}
++
++
++EOF
++}
++# end: func_emit_cwrapperexe_src
++
++# func_mode_link arg...
++func_mode_link ()
++{
++ $opt_debug
++ case $host in
++ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
++ # It is impossible to link a dll without this setting, and
++ # we shouldn't force the makefile maintainer to figure out
++ # which system we are compiling for in order to pass an extra
++ # flag for every libtool invocation.
++ # allow_undefined=no
++
++ # FIXME: Unfortunately, there are problems with the above when trying
++ # to make a dll which has undefined symbols, in which case not
++ # even a static library is built. For now, we need to specify
++ # -no-undefined on the libtool link line when we can be certain
++ # that all symbols are satisfied, otherwise we get a static library.
++ allow_undefined=yes
++ ;;
++ *)
++ allow_undefined=yes
++ ;;
++ esac
++ libtool_args=$nonopt
++ base_compile="$nonopt $@"
++ compile_command=$nonopt
++ finalize_command=$nonopt
++
++ compile_rpath=
++ finalize_rpath=
++ compile_shlibpath=
++ finalize_shlibpath=
++ convenience=
++ old_convenience=
++ deplibs=
++ old_deplibs=
++ compiler_flags=
++ linker_flags=
++ dllsearchpath=
++ lib_search_path=`pwd`
++ inst_prefix_dir=
++ new_inherited_linker_flags=
++
++ avoid_version=no
++ dlfiles=
++ dlprefiles=
++ dlself=no
++ export_dynamic=no
++ export_symbols=
++ export_symbols_regex=
++ generated=
++ libobjs=
++ ltlibs=
++ module=no
++ no_install=no
++ objs=
++ non_pic_objects=
++ precious_files_regex=
++ prefer_static_libs=no
++ preload=no
++ prev=
++ prevarg=
++ release=
++ rpath=
++ xrpath=
++ perm_rpath=
++ temp_rpath=
++ thread_safe=no
++ vinfo=
++ vinfo_number=no
++ weak_libs=
++ single_module="${wl}-single_module"
++ func_infer_tag $base_compile
++
++ # We need to know -static, to get the right output filenames.
++ for arg
++ do
++ case $arg in
++ -shared)
++ test "$build_libtool_libs" != yes && \
++ func_fatal_configuration "can not build a shared library"
++ build_old_libs=no
++ break
++ ;;
++ -all-static | -static | -static-libtool-libs)
++ case $arg in
++ -all-static)
++ if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
++ func_warning "complete static linking is impossible in this configuration"
++ fi
++ if test -n "$link_static_flag"; then
++ dlopen_self=$dlopen_self_static
++ fi
++ prefer_static_libs=yes
++ ;;
++ -static)
++ if test -z "$pic_flag" && test -n "$link_static_flag"; then
++ dlopen_self=$dlopen_self_static
++ fi
++ prefer_static_libs=built
++ ;;
++ -static-libtool-libs)
++ if test -z "$pic_flag" && test -n "$link_static_flag"; then
++ dlopen_self=$dlopen_self_static
++ fi
++ prefer_static_libs=yes
++ ;;
++ esac
++ build_libtool_libs=no
++ build_old_libs=yes
++ break
++ ;;
++ esac
++ done
++
++ # See if our shared archives depend on static archives.
++ test -n "$old_archive_from_new_cmds" && build_old_libs=yes
++
++ # Go through the arguments, transforming them on the way.
++ while test "$#" -gt 0; do
++ arg="$1"
++ shift
++ func_quote_for_eval "$arg"
++ qarg=$func_quote_for_eval_unquoted_result
++ func_append libtool_args " $func_quote_for_eval_result"
++
++ # If the previous option needs an argument, assign it.
++ if test -n "$prev"; then
++ case $prev in
++ output)
++ func_append compile_command " @OUTPUT@"
++ func_append finalize_command " @OUTPUT@"
++ ;;
++ esac
++
++ case $prev in
++ dlfiles|dlprefiles)
++ if test "$preload" = no; then
++ # Add the symbol object into the linking commands.
++ func_append compile_command " @SYMFILE@"
++ func_append finalize_command " @SYMFILE@"
++ preload=yes
++ fi
++ case $arg in
++ *.la | *.lo) ;; # We handle these cases below.
++ force)
++ if test "$dlself" = no; then
++ dlself=needless
++ export_dynamic=yes
++ fi
++ prev=
++ continue
++ ;;
++ self)
++ if test "$prev" = dlprefiles; then
++ dlself=yes
++ elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
++ dlself=yes
++ else
++ dlself=needless
++ export_dynamic=yes
++ fi
++ prev=
++ continue
++ ;;
++ *)
++ if test "$prev" = dlfiles; then
++ dlfiles="$dlfiles $arg"
++ else
++ dlprefiles="$dlprefiles $arg"
++ fi
++ prev=
++ continue
++ ;;
++ esac
++ ;;
++ expsyms)
++ export_symbols="$arg"
++ test -f "$arg" \
++ || func_fatal_error "symbol file \`$arg' does not exist"
++ prev=
++ continue
++ ;;
++ expsyms_regex)
++ export_symbols_regex="$arg"
++ prev=
++ continue
++ ;;
++ framework)
++ case $host in
++ *-*-darwin*)
++ case "$deplibs " in
++ *" $qarg.ltframework "*) ;;
++ *) deplibs="$deplibs $qarg.ltframework" # this is fixed later
++ ;;
++ esac
++ ;;
++ esac
++ prev=
++ continue
++ ;;
++ inst_prefix)
++ inst_prefix_dir="$arg"
++ prev=
++ continue
++ ;;
++ objectlist)
++ if test -f "$arg"; then
++ save_arg=$arg
++ moreargs=
++ for fil in `cat "$save_arg"`
++ do
++# moreargs="$moreargs $fil"
++ arg=$fil
++ # A libtool-controlled object.
++
++ # Check to see that this really is a libtool object.
++ if func_lalib_unsafe_p "$arg"; then
++ pic_object=
++ non_pic_object=
++
++ # Read the .lo file
++ func_source "$arg"
++
++ if test -z "$pic_object" ||
++ test -z "$non_pic_object" ||
++ test "$pic_object" = none &&
++ test "$non_pic_object" = none; then
++ func_fatal_error "cannot find name of object for \`$arg'"
++ fi
++
++ # Extract subdirectory from the argument.
++ func_dirname "$arg" "/" ""
++ xdir="$func_dirname_result"
++
++ if test "$pic_object" != none; then
++ # Prepend the subdirectory the object is found in.
++ pic_object="$xdir$pic_object"
++
++ if test "$prev" = dlfiles; then
++ if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
++ dlfiles="$dlfiles $pic_object"
++ prev=
++ continue
++ else
++ # If libtool objects are unsupported, then we need to preload.
++ prev=dlprefiles
++ fi
++ fi
++
++ # CHECK ME: I think I busted this. -Ossama
++ if test "$prev" = dlprefiles; then
++ # Preload the old-style object.
++ dlprefiles="$dlprefiles $pic_object"
++ prev=
++ fi
++
++ # A PIC object.
++ func_append libobjs " $pic_object"
++ arg="$pic_object"
++ fi
++
++ # Non-PIC object.
++ if test "$non_pic_object" != none; then
++ # Prepend the subdirectory the object is found in.
++ non_pic_object="$xdir$non_pic_object"
++
++ # A standard non-PIC object
++ func_append non_pic_objects " $non_pic_object"
++ if test -z "$pic_object" || test "$pic_object" = none ; then
++ arg="$non_pic_object"
++ fi
++ else
++ # If the PIC object exists, use it instead.
++ # $xdir was prepended to $pic_object above.
++ non_pic_object="$pic_object"
++ func_append non_pic_objects " $non_pic_object"
++ fi
++ else
++ # Only an error if not doing a dry-run.
++ if $opt_dry_run; then
++ # Extract subdirectory from the argument.
++ func_dirname "$arg" "/" ""
++ xdir="$func_dirname_result"
++
++ func_lo2o "$arg"
++ pic_object=$xdir$objdir/$func_lo2o_result
++ non_pic_object=$xdir$func_lo2o_result
++ func_append libobjs " $pic_object"
++ func_append non_pic_objects " $non_pic_object"
++ else
++ func_fatal_error "\`$arg' is not a valid libtool object"
++ fi
++ fi
++ done
++ else
++ func_fatal_error "link input file \`$arg' does not exist"
++ fi
++ arg=$save_arg
++ prev=
++ continue
++ ;;
++ precious_regex)
++ precious_files_regex="$arg"
++ prev=
++ continue
++ ;;
++ release)
++ release="-$arg"
++ prev=
++ continue
++ ;;
++ rpath | xrpath)
++ # We need an absolute path.
++ case $arg in
++ [\\/]* | [A-Za-z]:[\\/]*) ;;
++ *)
++ func_fatal_error "only absolute run-paths are allowed"
++ ;;
++ esac
++ if test "$prev" = rpath; then
++ case "$rpath " in
++ *" $arg "*) ;;
++ *) rpath="$rpath $arg" ;;
++ esac
++ else
++ case "$xrpath " in
++ *" $arg "*) ;;
++ *) xrpath="$xrpath $arg" ;;
++ esac
++ fi
++ prev=
++ continue
++ ;;
++ shrext)
++ shrext_cmds="$arg"
++ prev=
++ continue
++ ;;
++ weak)
++ weak_libs="$weak_libs $arg"
++ prev=
++ continue
++ ;;
++ xcclinker)
++ linker_flags="$linker_flags $qarg"
++ compiler_flags="$compiler_flags $qarg"
++ prev=
++ func_append compile_command " $qarg"
++ func_append finalize_command " $qarg"
++ continue
++ ;;
++ xcompiler)
++ compiler_flags="$compiler_flags $qarg"
++ prev=
++ func_append compile_command " $qarg"
++ func_append finalize_command " $qarg"
++ continue
++ ;;
++ xlinker)
++ linker_flags="$linker_flags $qarg"
++ compiler_flags="$compiler_flags $wl$qarg"
++ prev=
++ func_append compile_command " $wl$qarg"
++ func_append finalize_command " $wl$qarg"
++ continue
++ ;;
++ *)
++ eval "$prev=\"\$arg\""
++ prev=
++ continue
++ ;;
++ esac
++ fi # test -n "$prev"
++
++ prevarg="$arg"
++
++ case $arg in
++ -all-static)
++ if test -n "$link_static_flag"; then
++ # See comment for -static flag below, for more details.
++ func_append compile_command " $link_static_flag"
++ func_append finalize_command " $link_static_flag"
++ fi
++ continue
++ ;;
++
++ -allow-undefined)
++ # FIXME: remove this flag sometime in the future.
++ func_fatal_error "\`-allow-undefined' must not be used because it is the default"
++ ;;
++
++ -avoid-version)
++ avoid_version=yes
++ continue
++ ;;
++
++ -dlopen)
++ prev=dlfiles
++ continue
++ ;;
++
++ -dlpreopen)
++ prev=dlprefiles
++ continue
++ ;;
++
++ -export-dynamic)
++ export_dynamic=yes
++ continue
++ ;;
++
++ -export-symbols | -export-symbols-regex)
++ if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
++ func_fatal_error "more than one -exported-symbols argument is not allowed"
++ fi
++ if test "X$arg" = "X-export-symbols"; then
++ prev=expsyms
++ else
++ prev=expsyms_regex
++ fi
++ continue
++ ;;
++
++ -framework)
++ prev=framework
++ continue
++ ;;
++
++ -inst-prefix-dir)
++ prev=inst_prefix
++ continue
++ ;;
++
++ # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
++ # so, if we see these flags be careful not to treat them like -L
++ -L[A-Z][A-Z]*:*)
++ case $with_gcc/$host in
++ no/*-*-irix* | /*-*-irix*)
++ func_append compile_command " $arg"
++ func_append finalize_command " $arg"
++ ;;
++ esac
++ continue
++ ;;
++
++ -L*)
++ func_stripname '-L' '' "$arg"
++ dir=$func_stripname_result
++ if test -z "$dir"; then
++ if test "$#" -gt 0; then
++ func_fatal_error "require no space between \`-L' and \`$1'"
++ else
++ func_fatal_error "need path for \`-L' option"
++ fi
++ fi
++ # We need an absolute path.
++ case $dir in
++ [\\/]* | [A-Za-z]:[\\/]*) ;;
++ *)
++ absdir=`cd "$dir" && pwd`
++ test -z "$absdir" && \
++ func_fatal_error "cannot determine absolute directory name of \`$dir'"
++ dir="$absdir"
++ ;;
++ esac
++ case "$deplibs " in
++ *" -L$dir "*) ;;
++ *)
++ deplibs="$deplibs -L$dir"
++ lib_search_path="$lib_search_path $dir"
++ ;;
++ esac
++ case $host in
++ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
++ testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'`
++ case :$dllsearchpath: in
++ *":$dir:"*) ;;
++ ::) dllsearchpath=$dir;;
++ *) dllsearchpath="$dllsearchpath:$dir";;
++ esac
++ case :$dllsearchpath: in
++ *":$testbindir:"*) ;;
++ ::) dllsearchpath=$testbindir;;
++ *) dllsearchpath="$dllsearchpath:$testbindir";;
++ esac
++ ;;
++ esac
++ continue
++ ;;
++
++ -l*)
++ if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
++ case $host in
++ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*)
++ # These systems don't actually have a C or math library (as such)
++ continue
++ ;;
++ *-*-os2*)
++ # These systems don't actually have a C library (as such)
++ test "X$arg" = "X-lc" && continue
++ ;;
++ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
++ # Do not include libc due to us having libc/libc_r.
++ test "X$arg" = "X-lc" && continue
++ ;;
++ *-*-rhapsody* | *-*-darwin1.[012])
++ # Rhapsody C and math libraries are in the System framework
++ deplibs="$deplibs System.ltframework"
++ continue
++ ;;
++ *-*-sco3.2v5* | *-*-sco5v6*)
++ # Causes problems with __ctype
++ test "X$arg" = "X-lc" && continue
++ ;;
++ *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
++ # Compiler inserts libc in the correct place for threads to work
++ test "X$arg" = "X-lc" && continue
++ ;;
++ esac
++ elif test "X$arg" = "X-lc_r"; then
++ case $host in
++ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
++ # Do not include libc_r directly, use -pthread flag.
++ continue
++ ;;
++ esac
++ fi
++ deplibs="$deplibs $arg"
++ continue
++ ;;
++
++ -module)
++ module=yes
++ continue
++ ;;
++
++ # Tru64 UNIX uses -model [arg] to determine the layout of C++
++ # classes, name mangling, and exception handling.
++ # Darwin uses the -arch flag to determine output architecture.
++ -model|-arch|-isysroot)
++ compiler_flags="$compiler_flags $arg"
++ func_append compile_command " $arg"
++ func_append finalize_command " $arg"
++ prev=xcompiler
++ continue
++ ;;
++
++ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
++ compiler_flags="$compiler_flags $arg"
++ func_append compile_command " $arg"
++ func_append finalize_command " $arg"
++ case "$new_inherited_linker_flags " in
++ *" $arg "*) ;;
++ * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;;
++ esac
++ continue
++ ;;
++
++ -multi_module)
++ single_module="${wl}-multi_module"
++ continue
++ ;;
++
++ -no-fast-install)
++ fast_install=no
++ continue
++ ;;
++
++ -no-install)
++ case $host in
++ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
++ # The PATH hackery in wrapper scripts is required on Windows
++ # and Darwin in order for the loader to find any dlls it needs.
++ func_warning "\`-no-install' is ignored for $host"
++ func_warning "assuming \`-no-fast-install' instead"
++ fast_install=no
++ ;;
++ *) no_install=yes ;;
++ esac
++ continue
++ ;;
++
++ -no-undefined)
++ allow_undefined=no
++ continue
++ ;;
++
++ -objectlist)
++ prev=objectlist
++ continue
++ ;;
++
++ -o) prev=output ;;
++
++ -precious-files-regex)
++ prev=precious_regex
++ continue
++ ;;
++
++ -release)
++ prev=release
++ continue
++ ;;
++
++ -rpath)
++ prev=rpath
++ continue
++ ;;
++
++ -R)
++ prev=xrpath
++ continue
++ ;;
++
++ -R*)
++ func_stripname '-R' '' "$arg"
++ dir=$func_stripname_result
++ # We need an absolute path.
++ case $dir in
++ [\\/]* | [A-Za-z]:[\\/]*) ;;
++ *)
++ func_fatal_error "only absolute run-paths are allowed"
++ ;;
++ esac
++ case "$xrpath " in
++ *" $dir "*) ;;
++ *) xrpath="$xrpath $dir" ;;
++ esac
++ continue
++ ;;
++
++ -shared)
++ # The effects of -shared are defined in a previous loop.
++ continue
++ ;;
++
++ -shrext)
++ prev=shrext
++ continue
++ ;;
++
++ -static | -static-libtool-libs)
++ # The effects of -static are defined in a previous loop.
++ # We used to do the same as -all-static on platforms that
++ # didn't have a PIC flag, but the assumption that the effects
++ # would be equivalent was wrong. It would break on at least
++ # Digital Unix and AIX.
++ continue
++ ;;
++
++ -thread-safe)
++ thread_safe=yes
++ continue
++ ;;
++
++ -version-info)
++ prev=vinfo
++ continue
++ ;;
++
++ -version-number)
++ prev=vinfo
++ vinfo_number=yes
++ continue
++ ;;
++
++ -weak)
++ prev=weak
++ continue
++ ;;
++
++ -Wc,*)
++ func_stripname '-Wc,' '' "$arg"
++ args=$func_stripname_result
++ arg=
++ save_ifs="$IFS"; IFS=','
++ for flag in $args; do
++ IFS="$save_ifs"
++ func_quote_for_eval "$flag"
++ arg="$arg $wl$func_quote_for_eval_result"
++ compiler_flags="$compiler_flags $func_quote_for_eval_result"
++ done
++ IFS="$save_ifs"
++ func_stripname ' ' '' "$arg"
++ arg=$func_stripname_result
++ ;;
++
++ -Wl,*)
++ func_stripname '-Wl,' '' "$arg"
++ args=$func_stripname_result
++ arg=
++ save_ifs="$IFS"; IFS=','
++ for flag in $args; do
++ IFS="$save_ifs"
++ func_quote_for_eval "$flag"
++ arg="$arg $wl$func_quote_for_eval_result"
++ compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
++ linker_flags="$linker_flags $func_quote_for_eval_result"
++ done
++ IFS="$save_ifs"
++ func_stripname ' ' '' "$arg"
++ arg=$func_stripname_result
++ ;;
++
++ -Xcompiler)
++ prev=xcompiler
++ continue
++ ;;
++
++ -Xlinker)
++ prev=xlinker
++ continue
++ ;;
++
++ -XCClinker)
++ prev=xcclinker
++ continue
++ ;;
++
++ # -msg_* for osf cc
++ -msg_*)
++ func_quote_for_eval "$arg"
++ arg="$func_quote_for_eval_result"
++ ;;
++
++ # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
++ # -r[0-9][0-9]* specifies the processor on the SGI compiler
++ # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
++ # +DA*, +DD* enable 64-bit mode on the HP compiler
++ # -q* pass through compiler args for the IBM compiler
++ # -m*, -t[45]*, -txscale* pass through architecture-specific
++ # compiler args for GCC
++ # -F/path gives path to uninstalled frameworks, gcc on darwin
++ # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
++ # @file GCC response files
++ -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
++ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
++ func_quote_for_eval "$arg"
++ arg="$func_quote_for_eval_result"
++ func_append compile_command " $arg"
++ func_append finalize_command " $arg"
++ compiler_flags="$compiler_flags $arg"
++ continue
++ ;;
++
++ # Some other compiler flag.
++ -* | +*)
++ func_quote_for_eval "$arg"
++ arg="$func_quote_for_eval_result"
++ ;;
++
++ *.$objext)
++ # A standard object.
++ objs="$objs $arg"
++ ;;
++
++ *.lo)
++ # A libtool-controlled object.
++
++ # Check to see that this really is a libtool object.
++ if func_lalib_unsafe_p "$arg"; then
++ pic_object=
++ non_pic_object=
++
++ # Read the .lo file
++ func_source "$arg"
++
++ if test -z "$pic_object" ||
++ test -z "$non_pic_object" ||
++ test "$pic_object" = none &&
++ test "$non_pic_object" = none; then
++ func_fatal_error "cannot find name of object for \`$arg'"
++ fi
++
++ # Extract subdirectory from the argument.
++ func_dirname "$arg" "/" ""
++ xdir="$func_dirname_result"
++
++ if test "$pic_object" != none; then
++ # Prepend the subdirectory the object is found in.
++ pic_object="$xdir$pic_object"
++
++ if test "$prev" = dlfiles; then
++ if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
++ dlfiles="$dlfiles $pic_object"
++ prev=
++ continue
++ else
++ # If libtool objects are unsupported, then we need to preload.
++ prev=dlprefiles
++ fi
++ fi
++
++ # CHECK ME: I think I busted this. -Ossama
++ if test "$prev" = dlprefiles; then
++ # Preload the old-style object.
++ dlprefiles="$dlprefiles $pic_object"
++ prev=
++ fi
++
++ # A PIC object.
++ func_append libobjs " $pic_object"
++ arg="$pic_object"
++ fi
++
++ # Non-PIC object.
++ if test "$non_pic_object" != none; then
++ # Prepend the subdirectory the object is found in.
++ non_pic_object="$xdir$non_pic_object"
++
++ # A standard non-PIC object
++ func_append non_pic_objects " $non_pic_object"
++ if test -z "$pic_object" || test "$pic_object" = none ; then
++ arg="$non_pic_object"
++ fi
++ else
++ # If the PIC object exists, use it instead.
++ # $xdir was prepended to $pic_object above.
++ non_pic_object="$pic_object"
++ func_append non_pic_objects " $non_pic_object"
++ fi
++ else
++ # Only an error if not doing a dry-run.
++ if $opt_dry_run; then
++ # Extract subdirectory from the argument.
++ func_dirname "$arg" "/" ""
++ xdir="$func_dirname_result"
++
++ func_lo2o "$arg"
++ pic_object=$xdir$objdir/$func_lo2o_result
++ non_pic_object=$xdir$func_lo2o_result
++ func_append libobjs " $pic_object"
++ func_append non_pic_objects " $non_pic_object"
++ else
++ func_fatal_error "\`$arg' is not a valid libtool object"
++ fi
++ fi
++ ;;
++
++ *.$libext)
++ # An archive.
++ deplibs="$deplibs $arg"
++ old_deplibs="$old_deplibs $arg"
++ continue
++ ;;
++
++ *.la)
++ # A libtool-controlled library.
++
++ if test "$prev" = dlfiles; then
++ # This library was specified with -dlopen.
++ dlfiles="$dlfiles $arg"
++ prev=
++ elif test "$prev" = dlprefiles; then
++ # The library was specified with -dlpreopen.
++ dlprefiles="$dlprefiles $arg"
++ prev=
++ else
++ deplibs="$deplibs $arg"
++ fi
++ continue
++ ;;
++
++ # Some other compiler argument.
++ *)
++ # Unknown arguments in both finalize_command and compile_command need
++ # to be aesthetically quoted because they are evaled later.
++ func_quote_for_eval "$arg"
++ arg="$func_quote_for_eval_result"
++ ;;
++ esac # arg
++
++ # Now actually substitute the argument into the commands.
++ if test -n "$arg"; then
++ func_append compile_command " $arg"
++ func_append finalize_command " $arg"
++ fi
++ done # argument parsing loop
++
++ test -n "$prev" && \
++ func_fatal_help "the \`$prevarg' option requires an argument"
++
++ if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
++ eval arg=\"$export_dynamic_flag_spec\"
++ func_append compile_command " $arg"
++ func_append finalize_command " $arg"
++ fi
++
++ oldlibs=
++ # calculate the name of the file, without its directory
++ func_basename "$output"
++ outputname="$func_basename_result"
++ libobjs_save="$libobjs"
++
++ if test -n "$shlibpath_var"; then
++ # get the directories listed in $shlibpath_var
++ eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
++ else
++ shlib_search_path=
++ fi
++ eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
++ eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
++
++ func_dirname "$output" "/" ""
++ output_objdir="$func_dirname_result$objdir"
++ # Create the object directory.
++ func_mkdir_p "$output_objdir"
++
++ # Determine the type of output
++ case $output in
++ "")
++ func_fatal_help "you must specify an output file"
++ ;;
++ *.$libext) linkmode=oldlib ;;
++ *.lo | *.$objext) linkmode=obj ;;
++ *.la) linkmode=lib ;;
++ *) linkmode=prog ;; # Anything else should be a program.
++ esac
++
++ specialdeplibs=
++
++ libs=
++ # Find all interdependent deplibs by searching for libraries
++ # that are linked more than once (e.g. -la -lb -la)
++ for deplib in $deplibs; do
++ if $opt_duplicate_deps ; then
++ case "$libs " in
++ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
++ esac
++ fi
++ libs="$libs $deplib"
++ done
++
++ if test "$linkmode" = lib; then
++ libs="$predeps $libs $compiler_lib_search_path $postdeps"
++
++ # Compute libraries that are listed more than once in $predeps
++ # $postdeps and mark them as special (i.e., whose duplicates are
++ # not to be eliminated).
++ pre_post_deps=
++ if $opt_duplicate_compiler_generated_deps; then
++ for pre_post_dep in $predeps $postdeps; do
++ case "$pre_post_deps " in
++ *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
++ esac
++ pre_post_deps="$pre_post_deps $pre_post_dep"
++ done
++ fi
++ pre_post_deps=
++ fi
++
++ deplibs=
++ newdependency_libs=
++ newlib_search_path=
++ need_relink=no # whether we're linking any uninstalled libtool libraries
++ notinst_deplibs= # not-installed libtool libraries
++ notinst_path= # paths that contain not-installed libtool libraries
++
++ case $linkmode in
++ lib)
++ passes="conv dlpreopen link"
++ for file in $dlfiles $dlprefiles; do
++ case $file in
++ *.la) ;;
++ *)
++ func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
++ ;;
++ esac
++ done
++ ;;
++ prog)
++ compile_deplibs=
++ finalize_deplibs=
++ alldeplibs=no
++ newdlfiles=
++ newdlprefiles=
++ passes="conv scan dlopen dlpreopen link"
++ ;;
++ *) passes="conv"
++ ;;
++ esac
++
++ for pass in $passes; do
++ # The preopen pass in lib mode reverses $deplibs; put it back here
++ # so that -L comes before libs that need it for instance...
++ if test "$linkmode,$pass" = "lib,link"; then
++ ## FIXME: Find the place where the list is rebuilt in the wrong
++ ## order, and fix it there properly
++ tmp_deplibs=
++ for deplib in $deplibs; do
++ tmp_deplibs="$deplib $tmp_deplibs"
++ done
++ deplibs="$tmp_deplibs"
++ fi
++
++ if test "$linkmode,$pass" = "lib,link" ||
++ test "$linkmode,$pass" = "prog,scan"; then
++ libs="$deplibs"
++ deplibs=
++ fi
++ if test "$linkmode" = prog; then
++ case $pass in
++ dlopen) libs="$dlfiles" ;;
++ dlpreopen) libs="$dlprefiles" ;;
++ link)
++ libs="$deplibs %DEPLIBS%"
++ test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
++ ;;
++ esac
++ fi
++ if test "$linkmode,$pass" = "lib,dlpreopen"; then
++ # Collect and forward deplibs of preopened libtool libs
++ for lib in $dlprefiles; do
++ # Ignore non-libtool-libs
++ dependency_libs=
++ case $lib in
++ *.la) func_source "$lib" ;;
++ esac
++
++ # Collect preopened libtool deplibs, except any this library
++ # has declared as weak libs
++ for deplib in $dependency_libs; do
++ deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"`
++ case " $weak_libs " in
++ *" $deplib_base "*) ;;
++ *) deplibs="$deplibs $deplib" ;;
++ esac
++ done
++ done
++ libs="$dlprefiles"
++ fi
++ if test "$pass" = dlopen; then
++ # Collect dlpreopened libraries
++ save_deplibs="$deplibs"
++ deplibs=
++ fi
++
++ for deplib in $libs; do
++ lib=
++ found=no
++ case $deplib in
++ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
++ if test "$linkmode,$pass" = "prog,link"; then
++ compile_deplibs="$deplib $compile_deplibs"
++ finalize_deplibs="$deplib $finalize_deplibs"
++ else
++ compiler_flags="$compiler_flags $deplib"
++ if test "$linkmode" = lib ; then
++ case "$new_inherited_linker_flags " in
++ *" $deplib "*) ;;
++ * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
++ esac
++ fi
++ fi
++ continue
++ ;;
++ -l*)
++ if test "$linkmode" != lib && test "$linkmode" != prog; then
++ func_warning "\`-l' is ignored for archives/objects"
++ continue
++ fi
++ func_stripname '-l' '' "$deplib"
++ name=$func_stripname_result
++ if test "$linkmode" = lib; then
++ searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
++ else
++ searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
++ fi
++ for searchdir in $searchdirs; do
++ for search_ext in .la $std_shrext .so .a; do
++ # Search the libtool library
++ lib="$searchdir/lib${name}${search_ext}"
++ if test -f "$lib"; then
++ if test "$search_ext" = ".la"; then
++ found=yes
++ else
++ found=no
++ fi
++ break 2
++ fi
++ done
++ done
++ if test "$found" != yes; then
++ # deplib doesn't seem to be a libtool library
++ if test "$linkmode,$pass" = "prog,link"; then
++ compile_deplibs="$deplib $compile_deplibs"
++ finalize_deplibs="$deplib $finalize_deplibs"
++ else
++ deplibs="$deplib $deplibs"
++ test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
++ fi
++ continue
++ else # deplib is a libtool library
++ # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
++ # We need to do some special things here, and not later.
++ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
++ case " $predeps $postdeps " in
++ *" $deplib "*)
++ if func_lalib_p "$lib"; then
++ library_names=
++ old_library=
++ func_source "$lib"
++ for l in $old_library $library_names; do
++ ll="$l"
++ done
++ if test "X$ll" = "X$old_library" ; then # only static version available
++ found=no
++ func_dirname "$lib" "" "."
++ ladir="$func_dirname_result"
++ lib=$ladir/$old_library
++ if test "$linkmode,$pass" = "prog,link"; then
++ compile_deplibs="$deplib $compile_deplibs"
++ finalize_deplibs="$deplib $finalize_deplibs"
++ else
++ deplibs="$deplib $deplibs"
++ test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
++ fi
++ continue
++ fi
++ fi
++ ;;
++ *) ;;
++ esac
++ fi
++ fi
++ ;; # -l
++ *.ltframework)
++ if test "$linkmode,$pass" = "prog,link"; then
++ compile_deplibs="$deplib $compile_deplibs"
++ finalize_deplibs="$deplib $finalize_deplibs"
++ else
++ deplibs="$deplib $deplibs"
++ if test "$linkmode" = lib ; then
++ case "$new_inherited_linker_flags " in
++ *" $deplib "*) ;;
++ * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
++ esac
++ fi
++ fi
++ continue
++ ;;
++ -L*)
++ case $linkmode in
++ lib)
++ deplibs="$deplib $deplibs"
++ test "$pass" = conv && continue
++ newdependency_libs="$deplib $newdependency_libs"
++ func_stripname '-L' '' "$deplib"
++ newlib_search_path="$newlib_search_path $func_stripname_result"
++ ;;
++ prog)
++ if test "$pass" = conv; then
++ deplibs="$deplib $deplibs"
++ continue
++ fi
++ if test "$pass" = scan; then
++ deplibs="$deplib $deplibs"
++ else
++ compile_deplibs="$deplib $compile_deplibs"
++ finalize_deplibs="$deplib $finalize_deplibs"
++ fi
++ func_stripname '-L' '' "$deplib"
++ newlib_search_path="$newlib_search_path $func_stripname_result"
++ ;;
++ *)
++ func_warning "\`-L' is ignored for archives/objects"
++ ;;
++ esac # linkmode
++ continue
++ ;; # -L
++ -R*)
++ if test "$pass" = link; then
++ func_stripname '-R' '' "$deplib"
++ dir=$func_stripname_result
++ # Make sure the xrpath contains only unique directories.
++ case "$xrpath " in
++ *" $dir "*) ;;
++ *) xrpath="$xrpath $dir" ;;
++ esac
++ fi
++ deplibs="$deplib $deplibs"
++ continue
++ ;;
++ *.la) lib="$deplib" ;;
++ *.$libext)
++ if test "$pass" = conv; then
++ deplibs="$deplib $deplibs"
++ continue
++ fi
++ case $linkmode in
++ lib)
++ # Linking convenience modules into shared libraries is allowed,
++ # but linking other static libraries is non-portable.
++ case " $dlpreconveniencelibs " in
++ *" $deplib "*) ;;
++ *)
++ valid_a_lib=no
++ case $deplibs_check_method in
++ match_pattern*)
++ set dummy $deplibs_check_method; shift
++ match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
++ if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \
++ | $EGREP "$match_pattern_regex" > /dev/null; then
++ valid_a_lib=yes
++ fi
++ ;;
++ pass_all)
++ valid_a_lib=yes
++ ;;
++ esac
++ if test "$valid_a_lib" != yes; then
++ $ECHO
++ $ECHO "*** Warning: Trying to link with static lib archive $deplib."
++ $ECHO "*** I have the capability to make that library automatically link in when"
++ $ECHO "*** you link to this library. But I can only do this if you have a"
++ $ECHO "*** shared version of the library, which you do not appear to have"
++ $ECHO "*** because the file extensions .$libext of this argument makes me believe"
++ $ECHO "*** that it is just a static archive that I should not use here."
++ else
++ $ECHO
++ $ECHO "*** Warning: Linking the shared library $output against the"
++ $ECHO "*** static library $deplib is not portable!"
++ deplibs="$deplib $deplibs"
++ fi
++ ;;
++ esac
++ continue
++ ;;
++ prog)
++ if test "$pass" != link; then
++ deplibs="$deplib $deplibs"
++ else
++ compile_deplibs="$deplib $compile_deplibs"
++ finalize_deplibs="$deplib $finalize_deplibs"
++ fi
++ continue
++ ;;
++ esac # linkmode
++ ;; # *.$libext
++ *.lo | *.$objext)
++ if test "$pass" = conv; then
++ deplibs="$deplib $deplibs"
++ elif test "$linkmode" = prog; then
++ if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
++ # If there is no dlopen support or we're linking statically,
++ # we need to preload.
++ newdlprefiles="$newdlprefiles $deplib"
++ compile_deplibs="$deplib $compile_deplibs"
++ finalize_deplibs="$deplib $finalize_deplibs"
++ else
++ newdlfiles="$newdlfiles $deplib"
++ fi
++ fi
++ continue
++ ;;
++ %DEPLIBS%)
++ alldeplibs=yes
++ continue
++ ;;
++ esac # case $deplib
++
++ if test "$found" = yes || test -f "$lib"; then :
++ else
++ func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
++ fi
++
++ # Check to see that this really is a libtool archive.
++ func_lalib_unsafe_p "$lib" \
++ || func_fatal_error "\`$lib' is not a valid libtool archive"
++
++ func_dirname "$lib" "" "."
++ ladir="$func_dirname_result"
++
++ dlname=
++ dlopen=
++ dlpreopen=
++ libdir=
++ library_names=
++ old_library=
++ inherited_linker_flags=
++ # If the library was installed with an old release of libtool,
++ # it will not redefine variables installed, or shouldnotlink
++ installed=yes
++ shouldnotlink=no
++ avoidtemprpath=
++
++
++ # Read the .la file
++ func_source "$lib"
++
++ # Convert "-framework foo" to "foo.ltframework"
++ if test -n "$inherited_linker_flags"; then
++ tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'`
++ for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
++ case " $new_inherited_linker_flags " in
++ *" $tmp_inherited_linker_flag "*) ;;
++ *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
++ esac
++ done
++ fi
++ dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
++ if test "$linkmode,$pass" = "lib,link" ||
++ test "$linkmode,$pass" = "prog,scan" ||
++ { test "$linkmode" != prog && test "$linkmode" != lib; }; then
++ test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
++ test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
++ fi
++
++ if test "$pass" = conv; then
++ # Only check for convenience libraries
++ deplibs="$lib $deplibs"
++ if test -z "$libdir"; then
++ if test -z "$old_library"; then
++ func_fatal_error "cannot find name of link library for \`$lib'"
++ fi
++ # It is a libtool convenience library, so add in its objects.
++ convenience="$convenience $ladir/$objdir/$old_library"
++ old_convenience="$old_convenience $ladir/$objdir/$old_library"
++ tmp_libs=
++ for deplib in $dependency_libs; do
++ deplibs="$deplib $deplibs"
++ if $opt_duplicate_deps ; then
++ case "$tmp_libs " in
++ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
++ esac
++ fi
++ tmp_libs="$tmp_libs $deplib"
++ done
++ elif test "$linkmode" != prog && test "$linkmode" != lib; then
++ func_fatal_error "\`$lib' is not a convenience library"
++ fi
++ continue
++ fi # $pass = conv
++
++
++ # Get the name of the library we link against.
++ linklib=
++ for l in $old_library $library_names; do
++ linklib="$l"
++ done
++ if test -z "$linklib"; then
++ func_fatal_error "cannot find name of link library for \`$lib'"
++ fi
++
++ # This library was specified with -dlopen.
++ if test "$pass" = dlopen; then
++ if test -z "$libdir"; then
++ func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
++ fi
++ if test -z "$dlname" ||
++ test "$dlopen_support" != yes ||
++ test "$build_libtool_libs" = no; then
++ # If there is no dlname, no dlopen support or we're linking
++ # statically, we need to preload. We also need to preload any
++ # dependent libraries so libltdl's deplib preloader doesn't
++ # bomb out in the load deplibs phase.
++ dlprefiles="$dlprefiles $lib $dependency_libs"
++ else
++ newdlfiles="$newdlfiles $lib"
++ fi
++ continue
++ fi # $pass = dlopen
++
++ # We need an absolute path.
++ case $ladir in
++ [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
++ *)
++ abs_ladir=`cd "$ladir" && pwd`
++ if test -z "$abs_ladir"; then
++ func_warning "cannot determine absolute directory name of \`$ladir'"
++ func_warning "passing it literally to the linker, although it might fail"
++ abs_ladir="$ladir"
++ fi
++ ;;
++ esac
++ func_basename "$lib"
++ laname="$func_basename_result"
++
++ # Find the relevant object directory and library name.
++ if test "X$installed" = Xyes; then
++ if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
++ func_warning "library \`$lib' was moved."
++ dir="$ladir"
++ absdir="$abs_ladir"
++ libdir="$abs_ladir"
++ else
++ dir="$libdir"
++ absdir="$libdir"
++ fi
++ test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
++ else
++ if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
++ dir="$ladir"
++ absdir="$abs_ladir"
++ # Remove this search path later
++ notinst_path="$notinst_path $abs_ladir"
++ else
++ dir="$ladir/$objdir"
++ absdir="$abs_ladir/$objdir"
++ # Remove this search path later
++ notinst_path="$notinst_path $abs_ladir"
++ fi
++ fi # $installed = yes
++ func_stripname 'lib' '.la' "$laname"
++ name=$func_stripname_result
++
++ # This library was specified with -dlpreopen.
++ if test "$pass" = dlpreopen; then
++ if test -z "$libdir" && test "$linkmode" = prog; then
++ func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
++ fi
++ # Prefer using a static library (so that no silly _DYNAMIC symbols
++ # are required to link).
++ if test -n "$old_library"; then
++ newdlprefiles="$newdlprefiles $dir/$old_library"
++ # Keep a list of preopened convenience libraries to check
++ # that they are being used correctly in the link pass.
++ test -z "$libdir" && \
++ dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
++ # Otherwise, use the dlname, so that lt_dlopen finds it.
++ elif test -n "$dlname"; then
++ newdlprefiles="$newdlprefiles $dir/$dlname"
++ else
++ newdlprefiles="$newdlprefiles $dir/$linklib"
++ fi
++ fi # $pass = dlpreopen
++
++ if test -z "$libdir"; then
++ # Link the convenience library
++ if test "$linkmode" = lib; then
++ deplibs="$dir/$old_library $deplibs"
++ elif test "$linkmode,$pass" = "prog,link"; then
++ compile_deplibs="$dir/$old_library $compile_deplibs"
++ finalize_deplibs="$dir/$old_library $finalize_deplibs"
++ else
++ deplibs="$lib $deplibs" # used for prog,scan pass
++ fi
++ continue
++ fi
++
++
++ if test "$linkmode" = prog && test "$pass" != link; then
++ newlib_search_path="$newlib_search_path $ladir"
++ deplibs="$lib $deplibs"
++
++ linkalldeplibs=no
++ if test "$link_all_deplibs" != no || test -z "$library_names" ||
++ test "$build_libtool_libs" = no; then
++ linkalldeplibs=yes
++ fi
++
++ tmp_libs=
++ for deplib in $dependency_libs; do
++ case $deplib in
++ -L*) func_stripname '-L' '' "$deplib"
++ newlib_search_path="$newlib_search_path $func_stripname_result"
++ ;;
++ esac
++ # Need to link against all dependency_libs?
++ if test "$linkalldeplibs" = yes; then
++ deplibs="$deplib $deplibs"
++ else
++ # Need to hardcode shared library paths
++ # or/and link against static libraries
++ newdependency_libs="$deplib $newdependency_libs"
++ fi
++ if $opt_duplicate_deps ; then
++ case "$tmp_libs " in
++ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
++ esac
++ fi
++ tmp_libs="$tmp_libs $deplib"
++ done # for deplib
++ continue
++ fi # $linkmode = prog...
++
++ if test "$linkmode,$pass" = "prog,link"; then
++ if test -n "$library_names" &&
++ { { test "$prefer_static_libs" = no ||
++ test "$prefer_static_libs,$installed" = "built,yes"; } ||
++ test -z "$old_library"; }; then
++ # We need to hardcode the library path
++ if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
++ # Make sure the rpath contains only unique directories.
++ case "$temp_rpath:" in
++ *"$absdir:"*) ;;
++ *) temp_rpath="$temp_rpath$absdir:" ;;
++ esac
++ fi
++
++ # Hardcode the library path.
++ # Skip directories that are in the system default run-time
++ # search path.
++ case " $sys_lib_dlsearch_path " in
++ *" $absdir "*) ;;
++ *)
++ case "$compile_rpath " in
++ *" $absdir "*) ;;
++ *) compile_rpath="$compile_rpath $absdir"
++ esac
++ ;;
++ esac
++ case " $sys_lib_dlsearch_path " in
++ *" $libdir "*) ;;
++ *)
++ case "$finalize_rpath " in
++ *" $libdir "*) ;;
++ *) finalize_rpath="$finalize_rpath $libdir"
++ esac
++ ;;
++ esac
++ fi # $linkmode,$pass = prog,link...
++
++ if test "$alldeplibs" = yes &&
++ { test "$deplibs_check_method" = pass_all ||
++ { test "$build_libtool_libs" = yes &&
++ test -n "$library_names"; }; }; then
++ # We only need to search for static libraries
++ continue
++ fi
++ fi
++
++ link_static=no # Whether the deplib will be linked statically
++ use_static_libs=$prefer_static_libs
++ if test "$use_static_libs" = built && test "$installed" = yes; then
++ use_static_libs=no
++ fi
++ if test -n "$library_names" &&
++ { test "$use_static_libs" = no || test -z "$old_library"; }; then
++ case $host in
++ *cygwin* | *mingw* | *cegcc*)
++ # No point in relinking DLLs because paths are not encoded
++ notinst_deplibs="$notinst_deplibs $lib"
++ need_relink=no
++ ;;
++ *)
++ if test "$installed" = no; then
++ notinst_deplibs="$notinst_deplibs $lib"
++ need_relink=yes
++ fi
++ ;;
++ esac
++ # This is a shared library
++
++ # Warn about portability, can't link against -module's on some
++ # systems (darwin). Don't bleat about dlopened modules though!
++ dlopenmodule=""
++ for dlpremoduletest in $dlprefiles; do
++ if test "X$dlpremoduletest" = "X$lib"; then
++ dlopenmodule="$dlpremoduletest"
++ break
++ fi
++ done
++ if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
++ $ECHO
++ if test "$linkmode" = prog; then
++ $ECHO "*** Warning: Linking the executable $output against the loadable module"
++ else
++ $ECHO "*** Warning: Linking the shared library $output against the loadable module"
++ fi
++ $ECHO "*** $linklib is not portable!"
++ fi
++ if test "$linkmode" = lib &&
++ test "$hardcode_into_libs" = yes; then
++ # Hardcode the library path.
++ # Skip directories that are in the system default run-time
++ # search path.
++ case " $sys_lib_dlsearch_path " in
++ *" $absdir "*) ;;
++ *)
++ case "$compile_rpath " in
++ *" $absdir "*) ;;
++ *) compile_rpath="$compile_rpath $absdir"
++ esac
++ ;;
++ esac
++ case " $sys_lib_dlsearch_path " in
++ *" $libdir "*) ;;
++ *)
++ case "$finalize_rpath " in
++ *" $libdir "*) ;;
++ *) finalize_rpath="$finalize_rpath $libdir"
++ esac
++ ;;
++ esac
++ fi
++
++ if test -n "$old_archive_from_expsyms_cmds"; then
++ # figure out the soname
++ set dummy $library_names
++ shift
++ realname="$1"
++ shift
++ libname=`eval "\\$ECHO \"$libname_spec\""`
++ # use dlname if we got it. it's perfectly good, no?
++ if test -n "$dlname"; then
++ soname="$dlname"
++ elif test -n "$soname_spec"; then
++ # bleh windows
++ case $host in
++ *cygwin* | mingw* | *cegcc*)
++ func_arith $current - $age
++ major=$func_arith_result
++ versuffix="-$major"
++ ;;
++ esac
++ eval soname=\"$soname_spec\"
++ else
++ soname="$realname"
++ fi
++
++ # Make a new name for the extract_expsyms_cmds to use
++ soroot="$soname"
++ func_basename "$soroot"
++ soname="$func_basename_result"
++ func_stripname 'lib' '.dll' "$soname"
++ newlib=libimp-$func_stripname_result.a
++
++ # If the library has no export list, then create one now
++ if test -f "$output_objdir/$soname-def"; then :
++ else
++ func_verbose "extracting exported symbol list from \`$soname'"
++ func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
++ fi
++
++ # Create $newlib
++ if test -f "$output_objdir/$newlib"; then :; else
++ func_verbose "generating import library for \`$soname'"
++ func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
++ fi
++ # make sure the library variables are pointing to the new library
++ dir=$output_objdir
++ linklib=$newlib
++ fi # test -n "$old_archive_from_expsyms_cmds"
++
++ if test "$linkmode" = prog || test "$mode" != relink; then
++ add_shlibpath=
++ add_dir=
++ add=
++ lib_linked=yes
++ case $hardcode_action in
++ immediate | unsupported)
++ if test "$hardcode_direct" = no; then
++ add="$dir/$linklib"
++ case $host in
++ *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
++ *-*-sysv4*uw2*) add_dir="-L$dir" ;;
++ *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
++ *-*-unixware7*) add_dir="-L$dir" ;;
++ *-*-darwin* )
++ # if the lib is a (non-dlopened) module then we can not
++ # link against it, someone is ignoring the earlier warnings
++ if /usr/bin/file -L $add 2> /dev/null |
++ $GREP ": [^:]* bundle" >/dev/null ; then
++ if test "X$dlopenmodule" != "X$lib"; then
++ $ECHO "*** Warning: lib $linklib is a module, not a shared library"
++ if test -z "$old_library" ; then
++ $ECHO
++ $ECHO "*** And there doesn't seem to be a static archive available"
++ $ECHO "*** The link will probably fail, sorry"
++ else
++ add="$dir/$old_library"
++ fi
++ elif test -n "$old_library"; then
++ add="$dir/$old_library"
++ fi
++ fi
++ esac
++ elif test "$hardcode_minus_L" = no; then
++ case $host in
++ *-*-sunos*) add_shlibpath="$dir" ;;
++ esac
++ add_dir="-L$dir"
++ add="-l$name"
++ elif test "$hardcode_shlibpath_var" = no; then
++ add_shlibpath="$dir"
++ add="-l$name"
++ else
++ lib_linked=no
++ fi
++ ;;
++ relink)
++ if test "$hardcode_direct" = yes &&
++ test "$hardcode_direct_absolute" = no; then
++ add="$dir/$linklib"
++ elif test "$hardcode_minus_L" = yes; then
++ add_dir="-L$dir"
++ # Try looking first in the location we're being installed to.
++ if test -n "$inst_prefix_dir"; then
++ case $libdir in
++ [\\/]*)
++ add_dir="$add_dir -L$inst_prefix_dir$libdir"
++ ;;
++ esac
++ fi
++ add="-l$name"
++ elif test "$hardcode_shlibpath_var" = yes; then
++ add_shlibpath="$dir"
++ add="-l$name"
++ else
++ lib_linked=no
++ fi
++ ;;
++ *) lib_linked=no ;;
++ esac
++
++ if test "$lib_linked" != yes; then
++ func_fatal_configuration "unsupported hardcode properties"
++ fi
++
++ if test -n "$add_shlibpath"; then
++ case :$compile_shlibpath: in
++ *":$add_shlibpath:"*) ;;
++ *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
++ esac
++ fi
++ if test "$linkmode" = prog; then
++ test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
++ test -n "$add" && compile_deplibs="$add $compile_deplibs"
++ else
++ test -n "$add_dir" && deplibs="$add_dir $deplibs"
++ test -n "$add" && deplibs="$add $deplibs"
++ if test "$hardcode_direct" != yes &&
++ test "$hardcode_minus_L" != yes &&
++ test "$hardcode_shlibpath_var" = yes; then
++ case :$finalize_shlibpath: in
++ *":$libdir:"*) ;;
++ *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
++ esac
++ fi
++ fi
++ fi
++
++ if test "$linkmode" = prog || test "$mode" = relink; then
++ add_shlibpath=
++ add_dir=
++ add=
++ # Finalize command for both is simple: just hardcode it.
++ if test "$hardcode_direct" = yes &&
++ test "$hardcode_direct_absolute" = no; then
++ add="$libdir/$linklib"
++ elif test "$hardcode_minus_L" = yes; then
++ add_dir="-L$libdir"
++ add="-l$name"
++ elif test "$hardcode_shlibpath_var" = yes; then
++ case :$finalize_shlibpath: in
++ *":$libdir:"*) ;;
++ *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
++ esac
++ add="-l$name"
++ elif test "$hardcode_automatic" = yes; then
++ if test -n "$inst_prefix_dir" &&
++ test -f "$inst_prefix_dir$libdir/$linklib" ; then
++ add="$inst_prefix_dir$libdir/$linklib"
++ else
++ add="$libdir/$linklib"
++ fi
++ else
++ # We cannot seem to hardcode it, guess we'll fake it.
++ add_dir="-L$libdir"
++ # Try looking first in the location we're being installed to.
++ if test -n "$inst_prefix_dir"; then
++ case $libdir in
++ [\\/]*)
++ add_dir="$add_dir -L$inst_prefix_dir$libdir"
++ ;;
++ esac
++ fi
++ add="-l$name"
++ fi
++
++ if test "$linkmode" = prog; then
++ test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
++ test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
++ else
++ test -n "$add_dir" && deplibs="$add_dir $deplibs"
++ test -n "$add" && deplibs="$add $deplibs"
++ fi
++ fi
++ elif test "$linkmode" = prog; then
++ # Here we assume that one of hardcode_direct or hardcode_minus_L
++ # is not unsupported. This is valid on all known static and
++ # shared platforms.
++ if test "$hardcode_direct" != unsupported; then
++ test -n "$old_library" && linklib="$old_library"
++ compile_deplibs="$dir/$linklib $compile_deplibs"
++ finalize_deplibs="$dir/$linklib $finalize_deplibs"
++ else
++ compile_deplibs="-l$name -L$dir $compile_deplibs"
++ finalize_deplibs="-l$name -L$dir $finalize_deplibs"
++ fi
++ elif test "$build_libtool_libs" = yes; then
++ # Not a shared library
++ if test "$deplibs_check_method" != pass_all; then
++ # We're trying link a shared library against a static one
++ # but the system doesn't support it.
++
++ # Just print a warning and add the library to dependency_libs so
++ # that the program can be linked against the static library.
++ $ECHO
++ $ECHO "*** Warning: This system can not link to static lib archive $lib."
++ $ECHO "*** I have the capability to make that library automatically link in when"
++ $ECHO "*** you link to this library. But I can only do this if you have a"
++ $ECHO "*** shared version of the library, which you do not appear to have."
++ if test "$module" = yes; then
++ $ECHO "*** But as you try to build a module library, libtool will still create "
++ $ECHO "*** a static module, that should work as long as the dlopening application"
++ $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime."
++ if test -z "$global_symbol_pipe"; then
++ $ECHO
++ $ECHO "*** However, this would only work if libtool was able to extract symbol"
++ $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
++ $ECHO "*** not find such a program. So, this module is probably useless."
++ $ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
++ fi
++ if test "$build_old_libs" = no; then
++ build_libtool_libs=module
++ build_old_libs=yes
++ else
++ build_libtool_libs=no
++ fi
++ fi
++ else
++ deplibs="$dir/$old_library $deplibs"
++ link_static=yes
++ fi
++ fi # link shared/static library?
++
++ if test "$linkmode" = lib; then
++ if test -n "$dependency_libs" &&
++ { test "$hardcode_into_libs" != yes ||
++ test "$build_old_libs" = yes ||
++ test "$link_static" = yes; }; then
++ # Extract -R from dependency_libs
++ temp_deplibs=
++ for libdir in $dependency_libs; do
++ case $libdir in
++ -R*) func_stripname '-R' '' "$libdir"
++ temp_xrpath=$func_stripname_result
++ case " $xrpath " in
++ *" $temp_xrpath "*) ;;
++ *) xrpath="$xrpath $temp_xrpath";;
++ esac;;
++ *) temp_deplibs="$temp_deplibs $libdir";;
++ esac
++ done
++ dependency_libs="$temp_deplibs"
++ fi
++
++ newlib_search_path="$newlib_search_path $absdir"
++ # Link against this library
++ test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
++ # ... and its dependency_libs
++ tmp_libs=
++ for deplib in $dependency_libs; do
++ newdependency_libs="$deplib $newdependency_libs"
++ if $opt_duplicate_deps ; then
++ case "$tmp_libs " in
++ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
++ esac
++ fi
++ tmp_libs="$tmp_libs $deplib"
++ done
++
++ if test "$link_all_deplibs" != no; then
++ # Add the search paths of all dependency libraries
++ for deplib in $dependency_libs; do
++ path=
++ case $deplib in
++ -L*) path="$deplib" ;;
++ *.la)
++ func_dirname "$deplib" "" "."
++ dir="$func_dirname_result"
++ # We need an absolute path.
++ case $dir in
++ [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
++ *)
++ absdir=`cd "$dir" && pwd`
++ if test -z "$absdir"; then
++ func_warning "cannot determine absolute directory name of \`$dir'"
++ absdir="$dir"
++ fi
++ ;;
++ esac
++ if $GREP "^installed=no" $deplib > /dev/null; then
++ case $host in
++ *-*-darwin*)
++ depdepl=
++ eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
++ if test -n "$deplibrary_names" ; then
++ for tmp in $deplibrary_names ; do
++ depdepl=$tmp
++ done
++ if test -f "$absdir/$objdir/$depdepl" ; then
++ depdepl="$absdir/$objdir/$depdepl"
++ darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
++ if test -z "$darwin_install_name"; then
++ darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
++ fi
++ compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
++ linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}"
++ path=
++ fi
++ fi
++ ;;
++ *)
++ path="-L$absdir/$objdir"
++ ;;
++ esac
++ else
++ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
++ test -z "$libdir" && \
++ func_fatal_error "\`$deplib' is not a valid libtool archive"
++ test "$absdir" != "$libdir" && \
++ func_warning "\`$deplib' seems to be moved"
++
++ path="-L$absdir"
++ fi
++ ;;
++ esac
++ case " $deplibs " in
++ *" $path "*) ;;
++ *) deplibs="$path $deplibs" ;;
++ esac
++ done
++ fi # link_all_deplibs != no
++ fi # linkmode = lib
++ done # for deplib in $libs
++ if test "$pass" = link; then
++ if test "$linkmode" = "prog"; then
++ compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
++ finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
++ else
++ compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
++ fi
++ fi
++ dependency_libs="$newdependency_libs"
++ if test "$pass" = dlpreopen; then
++ # Link the dlpreopened libraries before other libraries
++ for deplib in $save_deplibs; do
++ deplibs="$deplib $deplibs"
++ done
++ fi
++ if test "$pass" != dlopen; then
++ if test "$pass" != conv; then
++ # Make sure lib_search_path contains only unique directories.
++ lib_search_path=
++ for dir in $newlib_search_path; do
++ case "$lib_search_path " in
++ *" $dir "*) ;;
++ *) lib_search_path="$lib_search_path $dir" ;;
++ esac
++ done
++ newlib_search_path=
++ fi
++
++ if test "$linkmode,$pass" != "prog,link"; then
++ vars="deplibs"
++ else
++ vars="compile_deplibs finalize_deplibs"
++ fi
++ for var in $vars dependency_libs; do
++ # Add libraries to $var in reverse order
++ eval tmp_libs=\"\$$var\"
++ new_libs=
++ for deplib in $tmp_libs; do
++ # FIXME: Pedantically, this is the right thing to do, so
++ # that some nasty dependency loop isn't accidentally
++ # broken:
++ #new_libs="$deplib $new_libs"
++ # Pragmatically, this seems to cause very few problems in
++ # practice:
++ case $deplib in
++ -L*) new_libs="$deplib $new_libs" ;;
++ -R*) ;;
++ *)
++ # And here is the reason: when a library appears more
++ # than once as an explicit dependence of a library, or
++ # is implicitly linked in more than once by the
++ # compiler, it is considered special, and multiple
++ # occurrences thereof are not removed. Compare this
++ # with having the same library being listed as a
++ # dependency of multiple other libraries: in this case,
++ # we know (pedantically, we assume) the library does not
++ # need to be listed more than once, so we keep only the
++ # last copy. This is not always right, but it is rare
++ # enough that we require users that really mean to play
++ # such unportable linking tricks to link the library
++ # using -Wl,-lname, so that libtool does not consider it
++ # for duplicate removal.
++ case " $specialdeplibs " in
++ *" $deplib "*) new_libs="$deplib $new_libs" ;;
++ *)
++ case " $new_libs " in
++ *" $deplib "*) ;;
++ *) new_libs="$deplib $new_libs" ;;
++ esac
++ ;;
++ esac
++ ;;
++ esac
++ done
++ tmp_libs=
++ for deplib in $new_libs; do
++ case $deplib in
++ -L*)
++ case " $tmp_libs " in
++ *" $deplib "*) ;;
++ *) tmp_libs="$tmp_libs $deplib" ;;
++ esac
++ ;;
++ *) tmp_libs="$tmp_libs $deplib" ;;
++ esac
++ done
++ eval $var=\"$tmp_libs\"
++ done # for var
++ fi
++ # Last step: remove runtime libs from dependency_libs
++ # (they stay in deplibs)
++ tmp_libs=
++ for i in $dependency_libs ; do
++ case " $predeps $postdeps $compiler_lib_search_path " in
++ *" $i "*)
++ i=""
++ ;;
++ esac
++ if test -n "$i" ; then
++ tmp_libs="$tmp_libs $i"
++ fi
++ done
++ dependency_libs=$tmp_libs
++ done # for pass
++ if test "$linkmode" = prog; then
++ dlfiles="$newdlfiles"
++ fi
++ if test "$linkmode" = prog || test "$linkmode" = lib; then
++ dlprefiles="$newdlprefiles"
++ fi
++
++ case $linkmode in
++ oldlib)
++ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
++ func_warning "\`-dlopen' is ignored for archives"
++ fi
++
++ case " $deplibs" in
++ *\ -l* | *\ -L*)
++ func_warning "\`-l' and \`-L' are ignored for archives" ;;
++ esac
++
++ test -n "$rpath" && \
++ func_warning "\`-rpath' is ignored for archives"
++
++ test -n "$xrpath" && \
++ func_warning "\`-R' is ignored for archives"
++
++ test -n "$vinfo" && \
++ func_warning "\`-version-info/-version-number' is ignored for archives"
++
++ test -n "$release" && \
++ func_warning "\`-release' is ignored for archives"
++
++ test -n "$export_symbols$export_symbols_regex" && \
++ func_warning "\`-export-symbols' is ignored for archives"
++
++ # Now set the variables for building old libraries.
++ build_libtool_libs=no
++ oldlibs="$output"
++ objs="$objs$old_deplibs"
++ ;;
++
++ lib)
++ # Make sure we only generate libraries of the form `libNAME.la'.
++ case $outputname in
++ lib*)
++ func_stripname 'lib' '.la' "$outputname"
++ name=$func_stripname_result
++ eval shared_ext=\"$shrext_cmds\"
++ eval libname=\"$libname_spec\"
++ ;;
++ *)
++ test "$module" = no && \
++ func_fatal_help "libtool library \`$output' must begin with \`lib'"
++
++ if test "$need_lib_prefix" != no; then
++ # Add the "lib" prefix for modules if required
++ func_stripname '' '.la' "$outputname"
++ name=$func_stripname_result
++ eval shared_ext=\"$shrext_cmds\"
++ eval libname=\"$libname_spec\"
++ else
++ func_stripname '' '.la' "$outputname"
++ libname=$func_stripname_result
++ fi
++ ;;
++ esac
++
++ if test -n "$objs"; then
++ if test "$deplibs_check_method" != pass_all; then
++ func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
++ else
++ $ECHO
++ $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
++ $ECHO "*** objects $objs is not portable!"
++ libobjs="$libobjs $objs"
++ fi
++ fi
++
++ test "$dlself" != no && \
++ func_warning "\`-dlopen self' is ignored for libtool libraries"
++
++ set dummy $rpath
++ shift
++ test "$#" -gt 1 && \
++ func_warning "ignoring multiple \`-rpath's for a libtool library"
++
++ install_libdir="$1"
++
++ oldlibs=
++ if test -z "$rpath"; then
++ if test "$build_libtool_libs" = yes; then
++ # Building a libtool convenience library.
++ # Some compilers have problems with a `.al' extension so
++ # convenience libraries should have the same extension an
++ # archive normally would.
++ oldlibs="$output_objdir/$libname.$libext $oldlibs"
++ build_libtool_libs=convenience
++ build_old_libs=yes
++ fi
++
++ test -n "$vinfo" && \
++ func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
++
++ test -n "$release" && \
++ func_warning "\`-release' is ignored for convenience libraries"
++ else
++
++ # Parse the version information argument.
++ save_ifs="$IFS"; IFS=':'
++ set dummy $vinfo 0 0 0
++ shift
++ IFS="$save_ifs"
++
++ test -n "$7" && \
++ func_fatal_help "too many parameters to \`-version-info'"
++
++ # convert absolute version numbers to libtool ages
++ # this retains compatibility with .la files and attempts
++ # to make the code below a bit more comprehensible
++
++ case $vinfo_number in
++ yes)
++ number_major="$1"
++ number_minor="$2"
++ number_revision="$3"
++ #
++ # There are really only two kinds -- those that
++ # use the current revision as the major version
++ # and those that subtract age and use age as
++ # a minor version. But, then there is irix
++ # which has an extra 1 added just for fun
++ #
++ case $version_type in
++ darwin|linux|osf|windows|none)
++ func_arith $number_major + $number_minor
++ current=$func_arith_result
++ age="$number_minor"
++ revision="$number_revision"
++ ;;
++ freebsd-aout|freebsd-elf|sunos)
++ current="$number_major"
++ revision="$number_minor"
++ age="0"
++ ;;
++ irix|nonstopux)
++ func_arith $number_major + $number_minor
++ current=$func_arith_result
++ age="$number_minor"
++ revision="$number_minor"
++ lt_irix_increment=no
++ ;;
++ *)
++ func_fatal_configuration "$modename: unknown library version type \`$version_type'"
++ ;;
++ esac
++ ;;
++ no)
++ current="$1"
++ revision="$2"
++ age="$3"
++ ;;
++ esac
++
++ # Check that each of the things are valid numbers.
++ case $current in
++ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
++ *)
++ func_error "CURRENT \`$current' must be a nonnegative integer"
++ func_fatal_error "\`$vinfo' is not valid version information"
++ ;;
++ esac
++
++ case $revision in
++ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
++ *)
++ func_error "REVISION \`$revision' must be a nonnegative integer"
++ func_fatal_error "\`$vinfo' is not valid version information"
++ ;;
++ esac
++
++ case $age in
++ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
++ *)
++ func_error "AGE \`$age' must be a nonnegative integer"
++ func_fatal_error "\`$vinfo' is not valid version information"
++ ;;
++ esac
++
++ if test "$age" -gt "$current"; then
++ func_error "AGE \`$age' is greater than the current interface number \`$current'"
++ func_fatal_error "\`$vinfo' is not valid version information"
++ fi
++
++ # Calculate the version variables.
++ major=
++ versuffix=
++ verstring=
++ case $version_type in
++ none) ;;
++
++ darwin)
++ # Like Linux, but with the current version available in
++ # verstring for coding it into the library header
++ func_arith $current - $age
++ major=.$func_arith_result
++ versuffix="$major.$age.$revision"
++ # Darwin ld doesn't like 0 for these options...
++ func_arith $current + 1
++ minor_current=$func_arith_result
++ xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
++ verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
++ ;;
++
++ freebsd-aout)
++ major=".$current"
++ versuffix=".$current.$revision";
++ ;;
++
++ freebsd-elf)
++ major=".$current"
++ versuffix=".$current"
++ ;;
++
++ irix | nonstopux)
++ if test "X$lt_irix_increment" = "Xno"; then
++ func_arith $current - $age
++ else
++ func_arith $current - $age + 1
++ fi
++ major=$func_arith_result
++
++ case $version_type in
++ nonstopux) verstring_prefix=nonstopux ;;
++ *) verstring_prefix=sgi ;;
++ esac
++ verstring="$verstring_prefix$major.$revision"
++
++ # Add in all the interfaces that we are compatible with.
++ loop=$revision
++ while test "$loop" -ne 0; do
++ func_arith $revision - $loop
++ iface=$func_arith_result
++ func_arith $loop - 1
++ loop=$func_arith_result
++ verstring="$verstring_prefix$major.$iface:$verstring"
++ done
++
++ # Before this point, $major must not contain `.'.
++ major=.$major
++ versuffix="$major.$revision"
++ ;;
++
++ linux)
++ func_arith $current - $age
++ major=.$func_arith_result
++ versuffix="$major.$age.$revision"
++ ;;
++
++ osf)
++ func_arith $current - $age
++ major=.$func_arith_result
++ versuffix=".$current.$age.$revision"
++ verstring="$current.$age.$revision"
++
++ # Add in all the interfaces that we are compatible with.
++ loop=$age
++ while test "$loop" -ne 0; do
++ func_arith $current - $loop
++ iface=$func_arith_result
++ func_arith $loop - 1
++ loop=$func_arith_result
++ verstring="$verstring:${iface}.0"
++ done
++
++ # Make executables depend on our current version.
++ verstring="$verstring:${current}.0"
++ ;;
++
++ qnx)
++ major=".$current"
++ versuffix=".$current"
++ ;;
++
++ sunos)
++ major=".$current"
++ versuffix=".$current.$revision"
++ ;;
++
++ windows)
++ # Use '-' rather than '.', since we only want one
++ # extension on DOS 8.3 filesystems.
++ func_arith $current - $age
++ major=$func_arith_result
++ versuffix="-$major"
++ ;;
++
++ *)
++ func_fatal_configuration "unknown library version type \`$version_type'"
++ ;;
++ esac
++
++ # Clear the version info if we defaulted, and they specified a release.
++ if test -z "$vinfo" && test -n "$release"; then
++ major=
++ case $version_type in
++ darwin)
++ # we can't check for "0.0" in archive_cmds due to quoting
++ # problems, so we reset it completely
++ verstring=
++ ;;
++ *)
++ verstring="0.0"
++ ;;
++ esac
++ if test "$need_version" = no; then
++ versuffix=
++ else
++ versuffix=".0.0"
++ fi
++ fi
++
++ # Remove version info from name if versioning should be avoided
++ if test "$avoid_version" = yes && test "$need_version" = no; then
++ major=
++ versuffix=
++ verstring=""
++ fi
++
++ # Check to see if the archive will have undefined symbols.
++ if test "$allow_undefined" = yes; then
++ if test "$allow_undefined_flag" = unsupported; then
++ func_warning "undefined symbols not allowed in $host shared libraries"
++ build_libtool_libs=no
++ build_old_libs=yes
++ fi
++ else
++ # Don't allow undefined symbols.
++ allow_undefined_flag="$no_undefined_flag"
++ fi
++
++ fi
++
++ func_generate_dlsyms "$libname" "$libname" "yes"
++ libobjs="$libobjs $symfileobj"
++ test "X$libobjs" = "X " && libobjs=
++
++ if test "$mode" != relink; then
++ # Remove our outputs, but don't remove object files since they
++ # may have been created when compiling PIC objects.
++ removelist=
++ tempremovelist=`$ECHO "$output_objdir/*"`
++ for p in $tempremovelist; do
++ case $p in
++ *.$objext | *.gcno)
++ ;;
++ $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
++ if test "X$precious_files_regex" != "X"; then
++ if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
++ then
++ continue
++ fi
++ fi
++ removelist="$removelist $p"
++ ;;
++ *) ;;
++ esac
++ done
++ test -n "$removelist" && \
++ func_show_eval "${RM}r \$removelist"
++ fi
++
++ # Now set the variables for building old libraries.
++ if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
++ oldlibs="$oldlibs $output_objdir/$libname.$libext"
++
++ # Transform .lo files to .o files.
++ oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
++ fi
++
++ # Eliminate all temporary directories.
++ #for path in $notinst_path; do
++ # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"`
++ # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"`
++ # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"`
++ #done
++
++ if test -n "$xrpath"; then
++ # If the user specified any rpath flags, then add them.
++ temp_xrpath=
++ for libdir in $xrpath; do
++ temp_xrpath="$temp_xrpath -R$libdir"
++ case "$finalize_rpath " in
++ *" $libdir "*) ;;
++ *) finalize_rpath="$finalize_rpath $libdir" ;;
++ esac
++ done
++ if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
++ dependency_libs="$temp_xrpath $dependency_libs"
++ fi
++ fi
++
++ # Make sure dlfiles contains only unique files that won't be dlpreopened
++ old_dlfiles="$dlfiles"
++ dlfiles=
++ for lib in $old_dlfiles; do
++ case " $dlprefiles $dlfiles " in
++ *" $lib "*) ;;
++ *) dlfiles="$dlfiles $lib" ;;
++ esac
++ done
++
++ # Make sure dlprefiles contains only unique files
++ old_dlprefiles="$dlprefiles"
++ dlprefiles=
++ for lib in $old_dlprefiles; do
++ case "$dlprefiles " in
++ *" $lib "*) ;;
++ *) dlprefiles="$dlprefiles $lib" ;;
++ esac
++ done
++
++ if test "$build_libtool_libs" = yes; then
++ if test -n "$rpath"; then
++ case $host in
++ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*)
++ # these systems don't actually have a c library (as such)!
++ ;;
++ *-*-rhapsody* | *-*-darwin1.[012])
++ # Rhapsody C library is in the System framework
++ deplibs="$deplibs System.ltframework"
++ ;;
++ *-*-netbsd*)
++ # Don't link with libc until the a.out ld.so is fixed.
++ ;;
++ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
++ # Do not include libc due to us having libc/libc_r.
++ ;;
++ *-*-sco3.2v5* | *-*-sco5v6*)
++ # Causes problems with __ctype
++ ;;
++ *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
++ # Compiler inserts libc in the correct place for threads to work
++ ;;
++ *)
++ # Add libc to deplibs on all other systems if necessary.
++ if test "$build_libtool_need_lc" = "yes"; then
++ deplibs="$deplibs -lc"
++ fi
++ ;;
++ esac
++ fi
++
++ # Transform deplibs into only deplibs that can be linked in shared.
++ name_save=$name
++ libname_save=$libname
++ release_save=$release
++ versuffix_save=$versuffix
++ major_save=$major
++ # I'm not sure if I'm treating the release correctly. I think
++ # release should show up in the -l (ie -lgmp5) so we don't want to
++ # add it in twice. Is that correct?
++ release=""
++ versuffix=""
++ major=""
++ newdeplibs=
++ droppeddeps=no
++ case $deplibs_check_method in
++ pass_all)
++ # Don't check for shared/static. Everything works.
++ # This might be a little naive. We might want to check
++ # whether the library exists or not. But this is on
++ # osf3 & osf4 and I'm not really sure... Just
++ # implementing what was already the behavior.
++ newdeplibs=$deplibs
++ ;;
++ test_compile)
++ # This code stresses the "libraries are programs" paradigm to its
++ # limits. Maybe even breaks it. We compile a program, linking it
++ # against the deplibs as a proxy for the library. Then we can check
++ # whether they linked in statically or dynamically with ldd.
++ $opt_dry_run || $RM conftest.c
++ cat > conftest.c <<EOF
++ int main() { return 0; }
++EOF
++ $opt_dry_run || $RM conftest
++ if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
++ ldd_output=`ldd conftest`
++ for i in $deplibs; do
++ case $i in
++ -l*)
++ func_stripname -l '' "$i"
++ name=$func_stripname_result
++ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
++ case " $predeps $postdeps " in
++ *" $i "*)
++ newdeplibs="$newdeplibs $i"
++ i=""
++ ;;
++ esac
++ fi
++ if test -n "$i" ; then
++ libname=`eval "\\$ECHO \"$libname_spec\""`
++ deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
++ set dummy $deplib_matches; shift
++ deplib_match=$1
++ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
++ newdeplibs="$newdeplibs $i"
++ else
++ droppeddeps=yes
++ $ECHO
++ $ECHO "*** Warning: dynamic linker does not accept needed library $i."
++ $ECHO "*** I have the capability to make that library automatically link in when"
++ $ECHO "*** you link to this library. But I can only do this if you have a"
++ $ECHO "*** shared version of the library, which I believe you do not have"
++ $ECHO "*** because a test_compile did reveal that the linker did not use it for"
++ $ECHO "*** its dynamic dependency list that programs get resolved with at runtime."
++ fi
++ fi
++ ;;
++ *)
++ newdeplibs="$newdeplibs $i"
++ ;;
++ esac
++ done
++ else
++ # Error occurred in the first compile. Let's try to salvage
++ # the situation: Compile a separate program for each library.
++ for i in $deplibs; do
++ case $i in
++ -l*)
++ func_stripname -l '' "$i"
++ name=$func_stripname_result
++ $opt_dry_run || $RM conftest
++ if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
++ ldd_output=`ldd conftest`
++ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
++ case " $predeps $postdeps " in
++ *" $i "*)
++ newdeplibs="$newdeplibs $i"
++ i=""
++ ;;
++ esac
++ fi
++ if test -n "$i" ; then
++ libname=`eval "\\$ECHO \"$libname_spec\""`
++ deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
++ set dummy $deplib_matches; shift
++ deplib_match=$1
++ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
++ newdeplibs="$newdeplibs $i"
++ else
++ droppeddeps=yes
++ $ECHO
++ $ECHO "*** Warning: dynamic linker does not accept needed library $i."
++ $ECHO "*** I have the capability to make that library automatically link in when"
++ $ECHO "*** you link to this library. But I can only do this if you have a"
++ $ECHO "*** shared version of the library, which you do not appear to have"
++ $ECHO "*** because a test_compile did reveal that the linker did not use this one"
++ $ECHO "*** as a dynamic dependency that programs can get resolved with at runtime."
++ fi
++ fi
++ else
++ droppeddeps=yes
++ $ECHO
++ $ECHO "*** Warning! Library $i is needed by this library but I was not able to"
++ $ECHO "*** make it link in! You will probably need to install it or some"
++ $ECHO "*** library that it depends on before this library will be fully"
++ $ECHO "*** functional. Installing it before continuing would be even better."
++ fi
++ ;;
++ *)
++ newdeplibs="$newdeplibs $i"
++ ;;
++ esac
++ done
++ fi
++ ;;
++ file_magic*)
++ set dummy $deplibs_check_method; shift
++ file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
++ for a_deplib in $deplibs; do
++ case $a_deplib in
++ -l*)
++ func_stripname -l '' "$a_deplib"
++ name=$func_stripname_result
++ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
++ case " $predeps $postdeps " in
++ *" $a_deplib "*)
++ newdeplibs="$newdeplibs $a_deplib"
++ a_deplib=""
++ ;;
++ esac
++ fi
++ if test -n "$a_deplib" ; then
++ libname=`eval "\\$ECHO \"$libname_spec\""`
++ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
++ potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
++ for potent_lib in $potential_libs; do
++ # Follow soft links.
++ if ls -lLd "$potent_lib" 2>/dev/null |
++ $GREP " -> " >/dev/null; then
++ continue
++ fi
++ # The statement above tries to avoid entering an
++ # endless loop below, in case of cyclic links.
++ # We might still enter an endless loop, since a link
++ # loop can be closed while we follow links,
++ # but so what?
++ potlib="$potent_lib"
++ while test -h "$potlib" 2>/dev/null; do
++ potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
++ case $potliblink in
++ [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
++ *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
++ esac
++ done
++ if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
++ $SED -e 10q |
++ $EGREP "$file_magic_regex" > /dev/null; then
++ newdeplibs="$newdeplibs $a_deplib"
++ a_deplib=""
++ break 2
++ fi
++ done
++ done
++ fi
++ if test -n "$a_deplib" ; then
++ droppeddeps=yes
++ $ECHO
++ $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
++ $ECHO "*** I have the capability to make that library automatically link in when"
++ $ECHO "*** you link to this library. But I can only do this if you have a"
++ $ECHO "*** shared version of the library, which you do not appear to have"
++ $ECHO "*** because I did check the linker path looking for a file starting"
++ if test -z "$potlib" ; then
++ $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
++ else
++ $ECHO "*** with $libname and none of the candidates passed a file format test"
++ $ECHO "*** using a file magic. Last file checked: $potlib"
++ fi
++ fi
++ ;;
++ *)
++ # Add a -L argument.
++ newdeplibs="$newdeplibs $a_deplib"
++ ;;
++ esac
++ done # Gone through all deplibs.
++ ;;
++ match_pattern*)
++ set dummy $deplibs_check_method; shift
++ match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
++ for a_deplib in $deplibs; do
++ case $a_deplib in
++ -l*)
++ func_stripname -l '' "$a_deplib"
++ name=$func_stripname_result
++ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
++ case " $predeps $postdeps " in
++ *" $a_deplib "*)
++ newdeplibs="$newdeplibs $a_deplib"
++ a_deplib=""
++ ;;
++ esac
++ fi
++ if test -n "$a_deplib" ; then
++ libname=`eval "\\$ECHO \"$libname_spec\""`
++ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
++ potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
++ for potent_lib in $potential_libs; do
++ potlib="$potent_lib" # see symlink-check above in file_magic test
++ if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \
++ $EGREP "$match_pattern_regex" > /dev/null; then
++ newdeplibs="$newdeplibs $a_deplib"
++ a_deplib=""
++ break 2
++ fi
++ done
++ done
++ fi
++ if test -n "$a_deplib" ; then
++ droppeddeps=yes
++ $ECHO
++ $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
++ $ECHO "*** I have the capability to make that library automatically link in when"
++ $ECHO "*** you link to this library. But I can only do this if you have a"
++ $ECHO "*** shared version of the library, which you do not appear to have"
++ $ECHO "*** because I did check the linker path looking for a file starting"
++ if test -z "$potlib" ; then
++ $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
++ else
++ $ECHO "*** with $libname and none of the candidates passed a file format test"
++ $ECHO "*** using a regex pattern. Last file checked: $potlib"
++ fi
++ fi
++ ;;
++ *)
++ # Add a -L argument.
++ newdeplibs="$newdeplibs $a_deplib"
++ ;;
++ esac
++ done # Gone through all deplibs.
++ ;;
++ none | unknown | *)
++ newdeplibs=""
++ tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \
++ -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'`
++ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
++ for i in $predeps $postdeps ; do
++ # can't use Xsed below, because $i might contain '/'
++ tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"`
++ done
++ fi
++ if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' |
++ $GREP . >/dev/null; then
++ $ECHO
++ if test "X$deplibs_check_method" = "Xnone"; then
++ $ECHO "*** Warning: inter-library dependencies are not supported in this platform."
++ else
++ $ECHO "*** Warning: inter-library dependencies are not known to be supported."
++ fi
++ $ECHO "*** All declared inter-library dependencies are being dropped."
++ droppeddeps=yes
++ fi
++ ;;
++ esac
++ versuffix=$versuffix_save
++ major=$major_save
++ release=$release_save
++ libname=$libname_save
++ name=$name_save
++
++ case $host in
++ *-*-rhapsody* | *-*-darwin1.[012])
++ # On Rhapsody replace the C library with the System framework
++ newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
++ ;;
++ esac
++
++ if test "$droppeddeps" = yes; then
++ if test "$module" = yes; then
++ $ECHO
++ $ECHO "*** Warning: libtool could not satisfy all declared inter-library"
++ $ECHO "*** dependencies of module $libname. Therefore, libtool will create"
++ $ECHO "*** a static module, that should work as long as the dlopening"
++ $ECHO "*** application is linked with the -dlopen flag."
++ if test -z "$global_symbol_pipe"; then
++ $ECHO
++ $ECHO "*** However, this would only work if libtool was able to extract symbol"
++ $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
++ $ECHO "*** not find such a program. So, this module is probably useless."
++ $ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
++ fi
++ if test "$build_old_libs" = no; then
++ oldlibs="$output_objdir/$libname.$libext"
++ build_libtool_libs=module
++ build_old_libs=yes
++ else
++ build_libtool_libs=no
++ fi
++ else
++ $ECHO "*** The inter-library dependencies that have been dropped here will be"
++ $ECHO "*** automatically added whenever a program is linked with this library"
++ $ECHO "*** or is declared to -dlopen it."
++
++ if test "$allow_undefined" = no; then
++ $ECHO
++ $ECHO "*** Since this library must not contain undefined symbols,"
++ $ECHO "*** because either the platform does not support them or"
++ $ECHO "*** it was explicitly requested with -no-undefined,"
++ $ECHO "*** libtool will only create a static version of it."
++ if test "$build_old_libs" = no; then
++ oldlibs="$output_objdir/$libname.$libext"
++ build_libtool_libs=module
++ build_old_libs=yes
++ else
++ build_libtool_libs=no
++ fi
++ fi
++ fi
++ fi
++ # Done checking deplibs!
++ deplibs=$newdeplibs
++ fi
++ # Time to change all our "foo.ltframework" stuff back to "-framework foo"
++ case $host in
++ *-*-darwin*)
++ newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
++ new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
++ deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
++ ;;
++ esac
++
++ # move library search paths that coincide with paths to not yet
++ # installed libraries to the beginning of the library search list
++ new_libs=
++ for path in $notinst_path; do
++ case " $new_libs " in
++ *" -L$path/$objdir "*) ;;
++ *)
++ case " $deplibs " in
++ *" -L$path/$objdir "*)
++ new_libs="$new_libs -L$path/$objdir" ;;
++ esac
++ ;;
++ esac
++ done
++ for deplib in $deplibs; do
++ case $deplib in
++ -L*)
++ case " $new_libs " in
++ *" $deplib "*) ;;
++ *) new_libs="$new_libs $deplib" ;;
++ esac
++ ;;
++ *) new_libs="$new_libs $deplib" ;;
++ esac
++ done
++ deplibs="$new_libs"
++
++ # All the library-specific variables (install_libdir is set above).
++ library_names=
++ old_library=
++ dlname=
++
++ # Test again, we may have decided not to build it any more
++ if test "$build_libtool_libs" = yes; then
++ if test "$hardcode_into_libs" = yes; then
++ # Hardcode the library paths
++ hardcode_libdirs=
++ dep_rpath=
++ rpath="$finalize_rpath"
++ test "$mode" != relink && rpath="$compile_rpath$rpath"
++ for libdir in $rpath; do
++ if test -n "$hardcode_libdir_flag_spec"; then
++ if test -n "$hardcode_libdir_separator"; then
++ if test -z "$hardcode_libdirs"; then
++ hardcode_libdirs="$libdir"
++ else
++ # Just accumulate the unique libdirs.
++ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
++ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
++ ;;
++ *)
++ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
++ ;;
++ esac
++ fi
++ else
++ eval flag=\"$hardcode_libdir_flag_spec\"
++ dep_rpath="$dep_rpath $flag"
++ fi
++ elif test -n "$runpath_var"; then
++ case "$perm_rpath " in
++ *" $libdir "*) ;;
++ *) perm_rpath="$perm_rpath $libdir" ;;
++ esac
++ fi
++ done
++ # Substitute the hardcoded libdirs into the rpath.
++ if test -n "$hardcode_libdir_separator" &&
++ test -n "$hardcode_libdirs"; then
++ libdir="$hardcode_libdirs"
++ if test -n "$hardcode_libdir_flag_spec_ld"; then
++ eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
++ else
++ eval dep_rpath=\"$hardcode_libdir_flag_spec\"
++ fi
++ fi
++ if test -n "$runpath_var" && test -n "$perm_rpath"; then
++ # We should set the runpath_var.
++ rpath=
++ for dir in $perm_rpath; do
++ rpath="$rpath$dir:"
++ done
++ eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
++ fi
++ test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
++ fi
++
++ shlibpath="$finalize_shlibpath"
++ test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
++ if test -n "$shlibpath"; then
++ eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
++ fi
++
++ # Get the real and link names of the library.
++ eval shared_ext=\"$shrext_cmds\"
++ eval library_names=\"$library_names_spec\"
++ set dummy $library_names
++ shift
++ realname="$1"
++ shift
++
++ if test -n "$soname_spec"; then
++ eval soname=\"$soname_spec\"
++ else
++ soname="$realname"
++ fi
++ if test -z "$dlname"; then
++ dlname=$soname
++ fi
++
++ lib="$output_objdir/$realname"
++ linknames=
++ for link
++ do
++ linknames="$linknames $link"
++ done
++
++ # Use standard objects if they are pic
++ test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
++ test "X$libobjs" = "X " && libobjs=
++
++ delfiles=
++ if test -n "$export_symbols" && test -n "$include_expsyms"; then
++ $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
++ export_symbols="$output_objdir/$libname.uexp"
++ delfiles="$delfiles $export_symbols"
++ fi
++
++ orig_export_symbols=
++ case $host_os in
++ cygwin* | mingw* | cegcc*)
++ if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
++ # exporting using user supplied symfile
++ if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
++ # and it's NOT already a .def file. Must figure out
++ # which of the given symbols are data symbols and tag
++ # them as such. So, trigger use of export_symbols_cmds.
++ # export_symbols gets reassigned inside the "prepare
++ # the list of exported symbols" if statement, so the
++ # include_expsyms logic still works.
++ orig_export_symbols="$export_symbols"
++ export_symbols=
++ always_export_symbols=yes
++ fi
++ fi
++ ;;
++ esac
++
++ # Prepare the list of exported symbols
++ if test -z "$export_symbols"; then
++ if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
++ func_verbose "generating symbol list for \`$libname.la'"
++ export_symbols="$output_objdir/$libname.exp"
++ $opt_dry_run || $RM $export_symbols
++ cmds=$export_symbols_cmds
++ save_ifs="$IFS"; IFS='~'
++ for cmd in $cmds; do
++ IFS="$save_ifs"
++ eval cmd=\"$cmd\"
++ func_len " $cmd"
++ len=$func_len_result
++ if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
++ func_show_eval "$cmd" 'exit $?'
++ skipped_export=false
++ else
++ # The command line is too long to execute in one step.
++ func_verbose "using reloadable object file for export list..."
++ skipped_export=:
++ # Break out early, otherwise skipped_export may be
++ # set to false by a later but shorter cmd.
++ break
++ fi
++ done
++ IFS="$save_ifs"
++ if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
++ func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
++ func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
++ fi
++ fi
++ fi
++
++ if test -n "$export_symbols" && test -n "$include_expsyms"; then
++ tmp_export_symbols="$export_symbols"
++ test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
++ $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
++ fi
++
++ if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
++ # The given exports_symbols file has to be filtered, so filter it.
++ func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
++ # FIXME: $output_objdir/$libname.filter potentially contains lots of
++ # 's' commands which not all seds can handle. GNU sed should be fine
++ # though. Also, the filter scales superlinearly with the number of
++ # global variables. join(1) would be nice here, but unfortunately
++ # isn't a blessed tool.
++ $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
++ delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
++ export_symbols=$output_objdir/$libname.def
++ $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
++ fi
++
++ tmp_deplibs=
++ for test_deplib in $deplibs; do
++ case " $convenience " in
++ *" $test_deplib "*) ;;
++ *)
++ tmp_deplibs="$tmp_deplibs $test_deplib"
++ ;;
++ esac
++ done
++ deplibs="$tmp_deplibs"
++
++ if test -n "$convenience"; then
++ if test -n "$whole_archive_flag_spec" &&
++ test "$compiler_needs_object" = yes &&
++ test -z "$libobjs"; then
++ # extract the archives, so we have objects to list.
++ # TODO: could optimize this to just extract one archive.
++ whole_archive_flag_spec=
++ fi
++ if test -n "$whole_archive_flag_spec"; then
++ save_libobjs=$libobjs
++ eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
++ test "X$libobjs" = "X " && libobjs=
++ else
++ gentop="$output_objdir/${outputname}x"
++ generated="$generated $gentop"
++
++ func_extract_archives $gentop $convenience
++ libobjs="$libobjs $func_extract_archives_result"
++ test "X$libobjs" = "X " && libobjs=
++ fi
++ fi
++
++ if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
++ eval flag=\"$thread_safe_flag_spec\"
++ linker_flags="$linker_flags $flag"
++ fi
++
++ # Make a backup of the uninstalled library when relinking
++ if test "$mode" = relink; then
++ $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
++ fi
++
++ # Do each of the archive commands.
++ if test "$module" = yes && test -n "$module_cmds" ; then
++ if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
++ eval test_cmds=\"$module_expsym_cmds\"
++ cmds=$module_expsym_cmds
++ else
++ eval test_cmds=\"$module_cmds\"
++ cmds=$module_cmds
++ fi
++ else
++ if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
++ eval test_cmds=\"$archive_expsym_cmds\"
++ cmds=$archive_expsym_cmds
++ else
++ eval test_cmds=\"$archive_cmds\"
++ cmds=$archive_cmds
++ fi
++ fi
++
++ if test "X$skipped_export" != "X:" &&
++ func_len " $test_cmds" &&
++ len=$func_len_result &&
++ test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
++ :
++ else
++ # The command line is too long to link in one step, link piecewise
++ # or, if using GNU ld and skipped_export is not :, use a linker
++ # script.
++
++ # Save the value of $output and $libobjs because we want to
++ # use them later. If we have whole_archive_flag_spec, we
++ # want to use save_libobjs as it was before
++ # whole_archive_flag_spec was expanded, because we can't
++ # assume the linker understands whole_archive_flag_spec.
++ # This may have to be revisited, in case too many
++ # convenience libraries get linked in and end up exceeding
++ # the spec.
++ if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
++ save_libobjs=$libobjs
++ fi
++ save_output=$output
++ output_la=`$ECHO "X$output" | $Xsed -e "$basename"`
++
++ # Clear the reloadable object creation command queue and
++ # initialize k to one.
++ test_cmds=
++ concat_cmds=
++ objlist=
++ last_robj=
++ k=1
++
++ if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
++ output=${output_objdir}/${output_la}.lnkscript
++ func_verbose "creating GNU ld script: $output"
++ $ECHO 'INPUT (' > $output
++ for obj in $save_libobjs
++ do
++ $ECHO "$obj" >> $output
++ done
++ $ECHO ')' >> $output
++ delfiles="$delfiles $output"
++ elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
++ output=${output_objdir}/${output_la}.lnk
++ func_verbose "creating linker input file list: $output"
++ : > $output
++ set x $save_libobjs
++ shift
++ firstobj=
++ if test "$compiler_needs_object" = yes; then
++ firstobj="$1 "
++ shift
++ fi
++ for obj
++ do
++ $ECHO "$obj" >> $output
++ done
++ delfiles="$delfiles $output"
++ output=$firstobj\"$file_list_spec$output\"
++ else
++ if test -n "$save_libobjs"; then
++ func_verbose "creating reloadable object files..."
++ output=$output_objdir/$output_la-${k}.$objext
++ eval test_cmds=\"$reload_cmds\"
++ func_len " $test_cmds"
++ len0=$func_len_result
++ len=$len0
++
++ # Loop over the list of objects to be linked.
++ for obj in $save_libobjs
++ do
++ func_len " $obj"
++ func_arith $len + $func_len_result
++ len=$func_arith_result
++ if test "X$objlist" = X ||
++ test "$len" -lt "$max_cmd_len"; then
++ func_append objlist " $obj"
++ else
++ # The command $test_cmds is almost too long, add a
++ # command to the queue.
++ if test "$k" -eq 1 ; then
++ # The first file doesn't have a previous command to add.
++ eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
++ else
++ # All subsequent reloadable object files will link in
++ # the last one created.
++ eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\"
++ fi
++ last_robj=$output_objdir/$output_la-${k}.$objext
++ func_arith $k + 1
++ k=$func_arith_result
++ output=$output_objdir/$output_la-${k}.$objext
++ objlist=$obj
++ func_len " $last_robj"
++ func_arith $len0 + $func_len_result
++ len=$func_arith_result
++ fi
++ done
++ # Handle the remaining objects by creating one last
++ # reloadable object file. All subsequent reloadable object
++ # files will link in the last one created.
++ test -z "$concat_cmds" || concat_cmds=$concat_cmds~
++ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
++ if test -n "$last_robj"; then
++ eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
++ fi
++ delfiles="$delfiles $output"
++
++ else
++ output=
++ fi
++
++ if ${skipped_export-false}; then
++ func_verbose "generating symbol list for \`$libname.la'"
++ export_symbols="$output_objdir/$libname.exp"
++ $opt_dry_run || $RM $export_symbols
++ libobjs=$output
++ # Append the command to create the export file.
++ test -z "$concat_cmds" || concat_cmds=$concat_cmds~
++ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
++ if test -n "$last_robj"; then
++ eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
++ fi
++ fi
++
++ test -n "$save_libobjs" &&
++ func_verbose "creating a temporary reloadable object file: $output"
++
++ # Loop through the commands generated above and execute them.
++ save_ifs="$IFS"; IFS='~'
++ for cmd in $concat_cmds; do
++ IFS="$save_ifs"
++ $opt_silent || {
++ func_quote_for_expand "$cmd"
++ eval "func_echo $func_quote_for_expand_result"
++ }
++ $opt_dry_run || eval "$cmd" || {
++ lt_exit=$?
++
++ # Restore the uninstalled library and exit
++ if test "$mode" = relink; then
++ ( cd "$output_objdir" && \
++ $RM "${realname}T" && \
++ $MV "${realname}U" "$realname" )
++ fi
++
++ exit $lt_exit
++ }
++ done
++ IFS="$save_ifs"
++
++ if test -n "$export_symbols_regex" && ${skipped_export-false}; then
++ func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
++ func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
++ fi
++ fi
++
++ if ${skipped_export-false}; then
++ if test -n "$export_symbols" && test -n "$include_expsyms"; then
++ tmp_export_symbols="$export_symbols"
++ test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
++ $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
++ fi
++
++ if test -n "$orig_export_symbols"; then
++ # The given exports_symbols file has to be filtered, so filter it.
++ func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
++ # FIXME: $output_objdir/$libname.filter potentially contains lots of
++ # 's' commands which not all seds can handle. GNU sed should be fine
++ # though. Also, the filter scales superlinearly with the number of
++ # global variables. join(1) would be nice here, but unfortunately
++ # isn't a blessed tool.
++ $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
++ delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
++ export_symbols=$output_objdir/$libname.def
++ $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
++ fi
++ fi
++
++ libobjs=$output
++ # Restore the value of output.
++ output=$save_output
++
++ if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
++ eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
++ test "X$libobjs" = "X " && libobjs=
++ fi
++ # Expand the library linking commands again to reset the
++ # value of $libobjs for piecewise linking.
++
++ # Do each of the archive commands.
++ if test "$module" = yes && test -n "$module_cmds" ; then
++ if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
++ cmds=$module_expsym_cmds
++ else
++ cmds=$module_cmds
++ fi
++ else
++ if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
++ cmds=$archive_expsym_cmds
++ else
++ cmds=$archive_cmds
++ fi
++ fi
++ fi
++
++ if test -n "$delfiles"; then
++ # Append the command to remove temporary files to $cmds.
++ eval cmds=\"\$cmds~\$RM $delfiles\"
++ fi
++
++ # Add any objects from preloaded convenience libraries
++ if test -n "$dlprefiles"; then
++ gentop="$output_objdir/${outputname}x"
++ generated="$generated $gentop"
++
++ func_extract_archives $gentop $dlprefiles
++ libobjs="$libobjs $func_extract_archives_result"
++ test "X$libobjs" = "X " && libobjs=
++ fi
++
++ save_ifs="$IFS"; IFS='~'
++ for cmd in $cmds; do
++ IFS="$save_ifs"
++ eval cmd=\"$cmd\"
++ $opt_silent || {
++ func_quote_for_expand "$cmd"
++ eval "func_echo $func_quote_for_expand_result"
++ }
++ $opt_dry_run || eval "$cmd" || {
++ lt_exit=$?
++
++ # Restore the uninstalled library and exit
++ if test "$mode" = relink; then
++ ( cd "$output_objdir" && \
++ $RM "${realname}T" && \
++ $MV "${realname}U" "$realname" )
++ fi
++
++ exit $lt_exit
++ }
++ done
++ IFS="$save_ifs"
++
++ # Restore the uninstalled library and exit
++ if test "$mode" = relink; then
++ $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
++
++ if test -n "$convenience"; then
++ if test -z "$whole_archive_flag_spec"; then
++ func_show_eval '${RM}r "$gentop"'
++ fi
++ fi
++
++ exit $EXIT_SUCCESS
++ fi
++
++ # Create links to the real library.
++ for linkname in $linknames; do
++ if test "$realname" != "$linkname"; then
++ func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
++ fi
++ done
++
++ # If -module or -export-dynamic was specified, set the dlname.
++ if test "$module" = yes || test "$export_dynamic" = yes; then
++ # On all known operating systems, these are identical.
++ dlname="$soname"
++ fi
++ fi
++ ;;
++
++ obj)
++ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
++ func_warning "\`-dlopen' is ignored for objects"
++ fi
++
++ case " $deplibs" in
++ *\ -l* | *\ -L*)
++ func_warning "\`-l' and \`-L' are ignored for objects" ;;
++ esac
++
++ test -n "$rpath" && \
++ func_warning "\`-rpath' is ignored for objects"
++
++ test -n "$xrpath" && \
++ func_warning "\`-R' is ignored for objects"
++
++ test -n "$vinfo" && \
++ func_warning "\`-version-info' is ignored for objects"
++
++ test -n "$release" && \
++ func_warning "\`-release' is ignored for objects"
++
++ case $output in
++ *.lo)
++ test -n "$objs$old_deplibs" && \
++ func_fatal_error "cannot build library object \`$output' from non-libtool objects"
++
++ libobj=$output
++ func_lo2o "$libobj"
++ obj=$func_lo2o_result
++ ;;
++ *)
++ libobj=
++ obj="$output"
++ ;;
++ esac
++
++ # Delete the old objects.
++ $opt_dry_run || $RM $obj $libobj
++
++ # Objects from convenience libraries. This assumes
++ # single-version convenience libraries. Whenever we create
++ # different ones for PIC/non-PIC, this we'll have to duplicate
++ # the extraction.
++ reload_conv_objs=
++ gentop=
++ # reload_cmds runs $LD directly, so let us get rid of
++ # -Wl from whole_archive_flag_spec and hope we can get by with
++ # turning comma into space..
++ wl=
++
++ if test -n "$convenience"; then
++ if test -n "$whole_archive_flag_spec"; then
++ eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
++ reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'`
++ else
++ gentop="$output_objdir/${obj}x"
++ generated="$generated $gentop"
++
++ func_extract_archives $gentop $convenience
++ reload_conv_objs="$reload_objs $func_extract_archives_result"
++ fi
++ fi
++
++ # Create the old-style object.
++ reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
++
++ output="$obj"
++ func_execute_cmds "$reload_cmds" 'exit $?'
++
++ # Exit if we aren't doing a library object file.
++ if test -z "$libobj"; then
++ if test -n "$gentop"; then
++ func_show_eval '${RM}r "$gentop"'
++ fi
++
++ exit $EXIT_SUCCESS
++ fi
++
++ if test "$build_libtool_libs" != yes; then
++ if test -n "$gentop"; then
++ func_show_eval '${RM}r "$gentop"'
++ fi
++
++ # Create an invalid libtool object if no PIC, so that we don't
++ # accidentally link it into a program.
++ # $show "echo timestamp > $libobj"
++ # $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
++ exit $EXIT_SUCCESS
++ fi
++
++ if test -n "$pic_flag" || test "$pic_mode" != default; then
++ # Only do commands if we really have different PIC objects.
++ reload_objs="$libobjs $reload_conv_objs"
++ output="$libobj"
++ func_execute_cmds "$reload_cmds" 'exit $?'
++ fi
++
++ if test -n "$gentop"; then
++ func_show_eval '${RM}r "$gentop"'
++ fi
++
++ exit $EXIT_SUCCESS
++ ;;
++
++ prog)
++ case $host in
++ *cygwin*) func_stripname '' '.exe' "$output"
++ output=$func_stripname_result.exe;;
++ esac
++ test -n "$vinfo" && \
++ func_warning "\`-version-info' is ignored for programs"
++
++ test -n "$release" && \
++ func_warning "\`-release' is ignored for programs"
++
++ test "$preload" = yes \
++ && test "$dlopen_support" = unknown \
++ && test "$dlopen_self" = unknown \
++ && test "$dlopen_self_static" = unknown && \
++ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
++
++ case $host in
++ *-*-rhapsody* | *-*-darwin1.[012])
++ # On Rhapsody replace the C library is the System framework
++ compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
++ finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
++ ;;
++ esac
++
++ case $host in
++ *-*-darwin*)
++ # Don't allow lazy linking, it breaks C++ global constructors
++ # But is supposedly fixed on 10.4 or later (yay!).
++ if test "$tagname" = CXX ; then
++ case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
++ 10.[0123])
++ compile_command="$compile_command ${wl}-bind_at_load"
++ finalize_command="$finalize_command ${wl}-bind_at_load"
++ ;;
++ esac
++ fi
++ # Time to change all our "foo.ltframework" stuff back to "-framework foo"
++ compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
++ finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
++ ;;
++ esac
++
++
++ # move library search paths that coincide with paths to not yet
++ # installed libraries to the beginning of the library search list
++ new_libs=
++ for path in $notinst_path; do
++ case " $new_libs " in
++ *" -L$path/$objdir "*) ;;
++ *)
++ case " $compile_deplibs " in
++ *" -L$path/$objdir "*)
++ new_libs="$new_libs -L$path/$objdir" ;;
++ esac
++ ;;
++ esac
++ done
++ for deplib in $compile_deplibs; do
++ case $deplib in
++ -L*)
++ case " $new_libs " in
++ *" $deplib "*) ;;
++ *) new_libs="$new_libs $deplib" ;;
++ esac
++ ;;
++ *) new_libs="$new_libs $deplib" ;;
++ esac
++ done
++ compile_deplibs="$new_libs"
++
++
++ compile_command="$compile_command $compile_deplibs"
++ finalize_command="$finalize_command $finalize_deplibs"
++
++ if test -n "$rpath$xrpath"; then
++ # If the user specified any rpath flags, then add them.
++ for libdir in $rpath $xrpath; do
++ # This is the magic to use -rpath.
++ case "$finalize_rpath " in
++ *" $libdir "*) ;;
++ *) finalize_rpath="$finalize_rpath $libdir" ;;
++ esac
++ done
++ fi
++
++ # Now hardcode the library paths
++ rpath=
++ hardcode_libdirs=
++ for libdir in $compile_rpath $finalize_rpath; do
++ if test -n "$hardcode_libdir_flag_spec"; then
++ if test -n "$hardcode_libdir_separator"; then
++ if test -z "$hardcode_libdirs"; then
++ hardcode_libdirs="$libdir"
++ else
++ # Just accumulate the unique libdirs.
++ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
++ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
++ ;;
++ *)
++ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
++ ;;
++ esac
++ fi
++ else
++ eval flag=\"$hardcode_libdir_flag_spec\"
++ rpath="$rpath $flag"
++ fi
++ elif test -n "$runpath_var"; then
++ case "$perm_rpath " in
++ *" $libdir "*) ;;
++ *) perm_rpath="$perm_rpath $libdir" ;;
++ esac
++ fi
++ case $host in
++ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
++ testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
++ case :$dllsearchpath: in
++ *":$libdir:"*) ;;
++ ::) dllsearchpath=$libdir;;
++ *) dllsearchpath="$dllsearchpath:$libdir";;
++ esac
++ case :$dllsearchpath: in
++ *":$testbindir:"*) ;;
++ ::) dllsearchpath=$testbindir;;
++ *) dllsearchpath="$dllsearchpath:$testbindir";;
++ esac
++ ;;
++ esac
++ done
++ # Substitute the hardcoded libdirs into the rpath.
++ if test -n "$hardcode_libdir_separator" &&
++ test -n "$hardcode_libdirs"; then
++ libdir="$hardcode_libdirs"
++ eval rpath=\" $hardcode_libdir_flag_spec\"
++ fi
++ compile_rpath="$rpath"
++
++ rpath=
++ hardcode_libdirs=
++ for libdir in $finalize_rpath; do
++ if test -n "$hardcode_libdir_flag_spec"; then
++ if test -n "$hardcode_libdir_separator"; then
++ if test -z "$hardcode_libdirs"; then
++ hardcode_libdirs="$libdir"
++ else
++ # Just accumulate the unique libdirs.
++ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
++ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
++ ;;
++ *)
++ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
++ ;;
++ esac
++ fi
++ else
++ eval flag=\"$hardcode_libdir_flag_spec\"
++ rpath="$rpath $flag"
++ fi
++ elif test -n "$runpath_var"; then
++ case "$finalize_perm_rpath " in
++ *" $libdir "*) ;;
++ *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
++ esac
++ fi
++ done
++ # Substitute the hardcoded libdirs into the rpath.
++ if test -n "$hardcode_libdir_separator" &&
++ test -n "$hardcode_libdirs"; then
++ libdir="$hardcode_libdirs"
++ eval rpath=\" $hardcode_libdir_flag_spec\"
++ fi
++ finalize_rpath="$rpath"
++
++ if test -n "$libobjs" && test "$build_old_libs" = yes; then
++ # Transform all the library objects into standard objects.
++ compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
++ finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
++ fi
++
++ func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
++
++ # template prelinking step
++ if test -n "$prelink_cmds"; then
++ func_execute_cmds "$prelink_cmds" 'exit $?'
++ fi
++
++ wrappers_required=yes
++ case $host in
++ *cygwin* | *mingw* )
++ if test "$build_libtool_libs" != yes; then
++ wrappers_required=no
++ fi
++ ;;
++ *cegcc)
++ # Disable wrappers for cegcc, we are cross compiling anyway.
++ wrappers_required=no
++ ;;
++ *)
++ if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
++ wrappers_required=no
++ fi
++ ;;
++ esac
++ if test "$wrappers_required" = no; then
++ # Replace the output file specification.
++ compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
++ link_command="$compile_command$compile_rpath"
++
++ # We have no uninstalled library dependencies, so finalize right now.
++ exit_status=0
++ func_show_eval "$link_command" 'exit_status=$?'
++
++ # Delete the generated files.
++ if test -f "$output_objdir/${outputname}S.${objext}"; then
++ func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
++ fi
++
++ exit $exit_status
++ fi
++
++ if test -n "$compile_shlibpath$finalize_shlibpath"; then
++ compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
++ fi
++ if test -n "$finalize_shlibpath"; then
++ finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
++ fi
++
++ compile_var=
++ finalize_var=
++ if test -n "$runpath_var"; then
++ if test -n "$perm_rpath"; then
++ # We should set the runpath_var.
++ rpath=
++ for dir in $perm_rpath; do
++ rpath="$rpath$dir:"
++ done
++ compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
++ fi
++ if test -n "$finalize_perm_rpath"; then
++ # We should set the runpath_var.
++ rpath=
++ for dir in $finalize_perm_rpath; do
++ rpath="$rpath$dir:"
++ done
++ finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
++ fi
++ fi
++
++ if test "$no_install" = yes; then
++ # We don't need to create a wrapper script.
++ link_command="$compile_var$compile_command$compile_rpath"
++ # Replace the output file specification.
++ link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
++ # Delete the old output file.
++ $opt_dry_run || $RM $output
++ # Link the executable and exit
++ func_show_eval "$link_command" 'exit $?'
++ exit $EXIT_SUCCESS
++ fi
++
++ if test "$hardcode_action" = relink; then
++ # Fast installation is not supported
++ link_command="$compile_var$compile_command$compile_rpath"
++ relink_command="$finalize_var$finalize_command$finalize_rpath"
++
++ func_warning "this platform does not like uninstalled shared libraries"
++ func_warning "\`$output' will be relinked during installation"
++ else
++ if test "$fast_install" != no; then
++ link_command="$finalize_var$compile_command$finalize_rpath"
++ if test "$fast_install" = yes; then
++ relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
++ else
++ # fast_install is set to needless
++ relink_command=
++ fi
++ else
++ link_command="$compile_var$compile_command$compile_rpath"
++ relink_command="$finalize_var$finalize_command$finalize_rpath"
++ fi
++ fi
++
++ # Replace the output file specification.
++ link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
++
++ # Delete the old output files.
++ $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
++
++ func_show_eval "$link_command" 'exit $?'
++
++ # Now create the wrapper script.
++ func_verbose "creating $output"
++
++ # Quote the relink command for shipping.
++ if test -n "$relink_command"; then
++ # Preserve any variables that may affect compiler behavior
++ for var in $variables_saved_for_relink; do
++ if eval test -z \"\${$var+set}\"; then
++ relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
++ elif eval var_value=\$$var; test -z "$var_value"; then
++ relink_command="$var=; export $var; $relink_command"
++ else
++ func_quote_for_eval "$var_value"
++ relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
++ fi
++ done
++ relink_command="(cd `pwd`; $relink_command)"
++ relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
++ fi
++
++ # Quote $ECHO for shipping.
++ if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then
++ case $progpath in
++ [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
++ *) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
++ esac
++ qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"`
++ else
++ qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"`
++ fi
++
++ # Only actually do things if not in dry run mode.
++ $opt_dry_run || {
++ # win32 will think the script is a binary if it has
++ # a .exe suffix, so we strip it off here.
++ case $output in
++ *.exe) func_stripname '' '.exe' "$output"
++ output=$func_stripname_result ;;
++ esac
++ # test for cygwin because mv fails w/o .exe extensions
++ case $host in
++ *cygwin*)
++ exeext=.exe
++ func_stripname '' '.exe' "$outputname"
++ outputname=$func_stripname_result ;;
++ *) exeext= ;;
++ esac
++ case $host in
++ *cygwin* | *mingw* )
++ func_dirname_and_basename "$output" "" "."
++ output_name=$func_basename_result
++ output_path=$func_dirname_result
++ cwrappersource="$output_path/$objdir/lt-$output_name.c"
++ cwrapper="$output_path/$output_name.exe"
++ $RM $cwrappersource $cwrapper
++ trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
++
++ func_emit_cwrapperexe_src > $cwrappersource
++
++ # The wrapper executable is built using the $host compiler,
++ # because it contains $host paths and files. If cross-
++ # compiling, it, like the target executable, must be
++ # executed on the $host or under an emulation environment.
++ $opt_dry_run || {
++ $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
++ $STRIP $cwrapper
++ }
++
++ # Now, create the wrapper script for func_source use:
++ func_ltwrapper_scriptname $cwrapper
++ $RM $func_ltwrapper_scriptname_result
++ trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
++ $opt_dry_run || {
++ # note: this script will not be executed, so do not chmod.
++ if test "x$build" = "x$host" ; then
++ $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
++ else
++ func_emit_wrapper no > $func_ltwrapper_scriptname_result
++ fi
++ }
++ ;;
++ * )
++ $RM $output
++ trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
++
++ func_emit_wrapper no > $output
++ chmod +x $output
++ ;;
++ esac
++ }
++ exit $EXIT_SUCCESS
++ ;;
++ esac
++
++ # See if we need to build an old-fashioned archive.
++ for oldlib in $oldlibs; do
++
++ if test "$build_libtool_libs" = convenience; then
++ oldobjs="$libobjs_save $symfileobj"
++ addlibs="$convenience"
++ build_libtool_libs=no
++ else
++ if test "$build_libtool_libs" = module; then
++ oldobjs="$libobjs_save"
++ build_libtool_libs=no
++ else
++ oldobjs="$old_deplibs $non_pic_objects"
++ if test "$preload" = yes && test -f "$symfileobj"; then
++ oldobjs="$oldobjs $symfileobj"
++ fi
++ fi
++ addlibs="$old_convenience"
++ fi
++
++ if test -n "$addlibs"; then
++ gentop="$output_objdir/${outputname}x"
++ generated="$generated $gentop"
++
++ func_extract_archives $gentop $addlibs
++ oldobjs="$oldobjs $func_extract_archives_result"
++ fi
++
++ # Do each command in the archive commands.
++ if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
++ cmds=$old_archive_from_new_cmds
++ else
++
++ # Add any objects from preloaded convenience libraries
++ if test -n "$dlprefiles"; then
++ gentop="$output_objdir/${outputname}x"
++ generated="$generated $gentop"
++
++ func_extract_archives $gentop $dlprefiles
++ oldobjs="$oldobjs $func_extract_archives_result"
++ fi
++
++ # POSIX demands no paths to be encoded in archives. We have
++ # to avoid creating archives with duplicate basenames if we
++ # might have to extract them afterwards, e.g., when creating a
++ # static archive out of a convenience library, or when linking
++ # the entirety of a libtool archive into another (currently
++ # not supported by libtool).
++ if (for obj in $oldobjs
++ do
++ func_basename "$obj"
++ $ECHO "$func_basename_result"
++ done | sort | sort -uc >/dev/null 2>&1); then
++ :
++ else
++ $ECHO "copying selected object files to avoid basename conflicts..."
++ gentop="$output_objdir/${outputname}x"
++ generated="$generated $gentop"
++ func_mkdir_p "$gentop"
++ save_oldobjs=$oldobjs
++ oldobjs=
++ counter=1
++ for obj in $save_oldobjs
++ do
++ func_basename "$obj"
++ objbase="$func_basename_result"
++ case " $oldobjs " in
++ " ") oldobjs=$obj ;;
++ *[\ /]"$objbase "*)
++ while :; do
++ # Make sure we don't pick an alternate name that also
++ # overlaps.
++ newobj=lt$counter-$objbase
++ func_arith $counter + 1
++ counter=$func_arith_result
++ case " $oldobjs " in
++ *[\ /]"$newobj "*) ;;
++ *) if test ! -f "$gentop/$newobj"; then break; fi ;;
++ esac
++ done
++ func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
++ oldobjs="$oldobjs $gentop/$newobj"
++ ;;
++ *) oldobjs="$oldobjs $obj" ;;
++ esac
++ done
++ fi
++ eval cmds=\"$old_archive_cmds\"
++
++ func_len " $cmds"
++ len=$func_len_result
++ if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
++ cmds=$old_archive_cmds
++ else
++ # the command line is too long to link in one step, link in parts
++ func_verbose "using piecewise archive linking..."
++ save_RANLIB=$RANLIB
++ RANLIB=:
++ objlist=
++ concat_cmds=
++ save_oldobjs=$oldobjs
++ oldobjs=
++ # Is there a better way of finding the last object in the list?
++ for obj in $save_oldobjs
++ do
++ last_oldobj=$obj
++ done
++ eval test_cmds=\"$old_archive_cmds\"
++ func_len " $test_cmds"
++ len0=$func_len_result
++ len=$len0
++ for obj in $save_oldobjs
++ do
++ func_len " $obj"
++ func_arith $len + $func_len_result
++ len=$func_arith_result
++ func_append objlist " $obj"
++ if test "$len" -lt "$max_cmd_len"; then
++ :
++ else
++ # the above command should be used before it gets too long
++ oldobjs=$objlist
++ if test "$obj" = "$last_oldobj" ; then
++ RANLIB=$save_RANLIB
++ fi
++ test -z "$concat_cmds" || concat_cmds=$concat_cmds~
++ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
++ objlist=
++ len=$len0
++ fi
++ done
++ RANLIB=$save_RANLIB
++ oldobjs=$objlist
++ if test "X$oldobjs" = "X" ; then
++ eval cmds=\"\$concat_cmds\"
++ else
++ eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
++ fi
++ fi
++ fi
++ func_execute_cmds "$cmds" 'exit $?'
++ done
++
++ test -n "$generated" && \
++ func_show_eval "${RM}r$generated"
++
++ # Now create the libtool archive.
++ case $output in
++ *.la)
++ old_library=
++ test "$build_old_libs" = yes && old_library="$libname.$libext"
++ func_verbose "creating $output"
++
++ # Preserve any variables that may affect compiler behavior
++ for var in $variables_saved_for_relink; do
++ if eval test -z \"\${$var+set}\"; then
++ relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
++ elif eval var_value=\$$var; test -z "$var_value"; then
++ relink_command="$var=; export $var; $relink_command"
++ else
++ func_quote_for_eval "$var_value"
++ relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
++ fi
++ done
++ # Quote the link command for shipping.
++ relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
++ relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
++ if test "$hardcode_automatic" = yes ; then
++ relink_command=
++ fi
++
++ # Only create the output if not a dry run.
++ $opt_dry_run || {
++ for installed in no yes; do
++ if test "$installed" = yes; then
++ if test -z "$install_libdir"; then
++ break
++ fi
++ output="$output_objdir/$outputname"i
++ # Replace all uninstalled libtool libraries with the installed ones
++ newdependency_libs=
++ for deplib in $dependency_libs; do
++ case $deplib in
++ *.la)
++ func_basename "$deplib"
++ name="$func_basename_result"
++ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
++ test -z "$libdir" && \
++ func_fatal_error "\`$deplib' is not a valid libtool archive"
++ newdependency_libs="$newdependency_libs $libdir/$name"
++ ;;
++ *) newdependency_libs="$newdependency_libs $deplib" ;;
++ esac
++ done
++ dependency_libs="$newdependency_libs"
++ newdlfiles=
++
++ for lib in $dlfiles; do
++ case $lib in
++ *.la)
++ func_basename "$lib"
++ name="$func_basename_result"
++ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
++ test -z "$libdir" && \
++ func_fatal_error "\`$lib' is not a valid libtool archive"
++ newdlfiles="$newdlfiles $libdir/$name"
++ ;;
++ *) newdlfiles="$newdlfiles $lib" ;;
++ esac
++ done
++ dlfiles="$newdlfiles"
++ newdlprefiles=
++ for lib in $dlprefiles; do
++ case $lib in
++ *.la)
++ # Only pass preopened files to the pseudo-archive (for
++ # eventual linking with the app. that links it) if we
++ # didn't already link the preopened objects directly into
++ # the library:
++ func_basename "$lib"
++ name="$func_basename_result"
++ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
++ test -z "$libdir" && \
++ func_fatal_error "\`$lib' is not a valid libtool archive"
++ newdlprefiles="$newdlprefiles $libdir/$name"
++ ;;
++ esac
++ done
++ dlprefiles="$newdlprefiles"
++ else
++ newdlfiles=
++ for lib in $dlfiles; do
++ case $lib in
++ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
++ *) abs=`pwd`"/$lib" ;;
++ esac
++ newdlfiles="$newdlfiles $abs"
++ done
++ dlfiles="$newdlfiles"
++ newdlprefiles=
++ for lib in $dlprefiles; do
++ case $lib in
++ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
++ *) abs=`pwd`"/$lib" ;;
++ esac
++ newdlprefiles="$newdlprefiles $abs"
++ done
++ dlprefiles="$newdlprefiles"
++ fi
++ $RM $output
++ # place dlname in correct position for cygwin
++ tdlname=$dlname
++ case $host,$output,$installed,$module,$dlname in
++ *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
++ esac
++ $ECHO > $output "\
++# $outputname - a libtool library file
++# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
++#
++# Please DO NOT delete this file!
++# It is necessary for linking the library.
++
++# The name that we can dlopen(3).
++dlname='$tdlname'
++
++# Names of this library.
++library_names='$library_names'
++
++# The name of the static archive.
++old_library='$old_library'
++
++# Linker flags that can not go in dependency_libs.
++inherited_linker_flags='$new_inherited_linker_flags'
++
++# Libraries that this one depends upon.
++dependency_libs='$dependency_libs'
++
++# Names of additional weak libraries provided by this library
++weak_library_names='$weak_libs'
++
++# Version information for $libname.
++current=$current
++age=$age
++revision=$revision
++
++# Is this an already installed library?
++installed=$installed
++
++# Should we warn about portability when linking against -modules?
++shouldnotlink=$module
++
++# Files to dlopen/dlpreopen
++dlopen='$dlfiles'
++dlpreopen='$dlprefiles'
++
++# Directory that this library needs to be installed in:
++libdir='$install_libdir'"
++ if test "$installed" = no && test "$need_relink" = yes; then
++ $ECHO >> $output "\
++relink_command=\"$relink_command\""
++ fi
++ done
++ }
++
++ # Do a symbolic link so that the libtool archive can be found in
++ # LD_LIBRARY_PATH before the program is installed.
++ func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
++ ;;
++ esac
++ exit $EXIT_SUCCESS
++}
++
++{ test "$mode" = link || test "$mode" = relink; } &&
++ func_mode_link ${1+"$@"}
++
++
++# func_mode_uninstall arg...
++func_mode_uninstall ()
++{
++ $opt_debug
++ RM="$nonopt"
++ files=
++ rmforce=
++ exit_status=0
++
++ # This variable tells wrapper scripts just to set variables rather
++ # than running their programs.
++ libtool_install_magic="$magic"
++
++ for arg
++ do
++ case $arg in
++ -f) RM="$RM $arg"; rmforce=yes ;;
++ -*) RM="$RM $arg" ;;
++ *) files="$files $arg" ;;
++ esac
++ done
++
++ test -z "$RM" && \
++ func_fatal_help "you must specify an RM program"
++
++ rmdirs=
++
++ origobjdir="$objdir"
++ for file in $files; do
++ func_dirname "$file" "" "."
++ dir="$func_dirname_result"
++ if test "X$dir" = X.; then
++ objdir="$origobjdir"
++ else
++ objdir="$dir/$origobjdir"
++ fi
++ func_basename "$file"
++ name="$func_basename_result"
++ test "$mode" = uninstall && objdir="$dir"
++
++ # Remember objdir for removal later, being careful to avoid duplicates
++ if test "$mode" = clean; then
++ case " $rmdirs " in
++ *" $objdir "*) ;;
++ *) rmdirs="$rmdirs $objdir" ;;
++ esac
++ fi
++
++ # Don't error if the file doesn't exist and rm -f was used.
++ if { test -L "$file"; } >/dev/null 2>&1 ||
++ { test -h "$file"; } >/dev/null 2>&1 ||
++ test -f "$file"; then
++ :
++ elif test -d "$file"; then
++ exit_status=1
++ continue
++ elif test "$rmforce" = yes; then
++ continue
++ fi
++
++ rmfiles="$file"
++
++ case $name in
++ *.la)
++ # Possibly a libtool archive, so verify it.
++ if func_lalib_p "$file"; then
++ func_source $dir/$name
++
++ # Delete the libtool libraries and symlinks.
++ for n in $library_names; do
++ rmfiles="$rmfiles $objdir/$n"
++ done
++ test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
++
++ case "$mode" in
++ clean)
++ case " $library_names " in
++ # " " in the beginning catches empty $dlname
++ *" $dlname "*) ;;
++ *) rmfiles="$rmfiles $objdir/$dlname" ;;
++ esac
++ test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
++ ;;
++ uninstall)
++ if test -n "$library_names"; then
++ # Do each command in the postuninstall commands.
++ func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
++ fi
++
++ if test -n "$old_library"; then
++ # Do each command in the old_postuninstall commands.
++ func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
++ fi
++ # FIXME: should reinstall the best remaining shared library.
++ ;;
++ esac
++ fi
++ ;;
++
++ *.lo)
++ # Possibly a libtool object, so verify it.
++ if func_lalib_p "$file"; then
++
++ # Read the .lo file
++ func_source $dir/$name
++
++ # Add PIC object to the list of files to remove.
++ if test -n "$pic_object" &&
++ test "$pic_object" != none; then
++ rmfiles="$rmfiles $dir/$pic_object"
++ fi
++
++ # Add non-PIC object to the list of files to remove.
++ if test -n "$non_pic_object" &&
++ test "$non_pic_object" != none; then
++ rmfiles="$rmfiles $dir/$non_pic_object"
++ fi
++ fi
++ ;;
++
++ *)
++ if test "$mode" = clean ; then
++ noexename=$name
++ case $file in
++ *.exe)
++ func_stripname '' '.exe' "$file"
++ file=$func_stripname_result
++ func_stripname '' '.exe' "$name"
++ noexename=$func_stripname_result
++ # $file with .exe has already been added to rmfiles,
++ # add $file without .exe
++ rmfiles="$rmfiles $file"
++ ;;
++ esac
++ # Do a test to see if this is a libtool program.
++ if func_ltwrapper_p "$file"; then
++ if func_ltwrapper_executable_p "$file"; then
++ func_ltwrapper_scriptname "$file"
++ relink_command=
++ func_source $func_ltwrapper_scriptname_result
++ rmfiles="$rmfiles $func_ltwrapper_scriptname_result"
++ else
++ relink_command=
++ func_source $dir/$noexename
++ fi
++
++ # note $name still contains .exe if it was in $file originally
++ # as does the version of $file that was added into $rmfiles
++ rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
++ if test "$fast_install" = yes && test -n "$relink_command"; then
++ rmfiles="$rmfiles $objdir/lt-$name"
++ fi
++ if test "X$noexename" != "X$name" ; then
++ rmfiles="$rmfiles $objdir/lt-${noexename}.c"
++ fi
++ fi
++ fi
++ ;;
++ esac
++ func_show_eval "$RM $rmfiles" 'exit_status=1'
++ done
++ objdir="$origobjdir"
++
++ # Try to remove the ${objdir}s in the directories where we deleted files
++ for dir in $rmdirs; do
++ if test -d "$dir"; then
++ func_show_eval "rmdir $dir >/dev/null 2>&1"
++ fi
++ done
++
++ exit $exit_status
++}
++
++{ test "$mode" = uninstall || test "$mode" = clean; } &&
++ func_mode_uninstall ${1+"$@"}
++
++test -z "$mode" && {
++ help="$generic_help"
++ func_fatal_help "you must specify a MODE"
++}
++
++test -z "$exec_cmd" && \
++ func_fatal_help "invalid operation mode \`$mode'"
++
++if test -n "$exec_cmd"; then
++ eval exec "$exec_cmd"
++ exit $EXIT_FAILURE
++fi
++
++exit $exit_status
++
++
++# The TAGs below are defined such that we never get into a situation
++# in which we disable both kinds of libraries. Given conflicting
++# choices, we go for a static library, that is the most portable,
++# since we can't tell whether shared libraries were disabled because
++# the user asked for that or because the platform doesn't support
++# them. This is particularly important on AIX, because we don't
++# support having both static and shared libraries enabled at the same
++# time on that platform, so we default to a shared-only configuration.
++# If a disable-shared tag is given, we'll fallback to a static-only
++# configuration. But we'll never go from static-only to shared-only.
++
++# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
++build_libtool_libs=no
++build_old_libs=yes
++# ### END LIBTOOL TAG CONFIG: disable-shared
++
++# ### BEGIN LIBTOOL TAG CONFIG: disable-static
++build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
++# ### END LIBTOOL TAG CONFIG: disable-static
++
++# Local Variables:
++# mode:shell-script
++# sh-indentation:2
++# End:
++# vi:sw=2
++
+diff --git a/m4/ac_doxygen.m4 b/m4/ac_doxygen.m4
+new file mode 100644
+index 0000000..9e539ba
+--- /dev/null
++++ b/m4/ac_doxygen.m4
+@@ -0,0 +1,324 @@
++#
++# Copyright 2007 Oren Ben-Kiki
++#
++# Licensed under the Apache License, Version 2.0 (the "License");
++# you may not use this file except in compliance with the License.
++# You may obtain a copy of the License at
++#
++# http://www.apache.org/licenses/LICENSE-2.0
++#
++# Unless required by applicable law or agreed to in writing,
++# software distributed under the License is distributed on an "AS IS" BASIS,
++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
++# implied. See the License for the specific language governing
++# permissions and limitations under the License.
++#
++
++
++# Generate automatic documentation using Doxygen. Works in concert with the
++# aminclude.m4 file and a compatible doxygen configuration file. Defines the
++# following public macros:
++#
++# DX_???_FEATURE(ON|OFF) - control the default setting fo a Doxygen feature.
++# Supported features are 'DOXYGEN' itself, 'DOT' for generating graphics,
++# 'HTML' for plain HTML, 'CHM' for compressed HTML help (for MS users), 'CHI'
++# for generating a seperate .chi file by the .chm file, and 'MAN', 'RTF',
++# 'XML', 'PDF' and 'PS' for the appropriate output formats. The environment
++# variable DOXYGEN_PAPER_SIZE may be specified to override the default 'a4wide'
++# paper size.
++#
++# By default, HTML, PDF and PS documentation is generated as this seems to be
++# the most popular and portable combination. MAN pages created by Doxygen are
++# usually problematic, though by picking an appropriate subset and doing some
++# massaging they might be better than nothing. CHM and RTF are specific for MS
++# (note that you can't generate both HTML and CHM at the same time). The XML is
++# rather useless unless you apply specialized post-processing to it.
++#
++# The macro mainly controls the default state of the feature. The use can
++# override the default by specifying --enable or --disable. The macros ensure
++# that contradictory flags are not given (e.g., --enable-doxygen-html and
++# --enable-doxygen-chm, --enable-doxygen-anything with --disable-doxygen, etc.)
++# Finally, each feature will be automatically disabled (with a warning) if the
++# required programs are missing.
++#
++# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN with
++# the following parameters: a one-word name for the project for use as a
++# filename base etc., an optional configuration file name (the default is
++# 'Doxyfile', the same as Doxygen's default), and an optional output directory
++# name (the default is 'doxygen-doc').
++
++## ----------##
++## Defaults. ##
++## ----------##
++
++DX_ENV=""
++AC_DEFUN([DX_FEATURE_doc], ON)
++AC_DEFUN([DX_FEATURE_dot], ON)
++AC_DEFUN([DX_FEATURE_man], OFF)
++AC_DEFUN([DX_FEATURE_html], ON)
++AC_DEFUN([DX_FEATURE_chm], OFF)
++AC_DEFUN([DX_FEATURE_chi], OFF)
++AC_DEFUN([DX_FEATURE_rtf], OFF)
++AC_DEFUN([DX_FEATURE_xml], OFF)
++AC_DEFUN([DX_FEATURE_pdf], ON)
++AC_DEFUN([DX_FEATURE_ps], ON)
++
++## --------------- ##
++## Private macros. ##
++## --------------- ##
++
++# DX_ENV_APPEND(VARIABLE, VALUE)
++# ------------------------------
++# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen.
++AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])])
++
++# DX_DIRNAME_EXPR
++# ---------------
++# Expand into a shell expression prints the directory part of a path.
++AC_DEFUN([DX_DIRNAME_EXPR],
++ [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']])
++
++# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF)
++# -------------------------------------
++# Expands according to the M4 (static) status of the feature.
++AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])])
++
++# DX_REQUIRE_PROG(VARIABLE, PROGRAM)
++# ----------------------------------
++# Require the specified program to be found for the DX_CURRENT_FEATURE to work.
++AC_DEFUN([DX_REQUIRE_PROG], [
++AC_PATH_TOOL([$1], [$2])
++if test "$DX_FLAG_$[DX_CURRENT_FEATURE$$1]" = 1; then
++ AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION])
++ AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0)
++fi
++])
++
++# DX_TEST_FEATURE(FEATURE)
++# ------------------------
++# Expand to a shell expression testing whether the feature is active.
++AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1])
++
++# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE)
++# -------------------------------------------------
++# Verify that a required features has the right state before trying to turn on
++# the DX_CURRENT_FEATURE.
++AC_DEFUN([DX_CHECK_DEPEND], [
++test "$DX_FLAG_$1" = "$2" \
++|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1,
++ requires, contradicts) doxygen-DX_CURRENT_FEATURE])
++])
++
++# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE)
++# ----------------------------------------------------------
++# Turn off the DX_CURRENT_FEATURE if the required feature is off.
++AC_DEFUN([DX_CLEAR_DEPEND], [
++test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_]DX_CURRENT_FEATURE, 0)
++])
++
++# DX_FEATURE_ARG(FEATURE, DESCRIPTION,
++# CHECK_DEPEND, CLEAR_DEPEND,
++# REQUIRE, DO-IF-ON, DO-IF-OFF)
++# --------------------------------------------
++# Parse the command-line option controlling a feature. CHECK_DEPEND is called
++# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND),
++# otherwise CLEAR_DEPEND is called to turn off the default state if a required
++# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional
++# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and
++# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature.
++AC_DEFUN([DX_ARG_ABLE], [
++ AC_DEFUN([DX_CURRENT_FEATURE], [$1])
++ AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2])
++ AC_ARG_ENABLE(doxygen-$1,
++ [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1],
++ [--enable-doxygen-$1]),
++ DX_IF_FEATURE([$1], [don't $2], [$2]))],
++ [
++case "$enableval" in
++#(
++y|Y|yes|Yes|YES)
++ AC_SUBST([DX_FLAG_$1], 1)
++ $3
++;; #(
++n|N|no|No|NO)
++ AC_SUBST([DX_FLAG_$1], 0)
++;; #(
++*)
++ AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1])
++;;
++esac
++], [
++AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)])
++$4
++])
++if DX_TEST_FEATURE([$1]); then
++ $5
++ :
++fi
++if DX_TEST_FEATURE([$1]); then
++ AM_CONDITIONAL(DX_COND_$1, :)
++ $6
++ :
++else
++ AM_CONDITIONAL(DX_COND_$1, false)
++ $7
++ :
++fi
++])
++
++## -------------- ##
++## Public macros. ##
++## -------------- ##
++
++# DX_XXX_FEATURE(DEFAULT_STATE)
++# -----------------------------
++AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])])
++AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])])
++AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])])
++AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])])
++AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])])
++AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])])
++AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])])
++AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])])
++AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])])
++AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])])
++
++# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR])
++# ---------------------------------------------------------
++# PROJECT also serves as the base name for the documentation files.
++# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc".
++AC_DEFUN([DX_INIT_DOXYGEN], [
++
++# Files:
++AC_SUBST([DX_PROJECT], [$1])
++AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])])
++AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])])
++
++# Environment variables used inside doxygen.cfg:
++DX_ENV_APPEND(SRCDIR, $srcdir)
++DX_ENV_APPEND(PROJECT, $DX_PROJECT)
++DX_ENV_APPEND(DOCDIR, $DX_DOCDIR)
++DX_ENV_APPEND(VERSION, $PACKAGE_VERSION)
++
++# Doxygen itself:
++DX_ARG_ABLE(doc, [generate any doxygen documentation],
++ [],
++ [],
++ [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen)
++ DX_REQUIRE_PROG([DX_PERL], perl)],
++ [DX_ENV_APPEND(PERL_PATH, $DX_PERL)])
++
++# Dot for graphics:
++DX_ARG_ABLE(dot, [generate graphics for doxygen documentation],
++ [DX_CHECK_DEPEND(doc, 1)],
++ [DX_CLEAR_DEPEND(doc, 1)],
++ [DX_REQUIRE_PROG([DX_DOT], dot)],
++ [DX_ENV_APPEND(HAVE_DOT, YES)
++ DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])],
++ [DX_ENV_APPEND(HAVE_DOT, NO)])
++
++# Man pages generation:
++DX_ARG_ABLE(man, [generate doxygen manual pages],
++ [DX_CHECK_DEPEND(doc, 1)],
++ [DX_CLEAR_DEPEND(doc, 1)],
++ [],
++ [DX_ENV_APPEND(GENERATE_MAN, YES)],
++ [DX_ENV_APPEND(GENERATE_MAN, NO)])
++
++# RTF file generation:
++DX_ARG_ABLE(rtf, [generate doxygen RTF documentation],
++ [DX_CHECK_DEPEND(doc, 1)],
++ [DX_CLEAR_DEPEND(doc, 1)],
++ [],
++ [DX_ENV_APPEND(GENERATE_RTF, YES)],
++ [DX_ENV_APPEND(GENERATE_RTF, NO)])
++
++# XML file generation:
++DX_ARG_ABLE(xml, [generate doxygen XML documentation],
++ [DX_CHECK_DEPEND(doc, 1)],
++ [DX_CLEAR_DEPEND(doc, 1)],
++ [],
++ [DX_ENV_APPEND(GENERATE_XML, YES)],
++ [DX_ENV_APPEND(GENERATE_XML, NO)])
++
++# (Compressed) HTML help generation:
++DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation],
++ [DX_CHECK_DEPEND(doc, 1)],
++ [DX_CLEAR_DEPEND(doc, 1)],
++ [DX_REQUIRE_PROG([DX_HHC], hhc)],
++ [DX_ENV_APPEND(HHC_PATH, $DX_HHC)
++ DX_ENV_APPEND(GENERATE_HTML, YES)
++ DX_ENV_APPEND(GENERATE_HTMLHELP, YES)],
++ [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)])
++
++# Seperate CHI file generation.
++DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file],
++ [DX_CHECK_DEPEND(chm, 1)],
++ [DX_CLEAR_DEPEND(chm, 1)],
++ [],
++ [DX_ENV_APPEND(GENERATE_CHI, YES)],
++ [DX_ENV_APPEND(GENERATE_CHI, NO)])
++
++# Plain HTML pages generation:
++DX_ARG_ABLE(html, [generate doxygen plain HTML documentation],
++ [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)],
++ [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)],
++ [],
++ [DX_ENV_APPEND(GENERATE_HTML, YES)],
++ [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)])
++
++# PostScript file generation:
++DX_ARG_ABLE(ps, [generate doxygen PostScript documentation],
++ [DX_CHECK_DEPEND(doc, 1)],
++ [DX_CLEAR_DEPEND(doc, 1)],
++ [DX_REQUIRE_PROG([DX_LATEX], latex)
++ DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex)
++ DX_REQUIRE_PROG([DX_DVIPS], dvips)
++ DX_REQUIRE_PROG([DX_EGREP], egrep)])
++
++# PDF file generation:
++DX_ARG_ABLE(pdf, [generate doxygen PDF documentation],
++ [DX_CHECK_DEPEND(doc, 1)],
++ [DX_CLEAR_DEPEND(doc, 1)],
++ [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex)
++ DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex)
++ DX_REQUIRE_PROG([DX_EGREP], egrep)])
++
++# LaTeX generation for PS and/or PDF:
++if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then
++ AM_CONDITIONAL(DX_COND_latex, :)
++ DX_ENV_APPEND(GENERATE_LATEX, YES)
++else
++ AM_CONDITIONAL(DX_COND_latex, false)
++ DX_ENV_APPEND(GENERATE_LATEX, NO)
++fi
++
++# Paper size for PS and/or PDF:
++AC_ARG_VAR(DOXYGEN_PAPER_SIZE,
++ [a4wide (default), a4, letter, legal or executive])
++case "$DOXYGEN_PAPER_SIZE" in
++#(
++"")
++ AC_SUBST(DOXYGEN_PAPER_SIZE, "")
++;; #(
++a4wide|a4|letter|legal|executive)
++ DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE)
++;; #(
++*)
++ AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE'])
++;;
++esac
++
++#For debugging:
++#echo DX_FLAG_doc=$DX_FLAG_doc
++#echo DX_FLAG_dot=$DX_FLAG_dot
++#echo DX_FLAG_man=$DX_FLAG_man
++#echo DX_FLAG_html=$DX_FLAG_html
++#echo DX_FLAG_chm=$DX_FLAG_chm
++#echo DX_FLAG_chi=$DX_FLAG_chi
++#echo DX_FLAG_rtf=$DX_FLAG_rtf
++#echo DX_FLAG_xml=$DX_FLAG_xml
++#echo DX_FLAG_pdf=$DX_FLAG_pdf
++#echo DX_FLAG_ps=$DX_FLAG_ps
++#echo DX_ENV=$DX_ENV
++])
+diff --git a/m4/ax_pthread.m4 b/m4/ax_pthread.m4
+new file mode 100644
+index 0000000..83d8d1b
+--- /dev/null
++++ b/m4/ax_pthread.m4
+@@ -0,0 +1,272 @@
++# ===========================================================================
++# http://www.nongnu.org/autoconf-archive/ax_pthread.html
++# ===========================================================================
++#
++# SYNOPSIS
++#
++# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
++#
++# DESCRIPTION
++#
++# This macro figures out how to build C programs using POSIX threads. It
++# sets the PTHREAD_LIBS output variable to the threads library and linker
++# flags, and the PTHREAD_CFLAGS output variable to any special C compiler
++# flags that are needed. (The user can also force certain compiler
++# flags/libs to be tested by setting these environment variables.)
++#
++# Also sets PTHREAD_CC to any special C compiler that is needed for
++# multi-threaded programs (defaults to the value of CC otherwise). (This
++# is necessary on AIX to use the special cc_r compiler alias.)
++#
++# NOTE: You are assumed to not only compile your program with these flags,
++# but also link it with them as well. e.g. you should link with
++# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
++#
++# If you are only building threads programs, you may wish to use these
++# variables in your default LIBS, CFLAGS, and CC:
++#
++# LIBS="$PTHREAD_LIBS $LIBS"
++# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
++# CC="$PTHREAD_CC"
++#
++# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
++# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name
++# (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
++#
++# ACTION-IF-FOUND is a list of shell commands to run if a threads library
++# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
++# is not found. If ACTION-IF-FOUND is not specified, the default action
++# will define HAVE_PTHREAD.
++#
++# Please let the authors know if this macro fails on any platform, or if
++# you have any other suggestions or comments. This macro was based on work
++# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
++# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
++# Alejandro Forero Cuervo to the autoconf macro repository. We are also
++# grateful for the helpful feedback of numerous users.
++#
++# LICENSE
++#
++# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
++#
++# This program is free software: you can redistribute it and/or modify it
++# under the terms of the GNU General Public License as published by the
++# Free Software Foundation, either version 3 of the License, or (at your
++# option) any later version.
++#
++# This program is distributed in the hope that it will be useful, but
++# WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
++# Public License for more details.
++#
++# You should have received a copy of the GNU General Public License along
++# with this program. If not, see <http://www.gnu.org/licenses/>.
++#
++# As a special exception, the respective Autoconf Macro's copyright owner
++# gives unlimited permission to copy, distribute and modify the configure
++# scripts that are the output of Autoconf when processing the Macro. You
++# need not follow the terms of the GNU General Public License when using
++# or distributing such scripts, even though portions of the text of the
++# Macro appear in them. The GNU General Public License (GPL) does govern
++# all other use of the material that constitutes the Autoconf Macro.
++#
++# This special exception to the GPL applies to versions of the Autoconf
++# Macro released by the Autoconf Archive. When you make and distribute a
++# modified version of the Autoconf Macro, you may extend this special
++# exception to the GPL to apply to your modified version as well.
++
++AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
++AC_DEFUN([AX_PTHREAD], [
++AC_REQUIRE([AC_CANONICAL_HOST])
++AC_LANG_SAVE
++AC_LANG_C
++ax_pthread_ok=no
++
++# We used to check for pthread.h first, but this fails if pthread.h
++# requires special compiler flags (e.g. on True64 or Sequent).
++# It gets checked for in the link test anyway.
++
++# First of all, check if the user has set any of the PTHREAD_LIBS,
++# etcetera environment variables, and if threads linking works using
++# them:
++if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
++ save_CFLAGS="$CFLAGS"
++ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
++ save_LIBS="$LIBS"
++ LIBS="$PTHREAD_LIBS $LIBS"
++ AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
++ AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes)
++ AC_MSG_RESULT($ax_pthread_ok)
++ if test x"$ax_pthread_ok" = xno; then
++ PTHREAD_LIBS=""
++ PTHREAD_CFLAGS=""
++ fi
++ LIBS="$save_LIBS"
++ CFLAGS="$save_CFLAGS"
++fi
++
++# We must check for the threads library under a number of different
++# names; the ordering is very important because some systems
++# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
++# libraries is broken (non-POSIX).
++
++# Create a list of thread flags to try. Items starting with a "-" are
++# C compiler flags, and other items are library names, except for "none"
++# which indicates that we try without any flags at all, and "pthread-config"
++# which is a program returning the flags for the Pth emulation library.
++
++ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
++
++# The ordering *is* (sometimes) important. Some notes on the
++# individual items follow:
++
++# pthreads: AIX (must check this before -lpthread)
++# none: in case threads are in libc; should be tried before -Kthread and
++# other compiler flags to prevent continual compiler warnings
++# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
++# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
++# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
++# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
++# -pthreads: Solaris/gcc
++# -mthreads: Mingw32/gcc, Lynx/gcc
++# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
++# doesn't hurt to check since this sometimes defines pthreads too;
++# also defines -D_REENTRANT)
++# ... -mt is also the pthreads flag for HP/aCC
++# pthread: Linux, etcetera
++# --thread-safe: KAI C++
++# pthread-config: use pthread-config program (for GNU Pth library)
++
++case "${host_cpu}-${host_os}" in
++ *solaris*)
++
++ # On Solaris (at least, for some versions), libc contains stubbed
++ # (non-functional) versions of the pthreads routines, so link-based
++ # tests will erroneously succeed. (We need to link with -pthreads/-mt/
++ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
++ # a function called by this macro, so we could check for that, but
++ # who knows whether they'll stub that too in a future libc.) So,
++ # we'll just look for -pthreads and -lpthread first:
++
++ ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags"
++ ;;
++esac
++
++if test x"$ax_pthread_ok" = xno; then
++for flag in $ax_pthread_flags; do
++
++ case $flag in
++ none)
++ AC_MSG_CHECKING([whether pthreads work without any flags])
++ ;;
++
++ -*)
++ AC_MSG_CHECKING([whether pthreads work with $flag])
++ PTHREAD_CFLAGS="$flag"
++ ;;
++
++ pthread-config)
++ AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no)
++ if test x"$ax_pthread_config" = xno; then continue; fi
++ PTHREAD_CFLAGS="`pthread-config --cflags`"
++ PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
++ ;;
++
++ *)
++ AC_MSG_CHECKING([for the pthreads library -l$flag])
++ PTHREAD_LIBS="-l$flag"
++ ;;
++ esac
++
++ save_LIBS="$LIBS"
++ save_CFLAGS="$CFLAGS"
++ LIBS="$PTHREAD_LIBS $LIBS"
++ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
++
++ # Check for various functions. We must include pthread.h,
++ # since some functions may be macros. (On the Sequent, we
++ # need a special flag -Kthread to make this header compile.)
++ # We check for pthread_join because it is in -lpthread on IRIX
++ # while pthread_create is in libc. We check for pthread_attr_init
++ # due to DEC craziness with -lpthreads. We check for
++ # pthread_cleanup_push because it is one of the few pthread
++ # functions on Solaris that doesn't have a non-functional libc stub.
++ # We try pthread_create on general principles.
++ AC_TRY_LINK([#include <pthread.h>],
++ [pthread_t th; pthread_join(th, 0);
++ pthread_attr_init(0); pthread_cleanup_push(0, 0);
++ pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
++ [ax_pthread_ok=yes])
++
++ LIBS="$save_LIBS"
++ CFLAGS="$save_CFLAGS"
++
++ AC_MSG_RESULT($ax_pthread_ok)
++ if test "x$ax_pthread_ok" = xyes; then
++ break;
++ fi
++
++ PTHREAD_LIBS=""
++ PTHREAD_CFLAGS=""
++done
++fi
++
++# Various other checks:
++if test "x$ax_pthread_ok" = xyes; then
++ save_LIBS="$LIBS"
++ LIBS="$PTHREAD_LIBS $LIBS"
++ save_CFLAGS="$CFLAGS"
++ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
++
++ # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
++ AC_MSG_CHECKING([for joinable pthread attribute])
++ attr_name=unknown
++ for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
++ AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;],
++ [attr_name=$attr; break])
++ done
++ AC_MSG_RESULT($attr_name)
++ if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
++ AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
++ [Define to necessary symbol if this constant
++ uses a non-standard name on your system.])
++ fi
++
++ AC_MSG_CHECKING([if more special flags are required for pthreads])
++ flag=no
++ case "${host_cpu}-${host_os}" in
++ *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
++ *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
++ esac
++ AC_MSG_RESULT(${flag})
++ if test "x$flag" != xno; then
++ PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
++ fi
++
++ LIBS="$save_LIBS"
++ CFLAGS="$save_CFLAGS"
++
++ # More AIX lossage: must compile with xlc_r or cc_r
++ if test x"$GCC" != xyes; then
++ AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})
++ else
++ PTHREAD_CC=$CC
++ fi
++else
++ PTHREAD_CC="$CC"
++fi
++
++AC_SUBST(PTHREAD_LIBS)
++AC_SUBST(PTHREAD_CFLAGS)
++AC_SUBST(PTHREAD_CC)
++
++# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
++if test x"$ax_pthread_ok" = xyes; then
++ ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
++ :
++else
++ ax_pthread_ok=no
++ $2
++fi
++AC_LANG_RESTORE
++])dnl AX_PTHREAD
+diff --git a/m4/net-snmp.m4 b/m4/net-snmp.m4
+new file mode 100644
+index 0000000..c62df76
+--- /dev/null
++++ b/m4/net-snmp.m4
+@@ -0,0 +1,10 @@
++AC_DEFUN([AC_CHECK_NET_SNMP],[
++AC_MSG_CHECKING([Searching for net-snmp lib])
++AC_CHECK_PROG([SNMP_LIBS],[net-snmp-config],[`net-snmp-config --libs`],[none])
++AC_CHECK_PROG([SNMP_CFLGAS],[net-snmp-config],[`net-snmp-config --cflags`],[none])
++if test x"${SNMP_LIBS}" = "xnone"; then
++AC_MSG_ERROR([net-snmp-config not found, please install the development package of net-snmp])
++else
++AC_MSG_RESULT([found net-snmp-config])
++fi
++])
+diff --git a/m4/pcap.m4 b/m4/pcap.m4
+new file mode 100644
+index 0000000..69d88f3
+--- /dev/null
++++ b/m4/pcap.m4
+@@ -0,0 +1,10 @@
++AC_DEFUN([AC_CHECK_PCAP],[
++AC_MSG_CHECKING([Searching for pcap lib])
++AC_CHECK_PROG([PCAP_LIBS],[pcap-config],[`pcap-config --libs`],[none])
++AC_CHECK_PROG([PCAP_CFLGAS],[pcap-config],[`pcap-config --cflags`],[none])
++if test x"${PCAP_LIBS}" = "xnone"; then
++AC_MSG_ERROR([pcap-config not found, please install the development package of libpcap])
++else
++AC_MSG_RESULT([found pcap])
++fi
++])
+diff --git a/missing b/missing
+new file mode 100755
+index 0000000..28055d2
+--- /dev/null
++++ b/missing
+@@ -0,0 +1,376 @@
++#! /bin/sh
++# Common stub for a few missing GNU programs while installing.
++
++scriptversion=2009-04-28.21; # UTC
++
++# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
++# 2008, 2009 Free Software Foundation, Inc.
++# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
++
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2, or (at your option)
++# any later version.
++
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++
++# You should have received a copy of the GNU General Public License
++# along with this program. If not, see <http://www.gnu.org/licenses/>.
++
++# As a special exception to the GNU General Public License, if you
++# distribute this file as part of a program that contains a
++# configuration script generated by Autoconf, you may include it under
++# the same distribution terms that you use for the rest of that program.
++
++if test $# -eq 0; then
++ echo 1>&2 "Try \`$0 --help' for more information"
++ exit 1
++fi
++
++run=:
++sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
++sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
++
++# In the cases where this matters, `missing' is being run in the
++# srcdir already.
++if test -f configure.ac; then
++ configure_ac=configure.ac
++else
++ configure_ac=configure.in
++fi
++
++msg="missing on your system"
++
++case $1 in
++--run)
++ # Try to run requested program, and just exit if it succeeds.
++ run=
++ shift
++ "$@" && exit 0
++ # Exit code 63 means version mismatch. This often happens
++ # when the user try to use an ancient version of a tool on
++ # a file that requires a minimum version. In this case we
++ # we should proceed has if the program had been absent, or
++ # if --run hadn't been passed.
++ if test $? = 63; then
++ run=:
++ msg="probably too old"
++ fi
++ ;;
++
++ -h|--h|--he|--hel|--help)
++ echo "\
++$0 [OPTION]... PROGRAM [ARGUMENT]...
++
++Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
++error status if there is no known handling for PROGRAM.
++
++Options:
++ -h, --help display this help and exit
++ -v, --version output version information and exit
++ --run try to run the given command, and emulate it if it fails
++
++Supported PROGRAM values:
++ aclocal touch file \`aclocal.m4'
++ autoconf touch file \`configure'
++ autoheader touch file \`config.h.in'
++ autom4te touch the output file, or create a stub one
++ automake touch all \`Makefile.in' files
++ bison create \`y.tab.[ch]', if possible, from existing .[ch]
++ flex create \`lex.yy.c', if possible, from existing .c
++ help2man touch the output file
++ lex create \`lex.yy.c', if possible, from existing .c
++ makeinfo touch the output file
++ tar try tar, gnutar, gtar, then tar without non-portable flags
++ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
++
++Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
++\`g' are ignored when checking the name.
++
++Send bug reports to <bug-automake@gnu.org>."
++ exit $?
++ ;;
++
++ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
++ echo "missing $scriptversion (GNU Automake)"
++ exit $?
++ ;;
++
++ -*)
++ echo 1>&2 "$0: Unknown \`$1' option"
++ echo 1>&2 "Try \`$0 --help' for more information"
++ exit 1
++ ;;
++
++esac
++
++# normalize program name to check for.
++program=`echo "$1" | sed '
++ s/^gnu-//; t
++ s/^gnu//; t
++ s/^g//; t'`
++
++# Now exit if we have it, but it failed. Also exit now if we
++# don't have it and --version was passed (most likely to detect
++# the program). This is about non-GNU programs, so use $1 not
++# $program.
++case $1 in
++ lex*|yacc*)
++ # Not GNU programs, they don't have --version.
++ ;;
++
++ tar*)
++ if test -n "$run"; then
++ echo 1>&2 "ERROR: \`tar' requires --run"
++ exit 1
++ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
++ exit 1
++ fi
++ ;;
++
++ *)
++ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
++ # We have it, but it failed.
++ exit 1
++ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
++ # Could not run --version or --help. This is probably someone
++ # running `$TOOL --version' or `$TOOL --help' to check whether
++ # $TOOL exists and not knowing $TOOL uses missing.
++ exit 1
++ fi
++ ;;
++esac
++
++# If it does not exist, or fails to run (possibly an outdated version),
++# try to emulate it.
++case $program in
++ aclocal*)
++ echo 1>&2 "\
++WARNING: \`$1' is $msg. You should only need it if
++ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
++ to install the \`Automake' and \`Perl' packages. Grab them from
++ any GNU archive site."
++ touch aclocal.m4
++ ;;
++
++ autoconf*)
++ echo 1>&2 "\
++WARNING: \`$1' is $msg. You should only need it if
++ you modified \`${configure_ac}'. You might want to install the
++ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
++ archive site."
++ touch configure
++ ;;
++
++ autoheader*)
++ echo 1>&2 "\
++WARNING: \`$1' is $msg. You should only need it if
++ you modified \`acconfig.h' or \`${configure_ac}'. You might want
++ to install the \`Autoconf' and \`GNU m4' packages. Grab them
++ from any GNU archive site."
++ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
++ test -z "$files" && files="config.h"
++ touch_files=
++ for f in $files; do
++ case $f in
++ *:*) touch_files="$touch_files "`echo "$f" |
++ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
++ *) touch_files="$touch_files $f.in";;
++ esac
++ done
++ touch $touch_files
++ ;;
++
++ automake*)
++ echo 1>&2 "\
++WARNING: \`$1' is $msg. You should only need it if
++ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
++ You might want to install the \`Automake' and \`Perl' packages.
++ Grab them from any GNU archive site."
++ find . -type f -name Makefile.am -print |
++ sed 's/\.am$/.in/' |
++ while read f; do touch "$f"; done
++ ;;
++
++ autom4te*)
++ echo 1>&2 "\
++WARNING: \`$1' is needed, but is $msg.
++ You might have modified some files without having the
++ proper tools for further handling them.
++ You can get \`$1' as part of \`Autoconf' from any GNU
++ archive site."
++
++ file=`echo "$*" | sed -n "$sed_output"`
++ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
++ if test -f "$file"; then
++ touch $file
++ else
++ test -z "$file" || exec >$file
++ echo "#! /bin/sh"
++ echo "# Created by GNU Automake missing as a replacement of"
++ echo "# $ $@"
++ echo "exit 0"
++ chmod +x $file
++ exit 1
++ fi
++ ;;
++
++ bison*|yacc*)
++ echo 1>&2 "\
++WARNING: \`$1' $msg. You should only need it if
++ you modified a \`.y' file. You may need the \`Bison' package
++ in order for those modifications to take effect. You can get
++ \`Bison' from any GNU archive site."
++ rm -f y.tab.c y.tab.h
++ if test $# -ne 1; then
++ eval LASTARG="\${$#}"
++ case $LASTARG in
++ *.y)
++ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
++ if test -f "$SRCFILE"; then
++ cp "$SRCFILE" y.tab.c
++ fi
++ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
++ if test -f "$SRCFILE"; then
++ cp "$SRCFILE" y.tab.h
++ fi
++ ;;
++ esac
++ fi
++ if test ! -f y.tab.h; then
++ echo >y.tab.h
++ fi
++ if test ! -f y.tab.c; then
++ echo 'main() { return 0; }' >y.tab.c
++ fi
++ ;;
++
++ lex*|flex*)
++ echo 1>&2 "\
++WARNING: \`$1' is $msg. You should only need it if
++ you modified a \`.l' file. You may need the \`Flex' package
++ in order for those modifications to take effect. You can get
++ \`Flex' from any GNU archive site."
++ rm -f lex.yy.c
++ if test $# -ne 1; then
++ eval LASTARG="\${$#}"
++ case $LASTARG in
++ *.l)
++ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
++ if test -f "$SRCFILE"; then
++ cp "$SRCFILE" lex.yy.c
++ fi
++ ;;
++ esac
++ fi
++ if test ! -f lex.yy.c; then
++ echo 'main() { return 0; }' >lex.yy.c
++ fi
++ ;;
++
++ help2man*)
++ echo 1>&2 "\
++WARNING: \`$1' is $msg. You should only need it if
++ you modified a dependency of a manual page. You may need the
++ \`Help2man' package in order for those modifications to take
++ effect. You can get \`Help2man' from any GNU archive site."
++
++ file=`echo "$*" | sed -n "$sed_output"`
++ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
++ if test -f "$file"; then
++ touch $file
++ else
++ test -z "$file" || exec >$file
++ echo ".ab help2man is required to generate this page"
++ exit $?
++ fi
++ ;;
++
++ makeinfo*)
++ echo 1>&2 "\
++WARNING: \`$1' is $msg. You should only need it if
++ you modified a \`.texi' or \`.texinfo' file, or any other file
++ indirectly affecting the aspect of the manual. The spurious
++ call might also be the consequence of using a buggy \`make' (AIX,
++ DU, IRIX). You might want to install the \`Texinfo' package or
++ the \`GNU make' package. Grab either from any GNU archive site."
++ # The file to touch is that specified with -o ...
++ file=`echo "$*" | sed -n "$sed_output"`
++ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
++ if test -z "$file"; then
++ # ... or it is the one specified with @setfilename ...
++ infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
++ file=`sed -n '
++ /^@setfilename/{
++ s/.* \([^ ]*\) *$/\1/
++ p
++ q
++ }' $infile`
++ # ... or it is derived from the source name (dir/f.texi becomes f.info)
++ test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
++ fi
++ # If the file does not exist, the user really needs makeinfo;
++ # let's fail without touching anything.
++ test -f $file || exit 1
++ touch $file
++ ;;
++
++ tar*)
++ shift
++
++ # We have already tried tar in the generic part.
++ # Look for gnutar/gtar before invocation to avoid ugly error
++ # messages.
++ if (gnutar --version > /dev/null 2>&1); then
++ gnutar "$@" && exit 0
++ fi
++ if (gtar --version > /dev/null 2>&1); then
++ gtar "$@" && exit 0
++ fi
++ firstarg="$1"
++ if shift; then
++ case $firstarg in
++ *o*)
++ firstarg=`echo "$firstarg" | sed s/o//`
++ tar "$firstarg" "$@" && exit 0
++ ;;
++ esac
++ case $firstarg in
++ *h*)
++ firstarg=`echo "$firstarg" | sed s/h//`
++ tar "$firstarg" "$@" && exit 0
++ ;;
++ esac
++ fi
++
++ echo 1>&2 "\
++WARNING: I can't seem to be able to run \`tar' with the given arguments.
++ You may want to install GNU tar or Free paxutils, or check the
++ command line arguments."
++ exit 1
++ ;;
++
++ *)
++ echo 1>&2 "\
++WARNING: \`$1' is needed, and is $msg.
++ You might have modified some files without having the
++ proper tools for further handling them. Check the \`README' file,
++ it often tells you about the needed prerequisites for installing
++ this package. You may also peek at any GNU archive site, in case
++ some other package would contain this missing \`$1' program."
++ exit 1
++ ;;
++esac
++
++exit 0
++
++# Local variables:
++# eval: (add-hook 'write-file-hooks 'time-stamp)
++# time-stamp-start: "scriptversion="
++# time-stamp-format: "%:y-%02m-%02d.%02H"
++# time-stamp-time-zone: "UTC"
++# time-stamp-end: "; # UTC"
++# End:
+diff --git a/snmp/dessertAppParamsTable.c b/snmp/dessertAppParamsTable.c
+deleted file mode 100644
+index 47ef1ec..0000000
+--- a/snmp/dessertAppParamsTable.c
++++ /dev/null
+@@ -1,231 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 14170 $ of $
+- *
+- * $Id:$
+- */
+-/** \page MFD helper for dessertAppParamsTable
+- *
+- * \section intro Introduction
+- * Introductory text.
+- *
+- */
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertAppParamsTable.h"
+-
+-#include <net-snmp/agent/mib_modules.h>
+-
+-#include "dessertAppParamsTable_interface.h"
+-
+-oid dessertAppParamsTable_oid[] =
+- { DESSERTAPPPARAMSTABLE_OID };
+-int dessertAppParamsTable_oid_size =
+-OID_LENGTH(dessertAppParamsTable_oid);
+-
+-dessertAppParamsTable_registration dessertAppParamsTable_user_context;
+-
+-void initialize_table_dessertAppParamsTable(void);
+-void shutdown_table_dessertAppParamsTable(void);
+-
+-
+-/**
+- * Initializes the dessertAppParamsTable module
+- */
+-void
+-init_dessertAppParamsTable(void)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:init_dessertAppParamsTable",
+- "called\n"));
+-
+- /*
+- * TODO:300:o: Perform dessertAppParamsTable one-time module initialization.
+- */
+-
+- /*
+- * here we initialize all the tables we're planning on supporting
+- */
+- if (should_init("dessertAppParamsTable"))
+- initialize_table_dessertAppParamsTable();
+-
+-} /* init_dessertAppParamsTable */
+-
+-/**
+- * Shut-down the dessertAppParamsTable module (agent is exiting)
+- */
+-void
+-shutdown_dessertAppParamsTable(void)
+-{
+- if (should_init("dessertAppParamsTable"))
+- shutdown_table_dessertAppParamsTable();
+-
+-}
+-
+-/**
+- * Initialize the table dessertAppParamsTable
+- * (Define its contents and how it's structured)
+- */
+-void
+-initialize_table_dessertAppParamsTable(void)
+-{
+- dessertAppParamsTable_registration *user_context;
+- u_long flags;
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:initialize_table_dessertAppParamsTable", "called\n"));
+-
+- /*
+- * TODO:301:o: Perform dessertAppParamsTable one-time table initialization.
+- */
+-
+- /*
+- * TODO:302:o: |->Initialize dessertAppParamsTable user context
+- * if you'd like to pass in a pointer to some data for this
+- * table, allocate or set it up here.
+- */
+- /*
+- * a netsnmp_data_list is a simple way to store void pointers. A simple
+- * string token is used to add, find or remove pointers.
+- */
+- user_context =
+- netsnmp_create_data_list("dessertAppParamsTable", NULL, NULL);
+-
+- /*
+- * No support for any flags yet, but in the future you would
+- * set any flags here.
+- */
+- flags = 0;
+-
+- /*
+- * call interface initialization code
+- */
+- _dessertAppParamsTable_initialize_interface(user_context, flags);
+-} /* initialize_table_dessertAppParamsTable */
+-
+-/**
+- * Shutdown the table dessertAppParamsTable
+- */
+-void
+-shutdown_table_dessertAppParamsTable(void)
+-{
+- /*
+- * call interface shutdown code
+- */
+- _dessertAppParamsTable_shutdown_interface
+- (&dessertAppParamsTable_user_context);
+-}
+-
+-/**
+- * extra context initialization (eg default values)
+- *
+- * @param rowreq_ctx : row request context
+- * @param user_init_ctx : void pointer for user (parameter to rowreq_ctx_allocate)
+- *
+- * @retval MFD_SUCCESS : no errors
+- * @retval MFD_ERROR : error (context allocate will fail)
+- */
+-int
+-dessertAppParamsTable_rowreq_ctx_init(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx, void *user_init_ctx)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_rowreq_ctx_init", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:210:o: |-> Perform extra dessertAppParamsTable rowreq initialization. (eg DEFVALS)
+- */
+-
+- return MFD_SUCCESS;
+-} /* dessertAppParamsTable_rowreq_ctx_init */
+-
+-/**
+- * extra context cleanup
+- *
+- */
+-void
+-dessertAppParamsTable_rowreq_ctx_cleanup(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_rowreq_ctx_cleanup", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:211:o: |-> Perform extra dessertAppParamsTable rowreq cleanup.
+- */
+-} /* dessertAppParamsTable_rowreq_ctx_cleanup */
+-
+-/**
+- * pre-request callback
+- *
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error
+- */
+-int
+-dessertAppParamsTable_pre_request(dessertAppParamsTable_registration *
+- user_context)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_pre_request", "called\n"));
+-
+- /*
+- * TODO:510:o: Perform dessertAppParamsTable pre-request actions.
+- */
+-
+- return MFD_SUCCESS;
+-} /* dessertAppParamsTable_pre_request */
+-
+-/**
+- * post-request callback
+- *
+- * Note:
+- * New rows have been inserted into the container, and
+- * deleted rows have been removed from the container and
+- * released.
+- *
+- * @param user_context
+- * @param rc : MFD_SUCCESS if all requests succeeded
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error (ignored)
+- */
+-int
+-dessertAppParamsTable_post_request(dessertAppParamsTable_registration *
+- user_context, int rc)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_post_request", "called\n"));
+-
+- /*
+- * TODO:511:o: Perform dessertAppParamsTable post-request actions.
+- */
+-
+- /*
+- * check to set if any rows were changed.
+- */
+- if (dessertAppParamsTable_dirty_get()) {
+- /*
+- * check if request was successful. If so, this would be
+- * a good place to save data to its persistent store.
+- */
+- if (MFD_SUCCESS == rc) {
+- /*
+- * save changed rows, if you haven't already
+- */
+- }
+-
+- dessertAppParamsTable_dirty_set(0); /* clear table dirty flag */
+- }
+-
+- return MFD_SUCCESS;
+-} /* dessertAppParamsTable_post_request */
+-
+-
+-/** @{ */
+diff --git a/snmp/dessertAppParamsTable.h b/snmp/dessertAppParamsTable.h
+deleted file mode 100644
+index 5c972d1..0000000
+--- a/snmp/dessertAppParamsTable.h
++++ /dev/null
+@@ -1,252 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 14170 $ of $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTAPPPARAMSTABLE_H
+-#define DESSERTAPPPARAMSTABLE_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+-/** @addtogroup misc misc: Miscellaneous routines
+- *
+- * @{
+- */
+-#include <net-snmp/library/asn1.h>
+-
+- /*
+- * other required module components
+- */
+- /* *INDENT-OFF* */
+-config_add_mib(DESSERT-MIB)
+-config_require(DESSERT-MIB/dessertAppParamsTable/dessertAppParamsTable_interface)
+-config_require(DESSERT-MIB/dessertAppParamsTable/dessertAppParamsTable_data_access)
+-config_require(DESSERT-MIB/dessertAppParamsTable/dessertAppParamsTable_data_get)
+-config_require(DESSERT-MIB/dessertAppParamsTable/dessertAppParamsTable_data_set)
+- /* *INDENT-ON* */
+-
+- /*
+- * OID and column number definitions for dessertAppParamsTable
+- */
+-#include "dessertAppParamsTable_oids.h"
+-
+- /*
+- * enum definions
+- */
+-#include "dessertAppParamsTable_enums.h"
+-
+- /*
+- *********************************************************************
+- * function declarations
+- */
+- void init_dessertAppParamsTable(void);
+- void shutdown_dessertAppParamsTable(void);
+-
+- /*
+- *********************************************************************
+- * Table declarations
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertAppParamsTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+- /*
+- * DESSERT-MIB::dessertAppParamsTable is subid 11 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11, length: 13
+- */
+- /*
+- *********************************************************************
+- * When you register your mib, you get to provide a generic
+- * pointer that will be passed back to you for most of the
+- * functions calls.
+- *
+- * TODO:100:r: Review all context structures
+- */
+- /*
+- * TODO:101:o: |-> Review dessertAppParamsTable registration context.
+- */
+- typedef netsnmp_data_list dessertAppParamsTable_registration;
+-
+-/**********************************************************************/
+- /*
+- * TODO:110:r: |-> Review dessertAppParamsTable data context structure.
+- * This structure is used to represent the data for dessertAppParamsTable.
+- */
+- /*
+- * This structure contains storage for all the columns defined in the
+- * dessertAppParamsTable.
+- */
+- typedef struct dessertAppParamsTable_data_s {
+-
+- /*
+- * appParamsName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- char appParamsName[255];
+- size_t appParamsName_len; /* # of char elements, not bytes */
+-
+- /*
+- * appParamsDesc(3)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- char appParamsDesc[255];
+- size_t appParamsDesc_len; /* # of char elements, not bytes */
+-
+- /*
+- * appParamsValueType(4)/DessertAppValueType/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
+- */
+- u_long appParamsValueType;
+-
+- /*
+- * appParamsTruthValue(5)/TruthValue/ASN_INTEGER/long(u_long)//l/A/W/E/r/d/h
+- */
+- u_long appParamsTruthValue;
+-
+- /*
+- * appParamsInteger32(6)/INTEGER32/ASN_INTEGER/long(long)//l/A/W/e/r/d/h
+- */
+- long appParamsInteger32;
+-
+- /*
+- * appParamsUnsigned32(7)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/W/e/r/d/h
+- */
+- u_long appParamsUnsigned32;
+-
+- /*
+- * appParamsOctetString(9)/DessertApplicationOctetString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H
+- */
+- char appParamsOctetString[1024];
+- size_t appParamsOctetString_len; /* # of char elements, not bytes */
+-
+- } dessertAppParamsTable_data;
+-
+-
+- /*
+- *********************************************************************
+- * TODO:115:o: |-> Review dessertAppParamsTable undo context.
+- * We're just going to use the same data structure for our
+- * undo_context. If you want to do something more efficent,
+- * define your typedef here.
+- */
+- typedef dessertAppParamsTable_data dessertAppParamsTable_undo_data;
+-
+- /*
+- * TODO:120:r: |-> Review dessertAppParamsTable mib index.
+- * This structure is used to represent the index for dessertAppParamsTable.
+- */
+- typedef struct dessertAppParamsTable_mib_index_s {
+-
+- /*
+- * appParamsIndex(1)/DessertAppParamsIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
+- */
+- long appParamsIndex;
+-
+-
+- } dessertAppParamsTable_mib_index;
+-
+- /*
+- * TODO:121:r: | |-> Review dessertAppParamsTable max index length.
+- * If you KNOW that your indexes will never exceed a certain
+- * length, update this macro to that length.
+- */
+-#define MAX_dessertAppParamsTable_IDX_LEN 1
+-
+-
+- /*
+- *********************************************************************
+- * TODO:130:o: |-> Review dessertAppParamsTable Row request (rowreq) context.
+- * When your functions are called, you will be passed a
+- * dessertAppParamsTable_rowreq_ctx pointer.
+- */
+- typedef struct dessertAppParamsTable_rowreq_ctx_s {
+-
+- /** this must be first for container compare to work */
+- netsnmp_index oid_idx;
+- oid oid_tmp[MAX_dessertAppParamsTable_IDX_LEN];
+-
+- dessertAppParamsTable_mib_index tbl_idx;
+-
+- dessertAppParamsTable_data data;
+- unsigned int column_exists_flags; /* flags for existence */
+- dessertAppParamsTable_undo_data *undo;
+- unsigned int column_set_flags; /* flags for set columns */
+-
+-
+- /*
+- * flags per row. Currently, the first (lower) 8 bits are reserved
+- * for the user. See mfd.h for other flags.
+- */
+- u_int rowreq_flags;
+-
+- /*
+- * TODO:131:o: | |-> Add useful data to dessertAppParamsTable rowreq context.
+- */
+-
+- /*
+- * storage for future expansion
+- */
+- netsnmp_data_list *dessertAppParamsTable_data_list;
+-
+- } dessertAppParamsTable_rowreq_ctx;
+-
+- typedef struct dessertAppParamsTable_ref_rowreq_ctx_s {
+- dessertAppParamsTable_rowreq_ctx *rowreq_ctx;
+- } dessertAppParamsTable_ref_rowreq_ctx;
+-
+- /*
+- *********************************************************************
+- * function prototypes
+- */
+- int
+- dessertAppParamsTable_pre_request
+- (dessertAppParamsTable_registration * user_context);
+- int
+- dessertAppParamsTable_post_request
+- (dessertAppParamsTable_registration * user_context, int rc);
+-
+- int
+- dessertAppParamsTable_rowreq_ctx_init
+- (dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
+- void *user_init_ctx);
+- void
+- dessertAppParamsTable_rowreq_ctx_cleanup
+- (dessertAppParamsTable_rowreq_ctx * rowreq_ctx);
+-
+- int
+- dessertAppParamsTable_commit(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+-
+- dessertAppParamsTable_rowreq_ctx
+- *dessertAppParamsTable_row_find_by_mib_index
+- (dessertAppParamsTable_mib_index * mib_idx);
+-
+- extern oid dessertAppParamsTable_oid[];
+- extern int dessertAppParamsTable_oid_size;
+-
+-
+-#include "dessertAppParamsTable_interface.h"
+-#include "dessertAppParamsTable_data_access.h"
+-#include "dessertAppParamsTable_data_get.h"
+-#include "dessertAppParamsTable_data_set.h"
+-
+- /*
+- * DUMMY markers, ignore
+- *
+- * TODO:099:x: *************************************************************
+- * TODO:199:x: *************************************************************
+- * TODO:299:x: *************************************************************
+- * TODO:399:x: *************************************************************
+- * TODO:499:x: *************************************************************
+- */
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTAPPPARAMSTABLE_H */
+-/** @} */
+diff --git a/snmp/dessertAppParamsTable_data_access.c b/snmp/dessertAppParamsTable_data_access.c
+deleted file mode 100644
+index f03fc77..0000000
+--- a/snmp/dessertAppParamsTable_data_access.c
++++ /dev/null
+@@ -1,352 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 14170 $ of $
+- *
+- * $Id:$
+- */
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertAppParamsTable.h"
+-#include "dessertAppParamsTable_data_access.h"
+-#include "../dessert.h"
+-#include "../dessert_internal.h"
+-
+-
+-/** @ingroup interface
+- * @addtogroup data_access data_access: Routines to access data
+- *
+- * These routines are used to locate the data used to satisfy
+- * requests.
+- *
+- * @{
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertAppParamsTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+-/*
+- * DESSERT-MIB::dessertAppParamsTable is subid 11 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11, length: 13
+- */
+-
+-/**
+- * initialization for dessertAppParamsTable data access
+- *
+- * This function is called during startup to allow you to
+- * allocate any resources you need for the data table.
+- *
+- * @param dessertAppParamsTable_reg
+- * Pointer to dessertAppParamsTable_registration
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : unrecoverable error.
+- */
+-int
+-dessertAppParamsTable_init_data(dessertAppParamsTable_registration *
+- dessertAppParamsTable_reg)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_init_data", "called\n"));
+-
+- /*
+- * TODO:303:o: Initialize dessertAppParamsTable data.
+- */
+-
+-
+- return MFD_SUCCESS;
+-} /* dessertAppParamsTable_init_data */
+-
+-/**
+- * container overview
+- *
+- */
+-
+-/**
+- * container initialization
+- *
+- * @param container_ptr_ptr A pointer to a container pointer. If you
+- * create a custom container, use this parameter to return it
+- * to the MFD helper. If set to NULL, the MFD helper will
+- * allocate a container for you.
+- *
+- * This function is called at startup to allow you to customize certain
+- * aspects of the access method. For the most part, it is for advanced
+- * users. The default code should suffice for most cases. If no custom
+- * container is allocated, the MFD code will create one for your.
+- *
+- * @remark
+- * This would also be a good place to do any initialization needed
+- * for you data source. For example, opening a connection to another
+- * process that will supply the data, opening a database, etc.
+- */
+-void
+-dessertAppParamsTable_container_init(netsnmp_container **
+- container_ptr_ptr, netsnmp_cache * cache)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_container_init", "called\n"));
+-
+- if (NULL == container_ptr_ptr) {
+- snmp_log(LOG_ERR,
+- "bad container param to dessertAppParamsTable_container_init\n");
+- return;
+- }
+-
+- /*
+- * For advanced users, you can use a custom container. If you
+- * do not create one, one will be created for you.
+- */
+- *container_ptr_ptr = NULL;
+- if (NULL == cache) {
+- snmp_log(LOG_ERR,
+- "bad cache param to dessertAppParamsTable_container_init\n");
+- return;
+- }
+-
+- /*
+- * TODO:345:A: Set up dessertAppStatsTable cache properties.
+- *
+- * Also for advanced users, you can set parameters for the
+- * cache. Do not change the magic pointer, as it is used
+- * by the MFD helper. To completely disable caching, set
+- * cache->enabled to 0.
+- */
+- cache->timeout = DESSERTAPPPARAMSTABLE_CACHE_TIMEOUT; /* seconds */
+-} /* dessertAppParamsTable_container_init */
+-
+-/**
+- * container shutdown
+- *
+- * @param container_ptr A pointer to the container.
+- *
+- * This function is called at shutdown to allow you to customize certain
+- * aspects of the access method. For the most part, it is for advanced
+- * users. The default code should suffice for most cases.
+- *
+- * This function is called before dessertAppParamsTable_container_free().
+- *
+- * @remark
+- * This would also be a good place to do any cleanup needed
+- * for you data source. For example, closing a connection to another
+- * process that supplied the data, closing a database, etc.
+- */
+-void
+-dessertAppParamsTable_container_shutdown(netsnmp_container * container_ptr)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_container_shutdown", "called\n"));
+-
+- if (NULL == container_ptr) {
+- snmp_log(LOG_ERR,
+- "bad params to dessertAppParamsTable_container_shutdown\n");
+- return;
+- }
+-
+-} /* dessertAppParamsTable_container_shutdown */
+-
+-/**
+- * load initial data
+- *
+- * TODO:350:M: Implement dessertAppParamsTable data load
+- *
+- * @param container container to which items should be inserted
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_RESOURCE_UNAVAILABLE : Can't access data source
+- * @retval MFD_ERROR : other error.
+- *
+- * This function is called to load the index(es) (and data, optionally)
+- * for the every row in the data set.
+- *
+- * @remark
+- * While loading the data, the only important thing is the indexes.
+- * If access to your data is cheap/fast (e.g. you have a pointer to a
+- * structure in memory), it would make sense to update the data here.
+- * If, however, the accessing the data invovles more work (e.g. parsing
+- * some other existing data, or peforming calculations to derive the data),
+- * then you can limit yourself to setting the indexes and saving any
+- * information you will need later. Then use the saved information in
+- * dessertAppParamsTable_row_prep() for populating data.
+- *
+- * @note
+- * If you need consistency between rows (like you want statistics
+- * for each row to be from the same time frame), you should set all
+- * data here.
+- *
+- */
+-int
+-dessertAppParamsTable_container_load(netsnmp_container * container)
+-{
+- dessertAppParamsTable_rowreq_ctx *rowreq_ctx;
+- size_t count = 0;
+-
+- dessert_agentx_appparams_t *appparams_list = NULL;
+- dessert_agentx_appparams_t *appparam;
+-
+- /*
+- * temporary storage for index values
+- */
+- long appParamsIndex;
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_container_load", "called\n"));
+- dessert_debug("dessertAppParamsTable_container_load called");
+-
+- /* harvest the appparams from the getter callbacks registered via *dessert_agentx_appparams_add* */
+- if (_dessert_agentx_appparams_harvest_callbacks(&appparams_list)
+- == DESSERT_ERR) {
+- return MFD_RESOURCE_UNAVAILABLE;
+- }
+-
+- /*
+- * TODO:351:M: |-> Load/update data in the dessertAppParamsTable container.
+- * loop over your dessertAppParamsTable data, allocate a rowreq context,
+- * set the index(es) [and data, optionally] and insert into
+- * the container.
+- */
+- DL_FOREACH(appparams_list, appparam) {
+-
+- appParamsIndex = appparam->index;
+-
+- /*
+- * TODO:352:M: | |-> set indexes in new dessertAppParamsTable rowreq context.
+- * data context will be set from the param (unless NULL,
+- * in which case a new data context will be allocated)
+- */
+- rowreq_ctx = dessertAppParamsTable_allocate_rowreq_ctx();
+- if (NULL == rowreq_ctx) {
+- snmp_log(LOG_ERR, "memory allocation failed\n");
+- return MFD_RESOURCE_UNAVAILABLE;
+- }
+- if (MFD_SUCCESS !=
+- dessertAppParamsTable_indexes_set(rowreq_ctx,
+- appParamsIndex)) {
+- snmp_log(LOG_ERR,
+- "error setting index while loading "
+- "dessertAppParamsTable data.\n");
+- dessertAppParamsTable_release_rowreq_ctx(rowreq_ctx);
+- continue;
+- }
+-
+- /* clear all column flags */
+- rowreq_ctx->column_exists_flags = 0;
+-
+- /* these columns are always present*/
+- rowreq_ctx->column_exists_flags |= COLUMN_APPPARAMSNAME_FLAG
+- | COLUMN_APPPARAMSDESC_FLAG | COLUMN_APPPARAMSVALUETYPE_FLAG;
+-
+- rowreq_ctx->data.appParamsName_len = strlen(appparam->name);
+- strcpy(rowreq_ctx->data.appParamsName, appparam->name);
+-
+- rowreq_ctx->data.appParamsDesc_len = strlen(appparam->desc);
+- strcpy(rowreq_ctx->data.appParamsDesc, appparam->desc);
+-
+- appParamsValueType_map(&(rowreq_ctx->data.appParamsValueType), appparam->value_type);
+-
+- /* which of the 'value'-columns is actually present? */
+- switch (appparam->value_type) {
+-
+- case DESSERT_APPPARAMS_VALUETYPE_BOOL:
+- rowreq_ctx->column_exists_flags |= COLUMN_APPPARAMSTRUTHVALUE_FLAG;
+- appParamsTruthValue_map(&(rowreq_ctx->data.appParamsTruthValue) , appparam->bool);
+-
+- break;
+-
+- case DESSERT_APPPARAMS_VALUETYPE_INT32:
+- rowreq_ctx->column_exists_flags |= COLUMN_APPPARAMSINTEGER32_FLAG;
+- rowreq_ctx->data.appParamsInteger32 = appparam->int32;
+-
+- break;
+-
+- case DESSERT_APPPARAMS_VALUETYPE_UINT32:
+- rowreq_ctx->column_exists_flags |= COLUMN_APPPARAMSUNSIGNED32_FLAG;
+- rowreq_ctx->data.appParamsUnsigned32 = appparam->uint32;
+-
+- break;
+-
+- case DESSERT_APPPARAMS_VALUETYPE_OCTETSTRING:
+- rowreq_ctx->column_exists_flags |= COLUMN_APPPARAMSOCTETSTRING_FLAG;
+- rowreq_ctx->data.appParamsOctetString_len = appparam->octetstring_len;
+- memcpy(&(rowreq_ctx->data.appParamsOctetString), appparam->octetstring, appparam->octetstring_len);
+-
+- break;
+-
+- default:
+- dessert_err("appparam->value_type not valid!");
+- }
+-
+- /*
+- * insert into table container
+- */
+- CONTAINER_INSERT(container, rowreq_ctx);
+- }
+-
+- _dessert_agentx_appparams_free_list(&appparams_list);
+-
+- DEBUGMSGT(("verbose:dessertAppParamsTable:dessertAppParamsTable_container_load", "inserted %d records\n", count));
+-
+- return MFD_SUCCESS;
+-} /* dessertAppParamsTable_container_load */
+-
+-/**
+- * container clean up
+- *
+- * @param container container with all current items
+- *
+- * This optional callback is called prior to all
+- * item's being removed from the container. If you
+- * need to do any processing before that, do it here.
+- *
+- * @note
+- * The MFD helper will take care of releasing all the row contexts.
+- *
+- */
+-void
+-dessertAppParamsTable_container_free(netsnmp_container * container)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_container_free", "called\n"));
+-
+- /*
+- * TODO:380:M: Free dessertAppParamsTable container data.
+- */
+-} /* dessertAppParamsTable_container_free */
+-
+-/**
+- * prepare row for processing.
+- *
+- * When the agent has located the row for a request, this function is
+- * called to prepare the row for processing. If you fully populated
+- * the data context during the index setup phase, you may not need to
+- * do anything.
+- *
+- * @param rowreq_ctx pointer to a context.
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error.
+- */
+-int
+-dessertAppParamsTable_row_prep(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_row_prep", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:390:o: Prepare row for request.
+- * If populating row data was delayed, this is the place to
+- * fill in the row for this request.
+- */
+-
+- return MFD_SUCCESS;
+-} /* dessertAppParamsTable_row_prep */
+-
+-/** @} */
+diff --git a/snmp/dessertAppParamsTable_data_access.h b/snmp/dessertAppParamsTable_data_access.h
+deleted file mode 100644
+index f4e2b29..0000000
+--- a/snmp/dessertAppParamsTable_data_access.h
++++ /dev/null
+@@ -1,93 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 14170 $ of $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTAPPPARAMSTABLE_DATA_ACCESS_H
+-#define DESSERTAPPPARAMSTABLE_DATA_ACCESS_H
+-
+-#include "../dessert_internal.h"
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+- /*
+- *********************************************************************
+- * function declarations
+- */
+-
+- /*
+- *********************************************************************
+- * Table declarations
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertAppParamsTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+- /*
+- * DESSERT-MIB::dessertAppParamsTable is subid 11 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11, length: 13
+- */
+-
+-
+- int
+- dessertAppParamsTable_init_data(dessertAppParamsTable_registration
+- * dessertAppParamsTable_reg);
+-
+-
+- /*
+- * TODO:180:o: Review dessertAppParamsTable cache timeout.
+- * The number of seconds before the cache times out
+- */
+-#define DESSERTAPPPARAMSTABLE_CACHE_TIMEOUT DESSERT_AGENTX_APPPARAMTABLE_CACHE_TIMEOUT
+-
+- void dessertAppParamsTable_container_init(netsnmp_container
+- **
+- container_ptr_ptr,
+- netsnmp_cache *
+- cache);
+- void
+- dessertAppParamsTable_container_shutdown(netsnmp_container *
+- container_ptr);
+-
+- int dessertAppParamsTable_container_load(netsnmp_container
+- * container);
+- void dessertAppParamsTable_container_free(netsnmp_container
+- * container);
+-
+- int dessertAppParamsTable_cache_load(netsnmp_container *
+- container);
+- void dessertAppParamsTable_cache_free(netsnmp_container *
+- container);
+-
+- /*
+- ***************************************************
+- *** START EXAMPLE CODE ***
+- ***---------------------------------------------***/
+- /*
+- *********************************************************************
+- * Since we have no idea how you really access your data, we'll go with
+- * a worst case example: a flat text file.
+- */
+-#define MAX_LINE_SIZE 256
+- /*
+- ***---------------------------------------------***
+- *** END EXAMPLE CODE ***
+- ***************************************************/
+- int
+- dessertAppParamsTable_row_prep(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+-
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTAPPPARAMSTABLE_DATA_ACCESS_H */
+diff --git a/snmp/dessertAppParamsTable_data_get.c b/snmp/dessertAppParamsTable_data_get.c
+deleted file mode 100644
+index f3b1327..0000000
+--- a/snmp/dessertAppParamsTable_data_get.c
++++ /dev/null
+@@ -1,731 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 12088 $ of $
+- *
+- * $Id:$
+- */
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertAppParamsTable.h"
+-
+-
+-/** @defgroup data_get data_get: Routines to get data
+- *
+- * TODO:230:M: Implement dessertAppParamsTable get routines.
+- * TODO:240:M: Implement dessertAppParamsTable mapping routines (if any).
+- *
+- * These routine are used to get the value for individual objects. The
+- * row context is passed, along with a pointer to the memory where the
+- * value should be copied.
+- *
+- * @{
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertAppParamsTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+-/*
+- * DESSERT-MIB::dessertAppParamsTable is subid 11 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11, length: 13
+- */
+-
+-/*
+- * ---------------------------------------------------------------------
+- * * TODO:200:r: Implement dessertAppParamsTable data context functions.
+- */
+-
+-
+-/**
+- * set mib index(es)
+- *
+- * @param tbl_idx mib index structure
+- * @param appParamsIndex_val
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error.
+- *
+- * @remark
+- * This convenience function is useful for setting all the MIB index
+- * components with a single function call. It is assume that the C values
+- * have already been mapped from their native/rawformat to the MIB format.
+- */
+-int
+-dessertAppParamsTable_indexes_set_tbl_idx(dessertAppParamsTable_mib_index *
+- tbl_idx, long appParamsIndex_val)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_indexes_set_tbl_idx", "called\n"));
+-
+- /*
+- * appParamsIndex(1)/DessertAppParamsIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
+- */
+- tbl_idx->appParamsIndex = appParamsIndex_val;
+-
+-
+- return MFD_SUCCESS;
+-} /* dessertAppParamsTable_indexes_set_tbl_idx */
+-
+-/**
+- * @internal
+- * set row context indexes
+- *
+- * @param reqreq_ctx the row context that needs updated indexes
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error.
+- *
+- * @remark
+- * This function sets the mib indexs, then updates the oid indexs
+- * from the mib index.
+- */
+-int
+-dessertAppParamsTable_indexes_set(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx, long appParamsIndex_val)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_indexes_set", "called\n"));
+-
+- if (MFD_SUCCESS !=
+- dessertAppParamsTable_indexes_set_tbl_idx(&rowreq_ctx->tbl_idx,
+- appParamsIndex_val))
+- return MFD_ERROR;
+-
+- /*
+- * convert mib index to oid index
+- */
+- rowreq_ctx->oid_idx.len = sizeof(rowreq_ctx->oid_tmp) / sizeof(oid);
+- if (0 != dessertAppParamsTable_index_to_oid(&rowreq_ctx->oid_idx,
+- &rowreq_ctx->tbl_idx)) {
+- return MFD_ERROR;
+- }
+-
+- return MFD_SUCCESS;
+-} /* dessertAppParamsTable_indexes_set */
+-
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppParamsEntry.appParamsName
+- * appParamsName is subid 2 of dessertAppParamsEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.2
+- * Description:
+-The name of the parameter.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 1 hashint 1
+- * settable 0
+- * hint: 255a
+- *
+- * Ranges: 0 - 255;
+- *
+- * Its syntax is DisplayString (based on perltype OCTETSTR)
+- * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+- * This data type requires a length. (Max 255)
+- */
+-/**
+- * Extract the current value of the appParamsName data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appParamsName_val_ptr_ptr
+- * Pointer to storage for a char variable
+- * @param appParamsName_val_ptr_len_ptr
+- * Pointer to a size_t. On entry, it will contain the size (in bytes)
+- * pointed to by appParamsName.
+- * On exit, this value should contain the data size (in bytes).
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+-*
+- * @note If you need more than (*appParamsName_val_ptr_len_ptr) bytes of memory,
+- * allocate it using malloc() and update appParamsName_val_ptr_ptr.
+- * <b>DO NOT</b> free the previous pointer.
+- * The MFD helper will release the memory you allocate.
+- *
+- * @remark If you call this function yourself, you are responsible
+- * for checking if the pointer changed, and freeing any
+- * previously allocated memory. (Not necessary if you pass
+- * in a pointer to static memory, obviously.)
+- */
+-int
+-appParamsName_get(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
+- char **appParamsName_val_ptr_ptr,
+- size_t *appParamsName_val_ptr_len_ptr)
+-{
+- /** we should have a non-NULL pointer and enough storage */
+- netsnmp_assert((NULL != appParamsName_val_ptr_ptr)
+- && (NULL != *appParamsName_val_ptr_ptr));
+- netsnmp_assert(NULL != appParamsName_val_ptr_len_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsName_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the appParamsName data.
+- * copy (* appParamsName_val_ptr_ptr ) data and (* appParamsName_val_ptr_len_ptr ) from rowreq_ctx->data
+- */
+- /*
+- * make sure there is enough space for appParamsName data
+- */
+- if ((NULL == (*appParamsName_val_ptr_ptr)) ||
+- ((*appParamsName_val_ptr_len_ptr) <
+- (rowreq_ctx->data.appParamsName_len *
+- sizeof(rowreq_ctx->data.appParamsName[0])))) {
+- /*
+- * allocate space for appParamsName data
+- */
+- (*appParamsName_val_ptr_ptr) =
+- malloc(rowreq_ctx->data.appParamsName_len *
+- sizeof(rowreq_ctx->data.appParamsName[0]));
+- if (NULL == (*appParamsName_val_ptr_ptr)) {
+- snmp_log(LOG_ERR, "could not allocate memory\n");
+- return MFD_ERROR;
+- }
+- }
+- (*appParamsName_val_ptr_len_ptr) =
+- rowreq_ctx->data.appParamsName_len *
+- sizeof(rowreq_ctx->data.appParamsName[0]);
+- memcpy((*appParamsName_val_ptr_ptr), rowreq_ctx->data.appParamsName,
+- rowreq_ctx->data.appParamsName_len *
+- sizeof(rowreq_ctx->data.appParamsName[0]));
+-
+- return MFD_SUCCESS;
+-} /* appParamsName_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppParamsEntry.appParamsDesc
+- * appParamsDesc is subid 3 of dessertAppParamsEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.3
+- * Description:
+-A short description of the parameter
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 1 hashint 1
+- * settable 0
+- * hint: 255a
+- *
+- * Ranges: 0 - 255;
+- *
+- * Its syntax is DisplayString (based on perltype OCTETSTR)
+- * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+- * This data type requires a length. (Max 255)
+- */
+-/**
+- * Extract the current value of the appParamsDesc data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appParamsDesc_val_ptr_ptr
+- * Pointer to storage for a char variable
+- * @param appParamsDesc_val_ptr_len_ptr
+- * Pointer to a size_t. On entry, it will contain the size (in bytes)
+- * pointed to by appParamsDesc.
+- * On exit, this value should contain the data size (in bytes).
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+-*
+- * @note If you need more than (*appParamsDesc_val_ptr_len_ptr) bytes of memory,
+- * allocate it using malloc() and update appParamsDesc_val_ptr_ptr.
+- * <b>DO NOT</b> free the previous pointer.
+- * The MFD helper will release the memory you allocate.
+- *
+- * @remark If you call this function yourself, you are responsible
+- * for checking if the pointer changed, and freeing any
+- * previously allocated memory. (Not necessary if you pass
+- * in a pointer to static memory, obviously.)
+- */
+-int
+-appParamsDesc_get(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
+- char **appParamsDesc_val_ptr_ptr,
+- size_t *appParamsDesc_val_ptr_len_ptr)
+-{
+- /** we should have a non-NULL pointer and enough storage */
+- netsnmp_assert((NULL != appParamsDesc_val_ptr_ptr)
+- && (NULL != *appParamsDesc_val_ptr_ptr));
+- netsnmp_assert(NULL != appParamsDesc_val_ptr_len_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsDesc_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the appParamsDesc data.
+- * copy (* appParamsDesc_val_ptr_ptr ) data and (* appParamsDesc_val_ptr_len_ptr ) from rowreq_ctx->data
+- */
+- /*
+- * make sure there is enough space for appParamsDesc data
+- */
+- if ((NULL == (*appParamsDesc_val_ptr_ptr)) ||
+- ((*appParamsDesc_val_ptr_len_ptr) <
+- (rowreq_ctx->data.appParamsDesc_len *
+- sizeof(rowreq_ctx->data.appParamsDesc[0])))) {
+- /*
+- * allocate space for appParamsDesc data
+- */
+- (*appParamsDesc_val_ptr_ptr) =
+- malloc(rowreq_ctx->data.appParamsDesc_len *
+- sizeof(rowreq_ctx->data.appParamsDesc[0]));
+- if (NULL == (*appParamsDesc_val_ptr_ptr)) {
+- snmp_log(LOG_ERR, "could not allocate memory\n");
+- return MFD_ERROR;
+- }
+- }
+- (*appParamsDesc_val_ptr_len_ptr) =
+- rowreq_ctx->data.appParamsDesc_len *
+- sizeof(rowreq_ctx->data.appParamsDesc[0]);
+- memcpy((*appParamsDesc_val_ptr_ptr), rowreq_ctx->data.appParamsDesc,
+- rowreq_ctx->data.appParamsDesc_len *
+- sizeof(rowreq_ctx->data.appParamsDesc[0]));
+-
+- return MFD_SUCCESS;
+-} /* appParamsDesc_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppParamsEntry.appParamsValueType
+- * appParamsValueType is subid 4 of dessertAppParamsEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.4
+- * Description:
+-Indicates which of the columns (appParamsTruthValue,
+- appParamsInterger32, appParamsUInteger32, appParamsOctetString) in the
+- dessertAppParamsTable is actually valid.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 1 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 0
+- *
+- * Enum range: 3/8. Values: bool(0), int32(1), uint32(2), counter64(3), octetstring(4)
+- *
+- * Its syntax is DessertAppValueType (based on perltype INTEGER)
+- * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
+- */
+-/**
+- * map a value from its original native format to the MIB format.
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_ERROR : Any other error
+- *
+- * @note parameters follow the memset convention (dest, src).
+- *
+- * @note generation and use of this function can be turned off by re-running
+- * mib2c after adding the following line to the file
+- * defaults/node-appParamsValueType.m2d :
+- * @eval $m2c_node_skip_mapping = 1@
+- *
+- * @remark
+- * If the values for your data type don't exactly match the
+- * possible values defined by the mib, you should map them here.
+- * Otherwise, just do a direct copy.
+- */
+-int
+-appParamsValueType_map(u_long * mib_appParamsValueType_val_ptr,
+- u_long raw_appParamsValueType_val)
+-{
+- netsnmp_assert(NULL != mib_appParamsValueType_val_ptr);
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsValueType_map",
+- "called\n"));
+-
+- /*
+- * TODO:241:o: |-> Implement appParamsValueType enum mapping.
+- * uses INTERNAL_* macros defined in the header files
+- */
+- switch (raw_appParamsValueType_val) {
+- case INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_BOOL:
+- *mib_appParamsValueType_val_ptr = DESSERTAPPVALUETYPE_BOOL;
+- break;
+-
+- case INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_INT32:
+- *mib_appParamsValueType_val_ptr = DESSERTAPPVALUETYPE_INT32;
+- break;
+-
+- case INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_UINT32:
+- *mib_appParamsValueType_val_ptr = DESSERTAPPVALUETYPE_UINT32;
+- break;
+-
+- case INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_OCTETSTRING:
+- *mib_appParamsValueType_val_ptr = DESSERTAPPVALUETYPE_OCTETSTRING;
+- break;
+-
+- default:
+- snmp_log(LOG_ERR,
+- "couldn't map value %ld for appParamsValueType\n",
+- raw_appParamsValueType_val);
+- return MFD_ERROR;
+- }
+-
+- return MFD_SUCCESS;
+-} /* appParamsValueType_map */
+-
+-/**
+- * Extract the current value of the appParamsValueType data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appParamsValueType_val_ptr
+- * Pointer to storage for a long variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-appParamsValueType_get(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
+- u_long * appParamsValueType_val_ptr)
+-{
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != appParamsValueType_val_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsValueType_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the appParamsValueType data.
+- * copy (* appParamsValueType_val_ptr ) from rowreq_ctx->data
+- */
+- (*appParamsValueType_val_ptr) = rowreq_ctx->data.appParamsValueType;
+-
+- return MFD_SUCCESS;
+-} /* appParamsValueType_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppParamsEntry.appParamsTruthValue
+- * appParamsTruthValue is subid 5 of dessertAppParamsEntry.
+- * Its status is Current, and its access level is ReadWrite.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.5
+- * Description:
+-A parameter with TruthValue semantics.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 1 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 1
+- *
+- * Enum range: 2/8. Values: true(1), false(2)
+- *
+- * Its syntax is TruthValue (based on perltype INTEGER)
+- * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
+- */
+-/**
+- * map a value from its original native format to the MIB format.
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_ERROR : Any other error
+- *
+- * @note parameters follow the memset convention (dest, src).
+- *
+- * @note generation and use of this function can be turned off by re-running
+- * mib2c after adding the following line to the file
+- * defaults/node-appParamsTruthValue.m2d :
+- * @eval $m2c_node_skip_mapping = 1@
+- *
+- * @remark
+- * If the values for your data type don't exactly match the
+- * possible values defined by the mib, you should map them here.
+- * Otherwise, just do a direct copy.
+- */
+-int
+-appParamsTruthValue_map(u_long * mib_appParamsTruthValue_val_ptr,
+- u_long raw_appParamsTruthValue_val)
+-{
+- netsnmp_assert(NULL != mib_appParamsTruthValue_val_ptr);
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsTruthValue_map",
+- "called\n"));
+-
+- /*
+- * TODO:241:o: |-> Implement appParamsTruthValue enum mapping.
+- * uses INTERNAL_* macros defined in the header files
+- */
+- switch (raw_appParamsTruthValue_val) {
+- case INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSTRUTHVALUE_TRUE:
+- *mib_appParamsTruthValue_val_ptr = TRUTHVALUE_TRUE;
+- break;
+-
+- case INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSTRUTHVALUE_FALSE:
+- *mib_appParamsTruthValue_val_ptr = TRUTHVALUE_FALSE;
+- break;
+-
+- default:
+- snmp_log(LOG_ERR,
+- "couldn't map value %ld for appParamsTruthValue\n",
+- raw_appParamsTruthValue_val);
+- return MFD_ERROR;
+- }
+-
+- return MFD_SUCCESS;
+-} /* appParamsTruthValue_map */
+-
+-/**
+- * Extract the current value of the appParamsTruthValue data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appParamsTruthValue_val_ptr
+- * Pointer to storage for a long variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-appParamsTruthValue_get(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
+- u_long * appParamsTruthValue_val_ptr)
+-{
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != appParamsTruthValue_val_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsTruthValue_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the appParamsTruthValue data.
+- * copy (* appParamsTruthValue_val_ptr ) from rowreq_ctx->data
+- */
+- (*appParamsTruthValue_val_ptr) = rowreq_ctx->data.appParamsTruthValue;
+-
+- return MFD_SUCCESS;
+-} /* appParamsTruthValue_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppParamsEntry.appParamsInteger32
+- * appParamsInteger32 is subid 6 of dessertAppParamsEntry.
+- * Its status is Current, and its access level is ReadWrite.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.6
+- * Description:
+-A parameter with Integer32 semantics.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 1
+- *
+- *
+- * Its syntax is INTEGER32 (based on perltype INTEGER32)
+- * The net-snmp type is ASN_INTEGER. The C type decl is long (long)
+- */
+-/**
+- * Extract the current value of the appParamsInteger32 data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appParamsInteger32_val_ptr
+- * Pointer to storage for a long variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-appParamsInteger32_get(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
+- long *appParamsInteger32_val_ptr)
+-{
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != appParamsInteger32_val_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsInteger32_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the appParamsInteger32 data.
+- * copy (* appParamsInteger32_val_ptr ) from rowreq_ctx->data
+- */
+- (*appParamsInteger32_val_ptr) = rowreq_ctx->data.appParamsInteger32;
+-
+- return MFD_SUCCESS;
+-} /* appParamsInteger32_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppParamsEntry.appParamsUnsigned32
+- * appParamsUnsigned32 is subid 7 of dessertAppParamsEntry.
+- * Its status is Current, and its access level is ReadWrite.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.7
+- * Description:
+-A parameter with Unsigned32 semantics.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 1
+- *
+- *
+- * Its syntax is UNSIGNED32 (based on perltype UNSIGNED32)
+- * The net-snmp type is ASN_UNSIGNED. The C type decl is u_long (u_long)
+- */
+-/**
+- * Extract the current value of the appParamsUnsigned32 data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appParamsUnsigned32_val_ptr
+- * Pointer to storage for a u_long variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-appParamsUnsigned32_get(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
+- u_long * appParamsUnsigned32_val_ptr)
+-{
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != appParamsUnsigned32_val_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsUnsigned32_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the appParamsUnsigned32 data.
+- * copy (* appParamsUnsigned32_val_ptr ) from rowreq_ctx->data
+- */
+- (*appParamsUnsigned32_val_ptr) = rowreq_ctx->data.appParamsUnsigned32;
+-
+- return MFD_SUCCESS;
+-} /* appParamsUnsigned32_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppParamsEntry.appParamsOctetString
+- * appParamsOctetString is subid 9 of dessertAppParamsEntry.
+- * Its status is Current, and its access level is ReadWrite.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.9
+- * Description:
+-A parameter containing of up to 1024 octets.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 1 hashint 1
+- * settable 1
+- * hint: 1024a
+- *
+- * Ranges: 0 - 1024;
+- *
+- * Its syntax is DessertApplicationOctetString (based on perltype OCTETSTR)
+- * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+- * This data type requires a length. (Max 1024)
+- */
+-/**
+- * Extract the current value of the appParamsOctetString data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appParamsOctetString_val_ptr_ptr
+- * Pointer to storage for a char variable
+- * @param appParamsOctetString_val_ptr_len_ptr
+- * Pointer to a size_t. On entry, it will contain the size (in bytes)
+- * pointed to by appParamsOctetString.
+- * On exit, this value should contain the data size (in bytes).
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+-*
+- * @note If you need more than (*appParamsOctetString_val_ptr_len_ptr) bytes of memory,
+- * allocate it using malloc() and update appParamsOctetString_val_ptr_ptr.
+- * <b>DO NOT</b> free the previous pointer.
+- * The MFD helper will release the memory you allocate.
+- *
+- * @remark If you call this function yourself, you are responsible
+- * for checking if the pointer changed, and freeing any
+- * previously allocated memory. (Not necessary if you pass
+- * in a pointer to static memory, obviously.)
+- */
+-int
+-appParamsOctetString_get(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
+- char **appParamsOctetString_val_ptr_ptr,
+- size_t *appParamsOctetString_val_ptr_len_ptr)
+-{
+- /** we should have a non-NULL pointer and enough storage */
+- netsnmp_assert((NULL != appParamsOctetString_val_ptr_ptr)
+- && (NULL != *appParamsOctetString_val_ptr_ptr));
+- netsnmp_assert(NULL != appParamsOctetString_val_ptr_len_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsOctetString_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the appParamsOctetString data.
+- * copy (* appParamsOctetString_val_ptr_ptr ) data and (* appParamsOctetString_val_ptr_len_ptr ) from rowreq_ctx->data
+- */
+- /*
+- * make sure there is enough space for appParamsOctetString data
+- */
+- if ((NULL == (*appParamsOctetString_val_ptr_ptr)) ||
+- ((*appParamsOctetString_val_ptr_len_ptr) <
+- (rowreq_ctx->data.appParamsOctetString_len *
+- sizeof(rowreq_ctx->data.appParamsOctetString[0])))) {
+- /*
+- * allocate space for appParamsOctetString data
+- */
+- (*appParamsOctetString_val_ptr_ptr) =
+- malloc(rowreq_ctx->data.appParamsOctetString_len *
+- sizeof(rowreq_ctx->data.appParamsOctetString[0]));
+- if (NULL == (*appParamsOctetString_val_ptr_ptr)) {
+- snmp_log(LOG_ERR, "could not allocate memory\n");
+- return MFD_ERROR;
+- }
+- }
+- (*appParamsOctetString_val_ptr_len_ptr) =
+- rowreq_ctx->data.appParamsOctetString_len *
+- sizeof(rowreq_ctx->data.appParamsOctetString[0]);
+- memcpy((*appParamsOctetString_val_ptr_ptr),
+- rowreq_ctx->data.appParamsOctetString,
+- rowreq_ctx->data.appParamsOctetString_len *
+- sizeof(rowreq_ctx->data.appParamsOctetString[0]));
+-
+- return MFD_SUCCESS;
+-} /* appParamsOctetString_get */
+-
+-
+-
+-/** @} */
+diff --git a/snmp/dessertAppParamsTable_data_get.h b/snmp/dessertAppParamsTable_data_get.h
+deleted file mode 100644
+index 1e955ee..0000000
+--- a/snmp/dessertAppParamsTable_data_get.h
++++ /dev/null
+@@ -1,136 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 12088 $ of $
+- *
+- * $Id:$
+- *
+- * @file dessertAppParamsTable_data_get.h
+- *
+- * @addtogroup get
+- *
+- * Prototypes for get functions
+- *
+- * @{
+- */
+-#ifndef DESSERTAPPPARAMSTABLE_DATA_GET_H
+-#define DESSERTAPPPARAMSTABLE_DATA_GET_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+- /*
+- *********************************************************************
+- * GET function declarations
+- */
+-
+- /*
+- *********************************************************************
+- * GET Table declarations
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertAppParamsTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+- /*
+- * DESSERT-MIB::dessertAppParamsTable is subid 11 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11, length: 13
+- */
+- /*
+- * indexes
+- */
+- int appParamsIndex_map(long *mib_appParamsIndex_val_ptr,
+- long raw_appParamsIndex_val);
+-
+- int appParamsName_map(char **mib_appParamsName_val_ptr_ptr,
+- size_t
+- *mib_appParamsName_val_ptr_len_ptr,
+- char *raw_appParamsName_val_ptr,
+- size_t raw_appParamsName_val_ptr_len,
+- int allow_realloc);
+- int appParamsName_get(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx,
+- char **appParamsName_val_ptr_ptr,
+- size_t
+- *appParamsName_val_ptr_len_ptr);
+- int appParamsDesc_map(char **mib_appParamsDesc_val_ptr_ptr,
+- size_t
+- *mib_appParamsDesc_val_ptr_len_ptr,
+- char *raw_appParamsDesc_val_ptr,
+- size_t raw_appParamsDesc_val_ptr_len,
+- int allow_realloc);
+- int appParamsDesc_get(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx,
+- char **appParamsDesc_val_ptr_ptr,
+- size_t
+- *appParamsDesc_val_ptr_len_ptr);
+- int appParamsValueType_map(u_long *
+- mib_appParamsValueType_val_ptr,
+- u_long
+- raw_appParamsValueType_val);
+- int appParamsValueType_get(dessertAppParamsTable_rowreq_ctx
+- * rowreq_ctx,
+- u_long *
+- appParamsValueType_val_ptr);
+- int appParamsTruthValue_map(u_long *
+- mib_appParamsTruthValue_val_ptr,
+- u_long
+- raw_appParamsTruthValue_val);
+- int
+- appParamsTruthValue_get(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx,
+- u_long * appParamsTruthValue_val_ptr);
+- int appParamsInteger32_map(long
+- *mib_appParamsInteger32_val_ptr,
+- long
+- raw_appParamsInteger32_val);
+- int appParamsInteger32_get(dessertAppParamsTable_rowreq_ctx
+- * rowreq_ctx,
+- long
+- *appParamsInteger32_val_ptr);
+- int appParamsUnsigned32_map(u_long *
+- mib_appParamsUnsigned32_val_ptr,
+- u_long
+- raw_appParamsUnsigned32_val);
+- int
+- appParamsUnsigned32_get(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx,
+- u_long * appParamsUnsigned32_val_ptr);
+- int appParamsOctetString_map(char
+- **mib_appParamsOctetString_val_ptr_ptr,
+- size_t
+- *mib_appParamsOctetString_val_ptr_len_ptr,
+- char
+- *raw_appParamsOctetString_val_ptr,
+- size_t
+- raw_appParamsOctetString_val_ptr_len,
+- int allow_realloc);
+- int
+- appParamsOctetString_get(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx,
+- char **appParamsOctetString_val_ptr_ptr,
+- size_t
+- *appParamsOctetString_val_ptr_len_ptr);
+-
+-
+- int
+- dessertAppParamsTable_indexes_set_tbl_idx
+- (dessertAppParamsTable_mib_index * tbl_idx,
+- long appParamsIndex_val);
+- int
+- dessertAppParamsTable_indexes_set(dessertAppParamsTable_rowreq_ctx
+- * rowreq_ctx,
+- long appParamsIndex_val);
+-
+-
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTAPPPARAMSTABLE_DATA_GET_H */
+-/** @} */
+diff --git a/snmp/dessertAppParamsTable_data_set.c b/snmp/dessertAppParamsTable_data_set.c
+deleted file mode 100644
+index bdb5e69..0000000
+--- a/snmp/dessertAppParamsTable_data_set.c
++++ /dev/null
+@@ -1,1241 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 12077 $ of $
+- *
+- * $Id:$
+- *
+- */
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertAppParamsTable.h"
+-#include "dessertAppParamsTable_enums.h"
+-#include "../dessert_internal.h"
+-
+-
+-/** @defgroup data_set data_set: Routines to set data
+- *
+- * These routines are used to set the value for individual objects. The
+- * row context is passed, along with the new value.
+- *
+- * @{
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertAppParamsTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+-/*
+- * DESSERT-MIB::dessertAppParamsTable is subid 11 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11, length: 13
+- */
+- /*
+- * NOTE: if you update this chart, please update the versions in
+- * local/mib2c-conf.d/parent-set.m2i
+- * agent/mibgroup/helpers/baby_steps.c
+- * while you're at it.
+- */
+- /*
+- ***********************************************************************
+- * Baby Steps Flow Chart (2004.06.05) *
+- * *
+- * +--------------+ +================+ U = unconditional path *
+- * |optional state| ||required state|| S = path for success *
+- * +--------------+ +================+ E = path for error *
+- ***********************************************************************
+- *
+- * +--------------+
+- * | pre |
+- * | request |
+- * +--------------+
+- * | U
+- * +==============+
+- * +----------------|| object ||
+- * | E || lookup ||
+- * | +==============+
+- * | | S
+- * | +==============+
+- * | E || check ||
+- * |<---------------|| values ||
+- * | +==============+
+- * | | S
+- * | +==============+
+- * | +<-------|| undo ||
+- * | | E || setup ||
+- * | | +==============+
+- * | | | S
+- * | | +==============+
+- * | | || set ||-------------------------->+
+- * | | || value || E |
+- * | | +==============+ |
+- * | | | S |
+- * | | +--------------+ |
+- * | | | check |-------------------------->|
+- * | | | consistency | E |
+- * | | +--------------+ |
+- * | | | S |
+- * | | +==============+ +==============+ |
+- * | | || commit ||-------->|| undo || |
+- * | | || || E || commit || |
+- * | | +==============+ +==============+ |
+- * | | | S U |<--------+
+- * | | +--------------+ +==============+
+- * | | | irreversible | || undo ||
+- * | | | commit | || set ||
+- * | | +--------------+ +==============+
+- * | | | U U |
+- * | +-------------->|<------------------------+
+- * | +==============+
+- * | || undo ||
+- * | || cleanup ||
+- * | +==============+
+- * +---------------------->| U
+- * +--------------+
+- * | post |
+- * | request |
+- * +--------------+
+- *
+- */
+-
+-/**
+- * Setup up context with information needed to undo a set request.
+- *
+- * This function will be called before the individual node undo setup
+- * functions are called. If you need to do any undo setup that is not
+- * related to a specific column, you can do it here.
+- *
+- * Note that the undo context has been allocated with
+- * dessertAppParamsTable_allocate_data(), but may need extra
+- * initialization similar to what you may have done in
+- * dessertAppParamsTable_rowreq_ctx_init().
+- * Note that an individual node's undo_setup function will only be called
+- * if that node is being set to a new value.
+- *
+- * If there is any setup specific to a particular column (e.g. allocating
+- * memory for a string), you should do that setup in the node's undo_setup
+- * function, so it won't be done unless it is necessary.
+- *
+- * @param rowreq_ctx
+- * Pointer to the table context (dessertAppParamsTable_rowreq_ctx)
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_ERROR : error. set will fail.
+- */
+-int
+-dessertAppParamsTable_undo_setup(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx)
+-{
+- int rc = MFD_SUCCESS;
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_undo_setup", "called\n"));
+-
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:451:M: |-> Setup dessertAppParamsTable undo.
+- * set up dessertAppParamsTable undo information, in preparation for a set.
+- * Undo storage is in (* appParamsOctetString_val_ptr_ptr )*
+- */
+-
+- return rc;
+-} /* dessertAppParamsTable_undo_setup */
+-
+-/**
+- * Undo a set request.
+- *
+- * This function will be called before the individual node undo
+- * functions are called. If you need to do any undo that is not
+- * related to a specific column, you can do it here.
+- *
+- * Note that an individual node's undo function will only be called
+- * if that node is being set to a new value.
+- *
+- * If there is anything specific to a particular column (e.g. releasing
+- * memory for a string), you should do that setup in the node's undo
+- * function, so it won't be done unless it is necessary.
+- *
+- * @param rowreq_ctx
+- * Pointer to the table context (dessertAppParamsTable_rowreq_ctx)
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_ERROR : error. set will fail.
+- */
+-int
+-dessertAppParamsTable_undo(dessertAppParamsTable_rowreq_ctx * rowreq_ctx)
+-{
+- int rc = MFD_SUCCESS;
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_undo",
+- "called\n"));
+-
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:451:M: |-> dessertAppParamsTable undo.
+- * dessertAppParamsTable undo information, in response to a failed set.
+- * Undo storage is in (* appParamsOctetString_val_ptr_ptr )*
+- */
+-
+- return rc;
+-} /* dessertAppParamsTable_undo_setup */
+-
+-/**
+- * Cleanup up context undo information.
+- *
+- * This function will be called after set/commit processing. If you
+- * allocated any resources in undo_setup, this is the place to release
+- * those resources.
+- *
+- * This function is called regardless of the success or failure of the set
+- * request. If you need to perform different steps for cleanup depending
+- * on success or failure, you can add a flag to the rowreq_ctx.
+- *
+- * @param rowreq_ctx
+- * Pointer to the table context (dessertAppParamsTable_rowreq_ctx)
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_ERROR : error
+- */
+-int
+-dessertAppParamsTable_undo_cleanup(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx)
+-{
+- int rc = MFD_SUCCESS;
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_undo_cleanup", "called\n"));
+-
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:452:M: |-> Cleanup dessertAppParamsTable undo.
+- * Undo storage is in (* appParamsOctetString_val_ptr_ptr )*
+- */
+-
+- return rc;
+-} /* dessertAppParamsTable_undo_cleanup */
+-
+-/**
+- * commit new values.
+- *
+- * At this point, you should have done everything you can to ensure that
+- * this commit will not fail.
+- *
+- * Should you need different behavior depending on which columns were
+- * set, rowreq_ctx->column_set_flags will indicate which writeable columns were
+- * set. The definitions for the COLUMN_*_FLAG bits can be found in
+- * dessertAppParamsTable_oids.h.
+- * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
+- *
+- * @param dessertAppParamsTable_rowreq_ctx
+- * Pointer to the users context.
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_ERROR : error
+- */
+-int
+-dessertAppParamsTable_commit(dessertAppParamsTable_rowreq_ctx * rowreq_ctx)
+-{
+- int rc = MFD_SUCCESS;
+- int save_flags;
+- dessert_agentx_appparams_t *appparam;
+- dessert_agentx_appparamscb_set_t *set;
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_commit", "called\n"));
+-
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- set = _dessert_agentx_appparams_getsettercbforindex(rowreq_ctx->tbl_idx.appParamsIndex);
+-
+- if (set == NULL) {
+- snmp_log(
+- LOG_ERR,
+- "dessertAppParamsTable commit failed, no setter for index %ld!\n",
+- rowreq_ctx->tbl_idx.appParamsIndex);
+- return MFD_ERROR;
+- }
+-
+- /*
+- * save flags, then clear until we actually do something
+- */
+- save_flags = rowreq_ctx->column_set_flags;
+- rowreq_ctx->column_set_flags = 0;
+-
+- appparam = malloc(sizeof(dessert_agentx_appparams_t));
+-
+- appparam->index = rowreq_ctx->tbl_idx.appParamsIndex;
+- appparam->value_type = rowreq_ctx->data.appParamsValueType;
+-
+- dessert_debug("commit\n"
+- "\n\t\trowreq_ctx->tbl_idx \t[%u]"
+- "\n\t\trowreq_ctx->data.appParamsValueType \t[%u]"
+- "\n\t\trowreq_ctx->data.appParamsTruthValue \t[%u]"
+- "\n\t\trowreq_ctx->data.appParamsInteger32 \t[%d]"
+- "\n\t\trowreq_ctx->data.appParamsUnsigned32 \t[%u]"
+- "\n\t\trowreq_ctx->data.appParamsOctetString_len \t[%u]"
+-
+- "\n",rowreq_ctx->tbl_idx,
+- rowreq_ctx->data.appParamsValueType,
+- rowreq_ctx->data.appParamsTruthValue,
+- rowreq_ctx->data.appParamsInteger32,
+- rowreq_ctx->data.appParamsUnsigned32,
+- rowreq_ctx->data.appParamsOctetString_len
+- );
+-
+- /*
+- * commit dessertAppParamsTable data
+- * 1) check the column's flag in save_flags to see if it was set.
+- * 2) clear the flag when you handle that column
+- * 3) set the column's flag in column_set_flags if it needs undo
+- * processing in case of a failure.
+- */
+- if (save_flags & COLUMN_APPPARAMSTRUTHVALUE_FLAG) {
+- /* clear appParamsTruthValue */
+- save_flags &= ~COLUMN_APPPARAMSTRUTHVALUE_FLAG;
+- /*
+- * commit column appParamsTruthValue.
+- */
+-
+- appparam->bool = rowreq_ctx->data.appParamsTruthValue;
+-
+- rc = set(appparam);
+- if (DESSERT_ERR == rc) {
+- snmp_log(LOG_ERR,
+- "dessertAppParamsTable column appParamsTruthValue commit failed\n");
+- } else {
+- /*
+- * set flag, in case we need to undo appParamsTruthValue
+- */
+- rowreq_ctx->column_set_flags |=
+- COLUMN_APPPARAMSTRUTHVALUE_FLAG;
+- }
+- }
+-
+- if (save_flags & COLUMN_APPPARAMSINTEGER32_FLAG) {
+- /* clear appParamsInteger32 */
+- save_flags &= ~COLUMN_APPPARAMSINTEGER32_FLAG;
+- /*
+- * commit column appParamsInteger32.
+- */
+-
+- appparam->int32 = rowreq_ctx->data.appParamsInteger32;
+-
+- rc = set(appparam);
+- if (DESSERT_ERR == rc) {
+- snmp_log(LOG_ERR,
+- "dessertAppParamsTable column appParamsInteger32 commit failed\n");
+- } else {
+- /*
+- * set flag, in case we need to undo appParamsInteger32
+- */
+- rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSINTEGER32_FLAG;
+- }
+- }
+-
+- if (save_flags & COLUMN_APPPARAMSUNSIGNED32_FLAG) {
+- /* clear appParamsUnsigned32 */
+- save_flags &= ~COLUMN_APPPARAMSUNSIGNED32_FLAG;
+- /*
+- * commit column appParamsUnsigned32.
+- */
+-
+- appparam->uint32 = rowreq_ctx->data.appParamsUnsigned32;
+-
+- rc = set(appparam);
+- if (DESSERT_ERR == rc) {
+- snmp_log(LOG_ERR,
+- "dessertAppParamsTable column appParamsUnsigned32 commit failed\n");
+- } else {
+- /*
+- * set flag, in case we need to undo appParamsUnsigned32
+- */
+- rowreq_ctx->column_set_flags |=
+- COLUMN_APPPARAMSUNSIGNED32_FLAG;
+- }
+- }
+-
+- if (save_flags & COLUMN_APPPARAMSOCTETSTRING_FLAG) {
+- /* clear appParamsOctetString */
+- save_flags &= ~COLUMN_APPPARAMSOCTETSTRING_FLAG;
+- /*
+- * TODO:482:o: |-> commit column appParamsOctetString.
+- */
+-
+- appparam->octetstring_len = rowreq_ctx->data.appParamsOctetString_len;
+- appparam->octetstring = malloc(sizeof(char) * appparam->octetstring_len);
+- memcpy(appparam->octetstring, rowreq_ctx->data.appParamsOctetString, rowreq_ctx->data.appParamsOctetString_len * sizeof(rowreq_ctx->data.appParamsOctetString[0]));
+-
+- rc = set(appparam);
+- if (DESSERT_ERR == rc) {
+- snmp_log(LOG_ERR,
+- "dessertAppParamsTable column appParamsOctetString commit failed\n");
+- } else {
+- /*
+- * set flag, in case we need to undo appParamsOctetString
+- */
+- dessert_debug("dessertAppParamsTable column appParamsOctetString commited");
+- rowreq_ctx->column_set_flags |=
+- COLUMN_APPPARAMSOCTETSTRING_FLAG;
+- }
+- }
+-
+- if (rc == DESSERT_ERR) rc = -1; else {rc = MFD_SUCCESS;}
+-
+- /*
+- * if we successfully committed this row, set the dirty flag.
+- */
+- if (MFD_SUCCESS == rc) {
+- rowreq_ctx->rowreq_flags |= MFD_ROW_DIRTY;
+- }
+-
+- if (save_flags) {
+- snmp_log(LOG_ERR, "unhandled columns (0x%x) in commit\n",
+- save_flags);
+- return MFD_ERROR;
+- }
+-
+- _dessert_agentx_appparams_free(appparam);
+-
+- return rc;
+-} /* dessertAppParamsTable_commit */
+-
+-/**
+- * undo commit new values.
+- *
+- * Should you need different behavior depending on which columns were
+- * set, rowreq_ctx->column_set_flags will indicate which writeable columns were
+- * set. The definitions for the COLUMN_*_FLAG bits can be found in
+- * dessertAppParamsTable_oids.h.
+- * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
+- *
+- * @param dessertAppParamsTable_rowreq_ctx
+- * Pointer to the users context.
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_ERROR : error
+- */
+-int
+-dessertAppParamsTable_undo_commit(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx)
+-{
+- int rc = MFD_SUCCESS;
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_undo_commit", "called\n"));
+-
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:485:M: |-> Undo dessertAppParamsTable commit.
+- * check the column's flag in rowreq_ctx->column_set_flags to see
+- * if it was set during commit, then undo it.
+- *
+- * eg: if (rowreq_ctx->column_set_flags & COLUMN__FLAG) {}
+- */
+-
+-
+- /*
+- * if we successfully un-commited this row, clear the dirty flag.
+- */
+- if (MFD_SUCCESS == rc) {
+- rowreq_ctx->rowreq_flags &= ~MFD_ROW_DIRTY;
+- }
+-
+- return rc;
+-} /* dessertAppParamsTable_undo_commit */
+-
+-/*
+- * TODO:440:M: Implement dessertAppParamsTable node value checks.
+- * TODO:450:M: Implement dessertAppParamsTable undo functions.
+- * TODO:460:M: Implement dessertAppParamsTable set functions.
+- * TODO:480:M: Implement dessertAppParamsTable commit functions.
+- */
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppParamsEntry.appParamsTruthValue
+- * appParamsTruthValue is subid 5 of dessertAppParamsEntry.
+- * Its status is Current, and its access level is ReadWrite.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.5
+- * Description:
+-A parameter with TruthValue semantics.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 1 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 1
+- *
+- * Enum range: 2/8. Values: true(1), false(2)
+- *
+- * Its syntax is TruthValue (based on perltype INTEGER)
+- * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
+- */
+-/**
+- * Check that the proposed new value is potentially valid.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appParamsTruthValue_val
+- * A long containing the new value.
+- *
+- * @retval MFD_SUCCESS : incoming value is legal
+- * @retval MFD_NOT_VALID_NOW : incoming value is not valid now
+- * @retval MFD_NOT_VALID_EVER : incoming value is never valid
+- *
+- * This is the place to check for requirements that are not
+- * expressed in the mib syntax (for example, a requirement that
+- * is detailed in the description for an object).
+- *
+- * You should check that the requested change between the undo value and the
+- * new value is legal (ie, the transistion from one value to another
+- * is legal).
+- *
+- *@note
+- * This check is only to determine if the new value
+- * is \b potentially valid. This is the first check of many, and
+- * is one of the simplest ones.
+- *
+- *@note
+- * this is not the place to do any checks for values
+- * which depend on some other value in the mib. Those
+- * types of checks should be done in the
+- * dessertAppParamsTable_check_dependencies() function.
+- *
+- * The following checks have already been done for you:
+- * The syntax is ASN_INTEGER
+- * The value is one of true(1), false(2)
+- *
+- * If there a no other checks you need to do, simply return MFD_SUCCESS.
+- *
+- */
+-int
+-appParamsTruthValue_check_value(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx, u_long appParamsTruthValue_val)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsTruthValue_check_value", "called\n"));
+-
+- /** should never get a NULL pointer */
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * Check for valid appParamsTruthValue value.
+- */
+-
+- if (rowreq_ctx->data.appParamsValueType != DESSERT_APPPARAMS_VALUETYPE_BOOL) {
+-
+- return MFD_NOT_VALID_EVER;
+- } else {
+-
+- return MFD_SUCCESS; /* appParamsTruthValue value not illegal */
+- }
+-} /* appParamsTruthValue_check_value */
+-
+-/**
+- * Save old value information
+- *
+- * @param rowreq_ctx
+- * Pointer to the table context (dessertAppParamsTable_rowreq_ctx)
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_ERROR : error. set will fail.
+- *
+- * This function will be called after the table level undo setup function
+- * dessertAppParamsTable_undo_setup has been called.
+- *
+- *@note
+- * this function will only be called if a new value is set for this column.
+- *
+- * If there is any setup specific to a particular column (e.g. allocating
+- * memory for a string), you should do that setup in this function, so it
+- * won't be done unless it is necessary.
+- */
+-int
+-appParamsTruthValue_undo_setup(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsTruthValue_undo_setup", "called\n"));
+-
+- /** should never get a NULL pointer */
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:455:o: |-> Setup appParamsTruthValue undo.
+- */
+- /*
+- * copy appParamsTruthValue data
+- * set rowreq_ctx->undo->appParamsTruthValue from rowreq_ctx->data.appParamsTruthValue
+- */
+- rowreq_ctx->undo->appParamsTruthValue =
+- rowreq_ctx->data.appParamsTruthValue;
+-
+-
+- return MFD_SUCCESS;
+-} /* appParamsTruthValue_undo_setup */
+-
+-/**
+- * Set the new value.
+- *
+- * @param rowreq_ctx
+- * Pointer to the users context. You should know how to
+- * manipulate the value from this object.
+- * @param appParamsTruthValue_val
+- * A long containing the new value.
+- */
+-int
+-appParamsTruthValue_set(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
+- u_long appParamsTruthValue_val)
+-{
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsTruthValue_set",
+- "called\n"));
+-
+- /** should never get a NULL pointer */
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:245:o: |-> Implement appParamsTruthValue reverse mapping.
+- * If the values for your data type don't exactly match the
+- * possible values defined by the mib, you should map them here.
+- */
+- /*
+- ***************************************************
+- *** START EXAMPLE CODE ***
+- ***---------------------------------------------***/
+- switch (appParamsTruthValue_val) {
+- case TRUTHVALUE_TRUE:
+- rowreq_ctx->data.appParamsTruthValue =
+- INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSTRUTHVALUE_TRUE;
+- break;
+-
+- case TRUTHVALUE_FALSE:
+- rowreq_ctx->data.appParamsTruthValue =
+- INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSTRUTHVALUE_FALSE;
+- break;
+-
+- default:
+- snmp_log(LOG_ERR,
+- "couldn't reverse map value %ld for appParamsTruthValue\n",
+- appParamsTruthValue_val);
+- return SNMP_ERR_GENERR;
+- }
+- /*
+- ***---------------------------------------------***
+- *** END EXAMPLE CODE ***
+- ***************************************************/
+-
+- return MFD_SUCCESS;
+-} /* appParamsTruthValue_set */
+-
+-/**
+- * undo the previous set.
+- *
+- * @param rowreq_ctx
+- * Pointer to the users context.
+- */
+-int
+-appParamsTruthValue_undo(dessertAppParamsTable_rowreq_ctx * rowreq_ctx)
+-{
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsTruthValue_undo",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:456:o: |-> Clean up appParamsTruthValue undo.
+- */
+- /*
+- * copy appParamsTruthValue data
+- * set rowreq_ctx->data.appParamsTruthValue from rowreq_ctx->undo->appParamsTruthValue
+- */
+- rowreq_ctx->data.appParamsTruthValue =
+- rowreq_ctx->undo->appParamsTruthValue;
+-
+-
+- return MFD_SUCCESS;
+-} /* appParamsTruthValue_undo */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppParamsEntry.appParamsInteger32
+- * appParamsInteger32 is subid 6 of dessertAppParamsEntry.
+- * Its status is Current, and its access level is ReadWrite.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.6
+- * Description:
+-A parameter with Integer32 semantics.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 1
+- *
+- *
+- * Its syntax is INTEGER32 (based on perltype INTEGER32)
+- * The net-snmp type is ASN_INTEGER. The C type decl is long (long)
+- */
+-/**
+- * Check that the proposed new value is potentially valid.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appParamsInteger32_val
+- * A long containing the new value.
+- *
+- * @retval MFD_SUCCESS : incoming value is legal
+- * @retval MFD_NOT_VALID_NOW : incoming value is not valid now
+- * @retval MFD_NOT_VALID_EVER : incoming value is never valid
+- *
+- * This is the place to check for requirements that are not
+- * expressed in the mib syntax (for example, a requirement that
+- * is detailed in the description for an object).
+- *
+- * You should check that the requested change between the undo value and the
+- * new value is legal (ie, the transistion from one value to another
+- * is legal).
+- *
+- *@note
+- * This check is only to determine if the new value
+- * is \b potentially valid. This is the first check of many, and
+- * is one of the simplest ones.
+- *
+- *@note
+- * this is not the place to do any checks for values
+- * which depend on some other value in the mib. Those
+- * types of checks should be done in the
+- * dessertAppParamsTable_check_dependencies() function.
+- *
+- * The following checks have already been done for you:
+- * The syntax is ASN_INTEGER
+- *
+- * If there a no other checks you need to do, simply return MFD_SUCCESS.
+- *
+- */
+-int
+-appParamsInteger32_check_value(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx, long appParamsInteger32_val)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsInteger32_check_value", "called\n"));
+-
+- /** should never get a NULL pointer */
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * Check for valid appParamsInteger32 value.
+- */
+-
+- dessert_debug("check_value\n\t\trowreq_ctx->data.appParamsValueType [%d]",rowreq_ctx->data.appParamsValueType);
+- if (rowreq_ctx->data.appParamsValueType != DESSERT_APPPARAMS_VALUETYPE_INT32) {
+-
+- return MFD_NOT_VALID_EVER;
+- } else {
+-
+- return MFD_SUCCESS; /* appParamsInteger32 value not illegal */
+- }
+-} /* appParamsInteger32_check_value */
+-
+-/**
+- * Save old value information
+- *
+- * @param rowreq_ctx
+- * Pointer to the table context (dessertAppParamsTable_rowreq_ctx)
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_ERROR : error. set will fail.
+- *
+- * This function will be called after the table level undo setup function
+- * dessertAppParamsTable_undo_setup has been called.
+- *
+- *@note
+- * this function will only be called if a new value is set for this column.
+- *
+- * If there is any setup specific to a particular column (e.g. allocating
+- * memory for a string), you should do that setup in this function, so it
+- * won't be done unless it is necessary.
+- */
+-int
+-appParamsInteger32_undo_setup(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsInteger32_undo_setup", "called\n"));
+-
+- /** should never get a NULL pointer */
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:455:o: |-> Setup appParamsInteger32 undo.
+- */
+- /*
+- * copy appParamsInteger32 data
+- * set rowreq_ctx->undo->appParamsInteger32 from rowreq_ctx->data.appParamsInteger32
+- */
+- rowreq_ctx->undo->appParamsInteger32 =
+- rowreq_ctx->data.appParamsInteger32;
+-
+-
+- return MFD_SUCCESS;
+-} /* appParamsInteger32_undo_setup */
+-
+-/**
+- * Set the new value.
+- *
+- * @param rowreq_ctx
+- * Pointer to the users context. You should know how to
+- * manipulate the value from this object.
+- * @param appParamsInteger32_val
+- * A long containing the new value.
+- */
+-int
+-appParamsInteger32_set(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
+- long appParamsInteger32_val)
+-{
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsInteger32_set",
+- "called\n"));
+-
+- /** should never get a NULL pointer */
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:245:o: |-> Implement appParamsInteger32 reverse mapping.
+- * If the values for your data type don't exactly match the
+- * possible values defined by the mib, you should map them here.
+- */
+- /*
+- * TODO:461:M: |-> Set appParamsInteger32 value.
+- * set appParamsInteger32 value in rowreq_ctx->data
+- */
+- rowreq_ctx->data.appParamsInteger32 = appParamsInteger32_val;
+-
+-
+- return MFD_SUCCESS;
+-} /* appParamsInteger32_set */
+-
+-/**
+- * undo the previous set.
+- *
+- * @param rowreq_ctx
+- * Pointer to the users context.
+- */
+-int
+-appParamsInteger32_undo(dessertAppParamsTable_rowreq_ctx * rowreq_ctx)
+-{
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsInteger32_undo",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:456:o: |-> Clean up appParamsInteger32 undo.
+- */
+- /*
+- * copy appParamsInteger32 data
+- * set rowreq_ctx->data.appParamsInteger32 from rowreq_ctx->undo->appParamsInteger32
+- */
+- rowreq_ctx->data.appParamsInteger32 =
+- rowreq_ctx->undo->appParamsInteger32;
+-
+-
+- return MFD_SUCCESS;
+-} /* appParamsInteger32_undo */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppParamsEntry.appParamsUnsigned32
+- * appParamsUnsigned32 is subid 7 of dessertAppParamsEntry.
+- * Its status is Current, and its access level is ReadWrite.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.7
+- * Description:
+-A parameter with Unsigned32 semantics.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 1
+- *
+- *
+- * Its syntax is UNSIGNED32 (based on perltype UNSIGNED32)
+- * The net-snmp type is ASN_UNSIGNED. The C type decl is u_long (u_long)
+- */
+-/**
+- * Check that the proposed new value is potentially valid.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appParamsUnsigned32_val
+- * A u_long containing the new value.
+- *
+- * @retval MFD_SUCCESS : incoming value is legal
+- * @retval MFD_NOT_VALID_NOW : incoming value is not valid now
+- * @retval MFD_NOT_VALID_EVER : incoming value is never valid
+- *
+- * This is the place to check for requirements that are not
+- * expressed in the mib syntax (for example, a requirement that
+- * is detailed in the description for an object).
+- *
+- * You should check that the requested change between the undo value and the
+- * new value is legal (ie, the transistion from one value to another
+- * is legal).
+- *
+- *@note
+- * This check is only to determine if the new value
+- * is \b potentially valid. This is the first check of many, and
+- * is one of the simplest ones.
+- *
+- *@note
+- * this is not the place to do any checks for values
+- * which depend on some other value in the mib. Those
+- * types of checks should be done in the
+- * dessertAppParamsTable_check_dependencies() function.
+- *
+- * The following checks have already been done for you:
+- * The syntax is ASN_UNSIGNED
+- *
+- * If there a no other checks you need to do, simply return MFD_SUCCESS.
+- *
+- */
+-int
+-appParamsUnsigned32_check_value(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx, u_long appParamsUnsigned32_val)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsUnsigned32_check_value", "called\n"));
+-
+- /** should never get a NULL pointer */
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:441:o: |-> Check for valid appParamsUnsigned32 value.
+- */
+- if (rowreq_ctx->data.appParamsValueType != DESSERT_APPPARAMS_VALUETYPE_UINT32) {
+-
+- return MFD_NOT_VALID_EVER;
+- } else {
+-
+- return MFD_SUCCESS; /* appParamsUnsigned32 value not illegal */
+- }
+-} /* appParamsUnsigned32_check_value */
+-
+-/**
+- * Save old value information
+- *
+- * @param rowreq_ctx
+- * Pointer to the table context (dessertAppParamsTable_rowreq_ctx)
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_ERROR : error. set will fail.
+- *
+- * This function will be called after the table level undo setup function
+- * dessertAppParamsTable_undo_setup has been called.
+- *
+- *@note
+- * this function will only be called if a new value is set for this column.
+- *
+- * If there is any setup specific to a particular column (e.g. allocating
+- * memory for a string), you should do that setup in this function, so it
+- * won't be done unless it is necessary.
+- */
+-int
+-appParamsUnsigned32_undo_setup(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsUnsigned32_undo_setup", "called\n"));
+-
+- /** should never get a NULL pointer */
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:455:o: |-> Setup appParamsUnsigned32 undo.
+- */
+- /*
+- * copy appParamsUnsigned32 data
+- * set rowreq_ctx->undo->appParamsUnsigned32 from rowreq_ctx->data.appParamsUnsigned32
+- */
+- rowreq_ctx->undo->appParamsUnsigned32 =
+- rowreq_ctx->data.appParamsUnsigned32;
+-
+-
+- return MFD_SUCCESS;
+-} /* appParamsUnsigned32_undo_setup */
+-
+-/**
+- * Set the new value.
+- *
+- * @param rowreq_ctx
+- * Pointer to the users context. You should know how to
+- * manipulate the value from this object.
+- * @param appParamsUnsigned32_val
+- * A u_long containing the new value.
+- */
+-int
+-appParamsUnsigned32_set(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
+- u_long appParamsUnsigned32_val)
+-{
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsUnsigned32_set",
+- "called\n"));
+-
+- /** should never get a NULL pointer */
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:245:o: |-> Implement appParamsUnsigned32 reverse mapping.
+- * If the values for your data type don't exactly match the
+- * possible values defined by the mib, you should map them here.
+- */
+- /*
+- * TODO:461:M: |-> Set appParamsUnsigned32 value.
+- * set appParamsUnsigned32 value in rowreq_ctx->data
+- */
+- rowreq_ctx->data.appParamsUnsigned32 = appParamsUnsigned32_val;
+-
+-
+- return MFD_SUCCESS;
+-} /* appParamsUnsigned32_set */
+-
+-/**
+- * undo the previous set.
+- *
+- * @param rowreq_ctx
+- * Pointer to the users context.
+- */
+-int
+-appParamsUnsigned32_undo(dessertAppParamsTable_rowreq_ctx * rowreq_ctx)
+-{
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsUnsigned32_undo",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:456:o: |-> Clean up appParamsUnsigned32 undo.
+- */
+- /*
+- * copy appParamsUnsigned32 data
+- * set rowreq_ctx->data.appParamsUnsigned32 from rowreq_ctx->undo->appParamsUnsigned32
+- */
+- rowreq_ctx->data.appParamsUnsigned32 =
+- rowreq_ctx->undo->appParamsUnsigned32;
+-
+-
+- return MFD_SUCCESS;
+-} /* appParamsUnsigned32_undo */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppParamsEntry.appParamsOctetString
+- * appParamsOctetString is subid 9 of dessertAppParamsEntry.
+- * Its status is Current, and its access level is ReadWrite.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.9
+- * Description:
+-A parameter containing of up to 1024 octets.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 1 hashint 1
+- * settable 1
+- * hint: 1024a
+- *
+- * Ranges: 0 - 1024;
+- *
+- * Its syntax is DessertApplicationOctetString (based on perltype OCTETSTR)
+- * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+- * This data type requires a length. (Max 1024)
+- */
+-/**
+- * Check that the proposed new value is potentially valid.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appParamsOctetString_val_ptr
+- * A char containing the new value.
+- * @param appParamsOctetString_val_ptr_len
+- * The size (in bytes) of the data pointed to by appParamsOctetString_val_ptr
+- *
+- * @retval MFD_SUCCESS : incoming value is legal
+- * @retval MFD_NOT_VALID_NOW : incoming value is not valid now
+- * @retval MFD_NOT_VALID_EVER : incoming value is never valid
+- *
+- * This is the place to check for requirements that are not
+- * expressed in the mib syntax (for example, a requirement that
+- * is detailed in the description for an object).
+- *
+- * You should check that the requested change between the undo value and the
+- * new value is legal (ie, the transistion from one value to another
+- * is legal).
+- *
+- *@note
+- * This check is only to determine if the new value
+- * is \b potentially valid. This is the first check of many, and
+- * is one of the simplest ones.
+- *
+- *@note
+- * this is not the place to do any checks for values
+- * which depend on some other value in the mib. Those
+- * types of checks should be done in the
+- * dessertAppParamsTable_check_dependencies() function.
+- *
+- * The following checks have already been done for you:
+- * The syntax is ASN_OCTET_STR
+- * The length is < sizeof(rowreq_ctx->data.appParamsOctetString).
+- * The length is in (one of) the range set(s): 0 - 1024
+- *
+- * If there a no other checks you need to do, simply return MFD_SUCCESS.
+- *
+- */
+-int
+-appParamsOctetString_check_value(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx,
+- char *appParamsOctetString_val_ptr,
+- size_t appParamsOctetString_val_ptr_len)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsOctetString_check_value", "called\n"));
+-
+- /** should never get a NULL pointer */
+- netsnmp_assert(NULL != rowreq_ctx);
+- netsnmp_assert(NULL != appParamsOctetString_val_ptr);
+-
+- /*
+- * TODO:441:o: |-> Check for valid appParamsOctetString value.
+- */
+- if (rowreq_ctx->data.appParamsValueType != DESSERT_APPPARAMS_VALUETYPE_OCTETSTRING) {
+-
+- return MFD_NOT_VALID_EVER;
+- } else {
+-
+- return MFD_SUCCESS; /* appParamsOctetString value not illegal */
+- }
+-} /* appParamsOctetString_check_value */
+-
+-/**
+- * Save old value information
+- *
+- * @param rowreq_ctx
+- * Pointer to the table context (dessertAppParamsTable_rowreq_ctx)
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_ERROR : error. set will fail.
+- *
+- * This function will be called after the table level undo setup function
+- * dessertAppParamsTable_undo_setup has been called.
+- *
+- *@note
+- * this function will only be called if a new value is set for this column.
+- *
+- * If there is any setup specific to a particular column (e.g. allocating
+- * memory for a string), you should do that setup in this function, so it
+- * won't be done unless it is necessary.
+- */
+-int
+-appParamsOctetString_undo_setup(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsOctetString_undo_setup", "called\n"));
+-
+- /** should never get a NULL pointer */
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:455:o: |-> Setup appParamsOctetString undo.
+- */
+- /*
+- * copy appParamsOctetString and appParamsOctetString_len data
+- * set rowreq_ctx->undo->appParamsOctetString from rowreq_ctx->data.appParamsOctetString
+- */
+- memcpy(rowreq_ctx->undo->appParamsOctetString,
+- rowreq_ctx->data.appParamsOctetString,
+- (rowreq_ctx->data.appParamsOctetString_len *
+- sizeof(rowreq_ctx->undo->appParamsOctetString[0])));
+- rowreq_ctx->undo->appParamsOctetString_len =
+- rowreq_ctx->data.appParamsOctetString_len;
+-
+-
+- return MFD_SUCCESS;
+-} /* appParamsOctetString_undo_setup */
+-
+-/**
+- * Set the new value.
+- *
+- * @param rowreq_ctx
+- * Pointer to the users context. You should know how to
+- * manipulate the value from this object.
+- * @param appParamsOctetString_val_ptr
+- * A char containing the new value.
+- * @param appParamsOctetString_val_ptr_len
+- * The size (in bytes) of the data pointed to by appParamsOctetString_val_ptr
+- */
+-int
+-appParamsOctetString_set(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
+- char *appParamsOctetString_val_ptr,
+- size_t appParamsOctetString_val_ptr_len)
+-{
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsOctetString_set",
+- "called\n"));
+-
+- /** should never get a NULL pointer */
+- netsnmp_assert(NULL != rowreq_ctx);
+- netsnmp_assert(NULL != appParamsOctetString_val_ptr);
+-
+- /*
+- * TODO:245:o: |-> Implement appParamsOctetString reverse mapping.
+- * If the values for your data type don't exactly match the
+- * possible values defined by the mib, you should map them here.
+- */
+- /*
+- * TODO:461:M: |-> Set appParamsOctetString value.
+- * set appParamsOctetString value in rowreq_ctx->data
+- */
+- memcpy(rowreq_ctx->data.appParamsOctetString,
+- appParamsOctetString_val_ptr, appParamsOctetString_val_ptr_len);
+- /** convert bytes to number of char */
+- rowreq_ctx->data.appParamsOctetString_len =
+- appParamsOctetString_val_ptr_len /
+- sizeof(appParamsOctetString_val_ptr[0]);
+-
+-
+- return MFD_SUCCESS;
+-} /* appParamsOctetString_set */
+-
+-/**
+- * undo the previous set.
+- *
+- * @param rowreq_ctx
+- * Pointer to the users context.
+- */
+-int
+-appParamsOctetString_undo(dessertAppParamsTable_rowreq_ctx * rowreq_ctx)
+-{
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsOctetString_undo",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:456:o: |-> Clean up appParamsOctetString undo.
+- */
+- /*
+- * copy appParamsOctetString and appParamsOctetString_len data
+- * set rowreq_ctx->data.appParamsOctetString from rowreq_ctx->undo->appParamsOctetString
+- */
+- memcpy(rowreq_ctx->data.appParamsOctetString,
+- rowreq_ctx->undo->appParamsOctetString,
+- (rowreq_ctx->undo->appParamsOctetString_len *
+- sizeof(rowreq_ctx->data.appParamsOctetString[0])));
+- rowreq_ctx->data.appParamsOctetString_len =
+- rowreq_ctx->undo->appParamsOctetString_len;
+-
+-
+- return MFD_SUCCESS;
+-} /* appParamsOctetString_undo */
+-
+-/** @} */
+diff --git a/snmp/dessertAppParamsTable_data_set.h b/snmp/dessertAppParamsTable_data_set.h
+deleted file mode 100644
+index 588437a..0000000
+--- a/snmp/dessertAppParamsTable_data_set.h
++++ /dev/null
+@@ -1,168 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 12077 $ of $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTAPPPARAMSTABLE_DATA_SET_H
+-#define DESSERTAPPPARAMSTABLE_DATA_SET_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+- /*
+- *********************************************************************
+- * SET function declarations
+- */
+-
+- /*
+- *********************************************************************
+- * SET Table declarations
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertAppParamsTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+- /*
+- * DESSERT-MIB::dessertAppParamsTable is subid 11 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11, length: 13
+- */
+-
+-
+- int
+- dessertAppParamsTable_undo_setup(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+- int
+- dessertAppParamsTable_undo_cleanup(dessertAppParamsTable_rowreq_ctx
+- * rowreq_ctx);
+- int
+- dessertAppParamsTable_undo(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+- int
+- dessertAppParamsTable_commit(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+- int
+- dessertAppParamsTable_undo_commit(dessertAppParamsTable_rowreq_ctx
+- * rowreq_ctx);
+-
+-
+- int
+- appParamsName_check_value(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx, char *appParamsName_val_ptr,
+- size_t appParamsName_val_ptr_len);
+- int
+- appParamsName_undo_setup(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+- int appParamsName_set(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx,
+- char *appParamsName_val_ptr,
+- size_t appParamsName_val_ptr_len);
+- int appParamsName_undo(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+-
+- int
+- appParamsDesc_check_value(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx, char *appParamsDesc_val_ptr,
+- size_t appParamsDesc_val_ptr_len);
+- int
+- appParamsDesc_undo_setup(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+- int appParamsDesc_set(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx,
+- char *appParamsDesc_val_ptr,
+- size_t appParamsDesc_val_ptr_len);
+- int appParamsDesc_undo(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+-
+- int
+- appParamsValueType_check_value(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx,
+- u_long appParamsValueType_val);
+- int
+- appParamsValueType_undo_setup(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+- int appParamsValueType_set(dessertAppParamsTable_rowreq_ctx
+- * rowreq_ctx,
+- u_long appParamsValueType_val);
+- int
+- appParamsValueType_undo(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+-
+- int
+- appParamsTruthValue_check_value(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx,
+- u_long appParamsTruthValue_val);
+- int
+- appParamsTruthValue_undo_setup(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+- int
+- appParamsTruthValue_set(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx,
+- u_long appParamsTruthValue_val);
+- int
+- appParamsTruthValue_undo(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+-
+- int
+- appParamsInteger32_check_value(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx,
+- long appParamsInteger32_val);
+- int
+- appParamsInteger32_undo_setup(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+- int appParamsInteger32_set(dessertAppParamsTable_rowreq_ctx
+- * rowreq_ctx,
+- long appParamsInteger32_val);
+- int
+- appParamsInteger32_undo(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+-
+- int
+- appParamsUnsigned32_check_value(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx,
+- u_long appParamsUnsigned32_val);
+- int
+- appParamsUnsigned32_undo_setup(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+- int
+- appParamsUnsigned32_set(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx,
+- u_long appParamsUnsigned32_val);
+- int
+- appParamsUnsigned32_undo(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+-
+- int
+- appParamsOctetString_check_value(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx,
+- char
+- *appParamsOctetString_val_ptr,
+- size_t
+- appParamsOctetString_val_ptr_len);
+- int
+- appParamsOctetString_undo_setup(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+- int
+- appParamsOctetString_set(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx,
+- char *appParamsOctetString_val_ptr,
+- size_t appParamsOctetString_val_ptr_len);
+- int
+- appParamsOctetString_undo(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx);
+-
+-
+- int
+- dessertAppParamsTable_check_dependencies
+- (dessertAppParamsTable_rowreq_ctx * ctx);
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTAPPPARAMSTABLE_DATA_SET_H */
+diff --git a/snmp/dessertAppParamsTable_enums.h b/snmp/dessertAppParamsTable_enums.h
+deleted file mode 100644
+index bd8d852..0000000
+--- a/snmp/dessertAppParamsTable_enums.h
++++ /dev/null
+@@ -1,93 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * : generic-table-enums.m2c 12526 2005-07-15 22:41:16Z rstory $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTAPPPARAMSTABLE_ENUMS_H
+-#define DESSERTAPPPARAMSTABLE_ENUMS_H
+-
+-#include "../dessert.h"
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+- /*
+- * NOTES on enums
+- * ==============
+- *
+- * Value Mapping
+- * -------------
+- * If the values for your data type don't exactly match the
+- * possible values defined by the mib, you should map them
+- * below. For example, a boolean flag (1/0) is usually represented
+- * as a TruthValue in a MIB, which maps to the values (1/2).
+- *
+- */
+-/*************************************************************************
+- *************************************************************************
+- *
+- * enum definitions for table dessertAppParamsTable
+- *
+- *************************************************************************
+- *************************************************************************/
+-
+-/*************************************************************
+- * constants for enums for the MIB node
+- * appParamsValueType (DessertAppValueType / ASN_INTEGER)
+- *
+- * since a Textual Convention may be referenced more than once in a
+- * MIB, protect againt redefinitions of the enum values.
+- */
+-#ifndef DESSERTAPPVALUETYPE_ENUMS
+-#define DESSERTAPPVALUETYPE_ENUMS
+-
+-#define DESSERTAPPVALUETYPE_BOOL 0
+-#define DESSERTAPPVALUETYPE_INT32 1
+-#define DESSERTAPPVALUETYPE_UINT32 2
+-#define DESSERTAPPVALUETYPE_COUNTER64 3
+-#define DESSERTAPPVALUETYPE_OCTETSTRING 4
+-
+-#endif /* DESSERTAPPVALUETYPE_ENUMS */
+-
+- /*
+- * TODO:140:o: Define your interal representation of appParamsValueType enums.
+- * (used for value mapping; see notes at top of file)
+- */
+-#define INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_BOOL DESSERT_APPPARAMS_VALUETYPE_BOOL
+-#define INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_INT32 DESSERT_APPPARAMS_VALUETYPE_INT32
+-#define INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_UINT32 DESSERT_APPPARAMS_VALUETYPE_UINT32
+-#define INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_COUNTER64 DESSERT_APPPARAMS_VALUETYPE_COUNTER64
+-#define INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_OCTETSTRING DESSERT_APPPARAMS_VALUETYPE_OCTETSTRING
+-
+-
+-/*************************************************************
+- * constants for enums for the MIB node
+- * appParamsTruthValue (TruthValue / ASN_INTEGER)
+- *
+- * since a Textual Convention may be referenced more than once in a
+- * MIB, protect againt redefinitions of the enum values.
+- */
+-#ifndef TRUTHVALUE_ENUMS
+-#define TRUTHVALUE_ENUMS
+-
+-#define TRUTHVALUE_TRUE 1
+-#define TRUTHVALUE_FALSE 2
+-
+-#endif /* TRUTHVALUE_ENUMS */
+-
+- /*
+- * TODO:140:o: Define your interal representation of appParamsTruthValue enums.
+- * (used for value mapping; see notes at top of file)
+- */
+-#define INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSTRUTHVALUE_TRUE DESSERT_APPPARAMS_BOOL_TRUE
+-#define INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSTRUTHVALUE_FALSE DESSERT_APPPARAMS_BOOL_FALSE
+-
+-
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTAPPPARAMSTABLE_ENUMS_H */
+diff --git a/snmp/dessertAppParamsTable_interface.c b/snmp/dessertAppParamsTable_interface.c
+deleted file mode 100644
+index 4fc55e5..0000000
+--- a/snmp/dessertAppParamsTable_interface.c
++++ /dev/null
+@@ -1,1843 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 15899 $ of $
+- *
+- * $Id:$
+- */
+-/*
+- * *********************************************************************
+- * *********************************************************************
+- * *********************************************************************
+- * *** ***
+- * *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
+- * *** ***
+- * *** ***
+- * *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
+- * *** ***
+- * *** ***
+- * *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
+- * *** ***
+- * *** ***
+- * *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
+- * *** ***
+- * *** ***
+- * *********************************************************************
+- * *********************************************************************
+- * *********************************************************************
+- */
+-
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertAppParamsTable.h"
+-
+-
+-#include <net-snmp/agent/table_container.h>
+-#include <net-snmp/library/container.h>
+-
+-#include "dessertAppParamsTable_interface.h"
+-
+-#include <ctype.h>
+-
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertAppParamsTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+-/*
+- * DESSERT-MIB::dessertAppParamsTable is subid 11 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11, length: 13
+- */
+-typedef struct dessertAppParamsTable_interface_ctx_s {
+-
+- netsnmp_container *container;
+- netsnmp_cache *cache;
+-
+- dessertAppParamsTable_registration *user_ctx;
+-
+- netsnmp_table_registration_info tbl_info;
+-
+- netsnmp_baby_steps_access_methods access_multiplexer;
+-
+- u_int table_dirty;
+-
+-} dessertAppParamsTable_interface_ctx;
+-
+-static dessertAppParamsTable_interface_ctx dessertAppParamsTable_if_ctx;
+-
+-static void
+-_dessertAppParamsTable_container_init(dessertAppParamsTable_interface_ctx *
+- if_ctx);
+-static void
+-_dessertAppParamsTable_container_shutdown
+-(dessertAppParamsTable_interface_ctx * if_ctx);
+-
+-
+-netsnmp_container *
+-dessertAppParamsTable_container_get(void)
+-{
+- return dessertAppParamsTable_if_ctx.container;
+-}
+-
+-dessertAppParamsTable_registration *
+-dessertAppParamsTable_registration_get(void)
+-{
+- return dessertAppParamsTable_if_ctx.user_ctx;
+-}
+-
+-dessertAppParamsTable_registration *
+-dessertAppParamsTable_registration_set(dessertAppParamsTable_registration *
+- newreg)
+-{
+- dessertAppParamsTable_registration *old =
+- dessertAppParamsTable_if_ctx.user_ctx;
+- dessertAppParamsTable_if_ctx.user_ctx = newreg;
+- return old;
+-}
+-
+-int
+-dessertAppParamsTable_container_size(void)
+-{
+- return CONTAINER_SIZE(dessertAppParamsTable_if_ctx.container);
+-}
+-
+-u_int
+-dessertAppParamsTable_dirty_get(void)
+-{
+- return dessertAppParamsTable_if_ctx.table_dirty;
+-}
+-
+-void
+-dessertAppParamsTable_dirty_set(u_int status)
+-{
+- DEBUGMSGTL(("dessertAppParamsTable:dessertAppParamsTable_dirty_set",
+- "called. was %d, now %d\n",
+- dessertAppParamsTable_if_ctx.table_dirty, status));
+- dessertAppParamsTable_if_ctx.table_dirty = status;
+-}
+-
+-/*
+- * mfd multiplexer modes
+- */
+-static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_pre_request;
+-static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_post_request;
+-static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_object_lookup;
+-static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_get_values;
+-static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_check_objects;
+-static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_undo_setup;
+-static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_set_values;
+-static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_undo_cleanup;
+-static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_undo_values;
+-static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_commit;
+-static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_undo_commit;
+-static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_irreversible_commit;
+-
+-NETSNMP_STATIC_INLINE int
+-_dessertAppParamsTable_undo_column(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx, netsnmp_variable_list * var,
+- int column);
+-
+-dessertAppParamsTable_data *dessertAppParamsTable_allocate_data(void);
+-
+-/**
+- * @internal
+- * Initialize the table dessertAppParamsTable
+- * (Define its contents and how it's structured)
+- */
+-void
+-_dessertAppParamsTable_initialize_interface
+- (dessertAppParamsTable_registration * reg_ptr, u_long flags)
+-{
+- netsnmp_baby_steps_access_methods *access_multiplexer =
+- &dessertAppParamsTable_if_ctx.access_multiplexer;
+- netsnmp_table_registration_info *tbl_info =
+- &dessertAppParamsTable_if_ctx.tbl_info;
+- netsnmp_handler_registration *reginfo;
+- netsnmp_mib_handler *handler;
+- int mfd_modes = 0;
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_dessertAppParamsTable_initialize_interface", "called\n"));
+-
+-
+- /*************************************************
+- *
+- * save interface context for dessertAppParamsTable
+- */
+- /*
+- * Setting up the table's definition
+- */
+- netsnmp_table_helper_add_indexes(tbl_info, ASN_INTEGER,
+- /** index: appParamsIndex */
+- 0);
+-
+- /*
+- * Define the minimum and maximum accessible columns. This
+- * optimizes retrival.
+- */
+- tbl_info->min_column = DESSERTAPPPARAMSTABLE_MIN_COL;
+- tbl_info->max_column = DESSERTAPPPARAMSTABLE_MAX_COL;
+-
+- /*
+- * save users context
+- */
+- dessertAppParamsTable_if_ctx.user_ctx = reg_ptr;
+-
+- /*
+- * call data access initialization code
+- */
+- dessertAppParamsTable_init_data(reg_ptr);
+-
+- /*
+- * set up the container
+- */
+- _dessertAppParamsTable_container_init(&dessertAppParamsTable_if_ctx);
+- if (NULL == dessertAppParamsTable_if_ctx.container) {
+- snmp_log(LOG_ERR,
+- "could not initialize container for dessertAppParamsTable\n");
+- return;
+- }
+-
+- /*
+- * access_multiplexer: REQUIRED wrapper for get request handling
+- */
+- access_multiplexer->object_lookup =
+- _mfd_dessertAppParamsTable_object_lookup;
+- access_multiplexer->get_values = _mfd_dessertAppParamsTable_get_values;
+-
+- /*
+- * no wrappers yet
+- */
+- access_multiplexer->pre_request =
+- _mfd_dessertAppParamsTable_pre_request;
+- access_multiplexer->post_request =
+- _mfd_dessertAppParamsTable_post_request;
+-
+-
+- /*
+- * REQUIRED wrappers for set request handling
+- */
+- access_multiplexer->object_syntax_checks =
+- _mfd_dessertAppParamsTable_check_objects;
+- access_multiplexer->undo_setup = _mfd_dessertAppParamsTable_undo_setup;
+- access_multiplexer->undo_cleanup =
+- _mfd_dessertAppParamsTable_undo_cleanup;
+- access_multiplexer->set_values = _mfd_dessertAppParamsTable_set_values;
+- access_multiplexer->undo_sets = _mfd_dessertAppParamsTable_undo_values;
+-
+- /*
+- * no wrappers yet
+- */
+- access_multiplexer->commit = _mfd_dessertAppParamsTable_commit;
+- access_multiplexer->undo_commit =
+- _mfd_dessertAppParamsTable_undo_commit;
+- access_multiplexer->irreversible_commit =
+- _mfd_dessertAppParamsTable_irreversible_commit;
+-
+- /*************************************************
+- *
+- * Create a registration, save our reg data, register table.
+- */
+- DEBUGMSGTL(("dessertAppParamsTable:init_dessertAppParamsTable",
+- "Registering dessertAppParamsTable as a mibs-for-dummies table.\n"));
+- handler =
+- netsnmp_baby_steps_access_multiplexer_get(access_multiplexer);
+- reginfo =
+- netsnmp_handler_registration_create("dessertAppParamsTable",
+- handler,
+- dessertAppParamsTable_oid,
+- dessertAppParamsTable_oid_size,
+- HANDLER_CAN_BABY_STEP |
+- HANDLER_CAN_RWRITE);
+- if (NULL == reginfo) {
+- snmp_log(LOG_ERR,
+- "error registering table dessertAppParamsTable\n");
+- return;
+- }
+- reginfo->my_reg_void = &dessertAppParamsTable_if_ctx;
+-
+- /*************************************************
+- *
+- * set up baby steps handler, create it and inject it
+- */
+- if (access_multiplexer->object_lookup)
+- mfd_modes |= BABY_STEP_OBJECT_LOOKUP;
+- if (access_multiplexer->set_values)
+- mfd_modes |= BABY_STEP_SET_VALUES;
+- if (access_multiplexer->irreversible_commit)
+- mfd_modes |= BABY_STEP_IRREVERSIBLE_COMMIT;
+- if (access_multiplexer->object_syntax_checks)
+- mfd_modes |= BABY_STEP_CHECK_OBJECT;
+-
+- if (access_multiplexer->pre_request)
+- mfd_modes |= BABY_STEP_PRE_REQUEST;
+- if (access_multiplexer->post_request)
+- mfd_modes |= BABY_STEP_POST_REQUEST;
+-
+- if (access_multiplexer->undo_setup)
+- mfd_modes |= BABY_STEP_UNDO_SETUP;
+- if (access_multiplexer->undo_cleanup)
+- mfd_modes |= BABY_STEP_UNDO_CLEANUP;
+- if (access_multiplexer->undo_sets)
+- mfd_modes |= BABY_STEP_UNDO_SETS;
+-
+- if (access_multiplexer->row_creation)
+- mfd_modes |= BABY_STEP_ROW_CREATE;
+- if (access_multiplexer->consistency_checks)
+- mfd_modes |= BABY_STEP_CHECK_CONSISTENCY;
+- if (access_multiplexer->commit)
+- mfd_modes |= BABY_STEP_COMMIT;
+- if (access_multiplexer->undo_commit)
+- mfd_modes |= BABY_STEP_UNDO_COMMIT;
+-
+- handler = netsnmp_baby_steps_handler_get(mfd_modes);
+- netsnmp_inject_handler(reginfo, handler);
+-
+- /*************************************************
+- *
+- * inject row_merge helper with prefix rootoid_len + 2 (entry.col)
+- */
+- handler = netsnmp_get_row_merge_handler(reginfo->rootoid_len + 2);
+- netsnmp_inject_handler(reginfo, handler);
+-
+- /*************************************************
+- *
+- * inject container_table helper
+- */
+- handler =
+- netsnmp_container_table_handler_get(tbl_info,
+- dessertAppParamsTable_if_ctx.
+- container,
+- TABLE_CONTAINER_KEY_NETSNMP_INDEX);
+- netsnmp_inject_handler(reginfo, handler);
+-
+- /*************************************************
+- *
+- * inject cache helper
+- */
+- if (NULL != dessertAppParamsTable_if_ctx.cache) {
+- handler =
+- netsnmp_cache_handler_get(dessertAppParamsTable_if_ctx.cache);
+- netsnmp_inject_handler(reginfo, handler);
+- }
+-
+- /*
+- * register table
+- */
+- netsnmp_register_table(reginfo, tbl_info);
+-
+-} /* _dessertAppParamsTable_initialize_interface */
+-
+-/**
+- * @internal
+- * Shutdown the table dessertAppParamsTable
+- */
+-void
+-_dessertAppParamsTable_shutdown_interface
+- (dessertAppParamsTable_registration * reg_ptr)
+-{
+- /*
+- * shutdown the container
+- */
+- _dessertAppParamsTable_container_shutdown
+- (&dessertAppParamsTable_if_ctx);
+-}
+-
+-void
+-dessertAppParamsTable_valid_columns_set(netsnmp_column_info *vc)
+-{
+- dessertAppParamsTable_if_ctx.tbl_info.valid_columns = vc;
+-} /* dessertAppParamsTable_valid_columns_set */
+-
+-/**
+- * @internal
+- * convert the index component stored in the context to an oid
+- */
+-int
+-dessertAppParamsTable_index_to_oid(netsnmp_index * oid_idx,
+- dessertAppParamsTable_mib_index *
+- mib_idx)
+-{
+- int err = SNMP_ERR_NOERROR;
+-
+- /*
+- * temp storage for parsing indexes
+- */
+- /*
+- * appParamsIndex(1)/DessertAppParamsIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
+- */
+- netsnmp_variable_list var_appParamsIndex;
+-
+- /*
+- * set up varbinds
+- */
+- memset(&var_appParamsIndex, 0x00, sizeof(var_appParamsIndex));
+- var_appParamsIndex.type = ASN_INTEGER;
+-
+- /*
+- * chain temp index varbinds together
+- */
+- var_appParamsIndex.next_variable = NULL;
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_index_to_oid", "called\n"));
+-
+- /*
+- * appParamsIndex(1)/DessertAppParamsIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
+- */
+- snmp_set_var_value(&var_appParamsIndex,
+- (u_char *) & mib_idx->appParamsIndex,
+- sizeof(mib_idx->appParamsIndex));
+-
+-
+- err = build_oid_noalloc(oid_idx->oids, oid_idx->len, &oid_idx->len,
+- NULL, 0, &var_appParamsIndex);
+- if (err)
+- snmp_log(LOG_ERR, "error %d converting index to oid\n", err);
+-
+- /*
+- * parsing may have allocated memory. free it.
+- */
+- snmp_reset_var_buffers(&var_appParamsIndex);
+-
+- return err;
+-} /* dessertAppParamsTable_index_to_oid */
+-
+-/**
+- * extract dessertAppParamsTable indexes from a netsnmp_index
+- *
+- * @retval SNMP_ERR_NOERROR : no error
+- * @retval SNMP_ERR_GENERR : error
+- */
+-int
+-dessertAppParamsTable_index_from_oid(netsnmp_index * oid_idx,
+- dessertAppParamsTable_mib_index *
+- mib_idx)
+-{
+- int err = SNMP_ERR_NOERROR;
+-
+- /*
+- * temp storage for parsing indexes
+- */
+- /*
+- * appParamsIndex(1)/DessertAppParamsIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
+- */
+- netsnmp_variable_list var_appParamsIndex;
+-
+- /*
+- * set up varbinds
+- */
+- memset(&var_appParamsIndex, 0x00, sizeof(var_appParamsIndex));
+- var_appParamsIndex.type = ASN_INTEGER;
+-
+- /*
+- * chain temp index varbinds together
+- */
+- var_appParamsIndex.next_variable = NULL;
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_index_from_oid", "called\n"));
+-
+- /*
+- * parse the oid into the individual index components
+- */
+- err = parse_oid_indexes(oid_idx->oids, oid_idx->len,
+- &var_appParamsIndex);
+- if (err == SNMP_ERR_NOERROR) {
+- /*
+- * copy out values
+- */
+- mib_idx->appParamsIndex =
+- *((long *) var_appParamsIndex.val.string);
+-
+-
+- }
+-
+- /*
+- * parsing may have allocated memory. free it.
+- */
+- snmp_reset_var_buffers(&var_appParamsIndex);
+-
+- return err;
+-} /* dessertAppParamsTable_index_from_oid */
+-
+-
+-/*
+- * dessertAppParamsTable_allocate_data
+- *
+- * Purpose: create new dessertAppParamsTable_data.
+- */
+-dessertAppParamsTable_data *
+-dessertAppParamsTable_allocate_data(void)
+-{
+- dessertAppParamsTable_data *rtn =
+- SNMP_MALLOC_TYPEDEF(dessertAppParamsTable_data);
+-
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_allocate_data", "called\n"));
+-
+- if (NULL == rtn) {
+- snmp_log(LOG_ERR, "unable to malloc memory for new "
+- "dessertAppParamsTable_data.\n");
+- }
+-
+- return rtn;
+-} /* dessertAppParamsTable_allocate_data */
+-
+-/*
+- * dessertAppParamsTable_release_data
+- *
+- * Purpose: release dessertAppParamsTable data.
+- */
+-void
+-dessertAppParamsTable_release_data(dessertAppParamsTable_data * data)
+-{
+- DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_release_data", "called\n"));
+-
+- free(data);
+-} /* dessertAppParamsTable_release_data */
+-
+-/*
+- *********************************************************************
+- * @internal
+- * allocate resources for a dessertAppParamsTable_rowreq_ctx
+- */
+-dessertAppParamsTable_rowreq_ctx *
+-dessertAppParamsTable_allocate_rowreq_ctx(void)
+-{
+- dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
+- SNMP_MALLOC_TYPEDEF(dessertAppParamsTable_rowreq_ctx);
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:dessertAppParamsTable_allocate_rowreq_ctx", "called\n"));
+-
+- if (NULL == rowreq_ctx) {
+- snmp_log(LOG_ERR, "Couldn't allocate memory for a "
+- "dessertAppParamsTable_rowreq_ctx.\n");
+- return NULL;
+- }
+-
+- rowreq_ctx->oid_idx.oids = rowreq_ctx->oid_tmp;
+-
+- rowreq_ctx->dessertAppParamsTable_data_list = NULL;
+-
+-
+- return rowreq_ctx;
+-} /* dessertAppParamsTable_allocate_rowreq_ctx */
+-
+-/*
+- * @internal
+- * release resources for a dessertAppParamsTable_rowreq_ctx
+- */
+-void
+-dessertAppParamsTable_release_rowreq_ctx(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx)
+-{
+- DEBUGMSGTL(("internal:dessertAppParamsTable:dessertAppParamsTable_release_rowreq_ctx", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+-
+- if (rowreq_ctx->undo)
+- dessertAppParamsTable_release_data(rowreq_ctx->undo);
+-
+- /*
+- * free index oid pointer
+- */
+- if (rowreq_ctx->oid_idx.oids != rowreq_ctx->oid_tmp)
+- free(rowreq_ctx->oid_idx.oids);
+-
+- SNMP_FREE(rowreq_ctx);
+-} /* dessertAppParamsTable_release_rowreq_ctx */
+-
+-/**
+- * @internal
+- * wrapper
+- */
+-static int
+-_mfd_dessertAppParamsTable_pre_request(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration
+- *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- int rc;
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_pre_request", "called\n"));
+-
+- if (1 != netsnmp_row_merge_status_first(reginfo, agtreq_info)) {
+- DEBUGMSGTL(("internal:dessertAppParamsTable",
+- "skipping additional pre_request\n"));
+- return SNMP_ERR_NOERROR;
+- }
+-
+- rc = dessertAppParamsTable_pre_request(dessertAppParamsTable_if_ctx.
+- user_ctx);
+- if (MFD_SUCCESS != rc) {
+- /*
+- * nothing we can do about it but log it
+- */
+- DEBUGMSGTL(("dessertAppParamsTable", "error %d from "
+- "dessertAppParamsTable_pre_request\n", rc));
+- netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
+- }
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertAppParamsTable_pre_request */
+-
+-/**
+- * @internal
+- * wrapper
+- */
+-static int
+-_mfd_dessertAppParamsTable_post_request(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration
+- *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+- int rc, packet_rc;
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_post_request", "called\n"));
+-
+- /*
+- * release row context, if deleted
+- */
+- if (rowreq_ctx && (rowreq_ctx->rowreq_flags & MFD_ROW_DELETED))
+- dessertAppParamsTable_release_rowreq_ctx(rowreq_ctx);
+-
+- /*
+- * wait for last call before calling user
+- */
+- if (1 != netsnmp_row_merge_status_last(reginfo, agtreq_info)) {
+- DEBUGMSGTL(("internal:dessertAppParamsTable",
+- "waiting for last post_request\n"));
+- return SNMP_ERR_NOERROR;
+- }
+-
+- packet_rc = netsnmp_check_all_requests_error(agtreq_info->asp, 0);
+- if ((MFD_SUCCESS != packet_rc) && dessertAppParamsTable_dirty_get()) {
+- /*
+- * we shouldn't get here. the undo steps should also clear
+- * the dirty flags.
+- */
+- snmp_log(LOG_WARNING,
+- "dessertAppParamsTable dirty flag set in post_request "
+- "but status != SUCCESS.\n");
+- }
+-
+- rc = dessertAppParamsTable_post_request(dessertAppParamsTable_if_ctx.
+- user_ctx, packet_rc);
+- if (MFD_SUCCESS != rc) {
+- /*
+- * nothing we can do about it but log it
+- */
+- DEBUGMSGTL(("dessertAppParamsTable", "error %d from "
+- "dessertAppParamsTable_post_request\n", rc));
+- }
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertAppParamsTable_post_request */
+-
+-/**
+- * @internal
+- * wrapper
+- */
+-static int
+-_mfd_dessertAppParamsTable_object_lookup(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration
+- *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- int rc = SNMP_ERR_NOERROR;
+- dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_object_lookup", "called\n"));
+-
+- /*
+- * get our context from mfd
+- * dessertAppParamsTable_interface_ctx *if_ctx =
+- * (dessertAppParamsTable_interface_ctx *)reginfo->my_reg_void;
+- */
+-
+- if (NULL == rowreq_ctx) {
+- rc = SNMP_ERR_NOCREATION;
+- }
+-
+- if (MFD_SUCCESS != rc)
+- netsnmp_request_set_error_all(requests, rc);
+- else
+- dessertAppParamsTable_row_prep(rowreq_ctx);
+-
+- return SNMP_VALIDATE_ERR(rc);
+-} /* _mfd_dessertAppParamsTable_object_lookup */
+-
+-/***********************************************************************
+- *
+- * GET processing
+- *
+- ***********************************************************************/
+-/*
+- * @internal
+- * Retrieve the value for a particular column
+- */
+-NETSNMP_STATIC_INLINE int
+-_dessertAppParamsTable_get_column(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx, netsnmp_variable_list * var,
+- int column)
+-{
+- int rc = SNMPERR_SUCCESS;
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "called for %d\n", column));
+-
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- switch (column) {
+-
+- /*
+- * appParamsName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- case COLUMN_APPPARAMSNAME:
+- if (!(COLUMN_APPPARAMSNAME_FLAG & rowreq_ctx->column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "column %d (appParamsName) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->type = ASN_OCTET_STR;
+- rc = appParamsName_get(rowreq_ctx, (char **) &var->val.string,
+- &var->val_len);
+- break;
+-
+- /*
+- * appParamsDesc(3)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- case COLUMN_APPPARAMSDESC:
+- if (!(COLUMN_APPPARAMSDESC_FLAG & rowreq_ctx->column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "column %d (appParamsDesc) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->type = ASN_OCTET_STR;
+- rc = appParamsDesc_get(rowreq_ctx, (char **) &var->val.string,
+- &var->val_len);
+- break;
+-
+- /*
+- * appParamsValueType(4)/DessertAppValueType/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
+- */
+- case COLUMN_APPPARAMSVALUETYPE:
+- if (!
+- (COLUMN_APPPARAMSVALUETYPE_FLAG & rowreq_ctx->
+- column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "column %d (appParamsValueType) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->val_len = sizeof(u_long);
+- var->type = ASN_INTEGER;
+- rc = appParamsValueType_get(rowreq_ctx,
+- (u_long *) var->val.string);
+- break;
+-
+- /*
+- * appParamsTruthValue(5)/TruthValue/ASN_INTEGER/long(u_long)//l/A/W/E/r/d/h
+- */
+- case COLUMN_APPPARAMSTRUTHVALUE:
+- if (!
+- (COLUMN_APPPARAMSTRUTHVALUE_FLAG & rowreq_ctx->
+- column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "column %d (appParamsTruthValue) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->val_len = sizeof(u_long);
+- var->type = ASN_INTEGER;
+- rc = appParamsTruthValue_get(rowreq_ctx,
+- (u_long *) var->val.string);
+- break;
+-
+- /*
+- * appParamsInteger32(6)/INTEGER32/ASN_INTEGER/long(long)//l/A/W/e/r/d/h
+- */
+- case COLUMN_APPPARAMSINTEGER32:
+- if (!
+- (COLUMN_APPPARAMSINTEGER32_FLAG & rowreq_ctx->
+- column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "column %d (appParamsInteger32) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->val_len = sizeof(long);
+- var->type = ASN_INTEGER;
+- rc = appParamsInteger32_get(rowreq_ctx, (long *) var->val.string);
+- break;
+-
+- /*
+- * appParamsUnsigned32(7)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/W/e/r/d/h
+- */
+- case COLUMN_APPPARAMSUNSIGNED32:
+- if (!
+- (COLUMN_APPPARAMSUNSIGNED32_FLAG & rowreq_ctx->
+- column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "column %d (appParamsUnsigned32) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->val_len = sizeof(u_long);
+- var->type = ASN_UNSIGNED;
+- rc = appParamsUnsigned32_get(rowreq_ctx,
+- (u_long *) var->val.string);
+- break;
+-
+- /*
+- * appParamsOctetString(9)/DessertApplicationOctetString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H
+- */
+- case COLUMN_APPPARAMSOCTETSTRING:
+- if (!
+- (COLUMN_APPPARAMSOCTETSTRING_FLAG & rowreq_ctx->
+- column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "column %d (appParamsOctetString) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->type = ASN_OCTET_STR;
+- rc = appParamsOctetString_get(rowreq_ctx,
+- (char **) &var->val.string,
+- &var->val_len);
+- break;
+-
+- default:
+- if (DESSERTAPPPARAMSTABLE_MIN_COL <= column
+- && column <= DESSERTAPPPARAMSTABLE_MAX_COL) {
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "assume column %d is reserved\n", column));
+- rc = MFD_SKIP;
+- } else {
+- snmp_log(LOG_ERR,
+- "unknown column %d in _dessertAppParamsTable_get_column\n",
+- column);
+- }
+- break;
+- }
+-
+- return rc;
+-} /* _dessertAppParamsTable_get_column */
+-
+-int
+-_mfd_dessertAppParamsTable_get_values(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration
+- *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+- netsnmp_table_request_info *tri;
+- u_char *old_string;
+- void (*dataFreeHook) (void *);
+- int rc;
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_values", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- DEBUGMSGTL(("9:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_values", "exists %p\n", rowreq_ctx->column_exists_flags));
+-
+- for (; requests; requests = requests->next) {
+- /*
+- * save old pointer, so we can free it if replaced
+- */
+- old_string = requests->requestvb->val.string;
+- dataFreeHook = requests->requestvb->dataFreeHook;
+- if (NULL == requests->requestvb->val.string) {
+- requests->requestvb->val.string = requests->requestvb->buf;
+- requests->requestvb->val_len =
+- sizeof(requests->requestvb->buf);
+- } else if (requests->requestvb->buf ==
+- requests->requestvb->val.string) {
+- if (requests->requestvb->val_len !=
+- sizeof(requests->requestvb->buf))
+- requests->requestvb->val_len =
+- sizeof(requests->requestvb->buf);
+- }
+-
+- /*
+- * get column data
+- */
+- tri = netsnmp_extract_table_info(requests);
+- if (NULL == tri)
+- continue;
+-
+- rc = _dessertAppParamsTable_get_column(rowreq_ctx,
+- requests->requestvb,
+- tri->colnum);
+- if (rc) {
+- if (MFD_SKIP == rc) {
+- requests->requestvb->type = SNMP_NOSUCHINSTANCE;
+- rc = SNMP_ERR_NOERROR;
+- }
+- } else if (NULL == requests->requestvb->val.string) {
+- snmp_log(LOG_ERR, "NULL varbind data pointer!\n");
+- rc = SNMP_ERR_GENERR;
+- }
+- if (rc)
+- netsnmp_request_set_error(requests, SNMP_VALIDATE_ERR(rc));
+-
+- /*
+- * if the buffer wasn't used previously for the old data (i.e. it
+- * was allcoated memory) and the get routine replaced the pointer,
+- * we need to free the previous pointer.
+- */
+- if (old_string && (old_string != requests->requestvb->buf) &&
+- (requests->requestvb->val.string != old_string)) {
+- if (dataFreeHook)
+- (*dataFreeHook) (old_string);
+- else
+- free(old_string);
+- }
+- } /* for results */
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertAppParamsTable_get_values */
+-
+-
+-/***********************************************************************
+- *
+- * SET processing
+- *
+- ***********************************************************************/
+-
+-/*----------------------------------------------------------------------
+- *
+- * SET: Syntax checks
+- *
+- *---------------------------------------------------------------------*/
+-/*
+- * @internal
+- * Check the syntax for a particular column
+- */
+-NETSNMP_STATIC_INLINE int
+-_dessertAppParamsTable_check_column(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx,
+- netsnmp_variable_list * var,
+- int column)
+-{
+- int rc = SNMPERR_SUCCESS;
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_dessertAppParamsTable_check_column", "called for %d\n", column));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- switch (column) {
+- /*
+- * (INDEX) appParamsIndex(1)/DessertAppParamsIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
+- */
+- case COLUMN_APPPARAMSINDEX:
+- rc = SNMP_ERR_NOTWRITABLE; /* can not change index of active row */
+- break;
+-
+- /*
+- * appParamsName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- case COLUMN_APPPARAMSNAME:
+- rc = SNMP_ERR_NOTWRITABLE;
+- break;
+-
+- /*
+- * appParamsDesc(3)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- case COLUMN_APPPARAMSDESC:
+- rc = SNMP_ERR_NOTWRITABLE;
+- break;
+-
+- /*
+- * appParamsValueType(4)/DessertAppValueType/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
+- */
+- case COLUMN_APPPARAMSVALUETYPE:
+- rc = SNMP_ERR_NOTWRITABLE;
+- break;
+-
+- /*
+- * appParamsTruthValue(5)/TruthValue/ASN_INTEGER/long(u_long)//l/A/W/E/r/d/h
+- */
+- case COLUMN_APPPARAMSTRUTHVALUE:
+- rc = netsnmp_check_vb_type_and_size(var, ASN_INTEGER,
+- sizeof(rowreq_ctx->data.
+- appParamsTruthValue));
+- /*
+- * check that the value is one of defined enums
+- */
+- if ((SNMPERR_SUCCESS == rc)
+- && (*var->val.integer != TRUTHVALUE_TRUE)
+- && (*var->val.integer != TRUTHVALUE_FALSE)
+- ) {
+- rc = SNMP_ERR_WRONGVALUE;
+- }
+- if (SNMPERR_SUCCESS != rc) {
+- DEBUGMSGTL(("dessertAppParamsTable:_dessertAppParamsTable_check_column:appParamsTruthValue", "varbind validation failed (eg bad type or size)\n"));
+- } else {
+- rc = appParamsTruthValue_check_value(rowreq_ctx,
+- *((u_long *) var->val.
+- string));
+- if ((MFD_SUCCESS != rc) && (MFD_NOT_VALID_EVER != rc)
+- && (MFD_NOT_VALID_NOW != rc)) {
+- snmp_log(LOG_ERR,
+- "bad rc %d from appParamsTruthValue_check_value\n",
+- rc);
+- rc = SNMP_ERR_GENERR;
+- }
+- }
+- break;
+-
+- /*
+- * appParamsInteger32(6)/INTEGER32/ASN_INTEGER/long(long)//l/A/W/e/r/d/h
+- */
+- case COLUMN_APPPARAMSINTEGER32:
+- rc = netsnmp_check_vb_type_and_size(var, ASN_INTEGER,
+- sizeof(rowreq_ctx->data.
+- appParamsInteger32));
+- if (SNMPERR_SUCCESS != rc) {
+- DEBUGMSGTL(("dessertAppParamsTable:_dessertAppParamsTable_check_column:appParamsInteger32", "varbind validation failed (eg bad type or size)\n"));
+- } else {
+- rc = appParamsInteger32_check_value(rowreq_ctx,
+- *((long *) var->val.
+- string));
+- if ((MFD_SUCCESS != rc) && (MFD_NOT_VALID_EVER != rc)
+- && (MFD_NOT_VALID_NOW != rc)) {
+- snmp_log(LOG_ERR,
+- "bad rc %d from appParamsInteger32_check_value\n",
+- rc);
+- rc = SNMP_ERR_GENERR;
+- }
+- }
+- break;
+-
+- /*
+- * appParamsUnsigned32(7)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/W/e/r/d/h
+- */
+- case COLUMN_APPPARAMSUNSIGNED32:
+- rc = netsnmp_check_vb_type_and_size(var, ASN_UNSIGNED,
+- sizeof(rowreq_ctx->data.
+- appParamsUnsigned32));
+- if (SNMPERR_SUCCESS != rc) {
+- DEBUGMSGTL(("dessertAppParamsTable:_dessertAppParamsTable_check_column:appParamsUnsigned32", "varbind validation failed (eg bad type or size)\n"));
+- } else {
+- rc = appParamsUnsigned32_check_value(rowreq_ctx,
+- *((u_long *) var->val.
+- string));
+- if ((MFD_SUCCESS != rc) && (MFD_NOT_VALID_EVER != rc)
+- && (MFD_NOT_VALID_NOW != rc)) {
+- snmp_log(LOG_ERR,
+- "bad rc %d from appParamsUnsigned32_check_value\n",
+- rc);
+- rc = SNMP_ERR_GENERR;
+- }
+- }
+- break;
+-
+- /*
+- * appParamsOctetString(9)/DessertApplicationOctetString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H
+- */
+- case COLUMN_APPPARAMSOCTETSTRING:
+- rc = netsnmp_check_vb_type_and_max_size(var, ASN_OCTET_STR,
+- sizeof(rowreq_ctx->data.
+- appParamsOctetString));
+- /*
+- * check defined range(s).
+- */
+- if ((SNMPERR_SUCCESS == rc)
+- && ((var->val_len < 0) || (var->val_len > 1024))
+- ) {
+- rc = SNMP_ERR_WRONGLENGTH;
+- }
+- if (SNMPERR_SUCCESS != rc) {
+- DEBUGMSGTL(("dessertAppParamsTable:_dessertAppParamsTable_check_column:appParamsOctetString", "varbind validation failed (eg bad type or size)\n"));
+- } else {
+- rc = appParamsOctetString_check_value(rowreq_ctx,
+- (char *) var->val.string,
+- var->val_len);
+- if ((MFD_SUCCESS != rc) && (MFD_NOT_VALID_EVER != rc)
+- && (MFD_NOT_VALID_NOW != rc)) {
+- snmp_log(LOG_ERR,
+- "bad rc %d from appParamsOctetString_check_value\n",
+- rc);
+- rc = SNMP_ERR_GENERR;
+- }
+- }
+- break;
+-
+- default: /** We shouldn't get here */
+- rc = SNMP_ERR_GENERR;
+- snmp_log(LOG_ERR,
+- "unknown column %d in _dessertAppParamsTable_check_column\n",
+- column);
+- }
+-
+- return rc;
+-} /* _dessertAppParamsTable_check_column */
+-
+-int
+-_mfd_dessertAppParamsTable_check_objects(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration
+- *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+- netsnmp_table_request_info *tri;
+- int rc;
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_check_objects", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- for (; requests; requests = requests->next) {
+-
+- /*
+- * get column number from table request info, and check that column
+- */
+- tri = netsnmp_extract_table_info(requests);
+- if (NULL == tri)
+- continue;
+-
+- rc = _dessertAppParamsTable_check_column(rowreq_ctx,
+- requests->requestvb,
+- tri->colnum);
+- if (rc) {
+- netsnmp_request_set_error(requests, SNMP_VALIDATE_ERR(rc));
+- break;
+- }
+-
+- } /* for results */
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertAppParamsTable_check_objects */
+-
+-
+-/*----------------------------------------------------------------------
+- *
+- * SET: Undo setup
+- *
+- *---------------------------------------------------------------------*/
+-/*
+- * @internal
+- * Set the value for a particular column
+- */
+-NETSNMP_STATIC_INLINE int
+-_dessertAppParamsTable_undo_setup_column(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx, int column)
+-{
+- int rc = SNMPERR_SUCCESS;
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_dessertAppParamsTable_undo_setup_column", "called for %d\n", column));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- switch (column) {
+-
+- /*
+- * appParamsTruthValue(5)/TruthValue/ASN_INTEGER/long(u_long)//l/A/W/E/r/d/h
+- */
+- case COLUMN_APPPARAMSTRUTHVALUE:
+- rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSTRUTHVALUE_FLAG;
+- rc = appParamsTruthValue_undo_setup(rowreq_ctx);
+- break;
+-
+- /*
+- * appParamsInteger32(6)/INTEGER32/ASN_INTEGER/long(long)//l/A/W/e/r/d/h
+- */
+- case COLUMN_APPPARAMSINTEGER32:
+- rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSINTEGER32_FLAG;
+- rc = appParamsInteger32_undo_setup(rowreq_ctx);
+- break;
+-
+- /*
+- * appParamsUnsigned32(7)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/W/e/r/d/h
+- */
+- case COLUMN_APPPARAMSUNSIGNED32:
+- rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSUNSIGNED32_FLAG;
+- rc = appParamsUnsigned32_undo_setup(rowreq_ctx);
+- break;
+-
+- /*
+- * appParamsOctetString(9)/DessertApplicationOctetString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H
+- */
+- case COLUMN_APPPARAMSOCTETSTRING:
+- rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSOCTETSTRING_FLAG;
+- rc = appParamsOctetString_undo_setup(rowreq_ctx);
+- break;
+-
+- default:
+- snmp_log(LOG_ERR,
+- "unknown column %d in _dessertAppParamsTable_undo_setup_column\n",
+- column);
+- break;
+- }
+-
+- return rc;
+-} /* _dessertAppParamsTable_undo_setup_column */
+-
+-
+-/**
+- * @internal
+- * undo setup
+- */
+-int
+-_mfd_dessertAppParamsTable_undo_setup(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration
+- *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- int rc;
+- dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_undo_setup", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * allocate undo context
+- */
+- rowreq_ctx->undo = dessertAppParamsTable_allocate_data();
+- if (NULL == rowreq_ctx->undo) {
+- /** msg already logged */
+- netsnmp_request_set_error_all(requests,
+- SNMP_ERR_RESOURCEUNAVAILABLE);
+- return SNMP_ERR_NOERROR;
+- }
+-
+- /*
+- * row undo setup
+- */
+- rowreq_ctx->column_set_flags = 0;
+- rc = dessertAppParamsTable_undo_setup(rowreq_ctx);
+- if (MFD_SUCCESS != rc) {
+- DEBUGMSGTL(("dessertAppParamsTable:mfd", "error %d from "
+- "dessertAppParamsTable_undo_setup\n", rc));
+- netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
+- } else {
+- /*
+- * column undo setup
+- */
+- netsnmp_table_request_info *tri;
+- for (; requests; requests = requests->next) {
+- /*
+- * set column data
+- */
+- tri = netsnmp_extract_table_info(requests);
+- if (NULL == tri)
+- continue;
+-
+- rc = _dessertAppParamsTable_undo_setup_column(rowreq_ctx,
+- tri->colnum);
+- if (MFD_SUCCESS != rc) {
+- DEBUGMSGTL(("dessertAppParamsTable:mfd", "error %d from "
+- "dessertAppParamsTable_undo_setup_column\n",
+- rc));
+- netsnmp_set_request_error(agtreq_info, requests,
+- SNMP_VALIDATE_ERR(rc));
+- }
+- } /* for results */
+- }
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertAppParamsTable_undo_setup */
+-
+-/**
+- * @internal
+- * undo setup
+- */
+-int
+-_mfd_dessertAppParamsTable_undo_cleanup(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration
+- *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+- int rc;
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_undo_cleanup", "called\n"));
+-
+- /*
+- * failed row create in early stages has no rowreq_ctx
+- */
+- if (NULL == rowreq_ctx)
+- return MFD_SUCCESS;
+-
+- /*
+- * call user cleanup
+- */
+- rc = dessertAppParamsTable_undo_cleanup(rowreq_ctx);
+- if (MFD_SUCCESS != rc) {
+- /*
+- * nothing we can do about it but log it
+- */
+- DEBUGMSGTL(("dessertAppParamsTable:mfd", "error %d from "
+- "dessertAppParamsTable_undo_cleanup\n", rc));
+- }
+-
+- /*
+- * release undo context, if needed
+- */
+- if (rowreq_ctx->undo) {
+- dessertAppParamsTable_release_data(rowreq_ctx->undo);
+- rowreq_ctx->undo = NULL;
+- }
+-
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertAppParamsTable_undo_cleanup */
+-
+-/*----------------------------------------------------------------------
+- *
+- * SET: Set values
+- *
+- *---------------------------------------------------------------------*/
+-/*
+- * @internal
+- * Set the value for a particular column
+- */
+-NETSNMP_STATIC_INLINE int
+-_dessertAppParamsTable_set_column(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx, netsnmp_variable_list * var,
+- int column)
+-{
+- int rc = SNMPERR_SUCCESS;
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_dessertAppParamsTable_set_column", "called for %d\n", column));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- switch (column) {
+-
+- /*
+- * appParamsTruthValue(5)/TruthValue/ASN_INTEGER/long(u_long)//l/A/W/E/r/d/h
+- */
+- case COLUMN_APPPARAMSTRUTHVALUE:
+- rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSTRUTHVALUE_FLAG;
+- rc = appParamsTruthValue_set(rowreq_ctx,
+- *((u_long *) var->val.string));
+- break;
+-
+- /*
+- * appParamsInteger32(6)/INTEGER32/ASN_INTEGER/long(long)//l/A/W/e/r/d/h
+- */
+- case COLUMN_APPPARAMSINTEGER32:
+- rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSINTEGER32_FLAG;
+- rc = appParamsInteger32_set(rowreq_ctx,
+- *((long *) var->val.string));
+- break;
+-
+- /*
+- * appParamsUnsigned32(7)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/W/e/r/d/h
+- */
+- case COLUMN_APPPARAMSUNSIGNED32:
+- rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSUNSIGNED32_FLAG;
+- rc = appParamsUnsigned32_set(rowreq_ctx,
+- *((u_long *) var->val.string));
+- break;
+-
+- /*
+- * appParamsOctetString(9)/DessertApplicationOctetString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H
+- */
+- case COLUMN_APPPARAMSOCTETSTRING:
+- rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSOCTETSTRING_FLAG;
+- rc = appParamsOctetString_set(rowreq_ctx, (char *) var->val.string,
+- var->val_len);
+- break;
+-
+- default:
+- snmp_log(LOG_ERR,
+- "unknown column %d in _dessertAppParamsTable_set_column\n",
+- column);
+- rc = SNMP_ERR_GENERR;
+- break;
+- }
+-
+- return rc;
+-} /* _dessertAppParamsTable_set_column */
+-
+-int
+-_mfd_dessertAppParamsTable_set_values(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration
+- *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+- netsnmp_table_request_info *tri;
+- int rc = SNMP_ERR_NOERROR;
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_set_values", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- rowreq_ctx->column_set_flags = 0;
+- for (; requests; requests = requests->next) {
+- /*
+- * set column data
+- */
+- tri = netsnmp_extract_table_info(requests);
+- if (NULL == tri)
+- continue;
+-
+- rc = _dessertAppParamsTable_set_column(rowreq_ctx,
+- requests->requestvb,
+- tri->colnum);
+- if (MFD_SUCCESS != rc) {
+- DEBUGMSGTL(("dessertAppParamsTable:mfd", "error %d from "
+- "dessertAppParamsTable_set_column\n", rc));
+- netsnmp_set_request_error(agtreq_info, requests,
+- SNMP_VALIDATE_ERR(rc));
+- }
+- } /* for results */
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertAppParamsTable_set_values */
+-
+-/*----------------------------------------------------------------------
+- *
+- * SET: commit
+- *
+- *---------------------------------------------------------------------*/
+-/**
+- * @internal
+- * commit the values
+- */
+-int
+-_mfd_dessertAppParamsTable_commit(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration *reginfo,
+- netsnmp_agent_request_info *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- int rc;
+- dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_commit", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- rc = dessertAppParamsTable_commit(rowreq_ctx);
+- if (MFD_SUCCESS != rc) {
+- DEBUGMSGTL(("dessertAppParamsTable:mfd", "error %d from "
+- "dessertAppParamsTable_commit\n", rc));
+- netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
+- }
+-
+- if (rowreq_ctx->rowreq_flags & MFD_ROW_DIRTY) {
+- /*
+- * if we successfully commited this row, set the dirty flag. Use the
+- * current value + 1 (i.e. dirty = # rows changed).
+- * this is checked in post_request...
+- */
+- dessertAppParamsTable_dirty_set(dessertAppParamsTable_dirty_get() + 1); /* set table dirty flag */
+- }
+-
+- return SNMP_ERR_NOERROR;
+-}
+-
+-int
+-_mfd_dessertAppParamsTable_undo_commit(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration
+- *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- int rc;
+- dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_undo_commit", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- if (rowreq_ctx->rowreq_flags & MFD_ROW_DIRTY) {
+- u_int d = dessertAppParamsTable_dirty_get();
+-
+- netsnmp_assert(d != 0);
+- if (d)
+- dessertAppParamsTable_dirty_set(d - 1);
+- }
+-
+- rc = dessertAppParamsTable_undo_commit(rowreq_ctx);
+- if (MFD_SUCCESS != rc) {
+- /*
+- * nothing we can do about it but log it
+- */
+- DEBUGMSGTL(("dessertAppParamsTable:mfd", "error %d from "
+- "dessertAppParamsTable_undo_commit\n", rc));
+- }
+-
+- if (rowreq_ctx->rowreq_flags & MFD_ROW_DIRTY) {
+- snmp_log(LOG_WARNING,
+- "dessertAppParamsTable row dirty flag still set after undo_commit\n");
+- rowreq_ctx->rowreq_flags &= ~MFD_ROW_DIRTY;
+- }
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertAppParamsTable_commit */
+-
+-/*----------------------------------------------------------------------
+- *
+- * SET: Undo
+- *
+- *---------------------------------------------------------------------*/
+-/**
+- * @internal
+- * undo the value for a particular column
+- */
+-NETSNMP_STATIC_INLINE int
+-_dessertAppParamsTable_undo_column(dessertAppParamsTable_rowreq_ctx *
+- rowreq_ctx, netsnmp_variable_list * var,
+- int column)
+-{
+- int rc = SNMPERR_SUCCESS;
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_dessertAppParamsTable_undo_column", "called for %d\n", column));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- switch (column) {
+-
+- /*
+- * appParamsTruthValue(5)/TruthValue/ASN_INTEGER/long(u_long)//l/A/W/E/r/d/h
+- */
+- case COLUMN_APPPARAMSTRUTHVALUE:
+- rc = appParamsTruthValue_undo(rowreq_ctx);
+- break;
+-
+- /*
+- * appParamsInteger32(6)/INTEGER32/ASN_INTEGER/long(long)//l/A/W/e/r/d/h
+- */
+- case COLUMN_APPPARAMSINTEGER32:
+- rc = appParamsInteger32_undo(rowreq_ctx);
+- break;
+-
+- /*
+- * appParamsUnsigned32(7)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/W/e/r/d/h
+- */
+- case COLUMN_APPPARAMSUNSIGNED32:
+- rc = appParamsUnsigned32_undo(rowreq_ctx);
+- break;
+-
+- /*
+- * appParamsOctetString(9)/DessertApplicationOctetString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H
+- */
+- case COLUMN_APPPARAMSOCTETSTRING:
+- rc = appParamsOctetString_undo(rowreq_ctx);
+- break;
+-
+- default:
+- snmp_log(LOG_ERR,
+- "unknown column %d in _dessertAppParamsTable_undo_column\n",
+- column);
+- break;
+- }
+-
+- return rc;
+-} /* _dessertAppParamsTable_undo_column */
+-
+-int
+-_mfd_dessertAppParamsTable_undo_values(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration
+- *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- int rc;
+- dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+- netsnmp_table_request_info *tri;
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_undo_values", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- rc = dessertAppParamsTable_undo(rowreq_ctx);
+- if (MFD_SUCCESS != rc) {
+- /*
+- * nothing we can do about it but log it
+- */
+- DEBUGMSGTL(("dessertAppParamsTable:mfd", "error %d from "
+- "dessertAppParamsTable_undo\n", rc));
+- }
+-
+- for (; requests; requests = requests->next) {
+- /*
+- * set column data
+- */
+- tri = netsnmp_extract_table_info(requests);
+- if (NULL == tri)
+- continue;
+-
+- rc = _dessertAppParamsTable_undo_column(rowreq_ctx,
+- requests->requestvb,
+- tri->colnum);
+- if (MFD_SUCCESS != rc) {
+- /*
+- * nothing we can do about it but log it
+- */
+- DEBUGMSGTL(("dessertAppParamsTable:mfd", "error %d from "
+- "dessertAppParamsTable_undo_column\n", rc));
+- }
+- } /* for results */
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertAppParamsTable_undo_values */
+-
+-/*----------------------------------------------------------------------
+- *
+- * SET: irreversible commit
+- *
+- *---------------------------------------------------------------------*/
+-/**
+- * @internal
+- * commit irreversible actions
+- */
+-int
+-_mfd_dessertAppParamsTable_irreversible_commit(netsnmp_mib_handler
+- *handler,
+- netsnmp_handler_registration
+- *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info
+- *requests)
+-{
+- dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_irreversible:commit", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * check for and handle row creation/deletion
+- * and update column exist flags...
+- */
+- if (rowreq_ctx->rowreq_flags & MFD_ROW_DELETED) {
+- if (!(rowreq_ctx->rowreq_flags & MFD_ROW_CREATED))
+- CONTAINER_REMOVE(dessertAppParamsTable_if_ctx.container,
+- rowreq_ctx);
+- } else {
+- if (rowreq_ctx->column_set_flags) {
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_irreversible_commit", "updating exists (%p) w/set (%p) = %p\n", rowreq_ctx->column_exists_flags, rowreq_ctx->column_set_flags, (rowreq_ctx->column_exists_flags | rowreq_ctx->column_set_flags)));
+- rowreq_ctx->column_exists_flags |=
+- rowreq_ctx->column_set_flags;
+- rowreq_ctx->column_set_flags = 0;
+- }
+- }
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertAppParamsTable_irreversible_commit */
+-
+-/***********************************************************************
+- *
+- * DATA ACCESS
+- *
+- ***********************************************************************/
+-static void _container_free(netsnmp_container * container);
+-
+-/**
+- * @internal
+- */
+-static int
+-_cache_load(netsnmp_cache * cache, void *vmagic)
+-{
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_cache_load", "called\n"));
+-
+- if ((NULL == cache) || (NULL == cache->magic)) {
+- snmp_log(LOG_ERR,
+- "invalid cache for dessertAppParamsTable_cache_load\n");
+- return -1;
+- }
+-
+- /** should only be called for an invalid or expired cache */
+- netsnmp_assert((0 == cache->valid) || (1 == cache->expired));
+-
+- /*
+- * call user code
+- */
+- return dessertAppParamsTable_container_load((netsnmp_container *)
+- cache->magic);
+-} /* _cache_load */
+-
+-/**
+- * @internal
+- */
+-static void
+-_cache_free(netsnmp_cache * cache, void *magic)
+-{
+- netsnmp_container *container;
+-
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_cache_free", "called\n"));
+-
+- if ((NULL == cache) || (NULL == cache->magic)) {
+- snmp_log(LOG_ERR,
+- "invalid cache in dessertAppParamsTable_cache_free\n");
+- return;
+- }
+-
+- container = (netsnmp_container *) cache->magic;
+-
+- _container_free(container);
+-} /* _cache_free */
+-
+-/**
+- * @internal
+- */
+-static void
+-_container_item_free(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
+- void *context)
+-{
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_container_item_free",
+- "called\n"));
+-
+- if (NULL == rowreq_ctx)
+- return;
+-
+- dessertAppParamsTable_release_rowreq_ctx(rowreq_ctx);
+-} /* _container_item_free */
+-
+-/**
+- * @internal
+- */
+-static void
+-_container_free(netsnmp_container * container)
+-{
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_container_free",
+- "called\n"));
+-
+- if (NULL == container) {
+- snmp_log(LOG_ERR,
+- "invalid container in dessertAppParamsTable_container_free\n");
+- return;
+- }
+-
+- /*
+- * call user code
+- */
+- dessertAppParamsTable_container_free(container);
+-
+- /*
+- * free all items. inefficient, but easy.
+- */
+- CONTAINER_CLEAR(container,
+- (netsnmp_container_obj_func *) _container_item_free,
+- NULL);
+-} /* _container_free */
+-
+-/**
+- * @internal
+- * initialize the container with functions or wrappers
+- */
+-void
+-_dessertAppParamsTable_container_init(dessertAppParamsTable_interface_ctx *
+- if_ctx)
+-{
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_dessertAppParamsTable_container_init", "called\n"));
+-
+- /*
+- * cache init
+- */
+- if_ctx->cache = netsnmp_cache_create(30, /* timeout in seconds */
+- _cache_load, _cache_free,
+- dessertAppParamsTable_oid,
+- dessertAppParamsTable_oid_size);
+-
+- if (NULL == if_ctx->cache) {
+- snmp_log(LOG_ERR,
+- "error creating cache for dessertAppParamsTable\n");
+- return;
+- }
+-
+- if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;
+-
+- dessertAppParamsTable_container_init(&if_ctx->container,
+- if_ctx->cache);
+- if (NULL == if_ctx->container)
+- if_ctx->container =
+- netsnmp_container_find
+- ("dessertAppParamsTable:table_container");
+- if (NULL == if_ctx->container) {
+- snmp_log(LOG_ERR, "error creating container in "
+- "dessertAppParamsTable_container_init\n");
+- return;
+- }
+-
+- if (NULL != if_ctx->cache)
+- if_ctx->cache->magic = (void *) if_ctx->container;
+-} /* _dessertAppParamsTable_container_init */
+-
+-/**
+- * @internal
+- * shutdown the container with functions or wrappers
+- */
+-void
+-_dessertAppParamsTable_container_shutdown
+- (dessertAppParamsTable_interface_ctx * if_ctx)
+-{
+- DEBUGMSGTL(("internal:dessertAppParamsTable:_dessertAppParamsTable_container_shutdown", "called\n"));
+-
+- dessertAppParamsTable_container_shutdown(if_ctx->container);
+-
+- _container_free(if_ctx->container);
+-
+-} /* _dessertAppParamsTable_container_shutdown */
+-
+-
+-dessertAppParamsTable_rowreq_ctx *
+-dessertAppParamsTable_row_find_by_mib_index(dessertAppParamsTable_mib_index
+- * mib_idx)
+-{
+- dessertAppParamsTable_rowreq_ctx *rowreq_ctx;
+- oid oid_tmp[MAX_OID_LEN];
+- netsnmp_index oid_idx;
+- int rc;
+-
+- /*
+- * set up storage for OID
+- */
+- oid_idx.oids = oid_tmp;
+- oid_idx.len = sizeof(oid_tmp) / sizeof(oid);
+-
+- /*
+- * convert
+- */
+- rc = dessertAppParamsTable_index_to_oid(&oid_idx, mib_idx);
+- if (MFD_SUCCESS != rc)
+- return NULL;
+-
+- rowreq_ctx =
+- CONTAINER_FIND(dessertAppParamsTable_if_ctx.container, &oid_idx);
+-
+- return rowreq_ctx;
+-}
+diff --git a/snmp/dessertAppParamsTable_interface.h b/snmp/dessertAppParamsTable_interface.h
+deleted file mode 100644
+index 42db682..0000000
+--- a/snmp/dessertAppParamsTable_interface.h
++++ /dev/null
+@@ -1,101 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 15899 $ of $
+- *
+- * $Id:$
+- */
+-/** @ingroup interface: Routines to interface to Net-SNMP
+- *
+- * \warning This code should not be modified, called directly,
+- * or used to interpret functionality. It is subject to
+- * change at any time.
+- *
+- * @{
+- */
+-/*
+- * *********************************************************************
+- * *********************************************************************
+- * *********************************************************************
+- * *** ***
+- * *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
+- * *** ***
+- * *** ***
+- * *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
+- * *** ***
+- * *** ***
+- * *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
+- * *** ***
+- * *** ***
+- * *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
+- * *** ***
+- * *** ***
+- * *********************************************************************
+- * *********************************************************************
+- * *********************************************************************
+- */
+-#ifndef DESSERTAPPPARAMSTABLE_INTERFACE_H
+-#define DESSERTAPPPARAMSTABLE_INTERFACE_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+-#include "dessertAppParamsTable.h"
+-
+-
+- /*
+- ********************************************************************
+- * Table declarations
+- */
+-
+- /*
+- * PUBLIC interface initialization routine
+- */
+- void
+- _dessertAppParamsTable_initialize_interface
+- (dessertAppParamsTable_registration * user_ctx, u_long flags);
+- void
+- _dessertAppParamsTable_shutdown_interface
+- (dessertAppParamsTable_registration * user_ctx);
+-
+- dessertAppParamsTable_registration
+- *dessertAppParamsTable_registration_get(void);
+-
+- dessertAppParamsTable_registration
+- *dessertAppParamsTable_registration_set
+- (dessertAppParamsTable_registration * newreg);
+-
+- netsnmp_container *dessertAppParamsTable_container_get(void);
+- int dessertAppParamsTable_container_size(void);
+-
+- u_int dessertAppParamsTable_dirty_get(void);
+- void dessertAppParamsTable_dirty_set(u_int status);
+-
+- dessertAppParamsTable_rowreq_ctx
+- *dessertAppParamsTable_allocate_rowreq_ctx(void);
+- void
+- dessertAppParamsTable_release_rowreq_ctx
+- (dessertAppParamsTable_rowreq_ctx * rowreq_ctx);
+-
+- int dessertAppParamsTable_index_to_oid(netsnmp_index *
+- oid_idx,
+- dessertAppParamsTable_mib_index
+- * mib_idx);
+- int dessertAppParamsTable_index_from_oid(netsnmp_index *
+- oid_idx,
+- dessertAppParamsTable_mib_index
+- * mib_idx);
+-
+- /*
+- * access to certain internals. use with caution!
+- */
+- void
+- dessertAppParamsTable_valid_columns_set(netsnmp_column_info *vc);
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTAPPPARAMSTABLE_INTERFACE_H */
+-/** @} */
+diff --git a/snmp/dessertAppParamsTable_oids.h b/snmp/dessertAppParamsTable_oids.h
+deleted file mode 100644
+index d36d8f8..0000000
+--- a/snmp/dessertAppParamsTable_oids.h
++++ /dev/null
+@@ -1,56 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * : generic-table-oids.m2c 12855 2005-09-27 15:56:08Z rstory $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTAPPPARAMSTABLE_OIDS_H
+-#define DESSERTAPPPARAMSTABLE_OIDS_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+- /*
+- * column number definitions for table dessertAppParamsTable
+- */
+-#define DESSERTAPPPARAMSTABLE_OID 1,3,6,1,4,1,18898,0,19,10,1,1,9
+-
+-#define COLUMN_APPPARAMSINDEX 1
+-
+-#define COLUMN_APPPARAMSNAME 2
+-#define COLUMN_APPPARAMSNAME_FLAG (0x1 << 1)
+-
+-#define COLUMN_APPPARAMSDESC 3
+-#define COLUMN_APPPARAMSDESC_FLAG (0x1 << 2)
+-
+-#define COLUMN_APPPARAMSVALUETYPE 4
+-#define COLUMN_APPPARAMSVALUETYPE_FLAG (0x1 << 3)
+-
+-#define COLUMN_APPPARAMSTRUTHVALUE 5
+-#define COLUMN_APPPARAMSTRUTHVALUE_FLAG (0x1 << 4)
+-
+-#define COLUMN_APPPARAMSINTEGER32 6
+-#define COLUMN_APPPARAMSINTEGER32_FLAG (0x1 << 5)
+-
+-#define COLUMN_APPPARAMSUNSIGNED32 7
+-#define COLUMN_APPPARAMSUNSIGNED32_FLAG (0x1 << 6)
+-
+-#define COLUMN_APPPARAMSOCTETSTRING 9
+-#define COLUMN_APPPARAMSOCTETSTRING_FLAG (0x1 << 8)
+-
+-
+-#define DESSERTAPPPARAMSTABLE_MIN_COL COLUMN_APPPARAMSNAME
+-#define DESSERTAPPPARAMSTABLE_MAX_COL COLUMN_APPPARAMSOCTETSTRING
+-
+-
+- /*
+- * OR together all the writable cols.
+- */
+-#define DESSERTAPPPARAMSTABLE_SETTABLE_COLS (COLUMN_APPPARAMSTRUTHVALUE_FLAG | COLUMN_APPPARAMSINTEGER32_FLAG | COLUMN_APPPARAMSUNSIGNED32_FLAG | COLUMN_APPPARAMSOCTETSTRING_FLAG)
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTAPPPARAMSTABLE_OIDS_H */
+diff --git a/snmp/dessertAppStatsTable.c b/snmp/dessertAppStatsTable.c
+deleted file mode 100644
+index 0a45018..0000000
+--- a/snmp/dessertAppStatsTable.c
++++ /dev/null
+@@ -1,173 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 14170 $ of $
+- *
+- * $Id:$
+- */
+-/** \page MFD helper for dessertAppStatsTable
+- *
+- * \section intro Introduction
+- * Introductory text.
+- *
+- */
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertAppStatsTable.h"
+-
+-#include <net-snmp/agent/mib_modules.h>
+-
+-#include "dessertAppStatsTable_interface.h"
+-
+-oid dessertAppStatsTable_oid[] = { DESSERTAPPSTATSTABLE_OID };
+-
+-int dessertAppStatsTable_oid_size =
+-OID_LENGTH(dessertAppStatsTable_oid);
+-
+-dessertAppStatsTable_registration dessertAppStatsTable_user_context;
+-
+-void initialize_table_dessertAppStatsTable(void);
+-void shutdown_table_dessertAppStatsTable(void);
+-
+-
+-/**
+- * Initializes the dessertAppStatsTable module
+- */
+-void
+-init_dessertAppStatsTable(void)
+-{
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:init_dessertAppStatsTable",
+- "called\n"));
+-
+- /*
+- * TODO:300:o: Perform dessertAppStatsTable one-time module initialization.
+- */
+-
+- /*
+- * here we initialize all the tables we're planning on supporting
+- */
+- if (should_init("dessertAppStatsTable"))
+- initialize_table_dessertAppStatsTable();
+-
+-} /* init_dessertAppStatsTable */
+-
+-/**
+- * Shut-down the dessertAppStatsTable module (agent is exiting)
+- */
+-void
+-shutdown_dessertAppStatsTable(void)
+-{
+- if (should_init("dessertAppStatsTable"))
+- shutdown_table_dessertAppStatsTable();
+-
+-}
+-
+-/**
+- * Initialize the table dessertAppStatsTable
+- * (Define its contents and how it's structured)
+- */
+-void
+-initialize_table_dessertAppStatsTable(void)
+-{
+- dessertAppStatsTable_registration *user_context;
+- u_long flags;
+-
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:initialize_table_dessertAppStatsTable", "called\n"));
+-
+- /*
+- * TODO:301:o: Perform dessertAppStatsTable one-time table initialization.
+- */
+-
+- /*
+- * TODO:302:o: |->Initialize dessertAppStatsTable user context
+- * if you'd like to pass in a pointer to some data for this
+- * table, allocate or set it up here.
+- */
+- /*
+- * a netsnmp_data_list is a simple way to store void pointers. A simple
+- * string token is used to add, find or remove pointers.
+- */
+- user_context =
+- netsnmp_create_data_list("dessertAppStatsTable", NULL, NULL);
+-
+- /*
+- * No support for any flags yet, but in the future you would
+- * set any flags here.
+- */
+- flags = 0;
+-
+- /*
+- * call interface initialization code
+- */
+- _dessertAppStatsTable_initialize_interface(user_context, flags);
+-} /* initialize_table_dessertAppStatsTable */
+-
+-/**
+- * Shutdown the table dessertAppStatsTable
+- */
+-void
+-shutdown_table_dessertAppStatsTable(void)
+-{
+- /*
+- * call interface shutdown code
+- */
+- _dessertAppStatsTable_shutdown_interface
+- (&dessertAppStatsTable_user_context);
+-}
+-
+-/**
+- * pre-request callback
+- *
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error
+- */
+-int
+-dessertAppStatsTable_pre_request(dessertAppStatsTable_registration *
+- user_context)
+-{
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_pre_request", "called\n"));
+-
+- /*
+- * TODO:510:o: Perform dessertAppStatsTable pre-request actions.
+- */
+-
+- return MFD_SUCCESS;
+-} /* dessertAppStatsTable_pre_request */
+-
+-/**
+- * post-request callback
+- *
+- * Note:
+- * New rows have been inserted into the container, and
+- * deleted rows have been removed from the container and
+- * released.
+- *
+- * @param user_context
+- * @param rc : MFD_SUCCESS if all requests succeeded
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error (ignored)
+- */
+-int
+-dessertAppStatsTable_post_request(dessertAppStatsTable_registration *
+- user_context, int rc)
+-{
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_post_request", "called\n"));
+-
+- /*
+- * TODO:511:o: Perform dessertAppStatsTable post-request actions.
+- */
+-
+- return MFD_SUCCESS;
+-} /* dessertAppStatsTable_post_request */
+-
+-
+-/** @{ */
+diff --git a/snmp/dessertAppStatsTable.h b/snmp/dessertAppStatsTable.h
+deleted file mode 100644
+index 1f8a4b3..0000000
+--- a/snmp/dessertAppStatsTable.h
++++ /dev/null
+@@ -1,251 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 14170 $ of $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTAPPSTATSTABLE_H
+-#define DESSERTAPPSTATSTABLE_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+-/** @addtogroup misc misc: Miscellaneous routines
+- *
+- * @{
+- */
+-#include <net-snmp/library/asn1.h>
+-
+- /*
+- * other required module components
+- */
+- /* *INDENT-OFF* */
+-config_add_mib(DESSERT-MIB)
+-config_require(DESSERT-MIB/dessertAppStatsTable/dessertAppStatsTable_interface)
+-config_require(DESSERT-MIB/dessertAppStatsTable/dessertAppStatsTable_data_access)
+-config_require(DESSERT-MIB/dessertAppStatsTable/dessertAppStatsTable_data_get)
+-config_require(DESSERT-MIB/dessertAppStatsTable/dessertAppStatsTable_data_set)
+- /* *INDENT-ON* */
+-
+- /*
+- * OID and column number definitions for dessertAppStatsTable
+- */
+-#include "dessertAppStatsTable_oids.h"
+-
+- /*
+- * enum definions
+- */
+-#include "dessertAppStatsTable_enums.h"
+-
+- /*
+- *********************************************************************
+- * function declarations
+- */
+- void init_dessertAppStatsTable(void);
+- void shutdown_dessertAppStatsTable(void);
+-
+- /*
+- *********************************************************************
+- * Table declarations
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertAppStatsTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+- /*
+- * DESSERT-MIB::dessertAppStatsTable is subid 9 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.9, length: 12
+- */
+- /*
+- *********************************************************************
+- * When you register your mib, you get to provide a generic
+- * pointer that will be passed back to you for most of the
+- * functions calls.
+- *
+- * TODO:100:r: Review all context structures
+- */
+- /*
+- * TODO:101:o: |-> Review dessertAppStatsTable registration context.
+- */
+- typedef netsnmp_data_list dessertAppStatsTable_registration;
+-
+-/**********************************************************************/
+- /*
+- * TODO:110:r: |-> Review dessertAppStatsTable data context structure.
+- * This structure is used to represent the data for dessertAppStatsTable.
+- */
+- /*
+- * This structure contains storage for all the columns defined in the
+- * dessertAppStatsTable.
+- */
+- typedef struct dessertAppStatsTable_data_s {
+-
+- /*
+- * appStatsName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- char appStatsName[255];
+- size_t appStatsName_len; /* # of char elements, not bytes */
+-
+- /*
+- * appStatsDesc(3)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- char appStatsDesc[255];
+- size_t appStatsDesc_len; /* # of char elements, not bytes */
+-
+- /*
+- * appStatsNodeOrLink(4)/INTEGER/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
+- */
+- u_long appStatsNodeOrLink;
+-
+- /*
+- * appStatsValueType(5)/INTEGER/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
+- */
+- u_long appStatsValueType;
+-
+- /*
+- * appStatsMacAddress1(6)/MacAddress/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- char appStatsMacAddress1[6];
+- size_t appStatsMacAddress1_len; /* # of char elements, not bytes */
+-
+- /*
+- * appStatsMacAddress2(7)/MacAddress/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- char appStatsMacAddress2[6];
+- size_t appStatsMacAddress2_len; /* # of char elements, not bytes */
+-
+- /*
+- * appStatsTruthValue(8)/TruthValue/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
+- */
+- u_long appStatsTruthValue;
+-
+- /*
+- * appStatsInteger32(9)/INTEGER32/ASN_INTEGER/long(long)//l/A/w/e/r/d/h
+- */
+- long appStatsInteger32;
+-
+- /*
+- * appStatsUnsigned32(10)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/w/e/r/d/h
+- */
+- u_long appStatsUnsigned32;
+-
+- /*
+- * appStatsCounter64(11)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- U64 appStatsCounter64;
+-
+- /*
+- * appStatsOctetString(12)/OCTETSTR/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/h
+- */
+- char appStatsOctetString[1024];
+- size_t appStatsOctetString_len; /* # of char elements, not bytes */
+-
+- } dessertAppStatsTable_data;
+-
+-
+- /*
+- * TODO:120:r: |-> Review dessertAppStatsTable mib index.
+- * This structure is used to represent the index for dessertAppStatsTable.
+- */
+- typedef struct dessertAppStatsTable_mib_index_s {
+-
+- /*
+- * appStatsIndex(1)///()//L/a/w/e/r/d/h
+- */
+- long appStatsIndex;
+-
+-
+- } dessertAppStatsTable_mib_index;
+-
+- /*
+- * TODO:121:r: | |-> Review dessertAppStatsTable max index length.
+- * If you KNOW that your indexes will never exceed a certain
+- * length, update this macro to that length.
+- */
+-#define MAX_dessertAppStatsTable_IDX_LEN 1
+-
+-
+- /*
+- *********************************************************************
+- * TODO:130:o: |-> Review dessertAppStatsTable Row request (rowreq) context.
+- * When your functions are called, you will be passed a
+- * dessertAppStatsTable_rowreq_ctx pointer.
+- */
+- typedef struct dessertAppStatsTable_rowreq_ctx_s {
+-
+- /** this must be first for container compare to work */
+- netsnmp_index oid_idx;
+- oid oid_tmp[MAX_dessertAppStatsTable_IDX_LEN];
+-
+- dessertAppStatsTable_mib_index tbl_idx;
+-
+- dessertAppStatsTable_data data;
+- unsigned int column_exists_flags; /* flags for existence */
+-
+- /*
+- * flags per row. Currently, the first (lower) 8 bits are reserved
+- * for the user. See mfd.h for other flags.
+- */
+- u_int rowreq_flags;
+-
+- /*
+- * TODO:131:o: | |-> Add useful data to dessertAppStatsTable rowreq context.
+- */
+-
+- /*
+- * storage for future expansion
+- */
+- netsnmp_data_list *dessertAppStatsTable_data_list;
+-
+- } dessertAppStatsTable_rowreq_ctx;
+-
+- typedef struct dessertAppStatsTable_ref_rowreq_ctx_s {
+- dessertAppStatsTable_rowreq_ctx *rowreq_ctx;
+- } dessertAppStatsTable_ref_rowreq_ctx;
+-
+- /*
+- *********************************************************************
+- * function prototypes
+- */
+- int
+- dessertAppStatsTable_pre_request(dessertAppStatsTable_registration
+- * user_context);
+- int
+- dessertAppStatsTable_post_request(dessertAppStatsTable_registration
+- * user_context, int rc);
+-
+-
+- dessertAppStatsTable_rowreq_ctx
+- *dessertAppStatsTable_row_find_by_mib_index
+- (dessertAppStatsTable_mib_index * mib_idx);
+-
+- extern oid dessertAppStatsTable_oid[];
+- extern int dessertAppStatsTable_oid_size;
+-
+-
+-#include "dessertAppStatsTable_interface.h"
+-#include "dessertAppStatsTable_data_access.h"
+-#include "dessertAppStatsTable_data_get.h"
+-#include "dessertAppStatsTable_data_set.h"
+-
+- /*
+- * DUMMY markers, ignore
+- *
+- * TODO:099:x: *************************************************************
+- * TODO:199:x: *************************************************************
+- * TODO:299:x: *************************************************************
+- * TODO:399:x: *************************************************************
+- * TODO:499:x: *************************************************************
+- */
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTAPPSTATSTABLE_H */
+-/** @} */
+diff --git a/snmp/dessertAppStatsTable_data_access.c b/snmp/dessertAppStatsTable_data_access.c
+deleted file mode 100644
+index d98e509..0000000
+--- a/snmp/dessertAppStatsTable_data_access.c
++++ /dev/null
+@@ -1,407 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 14170 $ of $
+- *
+- * $Id:$
+- */
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertAppStatsTable.h"
+-#include "dessertAppStatsTable_data_access.h"
+-#include "../dessert.h"
+-#include "../dessert_internal.h"
+-
+-/** @ingroup interface
+- * @addtogroup data_access data_access: Routines to access data
+- *
+- * These routines are used to locate the data used to satisfy
+- * requests.
+- *
+- * @{
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertAppStatsTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+-/*
+- * DESSERT-MIB::dessertAppStatsTable is subid 9 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.9, length: 12
+- */
+-
+-/**
+- * initialization for dessertAppStatsTable data access
+- *
+- * This function is called during startup to allow you to
+- * allocate any resources you need for the data table.
+- *
+- * @param dessertAppStatsTable_reg
+- * Pointer to dessertAppStatsTable_registration
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : unrecoverable error.
+- */
+-int
+-dessertAppStatsTable_init_data(dessertAppStatsTable_registration *
+- dessertAppStatsTable_reg)
+-{
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_init_data", "called\n"));
+-
+- /*
+- * TODO:303:o: Initialize dessertAppStatsTable data.
+- */
+- /*
+- ***************************************************
+- *** START EXAMPLE CODE ***
+- ***---------------------------------------------***/
+- /*
+- * if you are the sole writer for the file, you could
+- * open it here. However, as stated earlier, we are assuming
+- * the worst case, which in this case means that the file is
+- * written to by someone else, and might not even exist when
+- * we start up. So we can't do anything here.
+- */
+- /*
+- ***---------------------------------------------***
+- *** END EXAMPLE CODE ***
+- ***************************************************/
+-
+- return MFD_SUCCESS;
+-} /* dessertAppStatsTable_init_data */
+-
+-/**
+- * container overview
+- *
+- */
+-
+-/**
+- * container initialization
+- *
+- * @param container_ptr_ptr A pointer to a container pointer. If you
+- * create a custom container, use this parameter to return it
+- * to the MFD helper. If set to NULL, the MFD helper will
+- * allocate a container for you.
+- * @param cache A pointer to a cache structure. You can set the timeout
+- * and other cache flags using this pointer.
+- *
+- * This function is called at startup to allow you to customize certain
+- * aspects of the access method. For the most part, it is for advanced
+- * users. The default code should suffice for most cases. If no custom
+- * container is allocated, the MFD code will create one for your.
+- *
+- * This is also the place to set up cache behavior. The default, to
+- * simply set the cache timeout, will work well with the default
+- * container. If you are using a custom container, you may want to
+- * look at the cache helper documentation to see if there are any
+- * flags you want to set.
+- *
+- * @remark
+- * This would also be a good place to do any initialization needed
+- * for you data source. For example, opening a connection to another
+- * process that will supply the data, opening a database, etc.
+- */
+-void
+-dessertAppStatsTable_container_init(netsnmp_container ** container_ptr_ptr,
+- netsnmp_cache * cache)
+-{
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_container_init", "called\n"));
+-
+- if (NULL == container_ptr_ptr) {
+- snmp_log(LOG_ERR,
+- "bad container param to dessertAppStatsTable_container_init\n");
+- return;
+- }
+-
+- /*
+- * For advanced users, you can use a custom container. If you
+- * do not create one, one will be created for you.
+- */
+- *container_ptr_ptr = NULL;
+-
+- if (NULL == cache) {
+- snmp_log(LOG_ERR,
+- "bad cache param to dessertAppStatsTable_container_init\n");
+- return;
+- }
+-
+- /*
+- * TODO:345:A: Set up dessertAppStatsTable cache properties.
+- *
+- * Also for advanced users, you can set parameters for the
+- * cache. Do not change the magic pointer, as it is used
+- * by the MFD helper. To completely disable caching, set
+- * cache->enabled to 0.
+- */
+- cache->timeout = DESSERTAPPSTATSTABLE_CACHE_TIMEOUT; /* seconds */
+-} /* dessertAppStatsTable_container_init */
+-
+-/**
+- * container shutdown
+- *
+- * @param container_ptr A pointer to the container.
+- *
+- * This function is called at shutdown to allow you to customize certain
+- * aspects of the access method. For the most part, it is for advanced
+- * users. The default code should suffice for most cases.
+- *
+- * This function is called before dessertAppStatsTable_container_free().
+- *
+- * @remark
+- * This would also be a good place to do any cleanup needed
+- * for you data source. For example, closing a connection to another
+- * process that supplied the data, closing a database, etc.
+- */
+-void
+-dessertAppStatsTable_container_shutdown(netsnmp_container * container_ptr)
+-{
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_container_shutdown", "called\n"));
+-
+- if (NULL == container_ptr) {
+- snmp_log(LOG_ERR,
+- "bad params to dessertAppStatsTable_container_shutdown\n");
+- return;
+- }
+-
+-} /* dessertAppStatsTable_container_shutdown */
+-
+-/**
+- * load initial data
+- *
+- * This function will also be called by the cache helper to load
+- * the container again (after the container free function has been
+- * called to free the previous contents).
+- *
+- * @param container container to which items should be inserted
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_RESOURCE_UNAVAILABLE : Can't access data source
+- * @retval MFD_ERROR : other error.
+- *
+- * This function is called to load the index(es) (and data, optionally)
+- * for the every row in the data set.
+- *
+- * @remark
+- * While loading the data, the only important thing is the indexes.
+- * If access to your data is cheap/fast (e.g. you have a pointer to a
+- * structure in memory), it would make sense to update the data here.
+- * If, however, the accessing the data invovles more work (e.g. parsing
+- * some other existing data, or peforming calculations to derive the data),
+- * then you can limit yourself to setting the indexes and saving any
+- * information you will need later. Then use the saved information in
+- * dessertAppStatsTable_row_prep() for populating data.
+- *
+- * @note
+- * If you need consistency between rows (like you want statistics
+- * for each row to be from the same time frame), you should set all
+- * data here.
+- *
+- */
+-int dessertAppStatsTable_container_load(netsnmp_container * container) {
+- dessertAppStatsTable_rowreq_ctx *rowreq_ctx;
+- size_t count = 0;
+-
+- dessert_agentx_appstats_t *appstats_list = NULL;
+- dessert_agentx_appstats_t *appstat;
+-
+- /*
+- * temporary storage for index values
+- */
+- long appStatsIndex;
+-
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_container_load", "called\n"));
+- dessert_debug("dessertAppStatsTable_container_load called");
+-
+- /* harvest the appstats from the callbacks registered via *dessert_agentx_appstats_add* */
+- if (_dessert_agentx_appstats_harvest_callbacks(&appstats_list)
+- == DESSERT_ERR)
+- return MFD_RESOURCE_UNAVAILABLE;
+-
+- /*
+- * Load/update data in the dessertAppStatsTable container.
+- * loop over your dessertAppStatsTable data, allocate a rowreq context,
+- * set the index(es) [and data, optionally] and insert into
+- * the container.
+- */
+- DL_FOREACH(appstats_list, appstat) {
+-
+- appStatsIndex = count++;
+-
+- /*
+- * set indexes in new dessertAppStatsTable rowreq context.
+- */
+- rowreq_ctx = dessertAppStatsTable_allocate_rowreq_ctx();
+- if (NULL == rowreq_ctx) {
+- snmp_log(LOG_ERR, "memory allocation failed\n");
+- return MFD_RESOURCE_UNAVAILABLE;
+- }
+- if (MFD_SUCCESS != dessertAppStatsTable_indexes_set(rowreq_ctx,
+- appStatsIndex)) {
+- snmp_log(LOG_ERR, "error setting index while loading "
+- "dessertAppStatsTable data.\n");
+- dessertAppStatsTable_release_rowreq_ctx(rowreq_ctx);
+- continue;
+- }
+-
+- /* clear all column flags */
+- rowreq_ctx->column_exists_flags = 0;
+-
+- /* these columns are always present*/
+- rowreq_ctx->column_exists_flags |= COLUMN_APPSTATSNAME_FLAG
+- | COLUMN_APPSTATSDESC_FLAG | COLUMN_APPSTATSNODEORLINK_FLAG
+- | COLUMN_APPSTATSVALUETYPE_FLAG;
+-
+- rowreq_ctx->data.appStatsName_len = strlen(appstat->name);
+- strcpy(rowreq_ctx->data.appStatsName, appstat->name);
+-
+- rowreq_ctx->data.appStatsDesc_len = strlen(appstat->desc);
+- strcpy(rowreq_ctx->data.appStatsDesc, appstat->desc);
+-
+- appStatsNodeOrLink_map(&(rowreq_ctx->data.appStatsNodeOrLink),appstat->node_or_link);
+- appStatsValueType_map(&(rowreq_ctx->data.appStatsValueType),appstat->value_type);
+-
+- /* are the macaddress? columns present?*/
+- switch (appstat->node_or_link) {
+-
+- case DESSERT_APPSTATS_NODEORLINK_NONE:
+- break;
+- case DESSERT_APPSTATS_NODEORLINK_NODE:
+- rowreq_ctx->column_exists_flags |= COLUMN_APPSTATSMACADDRESS1_FLAG;
+-
+- rowreq_ctx->data.appStatsMacAddress1_len = ETHER_ADDR_LEN;
+- memcpy(rowreq_ctx->data.appStatsMacAddress1, appstat->macaddress1,
+- ETHER_ADDR_LEN);
+-
+- break;
+- case DESSERT_APPSTATS_NODEORLINK_LINK:
+- rowreq_ctx->column_exists_flags |= COLUMN_APPSTATSMACADDRESS1_FLAG
+- | COLUMN_APPSTATSMACADDRESS2_FLAG;
+-
+- rowreq_ctx->data.appStatsMacAddress1_len = ETHER_ADDR_LEN;
+- memcpy(rowreq_ctx->data.appStatsMacAddress1, appstat->macaddress1,
+- ETHER_ADDR_LEN);
+-
+- rowreq_ctx->data.appStatsMacAddress2_len = ETHER_ADDR_LEN;
+- memcpy(rowreq_ctx->data.appStatsMacAddress2, appstat->macaddress2,
+- ETHER_ADDR_LEN);
+-
+- break;
+- default:
+- dessert_err("appstats->node_or_link not valid!");
+- }
+-
+- /* which of the 'value'-columns is actually present? */
+- switch (appstat->value_type) {
+-
+- case DESSERT_APPSTATS_VALUETYPE_BOOL:
+- rowreq_ctx->column_exists_flags |= COLUMN_APPSTATSTRUTHVALUE_FLAG;
+- appStatsTruthValue_map(&(rowreq_ctx->data.appStatsTruthValue),appstat->bool);
+- break;
+-
+- case DESSERT_APPSTATS_VALUETYPE_INT32:
+- rowreq_ctx->column_exists_flags |= COLUMN_APPSTATSINTEGER32_FLAG;
+- rowreq_ctx->data.appStatsInteger32 = appstat->int32;
+-
+- break;
+-
+- case DESSERT_APPSTATS_VALUETYPE_UINT32:
+- rowreq_ctx->column_exists_flags |= COLUMN_APPSTATSUNSIGNED32_FLAG;
+- rowreq_ctx->data.appStatsUnsigned32 = appstat->uint32;
+-
+- break;
+-
+- case DESSERT_APPSTATS_VALUETYPE_COUNTER64:
+- rowreq_ctx->column_exists_flags |= COLUMN_APPSTATSCOUNTER64_FLAG;
+- rowreq_ctx->data.appStatsCounter64.low = appstat->counter64
+- & 0xffffffff;
+- rowreq_ctx->data.appStatsCounter64.high = appstat->counter64 >> 32;
+-
+- break;
+-
+- case DESSERT_APPSTATS_VALUETYPE_OCTETSTRING:
+- rowreq_ctx->column_exists_flags |= COLUMN_APPSTATSOCTETSTRING_FLAG;
+- rowreq_ctx->data.appStatsOctetString_len = appstat->octetstring_len;
+- memcpy(&(rowreq_ctx->data.appStatsOctetString), appstat->octetstring, appstat->octetstring_len);
+-
+- break;
+-
+- default:
+- dessert_err("appstats->value_type not valid! [%s]", appstat->name);
+- }
+-
+- /*
+- * insert into table container
+- */
+- CONTAINER_INSERT(container, rowreq_ctx);
+- }
+-
+- _dessert_agentx_appstats_free_list(&appstats_list);
+-
+- DEBUGMSGT(("verbose:dessertAppStatsTable:dessertAppStatsTable_container_load", "inserted %d records\n", count));
+-
+- return MFD_SUCCESS;
+-} /* dessertAppStatsTable_container_load */
+-
+-/**
+- * container clean up
+- *
+- * @param container container with all current items
+- *
+- * This optional callback is called prior to all
+- * item's being removed from the container. If you
+- * need to do any processing before that, do it here.
+- *
+- * @note
+- * The MFD helper will take care of releasing all the row contexts.
+- *
+- */
+-void
+-dessertAppStatsTable_container_free(netsnmp_container * container)
+-{
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_container_free", "called\n"));
+-
+- /*
+- * TODO:380:M: Free dessertAppStatsTable container data.
+- */
+-} /* dessertAppStatsTable_container_free */
+-
+-/**
+- * prepare row for processing.
+- *
+- * When the agent has located the row for a request, this function is
+- * called to prepare the row for processing. If you fully populated
+- * the data context during the index setup phase, you may not need to
+- * do anything.
+- *
+- * @param rowreq_ctx pointer to a context.
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error.
+- */
+-int
+-dessertAppStatsTable_row_prep(dessertAppStatsTable_rowreq_ctx * rowreq_ctx)
+-{
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_row_prep", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:390:o: Prepare row for request.
+- * If populating row data was delayed, this is the place to
+- * fill in the row for this request.
+- */
+-
+- return MFD_SUCCESS;
+-} /* dessertAppStatsTable_row_prep */
+-
+-/** @} */
+diff --git a/snmp/dessertAppStatsTable_data_access.h b/snmp/dessertAppStatsTable_data_access.h
+deleted file mode 100644
+index 16852fb..0000000
+--- a/snmp/dessertAppStatsTable_data_access.h
++++ /dev/null
+@@ -1,93 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 14170 $ of $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTAPPSTATSTABLE_DATA_ACCESS_H
+-#define DESSERTAPPSTATSTABLE_DATA_ACCESS_H
+-
+-#include "../dessert_internal.h"
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+- /*
+- *********************************************************************
+- * function declarations
+- */
+-
+- /*
+- *********************************************************************
+- * Table declarations
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertAppStatsTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+- /*
+- * DESSERT-MIB::dessertAppStatsTable is subid 9 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.9, length: 12
+- */
+-
+-
+- int
+- dessertAppStatsTable_init_data(dessertAppStatsTable_registration *
+- dessertAppStatsTable_reg);
+-
+-
+- /*
+- * TODO:180:o: Review dessertAppStatsTable cache timeout.
+- * The number of seconds before the cache times out
+- */
+-#define DESSERTAPPSTATSTABLE_CACHE_TIMEOUT DESSERT_AGENTX_APPSTATSTABLE_CACHE_TIMEOUT
+-
+- void dessertAppStatsTable_container_init(netsnmp_container
+- **
+- container_ptr_ptr,
+- netsnmp_cache *
+- cache);
+- void
+- dessertAppStatsTable_container_shutdown(netsnmp_container *
+- container_ptr);
+-
+- int dessertAppStatsTable_container_load(netsnmp_container *
+- container);
+- void dessertAppStatsTable_container_free(netsnmp_container *
+- container);
+-
+- int dessertAppStatsTable_cache_load(netsnmp_container *
+- container);
+- void dessertAppStatsTable_cache_free(netsnmp_container *
+- container);
+-
+- /*
+- ***************************************************
+- *** START EXAMPLE CODE ***
+- ***---------------------------------------------***/
+- /*
+- *********************************************************************
+- * Since we have no idea how you really access your data, we'll go with
+- * a worst case example: a flat text file.
+- */
+-#define MAX_LINE_SIZE 256
+- /*
+- ***---------------------------------------------***
+- *** END EXAMPLE CODE ***
+- ***************************************************/
+- int
+- dessertAppStatsTable_row_prep(dessertAppStatsTable_rowreq_ctx *
+- rowreq_ctx);
+-
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTAPPSTATSTABLE_DATA_ACCESS_H */
+diff --git a/snmp/dessertAppStatsTable_data_get.c b/snmp/dessertAppStatsTable_data_get.c
+deleted file mode 100644
+index 1185126..0000000
+--- a/snmp/dessertAppStatsTable_data_get.c
++++ /dev/null
+@@ -1,1088 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 12088 $ of $
+- *
+- * $Id:$
+- */
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertAppStatsTable.h"
+-
+-
+-/** @defgroup data_get data_get: Routines to get data
+- *
+- * TODO:230:M: Implement dessertAppStatsTable get routines.
+- * TODO:240:M: Implement dessertAppStatsTable mapping routines (if any).
+- *
+- * These routine are used to get the value for individual objects. The
+- * row context is passed, along with a pointer to the memory where the
+- * value should be copied.
+- *
+- * @{
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertAppStatsTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+-/*
+- * DESSERT-MIB::dessertAppStatsTable is subid 9 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.9, length: 12
+- */
+-
+-/*
+- * ---------------------------------------------------------------------
+- * * TODO:200:r: Implement dessertAppStatsTable data context functions.
+- */
+-
+-
+-/**
+- * set mib index(es)
+- *
+- * @param tbl_idx mib index structure
+- * @param appStatsIndex_val
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error.
+- *
+- * @remark
+- * This convenience function is useful for setting all the MIB index
+- * components with a single function call. It is assume that the C values
+- * have already been mapped from their native/rawformat to the MIB format.
+- */
+-int
+-dessertAppStatsTable_indexes_set_tbl_idx(dessertAppStatsTable_mib_index *
+- tbl_idx, long appStatsIndex_val)
+-{
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_indexes_set_tbl_idx", "called\n"));
+-
+- /*
+- * appStatsIndex(1)///()//L/a/w/e/r/d/h
+- */
+- tbl_idx->appStatsIndex = appStatsIndex_val;
+-
+-
+- return MFD_SUCCESS;
+-} /* dessertAppStatsTable_indexes_set_tbl_idx */
+-
+-/**
+- * @internal
+- * set row context indexes
+- *
+- * @param reqreq_ctx the row context that needs updated indexes
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error.
+- *
+- * @remark
+- * This function sets the mib indexs, then updates the oid indexs
+- * from the mib index.
+- */
+-int
+-dessertAppStatsTable_indexes_set(dessertAppStatsTable_rowreq_ctx *
+- rowreq_ctx, long appStatsIndex_val)
+-{
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_indexes_set", "called\n"));
+-
+- if (MFD_SUCCESS !=
+- dessertAppStatsTable_indexes_set_tbl_idx(&rowreq_ctx->tbl_idx,
+- appStatsIndex_val))
+- return MFD_ERROR;
+-
+- /*
+- * convert mib index to oid index
+- */
+- rowreq_ctx->oid_idx.len = sizeof(rowreq_ctx->oid_tmp) / sizeof(oid);
+- if (0 != dessertAppStatsTable_index_to_oid(&rowreq_ctx->oid_idx,
+- &rowreq_ctx->tbl_idx)) {
+- return MFD_ERROR;
+- }
+-
+- return MFD_SUCCESS;
+-} /* dessertAppStatsTable_indexes_set */
+-
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppStatsEntry.appStatsName
+- * appStatsName is subid 2 of dessertAppStatsEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.2
+- * Description:
+-The name of the statistical datum
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 1 hashint 1
+- * settable 0
+- * hint: 255a
+- *
+- * Ranges: 0 - 255;
+- *
+- * Its syntax is DisplayString (based on perltype OCTETSTR)
+- * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+- * This data type requires a length. (Max 255)
+- */
+-/**
+- * Extract the current value of the appStatsName data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appStatsName_val_ptr_ptr
+- * Pointer to storage for a char variable
+- * @param appStatsName_val_ptr_len_ptr
+- * Pointer to a size_t. On entry, it will contain the size (in bytes)
+- * pointed to by appStatsName.
+- * On exit, this value should contain the data size (in bytes).
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+-*
+- * @note If you need more than (*appStatsName_val_ptr_len_ptr) bytes of memory,
+- * allocate it using malloc() and update appStatsName_val_ptr_ptr.
+- * <b>DO NOT</b> free the previous pointer.
+- * The MFD helper will release the memory you allocate.
+- *
+- * @remark If you call this function yourself, you are responsible
+- * for checking if the pointer changed, and freeing any
+- * previously allocated memory. (Not necessary if you pass
+- * in a pointer to static memory, obviously.)
+- */
+-int
+-appStatsName_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
+- char **appStatsName_val_ptr_ptr,
+- size_t *appStatsName_val_ptr_len_ptr)
+-{
+- /** we should have a non-NULL pointer and enough storage */
+- netsnmp_assert((NULL != appStatsName_val_ptr_ptr)
+- && (NULL != *appStatsName_val_ptr_ptr));
+- netsnmp_assert(NULL != appStatsName_val_ptr_len_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsName_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the appStatsName data.
+- * copy (* appStatsName_val_ptr_ptr ) data and (* appStatsName_val_ptr_len_ptr ) from rowreq_ctx->data
+- */
+- /*
+- * make sure there is enough space for appStatsName data
+- */
+- if ((NULL == (*appStatsName_val_ptr_ptr)) ||
+- ((*appStatsName_val_ptr_len_ptr) <
+- (rowreq_ctx->data.appStatsName_len *
+- sizeof(rowreq_ctx->data.appStatsName[0])))) {
+- /*
+- * allocate space for appStatsName data
+- */
+- (*appStatsName_val_ptr_ptr) =
+- malloc(rowreq_ctx->data.appStatsName_len *
+- sizeof(rowreq_ctx->data.appStatsName[0]));
+- if (NULL == (*appStatsName_val_ptr_ptr)) {
+- snmp_log(LOG_ERR, "could not allocate memory\n");
+- return MFD_ERROR;
+- }
+- }
+- (*appStatsName_val_ptr_len_ptr) =
+- rowreq_ctx->data.appStatsName_len *
+- sizeof(rowreq_ctx->data.appStatsName[0]);
+- memcpy((*appStatsName_val_ptr_ptr), rowreq_ctx->data.appStatsName,
+- rowreq_ctx->data.appStatsName_len *
+- sizeof(rowreq_ctx->data.appStatsName[0]));
+-
+- return MFD_SUCCESS;
+-} /* appStatsName_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppStatsEntry.appStatsDesc
+- * appStatsDesc is subid 3 of dessertAppStatsEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.3
+- * Description:
+-A short description of the statistical datum
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 1 hashint 1
+- * settable 0
+- * hint: 255a
+- *
+- * Ranges: 0 - 255;
+- *
+- * Its syntax is DisplayString (based on perltype OCTETSTR)
+- * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+- * This data type requires a length. (Max 255)
+- */
+-/**
+- * Extract the current value of the appStatsDesc data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appStatsDesc_val_ptr_ptr
+- * Pointer to storage for a char variable
+- * @param appStatsDesc_val_ptr_len_ptr
+- * Pointer to a size_t. On entry, it will contain the size (in bytes)
+- * pointed to by appStatsDesc.
+- * On exit, this value should contain the data size (in bytes).
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+-*
+- * @note If you need more than (*appStatsDesc_val_ptr_len_ptr) bytes of memory,
+- * allocate it using malloc() and update appStatsDesc_val_ptr_ptr.
+- * <b>DO NOT</b> free the previous pointer.
+- * The MFD helper will release the memory you allocate.
+- *
+- * @remark If you call this function yourself, you are responsible
+- * for checking if the pointer changed, and freeing any
+- * previously allocated memory. (Not necessary if you pass
+- * in a pointer to static memory, obviously.)
+- */
+-int
+-appStatsDesc_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
+- char **appStatsDesc_val_ptr_ptr,
+- size_t *appStatsDesc_val_ptr_len_ptr)
+-{
+- /** we should have a non-NULL pointer and enough storage */
+- netsnmp_assert((NULL != appStatsDesc_val_ptr_ptr)
+- && (NULL != *appStatsDesc_val_ptr_ptr));
+- netsnmp_assert(NULL != appStatsDesc_val_ptr_len_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsDesc_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the appStatsDesc data.
+- * copy (* appStatsDesc_val_ptr_ptr ) data and (* appStatsDesc_val_ptr_len_ptr ) from rowreq_ctx->data
+- */
+- /*
+- * make sure there is enough space for appStatsDesc data
+- */
+- if ((NULL == (*appStatsDesc_val_ptr_ptr)) ||
+- ((*appStatsDesc_val_ptr_len_ptr) <
+- (rowreq_ctx->data.appStatsDesc_len *
+- sizeof(rowreq_ctx->data.appStatsDesc[0])))) {
+- /*
+- * allocate space for appStatsDesc data
+- */
+- (*appStatsDesc_val_ptr_ptr) =
+- malloc(rowreq_ctx->data.appStatsDesc_len *
+- sizeof(rowreq_ctx->data.appStatsDesc[0]));
+- if (NULL == (*appStatsDesc_val_ptr_ptr)) {
+- snmp_log(LOG_ERR, "could not allocate memory\n");
+- return MFD_ERROR;
+- }
+- }
+- (*appStatsDesc_val_ptr_len_ptr) =
+- rowreq_ctx->data.appStatsDesc_len *
+- sizeof(rowreq_ctx->data.appStatsDesc[0]);
+- memcpy((*appStatsDesc_val_ptr_ptr), rowreq_ctx->data.appStatsDesc,
+- rowreq_ctx->data.appStatsDesc_len *
+- sizeof(rowreq_ctx->data.appStatsDesc[0]));
+-
+- return MFD_SUCCESS;
+-} /* appStatsDesc_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppStatsEntry.appStatsNodeOrLink
+- * appStatsNodeOrLink is subid 4 of dessertAppStatsEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.4
+- * Description:
+-Determines which of the appStatsMacAddress{1,2} coloumns
+- is valid and therefore indicates whether the information provided
+- by this row relates to a node or a link.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 1 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 0
+- *
+- * Enum range: 3/8. Values: none(0), node(1), link(2)
+- *
+- * Its syntax is INTEGER (based on perltype INTEGER)
+- * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
+- */
+-/**
+- * map a value from its original native format to the MIB format.
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_ERROR : Any other error
+- *
+- * @note parameters follow the memset convention (dest, src).
+- *
+- * @note generation and use of this function can be turned off by re-running
+- * mib2c after adding the following line to the file
+- * defaults/node-appStatsNodeOrLink.m2d :
+- * @eval $m2c_node_skip_mapping = 1@
+- *
+- * @remark
+- * If the values for your data type don't exactly match the
+- * possible values defined by the mib, you should map them here.
+- * Otherwise, just do a direct copy.
+- */
+-int
+-appStatsNodeOrLink_map(u_long * mib_appStatsNodeOrLink_val_ptr,
+- u_long raw_appStatsNodeOrLink_val)
+-{
+- netsnmp_assert(NULL != mib_appStatsNodeOrLink_val_ptr);
+-
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsNodeOrLink_map",
+- "called\n"));
+-
+- /*
+- * TODO:241:o: |-> Implement appStatsNodeOrLink enum mapping.
+- * uses INTERNAL_* macros defined in the header files
+- */
+- switch (raw_appStatsNodeOrLink_val) {
+- case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSNODEORLINK_NONE:
+- *mib_appStatsNodeOrLink_val_ptr = APPSTATSNODEORLINK_NONE;
+- break;
+-
+- case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSNODEORLINK_NODE:
+- *mib_appStatsNodeOrLink_val_ptr = APPSTATSNODEORLINK_NODE;
+- break;
+-
+- case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSNODEORLINK_LINK:
+- *mib_appStatsNodeOrLink_val_ptr = APPSTATSNODEORLINK_LINK;
+- break;
+-
+- default:
+- snmp_log(LOG_ERR,
+- "couldn't map value %ld for appStatsNodeOrLink\n",
+- raw_appStatsNodeOrLink_val);
+- return MFD_ERROR;
+- }
+-
+- return MFD_SUCCESS;
+-} /* appStatsNodeOrLink_map */
+-
+-/**
+- * Extract the current value of the appStatsNodeOrLink data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appStatsNodeOrLink_val_ptr
+- * Pointer to storage for a long variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-appStatsNodeOrLink_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
+- u_long * appStatsNodeOrLink_val_ptr)
+-{
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != appStatsNodeOrLink_val_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsNodeOrLink_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the appStatsNodeOrLink data.
+- * copy (* appStatsNodeOrLink_val_ptr ) from rowreq_ctx->data
+- */
+- (*appStatsNodeOrLink_val_ptr) = rowreq_ctx->data.appStatsNodeOrLink;
+-
+- return MFD_SUCCESS;
+-} /* appStatsNodeOrLink_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppStatsEntry.appStatsValueType
+- * appStatsValueType is subid 5 of dessertAppStatsEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.5
+- * Description:
+-Indicates which of the coloumns (appStatsTruthValue,
+- appStatsInterger32, appStatsUInteger32, appStatsCounter64,
+- appStatsOctetString) in the dessertAppStatsTable is actually valid.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 1 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 0
+- *
+- * Enum range: 3/8. Values: bool(0), int32(1), uint32(2), counter64(3), octetstring(4)
+- *
+- * Its syntax is INTEGER (based on perltype INTEGER)
+- * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
+- */
+-/**
+- * map a value from its original native format to the MIB format.
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_ERROR : Any other error
+- *
+- * @note parameters follow the memset convention (dest, src).
+- *
+- * @note generation and use of this function can be turned off by re-running
+- * mib2c after adding the following line to the file
+- * defaults/node-appStatsValueType.m2d :
+- * @eval $m2c_node_skip_mapping = 1@
+- *
+- * @remark
+- * If the values for your data type don't exactly match the
+- * possible values defined by the mib, you should map them here.
+- * Otherwise, just do a direct copy.
+- */
+-int
+-appStatsValueType_map(u_long * mib_appStatsValueType_val_ptr,
+- u_long raw_appStatsValueType_val)
+-{
+- netsnmp_assert(NULL != mib_appStatsValueType_val_ptr);
+-
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsValueType_map",
+- "called\n"));
+-
+- /*
+- * TODO:241:o: |-> Implement appStatsValueType enum mapping.
+- * uses INTERNAL_* macros defined in the header files
+- */
+- switch (raw_appStatsValueType_val) {
+- case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_BOOL:
+- *mib_appStatsValueType_val_ptr = APPSTATSVALUETYPE_BOOL;
+- break;
+-
+- case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_INT32:
+- *mib_appStatsValueType_val_ptr = APPSTATSVALUETYPE_INT32;
+- break;
+-
+- case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_UINT32:
+- *mib_appStatsValueType_val_ptr = APPSTATSVALUETYPE_UINT32;
+- break;
+-
+- case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_COUNTER64:
+- *mib_appStatsValueType_val_ptr = APPSTATSVALUETYPE_COUNTER64;
+- break;
+-
+- case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_OCTETSTRING:
+- *mib_appStatsValueType_val_ptr = APPSTATSVALUETYPE_OCTETSTRING;
+- break;
+-
+- default:
+- snmp_log(LOG_ERR, "couldn't map value %ld for appStatsValueType\n",
+- raw_appStatsValueType_val);
+- return MFD_ERROR;
+- }
+-
+- return MFD_SUCCESS;
+-} /* appStatsValueType_map */
+-
+-/**
+- * Extract the current value of the appStatsValueType data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appStatsValueType_val_ptr
+- * Pointer to storage for a long variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-appStatsValueType_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
+- u_long * appStatsValueType_val_ptr)
+-{
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != appStatsValueType_val_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsValueType_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the appStatsValueType data.
+- * copy (* appStatsValueType_val_ptr ) from rowreq_ctx->data
+- */
+- (*appStatsValueType_val_ptr) = rowreq_ctx->data.appStatsValueType;
+-
+- return MFD_SUCCESS;
+-} /* appStatsValueType_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppStatsEntry.appStatsMacAddress1
+- * appStatsMacAddress1 is subid 6 of dessertAppStatsEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.6
+- * Description:
+-The hardware address of a node.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 1 hashint 1
+- * settable 0
+- * hint: 1x:
+- *
+- * Ranges: 6;
+- *
+- * Its syntax is MacAddress (based on perltype OCTETSTR)
+- * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+- * This data type requires a length. (Max 6)
+- */
+-/**
+- * Extract the current value of the appStatsMacAddress1 data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appStatsMacAddress1_val_ptr_ptr
+- * Pointer to storage for a char variable
+- * @param appStatsMacAddress1_val_ptr_len_ptr
+- * Pointer to a size_t. On entry, it will contain the size (in bytes)
+- * pointed to by appStatsMacAddress1.
+- * On exit, this value should contain the data size (in bytes).
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+-*
+- * @note If you need more than (*appStatsMacAddress1_val_ptr_len_ptr) bytes of memory,
+- * allocate it using malloc() and update appStatsMacAddress1_val_ptr_ptr.
+- * <b>DO NOT</b> free the previous pointer.
+- * The MFD helper will release the memory you allocate.
+- *
+- * @remark If you call this function yourself, you are responsible
+- * for checking if the pointer changed, and freeing any
+- * previously allocated memory. (Not necessary if you pass
+- * in a pointer to static memory, obviously.)
+- */
+-int
+-appStatsMacAddress1_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
+- char **appStatsMacAddress1_val_ptr_ptr,
+- size_t *appStatsMacAddress1_val_ptr_len_ptr)
+-{
+- /** we should have a non-NULL pointer and enough storage */
+- netsnmp_assert((NULL != appStatsMacAddress1_val_ptr_ptr)
+- && (NULL != *appStatsMacAddress1_val_ptr_ptr));
+- netsnmp_assert(NULL != appStatsMacAddress1_val_ptr_len_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsMacAddress1_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the appStatsMacAddress1 data.
+- * copy (* appStatsMacAddress1_val_ptr_ptr ) data and (* appStatsMacAddress1_val_ptr_len_ptr ) from rowreq_ctx->data
+- */
+- /*
+- * make sure there is enough space for appStatsMacAddress1 data
+- */
+- if ((NULL == (*appStatsMacAddress1_val_ptr_ptr)) ||
+- ((*appStatsMacAddress1_val_ptr_len_ptr) <
+- (rowreq_ctx->data.appStatsMacAddress1_len *
+- sizeof(rowreq_ctx->data.appStatsMacAddress1[0])))) {
+- /*
+- * allocate space for appStatsMacAddress1 data
+- */
+- (*appStatsMacAddress1_val_ptr_ptr) =
+- malloc(rowreq_ctx->data.appStatsMacAddress1_len *
+- sizeof(rowreq_ctx->data.appStatsMacAddress1[0]));
+- if (NULL == (*appStatsMacAddress1_val_ptr_ptr)) {
+- snmp_log(LOG_ERR, "could not allocate memory\n");
+- return MFD_ERROR;
+- }
+- }
+- (*appStatsMacAddress1_val_ptr_len_ptr) =
+- rowreq_ctx->data.appStatsMacAddress1_len *
+- sizeof(rowreq_ctx->data.appStatsMacAddress1[0]);
+- memcpy((*appStatsMacAddress1_val_ptr_ptr),
+- rowreq_ctx->data.appStatsMacAddress1,
+- rowreq_ctx->data.appStatsMacAddress1_len *
+- sizeof(rowreq_ctx->data.appStatsMacAddress1[0]));
+-
+- return MFD_SUCCESS;
+-} /* appStatsMacAddress1_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppStatsEntry.appStatsMacAddress2
+- * appStatsMacAddress2 is subid 7 of dessertAppStatsEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.7
+- * Description:
+-The hardware address of a second node.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 1 hashint 1
+- * settable 0
+- * hint: 1x:
+- *
+- * Ranges: 6;
+- *
+- * Its syntax is MacAddress (based on perltype OCTETSTR)
+- * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+- * This data type requires a length. (Max 6)
+- */
+-/**
+- * Extract the current value of the appStatsMacAddress2 data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appStatsMacAddress2_val_ptr_ptr
+- * Pointer to storage for a char variable
+- * @param appStatsMacAddress2_val_ptr_len_ptr
+- * Pointer to a size_t. On entry, it will contain the size (in bytes)
+- * pointed to by appStatsMacAddress2.
+- * On exit, this value should contain the data size (in bytes).
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+-*
+- * @note If you need more than (*appStatsMacAddress2_val_ptr_len_ptr) bytes of memory,
+- * allocate it using malloc() and update appStatsMacAddress2_val_ptr_ptr.
+- * <b>DO NOT</b> free the previous pointer.
+- * The MFD helper will release the memory you allocate.
+- *
+- * @remark If you call this function yourself, you are responsible
+- * for checking if the pointer changed, and freeing any
+- * previously allocated memory. (Not necessary if you pass
+- * in a pointer to static memory, obviously.)
+- */
+-int
+-appStatsMacAddress2_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
+- char **appStatsMacAddress2_val_ptr_ptr,
+- size_t *appStatsMacAddress2_val_ptr_len_ptr)
+-{
+- /** we should have a non-NULL pointer and enough storage */
+- netsnmp_assert((NULL != appStatsMacAddress2_val_ptr_ptr)
+- && (NULL != *appStatsMacAddress2_val_ptr_ptr));
+- netsnmp_assert(NULL != appStatsMacAddress2_val_ptr_len_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsMacAddress2_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the appStatsMacAddress2 data.
+- * copy (* appStatsMacAddress2_val_ptr_ptr ) data and (* appStatsMacAddress2_val_ptr_len_ptr ) from rowreq_ctx->data
+- */
+- /*
+- * make sure there is enough space for appStatsMacAddress2 data
+- */
+- if ((NULL == (*appStatsMacAddress2_val_ptr_ptr)) ||
+- ((*appStatsMacAddress2_val_ptr_len_ptr) <
+- (rowreq_ctx->data.appStatsMacAddress2_len *
+- sizeof(rowreq_ctx->data.appStatsMacAddress2[0])))) {
+- /*
+- * allocate space for appStatsMacAddress2 data
+- */
+- (*appStatsMacAddress2_val_ptr_ptr) =
+- malloc(rowreq_ctx->data.appStatsMacAddress2_len *
+- sizeof(rowreq_ctx->data.appStatsMacAddress2[0]));
+- if (NULL == (*appStatsMacAddress2_val_ptr_ptr)) {
+- snmp_log(LOG_ERR, "could not allocate memory\n");
+- return MFD_ERROR;
+- }
+- }
+- (*appStatsMacAddress2_val_ptr_len_ptr) =
+- rowreq_ctx->data.appStatsMacAddress2_len *
+- sizeof(rowreq_ctx->data.appStatsMacAddress2[0]);
+- memcpy((*appStatsMacAddress2_val_ptr_ptr),
+- rowreq_ctx->data.appStatsMacAddress2,
+- rowreq_ctx->data.appStatsMacAddress2_len *
+- sizeof(rowreq_ctx->data.appStatsMacAddress2[0]));
+-
+- return MFD_SUCCESS;
+-} /* appStatsMacAddress2_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppStatsEntry.appStatsTruthValue
+- * appStatsTruthValue is subid 8 of dessertAppStatsEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.8
+- * Description:
+-A statistical datum with TruthValue semantics.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 1 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 0
+- *
+- * Enum range: 2/8. Values: true(1), false(2)
+- *
+- * Its syntax is TruthValue (based on perltype INTEGER)
+- * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
+- */
+-/**
+- * map a value from its original native format to the MIB format.
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_ERROR : Any other error
+- *
+- * @note parameters follow the memset convention (dest, src).
+- *
+- * @note generation and use of this function can be turned off by re-running
+- * mib2c after adding the following line to the file
+- * defaults/node-appStatsTruthValue.m2d :
+- * @eval $m2c_node_skip_mapping = 1@
+- *
+- * @remark
+- * If the values for your data type don't exactly match the
+- * possible values defined by the mib, you should map them here.
+- * Otherwise, just do a direct copy.
+- */
+-int
+-appStatsTruthValue_map(u_long * mib_appStatsTruthValue_val_ptr,
+- u_long raw_appStatsTruthValue_val)
+-{
+- netsnmp_assert(NULL != mib_appStatsTruthValue_val_ptr);
+-
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsTruthValue_map",
+- "called\n"));
+-
+- /*
+- * TODO:241:o: |-> Implement appStatsTruthValue enum mapping.
+- * uses INTERNAL_* macros defined in the header files
+- */
+- switch (raw_appStatsTruthValue_val) {
+- case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSTRUTHVALUE_TRUE:
+- *mib_appStatsTruthValue_val_ptr = TRUTHVALUE_TRUE;
+- break;
+-
+- case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSTRUTHVALUE_FALSE:
+- *mib_appStatsTruthValue_val_ptr = TRUTHVALUE_FALSE;
+- break;
+-
+- default:
+- snmp_log(LOG_ERR,
+- "couldn't map value %ld for appStatsTruthValue\n",
+- raw_appStatsTruthValue_val);
+- return MFD_ERROR;
+- }
+-
+- return MFD_SUCCESS;
+-} /* appStatsTruthValue_map */
+-
+-/**
+- * Extract the current value of the appStatsTruthValue data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appStatsTruthValue_val_ptr
+- * Pointer to storage for a long variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-appStatsTruthValue_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
+- u_long * appStatsTruthValue_val_ptr)
+-{
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != appStatsTruthValue_val_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsTruthValue_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the appStatsTruthValue data.
+- * copy (* appStatsTruthValue_val_ptr ) from rowreq_ctx->data
+- */
+- (*appStatsTruthValue_val_ptr) = rowreq_ctx->data.appStatsTruthValue;
+-
+- return MFD_SUCCESS;
+-} /* appStatsTruthValue_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppStatsEntry.appStatsInteger32
+- * appStatsInteger32 is subid 9 of dessertAppStatsEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.9
+- * Description:
+-A statistical datum with Integer32 semantics.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 0
+- *
+- *
+- * Its syntax is INTEGER32 (based on perltype INTEGER32)
+- * The net-snmp type is ASN_INTEGER. The C type decl is long (long)
+- */
+-/**
+- * Extract the current value of the appStatsInteger32 data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appStatsInteger32_val_ptr
+- * Pointer to storage for a long variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-appStatsInteger32_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
+- long *appStatsInteger32_val_ptr)
+-{
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != appStatsInteger32_val_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsInteger32_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the appStatsInteger32 data.
+- * copy (* appStatsInteger32_val_ptr ) from rowreq_ctx->data
+- */
+- (*appStatsInteger32_val_ptr) = rowreq_ctx->data.appStatsInteger32;
+-
+- return MFD_SUCCESS;
+-} /* appStatsInteger32_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppStatsEntry.appStatsUnsigned32
+- * appStatsUnsigned32 is subid 10 of dessertAppStatsEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.10
+- * Description:
+-A statistical datum with Unsigned32 semantics.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 0
+- *
+- *
+- * Its syntax is UNSIGNED32 (based on perltype UNSIGNED32)
+- * The net-snmp type is ASN_UNSIGNED. The C type decl is u_long (u_long)
+- */
+-/**
+- * Extract the current value of the appStatsUnsigned32 data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appStatsUnsigned32_val_ptr
+- * Pointer to storage for a u_long variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-appStatsUnsigned32_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
+- u_long * appStatsUnsigned32_val_ptr)
+-{
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != appStatsUnsigned32_val_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsUnsigned32_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the appStatsUnsigned32 data.
+- * copy (* appStatsUnsigned32_val_ptr ) from rowreq_ctx->data
+- */
+- (*appStatsUnsigned32_val_ptr) = rowreq_ctx->data.appStatsUnsigned32;
+-
+- return MFD_SUCCESS;
+-} /* appStatsUnsigned32_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppStatsEntry.appStatsCounter64
+- * appStatsCounter64 is subid 11 of dessertAppStatsEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.11
+- * Description:
+-A statistical datum with Counter64 semantics.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 0
+- *
+- *
+- * Its syntax is COUNTER64 (based on perltype COUNTER64)
+- * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+- */
+-/**
+- * Extract the current value of the appStatsCounter64 data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appStatsCounter64_val_ptr
+- * Pointer to storage for a U64 variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-appStatsCounter64_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
+- U64 * appStatsCounter64_val_ptr)
+-{
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != appStatsCounter64_val_ptr);
+-
+- /*
+- * TODO:231:o: |-> copy appStatsCounter64 data.
+- * get (* appStatsCounter64_val_ptr ).low and (* appStatsCounter64_val_ptr ).high from rowreq_ctx->data
+- */
+- (*appStatsCounter64_val_ptr).high =
+- rowreq_ctx->data.appStatsCounter64.high;
+- (*appStatsCounter64_val_ptr).low =
+- rowreq_ctx->data.appStatsCounter64.low;
+-
+-
+- return MFD_SUCCESS;
+-} /* appStatsCounter64_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertAppStatsEntry.appStatsOctetString
+- * appStatsOctetString is subid 12 of dessertAppStatsEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.12
+- * Description:
+-A statistical datum containing of up to 1024 octets.
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 1 hashint 0
+- * settable 0
+- *
+- * Ranges: 0 - 1024;
+- *
+- * Its syntax is OCTETSTR (based on perltype OCTETSTR)
+- * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+- * This data type requires a length. (Max 1024)
+- */
+-/**
+- * Extract the current value of the appStatsOctetString data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param appStatsOctetString_val_ptr_ptr
+- * Pointer to storage for a char variable
+- * @param appStatsOctetString_val_ptr_len_ptr
+- * Pointer to a size_t. On entry, it will contain the size (in bytes)
+- * pointed to by appStatsOctetString.
+- * On exit, this value should contain the data size (in bytes).
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+-*
+- * @note If you need more than (*appStatsOctetString_val_ptr_len_ptr) bytes of memory,
+- * allocate it using malloc() and update appStatsOctetString_val_ptr_ptr.
+- * <b>DO NOT</b> free the previous pointer.
+- * The MFD helper will release the memory you allocate.
+- *
+- * @remark If you call this function yourself, you are responsible
+- * for checking if the pointer changed, and freeing any
+- * previously allocated memory. (Not necessary if you pass
+- * in a pointer to static memory, obviously.)
+- */
+-int
+-appStatsOctetString_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
+- char **appStatsOctetString_val_ptr_ptr,
+- size_t *appStatsOctetString_val_ptr_len_ptr)
+-{
+- /** we should have a non-NULL pointer and enough storage */
+- netsnmp_assert((NULL != appStatsOctetString_val_ptr_ptr)
+- && (NULL != *appStatsOctetString_val_ptr_ptr));
+- netsnmp_assert(NULL != appStatsOctetString_val_ptr_len_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsOctetString_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the appStatsOctetString data.
+- * copy (* appStatsOctetString_val_ptr_ptr ) data and (* appStatsOctetString_val_ptr_len_ptr ) from rowreq_ctx->data
+- */
+- /*
+- * make sure there is enough space for appStatsOctetString data
+- */
+- if ((NULL == (*appStatsOctetString_val_ptr_ptr)) ||
+- ((*appStatsOctetString_val_ptr_len_ptr) <
+- (rowreq_ctx->data.appStatsOctetString_len *
+- sizeof(rowreq_ctx->data.appStatsOctetString[0])))) {
+- /*
+- * allocate space for appStatsOctetString data
+- */
+- (*appStatsOctetString_val_ptr_ptr) =
+- malloc(rowreq_ctx->data.appStatsOctetString_len *
+- sizeof(rowreq_ctx->data.appStatsOctetString[0]));
+- if (NULL == (*appStatsOctetString_val_ptr_ptr)) {
+- snmp_log(LOG_ERR, "could not allocate memory\n");
+- return MFD_ERROR;
+- }
+- }
+- (*appStatsOctetString_val_ptr_len_ptr) =
+- rowreq_ctx->data.appStatsOctetString_len *
+- sizeof(rowreq_ctx->data.appStatsOctetString[0]);
+- memcpy((*appStatsOctetString_val_ptr_ptr),
+- rowreq_ctx->data.appStatsOctetString,
+- rowreq_ctx->data.appStatsOctetString_len *
+- sizeof(rowreq_ctx->data.appStatsOctetString[0]));
+-
+- return MFD_SUCCESS;
+-} /* appStatsOctetString_get */
+-
+-
+-
+-/** @} */
+diff --git a/snmp/dessertAppStatsTable_data_get.h b/snmp/dessertAppStatsTable_data_get.h
+deleted file mode 100644
+index b109d9c..0000000
+--- a/snmp/dessertAppStatsTable_data_get.h
++++ /dev/null
+@@ -1,174 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 12088 $ of $
+- *
+- * $Id:$
+- *
+- * @file dessertAppStatsTable_data_get.h
+- *
+- * @addtogroup get
+- *
+- * Prototypes for get functions
+- *
+- * @{
+- */
+-#ifndef DESSERTAPPSTATSTABLE_DATA_GET_H
+-#define DESSERTAPPSTATSTABLE_DATA_GET_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+- /*
+- *********************************************************************
+- * GET function declarations
+- */
+-
+- /*
+- *********************************************************************
+- * GET Table declarations
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertAppStatsTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+- /*
+- * DESSERT-MIB::dessertAppStatsTable is subid 9 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.9, length: 12
+- */
+- /*
+- * indexes
+- */
+- int appStatsIndex_map(uint *mib_appStatsIndex_val_ptr, uint
+- raw_appStatsIndex_val);
+-
+- int appStatsName_map(char **mib_appStatsName_val_ptr_ptr,
+- size_t
+- *mib_appStatsName_val_ptr_len_ptr,
+- char *raw_appStatsName_val_ptr,
+- size_t raw_appStatsName_val_ptr_len,
+- int allow_realloc);
+- int appStatsName_get(dessertAppStatsTable_rowreq_ctx *
+- rowreq_ctx,
+- char **appStatsName_val_ptr_ptr,
+- size_t *appStatsName_val_ptr_len_ptr);
+- int appStatsDesc_map(char **mib_appStatsDesc_val_ptr_ptr,
+- size_t
+- *mib_appStatsDesc_val_ptr_len_ptr,
+- char *raw_appStatsDesc_val_ptr,
+- size_t raw_appStatsDesc_val_ptr_len,
+- int allow_realloc);
+- int appStatsDesc_get(dessertAppStatsTable_rowreq_ctx *
+- rowreq_ctx,
+- char **appStatsDesc_val_ptr_ptr,
+- size_t *appStatsDesc_val_ptr_len_ptr);
+- int appStatsNodeOrLink_map(u_long *
+- mib_appStatsNodeOrLink_val_ptr,
+- u_long
+- raw_appStatsNodeOrLink_val);
+- int appStatsNodeOrLink_get(dessertAppStatsTable_rowreq_ctx
+- * rowreq_ctx,
+- u_long *
+- appStatsNodeOrLink_val_ptr);
+- int appStatsValueType_map(u_long *
+- mib_appStatsValueType_val_ptr,
+- u_long
+- raw_appStatsValueType_val);
+- int appStatsValueType_get(dessertAppStatsTable_rowreq_ctx *
+- rowreq_ctx,
+- u_long *
+- appStatsValueType_val_ptr);
+- int appStatsMacAddress1_map(char
+- **mib_appStatsMacAddress1_val_ptr_ptr,
+- size_t
+- *mib_appStatsMacAddress1_val_ptr_len_ptr,
+- char
+- *raw_appStatsMacAddress1_val_ptr,
+- size_t
+- raw_appStatsMacAddress1_val_ptr_len,
+- int allow_realloc);
+- int appStatsMacAddress1_get(dessertAppStatsTable_rowreq_ctx
+- * rowreq_ctx,
+- char
+- **appStatsMacAddress1_val_ptr_ptr,
+- size_t
+- *appStatsMacAddress1_val_ptr_len_ptr);
+- int appStatsMacAddress2_map(char
+- **mib_appStatsMacAddress2_val_ptr_ptr,
+- size_t
+- *mib_appStatsMacAddress2_val_ptr_len_ptr,
+- char
+- *raw_appStatsMacAddress2_val_ptr,
+- size_t
+- raw_appStatsMacAddress2_val_ptr_len,
+- int allow_realloc);
+- int appStatsMacAddress2_get(dessertAppStatsTable_rowreq_ctx
+- * rowreq_ctx,
+- char
+- **appStatsMacAddress2_val_ptr_ptr,
+- size_t
+- *appStatsMacAddress2_val_ptr_len_ptr);
+- int appStatsTruthValue_map(u_long *
+- mib_appStatsTruthValue_val_ptr,
+- u_long
+- raw_appStatsTruthValue_val);
+- int appStatsTruthValue_get(dessertAppStatsTable_rowreq_ctx
+- * rowreq_ctx,
+- u_long *
+- appStatsTruthValue_val_ptr);
+- int appStatsInteger32_map(long
+- *mib_appStatsInteger32_val_ptr,
+- long raw_appStatsInteger32_val);
+- int appStatsInteger32_get(dessertAppStatsTable_rowreq_ctx *
+- rowreq_ctx,
+- long *appStatsInteger32_val_ptr);
+- int appStatsUnsigned32_map(u_long *
+- mib_appStatsUnsigned32_val_ptr,
+- u_long
+- raw_appStatsUnsigned32_val);
+- int appStatsUnsigned32_get(dessertAppStatsTable_rowreq_ctx
+- * rowreq_ctx,
+- u_long *
+- appStatsUnsigned32_val_ptr);
+- int appStatsCounter64_map(U64 *
+- mib_appStatsCounter64_val_ptr,
+- U64 raw_appStatsCounter64_val);
+- int appStatsCounter64_get(dessertAppStatsTable_rowreq_ctx *
+- rowreq_ctx,
+- U64 * appStatsCounter64_val_ptr);
+- int appStatsOctetString_map(char
+- **mib_appStatsOctetString_val_ptr_ptr,
+- size_t
+- *mib_appStatsOctetString_val_ptr_len_ptr,
+- char
+- *raw_appStatsOctetString_val_ptr,
+- size_t
+- raw_appStatsOctetString_val_ptr_len,
+- int allow_realloc);
+- int appStatsOctetString_get(dessertAppStatsTable_rowreq_ctx
+- * rowreq_ctx,
+- char
+- **appStatsOctetString_val_ptr_ptr,
+- size_t
+- *appStatsOctetString_val_ptr_len_ptr);
+-
+-
+- int
+- dessertAppStatsTable_indexes_set_tbl_idx
+- (dessertAppStatsTable_mib_index * tbl_idx, long appStatsIndex_val);
+- int
+- dessertAppStatsTable_indexes_set(dessertAppStatsTable_rowreq_ctx *
+- rowreq_ctx, long appStatsIndex_val);
+-
+-
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTAPPSTATSTABLE_DATA_GET_H */
+-/** @} */
+diff --git a/snmp/dessertAppStatsTable_data_set.c b/snmp/dessertAppStatsTable_data_set.c
+deleted file mode 100644
+index 68ccfda..0000000
+--- a/snmp/dessertAppStatsTable_data_set.c
++++ /dev/null
+@@ -1,28 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 12077 $ of $
+- *
+- * $Id:$
+- *
+- */
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertAppStatsTable.h"
+-
+-
+-/** @defgroup data_set data_set: Routines to set data
+- *
+- * These routines are used to set the value for individual objects. The
+- * row context is passed, along with the new value.
+- *
+- * @{
+- */
+-/** @} */
+diff --git a/snmp/dessertAppStatsTable_data_set.h b/snmp/dessertAppStatsTable_data_set.h
+deleted file mode 100644
+index 8e65c17..0000000
+--- a/snmp/dessertAppStatsTable_data_set.h
++++ /dev/null
+@@ -1,28 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 12077 $ of $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTAPPSTATSTABLE_DATA_SET_H
+-#define DESSERTAPPSTATSTABLE_DATA_SET_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+- /*
+- *********************************************************************
+- * SET function declarations
+- */
+-
+- /*
+- *********************************************************************
+- * SET Table declarations
+- */
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTAPPSTATSTABLE_DATA_SET_H */
+diff --git a/snmp/dessertAppStatsTable_enums.h b/snmp/dessertAppStatsTable_enums.h
+deleted file mode 100644
+index 320e5fc..0000000
+--- a/snmp/dessertAppStatsTable_enums.h
++++ /dev/null
+@@ -1,118 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * : generic-table-enums.m2c 12526 2005-07-15 22:41:16Z rstory $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTAPPSTATSTABLE_ENUMS_H
+-#define DESSERTAPPSTATSTABLE_ENUMS_H
+-
+-#include "../dessert.h"
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+- /*
+- * NOTES on enums
+- * ==============
+- *
+- * Value Mapping
+- * -------------
+- * If the values for your data type don't exactly match the
+- * possible values defined by the mib, you should map them
+- * below. For example, a boolean flag (1/0) is usually represented
+- * as a TruthValue in a MIB, which maps to the values (1/2).
+- *
+- */
+-/*************************************************************************
+- *************************************************************************
+- *
+- * enum definitions for table dessertAppStatsTable
+- *
+- *************************************************************************
+- *************************************************************************/
+-
+-/*************************************************************
+- * constants for enums for the MIB node
+- * appStatsNodeOrLink (INTEGER / ASN_INTEGER)
+- *
+- * since a Textual Convention may be referenced more than once in a
+- * MIB, protect againt redefinitions of the enum values.
+- */
+-#ifndef APPSTATSNODEORLINK_ENUMS
+-#define APPSTATSNODEORLINK_ENUMS
+-
+-#define APPSTATSNODEORLINK_NONE 0
+-#define APPSTATSNODEORLINK_NODE 1
+-#define APPSTATSNODEORLINK_LINK 2
+-
+-#endif /* APPSTATSNODEORLINK_ENUMS */
+-
+- /*
+- * TODO:140:o: Define your interal representation of appStatsNodeOrLink enums.
+- * (used for value mapping; see notes at top of file)
+- */
+-#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSNODEORLINK_NONE DESSERT_APPSTATS_NODEORLINK_NONE
+-#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSNODEORLINK_NODE DESSERT_APPSTATS_NODEORLINK_NODE
+-#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSNODEORLINK_LINK DESSERT_APPSTATS_NODEORLINK_LINK
+-
+-
+-/*************************************************************
+- * constants for enums for the MIB node
+- * appStatsValueType (INTEGER / ASN_INTEGER)
+- *
+- * since a Textual Convention may be referenced more than once in a
+- * MIB, protect againt redefinitions of the enum values.
+- */
+-#ifndef APPSTATSVALUETYPE_ENUMS
+-#define APPSTATSVALUETYPE_ENUMS
+-
+-#define APPSTATSVALUETYPE_BOOL 0
+-#define APPSTATSVALUETYPE_INT32 1
+-#define APPSTATSVALUETYPE_UINT32 2
+-#define APPSTATSVALUETYPE_COUNTER64 3
+-#define APPSTATSVALUETYPE_OCTETSTRING 4
+-
+-#endif /* APPSTATSVALUETYPE_ENUMS */
+-
+- /*
+- * TODO:140:o: Define your interal representation of appStatsValueType enums.
+- * (used for value mapping; see notes at top of file)
+- */
+-#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_BOOL DESSERT_APPSTATS_VALUETYPE_BOOL
+-#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_INT32 DESSERT_APPSTATS_VALUETYPE_INT32
+-#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_UINT32 DESSERT_APPSTATS_VALUETYPE_UINT32
+-#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_COUNTER64 DESSERT_APPSTATS_VALUETYPE_COUNTER64
+-#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_OCTETSTRING DESSERT_APPSTATS_VALUETYPE_OCTETSTRING
+-
+-
+-/*************************************************************
+- * constants for enums for the MIB node
+- * appStatsTruthValue (TruthValue / ASN_INTEGER)
+- *
+- * since a Textual Convention may be referenced more than once in a
+- * MIB, protect againt redefinitions of the enum values.
+- */
+-#ifndef TRUTHVALUE_ENUMS
+-#define TRUTHVALUE_ENUMS
+-
+-#define TRUTHVALUE_TRUE 1
+-#define TRUTHVALUE_FALSE 2
+-
+-#endif /* TRUTHVALUE_ENUMS */
+-
+- /*
+- * TODO:140:o: Define your interal representation of appStatsTruthValue enums.
+- * (used for value mapping; see notes at top of file)
+- */
+-#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSTRUTHVALUE_TRUE DESSERT_APPSTATS_BOOL_TRUE
+-#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSTRUTHVALUE_FALSE DESSERT_APPSTATS_BOOL_FALSE
+-
+-
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTAPPSTATSTABLE_ENUMS_H */
+diff --git a/snmp/dessertAppStatsTable_interface.c b/snmp/dessertAppStatsTable_interface.c
+deleted file mode 100644
+index b024106..0000000
+--- a/snmp/dessertAppStatsTable_interface.c
++++ /dev/null
+@@ -1,1069 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 15899 $ of $
+- *
+- * $Id:$
+- */
+-/*
+- * *********************************************************************
+- * *********************************************************************
+- * *********************************************************************
+- * *** ***
+- * *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
+- * *** ***
+- * *** ***
+- * *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
+- * *** ***
+- * *** ***
+- * *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
+- * *** ***
+- * *** ***
+- * *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
+- * *** ***
+- * *** ***
+- * *********************************************************************
+- * *********************************************************************
+- * *********************************************************************
+- */
+-
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertAppStatsTable.h"
+-
+-
+-#include <net-snmp/agent/table_container.h>
+-#include <net-snmp/library/container.h>
+-
+-#include "dessertAppStatsTable_interface.h"
+-
+-#include <ctype.h>
+-
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertAppStatsTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+-/*
+- * DESSERT-MIB::dessertAppStatsTable is subid 9 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.9, length: 12
+- */
+-typedef struct dessertAppStatsTable_interface_ctx_s {
+-
+- netsnmp_container *container;
+- netsnmp_cache *cache;
+-
+- dessertAppStatsTable_registration *user_ctx;
+-
+- netsnmp_table_registration_info tbl_info;
+-
+- netsnmp_baby_steps_access_methods access_multiplexer;
+-
+-} dessertAppStatsTable_interface_ctx;
+-
+-static dessertAppStatsTable_interface_ctx dessertAppStatsTable_if_ctx;
+-
+-static void
+-_dessertAppStatsTable_container_init(dessertAppStatsTable_interface_ctx *
+- if_ctx);
+-static void
+-_dessertAppStatsTable_container_shutdown(dessertAppStatsTable_interface_ctx
+- * if_ctx);
+-
+-
+-netsnmp_container *
+-dessertAppStatsTable_container_get(void)
+-{
+- return dessertAppStatsTable_if_ctx.container;
+-}
+-
+-dessertAppStatsTable_registration *
+-dessertAppStatsTable_registration_get(void)
+-{
+- return dessertAppStatsTable_if_ctx.user_ctx;
+-}
+-
+-dessertAppStatsTable_registration *
+-dessertAppStatsTable_registration_set(dessertAppStatsTable_registration *
+- newreg)
+-{
+- dessertAppStatsTable_registration *old =
+- dessertAppStatsTable_if_ctx.user_ctx;
+- dessertAppStatsTable_if_ctx.user_ctx = newreg;
+- return old;
+-}
+-
+-int
+-dessertAppStatsTable_container_size(void)
+-{
+- return CONTAINER_SIZE(dessertAppStatsTable_if_ctx.container);
+-}
+-
+-/*
+- * mfd multiplexer modes
+- */
+-static Netsnmp_Node_Handler _mfd_dessertAppStatsTable_pre_request;
+-static Netsnmp_Node_Handler _mfd_dessertAppStatsTable_post_request;
+-static Netsnmp_Node_Handler _mfd_dessertAppStatsTable_object_lookup;
+-static Netsnmp_Node_Handler _mfd_dessertAppStatsTable_get_values;
+-/**
+- * @internal
+- * Initialize the table dessertAppStatsTable
+- * (Define its contents and how it's structured)
+- */
+-void
+-_dessertAppStatsTable_initialize_interface
+- (dessertAppStatsTable_registration * reg_ptr, u_long flags)
+-{
+- netsnmp_baby_steps_access_methods *access_multiplexer =
+- &dessertAppStatsTable_if_ctx.access_multiplexer;
+- netsnmp_table_registration_info *tbl_info =
+- &dessertAppStatsTable_if_ctx.tbl_info;
+- netsnmp_handler_registration *reginfo;
+- netsnmp_mib_handler *handler;
+- int mfd_modes = 0;
+-
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_dessertAppStatsTable_initialize_interface", "called\n"));
+-
+-
+- /*************************************************
+- *
+- * save interface context for dessertAppStatsTable
+- */
+- /*
+- * Setting up the table's definition
+- */
+- netsnmp_table_helper_add_indexes(tbl_info,ASN_INTEGER,
+- /** index: appStatsIndex */
+- 0);
+-
+- /*
+- * Define the minimum and maximum accessible columns. This
+- * optimizes retrival.
+- */
+- tbl_info->min_column = DESSERTAPPSTATSTABLE_MIN_COL;
+- tbl_info->max_column = DESSERTAPPSTATSTABLE_MAX_COL;
+-
+- /*
+- * save users context
+- */
+- dessertAppStatsTable_if_ctx.user_ctx = reg_ptr;
+-
+- /*
+- * call data access initialization code
+- */
+- dessertAppStatsTable_init_data(reg_ptr);
+-
+- /*
+- * set up the container
+- */
+- _dessertAppStatsTable_container_init(&dessertAppStatsTable_if_ctx);
+- if (NULL == dessertAppStatsTable_if_ctx.container) {
+- snmp_log(LOG_ERR,
+- "could not initialize container for dessertAppStatsTable\n");
+- return;
+- }
+-
+- /*
+- * access_multiplexer: REQUIRED wrapper for get request handling
+- */
+- access_multiplexer->object_lookup =
+- _mfd_dessertAppStatsTable_object_lookup;
+- access_multiplexer->get_values = _mfd_dessertAppStatsTable_get_values;
+-
+- /*
+- * no wrappers yet
+- */
+- access_multiplexer->pre_request =
+- _mfd_dessertAppStatsTable_pre_request;
+- access_multiplexer->post_request =
+- _mfd_dessertAppStatsTable_post_request;
+-
+-
+- /*************************************************
+- *
+- * Create a registration, save our reg data, register table.
+- */
+- DEBUGMSGTL(("dessertAppStatsTable:init_dessertAppStatsTable",
+- "Registering dessertAppStatsTable as a mibs-for-dummies table.\n"));
+- handler =
+- netsnmp_baby_steps_access_multiplexer_get(access_multiplexer);
+- reginfo =
+- netsnmp_handler_registration_create("dessertAppStatsTable",
+- handler,
+- dessertAppStatsTable_oid,
+- dessertAppStatsTable_oid_size,
+- HANDLER_CAN_BABY_STEP |
+- HANDLER_CAN_RONLY);
+- if (NULL == reginfo) {
+- snmp_log(LOG_ERR,
+- "error registering table dessertAppStatsTable\n");
+- return;
+- }
+- reginfo->my_reg_void = &dessertAppStatsTable_if_ctx;
+-
+- /*************************************************
+- *
+- * set up baby steps handler, create it and inject it
+- */
+- if (access_multiplexer->object_lookup)
+- mfd_modes |= BABY_STEP_OBJECT_LOOKUP;
+- if (access_multiplexer->set_values)
+- mfd_modes |= BABY_STEP_SET_VALUES;
+- if (access_multiplexer->irreversible_commit)
+- mfd_modes |= BABY_STEP_IRREVERSIBLE_COMMIT;
+- if (access_multiplexer->object_syntax_checks)
+- mfd_modes |= BABY_STEP_CHECK_OBJECT;
+-
+- if (access_multiplexer->pre_request)
+- mfd_modes |= BABY_STEP_PRE_REQUEST;
+- if (access_multiplexer->post_request)
+- mfd_modes |= BABY_STEP_POST_REQUEST;
+-
+- if (access_multiplexer->undo_setup)
+- mfd_modes |= BABY_STEP_UNDO_SETUP;
+- if (access_multiplexer->undo_cleanup)
+- mfd_modes |= BABY_STEP_UNDO_CLEANUP;
+- if (access_multiplexer->undo_sets)
+- mfd_modes |= BABY_STEP_UNDO_SETS;
+-
+- if (access_multiplexer->row_creation)
+- mfd_modes |= BABY_STEP_ROW_CREATE;
+- if (access_multiplexer->consistency_checks)
+- mfd_modes |= BABY_STEP_CHECK_CONSISTENCY;
+- if (access_multiplexer->commit)
+- mfd_modes |= BABY_STEP_COMMIT;
+- if (access_multiplexer->undo_commit)
+- mfd_modes |= BABY_STEP_UNDO_COMMIT;
+-
+- handler = netsnmp_baby_steps_handler_get(mfd_modes);
+- netsnmp_inject_handler(reginfo, handler);
+-
+- /*************************************************
+- *
+- * inject row_merge helper with prefix rootoid_len + 2 (entry.col)
+- */
+- handler = netsnmp_get_row_merge_handler(reginfo->rootoid_len + 2);
+- netsnmp_inject_handler(reginfo, handler);
+-
+- /*************************************************
+- *
+- * inject container_table helper
+- */
+- handler =
+- netsnmp_container_table_handler_get(tbl_info,
+- dessertAppStatsTable_if_ctx.
+- container,
+- TABLE_CONTAINER_KEY_NETSNMP_INDEX);
+- netsnmp_inject_handler(reginfo, handler);
+-
+- /*************************************************
+- *
+- * inject cache helper
+- */
+- if (NULL != dessertAppStatsTable_if_ctx.cache) {
+- handler =
+- netsnmp_cache_handler_get(dessertAppStatsTable_if_ctx.cache);
+- netsnmp_inject_handler(reginfo, handler);
+- }
+-
+- /*
+- * register table
+- */
+- netsnmp_register_table(reginfo, tbl_info);
+-
+-} /* _dessertAppStatsTable_initialize_interface */
+-
+-/**
+- * @internal
+- * Shutdown the table dessertAppStatsTable
+- */
+-void
+-_dessertAppStatsTable_shutdown_interface(dessertAppStatsTable_registration
+- * reg_ptr)
+-{
+- /*
+- * shutdown the container
+- */
+- _dessertAppStatsTable_container_shutdown(&dessertAppStatsTable_if_ctx);
+-}
+-
+-void
+-dessertAppStatsTable_valid_columns_set(netsnmp_column_info *vc)
+-{
+- dessertAppStatsTable_if_ctx.tbl_info.valid_columns = vc;
+-} /* dessertAppStatsTable_valid_columns_set */
+-
+-/**
+- * @internal
+- * convert the index component stored in the context to an oid
+- */
+-int
+-dessertAppStatsTable_index_to_oid(netsnmp_index * oid_idx,
+- dessertAppStatsTable_mib_index * mib_idx)
+-{
+- int err = SNMP_ERR_NOERROR;
+-
+- /*
+- * temp storage for parsing indexes
+- */
+- /*
+- * appStatsIndex(1)///()//L/a/w/e/r/d/h
+- */
+- netsnmp_variable_list var_appStatsIndex;
+-
+- /*
+- * set up varbinds
+- */
+- memset(&var_appStatsIndex, 0x00, sizeof(var_appStatsIndex));
+- var_appStatsIndex.type = ASN_INTEGER;
+-
+- /*
+- * chain temp index varbinds together
+- */
+- var_appStatsIndex.next_variable = NULL;
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_index_to_oid", "called\n"));
+-
+- /*
+- * appStatsIndex(1)///()//L/a/w/e/r/d/h
+- */
+- snmp_set_var_value(&var_appStatsIndex,
+- (u_char *) & mib_idx->appStatsIndex,
+- sizeof(mib_idx->appStatsIndex));
+-
+-
+- err = build_oid_noalloc(oid_idx->oids, oid_idx->len, &oid_idx->len,
+- NULL, 0, &var_appStatsIndex);
+- if (err)
+- snmp_log(LOG_ERR, "error %d converting index to oid\n", err);
+-
+- /*
+- * parsing may have allocated memory. free it.
+- */
+- snmp_reset_var_buffers(&var_appStatsIndex);
+-
+- return err;
+-} /* dessertAppStatsTable_index_to_oid */
+-
+-/**
+- * extract dessertAppStatsTable indexes from a netsnmp_index
+- *
+- * @retval SNMP_ERR_NOERROR : no error
+- * @retval SNMP_ERR_GENERR : error
+- */
+-int
+-dessertAppStatsTable_index_from_oid(netsnmp_index * oid_idx,
+- dessertAppStatsTable_mib_index *
+- mib_idx)
+-{
+- int err = SNMP_ERR_NOERROR;
+-
+- /*
+- * temp storage for parsing indexes
+- */
+- /*
+- * appStatsIndex(1)///()//L/a/w/e/r/d/h
+- */
+- netsnmp_variable_list var_appStatsIndex;
+-
+- /*
+- * set up varbinds
+- */
+- memset(&var_appStatsIndex, 0x00, sizeof(var_appStatsIndex));
+- var_appStatsIndex.type = ASN_INTEGER;
+-
+- /*
+- * chain temp index varbinds together
+- */
+- var_appStatsIndex.next_variable = NULL;
+-
+-
+- DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_index_from_oid", "called\n"));
+-
+- /*
+- * parse the oid into the individual index components
+- */
+- err = parse_oid_indexes(oid_idx->oids, oid_idx->len,
+- &var_appStatsIndex);
+- if (err == SNMP_ERR_NOERROR) {
+- /*
+- * copy out values
+- */
+- mib_idx->appStatsIndex = *((long *)var_appStatsIndex.val.string);
+-
+-
+- }
+-
+- /*
+- * parsing may have allocated memory. free it.
+- */
+- snmp_reset_var_buffers(&var_appStatsIndex);
+-
+- return err;
+-} /* dessertAppStatsTable_index_from_oid */
+-
+-
+-/*
+- *********************************************************************
+- * @internal
+- * allocate resources for a dessertAppStatsTable_rowreq_ctx
+- */
+-dessertAppStatsTable_rowreq_ctx *
+-dessertAppStatsTable_allocate_rowreq_ctx(void)
+-{
+- dessertAppStatsTable_rowreq_ctx *rowreq_ctx =
+- SNMP_MALLOC_TYPEDEF(dessertAppStatsTable_rowreq_ctx);
+-
+- DEBUGMSGTL(("internal:dessertAppStatsTable:dessertAppStatsTable_allocate_rowreq_ctx", "called\n"));
+-
+- if (NULL == rowreq_ctx) {
+- snmp_log(LOG_ERR, "Couldn't allocate memory for a "
+- "dessertAppStatsTable_rowreq_ctx.\n");
+- return NULL;
+- }
+-
+- rowreq_ctx->oid_idx.oids = rowreq_ctx->oid_tmp;
+-
+- rowreq_ctx->dessertAppStatsTable_data_list = NULL;
+-
+-
+- return rowreq_ctx;
+-} /* dessertAppStatsTable_allocate_rowreq_ctx */
+-
+-/*
+- * @internal
+- * release resources for a dessertAppStatsTable_rowreq_ctx
+- */
+-void
+-dessertAppStatsTable_release_rowreq_ctx(dessertAppStatsTable_rowreq_ctx *
+- rowreq_ctx)
+-{
+- DEBUGMSGTL(("internal:dessertAppStatsTable:dessertAppStatsTable_release_rowreq_ctx", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+-
+- /*
+- * free index oid pointer
+- */
+- if (rowreq_ctx->oid_idx.oids != rowreq_ctx->oid_tmp)
+- free(rowreq_ctx->oid_idx.oids);
+-
+- SNMP_FREE(rowreq_ctx);
+-} /* dessertAppStatsTable_release_rowreq_ctx */
+-
+-/**
+- * @internal
+- * wrapper
+- */
+-static int
+-_mfd_dessertAppStatsTable_pre_request(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration
+- *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- int rc;
+-
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_pre_request", "called\n"));
+-
+- if (1 != netsnmp_row_merge_status_first(reginfo, agtreq_info)) {
+- DEBUGMSGTL(("internal:dessertAppStatsTable",
+- "skipping additional pre_request\n"));
+- return SNMP_ERR_NOERROR;
+- }
+-
+- rc = dessertAppStatsTable_pre_request(dessertAppStatsTable_if_ctx.
+- user_ctx);
+- if (MFD_SUCCESS != rc) {
+- /*
+- * nothing we can do about it but log it
+- */
+- DEBUGMSGTL(("dessertAppStatsTable", "error %d from "
+- "dessertAppStatsTable_pre_request\n", rc));
+- netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
+- }
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertAppStatsTable_pre_request */
+-
+-/**
+- * @internal
+- * wrapper
+- */
+-static int
+-_mfd_dessertAppStatsTable_post_request(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration
+- *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- dessertAppStatsTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+- int rc, packet_rc;
+-
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_post_request", "called\n"));
+-
+- /*
+- * release row context, if deleted
+- */
+- if (rowreq_ctx && (rowreq_ctx->rowreq_flags & MFD_ROW_DELETED))
+- dessertAppStatsTable_release_rowreq_ctx(rowreq_ctx);
+-
+- /*
+- * wait for last call before calling user
+- */
+- if (1 != netsnmp_row_merge_status_last(reginfo, agtreq_info)) {
+- DEBUGMSGTL(("internal:dessertAppStatsTable",
+- "waiting for last post_request\n"));
+- return SNMP_ERR_NOERROR;
+- }
+-
+- packet_rc = netsnmp_check_all_requests_error(agtreq_info->asp, 0);
+- rc = dessertAppStatsTable_post_request(dessertAppStatsTable_if_ctx.
+- user_ctx, packet_rc);
+- if (MFD_SUCCESS != rc) {
+- /*
+- * nothing we can do about it but log it
+- */
+- DEBUGMSGTL(("dessertAppStatsTable", "error %d from "
+- "dessertAppStatsTable_post_request\n", rc));
+- }
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertAppStatsTable_post_request */
+-
+-/**
+- * @internal
+- * wrapper
+- */
+-static int
+-_mfd_dessertAppStatsTable_object_lookup(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration
+- *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- int rc = SNMP_ERR_NOERROR;
+- dessertAppStatsTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+-
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_object_lookup", "called\n"));
+-
+- /*
+- * get our context from mfd
+- * dessertAppStatsTable_interface_ctx *if_ctx =
+- * (dessertAppStatsTable_interface_ctx *)reginfo->my_reg_void;
+- */
+-
+- if (NULL == rowreq_ctx) {
+- rc = SNMP_ERR_NOCREATION;
+- }
+-
+- if (MFD_SUCCESS != rc)
+- netsnmp_request_set_error_all(requests, rc);
+- else
+- dessertAppStatsTable_row_prep(rowreq_ctx);
+-
+- return SNMP_VALIDATE_ERR(rc);
+-} /* _mfd_dessertAppStatsTable_object_lookup */
+-
+-/***********************************************************************
+- *
+- * GET processing
+- *
+- ***********************************************************************/
+-/*
+- * @internal
+- * Retrieve the value for a particular column
+- */
+-NETSNMP_STATIC_INLINE int
+-_dessertAppStatsTable_get_column(dessertAppStatsTable_rowreq_ctx *
+- rowreq_ctx, netsnmp_variable_list * var,
+- int column)
+-{
+- int rc = SNMPERR_SUCCESS;
+-
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "called for %d\n", column));
+-
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- switch (column) {
+-
+- /*
+- * appStatsName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- case COLUMN_APPSTATSNAME:
+- if (!(COLUMN_APPSTATSNAME_FLAG & rowreq_ctx->column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsName) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->type = ASN_OCTET_STR;
+- rc = appStatsName_get(rowreq_ctx, (char **) &var->val.string,
+- &var->val_len);
+- break;
+-
+- /*
+- * appStatsDesc(3)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- case COLUMN_APPSTATSDESC:
+- if (!(COLUMN_APPSTATSDESC_FLAG & rowreq_ctx->column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsDesc) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->type = ASN_OCTET_STR;
+- rc = appStatsDesc_get(rowreq_ctx, (char **) &var->val.string,
+- &var->val_len);
+- break;
+-
+- /*
+- * appStatsNodeOrLink(4)/INTEGER/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
+- */
+- case COLUMN_APPSTATSNODEORLINK:
+- if (!
+- (COLUMN_APPSTATSNODEORLINK_FLAG & rowreq_ctx->
+- column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsNodeOrLink) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->val_len = sizeof(u_long);
+- var->type = ASN_INTEGER;
+- rc = appStatsNodeOrLink_get(rowreq_ctx,
+- (u_long *) var->val.string);
+- break;
+-
+- /*
+- * appStatsValueType(5)/INTEGER/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
+- */
+- case COLUMN_APPSTATSVALUETYPE:
+- if (!
+- (COLUMN_APPSTATSVALUETYPE_FLAG & rowreq_ctx->
+- column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsValueType) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->val_len = sizeof(u_long);
+- var->type = ASN_INTEGER;
+- rc = appStatsValueType_get(rowreq_ctx, (u_long *) var->val.string);
+- break;
+-
+- /*
+- * appStatsMacAddress1(6)/MacAddress/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- case COLUMN_APPSTATSMACADDRESS1:
+- if (!
+- (COLUMN_APPSTATSMACADDRESS1_FLAG & rowreq_ctx->
+- column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsMacAddress1) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->type = ASN_OCTET_STR;
+- rc = appStatsMacAddress1_get(rowreq_ctx,
+- (char **) &var->val.string,
+- &var->val_len);
+- break;
+-
+- /*
+- * appStatsMacAddress2(7)/MacAddress/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- case COLUMN_APPSTATSMACADDRESS2:
+- if (!
+- (COLUMN_APPSTATSMACADDRESS2_FLAG & rowreq_ctx->
+- column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsMacAddress2) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->type = ASN_OCTET_STR;
+- rc = appStatsMacAddress2_get(rowreq_ctx,
+- (char **) &var->val.string,
+- &var->val_len);
+- break;
+-
+- /*
+- * appStatsTruthValue(8)/TruthValue/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
+- */
+- case COLUMN_APPSTATSTRUTHVALUE:
+- if (!
+- (COLUMN_APPSTATSTRUTHVALUE_FLAG & rowreq_ctx->
+- column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsTruthValue) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->val_len = sizeof(u_long);
+- var->type = ASN_INTEGER;
+- rc = appStatsTruthValue_get(rowreq_ctx,
+- (u_long *) var->val.string);
+- break;
+-
+- /*
+- * appStatsInteger32(9)/INTEGER32/ASN_INTEGER/long(long)//l/A/w/e/r/d/h
+- */
+- case COLUMN_APPSTATSINTEGER32:
+- if (!
+- (COLUMN_APPSTATSINTEGER32_FLAG & rowreq_ctx->
+- column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsInteger32) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->val_len = sizeof(long);
+- var->type = ASN_INTEGER;
+- rc = appStatsInteger32_get(rowreq_ctx, (long *) var->val.string);
+- break;
+-
+- /*
+- * appStatsUnsigned32(10)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/w/e/r/d/h
+- */
+- case COLUMN_APPSTATSUNSIGNED32:
+- if (!
+- (COLUMN_APPSTATSUNSIGNED32_FLAG & rowreq_ctx->
+- column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsUnsigned32) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->val_len = sizeof(u_long);
+- var->type = ASN_UNSIGNED;
+- rc = appStatsUnsigned32_get(rowreq_ctx,
+- (u_long *) var->val.string);
+- break;
+-
+- /*
+- * appStatsCounter64(11)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- case COLUMN_APPSTATSCOUNTER64:
+- if (!
+- (COLUMN_APPSTATSCOUNTER64_FLAG & rowreq_ctx->
+- column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsCounter64) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->val_len = sizeof(U64);
+- var->type = ASN_COUNTER64;
+- rc = appStatsCounter64_get(rowreq_ctx, (U64 *) var->val.string);
+- break;
+-
+- /*
+- * appStatsOctetString(12)/OCTETSTR/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/h
+- */
+- case COLUMN_APPSTATSOCTETSTRING:
+- if (!
+- (COLUMN_APPSTATSOCTETSTRING_FLAG & rowreq_ctx->
+- column_exists_flags)) {
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsOctetString) doesn't exist\n", column));
+- return MFD_SKIP;
+- }
+-
+- var->type = ASN_OCTET_STR;
+- rc = appStatsOctetString_get(rowreq_ctx,
+- (char **) &var->val.string,
+- &var->val_len);
+- break;
+-
+- default:
+- if (DESSERTAPPSTATSTABLE_MIN_COL <= column
+- && column <= DESSERTAPPSTATSTABLE_MAX_COL) {
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "assume column %d is reserved\n", column));
+- rc = MFD_SKIP;
+- } else {
+- snmp_log(LOG_ERR,
+- "unknown column %d in _dessertAppStatsTable_get_column\n",
+- column);
+- }
+- break;
+- }
+-
+- return rc;
+-} /* _dessertAppStatsTable_get_column */
+-
+-int
+-_mfd_dessertAppStatsTable_get_values(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- dessertAppStatsTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+- netsnmp_table_request_info *tri;
+- u_char *old_string;
+- void (*dataFreeHook) (void *);
+- int rc;
+-
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_values", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- DEBUGMSGTL(("9:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_values", "exists %p\n", rowreq_ctx->column_exists_flags));
+-
+- for (; requests; requests = requests->next) {
+- /*
+- * save old pointer, so we can free it if replaced
+- */
+- old_string = requests->requestvb->val.string;
+- dataFreeHook = requests->requestvb->dataFreeHook;
+- if (NULL == requests->requestvb->val.string) {
+- requests->requestvb->val.string = requests->requestvb->buf;
+- requests->requestvb->val_len =
+- sizeof(requests->requestvb->buf);
+- } else if (requests->requestvb->buf ==
+- requests->requestvb->val.string) {
+- if (requests->requestvb->val_len !=
+- sizeof(requests->requestvb->buf))
+- requests->requestvb->val_len =
+- sizeof(requests->requestvb->buf);
+- }
+-
+- /*
+- * get column data
+- */
+- tri = netsnmp_extract_table_info(requests);
+- if (NULL == tri)
+- continue;
+-
+- rc = _dessertAppStatsTable_get_column(rowreq_ctx,
+- requests->requestvb,
+- tri->colnum);
+- if (rc) {
+- if (MFD_SKIP == rc) {
+- requests->requestvb->type = SNMP_NOSUCHINSTANCE;
+- rc = SNMP_ERR_NOERROR;
+- }
+- } else if (NULL == requests->requestvb->val.string) {
+- snmp_log(LOG_ERR, "NULL varbind data pointer!\n");
+- rc = SNMP_ERR_GENERR;
+- }
+- if (rc)
+- netsnmp_request_set_error(requests, SNMP_VALIDATE_ERR(rc));
+-
+- /*
+- * if the buffer wasn't used previously for the old data (i.e. it
+- * was allcoated memory) and the get routine replaced the pointer,
+- * we need to free the previous pointer.
+- */
+- if (old_string && (old_string != requests->requestvb->buf) &&
+- (requests->requestvb->val.string != old_string)) {
+- if (dataFreeHook)
+- (*dataFreeHook) (old_string);
+- else
+- free(old_string);
+- }
+- } /* for results */
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertAppStatsTable_get_values */
+-
+-
+-/***********************************************************************
+- *
+- * SET processing
+- *
+- ***********************************************************************/
+-
+-/*
+- * SET PROCESSING NOT APPLICABLE (per MIB or user setting)
+- */
+-/***********************************************************************
+- *
+- * DATA ACCESS
+- *
+- ***********************************************************************/
+-static void _container_free(netsnmp_container * container);
+-
+-/**
+- * @internal
+- */
+-static int
+-_cache_load(netsnmp_cache * cache, void *vmagic)
+-{
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_cache_load", "called\n"));
+-
+- if ((NULL == cache) || (NULL == cache->magic)) {
+- snmp_log(LOG_ERR,
+- "invalid cache for dessertAppStatsTable_cache_load\n");
+- return -1;
+- }
+-
+- /** should only be called for an invalid or expired cache */
+- netsnmp_assert((0 == cache->valid) || (1 == cache->expired));
+-
+- /*
+- * call user code
+- */
+- return dessertAppStatsTable_container_load((netsnmp_container *)
+- cache->magic);
+-} /* _cache_load */
+-
+-/**
+- * @internal
+- */
+-static void
+-_cache_free(netsnmp_cache * cache, void *magic)
+-{
+- netsnmp_container *container;
+-
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_cache_free", "called\n"));
+-
+- if ((NULL == cache) || (NULL == cache->magic)) {
+- snmp_log(LOG_ERR,
+- "invalid cache in dessertAppStatsTable_cache_free\n");
+- return;
+- }
+-
+- container = (netsnmp_container *) cache->magic;
+-
+- _container_free(container);
+-} /* _cache_free */
+-
+-/**
+- * @internal
+- */
+-static void
+-_container_item_free(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
+- void *context)
+-{
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_container_item_free",
+- "called\n"));
+-
+- if (NULL == rowreq_ctx)
+- return;
+-
+- dessertAppStatsTable_release_rowreq_ctx(rowreq_ctx);
+-} /* _container_item_free */
+-
+-/**
+- * @internal
+- */
+-static void
+-_container_free(netsnmp_container * container)
+-{
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_container_free",
+- "called\n"));
+-
+- if (NULL == container) {
+- snmp_log(LOG_ERR,
+- "invalid container in dessertAppStatsTable_container_free\n");
+- return;
+- }
+-
+- /*
+- * call user code
+- */
+- dessertAppStatsTable_container_free(container);
+-
+- /*
+- * free all items. inefficient, but easy.
+- */
+- CONTAINER_CLEAR(container,
+- (netsnmp_container_obj_func *) _container_item_free,
+- NULL);
+-} /* _container_free */
+-
+-/**
+- * @internal
+- * initialize the container with functions or wrappers
+- */
+-void
+-_dessertAppStatsTable_container_init(dessertAppStatsTable_interface_ctx *
+- if_ctx)
+-{
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_dessertAppStatsTable_container_init", "called\n"));
+-
+- /*
+- * cache init
+- */
+- if_ctx->cache = netsnmp_cache_create(30, /* timeout in seconds */
+- _cache_load, _cache_free,
+- dessertAppStatsTable_oid,
+- dessertAppStatsTable_oid_size);
+-
+- if (NULL == if_ctx->cache) {
+- snmp_log(LOG_ERR,
+- "error creating cache for dessertAppStatsTable\n");
+- return;
+- }
+-
+- if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;
+-
+- dessertAppStatsTable_container_init(&if_ctx->container, if_ctx->cache);
+- if (NULL == if_ctx->container)
+- if_ctx->container =
+- netsnmp_container_find("dessertAppStatsTable:table_container");
+- if (NULL == if_ctx->container) {
+- snmp_log(LOG_ERR, "error creating container in "
+- "dessertAppStatsTable_container_init\n");
+- return;
+- }
+-
+- if (NULL != if_ctx->cache)
+- if_ctx->cache->magic = (void *) if_ctx->container;
+-} /* _dessertAppStatsTable_container_init */
+-
+-/**
+- * @internal
+- * shutdown the container with functions or wrappers
+- */
+-void
+-_dessertAppStatsTable_container_shutdown(dessertAppStatsTable_interface_ctx
+- * if_ctx)
+-{
+- DEBUGMSGTL(("internal:dessertAppStatsTable:_dessertAppStatsTable_container_shutdown", "called\n"));
+-
+- dessertAppStatsTable_container_shutdown(if_ctx->container);
+-
+- _container_free(if_ctx->container);
+-
+-} /* _dessertAppStatsTable_container_shutdown */
+-
+-
+-dessertAppStatsTable_rowreq_ctx *
+-dessertAppStatsTable_row_find_by_mib_index(dessertAppStatsTable_mib_index *
+- mib_idx)
+-{
+- dessertAppStatsTable_rowreq_ctx *rowreq_ctx;
+- oid oid_tmp[MAX_OID_LEN];
+- netsnmp_index oid_idx;
+- int rc;
+-
+- /*
+- * set up storage for OID
+- */
+- oid_idx.oids = oid_tmp;
+- oid_idx.len = sizeof(oid_tmp) / sizeof(oid);
+-
+- /*
+- * convert
+- */
+- rc = dessertAppStatsTable_index_to_oid(&oid_idx, mib_idx);
+- if (MFD_SUCCESS != rc)
+- return NULL;
+-
+- rowreq_ctx =
+- CONTAINER_FIND(dessertAppStatsTable_if_ctx.container, &oid_idx);
+-
+- return rowreq_ctx;
+-}
+diff --git a/snmp/dessertAppStatsTable_interface.h b/snmp/dessertAppStatsTable_interface.h
+deleted file mode 100644
+index 7fa936e..0000000
+--- a/snmp/dessertAppStatsTable_interface.h
++++ /dev/null
+@@ -1,98 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 15899 $ of $
+- *
+- * $Id:$
+- */
+-/** @ingroup interface: Routines to interface to Net-SNMP
+- *
+- * \warning This code should not be modified, called directly,
+- * or used to interpret functionality. It is subject to
+- * change at any time.
+- *
+- * @{
+- */
+-/*
+- * *********************************************************************
+- * *********************************************************************
+- * *********************************************************************
+- * *** ***
+- * *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
+- * *** ***
+- * *** ***
+- * *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
+- * *** ***
+- * *** ***
+- * *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
+- * *** ***
+- * *** ***
+- * *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
+- * *** ***
+- * *** ***
+- * *********************************************************************
+- * *********************************************************************
+- * *********************************************************************
+- */
+-#ifndef DESSERTAPPSTATSTABLE_INTERFACE_H
+-#define DESSERTAPPSTATSTABLE_INTERFACE_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+-#include "dessertAppStatsTable.h"
+-
+-
+- /*
+- ********************************************************************
+- * Table declarations
+- */
+-
+- /*
+- * PUBLIC interface initialization routine
+- */
+- void
+- _dessertAppStatsTable_initialize_interface
+- (dessertAppStatsTable_registration * user_ctx, u_long flags);
+- void
+- _dessertAppStatsTable_shutdown_interface
+- (dessertAppStatsTable_registration * user_ctx);
+-
+- dessertAppStatsTable_registration
+- *dessertAppStatsTable_registration_get(void);
+-
+- dessertAppStatsTable_registration
+- *dessertAppStatsTable_registration_set
+- (dessertAppStatsTable_registration * newreg);
+-
+- netsnmp_container *dessertAppStatsTable_container_get(void);
+- int dessertAppStatsTable_container_size(void);
+-
+- dessertAppStatsTable_rowreq_ctx
+- *dessertAppStatsTable_allocate_rowreq_ctx(void);
+- void
+- dessertAppStatsTable_release_rowreq_ctx
+- (dessertAppStatsTable_rowreq_ctx * rowreq_ctx);
+-
+- int dessertAppStatsTable_index_to_oid(netsnmp_index *
+- oid_idx,
+- dessertAppStatsTable_mib_index
+- * mib_idx);
+- int dessertAppStatsTable_index_from_oid(netsnmp_index *
+- oid_idx,
+- dessertAppStatsTable_mib_index
+- * mib_idx);
+-
+- /*
+- * access to certain internals. use with caution!
+- */
+- void
+- dessertAppStatsTable_valid_columns_set(netsnmp_column_info *vc);
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTAPPSTATSTABLE_INTERFACE_H */
+-/** @} */
+diff --git a/snmp/dessertAppStatsTable_oids.h b/snmp/dessertAppStatsTable_oids.h
+deleted file mode 100644
+index 2eba41a..0000000
+--- a/snmp/dessertAppStatsTable_oids.h
++++ /dev/null
+@@ -1,64 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * : generic-table-oids.m2c 12855 2005-09-27 15:56:08Z rstory $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTAPPSTATSTABLE_OIDS_H
+-#define DESSERTAPPSTATSTABLE_OIDS_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+- /*
+- * column number definitions for table dessertAppStatsTable
+- */
+-#define DESSERTAPPSTATSTABLE_OID 1,3,6,1,4,1,18898,0,19,10,1,1,8
+-
+-#define COLUMN_APPSTATSINDEX 1
+-
+-#define COLUMN_APPSTATSNAME 2
+-#define COLUMN_APPSTATSNAME_FLAG (0x1 << 1)
+-
+-#define COLUMN_APPSTATSDESC 3
+-#define COLUMN_APPSTATSDESC_FLAG (0x1 << 2)
+-
+-#define COLUMN_APPSTATSNODEORLINK 4
+-#define COLUMN_APPSTATSNODEORLINK_FLAG (0x1 << 3)
+-
+-#define COLUMN_APPSTATSVALUETYPE 5
+-#define COLUMN_APPSTATSVALUETYPE_FLAG (0x1 << 4)
+-
+-#define COLUMN_APPSTATSMACADDRESS1 6
+-#define COLUMN_APPSTATSMACADDRESS1_FLAG (0x1 << 5)
+-
+-#define COLUMN_APPSTATSMACADDRESS2 7
+-#define COLUMN_APPSTATSMACADDRESS2_FLAG (0x1 << 6)
+-
+-#define COLUMN_APPSTATSTRUTHVALUE 8
+-#define COLUMN_APPSTATSTRUTHVALUE_FLAG (0x1 << 7)
+-
+-#define COLUMN_APPSTATSINTEGER32 9
+-#define COLUMN_APPSTATSINTEGER32_FLAG (0x1 << 8)
+-
+-#define COLUMN_APPSTATSUNSIGNED32 10
+-#define COLUMN_APPSTATSUNSIGNED32_FLAG (0x1 << 9)
+-
+-#define COLUMN_APPSTATSCOUNTER64 11
+-#define COLUMN_APPSTATSCOUNTER64_FLAG (0x1 << 10)
+-
+-#define COLUMN_APPSTATSOCTETSTRING 12
+-#define COLUMN_APPSTATSOCTETSTRING_FLAG (0x1 << 11)
+-
+-
+-#define DESSERTAPPSTATSTABLE_MIN_COL COLUMN_APPSTATSNAME
+-#define DESSERTAPPSTATSTABLE_MAX_COL COLUMN_APPSTATSOCTETSTRING
+-
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTAPPSTATSTABLE_OIDS_H */
+diff --git a/snmp/dessertMeshifTable.c b/snmp/dessertMeshifTable.c
+deleted file mode 100644
+index 4c1c049..0000000
+--- a/snmp/dessertMeshifTable.c
++++ /dev/null
+@@ -1,214 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 14170 $ of $
+- *
+- * $Id:$
+- */
+-/** \page MFD helper for dessertMeshifTable
+- *
+- * \section intro Introduction
+- * Introductory text.
+- *
+- */
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertMeshifTable.h"
+-
+-#include <net-snmp/agent/mib_modules.h>
+-
+-#include "dessertMeshifTable_interface.h"
+-
+-oid dessertMeshifTable_oid[] = { DESSERTMESHIFTABLE_OID };
+-
+-int dessertMeshifTable_oid_size =
+-OID_LENGTH(dessertMeshifTable_oid);
+-
+-dessertMeshifTable_registration dessertMeshifTable_user_context;
+-
+-void initialize_table_dessertMeshifTable(void);
+-void shutdown_table_dessertMeshifTable(void);
+-
+-
+-/**
+- * Initializes the dessertMeshifTable module
+- */
+-void
+-init_dessertMeshifTable(void)
+-{
+- DEBUGMSGTL(("verbose:dessertMeshifTable:init_dessertMeshifTable",
+- "called\n"));
+-
+- /*
+- * TODO:300:o: Perform dessertMeshifTable one-time module initialization.
+- */
+-
+- /*
+- * here we initialize all the tables we're planning on supporting
+- */
+- if (should_init("dessertMeshifTable"))
+- initialize_table_dessertMeshifTable();
+-
+-} /* init_dessertMeshifTable */
+-
+-/**
+- * Shut-down the dessertMeshifTable module (agent is exiting)
+- */
+-void
+-shutdown_dessertMeshifTable(void)
+-{
+- if (should_init("dessertMeshifTable"))
+- shutdown_table_dessertMeshifTable();
+-
+-}
+-
+-/**
+- * Initialize the table dessertMeshifTable
+- * (Define its contents and how it's structured)
+- */
+-void
+-initialize_table_dessertMeshifTable(void)
+-{
+- dessertMeshifTable_registration *user_context;
+- u_long flags;
+-
+- DEBUGMSGTL(("verbose:dessertMeshifTable:initialize_table_dessertMeshifTable", "called\n"));
+-
+- /*
+- * TODO:301:o: Perform dessertMeshifTable one-time table initialization.
+- */
+-
+- /*
+- * TODO:302:o: |->Initialize dessertMeshifTable user context
+- * if you'd like to pass in a pointer to some data for this
+- * table, allocate or set it up here.
+- */
+- /*
+- * a netsnmp_data_list is a simple way to store void pointers. A simple
+- * string token is used to add, find or remove pointers.
+- */
+- user_context =
+- netsnmp_create_data_list("dessertMeshifTable", NULL, NULL);
+-
+- /*
+- * No support for any flags yet, but in the future you would
+- * set any flags here.
+- */
+- flags = 0;
+-
+- /*
+- * call interface initialization code
+- */
+- _dessertMeshifTable_initialize_interface(user_context, flags);
+-} /* initialize_table_dessertMeshifTable */
+-
+-/**
+- * Shutdown the table dessertMeshifTable
+- */
+-void
+-shutdown_table_dessertMeshifTable(void)
+-{
+- /*
+- * call interface shutdown code
+- */
+- _dessertMeshifTable_shutdown_interface
+- (&dessertMeshifTable_user_context);
+-}
+-
+-/**
+- * extra context initialization (eg default values)
+- *
+- * @param rowreq_ctx : row request context
+- * @param user_init_ctx : void pointer for user (parameter to rowreq_ctx_allocate)
+- *
+- * @retval MFD_SUCCESS : no errors
+- * @retval MFD_ERROR : error (context allocate will fail)
+- */
+-int
+-dessertMeshifTable_rowreq_ctx_init(dessertMeshifTable_rowreq_ctx *
+- rowreq_ctx, void *user_init_ctx)
+-{
+- DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_rowreq_ctx_init", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:210:o: |-> Perform extra dessertMeshifTable rowreq initialization. (eg DEFVALS)
+- */
+-
+- return MFD_SUCCESS;
+-} /* dessertMeshifTable_rowreq_ctx_init */
+-
+-/**
+- * extra context cleanup
+- *
+- */
+-void
+-dessertMeshifTable_rowreq_ctx_cleanup(dessertMeshifTable_rowreq_ctx *
+- rowreq_ctx)
+-{
+- DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_rowreq_ctx_cleanup", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:211:o: |-> Perform extra dessertMeshifTable rowreq cleanup.
+- */
+-} /* dessertMeshifTable_rowreq_ctx_cleanup */
+-
+-/**
+- * pre-request callback
+- *
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error
+- */
+-int
+-dessertMeshifTable_pre_request(dessertMeshifTable_registration *
+- user_context)
+-{
+- DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_pre_request", "called\n"));
+-
+- /*
+- * TODO:510:o: Perform dessertMeshifTable pre-request actions.
+- */
+-
+- return MFD_SUCCESS;
+-} /* dessertMeshifTable_pre_request */
+-
+-/**
+- * post-request callback
+- *
+- * Note:
+- * New rows have been inserted into the container, and
+- * deleted rows have been removed from the container and
+- * released.
+- *
+- * @param user_context
+- * @param rc : MFD_SUCCESS if all requests succeeded
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error (ignored)
+- */
+-int
+-dessertMeshifTable_post_request(dessertMeshifTable_registration *
+- user_context, int rc)
+-{
+- DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_post_request", "called\n"));
+-
+- /*
+- * TODO:511:o: Perform dessertMeshifTable post-request actions.
+- */
+-
+- return MFD_SUCCESS;
+-} /* dessertMeshifTable_post_request */
+-
+-
+-/** @{ */
+diff --git a/snmp/dessertMeshifTable.h b/snmp/dessertMeshifTable.h
+deleted file mode 100644
+index afa9b3a..0000000
+--- a/snmp/dessertMeshifTable.h
++++ /dev/null
+@@ -1,222 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 14170 $ of $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTMESHIFTABLE_H
+-#define DESSERTMESHIFTABLE_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-/** @addtogroup misc misc: Miscellaneous routines
+- *
+- * @{
+- */
+-#include <net-snmp/library/asn1.h>
+-
+-/*
+- * other required module components
+- */
+-/* *INDENT-OFF* */
+-config_add_mib(DESSERT-MIB)
+-config_require(DESSERT-MIB/dessertMeshifTable/dessertMeshifTable_interface)
+-config_require(DESSERT-MIB/dessertMeshifTable/dessertMeshifTable_data_access)
+-config_require(DESSERT-MIB/dessertMeshifTable/dessertMeshifTable_data_get)
+-config_require(DESSERT-MIB/dessertMeshifTable/dessertMeshifTable_data_set)
+-/* *INDENT-ON* */
+-
+-/*
+- * OID and column number definitions for dessertMeshifTable
+- */
+-#include "dessertMeshifTable_oids.h"
+-
+-/*
+- * enum definions
+- */
+-#include "dessertMeshifTable_enums.h"
+-
+-/*
+- *********************************************************************
+- * function declarations
+- */
+-void init_dessertMeshifTable(void);
+-void shutdown_dessertMeshifTable(void);
+-
+-/*
+- *********************************************************************
+- * Table declarations
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertMeshifTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+-/*
+- * DESSERT-MIB::dessertMeshifTable is subid 5 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.5, length: 12
+- */
+-/*
+- *********************************************************************
+- * When you register your mib, you get to provide a generic
+- * pointer that will be passed back to you for most of the
+- * functions calls.
+- *
+- * TODO:100:r: Review all context structures
+- */
+-/*
+- * TODO:101:o: |-> Review dessertMeshifTable registration context.
+- */
+-typedef netsnmp_data_list dessertMeshifTable_registration;
+-
+-/**********************************************************************/
+-/*
+- * TODO:110:r: |-> Review dessertMeshifTable data context structure.
+- * This structure is used to represent the data for dessertMeshifTable.
+- */
+-/*
+- * This structure contains storage for all the columns defined in the
+- * dessertMeshifTable.
+- */
+-typedef struct dessertMeshifTable_data_s {
+-
+- /*
+- * meshifName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- char meshifName[255];
+- size_t meshifName_len; /* # of char elements, not bytes */
+-
+- /*
+- * meshifMacAddress(3)/MacAddress/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- char meshifMacAddress[6];
+- size_t meshifMacAddress_len; /* # of char elements, not bytes */
+-
+- /*
+- * meshifInPkts(4)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- U64 meshifInPkts;
+-
+- /*
+- * meshifOutPkts(5)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- U64 meshifOutPkts;
+-
+- /*
+- * meshifInOctets(6)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- U64 meshifInOctets;
+-
+- /*
+- * meshifOutOctets(7)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- U64 meshifOutOctets;
+-
+-} dessertMeshifTable_data;
+-
+-/*
+- * TODO:120:r: |-> Review dessertMeshifTable mib index.
+- * This structure is used to represent the index for dessertMeshifTable.
+- */
+-typedef struct dessertMeshifTable_mib_index_s {
+-
+- /*
+- * meshifIndex(1)///()//L/a/w/e/r/d/h
+- */
+- long meshifIndex;
+-
+-} dessertMeshifTable_mib_index;
+-
+-/*
+- * TODO:121:r: | |-> Review dessertMeshifTable max index length.
+- * If you KNOW that your indexes will never exceed a certain
+- * length, update this macro to that length.
+- */
+-#define MAX_dessertMeshifTable_IDX_LEN 1
+-
+-/*
+- *********************************************************************
+- * TODO:130:o: |-> Review dessertMeshifTable Row request (rowreq) context.
+- * When your functions are called, you will be passed a
+- * dessertMeshifTable_rowreq_ctx pointer.
+- */
+-typedef struct dessertMeshifTable_rowreq_ctx_s {
+-
+- /** this must be first for container compare to work */
+- netsnmp_index oid_idx;
+- oid oid_tmp[MAX_dessertMeshifTable_IDX_LEN];
+-
+- dessertMeshifTable_mib_index tbl_idx;
+-
+- dessertMeshifTable_data data;
+-
+- /*
+- * flags per row. Currently, the first (lower) 8 bits are reserved
+- * for the user. See mfd.h for other flags.
+- */
+- u_int rowreq_flags;
+-
+- /*
+- * TODO:131:o: | |-> Add useful data to dessertMeshifTable rowreq context.
+- */
+-
+- /*
+- * storage for future expansion
+- */
+- netsnmp_data_list *dessertMeshifTable_data_list;
+-
+-} dessertMeshifTable_rowreq_ctx;
+-
+-typedef struct dessertMeshifTable_ref_rowreq_ctx_s {
+- dessertMeshifTable_rowreq_ctx *rowreq_ctx;
+-} dessertMeshifTable_ref_rowreq_ctx;
+-
+-/*
+- *********************************************************************
+- * function prototypes
+- */
+-int
+-dessertMeshifTable_pre_request(dessertMeshifTable_registration * user_context);
+-int
+-dessertMeshifTable_post_request(dessertMeshifTable_registration * user_context,
+- int rc);
+-
+-int
+-dessertMeshifTable_rowreq_ctx_init(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
+- void *user_init_ctx);
+-void
+-dessertMeshifTable_rowreq_ctx_cleanup(
+- dessertMeshifTable_rowreq_ctx * rowreq_ctx);
+-
+-dessertMeshifTable_rowreq_ctx
+-*dessertMeshifTable_row_find_by_mib_index(
+- dessertMeshifTable_mib_index * mib_idx);
+-
+-extern oid dessertMeshifTable_oid[];
+-extern int dessertMeshifTable_oid_size;
+-
+-#include "dessertMeshifTable_interface.h"
+-#include "dessertMeshifTable_data_access.h"
+-#include "dessertMeshifTable_data_get.h"
+-#include "dessertMeshifTable_data_set.h"
+-
+-/*
+- * DUMMY markers, ignore
+- *
+- * TODO:099:x: *************************************************************
+- * TODO:199:x: *************************************************************
+- * TODO:299:x: *************************************************************
+- * TODO:399:x: *************************************************************
+- * TODO:499:x: *************************************************************
+- */
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTMESHIFTABLE_H */
+-/** @} */
+diff --git a/snmp/dessertMeshifTable_data_access.c b/snmp/dessertMeshifTable_data_access.c
+deleted file mode 100644
+index 2fd8a64..0000000
+--- a/snmp/dessertMeshifTable_data_access.c
++++ /dev/null
+@@ -1,377 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 14170 $ of $
+- *
+- * $Id:$
+- */
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "../dessert_internal.h"
+-
+-
+-#include "dessertMeshifTable_data_access.h"
+-
+-/** @ingroup interface
+- * @addtogroup data_access data_access: Routines to access data
+- *
+- * These routines are used to locate the data used to satisfy
+- * requests.
+- *
+- * @{
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertMeshifTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+-/*
+- * DESSERT-MIB::dessertMeshifTable is subid 5 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.5, length: 12
+- */
+-
+-/**
+- * initialization for dessertMeshifTable data access
+- *
+- * This function is called during startup to allow you to
+- * allocate any resources you need for the data table.
+- *
+- * @param dessertMeshifTable_reg
+- * Pointer to dessertMeshifTable_registration
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : unrecoverable error.
+- */
+-int
+-dessertMeshifTable_init_data(dessertMeshifTable_registration *
+- dessertMeshifTable_reg)
+-{
+- DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_init_data",
+- "called\n"));
+- dessert_debug("dessertMeshifTable_container_load called");
+- /*
+- * TODO:303:o: Initialize dessertMeshifTable data.
+- */
+- /*
+- ***************************************************
+- *** START EXAMPLE CODE ***
+- ***---------------------------------------------***/
+- /*
+- * if you are the sole writer for the file, you could
+- * open it here. However, as stated earlier, we are assuming
+- * the worst case, which in this case means that the file is
+- * written to by someone else, and might not even exist when
+- * we start up. So we can't do anything here.
+- */
+- /*
+- ***---------------------------------------------***
+- *** END EXAMPLE CODE ***
+- ***************************************************/
+-
+- return MFD_SUCCESS;
+-} /* dessertMeshifTable_init_data */
+-
+-/**
+- * container overview
+- *
+- */
+-
+-/**
+- * container initialization
+- *
+- * @param container_ptr_ptr A pointer to a container pointer. If you
+- * create a custom container, use this parameter to return it
+- * to the MFD helper. If set to NULL, the MFD helper will
+- * allocate a container for you.
+- * @param cache A pointer to a cache structure. You can set the timeout
+- * and other cache flags using this pointer.
+- *
+- * This function is called at startup to allow you to customize certain
+- * aspects of the access method. For the most part, it is for advanced
+- * users. The default code should suffice for most cases. If no custom
+- * container is allocated, the MFD code will create one for your.
+- *
+- * This is also the place to set up cache behavior. The default, to
+- * simply set the cache timeout, will work well with the default
+- * container. If you are using a custom container, you may want to
+- * look at the cache helper documentation to see if there are any
+- * flags you want to set.
+- *
+- * @remark
+- * This would also be a good place to do any initialization needed
+- * for you data source. For example, opening a connection to another
+- * process that will supply the data, opening a database, etc.
+- */
+-void
+-dessertMeshifTable_container_init(netsnmp_container ** container_ptr_ptr,
+- netsnmp_cache * cache)
+-{
+- DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_container_init", "called\n"));
+-
+- if (NULL == container_ptr_ptr) {
+- snmp_log(LOG_ERR,
+- "bad container param to dessertMeshifTable_container_init\n");
+- return;
+- }
+-
+- /*
+- * For advanced users, you can use a custom container. If you
+- * do not create one, one will be created for you.
+- */
+- *container_ptr_ptr = NULL;
+-
+- if (NULL == cache) {
+- snmp_log(LOG_ERR,
+- "bad cache param to dessertMeshifTable_container_init\n");
+- return;
+- }
+-
+- /*
+- * TODO:345:A: Set up dessertMeshifTable cache properties.
+- *
+- * Also for advanced users, you can set parameters for the
+- * cache. Do not change the magic pointer, as it is used
+- * by the MFD helper. To completely disable caching, set
+- * cache->enabled to 0.
+- */
+- cache->timeout = DESSERTMESHIFTABLE_CACHE_TIMEOUT; /* seconds */
+-} /* dessertMeshifTable_container_init */
+-
+-/**
+- * container shutdown
+- *
+- * @param container_ptr A pointer to the container.
+- *
+- * This function is called at shutdown to allow you to customize certain
+- * aspects of the access method. For the most part, it is for advanced
+- * users. The default code should suffice for most cases.
+- *
+- * This function is called before dessertMeshifTable_container_free().
+- *
+- * @remark
+- * This would also be a good place to do any cleanup needed
+- * for you data source. For example, closing a connection to another
+- * process that supplied the data, closing a database, etc.
+- */
+-void
+-dessertMeshifTable_container_shutdown(netsnmp_container * container_ptr)
+-{
+- DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_container_shutdown", "called\n"));
+-
+- if (NULL == container_ptr) {
+- snmp_log(LOG_ERR,
+- "bad params to dessertMeshifTable_container_shutdown\n");
+- return;
+- }
+-
+-} /* dessertMeshifTable_container_shutdown */
+-
+-/**
+- * load initial data
+- *
+- * TODO:350:M: Implement dessertMeshifTable data load
+- * This function will also be called by the cache helper to load
+- * the container again (after the container free function has been
+- * called to free the previous contents).
+- *
+- * @param container container to which items should be inserted
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_RESOURCE_UNAVAILABLE : Can't access data source
+- * @retval MFD_ERROR : other error.
+- *
+- * This function is called to load the index(es) (and data, optionally)
+- * for the every row in the data set.
+- *
+- * @remark
+- * While loading the data, the only important thing is the indexes.
+- * If access to your data is cheap/fast (e.g. you have a pointer to a
+- * structure in memory), it would make sense to update the data here.
+- * If, however, the accessing the data invovles more work (e.g. parsing
+- * some other existing data, or peforming calculations to derive the data),
+- * then you can limit yourself to setting the indexes and saving any
+- * information you will need later. Then use the saved information in
+- * dessertMeshifTable_row_prep() for populating data.
+- *
+- * @note
+- * If you need consistency between rows (like you want statistics
+- * for each row to be from the same time frame), you should set all
+- * data here.
+- *
+- */
+-int
+-dessertMeshifTable_container_load(netsnmp_container * container)
+-{
+- dessertMeshifTable_rowreq_ctx *rowreq_ctx;
+- dessert_meshif_t *meshif;
+- size_t count = 0;
+-
+- char inPkts[I64CHARSZ+1];
+- char outPkts[I64CHARSZ+1];
+- char inOctets[I64CHARSZ+1];
+- char outOctets[I64CHARSZ+1];
+-
+- /*
+- * temporary storage for index values
+- */
+- /*
+- * meshifIndex(1)///()//L/a/w/e/r/d/h
+- */
+- long meshifIndex = -1;
+-
+- dessert_debug("dessertMeshifTable_container_load called");
+- DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_container_load", "called\n"));
+-
+-
+-
+- /*
+- * TODO:351:M: |-> Load/update data in the dessertMeshifTable container.
+- * loop over your dessertMeshifTable data, allocate a rowreq context,
+- * set the index(es) [and data, optionally] and insert into
+- * the container.
+- */
+- pthread_rwlock_rdlock(&dessert_cfglock);
+- DL_FOREACH(dessert_meshiflist_get(), meshif){
+-
+- meshifIndex = ++count;
+-
+- /*
+- * TODO:352:M: | |-> set indexes in new dessertMeshifTable rowreq context.
+- * data context will be set from the param (unless NULL,
+- * in which case a new data context will be allocated)
+- */
+- rowreq_ctx = dessertMeshifTable_allocate_rowreq_ctx(NULL);
+- if (NULL == rowreq_ctx) {
+- snmp_log(LOG_ERR, "memory allocation failed\n");
+- pthread_rwlock_unlock(&dessert_cfglock);
+- return MFD_RESOURCE_UNAVAILABLE;
+- }
+-
+- if (MFD_SUCCESS != dessertMeshifTable_indexes_set(rowreq_ctx,
+- meshifIndex)) {
+- snmp_log(LOG_ERR, "error setting index while loading "
+- "dessertMeshifTable data.\n");
+- dessertMeshifTable_release_rowreq_ctx(rowreq_ctx);
+- continue;
+- }
+-
+- /*
+- * TODO:352:r: | |-> populate dessertMeshifTable data context.
+- * Populate data context here. (optionally, delay until row prep)
+- */
+-
+- rowreq_ctx->data.meshifName_len = strlen(meshif->if_name);
+- strcpy(rowreq_ctx->data.meshifName, meshif->if_name);
+-
+- rowreq_ctx->data.meshifMacAddress_len = 6;
+- memcpy(rowreq_ctx->data.meshifMacAddress, meshif->hwaddr, 6);
+-
+- pthread_mutex_lock(&(meshif->cnt_mutex));
+-
+- rowreq_ctx->data.meshifInPkts.low = meshif->ipkts & 0xffffffff;
+- rowreq_ctx->data.meshifInPkts.high = meshif->ipkts >> 32;
+-
+- rowreq_ctx->data.meshifOutPkts.low = meshif->opkts & 0xffffffff;
+- rowreq_ctx->data.meshifOutPkts.high = meshif->opkts >> 32;
+-
+- rowreq_ctx->data.meshifInOctets.low = meshif->ibytes & 0xffffffff;
+- rowreq_ctx->data.meshifInOctets.high = meshif->ibytes >> 32;
+-
+- rowreq_ctx->data.meshifOutOctets.low = meshif->obytes & 0xffffffff;
+- rowreq_ctx->data.meshifOutOctets.high = meshif->obytes >> 32;
+-
+-
+- printU64(inPkts, &rowreq_ctx->data.meshifInPkts);
+- printU64(outPkts, &rowreq_ctx->data.meshifOutPkts);
+- printU64(inOctets, &rowreq_ctx->data.meshifInOctets);
+- printU64(outOctets, &rowreq_ctx->data.meshifOutOctets);
+-
+-
+- dessert_debug("inPkts [%s] [%u]", inPkts, meshif->ipkts);
+- dessert_debug("outPkts [%s] [%u]", outPkts, meshif->opkts);
+- dessert_debug("inOctets [%s] [%u]", inOctets, meshif->ibytes);
+- dessert_debug("outOctets [%s] [%u]", outOctets,meshif->obytes);
+-
+-
+- pthread_mutex_unlock(&(meshif->cnt_mutex));
+-
+- /*
+- * insert into table container
+- */
+- CONTAINER_INSERT(container, rowreq_ctx);
+- }
+- pthread_rwlock_unlock(&dessert_cfglock);
+-
+-
+-
+- DEBUGMSGT(("verbose:dessertMeshifTable:dessertMeshifTable_container_load", "inserted %d records\n", count));
+-
+- if (meshifIndex == -1) return MFD_RESOURCE_UNAVAILABLE;
+-
+- return MFD_SUCCESS;
+-} /* dessertMeshifTable_container_load */
+-
+-/**
+- * container clean up
+- *
+- * @param container container with all current items
+- *
+- * This optional callback is called prior to all
+- * item's being removed from the container. If you
+- * need to do any processing before that, do it here.
+- *
+- * @note
+- * The MFD helper will take care of releasing all the row contexts.
+- *
+- */
+-void
+-dessertMeshifTable_container_free(netsnmp_container * container)
+-{
+- DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_container_free", "called\n"));
+-
+- /*
+- * TODO:380:M: Free dessertMeshifTable container data.
+- */
+-} /* dessertMeshifTable_container_free */
+-
+-/**
+- * prepare row for processing.
+- *
+- * When the agent has located the row for a request, this function is
+- * called to prepare the row for processing. If you fully populated
+- * the data context during the index setup phase, you may not need to
+- * do anything.
+- *
+- * @param rowreq_ctx pointer to a context.
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error.
+- */
+-int
+-dessertMeshifTable_row_prep(dessertMeshifTable_rowreq_ctx * rowreq_ctx)
+-{
+- DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_row_prep",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:390:o: Prepare row for request.
+- * If populating row data was delayed, this is the place to
+- * fill in the row for this request.
+- */
+-
+- return MFD_SUCCESS;
+-} /* dessertMeshifTable_row_prep */
+-
+-/** @} */
+diff --git a/snmp/dessertMeshifTable_data_access.h b/snmp/dessertMeshifTable_data_access.h
+deleted file mode 100644
+index 32fc460..0000000
+--- a/snmp/dessertMeshifTable_data_access.h
++++ /dev/null
+@@ -1,77 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 14170 $ of $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTMESHIFTABLE_DATA_ACCESS_H
+-#define DESSERTMESHIFTABLE_DATA_ACCESS_H
+-
+-#include "../dessert_internal.h"
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+- /*
+- *********************************************************************
+- * function declarations
+- */
+-
+- /*
+- *********************************************************************
+- * Table declarations
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertMeshifTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+- /*
+- * DESSERT-MIB::dessertMeshifTable is subid 5 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.5, length: 12
+- */
+-
+-
+- int
+- dessertMeshifTable_init_data(dessertMeshifTable_registration *
+- dessertMeshifTable_reg);
+-
+-
+- /*
+- * TODO:180:o: Review dessertMeshifTable cache timeout.
+- * The number of seconds before the cache times out
+- */
+-#define DESSERTMESHIFTABLE_CACHE_TIMEOUT DESSERT_AGENTX_MESHIFTABLE_CACHE_TIMEOUT
+-
+- void dessertMeshifTable_container_init(netsnmp_container **
+- container_ptr_ptr,
+- netsnmp_cache *
+- cache);
+- void dessertMeshifTable_container_shutdown(netsnmp_container
+- * container_ptr);
+-
+- int dessertMeshifTable_container_load(netsnmp_container *
+- container);
+- void dessertMeshifTable_container_free(netsnmp_container *
+- container);
+-
+- int dessertMeshifTable_cache_load(netsnmp_container *
+- container);
+- void dessertMeshifTable_cache_free(netsnmp_container *
+- container);
+-
+- int
+- dessertMeshifTable_row_prep(dessertMeshifTable_rowreq_ctx *
+- rowreq_ctx);
+-
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTMESHIFTABLE_DATA_ACCESS_H */
+diff --git a/snmp/dessertMeshifTable_data_get.c b/snmp/dessertMeshifTable_data_get.c
+deleted file mode 100644
+index 6dd56c0..0000000
+--- a/snmp/dessertMeshifTable_data_get.c
++++ /dev/null
+@@ -1,522 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 12088 $ of $
+- *
+- * $Id:$
+- */
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertMeshifTable.h"
+-
+-
+-/** @defgroup data_get data_get: Routines to get data
+- *
+- * TODO:230:M: Implement dessertMeshifTable get routines.
+- * TODO:240:M: Implement dessertMeshifTable mapping routines (if any).
+- *
+- * These routine are used to get the value for individual objects. The
+- * row context is passed, along with a pointer to the memory where the
+- * value should be copied.
+- *
+- * @{
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertMeshifTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+-/*
+- * DESSERT-MIB::dessertMeshifTable is subid 5 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.5, length: 12
+- */
+-
+-/*
+- * ---------------------------------------------------------------------
+- * * TODO:200:r: Implement dessertMeshifTable data context functions.
+- */
+-
+-
+-/**
+- * set mib index(es)
+- *
+- * @param tbl_idx mib index structure
+- * @param meshifIndex_val
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error.
+- *
+- * @remark
+- * This convenience function is useful for setting all the MIB index
+- * components with a single function call. It is assume that the C values
+- * have already been mapped from their native/rawformat to the MIB format.
+- */
+-int
+-dessertMeshifTable_indexes_set_tbl_idx(dessertMeshifTable_mib_index *
+- tbl_idx, long meshifIndex_val)
+-{
+- DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_indexes_set_tbl_idx", "called\n"));
+-
+- /*
+- * meshifIndex(1)///()//L/a/w/e/r/d/h
+- */
+- tbl_idx->meshifIndex = meshifIndex_val;
+-
+-
+- return MFD_SUCCESS;
+-} /* dessertMeshifTable_indexes_set_tbl_idx */
+-
+-/**
+- * @internal
+- * set row context indexes
+- *
+- * @param reqreq_ctx the row context that needs updated indexes
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error.
+- *
+- * @remark
+- * This function sets the mib indexs, then updates the oid indexs
+- * from the mib index.
+- */
+-int
+-dessertMeshifTable_indexes_set(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
+- long meshifIndex_val)
+-{
+- DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_indexes_set", "called\n"));
+-
+- if (MFD_SUCCESS !=
+- dessertMeshifTable_indexes_set_tbl_idx(&rowreq_ctx->tbl_idx,
+- meshifIndex_val))
+- return MFD_ERROR;
+-
+- /*
+- * convert mib index to oid index
+- */
+- rowreq_ctx->oid_idx.len = sizeof(rowreq_ctx->oid_tmp) / sizeof(oid);
+- if (0 != dessertMeshifTable_index_to_oid(&rowreq_ctx->oid_idx,
+- &rowreq_ctx->tbl_idx)) {
+- return MFD_ERROR;
+- }
+-
+- return MFD_SUCCESS;
+-} /* dessertMeshifTable_indexes_set */
+-
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertMeshifEntry.meshifName
+- * meshifName is subid 2 of dessertMeshifEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.5.1.2
+- * Description:
+-name of interface
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 1 hashint 1
+- * settable 0
+- * hint: 255a
+- *
+- * Ranges: 0 - 255;
+- *
+- * Its syntax is DisplayString (based on perltype OCTETSTR)
+- * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+- * This data type requires a length. (Max 255)
+- */
+-/**
+- * Extract the current value of the meshifName data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param meshifName_val_ptr_ptr
+- * Pointer to storage for a char variable
+- * @param meshifName_val_ptr_len_ptr
+- * Pointer to a size_t. On entry, it will contain the size (in bytes)
+- * pointed to by meshifName.
+- * On exit, this value should contain the data size (in bytes).
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+-*
+- * @note If you need more than (*meshifName_val_ptr_len_ptr) bytes of memory,
+- * allocate it using malloc() and update meshifName_val_ptr_ptr.
+- * <b>DO NOT</b> free the previous pointer.
+- * The MFD helper will release the memory you allocate.
+- *
+- * @remark If you call this function yourself, you are responsible
+- * for checking if the pointer changed, and freeing any
+- * previously allocated memory. (Not necessary if you pass
+- * in a pointer to static memory, obviously.)
+- */
+-int
+-meshifName_get(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
+- char **meshifName_val_ptr_ptr,
+- size_t *meshifName_val_ptr_len_ptr)
+-{
+- /** we should have a non-NULL pointer and enough storage */
+- netsnmp_assert((NULL != meshifName_val_ptr_ptr)
+- && (NULL != *meshifName_val_ptr_ptr));
+- netsnmp_assert(NULL != meshifName_val_ptr_len_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertMeshifTable:meshifName_get", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the meshifName data.
+- * copy (* meshifName_val_ptr_ptr ) data and (* meshifName_val_ptr_len_ptr ) from rowreq_ctx->data
+- */
+- /*
+- * make sure there is enough space for meshifName data
+- */
+- if ((NULL == (*meshifName_val_ptr_ptr)) ||
+- ((*meshifName_val_ptr_len_ptr) <
+- (rowreq_ctx->data.meshifName_len *
+- sizeof(rowreq_ctx->data.meshifName[0])))) {
+- /*
+- * allocate space for meshifName data
+- */
+- (*meshifName_val_ptr_ptr) =
+- malloc(rowreq_ctx->data.meshifName_len *
+- sizeof(rowreq_ctx->data.meshifName[0]));
+- if (NULL == (*meshifName_val_ptr_ptr)) {
+- snmp_log(LOG_ERR, "could not allocate memory\n");
+- return MFD_ERROR;
+- }
+- }
+- (*meshifName_val_ptr_len_ptr) =
+- rowreq_ctx->data.meshifName_len *
+- sizeof(rowreq_ctx->data.meshifName[0]);
+- memcpy((*meshifName_val_ptr_ptr), rowreq_ctx->data.meshifName,
+- rowreq_ctx->data.meshifName_len *
+- sizeof(rowreq_ctx->data.meshifName[0]));
+-
+- return MFD_SUCCESS;
+-} /* meshifName_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertMeshifEntry.meshifMacAddress
+- * meshifMacAddress is subid 3 of dessertMeshifEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.5.1.3
+- * Description:
+-hardware address of interface
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 1 hashint 1
+- * settable 0
+- * hint: 1x:
+- *
+- * Ranges: 6;
+- *
+- * Its syntax is MacAddress (based on perltype OCTETSTR)
+- * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+- * This data type requires a length. (Max 6)
+- */
+-/**
+- * Extract the current value of the meshifMacAddress data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param meshifMacAddress_val_ptr_ptr
+- * Pointer to storage for a char variable
+- * @param meshifMacAddress_val_ptr_len_ptr
+- * Pointer to a size_t. On entry, it will contain the size (in bytes)
+- * pointed to by meshifMacAddress.
+- * On exit, this value should contain the data size (in bytes).
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+-*
+- * @note If you need more than (*meshifMacAddress_val_ptr_len_ptr) bytes of memory,
+- * allocate it using malloc() and update meshifMacAddress_val_ptr_ptr.
+- * <b>DO NOT</b> free the previous pointer.
+- * The MFD helper will release the memory you allocate.
+- *
+- * @remark If you call this function yourself, you are responsible
+- * for checking if the pointer changed, and freeing any
+- * previously allocated memory. (Not necessary if you pass
+- * in a pointer to static memory, obviously.)
+- */
+-int
+-meshifMacAddress_get(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
+- char **meshifMacAddress_val_ptr_ptr,
+- size_t *meshifMacAddress_val_ptr_len_ptr)
+-{
+- /** we should have a non-NULL pointer and enough storage */
+- netsnmp_assert((NULL != meshifMacAddress_val_ptr_ptr)
+- && (NULL != *meshifMacAddress_val_ptr_ptr));
+- netsnmp_assert(NULL != meshifMacAddress_val_ptr_len_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertMeshifTable:meshifMacAddress_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the meshifMacAddress data.
+- * copy (* meshifMacAddress_val_ptr_ptr ) data and (* meshifMacAddress_val_ptr_len_ptr ) from rowreq_ctx->data
+- */
+- /*
+- * make sure there is enough space for meshifMacAddress data
+- */
+- if ((NULL == (*meshifMacAddress_val_ptr_ptr)) ||
+- ((*meshifMacAddress_val_ptr_len_ptr) <
+- (rowreq_ctx->data.meshifMacAddress_len *
+- sizeof(rowreq_ctx->data.meshifMacAddress[0])))) {
+- /*
+- * allocate space for meshifMacAddress data
+- */
+- (*meshifMacAddress_val_ptr_ptr) =
+- malloc(rowreq_ctx->data.meshifMacAddress_len *
+- sizeof(rowreq_ctx->data.meshifMacAddress[0]));
+- if (NULL == (*meshifMacAddress_val_ptr_ptr)) {
+- snmp_log(LOG_ERR, "could not allocate memory\n");
+- return MFD_ERROR;
+- }
+- }
+- (*meshifMacAddress_val_ptr_len_ptr) =
+- rowreq_ctx->data.meshifMacAddress_len *
+- sizeof(rowreq_ctx->data.meshifMacAddress[0]);
+- memcpy((*meshifMacAddress_val_ptr_ptr),
+- rowreq_ctx->data.meshifMacAddress,
+- rowreq_ctx->data.meshifMacAddress_len *
+- sizeof(rowreq_ctx->data.meshifMacAddress[0]));
+-
+- return MFD_SUCCESS;
+-} /* meshifMacAddress_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertMeshifEntry.meshifInPkts
+- * meshifInPkts is subid 4 of dessertMeshifEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.5.1.4
+- * Description:
+-packet counter in
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 0
+- *
+- *
+- * Its syntax is COUNTER64 (based on perltype COUNTER64)
+- * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+- */
+-/**
+- * Extract the current value of the meshifInPkts data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param meshifInPkts_val_ptr
+- * Pointer to storage for a U64 variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-meshifInPkts_get(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
+- U64 * meshifInPkts_val_ptr)
+-{
+- char inPkts[I64CHARSZ+1];
+-
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != meshifInPkts_val_ptr);
+-
+- /*
+- * TODO:231:o: |-> copy meshifInPkts data.
+- * get (* meshifInPkts_val_ptr ).low and (* meshifInPkts_val_ptr ).high from rowreq_ctx->data
+- */
+- (*meshifInPkts_val_ptr).high = rowreq_ctx->data.meshifInPkts.high;
+- (*meshifInPkts_val_ptr).low = rowreq_ctx->data.meshifInPkts.low;
+-
+- printU64(inPkts, meshifInPkts_val_ptr);
+-
+- return MFD_SUCCESS;
+-} /* meshifInPkts_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertMeshifEntry.meshifOutPkts
+- * meshifOutPkts is subid 5 of dessertMeshifEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.5.1.5
+- * Description:
+-packet counter out
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 0
+- *
+- *
+- * Its syntax is COUNTER64 (based on perltype COUNTER64)
+- * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+- */
+-/**
+- * Extract the current value of the meshifOutPkts data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param meshifOutPkts_val_ptr
+- * Pointer to storage for a U64 variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-meshifOutPkts_get(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
+- U64 * meshifOutPkts_val_ptr)
+-{
+- char outPkts[I64CHARSZ+1];
+-
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != meshifOutPkts_val_ptr);
+-
+- /*
+- * TODO:231:o: |-> copy meshifOutPkts data.
+- * get (* meshifOutPkts_val_ptr ).low and (* meshifOutPkts_val_ptr ).high from rowreq_ctx->data
+- */
+- (*meshifOutPkts_val_ptr).high = rowreq_ctx->data.meshifOutPkts.high;
+- (*meshifOutPkts_val_ptr).low = rowreq_ctx->data.meshifOutPkts.low;
+-
+- printU64(outPkts, meshifOutPkts_val_ptr);
+-
+-
+-
+-
+- return MFD_SUCCESS;
+-} /* meshifOutPkts_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertMeshifEntry.meshifInOctets
+- * meshifInOctets is subid 6 of dessertMeshifEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.5.1.6
+- * Description:
+-octet counter in
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 0
+- *
+- *
+- * Its syntax is COUNTER64 (based on perltype COUNTER64)
+- * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+- */
+-/**
+- * Extract the current value of the meshifInOctets data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param meshifInOctets_val_ptr
+- * Pointer to storage for a U64 variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-meshifInOctets_get(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
+- U64 * meshifInOctets_val_ptr)
+-{
+- char inOctets[I64CHARSZ+1];
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != meshifInOctets_val_ptr);
+-
+- /*
+- * TODO:231:o: |-> copy meshifInOctets data.
+- * get (* meshifInOctets_val_ptr ).low and (* meshifInOctets_val_ptr ).high from rowreq_ctx->data
+- */
+- (*meshifInOctets_val_ptr).high = rowreq_ctx->data.meshifInOctets.high;
+- (*meshifInOctets_val_ptr).low = rowreq_ctx->data.meshifInOctets.low;
+-
+- printU64(inOctets, meshifInOctets_val_ptr);
+-
+-
+- return MFD_SUCCESS;
+-} /* meshifInOctets_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT-MIB::dessertMeshifEntry.meshifOutOctets
+- * meshifOutOctets is subid 7 of dessertMeshifEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.5.1.7
+- * Description:
+-octet counter out
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 0
+- *
+- *
+- * Its syntax is COUNTER64 (based on perltype COUNTER64)
+- * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+- */
+-/**
+- * Extract the current value of the meshifOutOctets data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param meshifOutOctets_val_ptr
+- * Pointer to storage for a U64 variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-meshifOutOctets_get(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
+- U64 * meshifOutOctets_val_ptr)
+-{
+- char outOctets[I64CHARSZ+1];
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != meshifOutOctets_val_ptr);
+-
+- /*
+- * TODO:231:o: |-> copy meshifOutOctets data.
+- * get (* meshifOutOctets_val_ptr ).low and (* meshifOutOctets_val_ptr ).high from rowreq_ctx->data
+- */
+- (*meshifOutOctets_val_ptr).high =
+- rowreq_ctx->data.meshifOutOctets.high;
+- (*meshifOutOctets_val_ptr).low = rowreq_ctx->data.meshifOutOctets.low;
+-
+- printU64(outOctets, meshifOutOctets_val_ptr);
+-
+-
+- return MFD_SUCCESS;
+-} /* meshifOutOctets_get */
+-
+-
+-
+-/** @} */
+diff --git a/snmp/dessertMeshifTable_data_get.h b/snmp/dessertMeshifTable_data_get.h
+deleted file mode 100644
+index 0a7657d..0000000
+--- a/snmp/dessertMeshifTable_data_get.h
++++ /dev/null
+@@ -1,109 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 12088 $ of $
+- *
+- * $Id:$
+- *
+- * @file dessertMeshifTable_data_get.h
+- *
+- * @addtogroup get
+- *
+- * Prototypes for get functions
+- *
+- * @{
+- */
+-#ifndef DESSERTMESHIFTABLE_DATA_GET_H
+-#define DESSERTMESHIFTABLE_DATA_GET_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+- /*
+- *********************************************************************
+- * GET function declarations
+- */
+-
+- /*
+- *********************************************************************
+- * GET Table declarations
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertMeshifTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+- /*
+- * DESSERT-MIB::dessertMeshifTable is subid 5 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.5, length: 12
+- */
+- /*
+- * indexes
+- */
+- int meshifIndex_map(uint *mib_meshifIndex_val_ptr, uint
+- raw_meshifIndex_val);
+-
+- int meshifName_map(char **mib_meshifName_val_ptr_ptr,
+- size_t *mib_meshifName_val_ptr_len_ptr,
+- char *raw_meshifName_val_ptr,
+- size_t raw_meshifName_val_ptr_len,
+- int allow_realloc);
+- int meshifName_get(dessertMeshifTable_rowreq_ctx *
+- rowreq_ctx,
+- char **meshifName_val_ptr_ptr,
+- size_t *meshifName_val_ptr_len_ptr);
+- int meshifMacAddress_map(char
+- **mib_meshifMacAddress_val_ptr_ptr,
+- size_t
+- *mib_meshifMacAddress_val_ptr_len_ptr,
+- char
+- *raw_meshifMacAddress_val_ptr,
+- size_t
+- raw_meshifMacAddress_val_ptr_len,
+- int allow_realloc);
+- int meshifMacAddress_get(dessertMeshifTable_rowreq_ctx *
+- rowreq_ctx,
+- char
+- **meshifMacAddress_val_ptr_ptr,
+- size_t
+- *meshifMacAddress_val_ptr_len_ptr);
+- int meshifInPkts_map(U64 * mib_meshifInPkts_val_ptr,
+- U64 raw_meshifInPkts_val);
+- int meshifInPkts_get(dessertMeshifTable_rowreq_ctx *
+- rowreq_ctx,
+- U64 * meshifInPkts_val_ptr);
+- int meshifOutPkts_map(U64 * mib_meshifOutPkts_val_ptr,
+- U64 raw_meshifOutPkts_val);
+- int meshifOutPkts_get(dessertMeshifTable_rowreq_ctx *
+- rowreq_ctx,
+- U64 * meshifOutPkts_val_ptr);
+- int meshifInOctets_map(U64 * mib_meshifInOctets_val_ptr,
+- U64 raw_meshifInOctets_val);
+- int meshifInOctets_get(dessertMeshifTable_rowreq_ctx *
+- rowreq_ctx,
+- U64 * meshifInOctets_val_ptr);
+- int meshifOutOctets_map(U64 * mib_meshifOutOctets_val_ptr,
+- U64 raw_meshifOutOctets_val);
+- int meshifOutOctets_get(dessertMeshifTable_rowreq_ctx *
+- rowreq_ctx,
+- U64 * meshifOutOctets_val_ptr);
+-
+-
+- int
+- dessertMeshifTable_indexes_set_tbl_idx(dessertMeshifTable_mib_index
+- * tbl_idx, long meshifIndex_val);
+- int
+- dessertMeshifTable_indexes_set(dessertMeshifTable_rowreq_ctx *
+- rowreq_ctx, long meshifIndex_val);
+-
+-
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTMESHIFTABLE_DATA_GET_H */
+-/** @} */
+diff --git a/snmp/dessertMeshifTable_data_set.c b/snmp/dessertMeshifTable_data_set.c
+deleted file mode 100644
+index 7cc7af1..0000000
+--- a/snmp/dessertMeshifTable_data_set.c
++++ /dev/null
+@@ -1,28 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 12077 $ of $
+- *
+- * $Id:$
+- *
+- */
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertMeshifTable.h"
+-
+-
+-/** @defgroup data_set data_set: Routines to set data
+- *
+- * These routines are used to set the value for individual objects. The
+- * row context is passed, along with the new value.
+- *
+- * @{
+- */
+-/** @} */
+diff --git a/snmp/dessertMeshifTable_data_set.h b/snmp/dessertMeshifTable_data_set.h
+deleted file mode 100644
+index 2a96aaf..0000000
+--- a/snmp/dessertMeshifTable_data_set.h
++++ /dev/null
+@@ -1,28 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 12077 $ of $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTMESHIFTABLE_DATA_SET_H
+-#define DESSERTMESHIFTABLE_DATA_SET_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+- /*
+- *********************************************************************
+- * SET function declarations
+- */
+-
+- /*
+- *********************************************************************
+- * SET Table declarations
+- */
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTMESHIFTABLE_DATA_SET_H */
+diff --git a/snmp/dessertMeshifTable_enums.h b/snmp/dessertMeshifTable_enums.h
+deleted file mode 100644
+index 4b9b078..0000000
+--- a/snmp/dessertMeshifTable_enums.h
++++ /dev/null
+@@ -1,39 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * : generic-table-enums.m2c 12526 2005-07-15 22:41:16Z rstory $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTMESHIFTABLE_ENUMS_H
+-#define DESSERTMESHIFTABLE_ENUMS_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+- /*
+- * NOTES on enums
+- * ==============
+- *
+- * Value Mapping
+- * -------------
+- * If the values for your data type don't exactly match the
+- * possible values defined by the mib, you should map them
+- * below. For example, a boolean flag (1/0) is usually represented
+- * as a TruthValue in a MIB, which maps to the values (1/2).
+- *
+- */
+-/*************************************************************************
+- *************************************************************************
+- *
+- * enum definitions for table dessertMeshifTable
+- *
+- *************************************************************************
+- *************************************************************************/
+-
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTMESHIFTABLE_ENUMS_H */
+diff --git a/snmp/dessertMeshifTable_interface.c b/snmp/dessertMeshifTable_interface.c
+deleted file mode 100644
+index 976dcd6..0000000
+--- a/snmp/dessertMeshifTable_interface.c
++++ /dev/null
+@@ -1,944 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 15899 $ of $
+- *
+- * $Id:$
+- */
+-/*
+- * *********************************************************************
+- * *********************************************************************
+- * *********************************************************************
+- * *** ***
+- * *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
+- * *** ***
+- * *** ***
+- * *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
+- * *** ***
+- * *** ***
+- * *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
+- * *** ***
+- * *** ***
+- * *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
+- * *** ***
+- * *** ***
+- * *********************************************************************
+- * *********************************************************************
+- * *********************************************************************
+- */
+-
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertMeshifTable.h"
+-
+-
+-#include <net-snmp/agent/table_container.h>
+-#include <net-snmp/library/container.h>
+-
+-#include "dessertMeshifTable_interface.h"
+-
+-#include <ctype.h>
+-
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertMeshifTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+-/*
+- * DESSERT-MIB::dessertMeshifTable is subid 5 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.5, length: 12
+- */
+-typedef struct dessertMeshifTable_interface_ctx_s {
+-
+- netsnmp_container *container;
+- netsnmp_cache *cache;
+-
+- dessertMeshifTable_registration *user_ctx;
+-
+- netsnmp_table_registration_info tbl_info;
+-
+- netsnmp_baby_steps_access_methods access_multiplexer;
+-
+-} dessertMeshifTable_interface_ctx;
+-
+-static dessertMeshifTable_interface_ctx dessertMeshifTable_if_ctx;
+-
+-static void
+-_dessertMeshifTable_container_init(dessertMeshifTable_interface_ctx *
+- if_ctx);
+-static void
+-_dessertMeshifTable_container_shutdown(dessertMeshifTable_interface_ctx *
+- if_ctx);
+-
+-
+-netsnmp_container *
+-dessertMeshifTable_container_get(void)
+-{
+- return dessertMeshifTable_if_ctx.container;
+-}
+-
+-dessertMeshifTable_registration *
+-dessertMeshifTable_registration_get(void)
+-{
+- return dessertMeshifTable_if_ctx.user_ctx;
+-}
+-
+-dessertMeshifTable_registration *
+-dessertMeshifTable_registration_set(dessertMeshifTable_registration *
+- newreg)
+-{
+- dessertMeshifTable_registration *old =
+- dessertMeshifTable_if_ctx.user_ctx;
+- dessertMeshifTable_if_ctx.user_ctx = newreg;
+- return old;
+-}
+-
+-int
+-dessertMeshifTable_container_size(void)
+-{
+- return CONTAINER_SIZE(dessertMeshifTable_if_ctx.container);
+-}
+-
+-/*
+- * mfd multiplexer modes
+- */
+-static Netsnmp_Node_Handler _mfd_dessertMeshifTable_pre_request;
+-static Netsnmp_Node_Handler _mfd_dessertMeshifTable_post_request;
+-static Netsnmp_Node_Handler _mfd_dessertMeshifTable_object_lookup;
+-static Netsnmp_Node_Handler _mfd_dessertMeshifTable_get_values;
+-/**
+- * @internal
+- * Initialize the table dessertMeshifTable
+- * (Define its contents and how it's structured)
+- */
+-void
+-_dessertMeshifTable_initialize_interface(dessertMeshifTable_registration *
+- reg_ptr, u_long flags)
+-{
+- netsnmp_baby_steps_access_methods *access_multiplexer =
+- &dessertMeshifTable_if_ctx.access_multiplexer;
+- netsnmp_table_registration_info *tbl_info =
+- &dessertMeshifTable_if_ctx.tbl_info;
+- netsnmp_handler_registration *reginfo;
+- netsnmp_mib_handler *handler;
+- int mfd_modes = 0;
+-
+- DEBUGMSGTL(("internal:dessertMeshifTable:_dessertMeshifTable_initialize_interface", "called\n"));
+-
+-
+- /*************************************************
+- *
+- * save interface context for dessertMeshifTable
+- */
+- /*
+- * Setting up the table's definition
+- */
+- netsnmp_table_helper_add_indexes(tbl_info,ASN_INTEGER,
+- /** index: meshifIndex */
+- 0);
+-
+- /*
+- * Define the minimum and maximum accessible columns. This
+- * optimizes retrival.
+- */
+- tbl_info->min_column = DESSERTMESHIFTABLE_MIN_COL;
+- tbl_info->max_column = DESSERTMESHIFTABLE_MAX_COL;
+-
+- /*
+- * save users context
+- */
+- dessertMeshifTable_if_ctx.user_ctx = reg_ptr;
+-
+- /*
+- * call data access initialization code
+- */
+- dessertMeshifTable_init_data(reg_ptr);
+-
+- /*
+- * set up the container
+- */
+- _dessertMeshifTable_container_init(&dessertMeshifTable_if_ctx);
+- if (NULL == dessertMeshifTable_if_ctx.container) {
+- snmp_log(LOG_ERR,
+- "could not initialize container for dessertMeshifTable\n");
+- return;
+- }
+-
+- /*
+- * access_multiplexer: REQUIRED wrapper for get request handling
+- */
+- access_multiplexer->object_lookup =
+- _mfd_dessertMeshifTable_object_lookup;
+- access_multiplexer->get_values = _mfd_dessertMeshifTable_get_values;
+-
+- /*
+- * no wrappers yet
+- */
+- access_multiplexer->pre_request = _mfd_dessertMeshifTable_pre_request;
+- access_multiplexer->post_request =
+- _mfd_dessertMeshifTable_post_request;
+-
+-
+- /*************************************************
+- *
+- * Create a registration, save our reg data, register table.
+- */
+- DEBUGMSGTL(("dessertMeshifTable:init_dessertMeshifTable",
+- "Registering dessertMeshifTable as a mibs-for-dummies table.\n"));
+- handler =
+- netsnmp_baby_steps_access_multiplexer_get(access_multiplexer);
+- reginfo =
+- netsnmp_handler_registration_create("dessertMeshifTable", handler,
+- dessertMeshifTable_oid,
+- dessertMeshifTable_oid_size,
+- HANDLER_CAN_BABY_STEP |
+- HANDLER_CAN_RONLY);
+- if (NULL == reginfo) {
+- snmp_log(LOG_ERR, "error registering table dessertMeshifTable\n");
+- return;
+- }
+- reginfo->my_reg_void = &dessertMeshifTable_if_ctx;
+-
+- /*************************************************
+- *
+- * set up baby steps handler, create it and inject it
+- */
+- if (access_multiplexer->object_lookup)
+- mfd_modes |= BABY_STEP_OBJECT_LOOKUP;
+- if (access_multiplexer->set_values)
+- mfd_modes |= BABY_STEP_SET_VALUES;
+- if (access_multiplexer->irreversible_commit)
+- mfd_modes |= BABY_STEP_IRREVERSIBLE_COMMIT;
+- if (access_multiplexer->object_syntax_checks)
+- mfd_modes |= BABY_STEP_CHECK_OBJECT;
+-
+- if (access_multiplexer->pre_request)
+- mfd_modes |= BABY_STEP_PRE_REQUEST;
+- if (access_multiplexer->post_request)
+- mfd_modes |= BABY_STEP_POST_REQUEST;
+-
+- if (access_multiplexer->undo_setup)
+- mfd_modes |= BABY_STEP_UNDO_SETUP;
+- if (access_multiplexer->undo_cleanup)
+- mfd_modes |= BABY_STEP_UNDO_CLEANUP;
+- if (access_multiplexer->undo_sets)
+- mfd_modes |= BABY_STEP_UNDO_SETS;
+-
+- if (access_multiplexer->row_creation)
+- mfd_modes |= BABY_STEP_ROW_CREATE;
+- if (access_multiplexer->consistency_checks)
+- mfd_modes |= BABY_STEP_CHECK_CONSISTENCY;
+- if (access_multiplexer->commit)
+- mfd_modes |= BABY_STEP_COMMIT;
+- if (access_multiplexer->undo_commit)
+- mfd_modes |= BABY_STEP_UNDO_COMMIT;
+-
+- handler = netsnmp_baby_steps_handler_get(mfd_modes);
+- netsnmp_inject_handler(reginfo, handler);
+-
+- /*************************************************
+- *
+- * inject row_merge helper with prefix rootoid_len + 2 (entry.col)
+- */
+- handler = netsnmp_get_row_merge_handler(reginfo->rootoid_len + 2);
+- netsnmp_inject_handler(reginfo, handler);
+-
+- /*************************************************
+- *
+- * inject container_table helper
+- */
+- handler =
+- netsnmp_container_table_handler_get(tbl_info,
+- dessertMeshifTable_if_ctx.
+- container,
+- TABLE_CONTAINER_KEY_NETSNMP_INDEX);
+- netsnmp_inject_handler(reginfo, handler);
+-
+- /*************************************************
+- *
+- * inject cache helper
+- */
+- if (NULL != dessertMeshifTable_if_ctx.cache) {
+- handler =
+- netsnmp_cache_handler_get(dessertMeshifTable_if_ctx.cache);
+- netsnmp_inject_handler(reginfo, handler);
+- }
+-
+- /*
+- * register table
+- */
+- netsnmp_register_table(reginfo, tbl_info);
+-
+-} /* _dessertMeshifTable_initialize_interface */
+-
+-/**
+- * @internal
+- * Shutdown the table dessertMeshifTable
+- */
+-void
+-_dessertMeshifTable_shutdown_interface(dessertMeshifTable_registration *
+- reg_ptr)
+-{
+- /*
+- * shutdown the container
+- */
+- _dessertMeshifTable_container_shutdown(&dessertMeshifTable_if_ctx);
+-}
+-
+-void
+-dessertMeshifTable_valid_columns_set(netsnmp_column_info *vc)
+-{
+- dessertMeshifTable_if_ctx.tbl_info.valid_columns = vc;
+-} /* dessertMeshifTable_valid_columns_set */
+-
+-/**
+- * @internal
+- * convert the index component stored in the context to an oid
+- */
+-int
+-dessertMeshifTable_index_to_oid(netsnmp_index * oid_idx,
+- dessertMeshifTable_mib_index * mib_idx)
+-{
+- int err = SNMP_ERR_NOERROR;
+-
+- /*
+- * temp storage for parsing indexes
+- */
+- /*
+- * meshifIndex(1)///()//L/a/w/e/r/d/h
+- */
+- netsnmp_variable_list var_meshifIndex;
+-
+- /*
+- * set up varbinds
+- */
+- memset(&var_meshifIndex, 0x00, sizeof(var_meshifIndex));
+- var_meshifIndex.type = ASN_INTEGER;
+-
+- /*
+- * chain temp index varbinds together
+- */
+- var_meshifIndex.next_variable = NULL;
+-
+-
+- DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_index_to_oid", "called\n"));
+-
+- /*
+- * meshifIndex(1)///()//L/a/w/e/r/d/h
+- */
+- snmp_set_var_value(&var_meshifIndex, (u_char *) & mib_idx->meshifIndex,
+- sizeof(mib_idx->meshifIndex));
+-
+-
+- err = build_oid_noalloc(oid_idx->oids, oid_idx->len, &oid_idx->len,
+- NULL, 0, &var_meshifIndex);
+- if (err)
+- snmp_log(LOG_ERR, "error %d converting index to oid\n", err);
+-
+- /*
+- * parsing may have allocated memory. free it.
+- */
+- snmp_reset_var_buffers(&var_meshifIndex);
+-
+- return err;
+-} /* dessertMeshifTable_index_to_oid */
+-
+-/**
+- * extract dessertMeshifTable indexes from a netsnmp_index
+- *
+- * @retval SNMP_ERR_NOERROR : no error
+- * @retval SNMP_ERR_GENERR : error
+- */
+-int
+-dessertMeshifTable_index_from_oid(netsnmp_index * oid_idx,
+- dessertMeshifTable_mib_index * mib_idx)
+-{
+- int err = SNMP_ERR_NOERROR;
+-
+- /*
+- * temp storage for parsing indexes
+- */
+- /*
+- * meshifIndex(1)///()//L/a/w/e/r/d/h
+- */
+- netsnmp_variable_list var_meshifIndex;
+-
+- /*
+- * set up varbinds
+- */
+- memset(&var_meshifIndex, 0x00, sizeof(var_meshifIndex));
+- var_meshifIndex.type = ASN_INTEGER;
+-
+- /*
+- * chain temp index varbinds together
+- */
+- var_meshifIndex.next_variable = NULL;
+-
+-
+- DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_index_from_oid", "called\n"));
+-
+- /*
+- * parse the oid into the individual index components
+- */
+- err = parse_oid_indexes(oid_idx->oids, oid_idx->len, &var_meshifIndex);
+- if (err == SNMP_ERR_NOERROR) {
+- /*
+- * copy out values
+- */
+- mib_idx->meshifIndex = *((long *)var_meshifIndex.val.string);
+-
+-
+- }
+-
+- /*
+- * parsing may have allocated memory. free it.
+- */
+- snmp_reset_var_buffers(&var_meshifIndex);
+-
+- return err;
+-} /* dessertMeshifTable_index_from_oid */
+-
+-
+-/*
+- *********************************************************************
+- * @internal
+- * allocate resources for a dessertMeshifTable_rowreq_ctx
+- */
+-dessertMeshifTable_rowreq_ctx *
+-dessertMeshifTable_allocate_rowreq_ctx(void *user_init_ctx)
+-{
+- dessertMeshifTable_rowreq_ctx *rowreq_ctx =
+- SNMP_MALLOC_TYPEDEF(dessertMeshifTable_rowreq_ctx);
+-
+- DEBUGMSGTL(("internal:dessertMeshifTable:dessertMeshifTable_allocate_rowreq_ctx", "called\n"));
+-
+- if (NULL == rowreq_ctx) {
+- snmp_log(LOG_ERR, "Couldn't allocate memory for a "
+- "dessertMeshifTable_rowreq_ctx.\n");
+- return NULL;
+- }
+-
+- rowreq_ctx->oid_idx.oids = rowreq_ctx->oid_tmp;
+-
+- rowreq_ctx->dessertMeshifTable_data_list = NULL;
+-
+- /*
+- * if we allocated data, call init routine
+- */
+- if (!(rowreq_ctx->rowreq_flags & MFD_ROW_DATA_FROM_USER)) {
+- if (SNMPERR_SUCCESS !=
+- dessertMeshifTable_rowreq_ctx_init(rowreq_ctx,
+- user_init_ctx)) {
+- dessertMeshifTable_release_rowreq_ctx(rowreq_ctx);
+- rowreq_ctx = NULL;
+- }
+- }
+-
+- return rowreq_ctx;
+-} /* dessertMeshifTable_allocate_rowreq_ctx */
+-
+-/*
+- * @internal
+- * release resources for a dessertMeshifTable_rowreq_ctx
+- */
+-void
+-dessertMeshifTable_release_rowreq_ctx(dessertMeshifTable_rowreq_ctx *
+- rowreq_ctx)
+-{
+- DEBUGMSGTL(("internal:dessertMeshifTable:dessertMeshifTable_release_rowreq_ctx", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- dessertMeshifTable_rowreq_ctx_cleanup(rowreq_ctx);
+-
+- /*
+- * free index oid pointer
+- */
+- if (rowreq_ctx->oid_idx.oids != rowreq_ctx->oid_tmp)
+- free(rowreq_ctx->oid_idx.oids);
+-
+- SNMP_FREE(rowreq_ctx);
+-} /* dessertMeshifTable_release_rowreq_ctx */
+-
+-/**
+- * @internal
+- * wrapper
+- */
+-static int
+-_mfd_dessertMeshifTable_pre_request(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- int rc;
+-
+- DEBUGMSGTL(("internal:dessertMeshifTable:_mfd_dessertMeshifTable_pre_request", "called\n"));
+-
+- if (1 != netsnmp_row_merge_status_first(reginfo, agtreq_info)) {
+- DEBUGMSGTL(("internal:dessertMeshifTable",
+- "skipping additional pre_request\n"));
+- return SNMP_ERR_NOERROR;
+- }
+-
+- rc = dessertMeshifTable_pre_request(dessertMeshifTable_if_ctx.
+- user_ctx);
+- if (MFD_SUCCESS != rc) {
+- /*
+- * nothing we can do about it but log it
+- */
+- DEBUGMSGTL(("dessertMeshifTable", "error %d from "
+- "dessertMeshifTable_pre_request\n", rc));
+- netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
+- }
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertMeshifTable_pre_request */
+-
+-/**
+- * @internal
+- * wrapper
+- */
+-static int
+-_mfd_dessertMeshifTable_post_request(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- dessertMeshifTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+- int rc, packet_rc;
+-
+- DEBUGMSGTL(("internal:dessertMeshifTable:_mfd_dessertMeshifTable_post_request", "called\n"));
+-
+- /*
+- * release row context, if deleted
+- */
+- if (rowreq_ctx && (rowreq_ctx->rowreq_flags & MFD_ROW_DELETED))
+- dessertMeshifTable_release_rowreq_ctx(rowreq_ctx);
+-
+- /*
+- * wait for last call before calling user
+- */
+- if (1 != netsnmp_row_merge_status_last(reginfo, agtreq_info)) {
+- DEBUGMSGTL(("internal:dessertMeshifTable",
+- "waiting for last post_request\n"));
+- return SNMP_ERR_NOERROR;
+- }
+-
+- packet_rc = netsnmp_check_all_requests_error(agtreq_info->asp, 0);
+- rc = dessertMeshifTable_post_request(dessertMeshifTable_if_ctx.
+- user_ctx, packet_rc);
+- if (MFD_SUCCESS != rc) {
+- /*
+- * nothing we can do about it but log it
+- */
+- DEBUGMSGTL(("dessertMeshifTable", "error %d from "
+- "dessertMeshifTable_post_request\n", rc));
+- }
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertMeshifTable_post_request */
+-
+-/**
+- * @internal
+- * wrapper
+- */
+-static int
+-_mfd_dessertMeshifTable_object_lookup(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration
+- *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- int rc = SNMP_ERR_NOERROR;
+- dessertMeshifTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+-
+- DEBUGMSGTL(("internal:dessertMeshifTable:_mfd_dessertMeshifTable_object_lookup", "called\n"));
+-
+- /*
+- * get our context from mfd
+- * dessertMeshifTable_interface_ctx *if_ctx =
+- * (dessertMeshifTable_interface_ctx *)reginfo->my_reg_void;
+- */
+-
+- if (NULL == rowreq_ctx) {
+- rc = SNMP_ERR_NOCREATION;
+- }
+-
+- if (MFD_SUCCESS != rc)
+- netsnmp_request_set_error_all(requests, rc);
+- else
+- dessertMeshifTable_row_prep(rowreq_ctx);
+-
+- return SNMP_VALIDATE_ERR(rc);
+-} /* _mfd_dessertMeshifTable_object_lookup */
+-
+-/***********************************************************************
+- *
+- * GET processing
+- *
+- ***********************************************************************/
+-/*
+- * @internal
+- * Retrieve the value for a particular column
+- */
+-NETSNMP_STATIC_INLINE int
+-_dessertMeshifTable_get_column(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
+- netsnmp_variable_list * var, int column)
+-{
+- int rc = SNMPERR_SUCCESS;
+-
+- DEBUGMSGTL(("internal:dessertMeshifTable:_mfd_dessertMeshifTable_get_column", "called for %d\n", column));
+-
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- switch (column) {
+-
+- /*
+- * meshifName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- case COLUMN_MESHIFNAME:
+- var->type = ASN_OCTET_STR;
+- rc = meshifName_get(rowreq_ctx, (char **) &var->val.string,
+- &var->val_len);
+- break;
+-
+- /*
+- * meshifMacAddress(3)/MacAddress/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- case COLUMN_MESHIFMACADDRESS:
+- var->type = ASN_OCTET_STR;
+- rc = meshifMacAddress_get(rowreq_ctx, (char **) &var->val.string,
+- &var->val_len);
+- break;
+-
+- /*
+- * meshifInPkts(4)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- case COLUMN_MESHIFINPKTS:
+- var->val_len = sizeof(U64);
+- var->type = ASN_COUNTER64;
+- rc = meshifInPkts_get(rowreq_ctx, (U64 *) var->val.string);
+- break;
+-
+- /*
+- * meshifOutPkts(5)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- case COLUMN_MESHIFOUTPKTS:
+- var->val_len = sizeof(U64);
+- var->type = ASN_COUNTER64;
+- rc = meshifOutPkts_get(rowreq_ctx, (U64 *) var->val.string);
+- break;
+-
+- /*
+- * meshifInOctets(6)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- case COLUMN_MESHIFINOCTETS:
+- var->val_len = sizeof(U64);
+- var->type = ASN_COUNTER64;
+- rc = meshifInOctets_get(rowreq_ctx, (U64 *) var->val.string);
+- break;
+-
+- /*
+- * meshifOutOctets(7)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- case COLUMN_MESHIFOUTOCTETS:
+- var->val_len = sizeof(U64);
+- var->type = ASN_COUNTER64;
+- rc = meshifOutOctets_get(rowreq_ctx, (U64 *) var->val.string);
+- break;
+-
+- default:
+- if (DESSERTMESHIFTABLE_MIN_COL <= column
+- && column <= DESSERTMESHIFTABLE_MAX_COL) {
+- DEBUGMSGTL(("internal:dessertMeshifTable:_mfd_dessertMeshifTable_get_column", "assume column %d is reserved\n", column));
+- rc = MFD_SKIP;
+- } else {
+- snmp_log(LOG_ERR,
+- "unknown column %d in _dessertMeshifTable_get_column\n",
+- column);
+- }
+- break;
+- }
+-
+- return rc;
+-} /* _dessertMeshifTable_get_column */
+-
+-int
+-_mfd_dessertMeshifTable_get_values(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration *reginfo,
+- netsnmp_agent_request_info *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- dessertMeshifTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+- netsnmp_table_request_info *tri;
+- u_char *old_string;
+- void (*dataFreeHook) (void *);
+- int rc;
+-
+- DEBUGMSGTL(("internal:dessertMeshifTable:_mfd_dessertMeshifTable_get_values", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- for (; requests; requests = requests->next) {
+- /*
+- * save old pointer, so we can free it if replaced
+- */
+- old_string = requests->requestvb->val.string;
+- dataFreeHook = requests->requestvb->dataFreeHook;
+- if (NULL == requests->requestvb->val.string) {
+- requests->requestvb->val.string = requests->requestvb->buf;
+- requests->requestvb->val_len =
+- sizeof(requests->requestvb->buf);
+- } else if (requests->requestvb->buf ==
+- requests->requestvb->val.string) {
+- if (requests->requestvb->val_len !=
+- sizeof(requests->requestvb->buf))
+- requests->requestvb->val_len =
+- sizeof(requests->requestvb->buf);
+- }
+-
+- /*
+- * get column data
+- */
+- tri = netsnmp_extract_table_info(requests);
+- if (NULL == tri)
+- continue;
+-
+- rc = _dessertMeshifTable_get_column(rowreq_ctx,
+- requests->requestvb,
+- tri->colnum);
+- if (rc) {
+- if (MFD_SKIP == rc) {
+- requests->requestvb->type = SNMP_NOSUCHINSTANCE;
+- rc = SNMP_ERR_NOERROR;
+- }
+- } else if (NULL == requests->requestvb->val.string) {
+- snmp_log(LOG_ERR, "NULL varbind data pointer!\n");
+- rc = SNMP_ERR_GENERR;
+- }
+- if (rc)
+- netsnmp_request_set_error(requests, SNMP_VALIDATE_ERR(rc));
+-
+- /*
+- * if the buffer wasn't used previously for the old data (i.e. it
+- * was allcoated memory) and the get routine replaced the pointer,
+- * we need to free the previous pointer.
+- */
+- if (old_string && (old_string != requests->requestvb->buf) &&
+- (requests->requestvb->val.string != old_string)) {
+- if (dataFreeHook)
+- (*dataFreeHook) (old_string);
+- else
+- free(old_string);
+- }
+- } /* for results */
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertMeshifTable_get_values */
+-
+-
+-/***********************************************************************
+- *
+- * SET processing
+- *
+- ***********************************************************************/
+-
+-/*
+- * SET PROCESSING NOT APPLICABLE (per MIB or user setting)
+- */
+-/***********************************************************************
+- *
+- * DATA ACCESS
+- *
+- ***********************************************************************/
+-static void _container_free(netsnmp_container * container);
+-
+-/**
+- * @internal
+- */
+-static int
+-_cache_load(netsnmp_cache * cache, void *vmagic)
+-{
+- DEBUGMSGTL(("internal:dessertMeshifTable:_cache_load", "called\n"));
+-
+- if ((NULL == cache) || (NULL == cache->magic)) {
+- snmp_log(LOG_ERR,
+- "invalid cache for dessertMeshifTable_cache_load\n");
+- return -1;
+- }
+-
+- /** should only be called for an invalid or expired cache */
+- netsnmp_assert((0 == cache->valid) || (1 == cache->expired));
+-
+- /*
+- * call user code
+- */
+- return dessertMeshifTable_container_load((netsnmp_container *) cache->
+- magic);
+-} /* _cache_load */
+-
+-/**
+- * @internal
+- */
+-static void
+-_cache_free(netsnmp_cache * cache, void *magic)
+-{
+- netsnmp_container *container;
+-
+- DEBUGMSGTL(("internal:dessertMeshifTable:_cache_free", "called\n"));
+-
+- if ((NULL == cache) || (NULL == cache->magic)) {
+- snmp_log(LOG_ERR,
+- "invalid cache in dessertMeshifTable_cache_free\n");
+- return;
+- }
+-
+- container = (netsnmp_container *) cache->magic;
+-
+- _container_free(container);
+-} /* _cache_free */
+-
+-/**
+- * @internal
+- */
+-static void
+-_container_item_free(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
+- void *context)
+-{
+- DEBUGMSGTL(("internal:dessertMeshifTable:_container_item_free",
+- "called\n"));
+-
+- if (NULL == rowreq_ctx)
+- return;
+-
+- dessertMeshifTable_release_rowreq_ctx(rowreq_ctx);
+-} /* _container_item_free */
+-
+-/**
+- * @internal
+- */
+-static void
+-_container_free(netsnmp_container * container)
+-{
+- DEBUGMSGTL(("internal:dessertMeshifTable:_container_free",
+- "called\n"));
+-
+- if (NULL == container) {
+- snmp_log(LOG_ERR,
+- "invalid container in dessertMeshifTable_container_free\n");
+- return;
+- }
+-
+- /*
+- * call user code
+- */
+- dessertMeshifTable_container_free(container);
+-
+- /*
+- * free all items. inefficient, but easy.
+- */
+- CONTAINER_CLEAR(container,
+- (netsnmp_container_obj_func *) _container_item_free,
+- NULL);
+-} /* _container_free */
+-
+-/**
+- * @internal
+- * initialize the container with functions or wrappers
+- */
+-void
+-_dessertMeshifTable_container_init(dessertMeshifTable_interface_ctx *
+- if_ctx)
+-{
+- DEBUGMSGTL(("internal:dessertMeshifTable:_dessertMeshifTable_container_init", "called\n"));
+-
+- /*
+- * cache init
+- */
+- if_ctx->cache = netsnmp_cache_create(30, /* timeout in seconds */
+- _cache_load, _cache_free,
+- dessertMeshifTable_oid,
+- dessertMeshifTable_oid_size);
+-
+- if (NULL == if_ctx->cache) {
+- snmp_log(LOG_ERR, "error creating cache for dessertMeshifTable\n");
+- return;
+- }
+-
+- if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;
+-
+- dessertMeshifTable_container_init(&if_ctx->container, if_ctx->cache);
+- if (NULL == if_ctx->container)
+- if_ctx->container =
+- netsnmp_container_find("dessertMeshifTable:table_container");
+- if (NULL == if_ctx->container) {
+- snmp_log(LOG_ERR, "error creating container in "
+- "dessertMeshifTable_container_init\n");
+- return;
+- }
+-
+- if (NULL != if_ctx->cache)
+- if_ctx->cache->magic = (void *) if_ctx->container;
+-} /* _dessertMeshifTable_container_init */
+-
+-/**
+- * @internal
+- * shutdown the container with functions or wrappers
+- */
+-void
+-_dessertMeshifTable_container_shutdown(dessertMeshifTable_interface_ctx *
+- if_ctx)
+-{
+- DEBUGMSGTL(("internal:dessertMeshifTable:_dessertMeshifTable_container_shutdown", "called\n"));
+-
+- dessertMeshifTable_container_shutdown(if_ctx->container);
+-
+- _container_free(if_ctx->container);
+-
+-} /* _dessertMeshifTable_container_shutdown */
+-
+-
+-dessertMeshifTable_rowreq_ctx *
+-dessertMeshifTable_row_find_by_mib_index(dessertMeshifTable_mib_index *
+- mib_idx)
+-{
+- dessertMeshifTable_rowreq_ctx *rowreq_ctx;
+- oid oid_tmp[MAX_OID_LEN];
+- netsnmp_index oid_idx;
+- int rc;
+-
+- /*
+- * set up storage for OID
+- */
+- oid_idx.oids = oid_tmp;
+- oid_idx.len = sizeof(oid_tmp) / sizeof(oid);
+-
+- /*
+- * convert
+- */
+- rc = dessertMeshifTable_index_to_oid(&oid_idx, mib_idx);
+- if (MFD_SUCCESS != rc)
+- return NULL;
+-
+- rowreq_ctx =
+- CONTAINER_FIND(dessertMeshifTable_if_ctx.container, &oid_idx);
+-
+- return rowreq_ctx;
+-}
+diff --git a/snmp/dessertMeshifTable_interface.h b/snmp/dessertMeshifTable_interface.h
+deleted file mode 100644
+index 5bee20c..0000000
+--- a/snmp/dessertMeshifTable_interface.h
++++ /dev/null
+@@ -1,98 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 15899 $ of $
+- *
+- * $Id:$
+- */
+-/** @ingroup interface: Routines to interface to Net-SNMP
+- *
+- * \warning This code should not be modified, called directly,
+- * or used to interpret functionality. It is subject to
+- * change at any time.
+- *
+- * @{
+- */
+-/*
+- * *********************************************************************
+- * *********************************************************************
+- * *********************************************************************
+- * *** ***
+- * *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
+- * *** ***
+- * *** ***
+- * *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
+- * *** ***
+- * *** ***
+- * *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
+- * *** ***
+- * *** ***
+- * *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
+- * *** ***
+- * *** ***
+- * *********************************************************************
+- * *********************************************************************
+- * *********************************************************************
+- */
+-#ifndef DESSERTMESHIFTABLE_INTERFACE_H
+-#define DESSERTMESHIFTABLE_INTERFACE_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+-#include "dessertMeshifTable.h"
+-
+-
+- /*
+- ********************************************************************
+- * Table declarations
+- */
+-
+- /*
+- * PUBLIC interface initialization routine
+- */
+- void
+- _dessertMeshifTable_initialize_interface
+- (dessertMeshifTable_registration * user_ctx, u_long flags);
+- void
+- _dessertMeshifTable_shutdown_interface
+- (dessertMeshifTable_registration * user_ctx);
+-
+- dessertMeshifTable_registration
+- *dessertMeshifTable_registration_get(void);
+-
+- dessertMeshifTable_registration
+- *dessertMeshifTable_registration_set
+- (dessertMeshifTable_registration * newreg);
+-
+- netsnmp_container *dessertMeshifTable_container_get(void);
+- int dessertMeshifTable_container_size(void);
+-
+- dessertMeshifTable_rowreq_ctx
+- *dessertMeshifTable_allocate_rowreq_ctx(void *);
+- void
+- dessertMeshifTable_release_rowreq_ctx(dessertMeshifTable_rowreq_ctx
+- * rowreq_ctx);
+-
+- int dessertMeshifTable_index_to_oid(netsnmp_index *
+- oid_idx,
+- dessertMeshifTable_mib_index
+- * mib_idx);
+- int dessertMeshifTable_index_from_oid(netsnmp_index *
+- oid_idx,
+- dessertMeshifTable_mib_index
+- * mib_idx);
+-
+- /*
+- * access to certain internals. use with caution!
+- */
+- void
+- dessertMeshifTable_valid_columns_set(netsnmp_column_info *vc);
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTMESHIFTABLE_INTERFACE_H */
+-/** @} */
+diff --git a/snmp/dessertMeshifTable_oids.h b/snmp/dessertMeshifTable_oids.h
+deleted file mode 100644
+index cbb5334..0000000
+--- a/snmp/dessertMeshifTable_oids.h
++++ /dev/null
+@@ -1,43 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * : generic-table-oids.m2c 12855 2005-09-27 15:56:08Z rstory $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTMESHIFTABLE_OIDS_H
+-#define DESSERTMESHIFTABLE_OIDS_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+- /*
+- * column number definitions for table dessertMeshifTable
+- */
+-#define DESSERTMESHIFTABLE_OID 1,3,6,1,4,1,18898,0,19,10,1,1,5
+-
+-#define COLUMN_MESHIFINDEX 1
+-
+-#define COLUMN_MESHIFNAME 2
+-
+-#define COLUMN_MESHIFMACADDRESS 3
+-
+-#define COLUMN_MESHIFINPKTS 4
+-
+-#define COLUMN_MESHIFOUTPKTS 5
+-
+-#define COLUMN_MESHIFINOCTETS 6
+-
+-#define COLUMN_MESHIFOUTOCTETS 7
+-
+-
+-#define DESSERTMESHIFTABLE_MIN_COL COLUMN_MESHIFNAME
+-#define DESSERTMESHIFTABLE_MAX_COL COLUMN_MESHIFOUTOCTETS
+-
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTMESHIFTABLE_OIDS_H */
+diff --git a/snmp/dessertObjects.c b/snmp/dessertObjects.c
+deleted file mode 100644
+index c00b267..0000000
+--- a/snmp/dessertObjects.c
++++ /dev/null
+@@ -1,164 +0,0 @@
+-/**
+- * Note: this file originally auto-generated by mib2c using
+- * : mib2c.scalar.conf 11805 2005-01-07 09:37:18Z dts12 $
+- */
+-
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-#include "../dessert_internal.h"
+-
+-/** Initializes the dessertObjects module */
+-void
+-init_dessertObjects(void)
+-{
+- static oid dessertMeshifNumber_oid[] =
+- { 1, 3, 6, 1, 4, 1, 18898, 0, 19, 10, 1, 1, 4 };
+- static oid applicationVersion_oid[] =
+- { 1, 3, 6, 1, 4, 1, 18898, 0, 19, 10, 1, 1, 3, 2 };
+- static oid protocollShortName_oid[] =
+- { 1, 3, 6, 1, 4, 1, 18898, 0, 19, 10, 1, 1, 3, 3 };
+-
+- DEBUGMSGTL((AGENT, "Initializing\n"));
+-
+- netsnmp_register_scalar(netsnmp_create_handler_registration
+- ("dessertMeshifNumber",
+- handle_dessertMeshifNumber,
+- dessertMeshifNumber_oid,
+- OID_LENGTH(dessertMeshifNumber_oid),
+- HANDLER_CAN_RONLY));
+- netsnmp_register_scalar(netsnmp_create_handler_registration
+- ("applicationVersion",
+- handle_applicationVersion,
+- applicationVersion_oid,
+- OID_LENGTH(applicationVersion_oid),
+- HANDLER_CAN_RONLY));
+- netsnmp_register_scalar(netsnmp_create_handler_registration
+- ("protocollShortName",
+- handle_protocollShortName,
+- protocollShortName_oid,
+- OID_LENGTH(protocollShortName_oid),
+- HANDLER_CAN_RONLY));
+-}
+-
+-int
+-handle_dessertMeshifNumber(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration *reginfo,
+- netsnmp_agent_request_info *reqinfo,
+- netsnmp_request_info *requests)
+-{
+- u_char meshif_count;
+-
+- dessert_meshif_t *meshif;
+-
+- DL_FOREACH(dessert_meshiflist_get(), meshif){
+- meshif_count++;
+- }
+-
+- /*
+- * We are never called for a GETNEXT if it's registered as a
+- * "instance", as it's "magically" handled for us.
+- */
+-
+- /*
+- * a instance handler also only hands us one request at a time, so
+- * we don't need to loop over a list of requests; we'll only get one.
+- */
+-
+- switch (reqinfo->mode) {
+-
+- case MODE_GET:
+- DEBUGMSGTL((AGENT, "handle_dessertMeshifNumber:MODE_GET\n"));
+- snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+- (u_char *) &meshif_count, sizeof(u_char));
+- break;
+-
+-
+- default:
+- /*
+- * we should never get here, so this is a really bad error
+- */
+- snmp_log(LOG_ERR,
+- "unknown mode (%d) in handle_dessertMeshifNumber\n",
+- reqinfo->mode);
+- return SNMP_ERR_GENERR;
+- }
+-
+- return SNMP_ERR_NOERROR;
+-}
+-
+-int
+-handle_applicationVersion(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration *reginfo,
+- netsnmp_agent_request_info *reqinfo,
+- netsnmp_request_info *requests)
+-{
+- /*
+- * We are never called for a GETNEXT if it's registered as a
+- * "instance", as it's "magically" handled for us.
+- */
+-
+- /*
+- * a instance handler also only hands us one request at a time, so
+- * we don't need to loop over a list of requests; we'll only get one.
+- */
+-
+- switch (reqinfo->mode) {
+-
+- case MODE_GET:
+- DEBUGMSGTL((AGENT, "handle_applicationVersion:MODE_GET\n"));
+- snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+- (u_char *) &dessert_ver, sizeof(dessert_ver));
+- break;
+-
+-
+- default:
+- /*
+- * we should never get here, so this is a really bad error
+- */
+- snmp_log(LOG_ERR,
+- "unknown mode (%d) in handle_applicationVersion\n",
+- reqinfo->mode);
+- return SNMP_ERR_GENERR;
+- }
+-
+- return SNMP_ERR_NOERROR;
+-}
+-
+-int
+-handle_protocollShortName(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration *reginfo,
+- netsnmp_agent_request_info *reqinfo,
+- netsnmp_request_info *requests)
+-{
+- /*
+- * We are never called for a GETNEXT if it's registered as a
+- * "instance", as it's "magically" handled for us.
+- */
+-
+- /*
+- * a instance handler also only hands us one request at a time, so
+- * we don't need to loop over a list of requests; we'll only get one.
+- */
+-
+- switch (reqinfo->mode) {
+-
+- case MODE_GET:
+- DEBUGMSGTL((AGENT, "handle_protocollShortName:MODE_GET\n"));
+- snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
+- (u_char *) dessert_proto, DESSERT_PROTO_STRLEN+1);
+- break;
+-
+-
+- default:
+- /*
+- * we should never get here, so this is a really bad error
+- */
+- snmp_log(LOG_ERR,
+- "unknown mode (%d) in handle_protocollShortName\n",
+- reqinfo->mode);
+- return SNMP_ERR_GENERR;
+- }
+-
+- return SNMP_ERR_NOERROR;
+-}
+diff --git a/snmp/dessertObjects.h b/snmp/dessertObjects.h
+deleted file mode 100644
+index 520601d..0000000
+--- a/snmp/dessertObjects.h
++++ /dev/null
+@@ -1,17 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * : mib2c.scalar.conf 11805 2005-01-07 09:37:18Z dts12 $
+- */
+-#ifndef DESSERTOBJECTS_H
+-#define DESSERTOBJECTS_H
+-
+-
+-/*
+- * function declarations
+- */
+-void init_dessertObjects(void);
+-Netsnmp_Node_Handler handle_dessertMeshifNumber;
+-Netsnmp_Node_Handler handle_applicationVersion;
+-Netsnmp_Node_Handler handle_protocollShortName;
+-
+-#endif /* DESSERTOBJECTS_H */
+diff --git a/snmp/dessertSysifTable.c b/snmp/dessertSysifTable.c
+deleted file mode 100644
+index 63cf3ee..0000000
+--- a/snmp/dessertSysifTable.c
++++ /dev/null
+@@ -1,215 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 14170 $ of $
+- *
+- * $Id:$
+- */
+-/** \page MFD helper for dessertSysifTable
+- *
+- * \section intro Introduction
+- * Introductory text.
+- *
+- */
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertSysifTable.h"
+-
+-#include <net-snmp/agent/mib_modules.h>
+-
+-#include "dessertSysifTable_interface.h"
+-
+-oid dessertSysifTable_oid[] = { DESSERTSYSIFTABLE_OID };
+-
+-int dessertSysifTable_oid_size =
+-OID_LENGTH(dessertSysifTable_oid);
+-
+-dessertSysifTable_registration dessertSysifTable_user_context;
+-
+-void initialize_table_dessertSysifTable(void);
+-void shutdown_table_dessertSysifTable(void);
+-
+-
+-/**
+- * Initializes the dessertSysifTable module
+- */
+-void
+-init_dessertSysifTable(void)
+-{
+- DEBUGMSGTL(("verbose:dessertSysifTable:init_dessertSysifTable",
+- "called\n"));
+-
+- /*
+- * TODO:300:o: Perform dessertSysifTable one-time module initialization.
+- */
+-
+- /*
+- * here we initialize all the tables we're planning on supporting
+- */
+- if (should_init("dessertSysifTable"))
+- initialize_table_dessertSysifTable();
+-
+-} /* init_dessertSysifTable */
+-
+-/**
+- * Shut-down the dessertSysifTable module (agent is exiting)
+- */
+-void
+-shutdown_dessertSysifTable(void)
+-{
+- if (should_init("dessertSysifTable"))
+- shutdown_table_dessertSysifTable();
+-
+-}
+-
+-/**
+- * Initialize the table dessertSysifTable
+- * (Define its contents and how it's structured)
+- */
+-void
+-initialize_table_dessertSysifTable(void)
+-{
+- dessertSysifTable_registration *user_context;
+- u_long flags;
+-
+- DEBUGMSGTL(("verbose:dessertSysifTable:initialize_table_dessertSysifTable", "called\n"));
+-
+- /*
+- * TODO:301:o: Perform dessertSysifTable one-time table initialization.
+- */
+-
+- /*
+- * TODO:302:o: |->Initialize dessertSysifTable user context
+- * if you'd like to pass in a pointer to some data for this
+- * table, allocate or set it up here.
+- */
+- /*
+- * a netsnmp_data_list is a simple way to store void pointers. A simple
+- * string token is used to add, find or remove pointers.
+- */
+- user_context =
+- netsnmp_create_data_list("dessertSysifTable", NULL, NULL);
+-
+- /*
+- * No support for any flags yet, but in the future you would
+- * set any flags here.
+- */
+- flags = 0;
+-
+- /*
+- * call interface initialization code
+- */
+- _dessertSysifTable_initialize_interface(user_context, flags);
+-} /* initialize_table_dessertSysifTable */
+-
+-/**
+- * Shutdown the table dessertSysifTable
+- */
+-void
+-shutdown_table_dessertSysifTable(void)
+-{
+- /*
+- * call interface shutdown code
+- */
+- _dessertSysifTable_shutdown_interface(&dessertSysifTable_user_context);
+-}
+-
+-/**
+- * extra context initialization (eg default values)
+- *
+- * @param rowreq_ctx : row request context
+- * @param user_init_ctx : void pointer for user (parameter to rowreq_ctx_allocate)
+- *
+- * @retval MFD_SUCCESS : no errors
+- * @retval MFD_ERROR : error (context allocate will fail)
+- */
+-int
+-dessertSysifTable_rowreq_ctx_init(dessertSysifTable_rowreq_ctx *
+- rowreq_ctx, void *user_init_ctx)
+-{
+- DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_rowreq_ctx_init", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:210:o: |-> Perform extra dessertSysifTable rowreq initialization. (eg DEFVALS)
+- */
+-
+- return MFD_SUCCESS;
+-} /* dessertSysifTable_rowreq_ctx_init */
+-
+-/**
+- * extra context cleanup
+- *
+- */
+-void
+-dessertSysifTable_rowreq_ctx_cleanup(dessertSysifTable_rowreq_ctx *
+- rowreq_ctx)
+-{
+- DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_rowreq_ctx_cleanup", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:211:o: |-> Perform extra dessertSysifTable rowreq cleanup.
+- */
+-} /* dessertSysifTable_rowreq_ctx_cleanup */
+-
+-/**
+- * pre-request callback
+- *
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error
+- */
+-int
+-dessertSysifTable_pre_request(dessertSysifTable_registration *
+- user_context)
+-{
+- DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_pre_request",
+- "called\n"));
+-
+- /*
+- * TODO:510:o: Perform dessertSysifTable pre-request actions.
+- */
+-
+- return MFD_SUCCESS;
+-} /* dessertSysifTable_pre_request */
+-
+-/**
+- * post-request callback
+- *
+- * Note:
+- * New rows have been inserted into the container, and
+- * deleted rows have been removed from the container and
+- * released.
+- *
+- * @param user_context
+- * @param rc : MFD_SUCCESS if all requests succeeded
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error (ignored)
+- */
+-int
+-dessertSysifTable_post_request(dessertSysifTable_registration *
+- user_context, int rc)
+-{
+- DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_post_request",
+- "called\n"));
+-
+- /*
+- * TODO:511:o: Perform dessertSysifTable post-request actions.
+- */
+-
+- return MFD_SUCCESS;
+-} /* dessertSysifTable_post_request */
+-
+-
+-/** @{ */
+diff --git a/snmp/dessertSysifTable.h b/snmp/dessertSysifTable.h
+deleted file mode 100644
+index 30f4300..0000000
+--- a/snmp/dessertSysifTable.h
++++ /dev/null
+@@ -1,230 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 14170 $ of $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTSYSIFTABLE_H
+-#define DESSERTSYSIFTABLE_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+-/** @addtogroup misc misc: Miscellaneous routines
+- *
+- * @{
+- */
+-#include <net-snmp/library/asn1.h>
+-
+- /*
+- * other required module components
+- */
+- /* *INDENT-OFF* */
+-config_add_mib(DESSERT2-MIB)
+-config_require(DESSERT2-MIB/dessertSysifTable/dessertSysifTable_interface)
+-config_require(DESSERT2-MIB/dessertSysifTable/dessertSysifTable_data_access)
+-config_require(DESSERT2-MIB/dessertSysifTable/dessertSysifTable_data_get)
+-config_require(DESSERT2-MIB/dessertSysifTable/dessertSysifTable_data_set)
+- /* *INDENT-ON* */
+-
+- /*
+- * OID and column number definitions for dessertSysifTable
+- */
+-#include "dessertSysifTable_oids.h"
+-
+- /*
+- * enum definions
+- */
+-#include "dessertSysifTable_enums.h"
+-
+-
+-
+-/*
+- *********************************************************************
+- * function declarations
+- */
+- void init_dessertSysifTable(void);
+- void shutdown_dessertSysifTable(void);
+-
+- /*
+- *********************************************************************
+- * Table declarations
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertSysifTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+- /*
+- * DESSERT2-MIB::dessertSysifTable is subid 7 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.7, length: 12
+- */
+- /*
+- *********************************************************************
+- * When you register your mib, you get to provide a generic
+- * pointer that will be passed back to you for most of the
+- * functions calls.
+- *
+- * TODO:100:r: Review all context structures
+- */
+- /*
+- * TODO:101:o: |-> Review dessertSysifTable registration context.
+- */
+- typedef netsnmp_data_list dessertSysifTable_registration;
+-
+-/**********************************************************************/
+- /*
+- * TODO:110:r: |-> Review dessertSysifTable data context structure.
+- * This structure is used to represent the data for dessertSysifTable.
+- */
+- /*
+- * This structure contains storage for all the columns defined in the
+- * dessertSysifTable.
+- */
+- typedef struct dessertSysifTable_data_s {
+-
+- /*
+- * sysifName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- char sysifName[255];
+- size_t sysifName_len; /* # of char elements, not bytes */
+-
+- /*
+- * sysifMacAddress(3)/MacAddress/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- char sysifMacAddress[6];
+- size_t sysifMacAddress_len; /* # of char elements, not bytes */
+-
+- /*
+- * sysifInPkts(4)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- U64 sysifInPkts;
+-
+- /*
+- * sysifOutPkts(5)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- U64 sysifOutPkts;
+-
+- /*
+- * sysifInOctets(6)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- U64 sysifInOctets;
+-
+- /*
+- * sysifOutOctets(7)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- U64 sysifOutOctets;
+-
+- } dessertSysifTable_data;
+-
+-
+- /*
+- * TODO:120:r: |-> Review dessertSysifTable mib index.
+- * This structure is used to represent the index for dessertSysifTable.
+- */
+- typedef struct dessertSysifTable_mib_index_s {
+-
+- /*
+- * sysifIndex(1)///()//L/a/w/e/r/d/h
+- */
+- long sysifIndex;
+-
+-
+- } dessertSysifTable_mib_index;
+-
+- /*
+- * TODO:121:r: | |-> Review dessertSysifTable max index length.
+- * If you KNOW that your indexes will never exceed a certain
+- * length, update this macro to that length.
+- */
+-#define MAX_dessertSysifTable_IDX_LEN 1
+-
+-
+- /*
+- *********************************************************************
+- * TODO:130:o: |-> Review dessertSysifTable Row request (rowreq) context.
+- * When your functions are called, you will be passed a
+- * dessertSysifTable_rowreq_ctx pointer.
+- */
+- typedef struct dessertSysifTable_rowreq_ctx_s {
+-
+- /** this must be first for container compare to work */
+- netsnmp_index oid_idx;
+- oid oid_tmp[MAX_dessertSysifTable_IDX_LEN];
+-
+- dessertSysifTable_mib_index tbl_idx;
+-
+- dessertSysifTable_data data;
+-
+- /*
+- * flags per row. Currently, the first (lower) 8 bits are reserved
+- * for the user. See mfd.h for other flags.
+- */
+- u_int rowreq_flags;
+-
+- /*
+- * TODO:131:o: | |-> Add useful data to dessertSysifTable rowreq context.
+- */
+-
+- /*
+- * storage for future expansion
+- */
+- netsnmp_data_list *dessertSysifTable_data_list;
+-
+- } dessertSysifTable_rowreq_ctx;
+-
+- typedef struct dessertSysifTable_ref_rowreq_ctx_s {
+- dessertSysifTable_rowreq_ctx *rowreq_ctx;
+- } dessertSysifTable_ref_rowreq_ctx;
+-
+- /*
+- *********************************************************************
+- * function prototypes
+- */
+- int
+- dessertSysifTable_pre_request(dessertSysifTable_registration *
+- user_context);
+- int
+- dessertSysifTable_post_request(dessertSysifTable_registration *
+- user_context, int rc);
+-
+- int
+- dessertSysifTable_rowreq_ctx_init(dessertSysifTable_rowreq_ctx *
+- rowreq_ctx, void *user_init_ctx);
+- void
+- dessertSysifTable_rowreq_ctx_cleanup(dessertSysifTable_rowreq_ctx *
+- rowreq_ctx);
+-
+-
+- dessertSysifTable_rowreq_ctx
+- *dessertSysifTable_row_find_by_mib_index
+- (dessertSysifTable_mib_index * mib_idx);
+-
+- extern oid dessertSysifTable_oid[];
+- extern int dessertSysifTable_oid_size;
+-
+-#include "dessertSysifTable_interface.h"
+-#include "dessertSysifTable_data_access.h"
+-#include "dessertSysifTable_data_get.h"
+-#include "dessertSysifTable_data_set.h"
+-
+- /*
+- * DUMMY markers, ignore
+- *
+- * TODO:099:x: *************************************************************
+- * TODO:199:x: *************************************************************
+- * TODO:299:x: *************************************************************
+- * TODO:399:x: *************************************************************
+- * TODO:499:x: *************************************************************
+- */
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTSYSIFTABLE_H */
+-/** @} */
+diff --git a/snmp/dessertSysifTable_data_access.c b/snmp/dessertSysifTable_data_access.c
+deleted file mode 100644
+index 1a78894..0000000
+--- a/snmp/dessertSysifTable_data_access.c
++++ /dev/null
+@@ -1,342 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 14170 $ of $
+- *
+- * $Id:$
+- */
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "../dessert_internal.h"
+-
+-
+-#include "dessertSysifTable_data_access.h"
+-
+-/** @ingroup interface
+- * @addtogroup data_access data_access: Routines to access data
+- *
+- * These routines are used to locate the data used to satisfy
+- * requests.
+- *
+- * @{
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertSysifTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+-/*
+- * DESSERT2-MIB::dessertSysifTable is subid 7 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.7, length: 12
+- */
+-
+-/**
+- * initialization for dessertSysifTable data access
+- *
+- * This function is called during startup to allow you to
+- * allocate any resources you need for the data table.
+- *
+- * @param dessertSysifTable_reg
+- * Pointer to dessertSysifTable_registration
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : unrecoverable error.
+- */
+-int
+-dessertSysifTable_init_data(dessertSysifTable_registration *
+- dessertSysifTable_reg)
+-{
+- DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_init_data",
+- "called\n"));
+-
+- return MFD_SUCCESS;
+-} /* dessertSysifTable_init_data */
+-
+-/**
+- * container overview
+- *
+- */
+-
+-/**
+- * container initialization
+- *
+- * @param container_ptr_ptr A pointer to a container pointer. If you
+- * create a custom container, use this parameter to return it
+- * to the MFD helper. If set to NULL, the MFD helper will
+- * allocate a container for you.
+- * @param cache A pointer to a cache structure. You can set the timeout
+- * and other cache flags using this pointer.
+- *
+- * This function is called at startup to allow you to customize certain
+- * aspects of the access method. For the most part, it is for advanced
+- * users. The default code should suffice for most cases. If no custom
+- * container is allocated, the MFD code will create one for your.
+- *
+- * This is also the place to set up cache behavior. The default, to
+- * simply set the cache timeout, will work well with the default
+- * container. If you are using a custom container, you may want to
+- * look at the cache helper documentation to see if there are any
+- * flags you want to set.
+- *
+- * @remark
+- * This would also be a good place to do any initialization needed
+- * for you data source. For example, opening a connection to another
+- * process that will supply the data, opening a database, etc.
+- */
+-void
+-dessertSysifTable_container_init(netsnmp_container ** container_ptr_ptr,
+- netsnmp_cache * cache)
+-{
+- DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_container_init", "called\n"));
+- dessert_debug("dessertSysifTable_container_load called");
+- if (NULL == container_ptr_ptr) {
+- snmp_log(LOG_ERR,
+- "bad container param to dessertSysifTable_container_init\n");
+- return;
+- }
+-
+- /*
+- * For advanced users, you can use a custom container. If you
+- * do not create one, one will be created for you.
+- */
+- *container_ptr_ptr = NULL;
+-
+- if (NULL == cache) {
+- snmp_log(LOG_ERR,
+- "bad cache param to dessertSysifTable_container_init\n");
+- return;
+- }
+-
+- /*
+- * TODO:345:A: Set up dessertSysifTable cache properties.
+- *
+- * Also for advanced users, you can set parameters for the
+- * cache. Do not change the magic pointer, as it is used
+- * by the MFD helper. To completely disable caching, set
+- * cache->enabled to 0.
+- */
+- cache->timeout = DESSERTSYSIFTABLE_CACHE_TIMEOUT; /* seconds */
+-} /* dessertSysifTable_container_init */
+-
+-/**
+- * container shutdown
+- *
+- * @param container_ptr A pointer to the container.
+- *
+- * This function is called at shutdown to allow you to customize certain
+- * aspects of the access method. For the most part, it is for advanced
+- * users. The default code should suffice for most cases.
+- *
+- * This function is called before dessertSysifTable_container_free().
+- *
+- * @remark
+- * This would also be a good place to do any cleanup needed
+- * for you data source. For example, closing a connection to another
+- * process that supplied the data, closing a database, etc.
+- */
+-void
+-dessertSysifTable_container_shutdown(netsnmp_container * container_ptr)
+-{
+- DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_container_shutdown", "called\n"));
+-
+- if (NULL == container_ptr) {
+- snmp_log(LOG_ERR,
+- "bad params to dessertSysifTable_container_shutdown\n");
+- return;
+- }
+-
+-} /* dessertSysifTable_container_shutdown */
+-
+-/**
+- * load initial data
+- *
+- * TODO:350:M: Implement dessertSysifTable data load
+- * This function will also be called by the cache helper to load
+- * the container again (after the container free function has been
+- * called to free the previous contents).
+- *
+- * @param container container to which items should be inserted
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_RESOURCE_UNAVAILABLE : Can't access data source
+- * @retval MFD_ERROR : other error.
+- *
+- * This function is called to load the index(es) (and data, optionally)
+- * for the every row in the data set.
+- *
+- * @remark
+- * While loading the data, the only important thing is the indexes.
+- * If access to your data is cheap/fast (e.g. you have a pointer to a
+- * structure in memory), it would make sense to update the data here.
+- * If, however, the accessing the data invovles more work (e.g. parsing
+- * some other existing data, or peforming calculations to derive the data),
+- * then you can limit yourself to setting the indexes and saving any
+- * information you will need later. Then use the saved information in
+- * dessertSysifTable_row_prep() for populating data.
+- *
+- * @note
+- * If you need consistency between rows (like you want statistics
+- * for each row to be from the same time frame), you should set all
+- * data here.
+- *
+- */
+-int dessertSysifTable_container_load(netsnmp_container * container) {
+-
+- dessertSysifTable_rowreq_ctx *rowreq_ctx;
+- dessert_sysif_t *sysif = _dessert_sysif; /* TODO: change if multiple tun/tap interfaces are supported*/
+-
+- char inPkts[I64CHARSZ + 1];
+- char outPkts[I64CHARSZ + 1];
+- char inOctets[I64CHARSZ + 1];
+- char outOctets[I64CHARSZ + 1];
+-
+- /*
+- * temporary storage for index values
+- */
+- /*
+- * sysifIndex(1)///()//L/a/w/e/r/d/h
+- */
+- long sysifIndex = 0;
+-
+- dessert_debug("dessertSysifTable_container_load called");
+- DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_container_load", "called\n"));
+-
+- /*
+- * TODO:351:M: |-> Load/update data in the dessertSysTable container.
+- * loop over your dessertSysifTable data, allocate a rowreq context,
+- * set the index(es) [and data, optionally] and insert into
+- * the container.
+- */
+-
+- /*
+- * TODO:352:M: | |-> set indexes in new dessertSysifTable rowreq context.
+- * data context will be set from the param (unless NULL,
+- * in which case a new data context will be allocated)
+- */
+- rowreq_ctx = dessertSysifTable_allocate_rowreq_ctx(NULL);
+- if (NULL == rowreq_ctx) {
+- snmp_log(LOG_ERR, "memory allocation failed\n");
+- return MFD_RESOURCE_UNAVAILABLE;
+- }
+-
+- if (MFD_SUCCESS != dessertSysifTable_indexes_set(rowreq_ctx, sysifIndex)) {
+- snmp_log(LOG_ERR, "error setting index while loading "
+- "dessertSysTable data.\n");
+- dessertSysifTable_release_rowreq_ctx(rowreq_ctx);
+- return MFD_RESOURCE_UNAVAILABLE;
+- }
+-
+- /*
+- * TODO:352:r: | |-> populate dessertMeshifTable data context.
+- * Populate data context here. (optionally, delay until row prep)
+- */
+- /*
+- * non-TRANSIENT data: no need to copy. set pointer to data
+- */
+-
+- rowreq_ctx->data.sysifName_len = strlen(sysif->if_name);
+- strcpy(rowreq_ctx->data.sysifName, sysif->if_name);
+-
+- rowreq_ctx->data.sysifMacAddress_len = 6;
+- memcpy(rowreq_ctx->data.sysifMacAddress, sysif->hwaddr, 6);
+-
+- pthread_mutex_lock(&(sysif->cnt_mutex));
+-
+- rowreq_ctx->data.sysifInPkts.low = sysif->ipkts & 0xffffffff;
+- rowreq_ctx->data.sysifInPkts.high = sysif->ipkts >> 32;
+-
+- rowreq_ctx->data.sysifOutPkts.low = sysif->opkts & 0xffffffff;
+- rowreq_ctx->data.sysifOutPkts.high = sysif->opkts >> 32;
+-
+- rowreq_ctx->data.sysifInOctets.low = sysif->ibytes & 0xffffffff;
+- rowreq_ctx->data.sysifInOctets.high = sysif->ibytes >> 32;
+-
+- rowreq_ctx->data.sysifOutOctets.low = sysif->obytes & 0xffffffff;
+- rowreq_ctx->data.sysifOutOctets.high = sysif->obytes >> 32;
+-
+- printU64(inPkts, &rowreq_ctx->data.sysifInPkts);
+- printU64(outPkts, &rowreq_ctx->data.sysifOutPkts);
+- printU64(inOctets, &rowreq_ctx->data.sysifInOctets);
+- printU64(outOctets, &rowreq_ctx->data.sysifOutOctets);
+-
+- dessert_debug("inPkts [%s] [%u]", inPkts, sysif->ipkts);
+- dessert_debug("outPkts [%s] [%u]", outPkts, sysif->opkts);
+- dessert_debug("inOctets [%s] [%u]", inOctets, sysif->ibytes);
+- dessert_debug("outOctets [%s] [%u]", outOctets, sysif->obytes);
+-
+- pthread_mutex_unlock(&(sysif->cnt_mutex));
+-
+- /*
+- * insert into table container
+- */
+- CONTAINER_INSERT(container, rowreq_ctx);
+-
+- DEBUGMSGT(("verbose:dessertSysifTable:dessertSysifTable_container_load", "inserted 1 record(s)\n"));
+-
+- return MFD_SUCCESS;
+-} /* dessertSysifTable_container_load */
+-
+-/**
+- * container clean up
+- *
+- * @param container container with all current items
+- *
+- * This optional callback is called prior to all
+- * item's being removed from the container. If you
+- * need to do any processing before that, do it here.
+- *
+- * @note
+- * The MFD helper will take care of releasing all the row contexts.
+- *
+- */
+-void
+-dessertSysifTable_container_free(netsnmp_container * container)
+-{
+- DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_container_free", "called\n"));
+-
+- /*
+- * TODO:380:M: Free dessertSysifTable container data.
+- */
+-} /* dessertSysifTable_container_free */
+-
+-/**
+- * prepare row for processing.
+- *
+- * When the agent has located the row for a request, this function is
+- * called to prepare the row for processing. If you fully populated
+- * the data context during the index setup phase, you may not need to
+- * do anything.
+- *
+- * @param rowreq_ctx pointer to a context.
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error.
+- */
+-int
+-dessertSysifTable_row_prep(dessertSysifTable_rowreq_ctx * rowreq_ctx)
+-{
+- DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_row_prep",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:390:o: Prepare row for request.
+- * If populating row data was delayed, this is the place to
+- * fill in the row for this request.
+- */
+-
+- return MFD_SUCCESS;
+-} /* dessertSysifTable_row_prep */
+-
+-/** @} */
+diff --git a/snmp/dessertSysifTable_data_access.h b/snmp/dessertSysifTable_data_access.h
+deleted file mode 100644
+index 2e37990..0000000
+--- a/snmp/dessertSysifTable_data_access.h
++++ /dev/null
+@@ -1,90 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 14170 $ of $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTSYSIFTABLE_DATA_ACCESS_H
+-#define DESSERTSYSIFTABLE_DATA_ACCESS_H
+-
+-#include "../dessert_internal.h"
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+- /*
+- *********************************************************************
+- * function declarations
+- */
+-
+- /*
+- *********************************************************************
+- * Table declarations
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertSysifTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+- /*
+- * DESSERT2-MIB::dessertSysifTable is subid 7 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.7, length: 12
+- */
+-
+-
+- int
+- dessertSysifTable_init_data(dessertSysifTable_registration *
+- dessertSysifTable_reg);
+-
+-
+- /*
+- * TODO:180:o: Review dessertSysifTable cache timeout.
+- * The number of seconds before the cache times out
+- */
+-#define DESSERTSYSIFTABLE_CACHE_TIMEOUT DESSERT_AGENTX_SYSIFTABLE_CACHE_TIMEOUT
+-
+- void dessertSysifTable_container_init(netsnmp_container **
+- container_ptr_ptr,
+- netsnmp_cache *
+- cache);
+- void dessertSysifTable_container_shutdown(netsnmp_container
+- * container_ptr);
+-
+- int dessertSysifTable_container_load(netsnmp_container *
+- container);
+- void dessertSysifTable_container_free(netsnmp_container *
+- container);
+-
+- int dessertSysifTable_cache_load(netsnmp_container *
+- container);
+- void dessertSysifTable_cache_free(netsnmp_container *
+- container);
+-
+- /*
+- ***************************************************
+- *** START EXAMPLE CODE ***
+- ***---------------------------------------------***/
+- /*
+- *********************************************************************
+- * Since we have no idea how you really access your data, we'll go with
+- * a worst case example: a flat text file.
+- */
+-#define MAX_LINE_SIZE 256
+- /*
+- ***---------------------------------------------***
+- *** END EXAMPLE CODE ***
+- ***************************************************/
+- int dessertSysifTable_row_prep(dessertSysifTable_rowreq_ctx
+- * rowreq_ctx);
+-
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTSYSIFTABLE_DATA_ACCESS_H */
+diff --git a/snmp/dessertSysifTable_data_get.c b/snmp/dessertSysifTable_data_get.c
+deleted file mode 100644
+index a4afe75..0000000
+--- a/snmp/dessertSysifTable_data_get.c
++++ /dev/null
+@@ -1,507 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 12088 $ of $
+- *
+- * $Id:$
+- */
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertSysifTable.h"
+-
+-
+-/** @defgroup data_get data_get: Routines to get data
+- *
+- * TODO:230:M: Implement dessertSysifTable get routines.
+- * TODO:240:M: Implement dessertSysifTable mapping routines (if any).
+- *
+- * These routine are used to get the value for individual objects. The
+- * row context is passed, along with a pointer to the memory where the
+- * value should be copied.
+- *
+- * @{
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertSysifTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+-/*
+- * DESSERT2-MIB::dessertSysifTable is subid 7 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.7, length: 12
+- */
+-
+-/*
+- * ---------------------------------------------------------------------
+- * * TODO:200:r: Implement dessertSysifTable data context functions.
+- */
+-
+-
+-/**
+- * set mib index(es)
+- *
+- * @param tbl_idx mib index structure
+- * @param sysifIndex_val
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error.
+- *
+- * @remark
+- * This convenience function is useful for setting all the MIB index
+- * components with a single function call. It is assume that the C values
+- * have already been mapped from their native/rawformat to the MIB format.
+- */
+-int
+-dessertSysifTable_indexes_set_tbl_idx(dessertSysifTable_mib_index *
+- tbl_idx, long sysifIndex_val)
+-{
+- DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_indexes_set_tbl_idx", "called\n"));
+-
+- /*
+- * sysifIndex(1)///()//L/a/w/e/r/d/h
+- */
+- tbl_idx->sysifIndex = sysifIndex_val;
+-
+-
+- return MFD_SUCCESS;
+-} /* dessertSysifTable_indexes_set_tbl_idx */
+-
+-/**
+- * @internal
+- * set row context indexes
+- *
+- * @param reqreq_ctx the row context that needs updated indexes
+- *
+- * @retval MFD_SUCCESS : success.
+- * @retval MFD_ERROR : other error.
+- *
+- * @remark
+- * This function sets the mib indexs, then updates the oid indexs
+- * from the mib index.
+- */
+-int
+-dessertSysifTable_indexes_set(dessertSysifTable_rowreq_ctx * rowreq_ctx,
+- long sysifIndex_val)
+-{
+- DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_indexes_set",
+- "called\n"));
+-
+- if (MFD_SUCCESS !=
+- dessertSysifTable_indexes_set_tbl_idx(&rowreq_ctx->tbl_idx,
+- sysifIndex_val))
+- return MFD_ERROR;
+-
+- /*
+- * convert mib index to oid index
+- */
+- rowreq_ctx->oid_idx.len = sizeof(rowreq_ctx->oid_tmp) / sizeof(oid);
+- if (0 != dessertSysifTable_index_to_oid(&rowreq_ctx->oid_idx,
+- &rowreq_ctx->tbl_idx)) {
+- return MFD_ERROR;
+- }
+-
+- return MFD_SUCCESS;
+-} /* dessertSysifTable_indexes_set */
+-
+-
+-/*---------------------------------------------------------------------
+- * DESSERT2-MIB::dessertSysifEntry.sysifName
+- * sysifName is subid 2 of dessertSysifEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.7.1.2
+- * Description:
+-name of interface
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 1 hashint 1
+- * settable 0
+- * hint: 255a
+- *
+- * Ranges: 0 - 255;
+- *
+- * Its syntax is DisplayString (based on perltype OCTETSTR)
+- * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+- * This data type requires a length. (Max 255)
+- */
+-/**
+- * Extract the current value of the sysifName data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param sysifName_val_ptr_ptr
+- * Pointer to storage for a char variable
+- * @param sysifName_val_ptr_len_ptr
+- * Pointer to a size_t. On entry, it will contain the size (in bytes)
+- * pointed to by sysifName.
+- * On exit, this value should contain the data size (in bytes).
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+-*
+- * @note If you need more than (*sysifName_val_ptr_len_ptr) bytes of memory,
+- * allocate it using malloc() and update sysifName_val_ptr_ptr.
+- * <b>DO NOT</b> free the previous pointer.
+- * The MFD helper will release the memory you allocate.
+- *
+- * @remark If you call this function yourself, you are responsible
+- * for checking if the pointer changed, and freeing any
+- * previously allocated memory. (Not necessary if you pass
+- * in a pointer to static memory, obviously.)
+- */
+-int
+-sysifName_get(dessertSysifTable_rowreq_ctx * rowreq_ctx,
+- char **sysifName_val_ptr_ptr,
+- size_t *sysifName_val_ptr_len_ptr)
+-{
+- /** we should have a non-NULL pointer and enough storage */
+- netsnmp_assert((NULL != sysifName_val_ptr_ptr)
+- && (NULL != *sysifName_val_ptr_ptr));
+- netsnmp_assert(NULL != sysifName_val_ptr_len_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertSysifTable:sysifName_get", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the sysifName data.
+- * copy (* sysifName_val_ptr_ptr ) data and (* sysifName_val_ptr_len_ptr ) from rowreq_ctx->data
+- */
+- /*
+- * make sure there is enough space for sysifName data
+- */
+- if ((NULL == (*sysifName_val_ptr_ptr)) ||
+- ((*sysifName_val_ptr_len_ptr) <
+- (rowreq_ctx->data.sysifName_len *
+- sizeof(rowreq_ctx->data.sysifName[0])))) {
+- /*
+- * allocate space for sysifName data
+- */
+- (*sysifName_val_ptr_ptr) =
+- malloc(rowreq_ctx->data.sysifName_len *
+- sizeof(rowreq_ctx->data.sysifName[0]));
+- if (NULL == (*sysifName_val_ptr_ptr)) {
+- snmp_log(LOG_ERR, "could not allocate memory\n");
+- return MFD_ERROR;
+- }
+- }
+- (*sysifName_val_ptr_len_ptr) =
+- rowreq_ctx->data.sysifName_len *
+- sizeof(rowreq_ctx->data.sysifName[0]);
+- memcpy((*sysifName_val_ptr_ptr), rowreq_ctx->data.sysifName,
+- rowreq_ctx->data.sysifName_len *
+- sizeof(rowreq_ctx->data.sysifName[0]));
+-
+- return MFD_SUCCESS;
+-} /* sysifName_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT2-MIB::dessertSysifEntry.sysifMacAddress
+- * sysifMacAddress is subid 3 of dessertSysifEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.7.1.3
+- * Description:
+-hardware address of interface
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 1 hashint 1
+- * settable 0
+- * hint: 1x:
+- *
+- * Ranges: 6;
+- *
+- * Its syntax is MacAddress (based on perltype OCTETSTR)
+- * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+- * This data type requires a length. (Max 6)
+- */
+-/**
+- * Extract the current value of the sysifMacAddress data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param sysifMacAddress_val_ptr_ptr
+- * Pointer to storage for a char variable
+- * @param sysifMacAddress_val_ptr_len_ptr
+- * Pointer to a size_t. On entry, it will contain the size (in bytes)
+- * pointed to by sysifMacAddress.
+- * On exit, this value should contain the data size (in bytes).
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+-*
+- * @note If you need more than (*sysifMacAddress_val_ptr_len_ptr) bytes of memory,
+- * allocate it using malloc() and update sysifMacAddress_val_ptr_ptr.
+- * <b>DO NOT</b> free the previous pointer.
+- * The MFD helper will release the memory you allocate.
+- *
+- * @remark If you call this function yourself, you are responsible
+- * for checking if the pointer changed, and freeing any
+- * previously allocated memory. (Not necessary if you pass
+- * in a pointer to static memory, obviously.)
+- */
+-int
+-sysifMacAddress_get(dessertSysifTable_rowreq_ctx * rowreq_ctx,
+- char **sysifMacAddress_val_ptr_ptr,
+- size_t *sysifMacAddress_val_ptr_len_ptr)
+-{
+- /** we should have a non-NULL pointer and enough storage */
+- netsnmp_assert((NULL != sysifMacAddress_val_ptr_ptr)
+- && (NULL != *sysifMacAddress_val_ptr_ptr));
+- netsnmp_assert(NULL != sysifMacAddress_val_ptr_len_ptr);
+-
+-
+- DEBUGMSGTL(("verbose:dessertSysifTable:sysifMacAddress_get",
+- "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- /*
+- * TODO:231:o: |-> Extract the current value of the sysifMacAddress data.
+- * copy (* sysifMacAddress_val_ptr_ptr ) data and (* sysifMacAddress_val_ptr_len_ptr ) from rowreq_ctx->data
+- */
+- /*
+- * make sure there is enough space for sysifMacAddress data
+- */
+- if ((NULL == (*sysifMacAddress_val_ptr_ptr)) ||
+- ((*sysifMacAddress_val_ptr_len_ptr) <
+- (rowreq_ctx->data.sysifMacAddress_len *
+- sizeof(rowreq_ctx->data.sysifMacAddress[0])))) {
+- /*
+- * allocate space for sysifMacAddress data
+- */
+- (*sysifMacAddress_val_ptr_ptr) =
+- malloc(rowreq_ctx->data.sysifMacAddress_len *
+- sizeof(rowreq_ctx->data.sysifMacAddress[0]));
+- if (NULL == (*sysifMacAddress_val_ptr_ptr)) {
+- snmp_log(LOG_ERR, "could not allocate memory\n");
+- return MFD_ERROR;
+- }
+- }
+- (*sysifMacAddress_val_ptr_len_ptr) =
+- rowreq_ctx->data.sysifMacAddress_len *
+- sizeof(rowreq_ctx->data.sysifMacAddress[0]);
+- memcpy((*sysifMacAddress_val_ptr_ptr),
+- rowreq_ctx->data.sysifMacAddress,
+- rowreq_ctx->data.sysifMacAddress_len *
+- sizeof(rowreq_ctx->data.sysifMacAddress[0]));
+-
+- return MFD_SUCCESS;
+-} /* sysifMacAddress_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT2-MIB::dessertSysifEntry.sysifInPkts
+- * sysifInPkts is subid 4 of dessertSysifEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.7.1.4
+- * Description:
+-packet counter in
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 0
+- *
+- *
+- * Its syntax is COUNTER64 (based on perltype COUNTER64)
+- * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+- */
+-/**
+- * Extract the current value of the sysifInPkts data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param sysifInPkts_val_ptr
+- * Pointer to storage for a U64 variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-sysifInPkts_get(dessertSysifTable_rowreq_ctx * rowreq_ctx,
+- U64 * sysifInPkts_val_ptr)
+-{
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != sysifInPkts_val_ptr);
+-
+- /*
+- * TODO:231:o: |-> copy sysifInPkts data.
+- * get (* sysifInPkts_val_ptr ).low and (* sysifInPkts_val_ptr ).high from rowreq_ctx->data
+- */
+- (*sysifInPkts_val_ptr).high = rowreq_ctx->data.sysifInPkts.high;
+- (*sysifInPkts_val_ptr).low = rowreq_ctx->data.sysifInPkts.low;
+-
+-
+- return MFD_SUCCESS;
+-} /* sysifInPkts_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT2-MIB::dessertSysifEntry.sysifOutPkts
+- * sysifOutPkts is subid 5 of dessertSysifEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.7.1.5
+- * Description:
+-packet counter out
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 0
+- *
+- *
+- * Its syntax is COUNTER64 (based on perltype COUNTER64)
+- * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+- */
+-/**
+- * Extract the current value of the sysifOutPkts data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param sysifOutPkts_val_ptr
+- * Pointer to storage for a U64 variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-sysifOutPkts_get(dessertSysifTable_rowreq_ctx * rowreq_ctx,
+- U64 * sysifOutPkts_val_ptr)
+-{
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != sysifOutPkts_val_ptr);
+-
+- /*
+- * TODO:231:o: |-> copy sysifOutPkts data.
+- * get (* sysifOutPkts_val_ptr ).low and (* sysifOutPkts_val_ptr ).high from rowreq_ctx->data
+- */
+- (*sysifOutPkts_val_ptr).high = rowreq_ctx->data.sysifOutPkts.high;
+- (*sysifOutPkts_val_ptr).low = rowreq_ctx->data.sysifOutPkts.low;
+-
+-
+- return MFD_SUCCESS;
+-} /* sysifOutPkts_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT2-MIB::dessertSysifEntry.sysifInOctets
+- * sysifInOctets is subid 6 of dessertSysifEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.7.1.6
+- * Description:
+-octet counter in
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 0
+- *
+- *
+- * Its syntax is COUNTER64 (based on perltype COUNTER64)
+- * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+- */
+-/**
+- * Extract the current value of the sysifInOctets data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param sysifInOctets_val_ptr
+- * Pointer to storage for a U64 variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-sysifInOctets_get(dessertSysifTable_rowreq_ctx * rowreq_ctx,
+- U64 * sysifInOctets_val_ptr)
+-{
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != sysifInOctets_val_ptr);
+-
+- /*
+- * TODO:231:o: |-> copy sysifInOctets data.
+- * get (* sysifInOctets_val_ptr ).low and (* sysifInOctets_val_ptr ).high from rowreq_ctx->data
+- */
+- (*sysifInOctets_val_ptr).high = rowreq_ctx->data.sysifInOctets.high;
+- (*sysifInOctets_val_ptr).low = rowreq_ctx->data.sysifInOctets.low;
+-
+-
+- return MFD_SUCCESS;
+-} /* sysifInOctets_get */
+-
+-/*---------------------------------------------------------------------
+- * DESSERT2-MIB::dessertSysifEntry.sysifOutOctets
+- * sysifOutOctets is subid 7 of dessertSysifEntry.
+- * Its status is Current, and its access level is ReadOnly.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.7.1.7
+- * Description:
+-octet counter out
+- *
+- * Attributes:
+- * accessible 1 isscalar 0 enums 0 hasdefval 0
+- * readable 1 iscolumn 1 ranges 0 hashint 0
+- * settable 0
+- *
+- *
+- * Its syntax is COUNTER64 (based on perltype COUNTER64)
+- * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+- */
+-/**
+- * Extract the current value of the sysifOutOctets data.
+- *
+- * Set a value using the data context for the row.
+- *
+- * @param rowreq_ctx
+- * Pointer to the row request context.
+- * @param sysifOutOctets_val_ptr
+- * Pointer to storage for a U64 variable
+- *
+- * @retval MFD_SUCCESS : success
+- * @retval MFD_SKIP : skip this node (no value for now)
+- * @retval MFD_ERROR : Any other error
+- */
+-int
+-sysifOutOctets_get(dessertSysifTable_rowreq_ctx * rowreq_ctx,
+- U64 * sysifOutOctets_val_ptr)
+-{
+- /** we should have a non-NULL pointer */
+- netsnmp_assert(NULL != sysifOutOctets_val_ptr);
+-
+- /*
+- * TODO:231:o: |-> copy sysifOutOctets data.
+- * get (* sysifOutOctets_val_ptr ).low and (* sysifOutOctets_val_ptr ).high from rowreq_ctx->data
+- */
+- (*sysifOutOctets_val_ptr).high = rowreq_ctx->data.sysifOutOctets.high;
+- (*sysifOutOctets_val_ptr).low = rowreq_ctx->data.sysifOutOctets.low;
+-
+-
+- return MFD_SUCCESS;
+-} /* sysifOutOctets_get */
+-
+-
+-
+-/** @} */
+diff --git a/snmp/dessertSysifTable_data_get.h b/snmp/dessertSysifTable_data_get.h
+deleted file mode 100644
+index 19e8426..0000000
+--- a/snmp/dessertSysifTable_data_get.h
++++ /dev/null
+@@ -1,105 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 12088 $ of $
+- *
+- * $Id:$
+- *
+- * @file dessertSysifTable_data_get.h
+- *
+- * @addtogroup get
+- *
+- * Prototypes for get functions
+- *
+- * @{
+- */
+-#ifndef DESSERTSYSIFTABLE_DATA_GET_H
+-#define DESSERTSYSIFTABLE_DATA_GET_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+- /*
+- *********************************************************************
+- * GET function declarations
+- */
+-
+- /*
+- *********************************************************************
+- * GET Table declarations
+- */
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertSysifTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+- /*
+- * DESSERT2-MIB::dessertSysifTable is subid 7 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.7, length: 12
+- */
+- /*
+- * indexes
+- */
+- int sysifIndex_map(uint* *mib_sysifIndex_val_ptr,
+- uint raw_sysifIndex_val);
+-
+- int sysifName_map(char **mib_sysifName_val_ptr_ptr,
+- size_t *mib_sysifName_val_ptr_len_ptr,
+- char *raw_sysifName_val_ptr,
+- size_t raw_sysifName_val_ptr_len,
+- int allow_realloc);
+- int sysifName_get(dessertSysifTable_rowreq_ctx *
+- rowreq_ctx, char **sysifName_val_ptr_ptr,
+- size_t *sysifName_val_ptr_len_ptr);
+- int sysifMacAddress_map(char
+- **mib_sysifMacAddress_val_ptr_ptr,
+- size_t
+- *mib_sysifMacAddress_val_ptr_len_ptr,
+- char *raw_sysifMacAddress_val_ptr,
+- size_t
+- raw_sysifMacAddress_val_ptr_len,
+- int allow_realloc);
+- int sysifMacAddress_get(dessertSysifTable_rowreq_ctx *
+- rowreq_ctx,
+- char **sysifMacAddress_val_ptr_ptr,
+- size_t
+- *sysifMacAddress_val_ptr_len_ptr);
+- int sysifInPkts_map(U64 * mib_sysifInPkts_val_ptr,
+- U64 raw_sysifInPkts_val);
+- int sysifInPkts_get(dessertSysifTable_rowreq_ctx *
+- rowreq_ctx, U64 * sysifInPkts_val_ptr);
+- int sysifOutPkts_map(U64 * mib_sysifOutPkts_val_ptr,
+- U64 raw_sysifOutPkts_val);
+- int sysifOutPkts_get(dessertSysifTable_rowreq_ctx *
+- rowreq_ctx,
+- U64 * sysifOutPkts_val_ptr);
+- int sysifInOctets_map(U64 * mib_sysifInOctets_val_ptr,
+- U64 raw_sysifInOctets_val);
+- int sysifInOctets_get(dessertSysifTable_rowreq_ctx *
+- rowreq_ctx,
+- U64 * sysifInOctets_val_ptr);
+- int sysifOutOctets_map(U64 * mib_sysifOutOctets_val_ptr,
+- U64 raw_sysifOutOctets_val);
+- int sysifOutOctets_get(dessertSysifTable_rowreq_ctx *
+- rowreq_ctx,
+- U64 * sysifOutOctets_val_ptr);
+-
+-
+- int
+- dessertSysifTable_indexes_set_tbl_idx(dessertSysifTable_mib_index *
+- tbl_idx, long sysifIndex_val);
+- int
+- dessertSysifTable_indexes_set(dessertSysifTable_rowreq_ctx *
+- rowreq_ctx, long sysifIndex_val);
+-
+-
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTSYSIFTABLE_DATA_GET_H */
+-/** @} */
+diff --git a/snmp/dessertSysifTable_data_set.c b/snmp/dessertSysifTable_data_set.c
+deleted file mode 100644
+index 8f3c98e..0000000
+--- a/snmp/dessertSysifTable_data_set.c
++++ /dev/null
+@@ -1,28 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 12077 $ of $
+- *
+- * $Id:$
+- *
+- */
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertSysifTable.h"
+-
+-
+-/** @defgroup data_set data_set: Routines to set data
+- *
+- * These routines are used to set the value for individual objects. The
+- * row context is passed, along with the new value.
+- *
+- * @{
+- */
+-/** @} */
+diff --git a/snmp/dessertSysifTable_data_set.h b/snmp/dessertSysifTable_data_set.h
+deleted file mode 100644
+index ab7d732..0000000
+--- a/snmp/dessertSysifTable_data_set.h
++++ /dev/null
+@@ -1,28 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 12077 $ of $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTSYSIFTABLE_DATA_SET_H
+-#define DESSERTSYSIFTABLE_DATA_SET_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+- /*
+- *********************************************************************
+- * SET function declarations
+- */
+-
+- /*
+- *********************************************************************
+- * SET Table declarations
+- */
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTSYSIFTABLE_DATA_SET_H */
+diff --git a/snmp/dessertSysifTable_enums.h b/snmp/dessertSysifTable_enums.h
+deleted file mode 100644
+index f18e25d..0000000
+--- a/snmp/dessertSysifTable_enums.h
++++ /dev/null
+@@ -1,39 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * : generic-table-enums.m2c 12526 2005-07-15 22:41:16Z rstory $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTSYSIFTABLE_ENUMS_H
+-#define DESSERTSYSIFTABLE_ENUMS_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+- /*
+- * NOTES on enums
+- * ==============
+- *
+- * Value Mapping
+- * -------------
+- * If the values for your data type don't exactly match the
+- * possible values defined by the mib, you should map them
+- * below. For example, a boolean flag (1/0) is usually represented
+- * as a TruthValue in a MIB, which maps to the values (1/2).
+- *
+- */
+-/*************************************************************************
+- *************************************************************************
+- *
+- * enum definitions for table dessertSysifTable
+- *
+- *************************************************************************
+- *************************************************************************/
+-
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTSYSIFTABLE_ENUMS_H */
+diff --git a/snmp/dessertSysifTable_interface.c b/snmp/dessertSysifTable_interface.c
+deleted file mode 100644
+index 0355204..0000000
+--- a/snmp/dessertSysifTable_interface.c
++++ /dev/null
+@@ -1,936 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 15899 $ of $
+- *
+- * $Id:$
+- */
+-/*
+- * *********************************************************************
+- * *********************************************************************
+- * *********************************************************************
+- * *** ***
+- * *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
+- * *** ***
+- * *** ***
+- * *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
+- * *** ***
+- * *** ***
+- * *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
+- * *** ***
+- * *** ***
+- * *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
+- * *** ***
+- * *** ***
+- * *********************************************************************
+- * *********************************************************************
+- * *********************************************************************
+- */
+-
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertSysifTable.h"
+-
+-
+-#include <net-snmp/agent/table_container.h>
+-#include <net-snmp/library/container.h>
+-
+-#include "dessertSysifTable_interface.h"
+-
+-#include <ctype.h>
+-
+-/**********************************************************************
+- **********************************************************************
+- ***
+- *** Table dessertSysifTable
+- ***
+- **********************************************************************
+- **********************************************************************/
+-/*
+- * DESSERT2-MIB::dessertSysifTable is subid 7 of dessertObjects.
+- * Its status is Current.
+- * OID: .1.3.6.1.4.1.18898.0.19.42.1.7, length: 12
+- */
+-typedef struct dessertSysifTable_interface_ctx_s {
+-
+- netsnmp_container *container;
+- netsnmp_cache *cache;
+-
+- dessertSysifTable_registration *user_ctx;
+-
+- netsnmp_table_registration_info tbl_info;
+-
+- netsnmp_baby_steps_access_methods access_multiplexer;
+-
+-} dessertSysifTable_interface_ctx;
+-
+-static dessertSysifTable_interface_ctx dessertSysifTable_if_ctx;
+-
+-static void
+-_dessertSysifTable_container_init(dessertSysifTable_interface_ctx *
+- if_ctx);
+-static void
+-_dessertSysifTable_container_shutdown(dessertSysifTable_interface_ctx *
+- if_ctx);
+-
+-
+-netsnmp_container *
+-dessertSysifTable_container_get(void)
+-{
+- return dessertSysifTable_if_ctx.container;
+-}
+-
+-dessertSysifTable_registration *
+-dessertSysifTable_registration_get(void)
+-{
+- return dessertSysifTable_if_ctx.user_ctx;
+-}
+-
+-dessertSysifTable_registration *
+-dessertSysifTable_registration_set(dessertSysifTable_registration * newreg)
+-{
+- dessertSysifTable_registration *old =
+- dessertSysifTable_if_ctx.user_ctx;
+- dessertSysifTable_if_ctx.user_ctx = newreg;
+- return old;
+-}
+-
+-int
+-dessertSysifTable_container_size(void)
+-{
+- return CONTAINER_SIZE(dessertSysifTable_if_ctx.container);
+-}
+-
+-/*
+- * mfd multiplexer modes
+- */
+-static Netsnmp_Node_Handler _mfd_dessertSysifTable_pre_request;
+-static Netsnmp_Node_Handler _mfd_dessertSysifTable_post_request;
+-static Netsnmp_Node_Handler _mfd_dessertSysifTable_object_lookup;
+-static Netsnmp_Node_Handler _mfd_dessertSysifTable_get_values;
+-/**
+- * @internal
+- * Initialize the table dessertSysifTable
+- * (Define its contents and how it's structured)
+- */
+-void
+-_dessertSysifTable_initialize_interface(dessertSysifTable_registration *
+- reg_ptr, u_long flags)
+-{
+- netsnmp_baby_steps_access_methods *access_multiplexer =
+- &dessertSysifTable_if_ctx.access_multiplexer;
+- netsnmp_table_registration_info *tbl_info =
+- &dessertSysifTable_if_ctx.tbl_info;
+- netsnmp_handler_registration *reginfo;
+- netsnmp_mib_handler *handler;
+- int mfd_modes = 0;
+-
+- DEBUGMSGTL(("internal:dessertSysifTable:_dessertSysifTable_initialize_interface", "called\n"));
+-
+-
+- /*************************************************
+- *
+- * save interface context for dessertSysifTable
+- */
+- /*
+- * Setting up the table's definition
+- */
+- netsnmp_table_helper_add_indexes(tbl_info,
+- /** index: sysifIndex */
+- 0);
+-
+- /*
+- * Define the minimum and maximum accessible columns. This
+- * optimizes retrival.
+- */
+- tbl_info->min_column = DESSERTSYSIFTABLE_MIN_COL;
+- tbl_info->max_column = DESSERTSYSIFTABLE_MAX_COL;
+-
+- /*
+- * save users context
+- */
+- dessertSysifTable_if_ctx.user_ctx = reg_ptr;
+-
+- /*
+- * call data access initialization code
+- */
+- dessertSysifTable_init_data(reg_ptr);
+-
+- /*
+- * set up the container
+- */
+- _dessertSysifTable_container_init(&dessertSysifTable_if_ctx);
+- if (NULL == dessertSysifTable_if_ctx.container) {
+- snmp_log(LOG_ERR,
+- "could not initialize container for dessertSysifTable\n");
+- return;
+- }
+-
+- /*
+- * access_multiplexer: REQUIRED wrapper for get request handling
+- */
+- access_multiplexer->object_lookup =
+- _mfd_dessertSysifTable_object_lookup;
+- access_multiplexer->get_values = _mfd_dessertSysifTable_get_values;
+-
+- /*
+- * no wrappers yet
+- */
+- access_multiplexer->pre_request = _mfd_dessertSysifTable_pre_request;
+- access_multiplexer->post_request = _mfd_dessertSysifTable_post_request;
+-
+-
+- /*************************************************
+- *
+- * Create a registration, save our reg data, register table.
+- */
+- DEBUGMSGTL(("dessertSysifTable:init_dessertSysifTable",
+- "Registering dessertSysifTable as a mibs-for-dummies table.\n"));
+- handler =
+- netsnmp_baby_steps_access_multiplexer_get(access_multiplexer);
+- reginfo =
+- netsnmp_handler_registration_create("dessertSysifTable", handler,
+- dessertSysifTable_oid,
+- dessertSysifTable_oid_size,
+- HANDLER_CAN_BABY_STEP |
+- HANDLER_CAN_RONLY);
+- if (NULL == reginfo) {
+- snmp_log(LOG_ERR, "error registering table dessertSysifTable\n");
+- return;
+- }
+- reginfo->my_reg_void = &dessertSysifTable_if_ctx;
+-
+- /*************************************************
+- *
+- * set up baby steps handler, create it and inject it
+- */
+- if (access_multiplexer->object_lookup)
+- mfd_modes |= BABY_STEP_OBJECT_LOOKUP;
+- if (access_multiplexer->set_values)
+- mfd_modes |= BABY_STEP_SET_VALUES;
+- if (access_multiplexer->irreversible_commit)
+- mfd_modes |= BABY_STEP_IRREVERSIBLE_COMMIT;
+- if (access_multiplexer->object_syntax_checks)
+- mfd_modes |= BABY_STEP_CHECK_OBJECT;
+-
+- if (access_multiplexer->pre_request)
+- mfd_modes |= BABY_STEP_PRE_REQUEST;
+- if (access_multiplexer->post_request)
+- mfd_modes |= BABY_STEP_POST_REQUEST;
+-
+- if (access_multiplexer->undo_setup)
+- mfd_modes |= BABY_STEP_UNDO_SETUP;
+- if (access_multiplexer->undo_cleanup)
+- mfd_modes |= BABY_STEP_UNDO_CLEANUP;
+- if (access_multiplexer->undo_sets)
+- mfd_modes |= BABY_STEP_UNDO_SETS;
+-
+- if (access_multiplexer->row_creation)
+- mfd_modes |= BABY_STEP_ROW_CREATE;
+- if (access_multiplexer->consistency_checks)
+- mfd_modes |= BABY_STEP_CHECK_CONSISTENCY;
+- if (access_multiplexer->commit)
+- mfd_modes |= BABY_STEP_COMMIT;
+- if (access_multiplexer->undo_commit)
+- mfd_modes |= BABY_STEP_UNDO_COMMIT;
+-
+- handler = netsnmp_baby_steps_handler_get(mfd_modes);
+- netsnmp_inject_handler(reginfo, handler);
+-
+- /*************************************************
+- *
+- * inject row_merge helper with prefix rootoid_len + 2 (entry.col)
+- */
+- handler = netsnmp_get_row_merge_handler(reginfo->rootoid_len + 2);
+- netsnmp_inject_handler(reginfo, handler);
+-
+- /*************************************************
+- *
+- * inject container_table helper
+- */
+- handler =
+- netsnmp_container_table_handler_get(tbl_info,
+- dessertSysifTable_if_ctx.
+- container,
+- TABLE_CONTAINER_KEY_NETSNMP_INDEX);
+- netsnmp_inject_handler(reginfo, handler);
+-
+- /*************************************************
+- *
+- * inject cache helper
+- */
+- if (NULL != dessertSysifTable_if_ctx.cache) {
+- handler =
+- netsnmp_cache_handler_get(dessertSysifTable_if_ctx.cache);
+- netsnmp_inject_handler(reginfo, handler);
+- }
+-
+- /*
+- * register table
+- */
+- netsnmp_register_table(reginfo, tbl_info);
+-
+-} /* _dessertSysifTable_initialize_interface */
+-
+-/**
+- * @internal
+- * Shutdown the table dessertSysifTable
+- */
+-void
+-_dessertSysifTable_shutdown_interface(dessertSysifTable_registration *
+- reg_ptr)
+-{
+- /*
+- * shutdown the container
+- */
+- _dessertSysifTable_container_shutdown(&dessertSysifTable_if_ctx);
+-}
+-
+-void
+-dessertSysifTable_valid_columns_set(netsnmp_column_info *vc)
+-{
+- dessertSysifTable_if_ctx.tbl_info.valid_columns = vc;
+-} /* dessertSysifTable_valid_columns_set */
+-
+-/**
+- * @internal
+- * convert the index component stored in the context to an oid
+- */
+-int
+-dessertSysifTable_index_to_oid(netsnmp_index * oid_idx,
+- dessertSysifTable_mib_index * mib_idx)
+-{
+- int err = SNMP_ERR_NOERROR;
+-
+- /*
+- * temp storage for parsing indexes
+- */
+- /*
+- * sysifIndex(1)///()//L/a/w/e/r/d/h
+- */
+- netsnmp_variable_list var_sysifIndex;
+-
+- /*
+- * set up varbinds
+- */
+- memset(&var_sysifIndex, 0x00, sizeof(var_sysifIndex));
+- var_sysifIndex.type = ASN_INTEGER;
+-
+- /*
+- * chain temp index varbinds together
+- */
+- var_sysifIndex.next_variable = NULL;
+-
+-
+- DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_index_to_oid",
+- "called\n"));
+-
+- /*
+- * sysifIndex(1)///()//L/a/w/e/r/d/h
+- */
+- snmp_set_var_value(&var_sysifIndex, (u_char *) & mib_idx->sysifIndex,
+- sizeof(mib_idx->sysifIndex));
+-
+-
+- err = build_oid_noalloc(oid_idx->oids, oid_idx->len, &oid_idx->len,
+- NULL, 0, &var_sysifIndex);
+- if (err)
+- snmp_log(LOG_ERR, "error %d converting index to oid\n", err);
+-
+- /*
+- * parsing may have allocated memory. free it.
+- */
+- snmp_reset_var_buffers(&var_sysifIndex);
+-
+- return err;
+-} /* dessertSysifTable_index_to_oid */
+-
+-/**
+- * extract dessertSysifTable indexes from a netsnmp_index
+- *
+- * @retval SNMP_ERR_NOERROR : no error
+- * @retval SNMP_ERR_GENERR : error
+- */
+-int
+-dessertSysifTable_index_from_oid(netsnmp_index * oid_idx,
+- dessertSysifTable_mib_index * mib_idx)
+-{
+- int err = SNMP_ERR_NOERROR;
+-
+- /*
+- * temp storage for parsing indexes
+- */
+- /*
+- * sysifIndex(1)///()//L/a/w/e/r/d/h
+- */
+- netsnmp_variable_list var_sysifIndex;
+-
+- /*
+- * set up varbinds
+- */
+- memset(&var_sysifIndex, 0x00, sizeof(var_sysifIndex));
+- var_sysifIndex.type = ASN_INTEGER;
+-
+- /*
+- * chain temp index varbinds together
+- */
+- var_sysifIndex.next_variable = NULL;
+-
+-
+- DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_index_from_oid", "called\n"));
+-
+- /*
+- * parse the oid into the individual index components
+- */
+- err = parse_oid_indexes(oid_idx->oids, oid_idx->len, &var_sysifIndex);
+- if (err == SNMP_ERR_NOERROR) {
+- /*
+- * copy out values
+- */
+- mib_idx->sysifIndex = *((long *)var_sysifIndex.val.string);
+-
+-
+- }
+-
+- /*
+- * parsing may have allocated memory. free it.
+- */
+- snmp_reset_var_buffers(&var_sysifIndex);
+-
+- return err;
+-} /* dessertSysifTable_index_from_oid */
+-
+-
+-/*
+- *********************************************************************
+- * @internal
+- * allocate resources for a dessertSysifTable_rowreq_ctx
+- */
+-dessertSysifTable_rowreq_ctx *
+-dessertSysifTable_allocate_rowreq_ctx(void *user_init_ctx)
+-{
+- dessertSysifTable_rowreq_ctx *rowreq_ctx =
+- SNMP_MALLOC_TYPEDEF(dessertSysifTable_rowreq_ctx);
+-
+- DEBUGMSGTL(("internal:dessertSysifTable:dessertSysifTable_allocate_rowreq_ctx", "called\n"));
+-
+- if (NULL == rowreq_ctx) {
+- snmp_log(LOG_ERR, "Couldn't allocate memory for a "
+- "dessertSysifTable_rowreq_ctx.\n");
+- return NULL;
+- }
+-
+- rowreq_ctx->oid_idx.oids = rowreq_ctx->oid_tmp;
+-
+- rowreq_ctx->dessertSysifTable_data_list = NULL;
+-
+- /*
+- * if we allocated data, call init routine
+- */
+- if (!(rowreq_ctx->rowreq_flags & MFD_ROW_DATA_FROM_USER)) {
+- if (SNMPERR_SUCCESS !=
+- dessertSysifTable_rowreq_ctx_init(rowreq_ctx, user_init_ctx)) {
+- dessertSysifTable_release_rowreq_ctx(rowreq_ctx);
+- rowreq_ctx = NULL;
+- }
+- }
+-
+- return rowreq_ctx;
+-} /* dessertSysifTable_allocate_rowreq_ctx */
+-
+-/*
+- * @internal
+- * release resources for a dessertSysifTable_rowreq_ctx
+- */
+-void
+-dessertSysifTable_release_rowreq_ctx(dessertSysifTable_rowreq_ctx *
+- rowreq_ctx)
+-{
+- DEBUGMSGTL(("internal:dessertSysifTable:dessertSysifTable_release_rowreq_ctx", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- dessertSysifTable_rowreq_ctx_cleanup(rowreq_ctx);
+-
+- /*
+- * free index oid pointer
+- */
+- if (rowreq_ctx->oid_idx.oids != rowreq_ctx->oid_tmp)
+- free(rowreq_ctx->oid_idx.oids);
+-
+- SNMP_FREE(rowreq_ctx);
+-} /* dessertSysifTable_release_rowreq_ctx */
+-
+-/**
+- * @internal
+- * wrapper
+- */
+-static int
+-_mfd_dessertSysifTable_pre_request(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration *reginfo,
+- netsnmp_agent_request_info *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- int rc;
+-
+- DEBUGMSGTL(("internal:dessertSysifTable:_mfd_dessertSysifTable_pre_request", "called\n"));
+-
+- if (1 != netsnmp_row_merge_status_first(reginfo, agtreq_info)) {
+- DEBUGMSGTL(("internal:dessertSysifTable",
+- "skipping additional pre_request\n"));
+- return SNMP_ERR_NOERROR;
+- }
+-
+- rc = dessertSysifTable_pre_request(dessertSysifTable_if_ctx.user_ctx);
+- if (MFD_SUCCESS != rc) {
+- /*
+- * nothing we can do about it but log it
+- */
+- DEBUGMSGTL(("dessertSysifTable", "error %d from "
+- "dessertSysifTable_pre_request\n", rc));
+- netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
+- }
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertSysifTable_pre_request */
+-
+-/**
+- * @internal
+- * wrapper
+- */
+-static int
+-_mfd_dessertSysifTable_post_request(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- dessertSysifTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+- int rc, packet_rc;
+-
+- DEBUGMSGTL(("internal:dessertSysifTable:_mfd_dessertSysifTable_post_request", "called\n"));
+-
+- /*
+- * release row context, if deleted
+- */
+- if (rowreq_ctx && (rowreq_ctx->rowreq_flags & MFD_ROW_DELETED))
+- dessertSysifTable_release_rowreq_ctx(rowreq_ctx);
+-
+- /*
+- * wait for last call before calling user
+- */
+- if (1 != netsnmp_row_merge_status_last(reginfo, agtreq_info)) {
+- DEBUGMSGTL(("internal:dessertSysifTable",
+- "waiting for last post_request\n"));
+- return SNMP_ERR_NOERROR;
+- }
+-
+- packet_rc = netsnmp_check_all_requests_error(agtreq_info->asp, 0);
+- rc = dessertSysifTable_post_request(dessertSysifTable_if_ctx.user_ctx,
+- packet_rc);
+- if (MFD_SUCCESS != rc) {
+- /*
+- * nothing we can do about it but log it
+- */
+- DEBUGMSGTL(("dessertSysifTable", "error %d from "
+- "dessertSysifTable_post_request\n", rc));
+- }
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertSysifTable_post_request */
+-
+-/**
+- * @internal
+- * wrapper
+- */
+-static int
+-_mfd_dessertSysifTable_object_lookup(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration *reginfo,
+- netsnmp_agent_request_info
+- *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- int rc = SNMP_ERR_NOERROR;
+- dessertSysifTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+-
+- DEBUGMSGTL(("internal:dessertSysifTable:_mfd_dessertSysifTable_object_lookup", "called\n"));
+-
+- /*
+- * get our context from mfd
+- * dessertSysifTable_interface_ctx *if_ctx =
+- * (dessertSysifTable_interface_ctx *)reginfo->my_reg_void;
+- */
+-
+- if (NULL == rowreq_ctx) {
+- rc = SNMP_ERR_NOCREATION;
+- }
+-
+- if (MFD_SUCCESS != rc)
+- netsnmp_request_set_error_all(requests, rc);
+- else
+- dessertSysifTable_row_prep(rowreq_ctx);
+-
+- return SNMP_VALIDATE_ERR(rc);
+-} /* _mfd_dessertSysifTable_object_lookup */
+-
+-/***********************************************************************
+- *
+- * GET processing
+- *
+- ***********************************************************************/
+-/*
+- * @internal
+- * Retrieve the value for a particular column
+- */
+-NETSNMP_STATIC_INLINE int
+-_dessertSysifTable_get_column(dessertSysifTable_rowreq_ctx * rowreq_ctx,
+- netsnmp_variable_list * var, int column)
+-{
+- int rc = SNMPERR_SUCCESS;
+-
+- DEBUGMSGTL(("internal:dessertSysifTable:_mfd_dessertSysifTable_get_column", "called for %d\n", column));
+-
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- switch (column) {
+-
+- /*
+- * sysifName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- case COLUMN_SYSIFNAME:
+- var->type = ASN_OCTET_STR;
+- rc = sysifName_get(rowreq_ctx, (char **) &var->val.string,
+- &var->val_len);
+- break;
+-
+- /*
+- * sysifMacAddress(3)/MacAddress/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+- */
+- case COLUMN_SYSIFMACADDRESS:
+- var->type = ASN_OCTET_STR;
+- rc = sysifMacAddress_get(rowreq_ctx, (char **) &var->val.string,
+- &var->val_len);
+- break;
+-
+- /*
+- * sysifInPkts(4)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- case COLUMN_SYSIFINPKTS:
+- var->val_len = sizeof(U64);
+- var->type = ASN_COUNTER64;
+- rc = sysifInPkts_get(rowreq_ctx, (U64 *) var->val.string);
+- break;
+-
+- /*
+- * sysifOutPkts(5)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- case COLUMN_SYSIFOUTPKTS:
+- var->val_len = sizeof(U64);
+- var->type = ASN_COUNTER64;
+- rc = sysifOutPkts_get(rowreq_ctx, (U64 *) var->val.string);
+- break;
+-
+- /*
+- * sysifInOctets(6)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- case COLUMN_SYSIFINOCTETS:
+- var->val_len = sizeof(U64);
+- var->type = ASN_COUNTER64;
+- rc = sysifInOctets_get(rowreq_ctx, (U64 *) var->val.string);
+- break;
+-
+- /*
+- * sysifOutOctets(7)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
+- */
+- case COLUMN_SYSIFOUTOCTETS:
+- var->val_len = sizeof(U64);
+- var->type = ASN_COUNTER64;
+- rc = sysifOutOctets_get(rowreq_ctx, (U64 *) var->val.string);
+- break;
+-
+- default:
+- if (DESSERTSYSIFTABLE_MIN_COL <= column
+- && column <= DESSERTSYSIFTABLE_MAX_COL) {
+- DEBUGMSGTL(("internal:dessertSysifTable:_mfd_dessertSysifTable_get_column", "assume column %d is reserved\n", column));
+- rc = MFD_SKIP;
+- } else {
+- snmp_log(LOG_ERR,
+- "unknown column %d in _dessertSysifTable_get_column\n",
+- column);
+- }
+- break;
+- }
+-
+- return rc;
+-} /* _dessertSysifTable_get_column */
+-
+-int
+-_mfd_dessertSysifTable_get_values(netsnmp_mib_handler *handler,
+- netsnmp_handler_registration *reginfo,
+- netsnmp_agent_request_info *agtreq_info,
+- netsnmp_request_info *requests)
+-{
+- dessertSysifTable_rowreq_ctx *rowreq_ctx =
+- netsnmp_container_table_row_extract(requests);
+- netsnmp_table_request_info *tri;
+- u_char *old_string;
+- void (*dataFreeHook) (void *);
+- int rc;
+-
+- DEBUGMSGTL(("internal:dessertSysifTable:_mfd_dessertSysifTable_get_values", "called\n"));
+-
+- netsnmp_assert(NULL != rowreq_ctx);
+-
+- for (; requests; requests = requests->next) {
+- /*
+- * save old pointer, so we can free it if replaced
+- */
+- old_string = requests->requestvb->val.string;
+- dataFreeHook = requests->requestvb->dataFreeHook;
+- if (NULL == requests->requestvb->val.string) {
+- requests->requestvb->val.string = requests->requestvb->buf;
+- requests->requestvb->val_len =
+- sizeof(requests->requestvb->buf);
+- } else if (requests->requestvb->buf ==
+- requests->requestvb->val.string) {
+- if (requests->requestvb->val_len !=
+- sizeof(requests->requestvb->buf))
+- requests->requestvb->val_len =
+- sizeof(requests->requestvb->buf);
+- }
+-
+- /*
+- * get column data
+- */
+- tri = netsnmp_extract_table_info(requests);
+- if (NULL == tri)
+- continue;
+-
+- rc = _dessertSysifTable_get_column(rowreq_ctx, requests->requestvb,
+- tri->colnum);
+- if (rc) {
+- if (MFD_SKIP == rc) {
+- requests->requestvb->type = SNMP_NOSUCHINSTANCE;
+- rc = SNMP_ERR_NOERROR;
+- }
+- } else if (NULL == requests->requestvb->val.string) {
+- snmp_log(LOG_ERR, "NULL varbind data pointer!\n");
+- rc = SNMP_ERR_GENERR;
+- }
+- if (rc)
+- netsnmp_request_set_error(requests, SNMP_VALIDATE_ERR(rc));
+-
+- /*
+- * if the buffer wasn't used previously for the old data (i.e. it
+- * was allcoated memory) and the get routine replaced the pointer,
+- * we need to free the previous pointer.
+- */
+- if (old_string && (old_string != requests->requestvb->buf) &&
+- (requests->requestvb->val.string != old_string)) {
+- if (dataFreeHook)
+- (*dataFreeHook) (old_string);
+- else
+- free(old_string);
+- }
+- } /* for results */
+-
+- return SNMP_ERR_NOERROR;
+-} /* _mfd_dessertSysifTable_get_values */
+-
+-
+-/***********************************************************************
+- *
+- * SET processing
+- *
+- ***********************************************************************/
+-
+-/*
+- * SET PROCESSING NOT APPLICABLE (per MIB or user setting)
+- */
+-/***********************************************************************
+- *
+- * DATA ACCESS
+- *
+- ***********************************************************************/
+-static void _container_free(netsnmp_container * container);
+-
+-/**
+- * @internal
+- */
+-static int
+-_cache_load(netsnmp_cache * cache, void *vmagic)
+-{
+- DEBUGMSGTL(("internal:dessertSysifTable:_cache_load", "called\n"));
+-
+- if ((NULL == cache) || (NULL == cache->magic)) {
+- snmp_log(LOG_ERR,
+- "invalid cache for dessertSysifTable_cache_load\n");
+- return -1;
+- }
+-
+- /** should only be called for an invalid or expired cache */
+- netsnmp_assert((0 == cache->valid) || (1 == cache->expired));
+-
+- /*
+- * call user code
+- */
+- return dessertSysifTable_container_load((netsnmp_container *) cache->
+- magic);
+-} /* _cache_load */
+-
+-/**
+- * @internal
+- */
+-static void
+-_cache_free(netsnmp_cache * cache, void *magic)
+-{
+- netsnmp_container *container;
+-
+- DEBUGMSGTL(("internal:dessertSysifTable:_cache_free", "called\n"));
+-
+- if ((NULL == cache) || (NULL == cache->magic)) {
+- snmp_log(LOG_ERR,
+- "invalid cache in dessertSysifTable_cache_free\n");
+- return;
+- }
+-
+- container = (netsnmp_container *) cache->magic;
+-
+- _container_free(container);
+-} /* _cache_free */
+-
+-/**
+- * @internal
+- */
+-static void
+-_container_item_free(dessertSysifTable_rowreq_ctx * rowreq_ctx,
+- void *context)
+-{
+- DEBUGMSGTL(("internal:dessertSysifTable:_container_item_free",
+- "called\n"));
+-
+- if (NULL == rowreq_ctx)
+- return;
+-
+- dessertSysifTable_release_rowreq_ctx(rowreq_ctx);
+-} /* _container_item_free */
+-
+-/**
+- * @internal
+- */
+-static void
+-_container_free(netsnmp_container * container)
+-{
+- DEBUGMSGTL(("internal:dessertSysifTable:_container_free", "called\n"));
+-
+- if (NULL == container) {
+- snmp_log(LOG_ERR,
+- "invalid container in dessertSysifTable_container_free\n");
+- return;
+- }
+-
+- /*
+- * call user code
+- */
+- dessertSysifTable_container_free(container);
+-
+- /*
+- * free all items. inefficient, but easy.
+- */
+- CONTAINER_CLEAR(container,
+- (netsnmp_container_obj_func *) _container_item_free,
+- NULL);
+-} /* _container_free */
+-
+-/**
+- * @internal
+- * initialize the container with functions or wrappers
+- */
+-void
+-_dessertSysifTable_container_init(dessertSysifTable_interface_ctx * if_ctx)
+-{
+- DEBUGMSGTL(("internal:dessertSysifTable:_dessertSysifTable_container_init", "called\n"));
+-
+- /*
+- * cache init
+- */
+- if_ctx->cache = netsnmp_cache_create(30, /* timeout in seconds */
+- _cache_load, _cache_free,
+- dessertSysifTable_oid,
+- dessertSysifTable_oid_size);
+-
+- if (NULL == if_ctx->cache) {
+- snmp_log(LOG_ERR, "error creating cache for dessertSysifTable\n");
+- return;
+- }
+-
+- if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;
+-
+- dessertSysifTable_container_init(&if_ctx->container, if_ctx->cache);
+- if (NULL == if_ctx->container)
+- if_ctx->container =
+- netsnmp_container_find("dessertSysifTable:table_container");
+- if (NULL == if_ctx->container) {
+- snmp_log(LOG_ERR, "error creating container in "
+- "dessertSysifTable_container_init\n");
+- return;
+- }
+-
+- if (NULL != if_ctx->cache)
+- if_ctx->cache->magic = (void *) if_ctx->container;
+-} /* _dessertSysifTable_container_init */
+-
+-/**
+- * @internal
+- * shutdown the container with functions or wrappers
+- */
+-void
+-_dessertSysifTable_container_shutdown(dessertSysifTable_interface_ctx *
+- if_ctx)
+-{
+- DEBUGMSGTL(("internal:dessertSysifTable:_dessertSysifTable_container_shutdown", "called\n"));
+-
+- dessertSysifTable_container_shutdown(if_ctx->container);
+-
+- _container_free(if_ctx->container);
+-
+-} /* _dessertSysifTable_container_shutdown */
+-
+-
+-dessertSysifTable_rowreq_ctx *
+-dessertSysifTable_row_find_by_mib_index(dessertSysifTable_mib_index *
+- mib_idx)
+-{
+- dessertSysifTable_rowreq_ctx *rowreq_ctx;
+- oid oid_tmp[MAX_OID_LEN];
+- netsnmp_index oid_idx;
+- int rc;
+-
+- /*
+- * set up storage for OID
+- */
+- oid_idx.oids = oid_tmp;
+- oid_idx.len = sizeof(oid_tmp) / sizeof(oid);
+-
+- /*
+- * convert
+- */
+- rc = dessertSysifTable_index_to_oid(&oid_idx, mib_idx);
+- if (MFD_SUCCESS != rc)
+- return NULL;
+-
+- rowreq_ctx =
+- CONTAINER_FIND(dessertSysifTable_if_ctx.container, &oid_idx);
+-
+- return rowreq_ctx;
+-}
+diff --git a/snmp/dessertSysifTable_interface.h b/snmp/dessertSysifTable_interface.h
+deleted file mode 100644
+index c47cbee..0000000
+--- a/snmp/dessertSysifTable_interface.h
++++ /dev/null
+@@ -1,97 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 15899 $ of $
+- *
+- * $Id:$
+- */
+-/** @ingroup interface: Routines to interface to Net-SNMP
+- *
+- * \warning This code should not be modified, called directly,
+- * or used to interpret functionality. It is subject to
+- * change at any time.
+- *
+- * @{
+- */
+-/*
+- * *********************************************************************
+- * *********************************************************************
+- * *********************************************************************
+- * *** ***
+- * *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
+- * *** ***
+- * *** ***
+- * *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
+- * *** ***
+- * *** ***
+- * *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
+- * *** ***
+- * *** ***
+- * *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
+- * *** ***
+- * *** ***
+- * *********************************************************************
+- * *********************************************************************
+- * *********************************************************************
+- */
+-#ifndef DESSERTSYSIFTABLE_INTERFACE_H
+-#define DESSERTSYSIFTABLE_INTERFACE_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+-#include "dessertSysifTable.h"
+-
+-
+- /*
+- ********************************************************************
+- * Table declarations
+- */
+-
+- /*
+- * PUBLIC interface initialization routine
+- */
+- void
+- _dessertSysifTable_initialize_interface
+- (dessertSysifTable_registration * user_ctx, u_long flags);
+- void
+- _dessertSysifTable_shutdown_interface
+- (dessertSysifTable_registration * user_ctx);
+-
+- dessertSysifTable_registration
+- *dessertSysifTable_registration_get(void);
+-
+- dessertSysifTable_registration
+- *dessertSysifTable_registration_set(dessertSysifTable_registration
+- * newreg);
+-
+- netsnmp_container *dessertSysifTable_container_get(void);
+- int dessertSysifTable_container_size(void);
+-
+- dessertSysifTable_rowreq_ctx
+- *dessertSysifTable_allocate_rowreq_ctx(void *);
+- void
+- dessertSysifTable_release_rowreq_ctx(dessertSysifTable_rowreq_ctx *
+- rowreq_ctx);
+-
+- int dessertSysifTable_index_to_oid(netsnmp_index * oid_idx,
+- dessertSysifTable_mib_index
+- * mib_idx);
+- int dessertSysifTable_index_from_oid(netsnmp_index *
+- oid_idx,
+- dessertSysifTable_mib_index
+- * mib_idx);
+-
+- /*
+- * access to certain internals. use with caution!
+- */
+- void dessertSysifTable_valid_columns_set(netsnmp_column_info
+- *vc);
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTSYSIFTABLE_INTERFACE_H */
+-/** @} */
+diff --git a/snmp/dessertSysifTable_oids.h b/snmp/dessertSysifTable_oids.h
+deleted file mode 100644
+index e3a61c8..0000000
+--- a/snmp/dessertSysifTable_oids.h
++++ /dev/null
+@@ -1,43 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * : generic-table-oids.m2c 12855 2005-09-27 15:56:08Z rstory $
+- *
+- * $Id:$
+- */
+-#ifndef DESSERTSYSIFTABLE_OIDS_H
+-#define DESSERTSYSIFTABLE_OIDS_H
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+- /*
+- * column number definitions for table dessertSysifTable
+- */
+-#define DESSERTSYSIFTABLE_OID 1,3,6,1,4,1,18898,0,19,10,1,1,7
+-
+-#define COLUMN_SYSIFINDEX 1
+-
+-#define COLUMN_SYSIFNAME 2
+-
+-#define COLUMN_SYSIFMACADDRESS 3
+-
+-#define COLUMN_SYSIFINPKTS 4
+-
+-#define COLUMN_SYSIFOUTPKTS 5
+-
+-#define COLUMN_SYSIFINOCTETS 6
+-
+-#define COLUMN_SYSIFOUTOCTETS 7
+-
+-
+-#define DESSERTSYSIFTABLE_MIN_COL COLUMN_SYSIFNAME
+-#define DESSERTSYSIFTABLE_MAX_COL COLUMN_SYSIFOUTOCTETS
+-
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-#endif /* DESSERTSYSIFTABLE_OIDS_H */
+diff --git a/snmp/dessertSysifTable_subagent.c b/snmp/dessertSysifTable_subagent.c
+deleted file mode 100644
+index 4f3d47a..0000000
+--- a/snmp/dessertSysifTable_subagent.c
++++ /dev/null
+@@ -1,202 +0,0 @@
+-/*
+- * Note: this file originally auto-generated by mib2c using
+- * version : 15795 $ of $
+- */
+-/*
+- * standard Net-SNMP includes
+- */
+-#include <net-snmp/net-snmp-config.h>
+-#include <net-snmp/net-snmp-includes.h>
+-#include <net-snmp/agent/net-snmp-agent-includes.h>
+-
+-/*
+- * include our parent header
+- */
+-#include "dessertSysifTable.h"
+-
+-#include <signal.h>
+-
+-static int keep_running;
+-
+-static RETSIGTYPE
+-stop_server(int a)
+-{
+- keep_running = 0;
+-}
+-
+-static void
+-usage(void)
+-{
+- printf
+- ("usage: dessertSysifTable [-D<tokens>] [-f] [-L] [-M] [-H] [LISTENING ADDRESSES]\n"
+- "\t-f Do not fork() from the calling shell.\n"
+- "\t-DTOKEN[,TOKEN,...]\n"
+- "\t\tTurn on debugging output for the given TOKEN(s).\n"
+- "\t\tWithout any tokens specified, it defaults to printing\n"
+- "\t\tall the tokens (which is equivalent to the keyword 'ALL').\n"
+- "\t\tYou might want to try ALL for extremely verbose output.\n"
+- "\t\tNote: You can't put a space between the -D and the TOKENs.\n"
+- "\t-H\tDisplay a list of configuration file directives\n"
+- "\t\tunderstood by the agent and then exit.\n"
+- "\t-M\tRun as a normal SNMP Agent instead of an AgentX sub-agent.\n"
+- "\t-x ADDRESS\tconnect to master agent at ADDRESS (default /var/agentx/master).\n"
+- "\t-L\tDo not open a log file; print all messages to stderr.\n");
+- exit(0);
+-}
+-
+-int
+-main(int argc, char **argv)
+-{
+- int agentx_subagent = 1; /* change this if you want to be a SNMP master agent */
+- /*
+- * Defs for arg-handling code: handles setting of policy-related variables
+- */
+- int ch;
+- extern char *optarg;
+- int dont_fork = 0, use_syslog = 0;
+- char *agentx_socket = NULL;
+-
+- while ((ch = getopt(argc, argv, "D:fHLMx:")) != EOF)
+- switch (ch) {
+- case 'D':
+- debug_register_tokens(optarg);
+- snmp_set_do_debugging(1);
+- break;
+- case 'f':
+- dont_fork = 1;
+- break;
+- case 'H':
+- netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID,
+- NETSNMP_DS_AGENT_NO_ROOT_ACCESS, 1);
+- init_agent("dessertSysifTable"); /* register our .conf handlers */
+- init_dessertSysifTable();
+- init_snmp("dessertSysifTable");
+- fprintf(stderr, "Configuration directives understood:\n");
+- read_config_print_usage(" ");
+- exit(0);
+- case 'M':
+- agentx_subagent = 0;
+- break;
+- case 'L':
+- use_syslog = 0; /* use stderr */
+- break;
+- case 'x':
+- agentx_socket = optarg;
+- break;
+- default:
+- fprintf(stderr, "unknown option %c\n", ch);
+- usage();
+- }
+-
+- if (optind < argc) {
+- int i;
+- /*
+- * There are optional transport addresses on the command line.
+- */
+- DEBUGMSGTL(("snmpd/main", "optind %d, argc %d\n", optind, argc));
+- for (i = optind; i < argc; i++) {
+- char *c, *astring;
+- if ((c = netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
+- NETSNMP_DS_AGENT_PORTS))) {
+- astring = malloc(strlen(c) + 2 + strlen(argv[i]));
+- if (astring == NULL) {
+- fprintf(stderr, "malloc failure processing argv[%d]\n",
+- i);
+- exit(1);
+- }
+- sprintf(astring, "%s,%s", c, argv[i]);
+- netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
+- NETSNMP_DS_AGENT_PORTS, astring);
+- SNMP_FREE(astring);
+- } else {
+- netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
+- NETSNMP_DS_AGENT_PORTS, argv[i]);
+- }
+- }
+- DEBUGMSGTL(("snmpd/main", "port spec: %s\n",
+- netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
+- NETSNMP_DS_AGENT_PORTS)));
+- }
+-
+- /*
+- * we're an agentx subagent?
+- */
+- if (agentx_subagent) {
+- /*
+- * make us a agentx client.
+- */
+- netsnmp_enable_subagent();
+- if (NULL != agentx_socket)
+- netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
+- NETSNMP_DS_AGENT_X_SOCKET,
+- agentx_socket);
+- }
+-
+- snmp_disable_log();
+- if (use_syslog)
+- snmp_enable_calllog();
+- else
+- snmp_enable_stderrlog();
+-
+- /*
+- * daemonize
+- */
+- if (!dont_fork) {
+- int rc = netsnmp_daemonize(1, !use_syslog);
+- if (rc)
+- exit(-1);
+- }
+-
+- /*
+- * initialize tcp/ip if necessary
+- */
+- SOCK_STARTUP;
+-
+- /*
+- * initialize the agent library
+- */
+- init_agent("dessertSysifTable");
+-
+- /*
+- * init dessertSysifTable mib code
+- */
+- init_dessertSysifTable();
+-
+- /*
+- * read dessertSysifTable.conf files.
+- */
+- init_snmp("dessertSysifTable");
+-
+- /*
+- * If we're going to be a snmp master agent, initial the ports
+- */
+- if (!agentx_subagent)
+- init_master_agent(); /* open the port to listen on (defaults to udp:161) */
+-
+- /*
+- * In case we recevie a request to stop (kill -TERM or kill -INT)
+- */
+- keep_running = 1;
+- signal(SIGTERM, stop_server);
+- signal(SIGINT, stop_server);
+-
+- /*
+- * you're main loop here...
+- */
+- while (keep_running) {
+- /*
+- * if you use select(), see snmp_select_info() in snmp_api(3)
+- */
+- /*
+- * --- OR ---
+- */
+- agent_check_and_process(1); /* 0 == don't block */
+- }
+-
+- /*
+- * at shutdown time
+- */
+- snmp_shutdown("dessertSysifTable");
+- SOCK_CLEANUP;
+- exit(0);
+-}
+diff --git a/src/Makefile.am b/src/Makefile.am
+new file mode 100644
+index 0000000..53c4a59
+--- /dev/null
++++ b/src/Makefile.am
+@@ -0,0 +1,3 @@
++
++SUBDIRS = snmp libdessert
++
+diff --git a/src/Makefile.in b/src/Makefile.in
+new file mode 100644
+index 0000000..e7cabb6
+--- /dev/null
++++ b/src/Makefile.in
+@@ -0,0 +1,590 @@
++# Makefile.in generated by automake 1.11 from Makefile.am.
++# @configure_input@
++
++# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
++# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
++# Inc.
++# This Makefile.in is free software; the Free Software Foundation
++# gives unlimited permission to copy and/or distribute it,
++# with or without modifications, as long as this notice is preserved.
++
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
++# PARTICULAR PURPOSE.
++
++@SET_MAKE@
++VPATH = @srcdir@
++pkgdatadir = $(datadir)/@PACKAGE@
++pkgincludedir = $(includedir)/@PACKAGE@
++pkglibdir = $(libdir)/@PACKAGE@
++pkglibexecdir = $(libexecdir)/@PACKAGE@
++am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
++install_sh_DATA = $(install_sh) -c -m 644
++install_sh_PROGRAM = $(install_sh) -c
++install_sh_SCRIPT = $(install_sh) -c
++INSTALL_HEADER = $(INSTALL_DATA)
++transform = $(program_transform_name)
++NORMAL_INSTALL = :
++PRE_INSTALL = :
++POST_INSTALL = :
++NORMAL_UNINSTALL = :
++PRE_UNINSTALL = :
++POST_UNINSTALL = :
++build_triplet = @build@
++host_triplet = @host@
++subdir = src
++DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
++am__aclocal_m4_deps = $(top_srcdir)/m4/ac_doxygen.m4 \
++ $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \
++ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
++ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
++ $(top_srcdir)/m4/net-snmp.m4 $(top_srcdir)/m4/pcap.m4 \
++ $(top_srcdir)/configure.ac
++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
++ $(ACLOCAL_M4)
++mkinstalldirs = $(install_sh) -d
++CONFIG_HEADER = $(top_builddir)/config.h
++CONFIG_CLEAN_FILES =
++CONFIG_CLEAN_VPATH_FILES =
++SOURCES =
++DIST_SOURCES =
++RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
++ html-recursive info-recursive install-data-recursive \
++ install-dvi-recursive install-exec-recursive \
++ install-html-recursive install-info-recursive \
++ install-pdf-recursive install-ps-recursive install-recursive \
++ installcheck-recursive installdirs-recursive pdf-recursive \
++ ps-recursive uninstall-recursive
++RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
++ distclean-recursive maintainer-clean-recursive
++AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
++ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
++ distdir
++ETAGS = etags
++CTAGS = ctags
++DIST_SUBDIRS = $(SUBDIRS)
++DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
++am__relativize = \
++ dir0=`pwd`; \
++ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
++ sed_rest='s,^[^/]*/*,,'; \
++ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
++ sed_butlast='s,/*[^/]*$$,,'; \
++ while test -n "$$dir1"; do \
++ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
++ if test "$$first" != "."; then \
++ if test "$$first" = ".."; then \
++ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
++ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
++ else \
++ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
++ if test "$$first2" = "$$first"; then \
++ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
++ else \
++ dir2="../$$dir2"; \
++ fi; \
++ dir0="$$dir0"/"$$first"; \
++ fi; \
++ fi; \
++ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
++ done; \
++ reldir="$$dir2"
++ACLOCAL = @ACLOCAL@
++AMTAR = @AMTAR@
++AR = @AR@
++AUTOCONF = @AUTOCONF@
++AUTOHEADER = @AUTOHEADER@
++AUTOMAKE = @AUTOMAKE@
++AWK = @AWK@
++CC = @CC@
++CCDEPMODE = @CCDEPMODE@
++CFLAGS = @CFLAGS@
++CPP = @CPP@
++CPPFLAGS = @CPPFLAGS@
++CYGPATH_W = @CYGPATH_W@
++DEFS = @DEFS@
++DEPDIR = @DEPDIR@
++DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@
++DSYMUTIL = @DSYMUTIL@
++DUMPBIN = @DUMPBIN@
++DX_CONFIG = @DX_CONFIG@
++DX_DOCDIR = @DX_DOCDIR@
++DX_DOT = @DX_DOT@
++DX_DOXYGEN = @DX_DOXYGEN@
++DX_DVIPS = @DX_DVIPS@
++DX_EGREP = @DX_EGREP@
++DX_ENV = @DX_ENV@
++DX_FLAG_chi = @DX_FLAG_chi@
++DX_FLAG_chm = @DX_FLAG_chm@
++DX_FLAG_doc = @DX_FLAG_doc@
++DX_FLAG_dot = @DX_FLAG_dot@
++DX_FLAG_html = @DX_FLAG_html@
++DX_FLAG_man = @DX_FLAG_man@
++DX_FLAG_pdf = @DX_FLAG_pdf@
++DX_FLAG_ps = @DX_FLAG_ps@
++DX_FLAG_rtf = @DX_FLAG_rtf@
++DX_FLAG_xml = @DX_FLAG_xml@
++DX_HHC = @DX_HHC@
++DX_LATEX = @DX_LATEX@
++DX_MAKEINDEX = @DX_MAKEINDEX@
++DX_PDFLATEX = @DX_PDFLATEX@
++DX_PERL = @DX_PERL@
++DX_PROJECT = @DX_PROJECT@
++ECHO_C = @ECHO_C@
++ECHO_N = @ECHO_N@
++ECHO_T = @ECHO_T@
++EGREP = @EGREP@
++EXEEXT = @EXEEXT@
++FGREP = @FGREP@
++GREP = @GREP@
++INSTALL = @INSTALL@
++INSTALL_DATA = @INSTALL_DATA@
++INSTALL_PROGRAM = @INSTALL_PROGRAM@
++INSTALL_SCRIPT = @INSTALL_SCRIPT@
++INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
++LD = @LD@
++LDFLAGS = @LDFLAGS@
++LIBDESSERT_LIBRARY_VERSION = @LIBDESSERT_LIBRARY_VERSION@
++LIBOBJS = @LIBOBJS@
++LIBS = @LIBS@
++LIBTOOL = @LIBTOOL@
++LIPO = @LIPO@
++LN_S = @LN_S@
++LTLIBOBJS = @LTLIBOBJS@
++MAKEINFO = @MAKEINFO@
++MKDIR_P = @MKDIR_P@
++NM = @NM@
++NMEDIT = @NMEDIT@
++OBJDUMP = @OBJDUMP@
++OBJEXT = @OBJEXT@
++OTOOL = @OTOOL@
++OTOOL64 = @OTOOL64@
++PACKAGE = @PACKAGE@
++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
++PACKAGE_NAME = @PACKAGE_NAME@
++PACKAGE_STRING = @PACKAGE_STRING@
++PACKAGE_TARNAME = @PACKAGE_TARNAME@
++PACKAGE_URL = @PACKAGE_URL@
++PACKAGE_VERSION = @PACKAGE_VERSION@
++PATH_SEPARATOR = @PATH_SEPARATOR@
++PCAP_CFLAGS = @PCAP_CFLAGS@
++PCAP_CFLGAS = @PCAP_CFLGAS@
++PCAP_LIBS = @PCAP_LIBS@
++PTHREAD_CC = @PTHREAD_CC@
++PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
++PTHREAD_LIBS = @PTHREAD_LIBS@
++RANLIB = @RANLIB@
++SED = @SED@
++SET_MAKE = @SET_MAKE@
++SHELL = @SHELL@
++SNMP_CFLAGS = @SNMP_CFLAGS@
++SNMP_CFLGAS = @SNMP_CFLGAS@
++SNMP_LIBS = @SNMP_LIBS@
++STRIP = @STRIP@
++VERSION = @VERSION@
++abs_builddir = @abs_builddir@
++abs_srcdir = @abs_srcdir@
++abs_top_builddir = @abs_top_builddir@
++abs_top_srcdir = @abs_top_srcdir@
++ac_ct_CC = @ac_ct_CC@
++ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
++am__include = @am__include@
++am__leading_dot = @am__leading_dot@
++am__quote = @am__quote@
++am__tar = @am__tar@
++am__untar = @am__untar@
++ax_pthread_config = @ax_pthread_config@
++bindir = @bindir@
++build = @build@
++build_alias = @build_alias@
++build_cpu = @build_cpu@
++build_os = @build_os@
++build_vendor = @build_vendor@
++builddir = @builddir@
++datadir = @datadir@
++datarootdir = @datarootdir@
++docdir = @docdir@
++dvidir = @dvidir@
++exec_prefix = @exec_prefix@
++host = @host@
++host_alias = @host_alias@
++host_cpu = @host_cpu@
++host_os = @host_os@
++host_vendor = @host_vendor@
++htmldir = @htmldir@
++includedir = @includedir@
++infodir = @infodir@
++install_sh = @install_sh@
++libdir = @libdir@
++libexecdir = @libexecdir@
++localedir = @localedir@
++localstatedir = @localstatedir@
++lt_ECHO = @lt_ECHO@
++mandir = @mandir@
++mkdir_p = @mkdir_p@
++oldincludedir = @oldincludedir@
++pdfdir = @pdfdir@
++prefix = @prefix@
++program_transform_name = @program_transform_name@
++psdir = @psdir@
++sbindir = @sbindir@
++sharedstatedir = @sharedstatedir@
++srcdir = @srcdir@
++sysconfdir = @sysconfdir@
++target_alias = @target_alias@
++top_build_prefix = @top_build_prefix@
++top_builddir = @top_builddir@
++top_srcdir = @top_srcdir@
++SUBDIRS = snmp libdessert
++all: all-recursive
++
++.SUFFIXES:
++$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
++ @for dep in $?; do \
++ case '$(am__configure_deps)' in \
++ *$$dep*) \
++ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
++ && { if test -f $@; then exit 0; else break; fi; }; \
++ exit 1;; \
++ esac; \
++ done; \
++ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
++ $(am__cd) $(top_srcdir) && \
++ $(AUTOMAKE) --gnu src/Makefile
++.PRECIOUS: Makefile
++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
++ @case '$?' in \
++ *config.status*) \
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
++ *) \
++ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
++ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
++ esac;
++
++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++
++$(top_srcdir)/configure: $(am__configure_deps)
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++$(ACLOCAL_M4): $(am__aclocal_m4_deps)
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++$(am__aclocal_m4_deps):
++
++mostlyclean-libtool:
++ -rm -f *.lo
++
++clean-libtool:
++ -rm -rf .libs _libs
++
++# This directory's subdirectories are mostly independent; you can cd
++# into them and run `make' without going through this Makefile.
++# To change the values of `make' variables: instead of editing Makefiles,
++# (1) if the variable is set in `config.status', edit `config.status'
++# (which will cause the Makefiles to be regenerated when you run `make');
++# (2) otherwise, pass the desired values on the `make' command line.
++$(RECURSIVE_TARGETS):
++ @failcom='exit 1'; \
++ for f in x $$MAKEFLAGS; do \
++ case $$f in \
++ *=* | --[!k]*);; \
++ *k*) failcom='fail=yes';; \
++ esac; \
++ done; \
++ dot_seen=no; \
++ target=`echo $@ | sed s/-recursive//`; \
++ list='$(SUBDIRS)'; for subdir in $$list; do \
++ echo "Making $$target in $$subdir"; \
++ if test "$$subdir" = "."; then \
++ dot_seen=yes; \
++ local_target="$$target-am"; \
++ else \
++ local_target="$$target"; \
++ fi; \
++ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
++ || eval $$failcom; \
++ done; \
++ if test "$$dot_seen" = "no"; then \
++ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
++ fi; test -z "$$fail"
++
++$(RECURSIVE_CLEAN_TARGETS):
++ @failcom='exit 1'; \
++ for f in x $$MAKEFLAGS; do \
++ case $$f in \
++ *=* | --[!k]*);; \
++ *k*) failcom='fail=yes';; \
++ esac; \
++ done; \
++ dot_seen=no; \
++ case "$@" in \
++ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
++ *) list='$(SUBDIRS)' ;; \
++ esac; \
++ rev=''; for subdir in $$list; do \
++ if test "$$subdir" = "."; then :; else \
++ rev="$$subdir $$rev"; \
++ fi; \
++ done; \
++ rev="$$rev ."; \
++ target=`echo $@ | sed s/-recursive//`; \
++ for subdir in $$rev; do \
++ echo "Making $$target in $$subdir"; \
++ if test "$$subdir" = "."; then \
++ local_target="$$target-am"; \
++ else \
++ local_target="$$target"; \
++ fi; \
++ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
++ || eval $$failcom; \
++ done && test -z "$$fail"
++tags-recursive:
++ list='$(SUBDIRS)'; for subdir in $$list; do \
++ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
++ done
++ctags-recursive:
++ list='$(SUBDIRS)'; for subdir in $$list; do \
++ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
++ done
++
++ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
++ unique=`for i in $$list; do \
++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
++ done | \
++ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
++ END { if (nonempty) { for (i in files) print i; }; }'`; \
++ mkid -fID $$unique
++tags: TAGS
++
++TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
++ $(TAGS_FILES) $(LISP)
++ set x; \
++ here=`pwd`; \
++ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
++ include_option=--etags-include; \
++ empty_fix=.; \
++ else \
++ include_option=--include; \
++ empty_fix=; \
++ fi; \
++ list='$(SUBDIRS)'; for subdir in $$list; do \
++ if test "$$subdir" = .; then :; else \
++ test ! -f $$subdir/TAGS || \
++ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
++ fi; \
++ done; \
++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
++ unique=`for i in $$list; do \
++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
++ done | \
++ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
++ END { if (nonempty) { for (i in files) print i; }; }'`; \
++ shift; \
++ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
++ test -n "$$unique" || unique=$$empty_fix; \
++ if test $$# -gt 0; then \
++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
++ "$$@" $$unique; \
++ else \
++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
++ $$unique; \
++ fi; \
++ fi
++ctags: CTAGS
++CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
++ $(TAGS_FILES) $(LISP)
++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
++ unique=`for i in $$list; do \
++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
++ done | \
++ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
++ END { if (nonempty) { for (i in files) print i; }; }'`; \
++ test -z "$(CTAGS_ARGS)$$unique" \
++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
++ $$unique
++
++GTAGS:
++ here=`$(am__cd) $(top_builddir) && pwd` \
++ && $(am__cd) $(top_srcdir) \
++ && gtags -i $(GTAGS_ARGS) "$$here"
++
++distclean-tags:
++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
++
++distdir: $(DISTFILES)
++ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++ list='$(DISTFILES)'; \
++ dist_files=`for file in $$list; do echo $$file; done | \
++ sed -e "s|^$$srcdirstrip/||;t" \
++ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
++ case $$dist_files in \
++ */*) $(MKDIR_P) `echo "$$dist_files" | \
++ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
++ sort -u` ;; \
++ esac; \
++ for file in $$dist_files; do \
++ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
++ if test -d $$d/$$file; then \
++ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
++ if test -d "$(distdir)/$$file"; then \
++ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++ fi; \
++ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
++ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
++ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++ fi; \
++ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
++ else \
++ test -f "$(distdir)/$$file" \
++ || cp -p $$d/$$file "$(distdir)/$$file" \
++ || exit 1; \
++ fi; \
++ done
++ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
++ if test "$$subdir" = .; then :; else \
++ test -d "$(distdir)/$$subdir" \
++ || $(MKDIR_P) "$(distdir)/$$subdir" \
++ || exit 1; \
++ fi; \
++ done
++ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
++ if test "$$subdir" = .; then :; else \
++ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
++ $(am__relativize); \
++ new_distdir=$$reldir; \
++ dir1=$$subdir; dir2="$(top_distdir)"; \
++ $(am__relativize); \
++ new_top_distdir=$$reldir; \
++ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
++ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
++ ($(am__cd) $$subdir && \
++ $(MAKE) $(AM_MAKEFLAGS) \
++ top_distdir="$$new_top_distdir" \
++ distdir="$$new_distdir" \
++ am__remove_distdir=: \
++ am__skip_length_check=: \
++ am__skip_mode_fix=: \
++ distdir) \
++ || exit 1; \
++ fi; \
++ done
++check-am: all-am
++check: check-recursive
++all-am: Makefile
++installdirs: installdirs-recursive
++installdirs-am:
++install: install-recursive
++install-exec: install-exec-recursive
++install-data: install-data-recursive
++uninstall: uninstall-recursive
++
++install-am: all-am
++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
++
++installcheck: installcheck-recursive
++install-strip:
++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
++ `test -z '$(STRIP)' || \
++ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
++mostlyclean-generic:
++
++clean-generic:
++
++distclean-generic:
++ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
++ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
++
++maintainer-clean-generic:
++ @echo "This command is intended for maintainers to use"
++ @echo "it deletes files that may require special tools to rebuild."
++clean: clean-recursive
++
++clean-am: clean-generic clean-libtool mostlyclean-am
++
++distclean: distclean-recursive
++ -rm -f Makefile
++distclean-am: clean-am distclean-generic distclean-tags
++
++dvi: dvi-recursive
++
++dvi-am:
++
++html: html-recursive
++
++html-am:
++
++info: info-recursive
++
++info-am:
++
++install-data-am:
++
++install-dvi: install-dvi-recursive
++
++install-dvi-am:
++
++install-exec-am:
++
++install-html: install-html-recursive
++
++install-html-am:
++
++install-info: install-info-recursive
++
++install-info-am:
++
++install-man:
++
++install-pdf: install-pdf-recursive
++
++install-pdf-am:
++
++install-ps: install-ps-recursive
++
++install-ps-am:
++
++installcheck-am:
++
++maintainer-clean: maintainer-clean-recursive
++ -rm -f Makefile
++maintainer-clean-am: distclean-am maintainer-clean-generic
++
++mostlyclean: mostlyclean-recursive
++
++mostlyclean-am: mostlyclean-generic mostlyclean-libtool
++
++pdf: pdf-recursive
++
++pdf-am:
++
++ps: ps-recursive
++
++ps-am:
++
++uninstall-am:
++
++.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
++ install-am install-strip tags-recursive
++
++.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
++ all all-am check check-am clean clean-generic clean-libtool \
++ ctags ctags-recursive distclean distclean-generic \
++ distclean-libtool distclean-tags distdir dvi dvi-am html \
++ html-am info info-am install install-am install-data \
++ install-data-am install-dvi install-dvi-am install-exec \
++ install-exec-am install-html install-html-am install-info \
++ install-info-am install-man install-pdf install-pdf-am \
++ install-ps install-ps-am install-strip installcheck \
++ installcheck-am installdirs installdirs-am maintainer-clean \
++ maintainer-clean-generic mostlyclean mostlyclean-generic \
++ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
++ uninstall uninstall-am
++
++
++# Tell versions [3.59,3.63) of GNU make to not export all variables.
++# Otherwise a system limit (for SysV at least) may be exceeded.
++.NOEXPORT:
+diff --git a/src/libdessert/Makefile.am b/src/libdessert/Makefile.am
+new file mode 100644
+index 0000000..1071752
+--- /dev/null
++++ b/src/libdessert/Makefile.am
+@@ -0,0 +1,21 @@
++
++AM_CPPFLAGS = -I$(top_srcdir)/include \
++ -I../snmp \
++ @PCAP_CFLAGS@ \
++ @SNMP_CFLAGS@
++
++lib_LTLIBRARIES = libdessert.la
++
++libdessert_la_SOURCES = dessert_agentx.c \
++ dessert_core.c \
++ dessert_meshiface.c \
++ dessert_periodic.c \
++ dessert_cli.c \
++ dessert_log.c \
++ dessert_msg.c \
++ dessert_sysiface.c \
++ dessert_internal.h
++
++libdessert_la_LIBADD = ../snmp/libsnmp.la @SNMP_LIBS@
++
++libdessert_la_LDFLAGS = -version-number @LIBDESSERT_LIBRARY_VERSION@
+diff --git a/src/libdessert/Makefile.in b/src/libdessert/Makefile.in
+new file mode 100644
+index 0000000..ac76164
+--- /dev/null
++++ b/src/libdessert/Makefile.in
+@@ -0,0 +1,579 @@
++# Makefile.in generated by automake 1.11 from Makefile.am.
++# @configure_input@
++
++# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
++# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
++# Inc.
++# This Makefile.in is free software; the Free Software Foundation
++# gives unlimited permission to copy and/or distribute it,
++# with or without modifications, as long as this notice is preserved.
++
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
++# PARTICULAR PURPOSE.
++
++@SET_MAKE@
++
++VPATH = @srcdir@
++pkgdatadir = $(datadir)/@PACKAGE@
++pkgincludedir = $(includedir)/@PACKAGE@
++pkglibdir = $(libdir)/@PACKAGE@
++pkglibexecdir = $(libexecdir)/@PACKAGE@
++am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
++install_sh_DATA = $(install_sh) -c -m 644
++install_sh_PROGRAM = $(install_sh) -c
++install_sh_SCRIPT = $(install_sh) -c
++INSTALL_HEADER = $(INSTALL_DATA)
++transform = $(program_transform_name)
++NORMAL_INSTALL = :
++PRE_INSTALL = :
++POST_INSTALL = :
++NORMAL_UNINSTALL = :
++PRE_UNINSTALL = :
++POST_UNINSTALL = :
++build_triplet = @build@
++host_triplet = @host@
++subdir = src/libdessert
++DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
++am__aclocal_m4_deps = $(top_srcdir)/m4/ac_doxygen.m4 \
++ $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \
++ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
++ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
++ $(top_srcdir)/m4/net-snmp.m4 $(top_srcdir)/m4/pcap.m4 \
++ $(top_srcdir)/configure.ac
++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
++ $(ACLOCAL_M4)
++mkinstalldirs = $(install_sh) -d
++CONFIG_HEADER = $(top_builddir)/config.h
++CONFIG_CLEAN_FILES =
++CONFIG_CLEAN_VPATH_FILES =
++am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
++am__vpath_adj = case $$p in \
++ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
++ *) f=$$p;; \
++ esac;
++am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
++am__install_max = 40
++am__nobase_strip_setup = \
++ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
++am__nobase_strip = \
++ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
++am__nobase_list = $(am__nobase_strip_setup); \
++ for p in $$list; do echo "$$p $$p"; done | \
++ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
++ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
++ if (++n[$$2] == $(am__install_max)) \
++ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
++ END { for (dir in files) print dir, files[dir] }'
++am__base_list = \
++ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
++ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
++am__installdirs = "$(DESTDIR)$(libdir)"
++LTLIBRARIES = $(lib_LTLIBRARIES)
++libdessert_la_DEPENDENCIES = ../snmp/libsnmp.la
++am_libdessert_la_OBJECTS = dessert_agentx.lo dessert_core.lo \
++ dessert_meshiface.lo dessert_periodic.lo dessert_cli.lo \
++ dessert_log.lo dessert_msg.lo dessert_sysiface.lo
++libdessert_la_OBJECTS = $(am_libdessert_la_OBJECTS)
++libdessert_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
++ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
++ $(libdessert_la_LDFLAGS) $(LDFLAGS) -o $@
++DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
++depcomp = $(SHELL) $(top_srcdir)/depcomp
++am__depfiles_maybe = depfiles
++am__mv = mv -f
++COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
++ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
++LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
++ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
++ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
++CCLD = $(CC)
++LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
++ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
++ $(LDFLAGS) -o $@
++SOURCES = $(libdessert_la_SOURCES)
++DIST_SOURCES = $(libdessert_la_SOURCES)
++ETAGS = etags
++CTAGS = ctags
++DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
++ACLOCAL = @ACLOCAL@
++AMTAR = @AMTAR@
++AR = @AR@
++AUTOCONF = @AUTOCONF@
++AUTOHEADER = @AUTOHEADER@
++AUTOMAKE = @AUTOMAKE@
++AWK = @AWK@
++CC = @CC@
++CCDEPMODE = @CCDEPMODE@
++CFLAGS = @CFLAGS@
++CPP = @CPP@
++CPPFLAGS = @CPPFLAGS@
++CYGPATH_W = @CYGPATH_W@
++DEFS = @DEFS@
++DEPDIR = @DEPDIR@
++DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@
++DSYMUTIL = @DSYMUTIL@
++DUMPBIN = @DUMPBIN@
++DX_CONFIG = @DX_CONFIG@
++DX_DOCDIR = @DX_DOCDIR@
++DX_DOT = @DX_DOT@
++DX_DOXYGEN = @DX_DOXYGEN@
++DX_DVIPS = @DX_DVIPS@
++DX_EGREP = @DX_EGREP@
++DX_ENV = @DX_ENV@
++DX_FLAG_chi = @DX_FLAG_chi@
++DX_FLAG_chm = @DX_FLAG_chm@
++DX_FLAG_doc = @DX_FLAG_doc@
++DX_FLAG_dot = @DX_FLAG_dot@
++DX_FLAG_html = @DX_FLAG_html@
++DX_FLAG_man = @DX_FLAG_man@
++DX_FLAG_pdf = @DX_FLAG_pdf@
++DX_FLAG_ps = @DX_FLAG_ps@
++DX_FLAG_rtf = @DX_FLAG_rtf@
++DX_FLAG_xml = @DX_FLAG_xml@
++DX_HHC = @DX_HHC@
++DX_LATEX = @DX_LATEX@
++DX_MAKEINDEX = @DX_MAKEINDEX@
++DX_PDFLATEX = @DX_PDFLATEX@
++DX_PERL = @DX_PERL@
++DX_PROJECT = @DX_PROJECT@
++ECHO_C = @ECHO_C@
++ECHO_N = @ECHO_N@
++ECHO_T = @ECHO_T@
++EGREP = @EGREP@
++EXEEXT = @EXEEXT@
++FGREP = @FGREP@
++GREP = @GREP@
++INSTALL = @INSTALL@
++INSTALL_DATA = @INSTALL_DATA@
++INSTALL_PROGRAM = @INSTALL_PROGRAM@
++INSTALL_SCRIPT = @INSTALL_SCRIPT@
++INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
++LD = @LD@
++LDFLAGS = @LDFLAGS@
++LIBDESSERT_LIBRARY_VERSION = @LIBDESSERT_LIBRARY_VERSION@
++LIBOBJS = @LIBOBJS@
++LIBS = @LIBS@
++LIBTOOL = @LIBTOOL@
++LIPO = @LIPO@
++LN_S = @LN_S@
++LTLIBOBJS = @LTLIBOBJS@
++MAKEINFO = @MAKEINFO@
++MKDIR_P = @MKDIR_P@
++NM = @NM@
++NMEDIT = @NMEDIT@
++OBJDUMP = @OBJDUMP@
++OBJEXT = @OBJEXT@
++OTOOL = @OTOOL@
++OTOOL64 = @OTOOL64@
++PACKAGE = @PACKAGE@
++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
++PACKAGE_NAME = @PACKAGE_NAME@
++PACKAGE_STRING = @PACKAGE_STRING@
++PACKAGE_TARNAME = @PACKAGE_TARNAME@
++PACKAGE_URL = @PACKAGE_URL@
++PACKAGE_VERSION = @PACKAGE_VERSION@
++PATH_SEPARATOR = @PATH_SEPARATOR@
++PCAP_CFLAGS = @PCAP_CFLAGS@
++PCAP_CFLGAS = @PCAP_CFLGAS@
++PCAP_LIBS = @PCAP_LIBS@
++PTHREAD_CC = @PTHREAD_CC@
++PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
++PTHREAD_LIBS = @PTHREAD_LIBS@
++RANLIB = @RANLIB@
++SED = @SED@
++SET_MAKE = @SET_MAKE@
++SHELL = @SHELL@
++SNMP_CFLAGS = @SNMP_CFLAGS@
++SNMP_CFLGAS = @SNMP_CFLGAS@
++SNMP_LIBS = @SNMP_LIBS@
++STRIP = @STRIP@
++VERSION = @VERSION@
++abs_builddir = @abs_builddir@
++abs_srcdir = @abs_srcdir@
++abs_top_builddir = @abs_top_builddir@
++abs_top_srcdir = @abs_top_srcdir@
++ac_ct_CC = @ac_ct_CC@
++ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
++am__include = @am__include@
++am__leading_dot = @am__leading_dot@
++am__quote = @am__quote@
++am__tar = @am__tar@
++am__untar = @am__untar@
++ax_pthread_config = @ax_pthread_config@
++bindir = @bindir@
++build = @build@
++build_alias = @build_alias@
++build_cpu = @build_cpu@
++build_os = @build_os@
++build_vendor = @build_vendor@
++builddir = @builddir@
++datadir = @datadir@
++datarootdir = @datarootdir@
++docdir = @docdir@
++dvidir = @dvidir@
++exec_prefix = @exec_prefix@
++host = @host@
++host_alias = @host_alias@
++host_cpu = @host_cpu@
++host_os = @host_os@
++host_vendor = @host_vendor@
++htmldir = @htmldir@
++includedir = @includedir@
++infodir = @infodir@
++install_sh = @install_sh@
++libdir = @libdir@
++libexecdir = @libexecdir@
++localedir = @localedir@
++localstatedir = @localstatedir@
++lt_ECHO = @lt_ECHO@
++mandir = @mandir@
++mkdir_p = @mkdir_p@
++oldincludedir = @oldincludedir@
++pdfdir = @pdfdir@
++prefix = @prefix@
++program_transform_name = @program_transform_name@
++psdir = @psdir@
++sbindir = @sbindir@
++sharedstatedir = @sharedstatedir@
++srcdir = @srcdir@
++sysconfdir = @sysconfdir@
++target_alias = @target_alias@
++top_build_prefix = @top_build_prefix@
++top_builddir = @top_builddir@
++top_srcdir = @top_srcdir@
++AM_CPPFLAGS = -I$(top_srcdir)/include \
++ -I../snmp \
++ @PCAP_CFLAGS@ \
++ @SNMP_CFLAGS@
++
++lib_LTLIBRARIES = libdessert.la
++libdessert_la_SOURCES = dessert_agentx.c \
++ dessert_core.c \
++ dessert_meshiface.c \
++ dessert_periodic.c \
++ dessert_cli.c \
++ dessert_log.c \
++ dessert_msg.c \
++ dessert_sysiface.c \
++ dessert_internal.h
++
++libdessert_la_LIBADD = ../snmp/libsnmp.la @SNMP_LIBS@
++libdessert_la_LDFLAGS = -version-number @LIBDESSERT_LIBRARY_VERSION@
++all: all-am
++
++.SUFFIXES:
++.SUFFIXES: .c .lo .o .obj
++$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
++ @for dep in $?; do \
++ case '$(am__configure_deps)' in \
++ *$$dep*) \
++ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
++ && { if test -f $@; then exit 0; else break; fi; }; \
++ exit 1;; \
++ esac; \
++ done; \
++ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/libdessert/Makefile'; \
++ $(am__cd) $(top_srcdir) && \
++ $(AUTOMAKE) --gnu src/libdessert/Makefile
++.PRECIOUS: Makefile
++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
++ @case '$?' in \
++ *config.status*) \
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
++ *) \
++ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
++ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
++ esac;
++
++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++
++$(top_srcdir)/configure: $(am__configure_deps)
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++$(ACLOCAL_M4): $(am__aclocal_m4_deps)
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++$(am__aclocal_m4_deps):
++install-libLTLIBRARIES: $(lib_LTLIBRARIES)
++ @$(NORMAL_INSTALL)
++ test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
++ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
++ list2=; for p in $$list; do \
++ if test -f $$p; then \
++ list2="$$list2 $$p"; \
++ else :; fi; \
++ done; \
++ test -z "$$list2" || { \
++ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
++ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
++ }
++
++uninstall-libLTLIBRARIES:
++ @$(NORMAL_UNINSTALL)
++ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
++ for p in $$list; do \
++ $(am__strip_dir) \
++ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
++ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
++ done
++
++clean-libLTLIBRARIES:
++ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
++ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
++ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
++ test "$$dir" != "$$p" || dir=.; \
++ echo "rm -f \"$${dir}/so_locations\""; \
++ rm -f "$${dir}/so_locations"; \
++ done
++libdessert.la: $(libdessert_la_OBJECTS) $(libdessert_la_DEPENDENCIES)
++ $(libdessert_la_LINK) -rpath $(libdir) $(libdessert_la_OBJECTS) $(libdessert_la_LIBADD) $(LIBS)
++
++mostlyclean-compile:
++ -rm -f *.$(OBJEXT)
++
++distclean-compile:
++ -rm -f *.tab.c
++
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessert_agentx.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessert_cli.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessert_core.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessert_log.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessert_meshiface.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessert_msg.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessert_periodic.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessert_sysiface.Plo@am__quote@
++
++.c.o:
++@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
++@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
++@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
++@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++@am__fastdepCC_FALSE@ $(COMPILE) -c $<
++
++.c.obj:
++@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
++@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
++@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
++@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
++
++.c.lo:
++@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
++@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
++@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
++@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
++
++mostlyclean-libtool:
++ -rm -f *.lo
++
++clean-libtool:
++ -rm -rf .libs _libs
++
++ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
++ unique=`for i in $$list; do \
++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
++ done | \
++ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
++ END { if (nonempty) { for (i in files) print i; }; }'`; \
++ mkid -fID $$unique
++tags: TAGS
++
++TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
++ $(TAGS_FILES) $(LISP)
++ set x; \
++ here=`pwd`; \
++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
++ unique=`for i in $$list; do \
++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
++ done | \
++ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
++ END { if (nonempty) { for (i in files) print i; }; }'`; \
++ shift; \
++ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
++ test -n "$$unique" || unique=$$empty_fix; \
++ if test $$# -gt 0; then \
++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
++ "$$@" $$unique; \
++ else \
++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
++ $$unique; \
++ fi; \
++ fi
++ctags: CTAGS
++CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
++ $(TAGS_FILES) $(LISP)
++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
++ unique=`for i in $$list; do \
++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
++ done | \
++ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
++ END { if (nonempty) { for (i in files) print i; }; }'`; \
++ test -z "$(CTAGS_ARGS)$$unique" \
++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
++ $$unique
++
++GTAGS:
++ here=`$(am__cd) $(top_builddir) && pwd` \
++ && $(am__cd) $(top_srcdir) \
++ && gtags -i $(GTAGS_ARGS) "$$here"
++
++distclean-tags:
++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
++
++distdir: $(DISTFILES)
++ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++ list='$(DISTFILES)'; \
++ dist_files=`for file in $$list; do echo $$file; done | \
++ sed -e "s|^$$srcdirstrip/||;t" \
++ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
++ case $$dist_files in \
++ */*) $(MKDIR_P) `echo "$$dist_files" | \
++ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
++ sort -u` ;; \
++ esac; \
++ for file in $$dist_files; do \
++ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
++ if test -d $$d/$$file; then \
++ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
++ if test -d "$(distdir)/$$file"; then \
++ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++ fi; \
++ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
++ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
++ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++ fi; \
++ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
++ else \
++ test -f "$(distdir)/$$file" \
++ || cp -p $$d/$$file "$(distdir)/$$file" \
++ || exit 1; \
++ fi; \
++ done
++check-am: all-am
++check: check-am
++all-am: Makefile $(LTLIBRARIES)
++installdirs:
++ for dir in "$(DESTDIR)$(libdir)"; do \
++ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
++ done
++install: install-am
++install-exec: install-exec-am
++install-data: install-data-am
++uninstall: uninstall-am
++
++install-am: all-am
++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
++
++installcheck: installcheck-am
++install-strip:
++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
++ `test -z '$(STRIP)' || \
++ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
++mostlyclean-generic:
++
++clean-generic:
++
++distclean-generic:
++ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
++ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
++
++maintainer-clean-generic:
++ @echo "This command is intended for maintainers to use"
++ @echo "it deletes files that may require special tools to rebuild."
++clean: clean-am
++
++clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
++ mostlyclean-am
++
++distclean: distclean-am
++ -rm -rf ./$(DEPDIR)
++ -rm -f Makefile
++distclean-am: clean-am distclean-compile distclean-generic \
++ distclean-tags
++
++dvi: dvi-am
++
++dvi-am:
++
++html: html-am
++
++html-am:
++
++info: info-am
++
++info-am:
++
++install-data-am:
++
++install-dvi: install-dvi-am
++
++install-dvi-am:
++
++install-exec-am: install-libLTLIBRARIES
++
++install-html: install-html-am
++
++install-html-am:
++
++install-info: install-info-am
++
++install-info-am:
++
++install-man:
++
++install-pdf: install-pdf-am
++
++install-pdf-am:
++
++install-ps: install-ps-am
++
++install-ps-am:
++
++installcheck-am:
++
++maintainer-clean: maintainer-clean-am
++ -rm -rf ./$(DEPDIR)
++ -rm -f Makefile
++maintainer-clean-am: distclean-am maintainer-clean-generic
++
++mostlyclean: mostlyclean-am
++
++mostlyclean-am: mostlyclean-compile mostlyclean-generic \
++ mostlyclean-libtool
++
++pdf: pdf-am
++
++pdf-am:
++
++ps: ps-am
++
++ps-am:
++
++uninstall-am: uninstall-libLTLIBRARIES
++
++.MAKE: install-am install-strip
++
++.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
++ clean-libLTLIBRARIES clean-libtool ctags distclean \
++ distclean-compile distclean-generic distclean-libtool \
++ distclean-tags distdir dvi dvi-am html html-am info info-am \
++ install install-am install-data install-data-am install-dvi \
++ install-dvi-am install-exec install-exec-am install-html \
++ install-html-am install-info install-info-am \
++ install-libLTLIBRARIES install-man install-pdf install-pdf-am \
++ install-ps install-ps-am install-strip installcheck \
++ installcheck-am installdirs maintainer-clean \
++ maintainer-clean-generic mostlyclean mostlyclean-compile \
++ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
++ tags uninstall uninstall-am uninstall-libLTLIBRARIES
++
++
++# Tell versions [3.59,3.63) of GNU make to not export all variables.
++# Otherwise a system limit (for SysV at least) may be exceeded.
++.NOEXPORT:
+diff --git a/src/libdessert/dessert_agentx.c b/src/libdessert/dessert_agentx.c
+new file mode 100644
+index 0000000..0e74682
+--- /dev/null
++++ b/src/libdessert/dessert_agentx.c
+@@ -0,0 +1,563 @@
++/******************************************************************************
++ Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
++ All rights reserved.
++
++ These sources were originally developed by David Gutzmann
++ at Freie Universitaet Berlin (http://www.fu-berlin.de/),
++ Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
++ (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
++ ------------------------------------------------------------------------------
++ This program is free software: you can redistribute it and/or modify it under
++ the terms of the GNU General Public License as published by the Free Software
++ Foundation, either version 3 of the License, or (at your option) any later
++ version.
++
++ This program is distributed in the hope that it will be useful, but WITHOUT
++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
++ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along with
++ this program. If not, see http://www.gnu.org/licenses/ .
++ ------------------------------------------------------------------------------
++ For further information and questions please use the web site
++ http://www.des-testbed.net/
++ *******************************************************************************/
++
++#include "dessert_internal.h"
++#include <dessert/dessert.h>
++
++/* global data storage // P U B L I C */
++
++/* global data storage // P R I V A T E */
++pthread_rwlock_t _dessert_appstats_cblist_lock = PTHREAD_RWLOCK_INITIALIZER;
++dessert_agentx_appstats_cb_entry_t *_dessert_appstats_cblist = NULL;
++
++pthread_rwlock_t _dessert_appparams_cblist_lock = PTHREAD_RWLOCK_INITIALIZER;
++dessert_agentx_appparams_cb_entry_t *_dessert_appparams_cblist = NULL;
++
++/* local data storage*/
++int keep_snmp_running = 1;
++
++pthread_mutex_t _dessert_agentx_appparams_nextindex_mutex =
++ PTHREAD_MUTEX_INITIALIZER;
++uint8_t _dessert_agentx_appparams_nextindex = 0;
++
++/* internal functions forward declarations*/
++static void *_dessert_agentx_worker(void *arg);
++static dessert_agentx_appstats_cb_entry_t *_dessert_agentx_appstats_add(
++ dessert_agentx_appstatscb_get_t *c, uint8_t bulknobulk_flag);
++static uint8_t _dessert_agentx_appparams_new_index(void);
++
++/******************************************************************************
++ *
++ * EXTERNAL / PUBLIC
++ *
++ * NET - S N M P // A G E N T _ X
++ *
++ ******************************************************************************/
++
++/******************************************************************************
++ * appStats
++ ******************************************************************************/
++
++/** Creates and initializes a new dessert_agentx_appstats_t.
++ *
++ * @return the new dessert_agentx_appstats_t
++ *
++ * @warning A dessert_agentx_appstats_t allocated with this function must be
++ * freed with dessert_agentx_appstats_destroy().
++ *
++ * @see dessert_agentx_appstats_destroy()
++ *
++ * @par Description:\n
++ *
++ */
++dessert_agentx_appstats_t *dessert_agentx_appstats_new() {
++ dessert_agentx_appstats_t *appstat;
++
++ appstat = malloc(sizeof(dessert_agentx_appstats_t));
++
++ appstat->prev = appstat;
++ appstat->next = NULL;
++
++ memset(appstat->name,0, sizeof(appstat->name));
++ memset(appstat->desc,0, sizeof(appstat->desc));
++
++ appstat->value_type = DESSERT_APPSTATS_VALUETYPE_BOOL;
++ appstat->node_or_link = DESSERT_APPSTATS_NODEORLINK_NONE;
++ memset(appstat->macaddress1, 0, ETHER_ADDR_LEN);
++ memset(appstat->macaddress2, 0, ETHER_ADDR_LEN);
++
++ appstat->bool = DESSERT_APPSTATS_BOOL_FALSE;
++
++ return appstat;
++}
++
++/** Frees a dessert_agentx_appstats_t.
++ *
++ * @param appstat the dessert_agentx_appstats_t to be freed
++ *
++ * @warning Only use this method to free a dessert_agentx_appstats_t which was allocated with dessert_agentx_appstats_new().
++ *
++ * @see dessert_agentx_appstats_new()
++ *
++ * @par Description:\n
++ */
++void dessert_agentx_appstats_destroy(dessert_agentx_appstats_t *appstat) {
++ free(appstat);
++}
++
++/** Adds an application statistics callback.
++ *
++ * @param[in] *c the callback to add
++ *
++ * @retval pointer to the corresponding callback entry on success
++ * @retval NULL otherwise
++ *
++ * @par Description:\n
++ *
++ */
++dessert_agentx_appstats_cb_entry_t *dessert_agentx_appstats_add(
++ dessert_agentx_appstatscb_get_t *c) {
++
++ return (_dessert_agentx_appstats_add(c, DESSERT_APPSTATS_CB_NOBULK));
++}
++
++/** Adds an application statistics bulk callback.
++ *
++ * @param[in] *c the callback to add
++ *
++ * @retval pointer to the corresponding callback entry on success
++ * @retval NULL otherwise
++ *
++ * @par Description:\n
++ *
++ */
++dessert_agentx_appstats_cb_entry_t *dessert_agentx_appstats_add_bulk(
++ dessert_agentx_appstatscb_get_t *c) {
++
++ return (_dessert_agentx_appstats_add(c, DESSERT_APPSTATS_CB_BULK));
++}
++
++/** Deletes an application statistics callback.
++ *
++ * @param *e pointer to a callback entry
++ *
++ * @retval DESSERT_OK on success
++ * @retval DESSERT_ERR otherwise
++ *
++ * @see dessert_agentx_appstats_add()
++ * @see dessert_agentx_appstats_add_bulk()
++ *
++ * @par Description:\n
++ */
++int dessert_agentx_appstats_del(dessert_agentx_appstats_cb_entry_t *e) {
++
++ if (e == NULL) {
++ return DESSERT_ERR;
++ }
++
++ pthread_rwlock_wrlock(&_dessert_appstats_cblist_lock);
++ DL_DELETE(_dessert_appstats_cblist, e);
++ pthread_rwlock_unlock(&_dessert_appstats_cblist_lock);
++
++ free(e);
++
++ return DESSERT_OK;
++}
++
++/******************************************************************************
++ * appParams
++ ******************************************************************************/
++
++/** Creates and initializes a new dessert_agentx_appparams_t.
++ *
++ * @return the new dessert_agentx_appparams_t
++ *
++ * @warning A dessert_agentx_appparams_t allocated with this function must be
++ * freed with dessert_agentx_appparams_destroy().
++ *
++ * @see dessert_agentx_appparams_destroy()
++ *
++ * @par Description:\n
++ *
++ */
++dessert_agentx_appparams_t *dessert_agentx_appparam_new() {
++ dessert_agentx_appparams_t *appparam;
++
++ appparam = malloc(sizeof(dessert_agentx_appparams_t));
++
++ memset(appparam->name,0, sizeof(appparam->name));
++ memset(appparam->desc,0, sizeof(appparam->desc));
++
++ appparam->value_type = DESSERT_APPPARAMS_VALUETYPE_BOOL;
++
++ appparam->bool = DESSERT_APPSTATS_BOOL_FALSE;
++
++ return appparam;
++}
++
++/** Frees a dessert_agentx_appparams_t.
++ *
++ * @param appparam the dessert_agentx_appparams_t to be freed
++ *
++ * @warning Only use this method to free a dessert_agentx_appparams_t which was
++ * allocated with dessert_agentx_appparams_new().
++ *
++ * @see dessert_agentx_appparams_new()
++ *
++ * @par Description:\n
++ */
++void dessert_agentx_appparam_destroy(dessert_agentx_appparams_t *appparam) {
++ free(appparam);
++}
++
++/** Adds an application parameter callback.
++ *
++ * @param[in] *c the callback to add
++ *
++ * @retval pointer to the corresponding callback entry on success
++ * @retval NULL otherwise
++ *
++ * @par Description:\n
++ *
++ */
++dessert_agentx_appparams_cb_entry_t *dessert_agentx_appparams_add(
++ dessert_agentx_appparamscb_get_t *get,
++ dessert_agentx_appparamscb_set_t *set) {
++
++ dessert_agentx_appparams_cb_entry_t *e;
++
++ e = malloc(sizeof(dessert_agentx_appparams_cb_entry_t));
++
++ if (e == NULL) {
++ dessert_err("failed to allocate buffer for new dessert_agentx_appparams_entry_t");
++ return (NULL);
++ }
++
++ e->index = _dessert_agentx_appparams_new_index();
++ e->get = get;
++ e->set = set;
++
++ pthread_rwlock_wrlock(&_dessert_appparams_cblist_lock);
++ DL_APPEND(_dessert_appparams_cblist, e);
++ pthread_rwlock_unlock(&_dessert_appparams_cblist_lock);
++
++ return (e);
++}
++
++/** Deletes an application parameter callback.
++ *
++ * @param *e pointer to a callback entry
++ *
++ * @retval DESSERT_OK on success
++ * @retval DESSERT_ERR otherwise
++ *
++ * @see dessert_agentx_appparams_add()
++ *
++ * @par Description:\n
++ */
++int dessert_agentx_appparams_del(dessert_agentx_appparams_cb_entry_t *e) {
++
++ if (e == NULL) {
++ return DESSERT_ERR;
++ }
++
++ pthread_rwlock_wrlock(&_dessert_appparams_cblist_lock);
++ DL_DELETE(_dessert_appparams_cblist, e);
++ pthread_rwlock_unlock(&_dessert_appparams_cblist_lock);
++
++ /* TODO: invalidate row*/
++
++ return DESSERT_OK;
++}
++
++/******************************************************************************
++ *
++ * INTERNAL / PRIVATE
++ *
++ * NET - S N M P // A G E N T _ X
++ *
++ ******************************************************************************/
++
++/******************************************************************************
++ * appStats
++ ******************************************************************************/
++
++void _dessert_agentx_appstats_free(dessert_agentx_appstats_t *appstat){
++ if (appstat->value_type == DESSERT_APPSTATS_VALUETYPE_OCTETSTRING
++ && appstat->octetstring != NULL) {
++ free(appstat->octetstring);
++ }
++ dessert_agentx_appstats_destroy(appstat);
++}
++
++void _dessert_agentx_appstats_free_list(
++ dessert_agentx_appstats_t **appstats_list) {
++ dessert_agentx_appstats_t *appstat;
++ dessert_agentx_appstats_t *tbf;
++
++ for (appstat = (*appstats_list); appstat;) {
++ tbf = appstat;
++ appstat = appstat->next;
++ _dessert_agentx_appstats_free(tbf);
++ }
++}
++
++int _dessert_agentx_appstats_harvest_callbacks(
++ dessert_agentx_appstats_t **appstats_list) {
++ dessert_agentx_appstats_cb_entry_t *cbe;
++ dessert_agentx_appstats_t *new_appstat;
++ dessert_agentx_appstats_t *appstat;
++ int res = 0;
++
++ pthread_rwlock_rdlock(&_dessert_appstats_cblist_lock);
++ DL_FOREACH(_dessert_appstats_cblist, cbe) {
++
++ new_appstat = dessert_agentx_appstats_new();
++ if (new_appstat == NULL) {
++ dessert_err("failed to allocate buffer for new dessert_agentx_appstats_entry_t");
++
++ dessert_err("freeing appstats harvested so far...");
++ _dessert_agentx_appstats_free_list(appstats_list);
++
++ return DESSERT_ERR;
++ }
++
++ res = cbe->c(new_appstat);
++
++ if (res == DESSERT_OK) {
++ if (cbe->isbulk_flag & DESSERT_APPSTATS_CB_NOBULK) {
++
++ DL_APPEND(*appstats_list, new_appstat);
++ } else { // DESSERT_APPSTATS_BULK
++ dessert_agentx_appstats_t temp;
++ DL_FOREACH(new_appstat, appstat ) {
++ temp.next = appstat->next;
++ temp.prev = appstat->prev;
++ DL_APPEND(*appstats_list, appstat);
++ appstat = &temp;
++ }
++ }
++ } else {
++ dessert_err("freeing list of appstats received from callback...");
++ _dessert_agentx_appstats_free_list(&new_appstat);
++ pthread_rwlock_unlock(&_dessert_appstats_cblist_lock);
++ dessert_agentx_appstats_del(cbe);
++ pthread_rwlock_rdlock(&_dessert_appstats_cblist_lock);
++ }
++
++ }
++ pthread_rwlock_unlock(&_dessert_appstats_cblist_lock);
++
++ return DESSERT_OK;
++}
++
++/******************************************************************************
++ * appParams
++ ******************************************************************************/
++
++void _dessert_agentx_appparams_free(dessert_agentx_appparams_t *appparam) {
++ if (appparam->value_type == DESSERT_APPPARAMS_VALUETYPE_OCTETSTRING
++ && appparam->octetstring != NULL) {
++ free(appparam->octetstring);
++ }
++ dessert_agentx_appparam_destroy(appparam);
++}
++
++void _dessert_agentx_appparams_free_list(
++ dessert_agentx_appparams_t **appparams_list) {
++ dessert_agentx_appparams_t *appparam;
++ dessert_agentx_appparams_t *tbf;
++
++ for (appparam = (*appparams_list); appparam;) {
++ tbf = appparam;
++ appparam = appparam->next;
++ _dessert_agentx_appparams_free(tbf);
++ }
++}
++
++int _dessert_agentx_appparams_harvest_callbacks(
++ dessert_agentx_appparams_t **appparams_list) {
++ dessert_agentx_appparams_cb_entry_t *cbe;
++ dessert_agentx_appparams_t *new_appparam;
++ int res = 0;
++
++ pthread_rwlock_rdlock(&_dessert_appparams_cblist_lock);
++ DL_FOREACH(_dessert_appparams_cblist, cbe) {
++ new_appparam = dessert_agentx_appparam_new();
++
++ if (new_appparam == NULL) {
++ dessert_err("failed to allocate buffer for new dessert_agentx_appparams_entry_t");
++
++ dessert_err("freeing appstats harvested so far...");
++ _dessert_agentx_appparams_free_list(appparams_list);
++
++ return DESSERT_ERR;
++ }
++
++ res = cbe->get(new_appparam);
++ new_appparam->index = cbe->index;
++
++ if (res == DESSERT_OK) {
++ DL_APPEND(*appparams_list, new_appparam);
++ } else {
++ _dessert_agentx_appparams_free(new_appparam);
++ pthread_rwlock_unlock(&_dessert_appparams_cblist_lock);
++ dessert_agentx_appparams_del(cbe);
++ pthread_rwlock_rdlock(&_dessert_appparams_cblist_lock);
++ }
++
++ } // DL_FOREACH
++
++ pthread_rwlock_unlock(&_dessert_appparams_cblist_lock);
++
++ return DESSERT_OK;
++}
++
++dessert_agentx_appparamscb_set_t *_dessert_agentx_appparams_getsettercbforindex(
++ int index) {
++ dessert_agentx_appparams_cb_entry_t *cbe;
++
++ pthread_rwlock_rdlock(&_dessert_appparams_cblist_lock);
++ DL_FOREACH(_dessert_appparams_cblist, cbe)
++ if (cbe->index == index)
++ break;
++ pthread_rwlock_unlock(&_dessert_appparams_cblist_lock);
++
++ if (cbe->index == index)
++
++ return cbe->set;
++ else {
++
++ return NULL;
++ }
++}
++
++/******************************************************************************
++ * other
++ ******************************************************************************/
++
++/** setup and initialize net-snmp subagent (via agent x)*/
++void _dessert_agentx_init_subagent() {
++ /**************************************************************************
++ * setup snmp handling....
++ *************************************************************************/
++
++ pthread_t snmp_worker;
++
++ snmp_enable_calllog();
++ //debug_register_tokens("trace");
++ //debug_register_tokens("tdomain");
++ debug_register_tokens(AGENT);
++ //debug_register_tokens("snmp_agent");
++ //debug_register_tokens("helper:table:req");
++
++ debug_register_tokens("dessertAppParamsTable");
++ debug_register_tokens("verbose:dessertAppParamsTable");
++ debug_register_tokens("internal:dessertAppParamsTable");
++
++ debug_register_tokens("dessertAppParamsTable");
++ debug_register_tokens("verbose:dessertAppStatsTable");
++ debug_register_tokens("internal:dessertAppStatsTable");
++
++ snmp_set_do_debugging(1);
++
++ netsnmp_log_handler *logh;
++
++ logh = netsnmp_register_loghandler(NETSNMP_LOGHANDLER_FILE, LOG_DEBUG);
++ if (logh) {
++ logh->pri_max = LOG_EMERG;
++ logh->token = strdup("/tmp/dessertAGENTX.log");
++ }
++
++ netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_ROLE, 1);
++
++ //SOCK_STARTUP;
++ init_agent(AGENT);
++
++ /*
++ * initialize the scalars
++ */
++ init_dessertObjects();
++
++ /*
++ * init dessert{Mesh, Sys}ifTable mib code
++ */
++ init_dessertMeshifTable();
++ init_dessertSysifTable();
++
++ /*
++ * init dessertApp{Stats, Param}Table mib code
++ */
++ init_dessertAppParamsTable();
++ init_dessertAppStatsTable();
++
++ init_snmp(AGENT);
++ DEBUGMSGTL((AGENT, "Initialized agent and snmp.\n"));
++
++ pthread_create(&snmp_worker, NULL, _dessert_agentx_worker, NULL);
++}
++
++void dessert_agentx_stop_subagent() {
++ keep_snmp_running = 0;
++}
++
++/******************************************************************************
++ *
++ * LOCAL
++ *
++ * NET - S N M P // A G E N T _ X
++ *
++ ******************************************************************************/
++
++static dessert_agentx_appstats_cb_entry_t *_dessert_agentx_appstats_add(
++ dessert_agentx_appstatscb_get_t *c, uint8_t bulknobulk_flag) {
++
++ dessert_agentx_appstats_cb_entry_t *e;
++
++ e = malloc(sizeof(dessert_agentx_appstats_cb_entry_t));
++
++ if (e == NULL) {
++ dessert_err("failed to allocate buffer for new dessert_agentx_appstats_entry_t");
++ return (NULL);
++ }
++
++ e->isbulk_flag |= bulknobulk_flag;
++ e->c = c;
++
++ pthread_rwlock_wrlock(&_dessert_appstats_cblist_lock);
++ DL_APPEND(_dessert_appstats_cblist, e);
++ pthread_rwlock_unlock(&_dessert_appstats_cblist_lock);
++
++ return (e);
++}
++
++static uint8_t _dessert_agentx_appparams_new_index(void) {
++ uint8_t index;
++
++ pthread_mutex_lock(&_dessert_agentx_appparams_nextindex_mutex);
++ index = _dessert_agentx_appparams_nextindex++;
++ pthread_mutex_unlock(&_dessert_agentx_appparams_nextindex_mutex);
++
++ return index;
++}
++
++static void *_dessert_agentx_worker(void *arg) {
++ DEBUGMSGTL((AGENT, "snmp_worker running...\n"));
++ dessert_info("snmp_worker running...");
++
++ while (keep_snmp_running) {
++ /*
++ * if you use select(), see snmp_select_info() in snmp_api(3)
++ */
++ /*
++ * --- OR ---
++ */
++ agent_check_and_process(1); /* 0 == don't block */
++ }
++
++ dessert_info("snmp_worker exiting...");
++
++ return (NULL);
++}
+diff --git a/src/libdessert/dessert_cli.c b/src/libdessert/dessert_cli.c
+new file mode 100644
+index 0000000..7b0d3c7
+--- /dev/null
++++ b/src/libdessert/dessert_cli.c
+@@ -0,0 +1,257 @@
++/******************************************************************************
++ Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
++ All rights reserved.
++
++ These sources were originally developed by Philipp Schmidt
++ at Freie Universitaet Berlin (http://www.fu-berlin.de/),
++ Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
++ (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
++ ------------------------------------------------------------------------------
++ This program is free software: you can redistribute it and/or modify it under
++ the terms of the GNU General Public License as published by the Free Software
++ Foundation, either version 3 of the License, or (at your option) any later
++ version.
++
++ This program is distributed in the hope that it will be useful, but WITHOUT
++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
++ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along with
++ this program. If not, see http://www.gnu.org/licenses/ .
++ ------------------------------------------------------------------------------
++ For further information and questions please use the web site
++ http://www.des-testbed.net/
++ *******************************************************************************/
++
++#include "config.h"
++
++#include "dessert_internal.h"
++#include <dessert/dessert.h>
++
++#ifndef HOST_NAME_MAX
++#define HOST_NAME_MAX 32
++#endif
++
++/* global data storage // P U B L I C */
++struct cli_def *dessert_cli;
++struct cli_command *dessert_cli_show;
++struct cli_command *dessert_cli_cfg_iface;
++struct cli_command *dessert_cli_cfg_no;
++struct cli_command *dessert_cli_cfg_no_iface;
++struct cli_command *dessert_cli_cfg_logging;
++struct cli_command *dessert_cli_cfg_no_logging;
++
++/* global data storage // P R I V A T E */
++/* nothing here - yet */
++
++/* local data storage*/
++int _dessert_cli_sock;
++struct sockaddr_in6 _dessert_cli_addr;
++char _dessert_cli_hostname[HOST_NAME_MAX + DESSERT_PROTO_STRLEN + 1];
++pthread_t _dessert_cli_worker;
++
++/* internal functions forward declarations*/
++static void *_dessert_cli_accept_thread(void* arg);
++static int _dessert_cli_cmd_dessertinfo(struct cli_def *cli, char *command,
++ char *argv[], int argc);
++
++/******************************************************************************
++ *
++ * EXTERNAL / PUBLIC
++ *
++ * C L I - C O M M A N D L I N E I N T E R F A C E
++ *
++ ******************************************************************************/
++
++/** Start up the command line interface.
++ *
++ * @param[in] port port to listen on
++ *
++ * @retval DESSERT_OK on success
++ * @retval -errno otherwise
++ *
++ * %DESCRIPTION:
++ *
++ */
++int dessert_cli_run(int port) {
++ int on = 1;
++
++ /* listen for connections */
++ _dessert_cli_sock = socket(AF_INET6, SOCK_STREAM, 0);
++ setsockopt(_dessert_cli_sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
++ memset(&_dessert_cli_addr, 0, sizeof(_dessert_cli_addr));
++ _dessert_cli_addr.sin6_family = AF_INET6;
++ _dessert_cli_addr.sin6_addr = in6addr_any;
++ _dessert_cli_addr.sin6_port = htons(port);
++ if (bind(_dessert_cli_sock, (struct sockaddr *) &_dessert_cli_addr,
++ sizeof(_dessert_cli_addr))) {
++ dessert_err("cli socket bind to port %d failed - %s", port, strerror(errno));
++ return -errno;
++ }
++ listen(_dessert_cli_sock, 8);
++ dessert_debug("starting worker thread for cli");
++ pthread_create(&_dessert_cli_worker, NULL, _dessert_cli_accept_thread,
++ &_dessert_cli_sock);
++ return DESSERT_OK;
++}
++
++/******************************************************************************
++ *
++ * INTERNAL / PRIVATE
++ *
++ * C L I - C O M M A N D L I N E I N T E R F A C E
++ *
++ ******************************************************************************/
++
++/** internal function to initialize libcli */
++int _dessert_cli_init() {
++
++ dessert_cli = cli_init();
++
++ /* set host name */
++ memset(_dessert_cli_hostname, 0x0, HOST_NAME_MAX + DESSERT_PROTO_STRLEN + 1);
++ gethostname(_dessert_cli_hostname, HOST_NAME_MAX);
++ strncpy(_dessert_cli_hostname + strlen(_dessert_cli_hostname), ":", 1);
++ strncpy(_dessert_cli_hostname + strlen(_dessert_cli_hostname),
++ dessert_proto, DESSERT_PROTO_STRLEN);
++ cli_set_hostname(dessert_cli, _dessert_cli_hostname);
++
++ /* initialize show commands */
++ dessert_cli_show = cli_register_command(dessert_cli, NULL, "show", NULL,
++ PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "display information");
++ cli_register_command(dessert_cli, dessert_cli_show, "dessert-info",
++ _dessert_cli_cmd_dessertinfo, PRIVILEGE_UNPRIVILEGED, MODE_EXEC,
++ "display information about this program");
++ cli_register_command(dessert_cli, dessert_cli_show, "logging",
++ _dessert_cli_cmd_logging, PRIVILEGE_UNPRIVILEGED, MODE_EXEC,
++ "show logging ringbuffer");
++
++ /* initialize config mode commands */
++ dessert_cli_cfg_iface = cli_register_command(dessert_cli, NULL,
++ "interface", NULL, PRIVILEGE_PRIVILEGED, MODE_CONFIG,
++ "create or configure interfaces");
++ dessert_cli_cfg_no = cli_register_command(dessert_cli, NULL, "no", NULL,
++ PRIVILEGE_PRIVILEGED, MODE_CONFIG, "negate command");
++ dessert_cli_cfg_no_iface = cli_register_command(dessert_cli,
++ dessert_cli_cfg_no, "interface", NULL, PRIVILEGE_PRIVILEGED,
++ MODE_CONFIG, "remove interface or negate interface config");
++ dessert_cli_cfg_logging = cli_register_command(dessert_cli, NULL,
++ "logging", NULL, PRIVILEGE_PRIVILEGED, MODE_CONFIG,
++ "change logging config");
++ dessert_cli_cfg_no_logging = cli_register_command(dessert_cli,
++ dessert_cli_cfg_no, "logging", NULL, PRIVILEGE_PRIVILEGED,
++ MODE_CONFIG, "disable logging for...");
++ cli_register_command(dessert_cli, dessert_cli_cfg_logging, "ringbuffer",
++ _dessert_cli_logging_ringbuffer, PRIVILEGE_PRIVILEGED, MODE_CONFIG,
++ "set logging ringbuffer size (in lines)");
++ cli_register_command(dessert_cli, dessert_cli_cfg_no_logging, "ringbuffer",
++ _dessert_cli_logging_ringbuffer, PRIVILEGE_PRIVILEGED, MODE_CONFIG,
++ "disable logging to ringbuffer");
++ cli_register_command(dessert_cli, dessert_cli_cfg_logging, "file",
++ _dessert_cli_logging_file, PRIVILEGE_PRIVILEGED, MODE_CONFIG,
++ "set logfile and enable file logging");
++ cli_register_command(dessert_cli, dessert_cli_cfg_no_logging, "file",
++ _dessert_cli_logging_file, PRIVILEGE_PRIVILEGED, MODE_CONFIG,
++ "set logfile disable file logging");
++
++ /* initialize other commands */
++ cli_register_command(dessert_cli, NULL, "shutdown",
++ _dessert_cli_cmd_shutdown, PRIVILEGE_PRIVILEGED, MODE_EXEC,
++ "shut daemon down");
++
++ return DESSERT_OK;
++}
++
++/******************************************************************************
++ *
++ * LOCAL
++ *
++ * C L I - C O M M A N D L I N E I N T E R F A C E
++ *
++ ******************************************************************************/
++
++/** command "show dessert-info" */
++static int _dessert_cli_cmd_dessertinfo(struct cli_def *cli, char *command,
++ char *argv[], int argc) {
++ cli_print(cli, "\nprotocol running: %s v %d", dessert_proto, dessert_ver);
++ cli_print(cli, "libdessert version: %s", VERSION);
++ cli_print(
++ cli,
++ " ------------------------------------------------------------------------------ ");
++ cli_print(
++ cli,
++ " Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB). ");
++ cli_print(
++ cli,
++ " All rights reserved. ");
++ cli_print(
++ cli,
++ " ");
++ cli_print(
++ cli,
++ " These sources were originally developed by Philipp Schmidt ");
++ cli_print(
++ cli,
++ " at Freie Universitaet Berlin (http://www.fu-berlin.de/), ");
++ cli_print(
++ cli,
++ " Computer Systems and Telematics / Distributed, Embedded Systems (DES) group ");
++ cli_print(
++ cli,
++ " (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/) ");
++ cli_print(
++ cli,
++ " ------------------------------------------------------------------------------ ");
++ cli_print(
++ cli,
++ " This program is free software: you can redistribute it and/or modify it under ");
++ cli_print(
++ cli,
++ " the terms of the GNU General Public License as published by the Free Software ");
++ cli_print(
++ cli,
++ " Foundation, either version 3 of the License, or (at your option) any later ");
++ cli_print(
++ cli,
++ " version. ");
++ cli_print(
++ cli,
++ " ");
++ cli_print(
++ cli,
++ " This program is distributed in the hope that it will be useful, but WITHOUT ");
++ cli_print(
++ cli,
++ " ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ");
++ cli_print(
++ cli,
++ " FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ");
++ cli_print(
++ cli,
++ " ");
++ cli_print(
++ cli,
++ " You should have received a copy of the GNU General Public License along with ");
++ cli_print(
++ cli,
++ " this program. If not, see http://www.gnu.org/licenses/ . ");
++ cli_print(
++ cli,
++ " ------------------------------------------------------------------------------ ");
++ return CLI_OK;
++}
++
++/** internal thread function running the cli */
++static void *_dessert_cli_accept_thread(void* arg) {
++ int *s = (int *) arg;
++ int c;
++
++ while ((c = accept(*s, NULL, 0))) {
++ cli_loop(dessert_cli, c); /* pass the connection off to libcli */
++ close(c);
++ }
++
++ cli_done(dessert_cli); /* free data structures */
++
++ return (NULL);
++}
+diff --git a/src/libdessert/dessert_core.c b/src/libdessert/dessert_core.c
+new file mode 100644
+index 0000000..7a1e16c
+--- /dev/null
++++ b/src/libdessert/dessert_core.c
+@@ -0,0 +1,241 @@
++/******************************************************************************
++ Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
++ All rights reserved.
++
++ These sources were originally developed by Philipp Schmidt
++ at Freie Universitaet Berlin (http://www.fu-berlin.de/),
++ Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
++ (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
++ ------------------------------------------------------------------------------
++ This program is free software: you can redistribute it and/or modify it under
++ the terms of the GNU General Public License as published by the Free Software
++ Foundation, either version 3 of the License, or (at your option) any later
++ version.
++
++ This program is distributed in the hope that it will be useful, but WITHOUT
++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
++ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along with
++ this program. If not, see http://www.gnu.org/licenses/ .
++ ------------------------------------------------------------------------------
++ For further information and questions please use the web site
++ http://www.des-testbed.net/
++ *******************************************************************************/
++
++#include "dessert_internal.h"
++#include <dessert/dessert.h>
++#include <sys/stat.h>
++
++/* global data storage // P U B L I C */
++char dessert_proto[DESSERT_PROTO_STRLEN + 1];
++u_int8_t dessert_ver;
++u_int8_t dessert_l25_defsrc[ETHER_ADDR_LEN];
++u_char ether_broadcast[ETHER_ADDR_LEN];
++u_char ether_null[ETHER_ADDR_LEN];
++pthread_rwlock_t dessert_cfglock = PTHREAD_RWLOCK_INITIALIZER;
++
++/* global data storage // P R I V A T E */
++int _dessert_status = 0x0;
++
++/* local data storage*/
++dessert_frameid_t _dessert_nextframeid = 0;
++pthread_mutex_t _dessert_nextframeid_mutex = PTHREAD_MUTEX_INITIALIZER;
++pthread_mutex_t _dessert_exit_mutex = PTHREAD_MUTEX_INITIALIZER;
++pthread_cond_t _dessert_exit_do = PTHREAD_COND_INITIALIZER;
++int _dessert_exit_code = 0;
++char *dessert_pidfile_name;
++
++/* internal functions forward declarations*/
++static void _dessert_cleanup(void);
++static void _dessert_daemonize(void);
++static int _dessert_pid(char* pidfile);
++
++/******************************************************************************
++ *
++ * EXTERNAL / PUBLIC
++ *
++ * C O R E
++ *
++ ******************************************************************************/
++
++/** Initializes dessert framework and sets up logging
++ * @arg *proto 4 char string for protocol name
++ * @arg version version number of protocol
++ * @arg opts @see DESSERT_OPT_*
++ * @returns DESSERT_OK on success, DESSERT_ERR otherwise
++ **/
++int dessert_init(const char* proto, int version, uint16_t opts, char* pidfile) {
++
++ pthread_rwlock_wrlock(&dessert_cfglock);
++
++ /* save global config */
++ memset(dessert_proto, 0x0, DESSERT_PROTO_STRLEN + 1);
++ strncpy(dessert_proto, proto, DESSERT_PROTO_STRLEN);
++ dessert_ver = version;
++
++ /* initialize pseudo constants */
++ memset(ether_broadcast, 255, ETHER_ADDR_LEN);
++ memset(ether_null, 0, ETHER_ADDR_LEN);
++
++ pthread_rwlock_unlock(&dessert_cfglock);
++
++ /* daemonize if needed */
++ if ((opts & DESSERT_OPT_DAEMONIZE) && !(opts & DESSERT_OPT_NODAEMONIZE)) {
++ _dessert_daemonize();
++ }
++
++ /* write pid to file if needed */
++ if (pidfile != NULL) {
++ dessert_pidfile_name = pidfile;
++ _dessert_pid(pidfile);
++ }
++
++ /* initialize cli */
++ _dessert_cli_init();
++
++ /* start periodic thread */
++ _dessert_periodic_init();
++
++ /* initialize net-snmp subagent */
++ _dessert_agentx_init_subagent();
++
++ return DESSERT_OK;
++}
++
++/** main loop - wait until dessert_exit() is called or killed
++ * @return arg to dessert_exit
++ */
++int dessert_run() {
++ pthread_mutex_lock(&_dessert_exit_mutex);
++ pthread_cond_wait(&_dessert_exit_do, &_dessert_exit_mutex);
++ _dessert_cleanup();
++ pthread_mutex_unlock(&_dessert_exit_mutex);
++ return (_dessert_exit_code);
++}
++
++/**Causes dessert_run() to break out of the main loop.
++ */
++void dessert_exit() {
++ /* kill snmp_worker thread */
++ dessert_agentx_stop_subagent();
++ pthread_cond_signal(&_dessert_exit_do);
++}
++
++/** generates a new, runtime-unique frame id
++ * @returns runtime-unique frame id
++ **/
++dessert_frameid_t _dessert_newframeid() {
++ dessert_frameid_t x;
++ pthread_mutex_lock(&_dessert_nextframeid_mutex);
++ x = _dessert_nextframeid++;
++ pthread_mutex_unlock(&_dessert_nextframeid_mutex);
++ return (x);
++}
++
++/******************************************************************************
++ *
++ * INTERNAL / PRIVATE
++ *
++ * C O R E
++ *
++ ******************************************************************************/
++
++/** command "shutdown" */
++int _dessert_cli_cmd_shutdown(struct cli_def *cli, char *command, char *argv[],
++ int argc) {
++ cli_print(cli, "daemon will shut down now!");
++ pthread_mutex_lock(&_dessert_exit_mutex);
++ pthread_cond_broadcast(&_dessert_exit_do);
++ pthread_mutex_unlock(&_dessert_exit_mutex);
++
++ return CLI_OK;
++}
++
++/******************************************************************************
++ *
++ * LOCAL
++ *
++ * C O R E
++ *
++ ******************************************************************************/
++
++/** internal function to clean up things */
++void _dessert_cleanup(void) {
++ /* remove pidfile */
++ if (dessert_pidfile_name != NULL) {
++ unlink(dessert_pidfile_name);
++ }
++}
++
++/** internal daemonize helper */
++void _dessert_daemonize(void) {
++ pid_t pid, sid;
++
++ /* Fork off the parent process */
++ pid = fork();
++ if (pid < 0) {
++ perror("could not create daemon process!");
++ exit(EXIT_FAILURE);
++ }
++ /* If we got a good PID, then
++ we can exit the parent process. */
++ if (pid > 0) {
++ exit(EXIT_SUCCESS);
++ }
++
++ /* Change the file mode mask */
++ umask(0);
++
++ /* Open any logs here */
++
++ /* Create a new SID for the child process */
++ sid = setsid();
++ if (sid < 0) {
++ perror("could not set sid!");
++ exit(EXIT_FAILURE);
++ }
++
++ /* Change the current working directory */
++ if ((chdir("/")) < 0) {
++ perror("could not chdir /!");
++ exit(EXIT_FAILURE);
++ }
++
++ /* Close out the standard file descriptors */
++ close(STDIN_FILENO);
++ close(STDOUT_FILENO);
++ close(STDERR_FILENO);
++
++ /* write config */
++ pthread_rwlock_wrlock(&dessert_cfglock);
++ _dessert_status |= _DESSERT_STATUS_DAEMON;
++ pthread_rwlock_unlock(&dessert_cfglock);
++
++ /* adopt logging */
++ dessert_logcfg(0x0);
++}
++
++/** internal pid-write helper */
++int _dessert_pid(char* pidfile) {
++ FILE *fd;
++
++ fd = fopen(pidfile, "w");
++ if (fd == 0) {
++ dessert_warn("could not open pid file");
++ return 1;
++ } else {
++ int r;
++ r = fprintf(fd, "%d\n", getpid());
++ if (r < 0) {
++ dessert_warn("could not write to pid file");
++ return DESSERT_ERR;
++ }
++
++ if (fclose(fd) != 0) {
++ dessert_warn("failed to close pid file");
++ }
++ }
++
++ return DESSERT_OK;
++}
+diff --git a/src/libdessert/dessert_internal.h b/src/libdessert/dessert_internal.h
+new file mode 100644
+index 0000000..270b181
+--- /dev/null
++++ b/src/libdessert/dessert_internal.h
+@@ -0,0 +1,219 @@
++/******************************************************************************
++ Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
++ All rights reserved.
++
++ These sources were originally developed by Philipp Schmidt
++ at Freie Universitaet Berlin (http://www.fu-berlin.de/),
++ Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
++ (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
++ ------------------------------------------------------------------------------
++ This program is free software: you can redistribute it and/or modify it under
++ the terms of the GNU General Public License as published by the Free Software
++ Foundation, either version 3 of the License, or (at your option) any later
++ version.
++
++ This program is distributed in the hope that it will be useful, but WITHOUT
++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
++ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along with
++ this program. If not, see http://www.gnu.org/licenses/ .
++ ------------------------------------------------------------------------------
++ For further information and questions please use the web site
++ http://www.des-testbed.net/
++*******************************************************************************/
++
++#ifndef DESSERT_INTERNAL_H
++#define DESSERT_INTERNAL_H
++
++/* load needed libs - quite dirty */
++#include <stdlib.h>
++#include <stdio.h>
++#include <fcntl.h>
++#include <string.h>
++#include <stdarg.h>
++#include <unistd.h>
++#include <errno.h>
++#include <pthread.h>
++#include <syslog.h>
++#include <sys/socket.h>
++#include <sys/ioctl.h>
++#include <sys/sysctl.h>
++#include <net/route.h>
++#include <arpa/inet.h>
++#include <netinet/in.h>
++#include <libcli.h>
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++#include <dessert/utlist.h>
++
++/* internal snmp includes */
++#include "dessertObjects.h"
++#include "dessertMeshifTable.h"
++#include "dessertSysifTable.h"
++#include "dessertAppStatsTable.h"
++#include "dessertAppParamsTable.h"
++
++/******************************************************************************
++ *
++ * INTERNAL / PRIVATE
++ *
++ * C O R E
++ *
++ ******************************************************************************/
++
++/** flag for _dessert_status - program is daemon */
++#define _DESSERT_STATUS_DAEMON 0x1
++
++/** global status flag holder */
++extern int _dessert_status;
++
++dessert_frameid_t _dessert_newframeid(void);
++
++int _dessert_cli_cmd_shutdown(struct cli_def *cli, char *command, char *argv[], int argc);
++
++/******************************************************************************
++ *
++ * INTERNAL / PRIVATE
++ *
++ * C L I - C O M M A N D L I N E I N T E R F A C E
++ *
++ ******************************************************************************/
++
++int _dessert_cli_init(void);
++
++/******************************************************************************
++ *
++ * INTERNAL / PRIVATE
++ *
++ * L O G F A C I L I T Y
++ *
++ ******************************************************************************/
++
++/** maximum size of a log line */
++#define DESSERT_LOGLINE_MAX 1024
++
++/** logfile file pointer to use with DESSERT_OPT_LOGFILE */
++extern FILE *dessert_logfd;
++
++int _dessert_cli_cmd_logging(struct cli_def *cli, char *command, char *argv[], int argc);
++int _dessert_cli_logging_file(struct cli_def *cli, char *command, char *argv[], int argc);
++int _dessert_cli_no_logging_file(struct cli_def *cli, char *command, char *argv[], int argc);
++int _dessert_cli_logging_ringbuffer(struct cli_def *cli, char *command, char *argv[], int argc);
++int _dessert_cli_no_logging_ringbuffer(struct cli_def *cli, char *command, char *argv[], int argc);
++
++/******************************************************************************
++ *
++ * INTERNAL / PRIVATE
++ *
++ * M E S H - I N T E R F A C E S
++ *
++ ******************************************************************************/
++
++/** callback list entry for dessert mesh interface callbacks */
++typedef struct dessert_meshrxcbe {
++ /** pointer to callback to call */
++ dessert_meshrxcb_t *c;
++ /** priority - lowest first */
++ int prio;
++ /** next entry in list */
++ struct dessert_meshrxcbe *next;
++} dessert_meshrxcbe_t;
++
++int _dessert_meshif_gethwaddr(dessert_meshif_t *meshif);
++int _dessert_meshrxcb_runall(dessert_msg_t* msg_in, size_t len, dessert_msg_proc_t *proc_in, const dessert_meshif_t *meshif, dessert_frameid_t id);
++
++/******************************************************************************
++ *
++ * INTERNAL / PRIVATE
++ *
++ * S Y S - I N T E R F A C E S
++ *
++ ******************************************************************************/
++
++/** callback list entry for tun/tap callbacks */
++typedef struct dessert_sysrxcbe {
++ /** pointer to callback to call */
++ dessert_sysrxcb_t *c;
++ /** priority - lowest first */
++ int prio;
++ /** next entry in list */
++ struct dessert_sysrxcbe *next;
++} dessert_sysrxcbe_t;
++
++extern struct dessert_sysif *_dessert_sysif;
++
++/******************************************************************************
++ *
++ * INTERNAL / PRIVATE
++ *
++ * M E S S A G E H A N D L I N G
++ *
++ ******************************************************************************/
++
++/** size of a dessert_msg struct */
++#define DESSERT_MSGLEN sizeof(struct dessert_msg)
++
++/** size of a dessert_msg_proc struct */
++#define DESSERT_MSGPROCLEN sizeof(struct dessert_msg_proc)
++
++/** maximum frame size to assemble as dessert_msg */
++#define DESSERT_MAXFRAMEBUFLEN DESSERT_MAXFRAMELEN
++
++/******************************************************************************
++ *
++ * INTERNAL / PRIVATE
++ *
++ * P E R I O D I C T A S K S
++ *
++ ******************************************************************************/
++
++void _dessert_periodic_init(void);
++
++/******************************************************************************
++ *
++ * INTERNAL / PRIVATE
++ *
++ * NET - S N M P // A G E N T _ X
++ *
++ ******************************************************************************/
++
++/******************************************************************************
++ * #defines
++ ******************************************************************************/
++
++#define AGENT "dessertAGENTX"
++
++#define DESSERT_AGENTX_SYSIFTABLE_CACHE_TIMEOUT 10
++#define DESSERT_AGENTX_MESHIFTABLE_CACHE_TIMEOUT 10
++#define DESSERT_AGENTX_APPSTATSTABLE_CACHE_TIMEOUT 10
++#define DESSERT_AGENTX_APPPARAMTABLE_CACHE_TIMEOUT 1
++
++/******************************************************************************
++ * globals
++ ******************************************************************************/
++
++extern pthread_rwlock_t _dessert_appstats_cblist_lock;
++extern dessert_agentx_appstats_cb_entry_t *_dessert_appstats_cblist;
++
++extern pthread_rwlock_t _dessert_appparams_cblist_lock;
++extern dessert_agentx_appparams_cb_entry_t *_dessert_appparams_cblist;
++
++/******************************************************************************
++ * functions
++ ******************************************************************************/
++int _dessert_agentx_appstats_harvest_callbacks(dessert_agentx_appstats_t **appstats_list);
++void _dessert_agentx_appstats_free(dessert_agentx_appstats_t *appstat);
++void _dessert_agentx_appstats_free_list(dessert_agentx_appstats_t **appstats_list);
++
++int _dessert_agentx_appparams_harvest_callbacks(dessert_agentx_appparams_t **appparams_list);
++void _dessert_agentx_appparams_free(dessert_agentx_appparams_t *appparam);
++void _dessert_agentx_appparams_free_list(dessert_agentx_appparams_t **appparams_list);
++dessert_agentx_appparamscb_set_t *_dessert_agentx_appparams_getsettercbforindex(int index);
++
++void _dessert_agentx_init_subagent(void);
++void dessert_agentx_stop_subagent(void);
++
++
++#endif /* DESSERT_INTERNAL_H */
+diff --git a/src/libdessert/dessert_log.c b/src/libdessert/dessert_log.c
+new file mode 100644
+index 0000000..01f2728
+--- /dev/null
++++ b/src/libdessert/dessert_log.c
+@@ -0,0 +1,417 @@
++/******************************************************************************
++ Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
++ All rights reserved.
++
++ These sources were originally developed by Philipp Schmidt
++ at Freie Universitaet Berlin (http://www.fu-berlin.de/),
++ Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
++ (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
++ ------------------------------------------------------------------------------
++ This program is free software: you can redistribute it and/or modify it under
++ the terms of the GNU General Public License as published by the Free Software
++ Foundation, either version 3 of the License, or (at your option) any later
++ version.
++
++ This program is distributed in the hope that it will be useful, but WITHOUT
++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
++ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along with
++ this program. If not, see http://www.gnu.org/licenses/ .
++ ------------------------------------------------------------------------------
++ For further information and questions please use the web site
++ http://www.des-testbed.net/
++ *******************************************************************************/
++
++#include "dessert_internal.h"
++#include <dessert/dessert.h>
++#include <sys/stat.h>
++
++/* data storage */
++FILE *dessert_logfd = NULL;
++char dessert_logprefix[12];
++
++#define _DESSERT_LOGFLAG_SYSLOG 0x1
++#define _DESSERT_LOGFLAG_LOGFILE 0x2
++#define _DESSERT_LOGFLAG_STDERR 0x4
++#define _DESSERT_LOGFLAG_RBUF 0x8
++int _dessert_logflags = _DESSERT_LOGFLAG_STDERR;
++int _dessert_loglevel = LOG_DEBUG;
++
++/* the logging ringbuffer */
++char *_dessert_logrbuf = NULL; /* pointer to begin */
++int _dessert_logrbuf_len = 0; /* length in lines (DESSERT_LOGLINE_MAX*_dessert_logrbuf_len*sizeof(char) would be in bytes) */
++int _dessert_logrbuf_cur = 0; /* current position */
++int _dessert_logrbuf_used = 0; /* used slots */
++pthread_rwlock_t _dessert_logrbuf_len_lock = PTHREAD_RWLOCK_INITIALIZER; /* for resizing */
++pthread_mutex_t _dessert_logrbuf_mutex = PTHREAD_MUTEX_INITIALIZER; /* for moving _dessert_logrbuf_cur */
++
++/* internal functions forward declarations TODO: cleanup */
++
++/******************************************************************************
++ *
++ * EXTERNAL / PUBLIC
++ *
++ * L O G F A C I L I T Y
++ *
++ ******************************************************************************/
++
++/** Configure dessert logging framework and sets up logging.
++ *
++ * @arg opts OR'd flags - @see DESSERT_LOG_*
++ *
++ * %DESCRIPTION:
++ *
++ **/
++int dessert_logcfg(uint16_t opts) {
++ snprintf(dessert_logprefix, 12, "dessert/%s", dessert_proto);
++
++ pthread_rwlock_wrlock(&dessert_cfglock);
++
++ /* configure logging */
++ if ((opts & DESSERT_LOG_SYSLOG) && !(opts & DESSERT_LOG_NOSYSLOG)) {
++ if (!(_dessert_logflags & _DESSERT_LOGFLAG_SYSLOG)) {
++ /* initialize syslog channel */
++ openlog(dessert_logprefix, LOG_PID, LOG_DAEMON);
++ }
++ _dessert_logflags |= _DESSERT_LOGFLAG_SYSLOG;
++ } else if (!(opts & DESSERT_LOG_SYSLOG) && (opts & DESSERT_LOG_NOSYSLOG)) {
++ if (_dessert_logflags & _DESSERT_LOGFLAG_SYSLOG) {
++ /* close syslog channel */
++ closelog();
++ }
++ _dessert_logflags &= ~_DESSERT_LOGFLAG_SYSLOG;
++ }
++ if ((opts & DESSERT_LOG_STDERR) && !(opts & DESSERT_LOG_NOSTDERR)
++ && !(_dessert_status & _DESSERT_STATUS_DAEMON)) {
++ _dessert_logflags |= _DESSERT_LOGFLAG_STDERR;
++ } else if ((!(opts & DESSERT_LOG_STDERR) && (opts & DESSERT_LOG_NOSTDERR))
++ || (_dessert_status & _DESSERT_STATUS_DAEMON)) {
++ _dessert_logflags &= ~_DESSERT_LOGFLAG_STDERR;
++ }
++ if ((opts & DESSERT_LOG_FILE) && !(opts & DESSERT_LOG_NOFILE)
++ && dessert_logfd != NULL) {
++ _dessert_logflags |= _DESSERT_LOGFLAG_LOGFILE;
++ } else if ((!(opts & DESSERT_LOG_FILE) && (opts & DESSERT_LOG_NOFILE))
++ || dessert_logfd == NULL) {
++ _dessert_logflags &= ~_DESSERT_LOGFLAG_LOGFILE;
++ }
++ if ((opts & DESSERT_LOG_DEBUG) && !(opts & DESSERT_LOG_NODEBUG)) {
++ _dessert_loglevel = LOG_DEBUG;
++ } else if (!(opts & DESSERT_LOG_DEBUG) && (opts & DESSERT_LOG_NODEBUG)) {
++ _dessert_loglevel = LOG_INFO;
++ }
++ if ((opts & DESSERT_LOG_RBUF) && !(opts & DESSERT_LOG_NORBUF)) {
++ _dessert_logflags |= _DESSERT_LOGFLAG_RBUF;
++ } else if (!(opts & DESSERT_LOG_RBUF) && (opts & DESSERT_LOG_NORBUF)) {
++ _dessert_logflags &= ~_DESSERT_LOGFLAG_RBUF;
++ }
++
++ pthread_rwlock_unlock(&dessert_cfglock);
++
++ return 0;
++}
++
++/******************************************************************************
++ *
++ * INTERNAL / PRIVATE
++ *
++ * L O G F A C I L I T Y
++ *
++ ******************************************************************************/
++
++char* _dessert_log_rbuf_nextline(void) {
++ char* r = NULL;
++ pthread_mutex_lock(&_dessert_logrbuf_mutex);
++ if (_dessert_logrbuf_len > 0) {
++ if (_dessert_logrbuf_cur >= _dessert_logrbuf_len) {
++ _dessert_logrbuf_cur = 0;
++ }
++ r = _dessert_logrbuf + (DESSERT_LOGLINE_MAX * _dessert_logrbuf_cur);
++ _dessert_logrbuf_cur++;
++ if (_dessert_logrbuf_used < _dessert_logrbuf_len - 1) {
++ _dessert_logrbuf_used++;
++ }
++ }
++ pthread_mutex_unlock(&_dessert_logrbuf_mutex);
++
++ return (r);
++}
++
++/** internal log function
++ *
++ * @internal
++ *
++ * @param[in] level loglevel from <syslog.h>
++ * @param[in] *func function name called from
++ * @param[in] *file file name called from
++ * @param[in] *line line called from
++ * @param[in] *fmt printf format string
++ * @param[in] ... (var-arg) printf like variables
++ **/
++void _dessert_log(int level, const char* func, const char* file, int line,
++ const char *fmt, ...) {
++ va_list args;
++ char *rbuf_line = NULL;
++ char buf[DESSERT_LOGLINE_MAX];
++ char lf[80];
++ char *lt;
++ char lds[27];
++ struct tm ldd;
++ time_t ldi;
++ int lf_slen, buf_slen;
++
++ if (_dessert_loglevel < level)
++ return;
++
++ snprintf(lf, 80, " (%s@%s:%d)", func, file, line);
++ lf_slen = strlen(lf);
++
++ va_start(args, fmt);
++ vsnprintf(buf, DESSERT_LOGLINE_MAX, fmt, args);
++ va_end(args);
++ buf_slen = strlen(buf);
++
++ if (_dessert_logflags | _DESSERT_LOGFLAG_SYSLOG) {
++ syslog(level, "%s%s", buf, lf);
++ }
++
++ if (_dessert_logflags & _DESSERT_LOGFLAG_RBUF) {
++ pthread_rwlock_rdlock(&_dessert_logrbuf_len_lock);
++ rbuf_line = _dessert_log_rbuf_nextline();
++ }
++
++ if (_dessert_logflags | (_DESSERT_LOGFLAG_LOGFILE | _DESSERT_LOGFLAG_STDERR
++ | _DESSERT_LOGFLAG_RBUF)) {
++
++ time(&ldi);
++ localtime_r(&ldi, &ldd);
++ snprintf(lds, 26, "%04d-%02d-%02d %02d:%02d:%02d%+05.1f ", ldd.tm_year
++ + 1900, ldd.tm_mon + 1, ldd.tm_mday, ldd.tm_hour, ldd.tm_min,
++ ldd.tm_sec, (double) ldd.tm_gmtoff / 3600);
++
++ switch (level) {
++ case LOG_EMERG:
++ lt = "EMERG: ";
++ break;
++ case LOG_ALERT:
++ lt = "ALERT: ";
++ break;
++ case LOG_CRIT:
++ lt = "CRIT: ";
++ break;
++ case LOG_ERR:
++ lt = "ERR: ";
++ break;
++ case LOG_WARNING:
++ lt = "WARN: ";
++ break;
++ case LOG_NOTICE:
++ lt = "NOTICE:";
++ break;
++ case LOG_INFO:
++ lt = "INFO: ";
++ break;
++ default:
++ lt = "DEBUG: ";
++ break;
++ }
++
++ if (32 + buf_slen + lf_slen > 80) {
++ if (_dessert_logflags & _DESSERT_LOGFLAG_LOGFILE && dessert_logfd
++ != NULL)
++ fprintf(dessert_logfd, "%s%s%s\n%80s\n", lds, lt, buf, lf);
++ if (_dessert_logflags & _DESSERT_LOGFLAG_STDERR)
++ fprintf(stderr, "%s%s%s\n%80s\n", lds, lt, buf, lf);
++ if (_dessert_logflags & _DESSERT_LOGFLAG_RBUF && rbuf_line != NULL)
++ snprintf(rbuf_line, DESSERT_LOGLINE_MAX, "%s%s%s\n%80s", lds,
++ lt, buf, lf);
++ } else {
++ while (32 + buf_slen + lf_slen < 80) {
++ buf[buf_slen++] = ' ';
++ }
++ buf[buf_slen] = '\0';
++ if (_dessert_logflags & _DESSERT_LOGFLAG_LOGFILE && dessert_logfd
++ != NULL)
++ fprintf(dessert_logfd, "%s%s%s%s\n", lds, lt, buf, lf);
++ if (_dessert_logflags & _DESSERT_LOGFLAG_STDERR)
++ fprintf(stderr, "%s%s%s%s\n", lds, lt, buf, lf);
++ if (_dessert_logflags & _DESSERT_LOGFLAG_RBUF && rbuf_line != NULL)
++ snprintf(rbuf_line, DESSERT_LOGLINE_MAX, "%s%s%s%s", lds, lt,
++ buf, lf);
++ }
++
++ if (_dessert_logflags & _DESSERT_LOGFLAG_LOGFILE && dessert_logfd
++ != NULL) {
++ fflush(dessert_logfd);
++ }
++ if (_dessert_logflags & _DESSERT_LOGFLAG_RBUF) {
++ pthread_rwlock_unlock(&_dessert_logrbuf_len_lock);
++ }
++
++ }
++}
++
++/** command "logging file" */
++int _dessert_cli_logging_file(struct cli_def *cli, char *command, char *argv[],
++ int argc) {
++ FILE *newlogdf;
++
++ if (argc != 1) {
++ cli_print(cli, "usage %s filename\n", command);
++ return CLI_ERROR;
++ }
++
++ newlogdf = fopen(argv[0], "a");
++
++ if (newlogdf == NULL) {
++ dessert_err("failed o open %s as logfile\n", argv[0]);
++ cli_print(cli, "failed o open %s as logfile\n", argv[0]);
++ return CLI_ERROR;
++ }
++
++ /* clean up old logfile first */
++ if (dessert_logfd != NULL) {
++ dessert_logcfg(DESSERT_LOG_NOFILE);
++ fclose(dessert_logfd);
++ }
++
++ dessert_logfd = newlogdf;
++ dessert_logcfg(DESSERT_LOG_FILE);
++
++ return CLI_OK;
++}
++
++/** command "logging file" */
++int _dessert_cli_no_logging_file(struct cli_def *cli, char *command,
++ char *argv[], int argc) {
++ dessert_logcfg(DESSERT_LOG_NOFILE);
++ if (dessert_logfd != NULL) {
++ fclose(dessert_logfd);
++ }
++ dessert_logfd = NULL;
++ return CLI_OK;
++}
++
++/** command "logging ringbuffer" */
++int _dessert_cli_logging_ringbuffer(struct cli_def *cli, char *command,
++ char *argv[], int argc) {
++ int newlen = -1;
++ if (argc != 1 || (newlen = (int) strtol(argv[0], NULL, 10)) < 0) {
++ cli_print(cli, "usage %s [buffer length]\n", command);
++ return CLI_ERROR;
++ }
++
++ if (newlen == _dessert_logrbuf_len)
++ return CLI_OK;
++
++ if (newlen == 0) {
++ cli_print(cli,
++ "will not set buffer length to 0 - use no logging ringbuffer instead\n");
++ return CLI_ERROR;
++ }
++
++ pthread_rwlock_wrlock(&_dessert_logrbuf_len_lock);
++
++ /* make logging buffer larger - easy if not ENOMEM*/
++ if (newlen > _dessert_logrbuf_len) {
++ _dessert_logrbuf = realloc(_dessert_logrbuf, newlen
++ * DESSERT_LOGLINE_MAX * sizeof(char));
++ if (_dessert_logrbuf == NULL) {
++ _dessert_logrbuf_len = 0;
++ _dessert_logrbuf_cur = 0;
++ } else {
++ _dessert_logrbuf_len = newlen;
++ }
++ dessert_logcfg(DESSERT_LOG_RBUF);
++ /* make logging buffer smaller - pain in the ass */
++ } else if (newlen < _dessert_logrbuf_len) {
++ /* move current log buffer if needed */
++ if (_dessert_logrbuf_cur > newlen) {
++ memmove(_dessert_logrbuf, _dessert_logrbuf + (DESSERT_LOGLINE_MAX
++ * (_dessert_logrbuf_cur - newlen)), newlen
++ * DESSERT_LOGLINE_MAX * sizeof(char));
++ _dessert_logrbuf_cur -= newlen;
++ }
++ _dessert_logrbuf = realloc(_dessert_logrbuf, newlen
++ * DESSERT_LOGLINE_MAX * sizeof(char));
++ if (_dessert_logrbuf == NULL) {
++ _dessert_logrbuf_len = 0;
++ _dessert_logrbuf_cur = 0;
++ } else {
++ _dessert_logrbuf_len = newlen;
++ }
++ } else {
++ dessert_err("this never happens");
++ }
++ if (_dessert_logrbuf_used > _dessert_logrbuf_len - 1)
++ _dessert_logrbuf_used = _dessert_logrbuf_len - 1;
++ pthread_rwlock_unlock(&_dessert_logrbuf_len_lock);
++ return CLI_OK;
++
++}
++
++/** command "no logging ringbuffer" */
++int _dessert_cli_no_logging_ringbuffer(struct cli_def *cli, char *command,
++ char *argv[], int argc) {
++ if (_dessert_logrbuf == NULL) {
++ return CLI_OK;
++ } else {
++ pthread_rwlock_wrlock(&_dessert_logrbuf_len_lock);
++ dessert_logcfg(DESSERT_LOG_NORBUF);
++ free(_dessert_logrbuf);
++ _dessert_logrbuf = NULL;
++ _dessert_logrbuf_len = 0;
++ _dessert_logrbuf_cur = 0;
++ pthread_rwlock_unlock(&_dessert_logrbuf_len_lock);
++ return CLI_OK;
++ }
++
++}
++
++/** command "show logging" */
++int _dessert_cli_cmd_logging(struct cli_def *cli, char *command, char *argv[],
++ int argc) {
++ pthread_rwlock_rdlock(&_dessert_logrbuf_len_lock);
++ int i = 0;
++ int max = _dessert_logrbuf_len - 1;
++ char* line;
++
++ if (_dessert_logrbuf_len < 1) {
++ cli_print(
++ cli,
++ "logging to ringbuffer is disables - use \"logging ringbuffer [int]\" in config-mode first");
++ pthread_rwlock_unlock(&_dessert_logrbuf_len_lock);
++ return CLI_ERROR;
++ }
++
++ if (argc == 1) {
++ int max2 = (int) strtol(argv[0], NULL, 10);
++ if (max2 > 0) {
++ max = max2;
++ }
++ }
++
++ /* where to start and print? */
++ if (max > _dessert_logrbuf_used) {
++ max = _dessert_logrbuf_used;
++ }
++ i = _dessert_logrbuf_cur - max - 1;
++ if (i < 0) {
++ i += _dessert_logrbuf_len;
++ }
++
++ while (max > 0) {
++ i++;
++ max--;
++ if (i == _dessert_logrbuf_len) {
++ i = 0;
++ }
++ line = _dessert_logrbuf + (DESSERT_LOGLINE_MAX * i);
++ cli_print(cli, "%s", line);
++ }
++
++ pthread_rwlock_unlock(&_dessert_logrbuf_len_lock);
++
++ return CLI_OK;
++}
+diff --git a/src/libdessert/dessert_meshiface.c b/src/libdessert/dessert_meshiface.c
+new file mode 100644
+index 0000000..f134e98
+--- /dev/null
++++ b/src/libdessert/dessert_meshiface.c
+@@ -0,0 +1,1221 @@
++/******************************************************************************
++ Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
++ All rights reserved.
++
++ These sources were originally developed by Philipp Schmidt
++ at Freie Universitaet Berlin (http://www.fu-berlin.de/),
++ Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
++ (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
++ ------------------------------------------------------------------------------
++ This program is free software: you can redistribute it and/or modify it under
++ the terms of the GNU General Public License as published by the Free Software
++ Foundation, either version 3 of the License, or (at your option) any later
++ version.
++
++ This program is distributed in the hope that it will be useful, but WITHOUT
++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
++ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along with
++ this program. If not, see http://www.gnu.org/licenses/ .
++ ------------------------------------------------------------------------------
++ For further information and questions please use the web site
++ http://www.des-testbed.net/
++ *******************************************************************************/
++
++#include "dessert_internal.h"
++#include <dessert/dessert.h>
++
++#ifdef __FreeBSD__
++#include <ifaddrs.h>
++#include <net/if_dl.h>
++#endif
++
++/* global data storage // P U B L I C */
++/* nothing here - yet */
++
++/* global data storage // P R I V A T E */
++/* nothing here - yet */
++
++/* local data storage*/
++dessert_meshif_t *_dessert_meshiflist = NULL;
++
++pthread_mutex_t _dessert_meshiflist_mutex = PTHREAD_MUTEX_INITIALIZER;
++int _dessert_meshiflist_len = 0;
++int _dessert_meshiflist_perm_count = 0;
++int _dessert_meshiflist_current_perm = 0;
++dessert_meshif_t ***_dessert_meshiflist_perms = NULL;
++
++dessert_meshrxcbe_t *_dessert_meshrxcblist;
++int _dessert_meshrxcblistver = 0;
++
++/* internal functions forward declarations*/
++static void _dessert_packet_process(u_char *args,
++ const struct pcap_pkthdr *header, const u_char *packet);
++static void *_dessert_meshif_add_thread(void* arg);
++static inline int _dessert_meshsend_if2(dessert_msg_t* msg,
++ dessert_meshif_t *iface);
++static void _dessert_meshif_cleanup(dessert_meshif_t *meshif);
++static void _dessert_meshiflist_update_permutations(void);
++static inline int DL_LENGTH(dessert_meshif_t *l);
++static inline void list2array(dessert_meshif_t *l, dessert_meshif_t **a,
++ int len);
++static inline int fact(int i);
++static inline void permutation(int k, int len, dessert_meshif_t **a);
++
++/******************************************************************************
++ *
++ * EXTERNAL / PUBLIC
++ *
++ * M E S H - I N T E R F A C E S
++ *
++ ******************************************************************************/
++
++/******************************************************************************
++ * sending messages
++ ******************************************************************************/
++
++/** Sends a \b dessert \b message via the specified interface or all interfaces.
++ *
++ * The original message buffer will not be altered, and the ethernet src address
++ * will be set correctly
++ *
++ * @param[in] *msgin message to send
++ * @param[in] *iface interface to send from - use NULL for all interfaces
++ *
++ * @retval DESSERT_OK on success
++ * @retval EINVAL if message is broken
++ * @retval EIO if message was not sent successfully
++ *
++ * %DESCRIPTION:
++ *
++ **/
++int dessert_meshsend(const dessert_msg_t* msgin, const dessert_meshif_t *iface) {
++ dessert_msg_t* msg;
++ int res;
++
++ /* check message - we only send valid messages! */
++ if (dessert_msg_check(msgin, msgin->hlen + msgin->plen)) {
++ dessert_warn("will not send invalid message - aborting");
++ return EINVAL;
++ }
++
++ /* clone message */
++ dessert_msg_clone(&msg, msgin, 1);
++ res = dessert_meshsend_fast(msg, iface);
++ dessert_msg_destroy(msg);
++
++ return res;
++
++}
++
++/** Sends a \b dessert \b message via all interfaces, except via the specified interface.
++ *
++ * The original message buffer will not be altered, and the ethernet src address will be set correctly.
++ *
++ * @param[in] *msgin message to send
++ * @param[in] *iface interface NOT to send from - use NULL for all interfaces
++
++ * @retval DESSERT_OK on success
++ * @retval EINVAL if message is broken
++ * @retval EIO if message was not sent successfully
++ *
++ * %DESCRIPTION:
++ *
++ **/
++int dessert_meshsend_allbutone(const dessert_msg_t* msgin,
++ const dessert_meshif_t *iface) {
++ dessert_msg_t* msg;
++ int res;
++
++ /* check message - we only send valid messages! */
++ if (dessert_msg_check(msgin, msgin->hlen + msgin->plen)) {
++ dessert_warn("will not send invalid message - aborting");
++ return EINVAL;
++ }
++
++ /* clone message */
++ dessert_msg_clone(&msg, msgin, 1);
++ res = dessert_meshsend_fast_allbutone(msg, iface);
++ dessert_msg_destroy(msg);
++
++ return res;
++
++}
++
++/** Sends a \b dessert \b message via the interface which is identified by the given hardware address.
++ *
++ * The original message buffer will not be altered, and the ethernet src address
++ * will be set correctly.
++ *
++ * @param[in] *msgin message to send
++ * @param[in] *hwaddr hardware address of the interface to send from
++ *
++ * @retval DESSERT_OK on success
++ * @retval EINVAL if message is broken
++ * @retval EIO if message was not sent successfully
++ *
++ * %DESCRIPTION:
++ *
++ **/
++int dessert_meshsend_hwaddr(const dessert_msg_t* msgin,
++ const uint8_t hwaddr[ETHER_ADDR_LEN]) {
++ dessert_msg_t* msg;
++ int res;
++
++ /* check message - we only send valid messages! */
++ if (dessert_msg_check(msgin, msgin->hlen + msgin->plen)) {
++ dessert_warn("will not send invalid message - aborting");
++ return EINVAL;
++ }
++
++ /* clone message */
++ dessert_msg_clone(&msg, msgin, 1);
++ res = dessert_meshsend_fast_hwaddr(msg, hwaddr);
++ dessert_msg_destroy(msg);
++
++ return res;
++}
++
++/** Sends a \b dessert \b message via all interfaces in a randomized fashion.
++ *
++ * The original message buffer will not be altered, and the ethernet src address
++ * will be set correctly.
++ *
++ * @param[in] *msgin message to send
++ *
++ * @retval DESSERT_OK on success
++ * @retval EINVAL if message is broken
++ * @retval EIO if message was not sent successfully
++ *
++ * %DESCRIPTION:
++ *
++ **/
++int dessert_meshsend_randomized(const dessert_msg_t* msgin) {
++ dessert_msg_t* msg;
++ int res;
++
++ /* check message - we only send valid messages! */
++ if (dessert_msg_check(msgin, msgin->hlen + msgin->plen)) {
++ dessert_warn("will not send invalid message - aborting");
++ return EINVAL;
++ }
++
++ /* clone message */
++ dessert_msg_clone(&msg, msgin, 1);
++ res = dessert_meshsend_fast_randomized(msg);
++ dessert_msg_destroy(msg);
++
++ return res;
++}
++
++/** Sends a \b dessert \b message fast via the specified interface or all interfaces.
++ *
++ * This method is faster than dessert_meshsend(), but does not check the message
++ * and may alter the message buffer.
++ *
++ * @param[in] *msg message to send
++ * @param[in] *iface interface to send from
++ *
++ * @retval DESSERT_OK on success
++ * @retval EINVAL if message is broken
++ * @retval EIO if message was not sent successfully
++ *
++ * %DESCRIPTION:
++ *
++ **/
++int dessert_meshsend_fast(dessert_msg_t* msg, const dessert_meshif_t *iface) {
++ int res = 0;
++
++ /* we have no iface - send on all! */
++ if (iface == NULL) {
++ pthread_rwlock_rdlock(&dessert_cfglock);
++ DL_FOREACH(_dessert_meshiflist, iface) {
++ /* set shost */
++ memcpy(msg->l2h.ether_shost, iface->hwaddr, ETHER_ADDR_LEN);
++ /* send */
++ res = _dessert_meshsend_if2(msg, iface);
++ if (res) {
++ break;
++ }
++ }
++ pthread_rwlock_unlock(&dessert_cfglock);
++ } else {
++ /* set shost */
++ memcpy(msg->l2h.ether_shost, iface->hwaddr, ETHER_ADDR_LEN);
++ /* send */
++ res = _dessert_meshsend_if2(msg, iface);
++ }
++
++ return (res);
++
++}
++
++/** Sends a \b dessert \b message fast via all interfaces, except the specified interface.
++ *
++ * This method is faster than dessert_meshsend_allbutone(), but does not check the message
++ * and may alter the message buffer.
++ *
++ * @param[in] *msg message to send
++ * @param[in] *iface interface to NOT send from - use NULL for all interfaces
++ *
++ * @retval DESSERT_OK on success
++ * @retval EINVAL if message is broken
++ * @retval EIO if message was not sent successfully
++ *
++ * %DESCRIPTION:
++ *
++ **/
++int dessert_meshsend_fast_allbutone(dessert_msg_t* msg,
++ const dessert_meshif_t *iface) {
++ dessert_meshif_t *curr_iface;
++ int res = 0;
++
++ /* we have no iface - send on all! */
++ if (iface == NULL) {
++ pthread_rwlock_rdlock(&dessert_cfglock);
++ DL_FOREACH(_dessert_meshiflist, curr_iface) {
++ /* set shost */
++ memcpy(msg->l2h.ether_shost, iface->hwaddr, ETHER_ADDR_LEN);
++ /* send */
++ res = _dessert_meshsend_if2(msg, iface);
++ if (res) {
++ break;
++ }
++ }
++ pthread_rwlock_unlock(&dessert_cfglock);
++ } else {
++ pthread_rwlock_rdlock(&dessert_cfglock);
++ DL_FOREACH(_dessert_meshiflist, curr_iface) {
++
++ /* skip if it is the 'allbutone' interface */
++ if (curr_iface == iface)
++ curr_iface = curr_iface->next;
++
++ /* set shost */
++ memcpy(msg->l2h.ether_shost, iface->hwaddr, ETHER_ADDR_LEN);
++ /* send */
++ res = _dessert_meshsend_if2(msg, iface);
++ if (res) {
++ break;
++ }
++ }
++ pthread_rwlock_unlock(&dessert_cfglock);
++ }
++
++ return (res);
++
++}
++
++/** Sends a \b dessert \b message fast via the interface specified by the given
++ * hardware address.
++ *
++ * This method is faster than dessert_meshsend_hwaddr(), but does not check the message
++ * and may alter the message buffer.
++ *
++ * @param[in] *msg message to send
++ * @param[in] *hwaddr hardware address of the interface to send from
++ *
++ * @retval DESSERT_OK on success
++ * @retval EINVAL if message is broken
++ * @retval EIO if message was not sent successfully
++ *
++ * %DESCRIPTION:
++ *
++ **/
++int dessert_meshsend_fast_hwaddr(dessert_msg_t* msg,
++ const uint8_t hwaddr[ETHER_ADDR_LEN]) {
++ int res;
++ dessert_meshif_t *meshif;
++
++ pthread_rwlock_rdlock(&dessert_cfglock);
++ DL_FOREACH(_dessert_meshiflist, meshif) {
++ if (memcmp(meshif->hwaddr, hwaddr, ETHER_ADDR_LEN) == 0)
++ break;
++ }
++ pthread_rwlock_unlock(&dessert_cfglock);
++ if (likely(meshif != NULL)) {
++ /* set shost */
++ memcpy(msg->l2h.ether_shost, meshif->hwaddr, ETHER_ADDR_LEN);
++ /* send */
++ res = _dessert_meshsend_if2(msg, meshif);
++ } else {
++ dessert_err("No such interface - aborting");
++ return ENODEV;
++ }
++
++ return (res);
++}
++
++/** Sends a \b dessert \b message fast via all interfaces in a randomized fashion.
++ *
++ * This method is faster than dessert_meshsend_randomized(), but does not check
++ * the message and may alter the message buffer.
++ *
++ * @param[in] *msgin message to send
++ *
++ * @retval DESSERT_OK on success
++ * @retval EINVAL if message is broken
++ * @retval EIO if message was not sent successfully
++ *
++ * %DESCRIPTION:
++ *
++ **/
++int dessert_meshsend_fast_randomized(dessert_msg_t* msgin) {
++ int i;
++ int res = 0;
++
++ pthread_mutex_lock(&_dessert_meshiflist_mutex);
++ for (i = 0; i < _dessert_meshiflist_len; i++) {
++ res = dessert_meshsend_fast(msgin, _dessert_meshiflist_perms[_dessert_meshiflist_current_perm][i]);
++ if (res) {
++ break;
++ }
++ }
++ _dessert_meshiflist_current_perm = (_dessert_meshiflist_current_perm+1) % _dessert_meshiflist_perm_count;
++ pthread_mutex_unlock(&_dessert_meshiflist_mutex);
++
++ return res;
++}
++
++/** Sends a @b dessert @b message @a msg via the specified interface @a iface or
++ * all interfaces.
++ *
++ * This method is faster than dessert_meshsend(), but does not check the message
++ * and may alter the message buffer. In contrast to dessert_meshsend_fast() it
++ * does not write the ether_shost address.
++ *
++ * @param[in] *msg message to send
++ * @param[in] *iface interface to send from
++ *
++ * @retval DESSERT_OK on success
++ * @retval EINVAL if message is broken
++ * @retval EIO if message was not sent successfully
++ *
++ * %DESCRIPTION:
++ *
++ **/
++int dessert_meshsend_raw(dessert_msg_t* msg, const dessert_meshif_t *iface) {
++ int res = 0;
++
++ if (iface == NULL) {
++ pthread_rwlock_rdlock(&dessert_cfglock);
++ DL_FOREACH(_dessert_meshiflist, iface) {
++ res = _dessert_meshsend_if2(msg, iface);
++ if (res) {
++ break;
++ }
++ }
++ pthread_rwlock_unlock(&dessert_cfglock);
++ } else {
++ res = _dessert_meshsend_if2(msg, iface);
++ }
++
++ return (res);
++
++}
++
++/******************************************************************************
++ * meshrx-callback handling
++ ******************************************************************************/
++
++/** Removes all occurrences of the given callback function @a c from the meshrx
++ * pipeline.
++ *
++ * @param[in] c callback function pointer
++ *
++ * @retval DESSERT_OK on success
++ * @retval DESSERT_ERR otherwise
++ *
++ * %DESCRIPTION:
++ *
++ **/
++int dessert_meshrxcb_del(dessert_meshrxcb_t* c) {
++ int count = 0;
++ dessert_meshrxcbe_t *i, *last;
++
++ pthread_rwlock_wrlock(&dessert_cfglock);
++
++ if (_dessert_meshrxcblist == NULL) {
++ count++;
++ goto dessert_meshrxcb_del_out;
++ }
++
++ while (_dessert_meshrxcblist->c == c) {
++ count++;
++ i = _dessert_meshrxcblist;
++ _dessert_meshrxcblist = _dessert_meshrxcblist->next;
++ free(i);
++ if (_dessert_meshrxcblist == NULL) {
++ goto dessert_meshrxcb_del_out;
++ }
++ }
++
++ for (i = _dessert_meshrxcblist; i->next != NULL; i = i->next) {
++ if (i->c == c) {
++ count++;
++ last->next = i->next;
++ free(i);
++ i = last;
++ }
++ last = i;
++ }
++
++ dessert_meshrxcb_del_out: _dessert_meshrxcblistver++;
++ pthread_rwlock_unlock(&dessert_cfglock);
++ return ((count > 0) ? DESSERT_OK : DESSERT_ERR);
++
++}
++
++/** Adds a callback function to the meshrx pipeline.
++ *
++ * The callback going to get called if a packet is received via a dessert interface.
++ *
++ * @param[in] c callback function
++ * @param[in] prio priority of the function - lower first!
++ *
++ * @retval DESSERT_OK on success
++ * @retval -errno on error
++ *
++ * %DESCRIPTION:
++ *
++ **/
++int dessert_meshrxcb_add(dessert_meshrxcb_t* c, int prio) {
++ dessert_meshrxcbe_t *cb, *i;
++
++ cb = (dessert_meshrxcbe_t *) malloc(sizeof(dessert_meshrxcbe_t));
++ if (cb == NULL)
++ return (-errno);
++
++ pthread_rwlock_wrlock(&dessert_cfglock);
++
++ cb->c = c;
++ cb->prio = prio;
++ cb->next = NULL;
++
++ if (_dessert_meshrxcblist == NULL) {
++ _dessert_meshrxcblist = cb;
++ _dessert_meshrxcblistver++;
++
++ pthread_rwlock_unlock(&dessert_cfglock);
++ return DESSERT_OK;
++ }
++
++ if (_dessert_meshrxcblist->prio > cb->prio) {
++ cb->next = _dessert_meshrxcblist;
++ _dessert_meshrxcblist = cb;
++ _dessert_meshrxcblistver++;
++
++ pthread_rwlock_unlock(&dessert_cfglock);
++ return DESSERT_OK;
++ }
++
++ /* find right place for callback */
++ for (i = _dessert_meshrxcblist; i->next != NULL && i->next->prio
++ <= cb->prio; i = i->next)
++ ;
++
++ /* insert it */
++ cb->next = i->next;
++ i->next = cb;
++ _dessert_meshrxcblistver++;
++
++ pthread_rwlock_unlock(&dessert_cfglock);
++ return DESSERT_OK;
++}
++
++/******************************************************************************
++ * mesh interface handling
++ ******************************************************************************/
++
++/** Returns the head of the list of mesh interfaces (_desert_meshiflist).
++ *
++ * @retval pointer if list is not empty
++ * @retval NULL otherwise
++ *
++ * %DESCRIPTION:
++ *
++ */
++dessert_meshif_t* dessert_meshiflist_get() {
++ return _dessert_meshiflist;
++}
++
++/** Looks for mesh interface with name @a dev in the list of mesh interfaces and
++ * returns a pointer to it.
++ *
++ * @param[in] *dev interface name
++ *
++ * @retval pointer if the interface is found
++ * @retval NULL otherwise
++ *
++ * %DESCRIPTION:
++ *
++ **/
++dessert_meshif_t* dessert_meshif_get_name(const char* dev) {
++ dessert_meshif_t *meshif = NULL;
++
++ /* search dev name in iflist */
++ //meshif = _dessert_meshiflist;
++ pthread_rwlock_rdlock(&dessert_cfglock);
++ DL_FOREACH(_dessert_meshiflist, meshif) {
++ if (strncmp(meshif->if_name, dev, IF_NAMESIZE) == 0)
++ break;
++ }
++ pthread_rwlock_unlock(&dessert_cfglock);
++
++ return (meshif);
++}
++
++/** Looks for mesh interface with hardware address @a hwaddr in the list of mesh
++ * interfaces and returns a pointer to it.
++ *
++ * @param[in] *hwaddr interface hardware address
++ *
++ * @retval pointer if the interface is found
++ * @retval NULL otherwise
++ *
++ * %DESCRIPTION:
++ *
++ */
++dessert_meshif_t* dessert_meshif_get_hwaddr(const uint8_t hwaddr[ETHER_ADDR_LEN]) {
++ dessert_meshif_t *meshif = NULL;
++
++ pthread_rwlock_rdlock(&dessert_cfglock);
++ DL_FOREACH(_dessert_meshiflist, meshif) {
++ if (memcmp(meshif->hwaddr, hwaddr, ETHER_ADDR_LEN) == 0)
++ break;
++ }
++ pthread_rwlock_unlock(&dessert_cfglock);
++
++ return meshif;
++}
++
++/** Removes the corresponding dessert_meshif struct from _dessert_meshiflist and does some cleanup.
++ *
++ * @param[in] dev interface name to remove from list
++ *
++ * @retval DESSERT_OK on success
++ * @retval -errno on error
++ *
++ * %DESCRIPTION:
++ *
++ */
++int dessert_meshif_del(const char* dev) {
++ dessert_meshif_t *meshif;
++ // dessert_meshif_t *meshif_prev; TODO MESHIF_HASH
++
++ /* lock the list */
++ pthread_rwlock_wrlock(&dessert_cfglock);
++ /* search dev name in iflist */
++ DL_FOREACH(_dessert_meshiflist, meshif) {
++ if (strncmp(meshif->if_name, dev, IF_NAMESIZE) == 0)
++ break;
++ }
++
++ if (meshif == NULL) {
++ pthread_rwlock_unlock(&dessert_cfglock);
++ return (ENODEV);
++ }
++
++ /* remove it from list */
++ DL_DELETE(_dessert_meshiflist, meshif);
++ _dessert_meshiflist_update_permutations();
++ pthread_rwlock_unlock(&dessert_cfglock);
++
++ /* tell pcap not to further process packets */
++ pcap_breakloop(meshif->pcap);
++
++ /* the remaining cleanup is done in the interface thread *
++ * using _dessert_meshif_cleanup */
++
++ return DESSERT_OK;
++
++}
++
++/** Initializes given mesh interface, starts up the packet processor thread.
++
++ * @param[in] *dev interface name
++ * @param[in] flags @todo Document the flags parameter.
++ *
++ * @retval DESSERT_OK on success
++ * @retval DESSERT_ERR on error
++ *
++ *
++ *
++ * %DESCRIPTION:
++ *
++ */
++int dessert_meshif_add(const char* dev, uint8_t flags) {
++ dessert_meshif_t *meshif;
++
++ uint8_t promisc = (flags & DESSERT_IF_NOPROMISC) ? 0 : 1;
++ struct bpf_program fp; /* filter program for libpcap */
++ char fe[64]; /* filter expression for libpcap */
++
++ snprintf(fe, 64, "ether proto 0x%04x", DESSERT_ETHPROTO);
++
++ /* init new interface entry */
++ meshif = (dessert_meshif_t*) malloc(sizeof(dessert_meshif_t));
++ if (meshif == NULL)
++ return (-errno);
++ memset((void *) meshif, 0, sizeof(dessert_meshif_t));
++ strncpy(meshif->if_name, dev, IF_NAMESIZE);
++ meshif->if_name[IF_NAMESIZE - 1] = '\0';
++ meshif->if_index = if_nametoindex(dev);
++ pthread_mutex_init(&(meshif->cnt_mutex), NULL);
++
++ /* check if interface exists */
++ if (!meshif->if_index) {
++ dessert_err("interface %s - no such interface", meshif->if_name);
++ goto dessert_meshif_add_err;
++ }
++
++ /* initialize libpcap */
++ meshif->pcap = pcap_open_live(meshif->if_name, DESSERT_MAXFRAMELEN,
++ promisc, 10, meshif->pcap_err);
++ if (meshif->pcap == NULL) {
++ dessert_err("pcap_open_live failed for interface %s(%d):\n%s",
++ meshif->if_name, meshif->if_index, meshif->pcap_err);
++ goto dessert_meshif_add_err;
++ }
++ if (pcap_datalink(meshif->pcap) != DLT_EN10MB) {
++ dessert_err("interface %s(%d) is not an ethernet interface!",
++ meshif->if_name, meshif->if_index);
++ goto dessert_meshif_add_err;
++ }
++
++ /* pcap filter */
++ if (!(flags & DESSERT_IF_NOFILTER)) {
++ if (pcap_compile(meshif->pcap, &fp, fe, 0, 0) == -1) {
++ dessert_err("couldn't parse filter %s: %s\n", fe, pcap_geterr(meshif->pcap));
++ goto dessert_meshif_add_err;
++ }
++ if (pcap_setfilter(meshif->pcap, &fp) == -1) {
++ dessert_err("couldn't install filter %s: %s\n", fe, pcap_geterr(meshif->pcap));
++ goto dessert_meshif_add_err;
++ }
++ /* else { TODO: pcap_freecode() } */
++ }
++
++ /* get hardware address */
++ if (_dessert_meshif_gethwaddr(meshif) != 0) {
++ dessert_err("failed to get hwaddr of interface %s(%d)",
++ meshif->if_name, meshif->if_index);
++ goto dessert_meshif_add_err;
++ }
++
++ /* check whether we need to set defsrc (default source) */
++ if (memcmp(dessert_l25_defsrc, ether_null, ETHER_ADDR_LEN) == 0) {
++ memcpy(dessert_l25_defsrc, meshif->hwaddr, ETHER_ADDR_LEN);
++ dessert_info("set dessert_l25_defsrc to hwaddr %02x:%02x:%02x:%02x:%02x:%02x",
++ dessert_l25_defsrc[0], dessert_l25_defsrc[1],dessert_l25_defsrc[2],
++ dessert_l25_defsrc[3], dessert_l25_defsrc[4], dessert_l25_defsrc[5]);
++ }
++
++ dessert_info("starting worker thread for interface %s(%d) hwaddr %02x:%02x:%02x:%02x:%02x:%02x",
++ meshif->if_name, meshif->if_index,
++ meshif->hwaddr[0], meshif->hwaddr[1], meshif->hwaddr[2],
++ meshif->hwaddr[3], meshif->hwaddr[4], meshif->hwaddr[5]);
++
++ /* start worker thread */
++ if (pthread_create(&(meshif->worker), NULL, _dessert_meshif_add_thread,
++ (void *) meshif)) {
++ dessert_err("creating worker thread failed for interface %s(%d)",
++ meshif->if_name, meshif->if_index);
++ goto dessert_meshif_add_err;
++ }
++
++ /* prepend to interface list */
++ pthread_rwlock_wrlock(&dessert_cfglock);
++ DL_PREPEND(_dessert_meshiflist, meshif);
++ _dessert_meshiflist_update_permutations();
++ pthread_rwlock_unlock(&dessert_cfglock);
++
++ return (DESSERT_OK);
++
++ dessert_meshif_add_err:
++
++ if (meshif->pcap != NULL) {
++ pcap_close(meshif->pcap);
++ }
++ free(meshif);
++ return (DESSERT_ERR);
++}
++
++/*****************************************************************************
++ *
++ * INTERNAL / PRIVATE
++ *
++ * M E S H - I N T E R F A C E S
++ *
++ ******************************************************************************/
++
++/** Run all registered callbacks.
++ *
++ * @internal
++ *
++ * @return the return status of the last callback called
++ *
++ * @warning Use with care - never register as callback!
++ *
++ * %DESCRIPTION:
++ *
++ */
++int _dessert_meshrxcb_runall(dessert_msg_t* msg_in, size_t len,
++ dessert_msg_proc_t *proc_in, const dessert_meshif_t *meshif,
++ dessert_frameid_t id) {
++ dessert_msg_t *msg = msg_in;
++ dessert_msg_proc_t *proc = proc_in;
++ dessert_meshrxcbe_t *cb;
++ int res = 0;
++ dessert_meshrxcb_t **cbl = NULL;
++ int cbllen = 0;
++ int cblcur = -1;
++
++ /* copy callbacks to internal list to release dessert_cfglock before invoking callbacks*/
++ pthread_rwlock_rdlock(&dessert_cfglock);
++ cbllen = 0;
++ for (cb = _dessert_meshrxcblist; cb != NULL; cb = cb->next)
++ cbllen++;
++ cbl = malloc(cbllen * sizeof(dessert_meshrxcb_t *));
++ if (cbl == NULL) {
++ dessert_err("failed to allocate memory for internal callback list");
++ pthread_rwlock_unlock(&dessert_cfglock);
++ return DESSERT_MSG_DROP;
++ }
++
++ cblcur = 0;
++ for (cb = _dessert_meshrxcblist; cb != NULL; cb = cb->next)
++ cbl[cblcur++] = cb->c;
++
++ pthread_rwlock_unlock(&dessert_cfglock);
++
++ /* call the interested */
++ res = 0;
++ cblcur = 0;
++ while (res > DESSERT_MSG_DROP && cblcur < cbllen) {
++
++ _dessert_packet_process_cbagain: res = cbl[cblcur](msg, len, proc,
++ meshif, id);
++
++ if (res == DESSERT_MSG_NEEDNOSPARSE && msg == msg_in) {
++ dessert_msg_clone(&msg, msg_in, 0);
++ len = DESSERT_MAXFRAMEBUFLEN;
++ goto _dessert_packet_process_cbagain;
++ } else if (res == DESSERT_MSG_NEEDNOSPARSE && msg != msg_in) {
++ dessert_warn("bogus DESSERT_MSG_NEEDNOSPARSE returned from callback!");
++ }
++
++ if (res == DESSERT_MSG_NEEDMSGPROC && proc == NULL) {
++ proc = malloc(DESSERT_MSGPROCLEN);
++ memset(proc, 0, DESSERT_MSGPROCLEN);
++ goto _dessert_packet_process_cbagain;
++ } else if (res == DESSERT_MSG_NEEDMSGPROC && proc != NULL) {
++ dessert_warn("bogus DESSERT_MSG_NEEDMSGPROC returned from callback!");
++ }
++
++ cblcur++;
++ }
++
++ free(cbl);
++
++ if (msg != msg_in)
++ dessert_msg_destroy(msg);
++
++ if (proc != proc_in)
++ free(proc);
++
++ return (res);
++}
++
++/** Get the hardware address of the ethernet device behind meshif.
++ *
++ * @internal
++ *
++ * @param *meshif pointer to dessert_meshif_t to query
++ *
++ * @retval DESSERT_OK on success
++ *
++ * \warning This is a platform depended function!
++ *
++ * %DESCRIPTION:
++ *
++ **/
++int _dessert_meshif_gethwaddr(dessert_meshif_t *meshif)
++#ifdef __DARWIN__
++{
++ /* the Apple way... */
++
++ int mib[6];
++ size_t len;
++ uint8_t *buf, *next;
++ struct if_msghdr *ifm;
++ struct sockaddr_dl *sdl;
++ int ret = DESSERT_ERR;
++
++ mib[0] = CTL_NET;
++ mib[1] = AF_ROUTE;
++ mib[2] = 0;
++ mib[3] = AF_LINK;
++ mib[4] = NET_RT_IFLIST;
++ mib[5] = 0;
++
++ if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
++ dessert_err("Acquiring hwaddr failed: sysctl 1 error");
++ return(DESSERT_ERR);
++ }
++
++ if ((buf = malloc(len)) == NULL) {
++ dessert_err("acquiring hwaddr failed: malloc error");
++ return(DESSERT_ERR);
++ }
++
++ if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
++ dessert_err("acquiring hwaddr failed: sysctl 2 error");
++ return(DESSERT_ERR);
++ }
++
++ for (next = buf; next < buf+len; next += ifm->ifm_msglen) {
++ ifm = (struct if_msghdr *)next;
++ if (ifm->ifm_type == RTM_IFINFO) {
++ sdl = (struct sockaddr_dl *)(ifm + 1);
++ if (strncmp(&sdl->sdl_data[0], meshif->if_name, sdl->sdl_len) == 0) {
++ memcpy(meshif->hwaddr, LLADDR(sdl), ETHER_ADDR_LEN);
++ ret = DESSERT_OK;
++ break;
++ }
++ }
++ }
++
++ free(buf);
++ return ret;
++}
++#elif __FreeBSD__
++{
++ struct ifaddrs *ifaphead;
++ struct ifaddrs *ifap;
++ struct sockaddr_dl *sdl = NULL;
++
++ if (getifaddrs(&ifaphead) != 0)
++ {
++ dessert_err("getifaddrs() failed");
++ return(DESSERT_ERR);
++ }
++
++ for (ifap = ifaphead; ifap; ifap = ifap->ifa_next)
++ {
++ if ((ifap->ifa_addr->sa_family == AF_LINK))
++ {
++ if (strcmp(ifap->ifa_name,meshif->if_name) == 0)
++ {
++ sdl = (struct sockaddr_dl *)ifap->ifa_addr;
++ if (sdl)
++ {
++ memcpy(meshif->hwaddr, LLADDR(sdl), ETHER_ADDR_LEN);
++ return(DESSERT_OK);
++ }
++ }
++ }
++ }
++ return(DESSERT_ERR);
++}
++#elif __linux__
++{
++ /* the linux and solaris way */
++ int sockfd;
++ struct ifreq ifr;
++
++ /* we need some socket to do that */
++ sockfd = socket(AF_INET, SOCK_STREAM, 0);
++
++ /* set interface options and get hardware address */
++ strncpy(ifr.ifr_name, meshif->if_name, sizeof(ifr.ifr_name));
++
++#ifdef SIOCGIFHWADDR
++ if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) >= 0) {
++ memcpy(meshif->hwaddr, &ifr.ifr_hwaddr.sa_data, ETHER_ADDR_LEN);
++ /* } */
++#elif defined SIOCGENADDR
++ if ( ioctl(sd, SIOCGENADDR, &ifr_work) >= 0 ) {
++ memcpy( meshif->hwaddr, &ifr.ifr_enaddr, ETHER_ADDR_LEN );
++ /* } */
++#else
++ if (false) {
++#endif
++ close(sockfd);
++ return (DESSERT_OK);
++ } else {
++ dessert_err("acquiring hwaddr failed");
++ close(sockfd);
++ return (DESSERT_ERR);
++ }
++}
++#else
++{
++ dessert_err("acquiring hwaddr failed - platform not supported");
++ return(DESSERT_ERR);
++}
++#endif
++
++/******************************************************************************
++ *
++ * LOCAL
++ *
++ * M E S H - I N T E R F A C E S
++ *
++ ******************************************************************************/
++
++/** Function to send packet via a single interface.
++ *
++ * @internal
++ *
++ * @param[in] *msg the message to send
++ * @param[in] *iface the interface the message should be send via
++ *
++ * @retval DESSERT_OK on success
++ * @retval EINVAL if *iface is NULL
++ * @retval EIO if there was a problem sending the message
++ *
++ * %DESCRIPTION:
++ *
++ */
++static inline int _dessert_meshsend_if2(dessert_msg_t* msg,
++ dessert_meshif_t *iface) {
++ int res;
++ uint8_t oldflags;
++ size_t msglen = ntohs(msg->hlen) + ntohs(msg->plen);
++
++ /* check for null meshInterface */
++ if (iface == NULL) {
++ dessert_err("NULL-pointer given as interface - programming error!");
++ return EINVAL;
++ }
++
++ /* send packet - temporally setting DESSERT_FLAG_SPARSE */
++ oldflags = msg->flags;
++ msg->flags &= ~DESSERT_FLAG_SPARSE;
++ res = pcap_inject(iface->pcap, (u_char *) msg, msglen);
++ msg->flags = oldflags;
++
++ if (res != msglen) {
++ if (res == -1) {
++ dessert_warn("couldn't send message: %s\n", pcap_geterr(iface->pcap));
++ } else {
++ dessert_warn("couldn't send message: sent only %d of %d bytes\n",
++ res, msglen);
++ }
++ return (EIO);
++ }
++
++ pthread_mutex_lock(&(iface->cnt_mutex));
++ iface->opkts++;
++ iface->obytes += res;
++ pthread_mutex_unlock(&(iface->cnt_mutex));
++
++ return (DESSERT_OK);
++
++}
++
++/** Callback doing the main work for packets received through a dessert interface.
++ *
++ * @internal
++ *
++ * @param arg - meshif-pointer carried by libpcap in something else
++ * @param header - pointer to the header by libpcap
++ * @param packet - pointer to the packet by libpcap
++ *
++ * %DESCRIPTION:
++ *
++ */
++static void _dessert_packet_process(u_char *args,
++ const struct pcap_pkthdr *header, const u_char *packet) {
++ dessert_meshif_t *meshif = (dessert_meshif_t *) args;
++ dessert_msg_t *msg = (dessert_msg_t *) packet;
++ size_t len = header->caplen;
++ dessert_frameid_t id;
++ dessert_msg_proc_t proc;
++
++ /* is it something I understand? */
++ if (ntohs(msg->l2h.ether_type) != DESSERT_ETHPROTO) {
++ dessert_debug("got packet with ethertype %04x - discarding", ntohs(msg->l2h.ether_type));
++ return;
++ }
++
++ /* check message */
++ if (header->caplen < header->len) {
++ dessert_warn("packet too short - check pcap_open_live() parameters");
++ return;
++ }
++ if (header->caplen < DESSERT_MSGLEN) {
++ dessert_notice("packet too short - shorter than DESSERT_MSGLEN");
++ return;
++ }
++
++ /* generate frame id */
++ id = _dessert_newframeid();
++ memset(&proc, 0, DESSERT_MSGPROCLEN);
++
++ /* count packet */
++ pthread_mutex_lock(&(meshif->cnt_mutex));
++ meshif->ipkts++;
++ meshif->ibytes += header->caplen;
++ pthread_mutex_unlock(&(meshif->cnt_mutex));
++
++ _dessert_meshrxcb_runall(msg, len, &proc, meshif, id);
++
++}
++
++/** Internal routine called before interface thread finishes.
++ *
++ * @internal
++ *
++ * @param *meshif the interface to be cleaned up
++ *
++ * %DESCRIPTION:
++ *
++ */
++static void _dessert_meshif_cleanup(dessert_meshif_t *meshif) {
++ pcap_close(meshif->pcap);
++ free(meshif);
++}
++
++/** Internal thread function running the capture loop.
++ *
++ * @internal
++ *
++ * @param *arg a void pointer representing a dessert_meshif_t interface
++ *
++ * %DESCRIPTION:
++ */
++static void *_dessert_meshif_add_thread(void* arg) {
++
++ dessert_meshif_t *meshif = (dessert_meshif_t *) arg;
++
++ pcap_loop(meshif->pcap, -1, _dessert_packet_process, (u_char *) meshif);
++
++ _dessert_meshif_cleanup(meshif);
++
++ return (NULL);
++
++}
++
++/** Internal function to update the lookup table of permutations of the current _dessert_meshiflist.
++ *
++ * @internal
++ *
++ * %DESCRIPTION: \n
++ */
++static void _dessert_meshiflist_update_permutations() {
++ int i, r;
++
++ pthread_mutex_lock(&_dessert_meshiflist_mutex);
++ _dessert_meshiflist_len = DL_LENGTH(_dessert_meshiflist);
++
++ dessert_meshif_t **a = calloc(sizeof(a) * _dessert_meshiflist_len, 1);
++ list2array(_dessert_meshiflist, a, _dessert_meshiflist_len);
++
++ _dessert_meshiflist_perm_count = fact(_dessert_meshiflist_len);
++
++ if (_dessert_meshiflist_perms != NULL) {
++ free(_dessert_meshiflist_perms);
++ }
++ _dessert_meshiflist_perms = calloc(sizeof(dessert_meshif_t **) * _dessert_meshiflist_perm_count + sizeof(dessert_meshif_t *) * _dessert_meshiflist_perm_count * _dessert_meshiflist_len, 1);
++ for (i = 0; i < _dessert_meshiflist_perm_count; ++i) {
++ _dessert_meshiflist_perms[i]
++ = (dessert_meshif_t **) (((char *) _dessert_meshiflist_perms)
++ + sizeof(dessert_meshif_t **)
++ * _dessert_meshiflist_perm_count + i
++ * _dessert_meshiflist_len * sizeof(dessert_meshif_t *));
++ }
++
++ for (r = 0; r < _dessert_meshiflist_perm_count; r++) {
++ memcpy(_dessert_meshiflist_perms[r], a, sizeof(dessert_meshif_t *)
++ * _dessert_meshiflist_len);
++ }
++ free(a);
++
++ for(r = 0; r < _dessert_meshiflist_perm_count; r++){
++ permutation(r, _dessert_meshiflist_len, _dessert_meshiflist_perms[r]);
++ }
++
++ pthread_mutex_unlock(&_dessert_meshiflist_mutex);
++}
++
++/** Internal function to get the length of a double-linked utlist.
++ *
++ * @internal
++ *
++ * @param[in] *l a pointer to the list head
++ *
++ * @return the number of elements in the list
++ *
++ * %DESCRIPTION: \n
++ */
++static inline int DL_LENGTH(dessert_meshif_t *l) {
++ int len = 0;
++ dessert_meshif_t *temp;
++ DL_FOREACH(l, temp)
++ len++;
++ return len;
++}
++
++/** Internal function to copy the element pointers of the _dessert_meshiflist to an array.
++ *
++ * @internal
++ *
++ * @param[in] *l a pointer to the list head
++ * @param[out] **a a pointer to an array of dessert_meshif_t
++ *
++ * %DESCRIPTION: \n
++ */
++static inline void list2array(dessert_meshif_t *l, dessert_meshif_t **a,
++ int len) {
++ dessert_meshif_t *t;
++ int i = 0;
++ DL_FOREACH(l, t) {
++ a[i++] = t;
++ if (--len == 0)
++ break;
++ }
++}
++
++/** Internal function to compute the factorial of a given number.
++ *
++ * @internal
++ *
++ * @param[in] i the number
++ *
++ * @return the factorial
++ *
++ * %DESCRIPTION: \n
++ */
++static inline int fact(int i){
++ int fact = 1;
++ while (i > 0) fact *= i--;
++ return fact;
++}
++
++/** Internal function to produce a permutation of @a a.
++ *
++ * @internal
++ *
++ * @param[in] k the permutation to generate
++ * @param[in] len the number of elements in the array
++ * @param[out] the array to permute
++ *
++ * @note Algorithm adopted from the Wikipedia article on
++ * <a href="http://en.wikipedia.org/wiki/Permutation">Permutations</a>.
++ *
++ * %DESCRIPTION: \n
++ */
++static inline void permutation(int k, int len, dessert_meshif_t **a) {
++ dessert_meshif_t *temp;
++ int j;
++
++ for(j = 2 ; j <= len; j++ ) {
++ temp = a[(k%j)];
++ a[(k%j)] = a[j-1];
++ a[j-1] = temp;
++ k = k / j;
++ }
++}
+diff --git a/src/libdessert/dessert_msg.c b/src/libdessert/dessert_msg.c
+new file mode 100644
+index 0000000..af56177
+--- /dev/null
++++ b/src/libdessert/dessert_msg.c
+@@ -0,0 +1,876 @@
++/******************************************************************************
++ Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
++ All rights reserved.
++
++ These sources were originally developed by Philipp Schmidt
++ at Freie Universitaet Berlin (http://www.fu-berlin.de/),
++ Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
++ (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
++ ------------------------------------------------------------------------------
++ This program is free software: you can redistribute it and/or modify it under
++ the terms of the GNU General Public License as published by the Free Software
++ Foundation, either version 3 of the License, or (at your option) any later
++ version.
++
++ This program is distributed in the hope that it will be useful, but WITHOUT
++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
++ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along with
++ this program. If not, see http://www.gnu.org/licenses/ .
++ ------------------------------------------------------------------------------
++ For further information and questions please use the web site
++ http://www.des-testbed.net/
++ *******************************************************************************/
++
++#include "dessert_internal.h"
++#include <dessert/dessert.h>
++
++/* global data storage // P U B L I C */
++
++/* global data storage // P R I V A T E */
++
++/* local data storage*/
++
++/* internal functions forward declarations*/
++
++/******************************************************************************
++ *
++ * EXTERNAL / PUBLIC
++ *
++ * M E S S A G E H A N D L I N G
++ *
++ ******************************************************************************/
++
++/** creates a new dessert_msg_t and initializes it.
++ * @arg **msgout (out) pointer to return message address
++ * @return 0 on success, -errno on error
++ **/
++int dessert_msg_new(dessert_msg_t **msgout) {
++ dessert_msg_t *msg;
++
++ msg = malloc(DESSERT_MAXFRAMEBUFLEN);
++
++ if (msg == NULL) {
++ dessert_err("failed to allocate buffer for new message!");
++ return (-ENOMEM);
++ }
++
++ memset(msg, 0, DESSERT_MAXFRAMEBUFLEN);
++ msg->l2h.ether_type = htons(DESSERT_ETHPROTO);
++ memset(msg->l2h.ether_dhost, 255, ETHER_ADDR_LEN);
++ memcpy(msg->proto, dessert_proto, DESSERT_PROTO_STRLEN);
++ msg->ver = dessert_ver;
++ msg->ttl = 0xff;
++ msg->u8 = 0x00;
++ msg->u16 = htons(0xbeef);
++ msg->hlen = htons(sizeof(dessert_msg_t));
++ msg->plen = htons(0);
++
++ *msgout = msg;
++ return (DESSERT_OK);
++
++}
++
++/** generates a copy of a dessert_msg
++ * @arg **msgnew (out) pointer to return message address
++ * @arg *msgold pointer to the message to clone
++ * @arg sparse whether to allocate DESSERT_MAXFRAMELEN or only hlen+plen
++ * @return DESSERT_OK on success, -errno otherwise
++ **/
++int dessert_msg_clone(dessert_msg_t **msgnew, const dessert_msg_t *msgold,
++ uint8_t sparse) {
++ dessert_msg_t *msg;
++ size_t msglen = ntohs(msgold->hlen) + ntohs(msgold->plen);
++
++ if (sparse) {
++ msg = malloc(msglen);
++ } else {
++ msg = malloc(DESSERT_MAXFRAMEBUFLEN);
++ }
++
++ if (msg == NULL) {
++ return (-errno);
++ }
++
++ memcpy(msg, msgold, msglen);
++
++ if (sparse) {
++ msg->flags |= DESSERT_FLAG_SPARSE;
++ } else {
++ msg->flags &= DESSERT_FLAG_SPARSE ^ DESSERT_FLAG_SPARSE;
++ }
++
++ *msgnew = msg;
++ return (DESSERT_OK);
++
++}
++
++/** checks whether a dessert_msg is consistent
++ * @arg msg the message to be checked
++ * @arg len the length of the buffer
++ * @return DESSERT_OK on success
++ * @return -1 of the message is too large for the buffer
++ * @return -2 if the message was not intended to this daemon
++ * @return -3 if some extension is not consistent
++ * %DESCRIPTION:
++ ***********************************************************************/
++int dessert_msg_check(const dessert_msg_t* msg, size_t len) {
++ dessert_ext_t *ext;
++
++ /* is the message large enough to at least carry the header */
++ if (len < DESSERT_MSGLEN) {
++ dessert_info("message too short - shorter than DESSERT_MSGLEN");
++ return (-1);
++ }
++ if (ntohs(msg->hlen) + ntohs(msg->plen) > len) {
++ dessert_info("message too short - shorter than header + payload");
++ return (-1);
++ }
++
++ /* right protocol and version */
++ if (msg->proto[0] != dessert_proto[0] || msg->proto[1] != dessert_proto[1]
++ || msg->proto[2] != dessert_proto[2] || msg->proto[3]
++ != dessert_proto[3]) {
++ dessert_info("wrong dessert protocol");
++ return (-2);
++ }
++ if (msg->ver != dessert_ver) {
++ dessert_info("wrong dessert protocol version");
++ return (-2);
++ }
++
++ /* now check extensions.... */
++ ext = (dessert_ext_t *) ((uint8_t *) msg + DESSERT_MSGLEN);
++ while ((uint8_t *) ext < ((uint8_t *) msg + (size_t) ntohs(msg->hlen))) {
++ /* does current extension fit into the header? */
++ if (((uint8_t *) ext + (size_t) ext->len) > ((uint8_t *) msg
++ + (size_t) ntohs(msg->hlen))) {
++ dessert_info("extension %x too long", ext->type);
++ return (-3);
++ }
++ if (ext->len < 2) {
++ dessert_info("extension %x too short", ext->type);
++ return (-3);
++ }
++
++ ext = (dessert_ext_t *) ((uint8_t *) ext + (size_t) ext->len);
++ }
++
++ /* message is valid */
++ return DESSERT_OK;
++}
++
++/** dump a dessert_msg_t to a string
++ * @arg *msg the message to be dumped
++ * @arg len the length of the buffer
++ * @arg *buf text output buffer
++ * @arg blen text output buffer length
++ **/
++void dessert_msg_dump(const dessert_msg_t* msg, size_t len, char *buf,
++ size_t blen) {
++ dessert_msg_proc_dump(msg, len, NULL, buf, blen);
++}
++
++/** free a dessert_msg
++ * @arg *msg message to free
++ **/
++void dessert_msg_destroy(dessert_msg_t* msg) {
++ free(msg);
++}
++
++/** creates a new dessert_msg from an ethernet frame.
++ * @arg *eth ethernet frame to encapsulate
++ * @arg len length of the ethernet frame
++ * @arg **msgout (out) pointer to return message address
++ * @return DESSERT_OK on success, -errno otherwise
++ **/
++int dessert_msg_ethencap(const struct ether_header* eth, size_t eth_len,
++ dessert_msg_t** msgout) {
++ int res;
++ dessert_ext_t *ext;
++ void *payload;
++
++ /* check len */
++ if (eth_len > DESSERT_MAXFRAMELEN - DESSERT_MSGLEN + ETHER_HDR_LEN) {
++ dessert_debug("failed to encapsulate ethernet frame of %d bytes (max=%d)",
++ eth_len, DESSERT_MAXFRAMELEN - DESSERT_MSGLEN + ETHER_HDR_LEN);
++ return (-EMSGSIZE);
++ }
++
++ /* create message */
++ res = dessert_msg_new(msgout);
++ if (res) {
++ return res;
++ }
++
++ /* add ether header */
++ res = dessert_msg_addext(*msgout, &ext, DESSERT_EXT_ETH, ETHER_HDR_LEN);
++ if (res) {
++ return res;
++ }
++ memcpy(ext->data, eth, ETHER_HDR_LEN);
++
++ /* copy message */
++ dessert_msg_addpayload(*msgout, &payload, (eth_len - ETHER_HDR_LEN));
++ memcpy(payload, ((uint8_t *) eth) + ETHER_HDR_LEN,
++ (eth_len - ETHER_HDR_LEN));
++
++ return (DESSERT_OK);
++}
++
++/** extracts an ethernet frame from a dessert_msg
++ * @arg *msg pointer to dessert_msg message to decapsulate
++ * @arg **ethout (out) pointer to return ethernet message
++ * @return eth_len on success, -1 otherwise
++ **/
++int dessert_msg_ethdecap(const dessert_msg_t* msg, struct ether_header** ethout) {
++ dessert_ext_t *ext;
++ int res;
++
++ /* create message */
++ size_t eth_len = ntohs(msg->plen) + ETHER_HDR_LEN;
++ *ethout = malloc(eth_len);
++ if (*ethout == NULL) {
++ return (-1);
++ }
++
++ /* copy header */
++ res = dessert_msg_getext(msg, &ext, DESSERT_EXT_ETH, 0);
++ if (res != 1) {
++ free(ethout);
++ return (-1);
++ }
++ memcpy(*ethout, ext->data, ETHER_HDR_LEN);
++
++ /* copy message */
++ memcpy(((uint8_t *) (*ethout)) + ETHER_HDR_LEN, (((uint8_t *) msg)
++ +ntohs(msg->hlen)), ntohs(msg->plen));
++
++ return (eth_len);
++}
++
++/** get the ether_header sent as DESSERT_EXT_ETH in a dessert_msg
++ * @arg *msg the message
++ * @return pointer to ether_header data, NULL if DESSERT_EXT_ETH not present
++ **/
++struct ether_header* dessert_msg_getl25ether(const dessert_msg_t* msg) {
++ dessert_ext_t *ext;
++ struct ether_header *l25h;
++ int res;
++
++ res = dessert_msg_getext(msg, &ext, DESSERT_EXT_ETH, 0);
++ if (res != 1) {
++ l25h = NULL;
++ } else {
++ l25h = (struct ether_header *) ext->data;
++ }
++
++ return l25h;
++}
++
++/** generates a copy of a dessert_msg_proc
++ * @arg **procnew (out) pointer to return message address
++ * @arg *procold pointer to the message to clone
++ * @return DESSERT_OK on success, -errno otherwise
++ **/
++int dessert_msg_proc_clone(dessert_msg_proc_t **procnew,
++ const dessert_msg_proc_t *procold) {
++ if (procold == NULL) {
++ *procnew = procold;
++ return (DESSERT_OK);
++ }
++
++ dessert_msg_proc_t *proc;
++
++ proc = malloc(DESSERT_MSGPROCLEN);
++
++ if (proc == NULL) {
++ return (-errno);
++ }
++
++ memcpy(proc, procold, DESSERT_MSGPROCLEN);
++
++ *procnew = proc;
++ return (DESSERT_OK);
++
++}
++
++/** dump a dessert_msg_t to a string
++ * @arg *msg the message to be dumped
++ * @arg len the length of the buffer
++ * @arg *proc the processing buffer
++ * @arg *buf text output buffer
++ * @arg blen text output buffer length
++ **/
++void dessert_msg_proc_dump(const dessert_msg_t* msg, size_t len,
++ const dessert_msg_proc_t *proc, char *buf, size_t blen) {
++ dessert_ext_t *ext;
++ int extidx = 0;
++ int i;
++ struct ether_header *l25h;
++
++#define _dessert_msg_check_append(...) snprintf(buf+strlen(buf), blen-strlen(buf), __VA_ARGS__)
++ memset((void *) buf, 0, blen);
++
++ _dessert_msg_check_append("\tl2_dhost: %02x:%02x:%02x:%02x:%02x:%02x\n",
++ msg->l2h.ether_dhost[0], msg->l2h.ether_dhost[1], msg->l2h.ether_dhost[2],
++ msg->l2h.ether_dhost[3], msg->l2h.ether_dhost[4], msg->l2h.ether_dhost[5]);
++ _dessert_msg_check_append("\tl2_shost: %02x:%02x:%02x:%02x:%02x:%02x\n",
++ msg->l2h.ether_shost[0], msg->l2h.ether_shost[1], msg->l2h.ether_shost[2],
++ msg->l2h.ether_shost[3], msg->l2h.ether_shost[4], msg->l2h.ether_shost[5]);
++ _dessert_msg_check_append("\tl2_type: %x\n\n", ntohs(msg->l2h.ether_type));
++
++ _dessert_msg_check_append("\tproto: ");
++ strncpy(buf + strlen(buf), msg->proto, DESSERT_PROTO_STRLEN);
++ _dessert_msg_check_append("\n\tver: %d\n", msg->ver);
++
++ _dessert_msg_check_append("\tflags: ");
++ if (msg->flags & DESSERT_FLAG_SPARSE)
++ _dessert_msg_check_append(" SPARSE");
++
++ _dessert_msg_check_append("\n\tttl: %x\n", (msg->ttl));
++ _dessert_msg_check_append("\tu8: %x\n", (msg->u8));
++ _dessert_msg_check_append("\tu16: %x\n", ntohs(msg->u16));
++ _dessert_msg_check_append("\thlen: %d\n", ntohs(msg->hlen));
++ _dessert_msg_check_append("\tplen: %d\n\n", ntohs(msg->plen));
++
++ /* get l2.5 header if possible */
++ if ((l25h = dessert_msg_getl25ether(msg)) != NULL) {
++ _dessert_msg_check_append("\tl25 proto: ethernet\n");
++
++ _dessert_msg_check_append("\tl25_dhost: %02x:%02x:%02x:%02x:%02x:%02x\n",
++ l25h->ether_dhost[0], l25h->ether_dhost[1], l25h->ether_dhost[2],
++ l25h->ether_dhost[3], l25h->ether_dhost[4], l25h->ether_dhost[5]);
++ _dessert_msg_check_append("\tl25_shost: %02x:%02x:%02x:%02x:%02x:%02x\n",
++ l25h->ether_shost[0], l25h->ether_shost[1], l25h->ether_shost[2],
++ l25h->ether_shost[3], l25h->ether_shost[4], l25h->ether_shost[5]);
++ _dessert_msg_check_append("\tl25_type: %x\n\n", ntohs(l25h->ether_type));
++
++ }
++
++ /* we have a trace */
++ if (dessert_msg_trace_dump(msg, buf, blen - strlen(buf)) > 1)
++ _dessert_msg_check_append("\n");
++
++ /* now other extensions.... */
++ ext = (dessert_ext_t *) ((uint8_t *) msg + DESSERT_MSGLEN);
++ while ((uint8_t *) ext < ((uint8_t *) msg + (size_t) ntohs(msg->hlen))) {
++ _dessert_msg_check_append("\textension %d:\n", extidx);
++
++ /* does current extension fit into the header? */
++ if ((((uint8_t *) ext + (size_t) ext->len) > ((uint8_t *) msg
++ + (size_t) ntohs(msg->hlen))) || (ext->len < 2)) {
++ _dessert_msg_check_append("\t\tbroken extension - giving up!\n");
++ break;
++ }
++
++ _dessert_msg_check_append("\t\ttype: 0x%02x\n", ext->type);
++ _dessert_msg_check_append("\t\tlen: %d\n", ext->len);
++
++ if (ext->type != DESSERT_EXT_ETH && ext->type != DESSERT_EXT_TRACE) {
++ _dessert_msg_check_append("\t\tdata: ");
++ for (i = 0; i < dessert_ext_getdatalen(ext); i++) {
++ _dessert_msg_check_append("0x%x ", ext->data[i]);
++ if (i % 12 == 1 && i != 1)
++ _dessert_msg_check_append("\t\t ");
++ }
++ }
++ _dessert_msg_check_append("\n");
++
++ ext = (dessert_ext_t *) ((uint8_t *) ext + (size_t) ext->len);
++ extidx++;
++ }
++
++ if (proc != NULL) {
++ _dessert_msg_check_append("\tlocal processing header:\n");
++ _dessert_msg_check_append("\tlflags: ");
++
++ if (proc->lflags & DESSERT_LFLAG_SRC_SELF)
++ _dessert_msg_check_append(" DESSERT_FLAG_SRC_SELF");
++ if (proc->lflags & DESSERT_LFLAG_DST_SELF)
++ _dessert_msg_check_append(" DESSERT_FLAG_DST_MULTICAST");
++ if (proc->lflags & DESSERT_LFLAG_DST_MULTICAST)
++ _dessert_msg_check_append(" DESSERT_FLAG_DST_SELF");
++ if (proc->lflags & DESSERT_LFLAG_DST_BROADCAST)
++ _dessert_msg_check_append(" DESSERT_FLAG_DST_BROADCAST");
++ if (proc->lflags & DESSERT_LFLAG_PREVHOP_SELF)
++ _dessert_msg_check_append(" DESSERT_FLAG_PREVHOP_SELF");
++ if (proc->lflags & DESSERT_LFLAG_NEXTHOP_SELF)
++ _dessert_msg_check_append(" NEXTHOP_SELF");
++ if (proc->lflags & DESSERT_LFLAG_NEXTHOP_BROADCAST)
++ _dessert_msg_check_append(" NEXTHOP_BROADCAST");
++ }
++
++}
++
++/** free a dessert_prc_msg
++ * @arg *proc processing buffer to free
++ **/
++void dessert_msg_proc_destroy(dessert_msg_proc_t* proc) {
++ free(proc);
++}
++
++/** add or replace payload to a dessert_msg
++ * @arg *msg the message the payload should be added to
++ * @arg **payload (out) the pointer to place the payload
++ * @arg len the length of the payload
++ * @return DESSERT_OK on success, DESSERT_ERR otherwise
++ **/
++int dessert_msg_addpayload(dessert_msg_t* msg, void** payload, int len) {
++ /* check payload */
++ if (len > DESSERT_MAXFRAMELEN - ntohs(msg->hlen)) {
++ return DESSERT_ERR; /* too big */
++ }
++
++ /* export payload pointer */
++ *payload = ((uint8_t *) msg + ntohs(msg->hlen));
++ msg->plen = htons(len);
++
++ return DESSERT_OK;
++}
++
++/** Retrieves a pointer to the payload of a dessert message @a msg.
++ *
++ * @param[in] *msg the message the payload should be retrieved from
++ * @param[out] **payload the pointer to place the payload in
++ *
++ * @return the length of the payload in bytes if any, 0 otherwise
++ */
++int dessert_msg_getpayload(dessert_msg_t *msg, void** payload) {
++
++ /* test if payload is present in msg */
++ if (msg->plen == 0) {
++ *payload = NULL;
++ return 0;
++ }
++
++ *payload = (uint8_t *) msg + ntohs(msg->hlen);
++
++ return msg->plen;
++}
++
++
++/** add an extension record to a dessert_msg
++ * @arg *msg the message the extension should be added to
++ * @arg **ext (out) the extension pointer to the reserved extension space
++ * @arg type the type of the extension
++ * @arg len the length of the ext data (without 2 byte extension header)
++ * @return DESSERT_OK on success,
++ **/
++int dessert_msg_addext(dessert_msg_t *msg, dessert_ext_t **ext, uint8_t type,
++ size_t len) {
++
++ /* check if sparse message */
++ if ((msg->flags & DESSERT_FLAG_SPARSE) > 0) {
++ dessert_debug("tried to add extension to a sparse message - use dessert_msg_clone() first!");
++ return -1;
++ }
++
++ /* add DESSERT_EXTLEN to len for convenience*/
++ len += DESSERT_EXTLEN;
++
++ /* check ext */
++ if (len > DESSERT_MAXFRAMELEN - ntohs(msg->hlen) - ntohs(msg->plen)) {
++ dessert_debug("message would be too large after adding extension!");
++ return -2; /* too big */
++ } else if (len < DESSERT_EXTLEN) {
++ dessert_debug("extension too small!");
++ return -3; /* too small */
++ } else if (len > 255) {
++ dessert_debug("extension too big!");
++ return -2; /* too big */
++ }
++
++ /* move payload if necessary */
++ if (ntohs(msg->plen) > 0) {
++ memmove(((uint8_t *) msg + ntohs(msg->hlen) + len), ((uint8_t *) msg
++ + ntohs(msg->hlen)), ntohs(msg->plen));
++ }
++
++ /* get ext addr */
++ *ext = (dessert_ext_t *) ((uint8_t *) msg + ntohs(msg->hlen));
++
++ /* update msg hlen */
++ msg->hlen = htons(ntohs(msg->hlen) + len);
++
++ /* copy in extension data */
++ (*ext)->len = len;
++ (*ext)->type = type;
++
++ return DESSERT_OK;
++}
++
++/** remove an extension record from a dessert_msg
++ * @arg *msg the message the extension should be added to
++ * @arg *ext (out) the extension pointer to the extension to be removed
++ * @return DESSERT_OK on success,
++ **/
++int dessert_msg_delext(dessert_msg_t *msg, dessert_ext_t *ext) {
++
++ /* check ext */
++ if ((((uint8_t *) ext) < ((uint8_t *) msg)) || (((uint8_t *) ext)
++ > (((uint8_t *) msg) + ntohs(msg->hlen)))) {
++ dessert_debug("extension not within packet header - won't remove");
++ return DESSERT_ERR;
++ }
++
++ msg->hlen = htons(ntohs(msg->hlen) - ext->len);
++
++ memmove(ext, ((uint8_t *) ext) + ext->len, (ntohs(msg->hlen)
++ + ntohs(msg->plen)) - (((uint8_t *) ext) - ((uint8_t *) msg)));
++
++ return DESSERT_OK;
++}
++
++/** Resizes a given extension record @a ext within in a @b dessert @b message
++ * @a msg to the new length @a new_len.
++ *
++ * @param[in] *msg the message
++ * @param[in] *ext the extension record
++ * @param[in] new_len the new length of the extension record
++ *
++ * @retval DESSERT_OK on success
++ *
++ * %DESCRIPTION:
++ *
++ **/
++int dessert_msg_resizeext(dessert_msg_t *msg, dessert_ext_t *ext, size_t new_len) {
++
++ int old_len = ext->len;
++
++ /* check ext */
++ if (new_len > DESSERT_MAXFRAMELEN - ntohs(msg->hlen) - ntohs(msg->plen) - old_len) {
++ dessert_debug("message would be too large after adding extension!");
++ return -2; /* too big */
++ } else if (new_len < DESSERT_EXTLEN) {
++ dessert_debug("extension too small!");
++ return -3; /* too small */
++ } else if (new_len > 255) {
++ dessert_debug("extension too big!");
++ return -2; /* too big */
++ }
++
++ memmove(((uint8_t *)ext) + new_len,((uint8_t *)ext) + ext->len, ntohs(msg->hlen)
++ + ntohs(msg->plen) - (((uint8_t *) ext) - ((uint8_t *) msg)) - ext->len);
++
++ msg->hlen = htons(ntohs(msg->hlen) - (ext->len - new_len));
++ ext->len = new_len;
++
++ return DESSERT_OK;
++}
++
++/** get an specific or all extensions
++ *
++ * @arg *msg the message
++ * @arg **ext (out) pointer to extracted extension
++ * sets *ext=NULL if extension not found
++ * may be NULL in this case only count/existence matters
++ * @arg type type of the ext to retrieve - use DESSERT_EXT_ANY to get any ext
++ * @arg index the index of the extension of that type, starting with 0
++ * @return 0 if the message has no such extension,
++ * @return count of extensions of that type if count > index
++ * @return -count of extensions of that type if count <= index
++ **/
++int dessert_msg_getext(const dessert_msg_t* msg, dessert_ext_t** ext,
++ uint8_t type, int index) {
++ int i = 0;
++ dessert_ext_t *exti;
++
++ if (ext != NULL)
++ *ext = NULL;
++
++ exti = (dessert_ext_t *) ((uint8_t *) msg + DESSERT_MSGLEN);
++ while ((uint8_t *) exti < ((uint8_t *) msg + (size_t) ntohs(msg->hlen))) {
++ /* does current extension fit into the header? */
++ if (type == exti->type || type == DESSERT_EXT_ANY) {
++ if (i == index && ext != NULL) {
++ *ext = exti;
++ }
++ i++;
++ }
++ exti = (dessert_ext_t *) (((uint8_t *) exti) + (size_t) exti->len);
++ }
++
++ if (i <= index) {
++ i = -i;
++ }
++ return (i);
++
++}
++
++/** get an specific or all extensions
++ *
++ * @arg *msg the message
++ * @arg type type of the ext to retrieve - use DESSERT_EXT_ANY to get any ext
++ * @return 0 if the message has no such extension,
++ * @return count of extensions of that type
++ **/
++int dessert_msg_get_ext_count(const dessert_msg_t* msg, uint8_t type) {
++ return dessert_msg_getext(msg, NULL, type, 0);
++}
++
++/** add initial trace header to dessert message
++ * @arg *msg dessert_msg_t message used for tracing
++ * @arg mode trace mode
++ * use DESSERT_MSG_TRACE_HOST to only record default mac of hosts on the way
++ * use DESSERT_MSG_TRACE_IFACE to also trace input interface and last hop
++ * ®return DESSERT_OK on success
++ **/
++int dessert_msg_trace_initiate(dessert_msg_t* msg, int mode) {
++
++ dessert_ext_t *ext;
++ struct ether_header *l25h;
++
++ if (mode != DESSERT_MSG_TRACE_HOST && mode != DESSERT_MSG_TRACE_IFACE)
++ return EINVAL;
++
++ if (msg->flags & DESSERT_FLAG_SPARSE)
++ return DESSERT_MSG_NEEDNOSPARSE;
++
++ dessert_msg_addext(msg, &ext, DESSERT_EXT_TRACE, mode);
++ memcpy((ext->data), dessert_l25_defsrc, ETHER_ADDR_LEN);
++ if (mode == DESSERT_MSG_TRACE_IFACE) {
++ memcpy((ext->data) + ETHER_ADDR_LEN, msg->l2h.ether_shost,
++ ETHER_ADDR_LEN);
++ l25h = dessert_msg_getl25ether(msg);
++ if (l25h == NULL) {
++ memcpy((ext->data) + ETHER_ADDR_LEN, ether_null, ETHER_ADDR_LEN);
++ } else {
++ memcpy((ext->data) + ETHER_ADDR_LEN * 2, l25h->ether_shost,
++ ETHER_ADDR_LEN);
++ }
++ }
++
++ return DESSERT_OK;
++
++}
++
++/** dump packet trace to string
++ * @arg *msg dessert_msg_t message used for tracing
++ * @arg *buf char buffer to place string
++ * use DESSERT_MSG_TRACE_HOST to only record default mac of hosts on the way
++ * use DESSERT_MSG_TRACE_IFACE to also trace input interface and last hop
++ * ®return length of the string - 0 if msg has no trace header
++ **/
++int dessert_msg_trace_dump(const dessert_msg_t* msg, char* buf, int blen) {
++
++ dessert_ext_t *ext;
++ int x, i = 0;
++
++#define _dessert_msg_trace_dump_append(...) snprintf(buf+strlen(buf), blen-strlen(buf), __VA_ARGS__)
++
++ x = dessert_msg_getext(msg, &ext, DESSERT_EXT_TRACE, 0);
++ if (x < 1)
++ return 0;
++
++ _dessert_msg_trace_dump_append("\tpacket trace:\n");
++ _dessert_msg_trace_dump_append("\t\tfrom %02x:%02x:%02x:%02x:%02x:%02x\n",
++ ext->data[0], ext->data[1], ext->data[2],
++ ext->data[3], ext->data[4], ext->data[5]);
++
++ if (dessert_ext_getdatalen(ext) == DESSERT_MSG_TRACE_IFACE) {
++ _dessert_msg_trace_dump_append("\t\t received on %02x:%02x:%02x:%02x:%02x:%02x\n",
++ ext->data[6], ext->data[7], ext->data[8],
++ ext->data[9], ext->data[10], ext->data[11]);
++ _dessert_msg_trace_dump_append("\t\t l2.5 src %02x:%02x:%02x:%02x:%02x:%02x\n",
++ ext->data[12], ext->data[13], ext->data[14],
++ ext->data[15], ext->data[16], ext->data[17]);
++ }
++
++ for (i = 1; i < x; i++) {
++ dessert_msg_getext(msg, &ext, DESSERT_EXT_TRACE, i);
++ _dessert_msg_trace_dump_append("\t\t#%3d %02x:%02x:%02x:%02x:%02x:%02x\n", i,
++ ext->data[0], ext->data[1], ext->data[2],
++ ext->data[3], ext->data[4], ext->data[5]);
++
++ if (dessert_ext_getdatalen(ext) == DESSERT_MSG_TRACE_IFACE) {
++ _dessert_msg_trace_dump_append("\t\t received from %02x:%02x:%02x:%02x:%02x:%02x\n",
++ ext->data[12], ext->data[13], ext->data[14],
++ ext->data[15], ext->data[16], ext->data[17]);
++ _dessert_msg_trace_dump_append("\t\t receiving iface %02x:%02x:%02x:%02x:%02x:%02x\n",
++ ext->data[6], ext->data[7], ext->data[8],
++ ext->data[9], ext->data[10], ext->data[11]);
++ }
++ }
++
++ return strlen(buf);
++
++}
++
++/** callback that checks whether a dessert_msg is consistent
++ * @arg *msg dessert_msg_t frame received
++ * @arg len length of ethernet frame received
++ * @arg *iface interface received packet on
++ * @return DESSERT_MSG_KEEP if message is valid, DESSERT_MSG_DROP otherwise
++ **/
++int dessert_msg_check_cb(dessert_msg_t* msg, size_t len,
++ dessert_msg_proc_t *proc, const dessert_meshif_t *iface,
++ dessert_frameid_t id) {
++ if (dessert_msg_check(msg, len)) {
++ dessert_debug("invalid package - discarding");
++ return DESSERT_MSG_DROP;
++ }
++ return DESSERT_MSG_KEEP;
++}
++
++/** dump a dessert_msg_t to debug log
++ * @arg *msg dessert_msg_t frame received
++ * @arg len length of ethernet frame received
++ * @arg *iface interface received packet on
++ * ®return DESSERT_MSG_KEEP always
++ **/
++int dessert_msg_dump_cb(dessert_msg_t* msg, size_t len,
++ dessert_msg_proc_t *proc, const dessert_meshif_t *iface,
++ dessert_frameid_t id) {
++ char buf[1024];
++
++ dessert_msg_proc_dump(msg, len, proc, buf, 1024);
++ dessert_debug("received frame #%lu on interface %s - dump:\n%s", (unsigned long) id, iface->if_name, buf);
++
++ return DESSERT_MSG_KEEP;
++}
++
++/** check if the message carries a trace extension and add the current trace info
++ * if iface is NULL, the packet is ignored
++ * @arg *msg dessert_msg_t frame received
++ * @arg len length of ethernet frame received
++ * @arg *iface interface received packet on
++ * ®return DESSERT_MSG_KEEP always
++ **/
++int dessert_msg_trace_cb(dessert_msg_t* msg, size_t len,
++ dessert_msg_proc_t *proc, const dessert_meshif_t *iface,
++ dessert_frameid_t id) {
++ dessert_ext_t *ext;
++
++ /* abort if message has no trace extension */
++ if (dessert_msg_getext(msg, &ext, DESSERT_EXT_TRACE, 0) == 0)
++ return DESSERT_MSG_KEEP;
++
++ /* abort if iface is NULL */
++ if (iface == NULL)
++ return DESSERT_MSG_KEEP;
++
++ /* we cannot add header to sparse messages */
++ if (msg->flags & DESSERT_FLAG_SPARSE)
++ return DESSERT_MSG_NEEDNOSPARSE;
++
++ /* get the trace mode (hop vs interface) */
++ if (dessert_ext_getdatalen(ext) == DESSERT_MSG_TRACE_HOST) {
++ dessert_msg_addext(msg, &ext, DESSERT_EXT_TRACE, DESSERT_MSG_TRACE_HOST);
++ memcpy((ext->data), dessert_l25_defsrc, ETHER_ADDR_LEN);
++ } else if (dessert_ext_getdatalen(ext) == DESSERT_MSG_TRACE_IFACE) {
++ dessert_msg_addext(msg, &ext, DESSERT_EXT_TRACE,
++ DESSERT_MSG_TRACE_IFACE);
++ memcpy((ext->data), dessert_l25_defsrc, ETHER_ADDR_LEN);
++ memcpy((ext->data) + ETHER_ADDR_LEN, iface->hwaddr, ETHER_ADDR_LEN);
++ memcpy((ext->data) + ETHER_ADDR_LEN * 2, msg->l2h.ether_shost,
++ ETHER_ADDR_LEN);
++ } else {
++ dessert_warn("got packet with %d bytes trace extension - ignoring");
++ }
++ return DESSERT_MSG_KEEP;
++}
++
++/** callback to set the local processing flags in dessert_msg_proc_t on an arriving dessert_msg_t
++ * @arg *msg dessert_msg_t frame received
++ * @arg len length of ethernet frame received
++ * @arg *iface interface received packet on
++ * ®return DESSERT_MSG_KEEP or DESSERT_MSG_NEEDMSGPROC
++ **/
++int dessert_msg_ifaceflags_cb(dessert_msg_t* msg, size_t len,
++ dessert_msg_proc_t *proc, const dessert_meshif_t *riface,
++ dessert_frameid_t id) {
++
++ dessert_meshif_t *iface;
++ struct ether_header *l25h;
++
++ /* check if we have an processing header */
++ if (proc == NULL)
++ return DESSERT_MSG_NEEDMSGPROC;
++
++ /* get l2.5 header if possible */
++ l25h = dessert_msg_getl25ether(msg);
++
++ /* clear flags */
++ proc->lflags &= ~(DESSERT_LFLAG_DST_SELF | DESSERT_LFLAG_SRC_SELF
++ | DESSERT_LFLAG_NEXTHOP_SELF | DESSERT_LFLAG_PREVHOP_SELF
++ | DESSERT_LFLAG_NEXTHOP_BROADCAST
++ | DESSERT_LFLAG_DST_SELF_OVERHEARD
++ | DESSERT_LFLAG_NEXTHOP_SELF_OVERHEARD);
++
++ /* checks against defaults */
++ if (l25h != NULL && memcmp(l25h->ether_dhost, ether_broadcast,
++ ETHER_ADDR_LEN) == 0) {
++ proc->lflags |= DESSERT_LFLAG_DST_BROADCAST;
++ } else if (l25h != NULL && l25h->ether_dhost[0] & 0x01) { /* broadcast also has this bit set */
++ proc->lflags |= DESSERT_LFLAG_DST_MULTICAST;
++ }
++
++ if (l25h != NULL && memcmp(l25h->ether_dhost, dessert_l25_defsrc,
++ ETHER_ADDR_LEN) == 0) {
++ proc->lflags |= DESSERT_LFLAG_DST_SELF;
++ }
++ if (l25h != NULL && memcmp(l25h->ether_shost, dessert_l25_defsrc,
++ ETHER_ADDR_LEN) == 0) {
++ proc->lflags |= DESSERT_LFLAG_SRC_SELF;
++ }
++ if (memcmp(msg->l2h.ether_dhost, dessert_l25_defsrc, ETHER_ADDR_LEN) == 0) {
++ proc->lflags |= DESSERT_LFLAG_NEXTHOP_SELF;
++ }
++ if (memcmp(msg->l2h.ether_shost, dessert_l25_defsrc, ETHER_ADDR_LEN) == 0) {
++ proc->lflags |= DESSERT_LFLAG_PREVHOP_SELF;
++ }
++ if (memcmp(msg->l2h.ether_dhost, ether_broadcast, ETHER_ADDR_LEN) == 0) {
++ proc->lflags |= DESSERT_LFLAG_NEXTHOP_BROADCAST;
++ }
++
++ /* checks against interfaces in list */
++ pthread_rwlock_rdlock(&dessert_cfglock);
++ DL_FOREACH(dessert_meshiflist_get(), iface) {
++ if (l25h != NULL && memcmp(l25h->ether_dhost, iface->hwaddr,
++ ETHER_ADDR_LEN) == 0) {
++ proc->lflags |= DESSERT_LFLAG_DST_SELF;
++ if (memcmp(l25h->ether_dhost, riface->hwaddr, ETHER_ADDR_LEN) != 0) {
++ proc->lflags |= DESSERT_LFLAG_DST_SELF_OVERHEARD;
++ }
++ }
++ if (l25h != NULL && memcmp(l25h->ether_shost, iface->hwaddr,
++ ETHER_ADDR_LEN) == 0) {
++ proc->lflags |= DESSERT_LFLAG_SRC_SELF;
++ }
++ if (memcmp(msg->l2h.ether_dhost, iface->hwaddr, ETHER_ADDR_LEN) == 0) {
++ proc->lflags |= DESSERT_LFLAG_NEXTHOP_SELF;
++ if (memcmp(msg->l2h.ether_dhost, riface->hwaddr, ETHER_ADDR_LEN)
++ != 0) {
++ proc->lflags |= DESSERT_LFLAG_NEXTHOP_SELF_OVERHEARD;
++ }
++ }
++ if (memcmp(msg->l2h.ether_shost, iface->hwaddr, ETHER_ADDR_LEN) == 0) {
++ proc->lflags |= DESSERT_LFLAG_PREVHOP_SELF;
++ }
++ }
++ pthread_rwlock_unlock(&dessert_cfglock);
++
++ return DESSERT_MSG_KEEP;
++}
++
++/******************************************************************************
++ *
++ * INTERNAL / PRIVATE
++ *
++ * M E S S A G E H A N D L I N G
++ *
++ ******************************************************************************/
++
++/* nothing here - yet */
++
++/******************************************************************************
++ *
++ * LOCAL
++ *
++ * M E S S A G E H A N D L I N G
++ *
++ ******************************************************************************/
++
++/* nothing here - yet */
+diff --git a/src/libdessert/dessert_periodic.c b/src/libdessert/dessert_periodic.c
+new file mode 100644
+index 0000000..40bfa71
+--- /dev/null
++++ b/src/libdessert/dessert_periodic.c
+@@ -0,0 +1,326 @@
++/******************************************************************************
++ Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
++ All rights reserved.
++
++ These sources were originally developed by Philipp Schmidt
++ at Freie Universitaet Berlin (http://www.fu-berlin.de/),
++ Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
++ (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
++ ------------------------------------------------------------------------------
++ This program is free software: you can redistribute it and/or modify it under
++ the terms of the GNU General Public License as published by the Free Software
++ Foundation, either version 3 of the License, or (at your option) any later
++ version.
++
++ This program is distributed in the hope that it will be useful, but WITHOUT
++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
++ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along with
++ this program. If not, see http://www.gnu.org/licenses/ .
++ ------------------------------------------------------------------------------
++ For further information and questions please use the web site
++ http://www.des-testbed.net/
++ *******************************************************************************/
++
++#include "dessert_internal.h"
++#include <dessert/dessert.h>
++
++/* global data storage // P U B L I C */
++
++/* global data storage // P R I V A T E */
++dessert_periodic_t *_tasklist = NULL;
++pthread_mutex_t _dessert_periodic_mutex = PTHREAD_MUTEX_INITIALIZER;
++pthread_cond_t _dessert_periodic_changed = PTHREAD_COND_INITIALIZER;
++pthread_t _dessert_periodic_worker;
++int _dessert_periodic_worker_running = 0;
++
++/* local data storage*/
++
++/* local functions forward declarations*/
++static int _dessert_periodic_add_periodic_t(dessert_periodic_t *task);
++static void *_dessert_periodic_thread(void* arg);
++
++/******************************************************************************
++ *
++ * EXTERNAL / PUBLIC
++ *
++ * P E R I O D I C T A S K S
++ *
++ ******************************************************************************/
++
++/** Adds a delayed/periodic task to the task list
++ *
++ * @param[in] c callback to call when task is scheduled
++ * @param[in] data data to give to the callback
++ * @param[in] scheduled when should the callback be called the first time
++ * @param[in] interval how often should it be called (set to NULL if only once)
++ *
++ * @retval pointer if the callback was added successfully
++ * @retval NULL otherwise
++ *
++ * @note The <a href="http://www.gnu.org/s/libc/manual/html_node/Elapsed-Time.html#Elapsed-Time">GNU C Library Documentation</a>
++ * states about the @c tv_usec member of the @c struct @c timeval: <em>This is the
++ * rest of the elapsed time (a fraction of a second), represented as the number
++ * of microseconds. It is always less than one @a million.</em> So, to make sure
++ * this invariant is always met, consider using the provided TIMEVAL_ADD() macro.
++ *
++ * @par Description:
++ *
++ * @par Examples:
++ * @li Register a callback function to be executed every 1.5 seconds - and
++ * delay the first call to it for another 1.5 seconds:
++ * @code
++ * struct timeval interval;
++ * interval.tv_sec = 1;
++ * interval.tv_usec = 500000;
++ *
++ * struct timeval schedule;
++ * gettimeofday(&schedule, NULL);
++ * TIMEVAL_ADD(&schedule, 1, 500000);
++ *
++ * dessert_periodic_add(callback, NULL, &schedule, &interval);
++ * @endcode
++ *
++ *
++ */
++dessert_periodic_t *dessert_periodic_add(dessert_periodiccallback_t* c,
++ void *data, const struct timeval *scheduled,
++ const struct timeval *interval) {
++ struct timeval now;
++ dessert_periodic_t *task;
++
++ if (scheduled == NULL) {
++ gettimeofday(&now, NULL);
++ scheduled = &now;
++ }
++ assert(scheduled != NULL);
++
++ /* sanity checks */
++ if (c == NULL) {
++ return (NULL);
++ }
++
++ /* get task memory */
++ task = malloc(sizeof(dessert_periodic_t));
++ if (task == NULL) {
++ return NULL;
++ }
++
++ /* copy data */
++ task->c = c;
++ task->data = data;
++ memcpy(&(task->scheduled), scheduled, sizeof(struct timeval));
++ if (interval == NULL) {
++ task->interval.tv_sec = 0;
++ task->interval.tv_usec = 0;
++ } else {
++ memcpy(&(task->interval), interval, sizeof(struct timeval));
++ }
++ task->next = NULL;
++
++ pthread_mutex_lock(&_dessert_periodic_mutex);
++ _dessert_periodic_add_periodic_t(task);
++ pthread_mutex_unlock(&_dessert_periodic_mutex);
++
++ return (task);
++}
++
++/** Adds a delayed task to the task list
++ *
++ * This is an easier version of dessert_periodic_add() taking a single delay as parameter.
++ *
++ * @param[in] c callback to call when task is scheduled
++ * @param[in] data data to give to the callback
++ * @param[in] delay the delay in seconds
++ *
++ * %DESCRIPTION: \n
++ */
++dessert_periodic_t *dessert_periodic_add_delayed(dessert_periodiccallback_t* c,
++ void *data, int delay) {
++ struct timeval at;
++ gettimeofday(&at, NULL);
++
++ at.tv_sec += delay;
++
++ return (dessert_periodic_add(c, data, &at, NULL));
++}
++
++/** Removes a delayed/periodic task from the task list.
++ *
++ * @param[in] p pointer to task description
++ *
++ * @return -1 on failure, 0 if the task was removed
++ *
++ * %DESCRIPTION: \n
++ */
++int dessert_periodic_del(dessert_periodic_t *p) {
++ dessert_periodic_t *i;
++ int x = -1;
++
++ assert(p != NULL);
++
++ pthread_mutex_lock(&_dessert_periodic_mutex);
++
++ if (p == _tasklist) {
++ _tasklist = _tasklist->next;
++ x++;
++ }
++
++ i = _tasklist;
++ while (i != NULL) {
++ if (i->next == p) {
++ i->next = p->next;
++ x++;
++ }
++ i = i->next;
++ }
++
++ pthread_mutex_unlock(&_dessert_periodic_mutex);
++
++ assert(x < 2);
++
++ free(p);
++ return (x);
++
++}
++
++/******************************************************************************
++ *
++ * INTERNAL / PRIVATE
++ *
++ * P E R I O D I C T A S K S
++ *
++ ******************************************************************************/
++
++/** internal function to start periodic worker */
++void _dessert_periodic_init() {
++ if (_dessert_periodic_worker_running == 0) {
++ _dessert_periodic_worker_running = 1;
++ pthread_create(&_dessert_periodic_worker, NULL,
++ _dessert_periodic_thread, NULL);
++ }
++}
++
++/******************************************************************************
++ *
++ * LOCAL / PRIVATE
++ *
++ * P E R I O D I C T A S K S
++ *
++ ******************************************************************************/
++
++/* internal task list modifier - only call while holding _dessert_periodic_mutex */
++static int _dessert_periodic_add_periodic_t(dessert_periodic_t *task) {
++
++ dessert_periodic_t *i;
++
++ /* first task? */
++ if (_tasklist == task) {
++ dessert_err("infinite loop in periodic tasklist requested - aborting!");
++ return (-1);
++ } else if (_tasklist == NULL) {
++ _tasklist = task;
++ pthread_cond_broadcast(&_dessert_periodic_changed);
++ }
++ /* is next task.... */
++ else if (task->scheduled.tv_sec < _tasklist->scheduled.tv_sec
++ || (task->scheduled.tv_sec == _tasklist->scheduled.tv_sec
++ && task->scheduled.tv_usec < _tasklist->scheduled.tv_usec)) {
++ task->next = _tasklist;
++ _tasklist = task;
++ pthread_cond_broadcast(&_dessert_periodic_changed);
++ }
++ /* search right place */
++ else {
++ i = _tasklist;
++ while (i->next != NULL && (i->next->scheduled.tv_sec
++ < task->scheduled.tv_sec || (i->next->scheduled.tv_sec
++ == task->scheduled.tv_sec && i->next->scheduled.tv_usec
++ <= task->scheduled.tv_usec))) {
++ i = i->next;
++ if (i->next == task) {
++ dessert_err("infinite loop in periodic tasklist requested - aborting!");
++ return (-1);
++ }
++ }
++ /* last or right place */
++ task->next = i->next;
++ i->next = task;
++ /* no need to tell periodic thread to check
++ again - next task has not changed */
++ }
++
++ return (0);
++
++}
++
++/* internal worker for the task list */
++static void *_dessert_periodic_thread(void* arg) {
++ dessert_periodic_t *next_task;
++ dessert_periodic_t task;
++ struct timeval now;
++ struct timespec ts;
++
++ pthread_mutex_lock(&_dessert_periodic_mutex);
++
++ while (1) {
++
++ gettimeofday(&now, NULL);
++
++ if (_tasklist == NULL) {
++ if (pthread_cond_wait(&_dessert_periodic_changed,
++ &_dessert_periodic_mutex) == EINVAL) {
++ dessert_err("sleeping failed in periodic scheduler - scheduler died");
++ break;
++ }
++ continue;
++ } else if (now.tv_sec < _tasklist->scheduled.tv_sec || (now.tv_sec
++ == _tasklist->scheduled.tv_sec && now.tv_usec
++ < _tasklist->scheduled.tv_usec)) {
++ ts.tv_sec = _tasklist->scheduled.tv_sec;
++ ts.tv_nsec = _tasklist->scheduled.tv_usec * 1000;
++ if (pthread_cond_timedwait(&_dessert_periodic_changed,
++ &_dessert_periodic_mutex, &ts) == EINVAL) {
++ dessert_err("sleeping failed in periodic scheduler - scheduler died");
++ break;
++ }
++ continue;
++ }
++
++ /* run next task */
++ next_task = _tasklist;
++ _tasklist = next_task->next;
++
++ /* safe task to local variable */
++ memcpy(&task, next_task, sizeof(dessert_periodic_t));
++
++ /* periodic task - re-add */
++ if (next_task->interval.tv_sec != 0 || next_task->interval.tv_usec != 0) {
++ next_task->scheduled.tv_sec += next_task->interval.tv_sec;
++ next_task->scheduled.tv_usec += next_task->interval.tv_usec;
++ if (next_task->scheduled.tv_usec >= 1000000) {
++ next_task->scheduled.tv_sec += 1;
++ next_task->scheduled.tv_usec -= 1000000;
++ }
++ _dessert_periodic_add_periodic_t(next_task);
++ }
++ /* otherwise free memory */
++ else {
++ free(next_task);
++ }
++
++ /* run the callback */
++ pthread_mutex_unlock(&_dessert_periodic_mutex);
++ /* call the callback - remove it from list if exits with nonzero code */
++ if (task.c(task.data, &(task.scheduled), &(task.interval))) {
++ dessert_periodic_del(next_task);
++ }
++ pthread_mutex_lock(&_dessert_periodic_mutex);
++ }
++
++ pthread_mutex_unlock(&_dessert_periodic_mutex);
++ _dessert_periodic_worker_running = 0;
++
++ return (NULL);
++}
+diff --git a/src/libdessert/dessert_sysiface.c b/src/libdessert/dessert_sysiface.c
+new file mode 100644
+index 0000000..1055fee
+--- /dev/null
++++ b/src/libdessert/dessert_sysiface.c
+@@ -0,0 +1,487 @@
++/******************************************************************************
++ Copyright 2009, The DES-SERT Team, Freie Universitaet Berlin (FUB).
++ All rights reserved.
++
++ These sources were originally developed by Philipp Schmidt
++ at Freie Universitaet Berlin (http://www.fu-berlin.de/),
++ Computer Systems and Telematics / Distributed, Embedded Systems (DES) group
++ (http://cst.mi.fu-berlin.de/, http://www.des-testbed.net/)
++ ------------------------------------------------------------------------------
++ This program is free software: you can redistribute it and/or modify it under
++ the terms of the GNU General Public License as published by the Free Software
++ Foundation, either version 3 of the License, or (at your option) any later
++ version.
++
++ This program is distributed in the hope that it will be useful, but WITHOUT
++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
++ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along with
++ this program. If not, see http://www.gnu.org/licenses/ .
++ ------------------------------------------------------------------------------
++ For further information and questions please use the web site
++ http://www.des-testbed.net/
++ *******************************************************************************/
++
++#include "dessert_internal.h"
++#include <dessert/dessert.h>
++
++#ifdef __DARWIN__
++#define TUNSIFHEAD _IOW('t', 96, int)
++#define TUNGIFHEAD _IOR('t', 97, int)
++#endif
++
++#ifdef __FreeBSD__
++#include <net/if_tun.h>
++#endif
++
++#ifdef __linux__
++#include <linux/if_tun.h>
++#endif
++
++uint8_t dessert_sysif_hwaddr[ETHER_ADDR_LEN]; // TODO unused! to be removed ??!?
++
++/* global data storage // P U B L I C */
++/* nothing here - yet */
++
++/* global data storage // P R I V A T E */
++dessert_sysif_t *_dessert_sysif = NULL;
++
++/* local data storage*/
++dessert_sysrxcbe_t *_dessert_sysrxcblist = NULL;
++int _dessert_sysrxcblistver = 0;
++
++/* internal functions forward declarations*/
++static void *_dessert_sysif_init_thread(void* arg);
++static int _dessert_sysif_init_getmachack(dessert_msg_t *msg, size_t len,
++ dessert_msg_proc_t *proc, dessert_sysif_t *sysif, dessert_frameid_t id);
++
++/******************************************************************************
++ *
++ * EXTERNAL / PUBLIC
++ *
++ * S Y S - I N T E R F A C E S
++ *
++ ******************************************************************************/
++
++/** Initializes the tun/tap Interface dev for des-sert.
++ * @arg *device interface name
++ * @arg flags @see DESSERT_TUN @see DESSERT_TAP @see DESSERT_MAKE_DEFSRC
++ * @return 0 -- on success
++ * @return EINVAL -- if message is broken
++ * @return EFAULT -- if interface not specified and not guessed
++ **/
++int dessert_sysif_init(char* device, uint8_t flags) {
++
++ char *buf;
++
++#ifdef __linux__
++ struct ifreq ifr;
++#endif
++
++ /* initialize _dessert_sysif */
++ _dessert_sysif = malloc(sizeof(dessert_sysif_t));
++ if (_dessert_sysif == NULL)
++ return (-errno);
++ memset((void *) _dessert_sysif, 0, sizeof(dessert_sysif_t));
++ _dessert_sysif->flags = flags;
++ strncpy(_dessert_sysif->if_name, device, IF_NAMESIZE);
++ _dessert_sysif->if_name[IF_NAMESIZE - 1] = '\0';
++ pthread_mutex_init(&(_dessert_sysif->cnt_mutex), NULL);
++
++#ifdef __FreeBSD__
++
++ /* open device */
++ buf = malloc(IF_NAMESIZE+6);
++ snprintf(buf, IF_NAMESIZE+6, "/dev/%s", device);
++ _dessert_sysif->fd = open(buf, O_RDWR);
++ if(_dessert_sysif->fd < 0) {
++ dessert_err("could not open interface %s using %s: %s", device, buf, strerror(errno));
++ free(buf);
++ return (-errno);
++ }
++ free(buf);
++
++ /* set header mode on for mode tun */
++ if(flags & DESSERT_TUN) {
++ const int one = 1;
++ if(ioctl(_dessert_sysif->fd, TUNSIFHEAD, &one, sizeof one) == -1) {
++ dessert_err("setting TUNSIFHEAD failed: %s",strerror(errno));
++ goto dessert_sysif_init_err;
++ return (-errno);
++ }
++ }
++
++#elif __linux__
++
++ /* open device */
++ buf = "/dev/net/tun";
++ _dessert_sysif->fd = open(buf, O_RDWR);
++ memset(&ifr, 0, sizeof(ifr));
++ if (flags & DESSERT_TUN) {
++ ifr.ifr_flags = IFF_TUN; /* we want the service flag - no IFF_NO_PI */
++ } else {
++ ifr.ifr_flags = IFF_TAP | IFF_NO_PI; /* we want the service flag and IFF_NO_PI */
++ }
++ strcpy(ifr.ifr_name, _dessert_sysif->if_name);
++ if (ioctl(_dessert_sysif->fd, TUNSETIFF, (void *) &ifr) < 0) {
++ dessert_err("ioctl(TUNSETIFF) failed: %s", strerror(errno));
++ goto dessert_sysif_init_err;
++ return (-errno);
++ }
++ strcpy(_dessert_sysif->if_name, ifr.ifr_name);
++
++#else
++
++ goto not_implemented;
++
++#endif
++
++ /* check interface - abusing dessert_meshif methods */
++ _dessert_sysif->if_index = if_nametoindex(device);
++ if (!_dessert_sysif->if_index) {
++ dessert_err("interface %s - no such interface", _dessert_sysif->if_name);
++ goto dessert_sysif_init_err;
++ }
++
++ /* do ifconfig to set the interface up - strange things happen otherwise */
++ buf = malloc(IF_NAMESIZE + 16);
++ snprintf(buf, IF_NAMESIZE + 15, "ifconfig %s up", _dessert_sysif->if_name);
++ system(buf);
++ free(buf);
++
++ /* get hardware address in tap mode if possible */
++ if (flags & DESSERT_TAP) {
++ if (_dessert_meshif_gethwaddr((dessert_meshif_t *) _dessert_sysif) != 0) {
++ dessert_err("failed to get hwaddr of interface %s(%d) - hope src of first packet received from is it",
++ _dessert_sysif->if_name, _dessert_sysif->if_index, _dessert_sysif);
++ _dessert_sysif->flags |= _DESSERT_TAP_NOMAC;
++ dessert_sysrxcb_add(_dessert_sysif_init_getmachack, 0);
++ } else {
++ /* check whether we need to set defsrc */
++ if ((flags & DESSERT_MAKE_DEFSRC) || memcmp(dessert_l25_defsrc,
++ ether_null, ETHER_ADDR_LEN) == 0) {
++ memcpy(dessert_l25_defsrc, _dessert_sysif->hwaddr,
++ ETHER_ADDR_LEN);
++ dessert_info("set dessert_l25_defsrc to hwaddr %02x:%02x:%02x:%02x:%02x:%02x",
++ dessert_l25_defsrc[0], dessert_l25_defsrc[1],dessert_l25_defsrc[2],
++ dessert_l25_defsrc[3], dessert_l25_defsrc[4], dessert_l25_defsrc[5]);
++ }
++ }
++ }
++
++ /* info message */
++ if (flags & DESSERT_TAP) {
++ dessert_info("starting worker thread for tap interface %s(%d) hwaddr %02x:%02x:%02x:%02x:%02x:%02x",
++ _dessert_sysif->if_name, _dessert_sysif->if_index,
++ _dessert_sysif->hwaddr[0], _dessert_sysif->hwaddr[1], _dessert_sysif->hwaddr[2],
++ _dessert_sysif->hwaddr[3], _dessert_sysif->hwaddr[4], _dessert_sysif->hwaddr[5]);
++ } else {
++ dessert_info("starting worker thread for tap interface %s(%d) fd %d",
++ _dessert_sysif->if_name, _dessert_sysif->if_index, _dessert_sysif->fd);
++ }
++
++ /* start worker thread */
++ if (pthread_create(&(_dessert_sysif->worker), NULL,
++ _dessert_sysif_init_thread, (void *) _dessert_sysif)) {
++ dessert_err("creating worker thread failed for interface %s(%d)",
++ _dessert_sysif->if_name, _dessert_sysif->if_index);
++ goto dessert_sysif_init_err;
++ }
++
++ /* done */
++ return (DESSERT_OK);
++
++ dessert_sysif_init_err: close(_dessert_sysif->fd);
++
++ return (-errno);
++}
++
++/** adds a callback function to call if a packet should be injected into dessert via a tun/tap interface
++ * @arg *c callback function
++ * @arg prio priority of the function - lower first!
++ * @return DESSERT_OK on success
++ * @return -errno on error
++ **/
++int dessert_sysrxcb_add(dessert_sysrxcb_t* c, int prio) {
++ dessert_sysrxcbe_t *cb, *i;
++
++ cb = (struct dessert_sysrxcbe*) malloc(sizeof(struct dessert_sysrxcbe));
++ if (cb == NULL) {
++ dessert_err("failed to allocate memory for registering sys callback: %s", strerror(errno));
++ return (-errno);
++ }
++
++ if (c == NULL) {
++ dessert_err("tried to add a null pointer as dessert_sysrxcb");
++ return (-EINVAL);
++ }
++
++ pthread_rwlock_wrlock(&dessert_cfglock);
++
++ cb->c = c;
++ cb->prio = prio;
++ cb->next = NULL;
++
++ if (_dessert_sysrxcblist == NULL) {
++ _dessert_sysrxcblist = cb;
++ _dessert_sysrxcblistver++;
++
++ pthread_rwlock_unlock(&dessert_cfglock);
++ return DESSERT_OK;
++ }
++
++ if (_dessert_sysrxcblist->prio > cb->prio) {
++ cb->next = _dessert_sysrxcblist;
++ _dessert_sysrxcblist = cb;
++ _dessert_sysrxcblistver++;
++
++ pthread_rwlock_unlock(&dessert_cfglock);
++ return DESSERT_OK;
++ }
++
++ /* find right place for callback */
++ for (i = _dessert_sysrxcblist; i->next != NULL && i->next->prio <= cb->prio; i
++ = i->next)
++ ;
++
++ /* insert it */
++ cb->next = i->next;
++ i->next = cb;
++ _dessert_sysrxcblistver++;
++
++ pthread_rwlock_unlock(&dessert_cfglock);
++ return DESSERT_OK;
++}
++
++/** removes all occurrences of the callback function from the list of callbacks.
++ * @arg c callback function
++ * @return DESSERT_OK on success, DESSERT_ERR on error
++ **/
++int dessert_sysrxcb_del(dessert_sysrxcb_t* c) {
++ int count = 0;
++ dessert_sysrxcbe_t *i, *last;
++
++ pthread_rwlock_wrlock(&dessert_cfglock);
++
++ if (_dessert_sysrxcblist == NULL) {
++ goto dessert_sysrxcb_del_out;
++ }
++
++ while (_dessert_sysrxcblist->c == c) {
++ count++;
++ i = _dessert_sysrxcblist;
++ _dessert_sysrxcblist = _dessert_sysrxcblist->next;
++ free(i);
++ if (_dessert_sysrxcblist == NULL) {
++ goto dessert_sysrxcb_del_out;
++ }
++ }
++
++ for (i = _dessert_sysrxcblist; i->next != NULL; i = i->next) {
++ if (i->c == c) {
++ count++;
++ last->next = i->next;
++ free(i);
++ i = last;
++ }
++ last = i;
++ }
++
++ dessert_sysrxcb_del_out: _dessert_sysrxcblistver++;
++ pthread_rwlock_unlock(&dessert_cfglock);
++ return ((count > 0) ? DESSERT_OK : DESSERT_ERR);
++
++}
++
++/** sends a packet via tun/tap interface to the kernel
++ * @arg *msg message to send
++ * @return DESSERT_OK on success
++ * @return -EIO if message failed to be sent
++ **/
++int dessert_syssend_msg(dessert_msg_t *msg) {
++ struct ether_header *eth;
++ size_t eth_len;
++
++ eth_len = dessert_msg_ethdecap(msg, &eth);
++ if (eth_len == -1) {
++ return (-EIO);
++ }
++ dessert_syssend(eth, eth_len);
++ free(eth);
++
++ return DESSERT_OK;
++}
++
++/** sends a packet via tun/tap interface to the kernel
++ * @arg *eth message to send
++ * @arg len length of message to send
++ * @return DESSERT_OK on success
++ * @return -EIO if message failed to be sent
++ **/
++int dessert_syssend(const struct ether_header *eth, size_t len) {
++ ssize_t res = 0;
++
++ if (_dessert_sysif == NULL)
++ return (-EIO);
++
++ if (_dessert_sysif->flags & DESSERT_TUN) {
++ eth
++ = (struct ether_header *) (((uint8_t *) eth) + (ETHER_ADDR_LEN
++ * 2));
++ len -= (ETHER_ADDR_LEN * 2);
++ }
++
++ res = write(_dessert_sysif->fd, (const void *) eth, len);
++
++ if (res == len) {
++ pthread_mutex_lock(&(_dessert_sysif->cnt_mutex));
++ _dessert_sysif->opkts++;
++ _dessert_sysif->obytes += res;
++ pthread_mutex_unlock(&(_dessert_sysif->cnt_mutex));
++ return (DESSERT_OK);
++ } else {
++
++ return (-EIO);
++ }
++}
++
++/******************************************************************************
++ *
++ * INTERNAL / PRIVATE
++ *
++ * S Y S - I N T E R F A C E S
++ *
++ ******************************************************************************/
++
++/* nothing here - yet */
++
++/******************************************************************************
++ *
++ * LOCAL
++ *
++ * S Y S - I N T E R F A C E S
++ *
++ ******************************************************************************/
++
++/** internal callback which gets registered if we can't find out mac address of tap interface */
++static int _dessert_sysif_init_getmachack(dessert_msg_t *msg, size_t len,
++ dessert_msg_proc_t *proc, dessert_sysif_t *sysif, dessert_frameid_t id) {
++
++ struct ether_header *eth;
++ dessert_msg_ethdecap(msg, &eth);
++
++ /* hack to get the hardware address */
++ if (sysif->flags & _DESSERT_TAP_NOMAC) {
++ /* copy from first packet received */
++ memcpy(sysif->hwaddr, eth->ether_shost, ETHER_ADDR_LEN);
++ dessert_info("guessed hwaddr for %s: %02x:%02x:%02x:%02x:%02x:%02x", sysif->if_name,
++ sysif->hwaddr[0], sysif->hwaddr[1], sysif->hwaddr[2],
++ sysif->hwaddr[3], sysif->hwaddr[4], sysif->hwaddr[5]);
++ /* check whether we need to set defsrc */
++ if ((sysif->flags & DESSERT_MAKE_DEFSRC) || memcmp(dessert_l25_defsrc,
++ ether_null, ETHER_ADDR_LEN) == 0) {
++ memcpy(dessert_l25_defsrc, sysif->hwaddr, ETHER_ADDR_LEN);
++ dessert_info("set dessert_l25_defsrc to hwaddr %02x:%02x:%02x:%02x:%02x:%02x",
++ dessert_l25_defsrc[0], dessert_l25_defsrc[1],dessert_l25_defsrc[2],
++ dessert_l25_defsrc[3], dessert_l25_defsrc[4], dessert_l25_defsrc[5]);
++ }
++ sysif->flags &= ~_DESSERT_TAP_NOMAC;
++ }
++
++ /* unregister me */
++ dessert_sysrxcb_del(_dessert_sysif_init_getmachack);
++
++ return DESSERT_MSG_KEEP;
++}
++
++/** internal packet processing thread body */
++static void *_dessert_sysif_init_thread(void* arg) {
++
++ dessert_sysif_t *sysif = (dessert_sysif_t *) arg;
++ size_t len;
++ size_t buflen = ETHER_MAX_LEN;
++ char buf[buflen];
++ dessert_msg_proc_t proc;
++ dessert_frameid_t id;
++ dessert_sysrxcbe_t *cb;
++ int res;
++ int ex = 0;
++ dessert_sysrxcb_t **cbl = NULL;
++ int cbllen = 0;
++ int cblcur = -1;
++ int cblver = -1;
++
++ while (!ex) {
++
++ memset(buf, 0, buflen);
++
++ if (sysif->flags & DESSERT_TUN) {
++ len = read((sysif->fd), buf + (ETHER_ADDR_LEN * 2), buflen
++ - (ETHER_ADDR_LEN * 2));
++ } else {
++ len = read((sysif->fd), buf, buflen);
++ }
++
++ if (len == -1) {
++ dessert_debug("got %s while reading on %s (fd %d) - is the sys (tun/tap) interface up?", strerror(errno), sysif->if_name, sysif->fd);
++ sleep(1);
++ continue;
++ }
++ if (sysif->flags & DESSERT_TUN) {
++ len += (ETHER_ADDR_LEN * 2);
++ }
++
++ /* copy callbacks to internal list to release dessert_cfglock before invoking callbacks*/
++ pthread_rwlock_rdlock(&dessert_cfglock);
++ if (cblver < _dessert_sysrxcblistver) {
++ /* callback list changed - rebuild it */
++ cbllen = 0;
++ for (cb = _dessert_sysrxcblist; cb != NULL; cb = cb->next)
++ cbllen++;
++ cbl = realloc(cbl, cbllen * sizeof(dessert_sysrxcb_t *));
++ if (cbl == NULL) {
++ dessert_err("failed to allocate memory for internal callback list");
++ pthread_rwlock_unlock(&dessert_cfglock);
++ return (NULL);
++ }
++
++ cblcur = 0;
++ for (cb = _dessert_sysrxcblist; cb != NULL; cb = cb->next)
++ cbl[cblcur++] = cb->c;
++
++ cblver = _dessert_sysrxcblistver;
++ }
++ pthread_rwlock_unlock(&dessert_cfglock);
++
++ /* generate frame id */
++ id = _dessert_newframeid();
++
++ /* count packet */
++ pthread_mutex_lock(&(sysif->cnt_mutex));
++ sysif->ipkts++;
++ sysif->ibytes += len;
++ pthread_mutex_unlock(&(sysif->cnt_mutex));
++
++ /* call the interested */
++ res = 0;
++ cblcur = 0;
++ memset(&proc, 0, DESSERT_MSGPROCLEN);
++ dessert_msg_t *msg;
++ while (res > DESSERT_MSG_DROP && cblcur < cbllen) {
++ if (dessert_msg_ethencap((struct ether_header *) buf, len, &msg)
++ < 0) {
++ dessert_err("failed to encapsulate ethernet frame on host-to-network-pipeline: %s", errno);
++ };
++ res = cbl[cblcur++](msg, len, &proc, sysif, id);
++ }
++ dessert_msg_destroy(msg);
++
++ }
++ dessert_info("stopped reading on %s (fd %d): %s", sysif->if_name, sysif->fd, strerror(errno));
++
++ free(cbl);
++ close(sysif->fd);
++
++ return (NULL);
++}
+diff --git a/src/snmp/Makefile.am b/src/snmp/Makefile.am
+new file mode 100644
+index 0000000..2380aa3
+--- /dev/null
++++ b/src/snmp/Makefile.am
+@@ -0,0 +1,60 @@
++
++AM_CPPFLAGS = -I$(top_srcdir)/include \
++ -I../libdessert \
++ @SNMP_CFLAGS@
++
++noinst_LTLIBRARIES = libsnmp.la
++
++libsnmp_la_SOURCES = \
++ dessertAppParamsTable.c \
++ dessertAppParamsTable.h \
++ dessertAppParamsTable_oids.h \
++ dessertAppParamsTable_data_access.c \
++ dessertAppParamsTable_data_access.h \
++ dessertAppParamsTable_data_get.c \
++ dessertAppParamsTable_data_get.h \
++ dessertAppParamsTable_data_set.c \
++ dessertAppParamsTable_data_set.h \
++ dessertAppParamsTable_interface.c \
++ dessertAppParamsTable_interface.h \
++ dessertAppStatsTable.c \
++ dessertAppStatsTable.h \
++ dessertAppStatsTable_enums.h \
++ dessertAppStatsTable_oids.h \
++ dessertAppStatsTable_data_access.c \
++ dessertAppStatsTable_data_access.h \
++ dessertAppStatsTable_data_get.c \
++ dessertAppStatsTable_data_get.h \
++ dessertAppStatsTable_data_set.c \
++ dessertAppStatsTable_data_set.h \
++ dessertAppStatsTable_interface.c \
++ dessertAppStatsTable_interface.h \
++ dessertMeshifTable.c \
++ dessertMeshifTable.h \
++ dessertMeshifTable_enums.h \
++ dessertMeshifTable_oids.h \
++ dessertMeshifTable_data_access.c \
++ dessertMeshifTable_data_access.h \
++ dessertMeshifTable_data_get.c \
++ dessertMeshifTable_data_get.h \
++ dessertMeshifTable_data_set.c \
++ dessertMeshifTable_data_set.h
++ dessertMeshifTable_interface.c \
++ dessertMeshifTable_interface.h \
++ dessertObjects.c \
++ dessertObjects.h \
++ dessertSysifTable.c \
++ dessertSysifTable.h \
++ dessertSysifTable_enums.h \
++ dessertSysifTable_oids.h \
++ dessertSysifTable_interface.h \
++ dessertSysifTable_data_access.c \
++ dessertSysifTable_data_access.h \
++ dessertSysifTable_data_get.c \
++ dessertSysifTable_data_get.h \
++ dessertSysifTable_data_set.c \
++ dessertSysifTable_data_set.h \
++ dessertSysifTable_interface.c \
++ dessertSysifTable_subagent.c
++
++libsnmp_la_LIBADD = @SNMP_LIBS@
+diff --git a/src/snmp/Makefile.in b/src/snmp/Makefile.in
+new file mode 100644
+index 0000000..3cd6a37
+--- /dev/null
++++ b/src/snmp/Makefile.in
+@@ -0,0 +1,582 @@
++# Makefile.in generated by automake 1.11 from Makefile.am.
++# @configure_input@
++
++# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
++# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
++# Inc.
++# This Makefile.in is free software; the Free Software Foundation
++# gives unlimited permission to copy and/or distribute it,
++# with or without modifications, as long as this notice is preserved.
++
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
++# PARTICULAR PURPOSE.
++
++@SET_MAKE@
++
++VPATH = @srcdir@
++pkgdatadir = $(datadir)/@PACKAGE@
++pkgincludedir = $(includedir)/@PACKAGE@
++pkglibdir = $(libdir)/@PACKAGE@
++pkglibexecdir = $(libexecdir)/@PACKAGE@
++am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
++install_sh_DATA = $(install_sh) -c -m 644
++install_sh_PROGRAM = $(install_sh) -c
++install_sh_SCRIPT = $(install_sh) -c
++INSTALL_HEADER = $(INSTALL_DATA)
++transform = $(program_transform_name)
++NORMAL_INSTALL = :
++PRE_INSTALL = :
++POST_INSTALL = :
++NORMAL_UNINSTALL = :
++PRE_UNINSTALL = :
++POST_UNINSTALL = :
++build_triplet = @build@
++host_triplet = @host@
++subdir = src/snmp
++DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
++am__aclocal_m4_deps = $(top_srcdir)/m4/ac_doxygen.m4 \
++ $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \
++ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
++ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
++ $(top_srcdir)/m4/net-snmp.m4 $(top_srcdir)/m4/pcap.m4 \
++ $(top_srcdir)/configure.ac
++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
++ $(ACLOCAL_M4)
++mkinstalldirs = $(install_sh) -d
++CONFIG_HEADER = $(top_builddir)/config.h
++CONFIG_CLEAN_FILES =
++CONFIG_CLEAN_VPATH_FILES =
++LTLIBRARIES = $(noinst_LTLIBRARIES)
++libsnmp_la_DEPENDENCIES =
++am_libsnmp_la_OBJECTS = dessertAppParamsTable.lo \
++ dessertAppParamsTable_data_access.lo \
++ dessertAppParamsTable_data_get.lo \
++ dessertAppParamsTable_data_set.lo \
++ dessertAppParamsTable_interface.lo dessertAppStatsTable.lo \
++ dessertAppStatsTable_data_access.lo \
++ dessertAppStatsTable_data_get.lo \
++ dessertAppStatsTable_data_set.lo \
++ dessertAppStatsTable_interface.lo dessertMeshifTable.lo \
++ dessertMeshifTable_data_access.lo \
++ dessertMeshifTable_data_get.lo dessertMeshifTable_data_set.lo
++libsnmp_la_OBJECTS = $(am_libsnmp_la_OBJECTS)
++DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
++depcomp = $(SHELL) $(top_srcdir)/depcomp
++am__depfiles_maybe = depfiles
++am__mv = mv -f
++COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
++ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
++LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
++ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
++ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
++CCLD = $(CC)
++LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
++ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
++ $(LDFLAGS) -o $@
++SOURCES = $(libsnmp_la_SOURCES)
++DIST_SOURCES = $(libsnmp_la_SOURCES)
++ETAGS = etags
++CTAGS = ctags
++DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
++ACLOCAL = @ACLOCAL@
++AMTAR = @AMTAR@
++AR = @AR@
++AUTOCONF = @AUTOCONF@
++AUTOHEADER = @AUTOHEADER@
++AUTOMAKE = @AUTOMAKE@
++AWK = @AWK@
++CC = @CC@
++CCDEPMODE = @CCDEPMODE@
++CFLAGS = @CFLAGS@
++CPP = @CPP@
++CPPFLAGS = @CPPFLAGS@
++CYGPATH_W = @CYGPATH_W@
++DEFS = @DEFS@
++DEPDIR = @DEPDIR@
++DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@
++DSYMUTIL = @DSYMUTIL@
++DUMPBIN = @DUMPBIN@
++DX_CONFIG = @DX_CONFIG@
++DX_DOCDIR = @DX_DOCDIR@
++DX_DOT = @DX_DOT@
++DX_DOXYGEN = @DX_DOXYGEN@
++DX_DVIPS = @DX_DVIPS@
++DX_EGREP = @DX_EGREP@
++DX_ENV = @DX_ENV@
++DX_FLAG_chi = @DX_FLAG_chi@
++DX_FLAG_chm = @DX_FLAG_chm@
++DX_FLAG_doc = @DX_FLAG_doc@
++DX_FLAG_dot = @DX_FLAG_dot@
++DX_FLAG_html = @DX_FLAG_html@
++DX_FLAG_man = @DX_FLAG_man@
++DX_FLAG_pdf = @DX_FLAG_pdf@
++DX_FLAG_ps = @DX_FLAG_ps@
++DX_FLAG_rtf = @DX_FLAG_rtf@
++DX_FLAG_xml = @DX_FLAG_xml@
++DX_HHC = @DX_HHC@
++DX_LATEX = @DX_LATEX@
++DX_MAKEINDEX = @DX_MAKEINDEX@
++DX_PDFLATEX = @DX_PDFLATEX@
++DX_PERL = @DX_PERL@
++DX_PROJECT = @DX_PROJECT@
++ECHO_C = @ECHO_C@
++ECHO_N = @ECHO_N@
++ECHO_T = @ECHO_T@
++EGREP = @EGREP@
++EXEEXT = @EXEEXT@
++FGREP = @FGREP@
++GREP = @GREP@
++INSTALL = @INSTALL@
++INSTALL_DATA = @INSTALL_DATA@
++INSTALL_PROGRAM = @INSTALL_PROGRAM@
++INSTALL_SCRIPT = @INSTALL_SCRIPT@
++INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
++LD = @LD@
++LDFLAGS = @LDFLAGS@
++LIBDESSERT_LIBRARY_VERSION = @LIBDESSERT_LIBRARY_VERSION@
++LIBOBJS = @LIBOBJS@
++LIBS = @LIBS@
++LIBTOOL = @LIBTOOL@
++LIPO = @LIPO@
++LN_S = @LN_S@
++LTLIBOBJS = @LTLIBOBJS@
++MAKEINFO = @MAKEINFO@
++MKDIR_P = @MKDIR_P@
++NM = @NM@
++NMEDIT = @NMEDIT@
++OBJDUMP = @OBJDUMP@
++OBJEXT = @OBJEXT@
++OTOOL = @OTOOL@
++OTOOL64 = @OTOOL64@
++PACKAGE = @PACKAGE@
++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
++PACKAGE_NAME = @PACKAGE_NAME@
++PACKAGE_STRING = @PACKAGE_STRING@
++PACKAGE_TARNAME = @PACKAGE_TARNAME@
++PACKAGE_URL = @PACKAGE_URL@
++PACKAGE_VERSION = @PACKAGE_VERSION@
++PATH_SEPARATOR = @PATH_SEPARATOR@
++PCAP_CFLAGS = @PCAP_CFLAGS@
++PCAP_CFLGAS = @PCAP_CFLGAS@
++PCAP_LIBS = @PCAP_LIBS@
++PTHREAD_CC = @PTHREAD_CC@
++PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
++PTHREAD_LIBS = @PTHREAD_LIBS@
++RANLIB = @RANLIB@
++SED = @SED@
++SET_MAKE = @SET_MAKE@
++SHELL = @SHELL@
++SNMP_CFLAGS = @SNMP_CFLAGS@
++SNMP_CFLGAS = @SNMP_CFLGAS@
++SNMP_LIBS = @SNMP_LIBS@
++STRIP = @STRIP@
++VERSION = @VERSION@
++abs_builddir = @abs_builddir@
++abs_srcdir = @abs_srcdir@
++abs_top_builddir = @abs_top_builddir@
++abs_top_srcdir = @abs_top_srcdir@
++ac_ct_CC = @ac_ct_CC@
++ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
++am__include = @am__include@
++am__leading_dot = @am__leading_dot@
++am__quote = @am__quote@
++am__tar = @am__tar@
++am__untar = @am__untar@
++ax_pthread_config = @ax_pthread_config@
++bindir = @bindir@
++build = @build@
++build_alias = @build_alias@
++build_cpu = @build_cpu@
++build_os = @build_os@
++build_vendor = @build_vendor@
++builddir = @builddir@
++datadir = @datadir@
++datarootdir = @datarootdir@
++docdir = @docdir@
++dvidir = @dvidir@
++exec_prefix = @exec_prefix@
++host = @host@
++host_alias = @host_alias@
++host_cpu = @host_cpu@
++host_os = @host_os@
++host_vendor = @host_vendor@
++htmldir = @htmldir@
++includedir = @includedir@
++infodir = @infodir@
++install_sh = @install_sh@
++libdir = @libdir@
++libexecdir = @libexecdir@
++localedir = @localedir@
++localstatedir = @localstatedir@
++lt_ECHO = @lt_ECHO@
++mandir = @mandir@
++mkdir_p = @mkdir_p@
++oldincludedir = @oldincludedir@
++pdfdir = @pdfdir@
++prefix = @prefix@
++program_transform_name = @program_transform_name@
++psdir = @psdir@
++sbindir = @sbindir@
++sharedstatedir = @sharedstatedir@
++srcdir = @srcdir@
++sysconfdir = @sysconfdir@
++target_alias = @target_alias@
++top_build_prefix = @top_build_prefix@
++top_builddir = @top_builddir@
++top_srcdir = @top_srcdir@
++AM_CPPFLAGS = -I$(top_srcdir)/include \
++ -I../libdessert \
++ @SNMP_CFLAGS@
++
++noinst_LTLIBRARIES = libsnmp.la
++libsnmp_la_SOURCES = \
++ dessertAppParamsTable.c \
++ dessertAppParamsTable.h \
++ dessertAppParamsTable_oids.h \
++ dessertAppParamsTable_data_access.c \
++ dessertAppParamsTable_data_access.h \
++ dessertAppParamsTable_data_get.c \
++ dessertAppParamsTable_data_get.h \
++ dessertAppParamsTable_data_set.c \
++ dessertAppParamsTable_data_set.h \
++ dessertAppParamsTable_interface.c \
++ dessertAppParamsTable_interface.h \
++ dessertAppStatsTable.c \
++ dessertAppStatsTable.h \
++ dessertAppStatsTable_enums.h \
++ dessertAppStatsTable_oids.h \
++ dessertAppStatsTable_data_access.c \
++ dessertAppStatsTable_data_access.h \
++ dessertAppStatsTable_data_get.c \
++ dessertAppStatsTable_data_get.h \
++ dessertAppStatsTable_data_set.c \
++ dessertAppStatsTable_data_set.h \
++ dessertAppStatsTable_interface.c \
++ dessertAppStatsTable_interface.h \
++ dessertMeshifTable.c \
++ dessertMeshifTable.h \
++ dessertMeshifTable_enums.h \
++ dessertMeshifTable_oids.h \
++ dessertMeshifTable_data_access.c \
++ dessertMeshifTable_data_access.h \
++ dessertMeshifTable_data_get.c \
++ dessertMeshifTable_data_get.h \
++ dessertMeshifTable_data_set.c \
++ dessertMeshifTable_data_set.h
++
++libsnmp_la_LIBADD = @SNMP_LIBS@
++all: all-am
++
++.SUFFIXES:
++.SUFFIXES: .c .lo .o .obj
++$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
++ @for dep in $?; do \
++ case '$(am__configure_deps)' in \
++ *$$dep*) \
++ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
++ && { if test -f $@; then exit 0; else break; fi; }; \
++ exit 1;; \
++ esac; \
++ done; \
++ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/snmp/Makefile'; \
++ $(am__cd) $(top_srcdir) && \
++ $(AUTOMAKE) --gnu src/snmp/Makefile
++.PRECIOUS: Makefile
++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
++ @case '$?' in \
++ *config.status*) \
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
++ *) \
++ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
++ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
++ esac;
++
++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++
++$(top_srcdir)/configure: $(am__configure_deps)
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++$(ACLOCAL_M4): $(am__aclocal_m4_deps)
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++$(am__aclocal_m4_deps):
++
++clean-noinstLTLIBRARIES:
++ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
++ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
++ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
++ test "$$dir" != "$$p" || dir=.; \
++ echo "rm -f \"$${dir}/so_locations\""; \
++ rm -f "$${dir}/so_locations"; \
++ done
++libsnmp.la: $(libsnmp_la_OBJECTS) $(libsnmp_la_DEPENDENCIES)
++ $(LINK) $(libsnmp_la_OBJECTS) $(libsnmp_la_LIBADD) $(LIBS)
++
++mostlyclean-compile:
++ -rm -f *.$(OBJEXT)
++
++distclean-compile:
++ -rm -f *.tab.c
++
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessertAppParamsTable.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessertAppParamsTable_data_access.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessertAppParamsTable_data_get.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessertAppParamsTable_data_set.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessertAppParamsTable_interface.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessertAppStatsTable.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessertAppStatsTable_data_access.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessertAppStatsTable_data_get.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessertAppStatsTable_data_set.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessertAppStatsTable_interface.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessertMeshifTable.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessertMeshifTable_data_access.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessertMeshifTable_data_get.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dessertMeshifTable_data_set.Plo@am__quote@
++
++.c.o:
++@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
++@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
++@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
++@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++@am__fastdepCC_FALSE@ $(COMPILE) -c $<
++
++.c.obj:
++@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
++@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
++@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
++@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
++
++.c.lo:
++@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
++@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
++@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
++@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
++
++mostlyclean-libtool:
++ -rm -f *.lo
++
++clean-libtool:
++ -rm -rf .libs _libs
++
++ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
++ unique=`for i in $$list; do \
++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
++ done | \
++ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
++ END { if (nonempty) { for (i in files) print i; }; }'`; \
++ mkid -fID $$unique
++tags: TAGS
++
++TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
++ $(TAGS_FILES) $(LISP)
++ set x; \
++ here=`pwd`; \
++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
++ unique=`for i in $$list; do \
++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
++ done | \
++ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
++ END { if (nonempty) { for (i in files) print i; }; }'`; \
++ shift; \
++ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
++ test -n "$$unique" || unique=$$empty_fix; \
++ if test $$# -gt 0; then \
++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
++ "$$@" $$unique; \
++ else \
++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
++ $$unique; \
++ fi; \
++ fi
++ctags: CTAGS
++CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
++ $(TAGS_FILES) $(LISP)
++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
++ unique=`for i in $$list; do \
++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
++ done | \
++ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
++ END { if (nonempty) { for (i in files) print i; }; }'`; \
++ test -z "$(CTAGS_ARGS)$$unique" \
++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
++ $$unique
++
++GTAGS:
++ here=`$(am__cd) $(top_builddir) && pwd` \
++ && $(am__cd) $(top_srcdir) \
++ && gtags -i $(GTAGS_ARGS) "$$here"
++
++distclean-tags:
++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
++
++distdir: $(DISTFILES)
++ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++ list='$(DISTFILES)'; \
++ dist_files=`for file in $$list; do echo $$file; done | \
++ sed -e "s|^$$srcdirstrip/||;t" \
++ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
++ case $$dist_files in \
++ */*) $(MKDIR_P) `echo "$$dist_files" | \
++ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
++ sort -u` ;; \
++ esac; \
++ for file in $$dist_files; do \
++ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
++ if test -d $$d/$$file; then \
++ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
++ if test -d "$(distdir)/$$file"; then \
++ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++ fi; \
++ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
++ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
++ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++ fi; \
++ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
++ else \
++ test -f "$(distdir)/$$file" \
++ || cp -p $$d/$$file "$(distdir)/$$file" \
++ || exit 1; \
++ fi; \
++ done
++check-am: all-am
++check: check-am
++all-am: Makefile $(LTLIBRARIES)
++installdirs:
++install: install-am
++install-exec: install-exec-am
++install-data: install-data-am
++uninstall: uninstall-am
++
++install-am: all-am
++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
++
++installcheck: installcheck-am
++install-strip:
++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
++ `test -z '$(STRIP)' || \
++ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
++mostlyclean-generic:
++
++clean-generic:
++
++distclean-generic:
++ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
++ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
++
++maintainer-clean-generic:
++ @echo "This command is intended for maintainers to use"
++ @echo "it deletes files that may require special tools to rebuild."
++clean: clean-am
++
++clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
++ mostlyclean-am
++
++distclean: distclean-am
++ -rm -rf ./$(DEPDIR)
++ -rm -f Makefile
++distclean-am: clean-am distclean-compile distclean-generic \
++ distclean-tags
++
++dvi: dvi-am
++
++dvi-am:
++
++html: html-am
++
++html-am:
++
++info: info-am
++
++info-am:
++
++install-data-am:
++
++install-dvi: install-dvi-am
++
++install-dvi-am:
++
++install-exec-am:
++
++install-html: install-html-am
++
++install-html-am:
++
++install-info: install-info-am
++
++install-info-am:
++
++install-man:
++
++install-pdf: install-pdf-am
++
++install-pdf-am:
++
++install-ps: install-ps-am
++
++install-ps-am:
++
++installcheck-am:
++
++maintainer-clean: maintainer-clean-am
++ -rm -rf ./$(DEPDIR)
++ -rm -f Makefile
++maintainer-clean-am: distclean-am maintainer-clean-generic
++
++mostlyclean: mostlyclean-am
++
++mostlyclean-am: mostlyclean-compile mostlyclean-generic \
++ mostlyclean-libtool
++
++pdf: pdf-am
++
++pdf-am:
++
++ps: ps-am
++
++ps-am:
++
++uninstall-am:
++
++.MAKE: install-am install-strip
++
++.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
++ clean-libtool clean-noinstLTLIBRARIES ctags distclean \
++ distclean-compile distclean-generic distclean-libtool \
++ distclean-tags distdir dvi dvi-am html html-am info info-am \
++ install install-am install-data install-data-am install-dvi \
++ install-dvi-am install-exec install-exec-am install-html \
++ install-html-am install-info install-info-am install-man \
++ install-pdf install-pdf-am install-ps install-ps-am \
++ install-strip installcheck installcheck-am installdirs \
++ maintainer-clean maintainer-clean-generic mostlyclean \
++ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
++ pdf pdf-am ps ps-am tags uninstall uninstall-am
++
++ dessertMeshifTable_interface.c \
++ dessertMeshifTable_interface.h \
++ dessertObjects.c \
++ dessertObjects.h \
++ dessertSysifTable.c \
++ dessertSysifTable.h \
++ dessertSysifTable_enums.h \
++ dessertSysifTable_oids.h \
++ dessertSysifTable_interface.h \
++ dessertSysifTable_data_access.c \
++ dessertSysifTable_data_access.h \
++ dessertSysifTable_data_get.c \
++ dessertSysifTable_data_get.h \
++ dessertSysifTable_data_set.c \
++ dessertSysifTable_data_set.h \
++ dessertSysifTable_interface.c \
++ dessertSysifTable_subagent.c
++
++# Tell versions [3.59,3.63) of GNU make to not export all variables.
++# Otherwise a system limit (for SysV at least) may be exceeded.
++.NOEXPORT:
+diff --git a/src/snmp/dessertAppParamsTable.c b/src/snmp/dessertAppParamsTable.c
+new file mode 100644
+index 0000000..47ef1ec
+--- /dev/null
++++ b/src/snmp/dessertAppParamsTable.c
+@@ -0,0 +1,231 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 14170 $ of $
++ *
++ * $Id:$
++ */
++/** \page MFD helper for dessertAppParamsTable
++ *
++ * \section intro Introduction
++ * Introductory text.
++ *
++ */
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertAppParamsTable.h"
++
++#include <net-snmp/agent/mib_modules.h>
++
++#include "dessertAppParamsTable_interface.h"
++
++oid dessertAppParamsTable_oid[] =
++ { DESSERTAPPPARAMSTABLE_OID };
++int dessertAppParamsTable_oid_size =
++OID_LENGTH(dessertAppParamsTable_oid);
++
++dessertAppParamsTable_registration dessertAppParamsTable_user_context;
++
++void initialize_table_dessertAppParamsTable(void);
++void shutdown_table_dessertAppParamsTable(void);
++
++
++/**
++ * Initializes the dessertAppParamsTable module
++ */
++void
++init_dessertAppParamsTable(void)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:init_dessertAppParamsTable",
++ "called\n"));
++
++ /*
++ * TODO:300:o: Perform dessertAppParamsTable one-time module initialization.
++ */
++
++ /*
++ * here we initialize all the tables we're planning on supporting
++ */
++ if (should_init("dessertAppParamsTable"))
++ initialize_table_dessertAppParamsTable();
++
++} /* init_dessertAppParamsTable */
++
++/**
++ * Shut-down the dessertAppParamsTable module (agent is exiting)
++ */
++void
++shutdown_dessertAppParamsTable(void)
++{
++ if (should_init("dessertAppParamsTable"))
++ shutdown_table_dessertAppParamsTable();
++
++}
++
++/**
++ * Initialize the table dessertAppParamsTable
++ * (Define its contents and how it's structured)
++ */
++void
++initialize_table_dessertAppParamsTable(void)
++{
++ dessertAppParamsTable_registration *user_context;
++ u_long flags;
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:initialize_table_dessertAppParamsTable", "called\n"));
++
++ /*
++ * TODO:301:o: Perform dessertAppParamsTable one-time table initialization.
++ */
++
++ /*
++ * TODO:302:o: |->Initialize dessertAppParamsTable user context
++ * if you'd like to pass in a pointer to some data for this
++ * table, allocate or set it up here.
++ */
++ /*
++ * a netsnmp_data_list is a simple way to store void pointers. A simple
++ * string token is used to add, find or remove pointers.
++ */
++ user_context =
++ netsnmp_create_data_list("dessertAppParamsTable", NULL, NULL);
++
++ /*
++ * No support for any flags yet, but in the future you would
++ * set any flags here.
++ */
++ flags = 0;
++
++ /*
++ * call interface initialization code
++ */
++ _dessertAppParamsTable_initialize_interface(user_context, flags);
++} /* initialize_table_dessertAppParamsTable */
++
++/**
++ * Shutdown the table dessertAppParamsTable
++ */
++void
++shutdown_table_dessertAppParamsTable(void)
++{
++ /*
++ * call interface shutdown code
++ */
++ _dessertAppParamsTable_shutdown_interface
++ (&dessertAppParamsTable_user_context);
++}
++
++/**
++ * extra context initialization (eg default values)
++ *
++ * @param rowreq_ctx : row request context
++ * @param user_init_ctx : void pointer for user (parameter to rowreq_ctx_allocate)
++ *
++ * @retval MFD_SUCCESS : no errors
++ * @retval MFD_ERROR : error (context allocate will fail)
++ */
++int
++dessertAppParamsTable_rowreq_ctx_init(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx, void *user_init_ctx)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_rowreq_ctx_init", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:210:o: |-> Perform extra dessertAppParamsTable rowreq initialization. (eg DEFVALS)
++ */
++
++ return MFD_SUCCESS;
++} /* dessertAppParamsTable_rowreq_ctx_init */
++
++/**
++ * extra context cleanup
++ *
++ */
++void
++dessertAppParamsTable_rowreq_ctx_cleanup(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_rowreq_ctx_cleanup", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:211:o: |-> Perform extra dessertAppParamsTable rowreq cleanup.
++ */
++} /* dessertAppParamsTable_rowreq_ctx_cleanup */
++
++/**
++ * pre-request callback
++ *
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error
++ */
++int
++dessertAppParamsTable_pre_request(dessertAppParamsTable_registration *
++ user_context)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_pre_request", "called\n"));
++
++ /*
++ * TODO:510:o: Perform dessertAppParamsTable pre-request actions.
++ */
++
++ return MFD_SUCCESS;
++} /* dessertAppParamsTable_pre_request */
++
++/**
++ * post-request callback
++ *
++ * Note:
++ * New rows have been inserted into the container, and
++ * deleted rows have been removed from the container and
++ * released.
++ *
++ * @param user_context
++ * @param rc : MFD_SUCCESS if all requests succeeded
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error (ignored)
++ */
++int
++dessertAppParamsTable_post_request(dessertAppParamsTable_registration *
++ user_context, int rc)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_post_request", "called\n"));
++
++ /*
++ * TODO:511:o: Perform dessertAppParamsTable post-request actions.
++ */
++
++ /*
++ * check to set if any rows were changed.
++ */
++ if (dessertAppParamsTable_dirty_get()) {
++ /*
++ * check if request was successful. If so, this would be
++ * a good place to save data to its persistent store.
++ */
++ if (MFD_SUCCESS == rc) {
++ /*
++ * save changed rows, if you haven't already
++ */
++ }
++
++ dessertAppParamsTable_dirty_set(0); /* clear table dirty flag */
++ }
++
++ return MFD_SUCCESS;
++} /* dessertAppParamsTable_post_request */
++
++
++/** @{ */
+diff --git a/src/snmp/dessertAppParamsTable.h b/src/snmp/dessertAppParamsTable.h
+new file mode 100644
+index 0000000..5c972d1
+--- /dev/null
++++ b/src/snmp/dessertAppParamsTable.h
+@@ -0,0 +1,252 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 14170 $ of $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTAPPPARAMSTABLE_H
++#define DESSERTAPPPARAMSTABLE_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++/** @addtogroup misc misc: Miscellaneous routines
++ *
++ * @{
++ */
++#include <net-snmp/library/asn1.h>
++
++ /*
++ * other required module components
++ */
++ /* *INDENT-OFF* */
++config_add_mib(DESSERT-MIB)
++config_require(DESSERT-MIB/dessertAppParamsTable/dessertAppParamsTable_interface)
++config_require(DESSERT-MIB/dessertAppParamsTable/dessertAppParamsTable_data_access)
++config_require(DESSERT-MIB/dessertAppParamsTable/dessertAppParamsTable_data_get)
++config_require(DESSERT-MIB/dessertAppParamsTable/dessertAppParamsTable_data_set)
++ /* *INDENT-ON* */
++
++ /*
++ * OID and column number definitions for dessertAppParamsTable
++ */
++#include "dessertAppParamsTable_oids.h"
++
++ /*
++ * enum definions
++ */
++#include "dessertAppParamsTable_enums.h"
++
++ /*
++ *********************************************************************
++ * function declarations
++ */
++ void init_dessertAppParamsTable(void);
++ void shutdown_dessertAppParamsTable(void);
++
++ /*
++ *********************************************************************
++ * Table declarations
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertAppParamsTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++ /*
++ * DESSERT-MIB::dessertAppParamsTable is subid 11 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11, length: 13
++ */
++ /*
++ *********************************************************************
++ * When you register your mib, you get to provide a generic
++ * pointer that will be passed back to you for most of the
++ * functions calls.
++ *
++ * TODO:100:r: Review all context structures
++ */
++ /*
++ * TODO:101:o: |-> Review dessertAppParamsTable registration context.
++ */
++ typedef netsnmp_data_list dessertAppParamsTable_registration;
++
++/**********************************************************************/
++ /*
++ * TODO:110:r: |-> Review dessertAppParamsTable data context structure.
++ * This structure is used to represent the data for dessertAppParamsTable.
++ */
++ /*
++ * This structure contains storage for all the columns defined in the
++ * dessertAppParamsTable.
++ */
++ typedef struct dessertAppParamsTable_data_s {
++
++ /*
++ * appParamsName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ char appParamsName[255];
++ size_t appParamsName_len; /* # of char elements, not bytes */
++
++ /*
++ * appParamsDesc(3)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ char appParamsDesc[255];
++ size_t appParamsDesc_len; /* # of char elements, not bytes */
++
++ /*
++ * appParamsValueType(4)/DessertAppValueType/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
++ */
++ u_long appParamsValueType;
++
++ /*
++ * appParamsTruthValue(5)/TruthValue/ASN_INTEGER/long(u_long)//l/A/W/E/r/d/h
++ */
++ u_long appParamsTruthValue;
++
++ /*
++ * appParamsInteger32(6)/INTEGER32/ASN_INTEGER/long(long)//l/A/W/e/r/d/h
++ */
++ long appParamsInteger32;
++
++ /*
++ * appParamsUnsigned32(7)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/W/e/r/d/h
++ */
++ u_long appParamsUnsigned32;
++
++ /*
++ * appParamsOctetString(9)/DessertApplicationOctetString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H
++ */
++ char appParamsOctetString[1024];
++ size_t appParamsOctetString_len; /* # of char elements, not bytes */
++
++ } dessertAppParamsTable_data;
++
++
++ /*
++ *********************************************************************
++ * TODO:115:o: |-> Review dessertAppParamsTable undo context.
++ * We're just going to use the same data structure for our
++ * undo_context. If you want to do something more efficent,
++ * define your typedef here.
++ */
++ typedef dessertAppParamsTable_data dessertAppParamsTable_undo_data;
++
++ /*
++ * TODO:120:r: |-> Review dessertAppParamsTable mib index.
++ * This structure is used to represent the index for dessertAppParamsTable.
++ */
++ typedef struct dessertAppParamsTable_mib_index_s {
++
++ /*
++ * appParamsIndex(1)/DessertAppParamsIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
++ */
++ long appParamsIndex;
++
++
++ } dessertAppParamsTable_mib_index;
++
++ /*
++ * TODO:121:r: | |-> Review dessertAppParamsTable max index length.
++ * If you KNOW that your indexes will never exceed a certain
++ * length, update this macro to that length.
++ */
++#define MAX_dessertAppParamsTable_IDX_LEN 1
++
++
++ /*
++ *********************************************************************
++ * TODO:130:o: |-> Review dessertAppParamsTable Row request (rowreq) context.
++ * When your functions are called, you will be passed a
++ * dessertAppParamsTable_rowreq_ctx pointer.
++ */
++ typedef struct dessertAppParamsTable_rowreq_ctx_s {
++
++ /** this must be first for container compare to work */
++ netsnmp_index oid_idx;
++ oid oid_tmp[MAX_dessertAppParamsTable_IDX_LEN];
++
++ dessertAppParamsTable_mib_index tbl_idx;
++
++ dessertAppParamsTable_data data;
++ unsigned int column_exists_flags; /* flags for existence */
++ dessertAppParamsTable_undo_data *undo;
++ unsigned int column_set_flags; /* flags for set columns */
++
++
++ /*
++ * flags per row. Currently, the first (lower) 8 bits are reserved
++ * for the user. See mfd.h for other flags.
++ */
++ u_int rowreq_flags;
++
++ /*
++ * TODO:131:o: | |-> Add useful data to dessertAppParamsTable rowreq context.
++ */
++
++ /*
++ * storage for future expansion
++ */
++ netsnmp_data_list *dessertAppParamsTable_data_list;
++
++ } dessertAppParamsTable_rowreq_ctx;
++
++ typedef struct dessertAppParamsTable_ref_rowreq_ctx_s {
++ dessertAppParamsTable_rowreq_ctx *rowreq_ctx;
++ } dessertAppParamsTable_ref_rowreq_ctx;
++
++ /*
++ *********************************************************************
++ * function prototypes
++ */
++ int
++ dessertAppParamsTable_pre_request
++ (dessertAppParamsTable_registration * user_context);
++ int
++ dessertAppParamsTable_post_request
++ (dessertAppParamsTable_registration * user_context, int rc);
++
++ int
++ dessertAppParamsTable_rowreq_ctx_init
++ (dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
++ void *user_init_ctx);
++ void
++ dessertAppParamsTable_rowreq_ctx_cleanup
++ (dessertAppParamsTable_rowreq_ctx * rowreq_ctx);
++
++ int
++ dessertAppParamsTable_commit(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++
++ dessertAppParamsTable_rowreq_ctx
++ *dessertAppParamsTable_row_find_by_mib_index
++ (dessertAppParamsTable_mib_index * mib_idx);
++
++ extern oid dessertAppParamsTable_oid[];
++ extern int dessertAppParamsTable_oid_size;
++
++
++#include "dessertAppParamsTable_interface.h"
++#include "dessertAppParamsTable_data_access.h"
++#include "dessertAppParamsTable_data_get.h"
++#include "dessertAppParamsTable_data_set.h"
++
++ /*
++ * DUMMY markers, ignore
++ *
++ * TODO:099:x: *************************************************************
++ * TODO:199:x: *************************************************************
++ * TODO:299:x: *************************************************************
++ * TODO:399:x: *************************************************************
++ * TODO:499:x: *************************************************************
++ */
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTAPPPARAMSTABLE_H */
++/** @} */
+diff --git a/src/snmp/dessertAppParamsTable_data_access.c b/src/snmp/dessertAppParamsTable_data_access.c
+new file mode 100644
+index 0000000..85f234c
+--- /dev/null
++++ b/src/snmp/dessertAppParamsTable_data_access.c
+@@ -0,0 +1,352 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 14170 $ of $
++ *
++ * $Id:$
++ */
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertAppParamsTable.h"
++#include "dessertAppParamsTable_data_access.h"
++#include <dessert/dessert.h>
++#include "dessert_internal.h"
++
++
++/** @ingroup interface
++ * @addtogroup data_access data_access: Routines to access data
++ *
++ * These routines are used to locate the data used to satisfy
++ * requests.
++ *
++ * @{
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertAppParamsTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++/*
++ * DESSERT-MIB::dessertAppParamsTable is subid 11 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11, length: 13
++ */
++
++/**
++ * initialization for dessertAppParamsTable data access
++ *
++ * This function is called during startup to allow you to
++ * allocate any resources you need for the data table.
++ *
++ * @param dessertAppParamsTable_reg
++ * Pointer to dessertAppParamsTable_registration
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : unrecoverable error.
++ */
++int
++dessertAppParamsTable_init_data(dessertAppParamsTable_registration *
++ dessertAppParamsTable_reg)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_init_data", "called\n"));
++
++ /*
++ * TODO:303:o: Initialize dessertAppParamsTable data.
++ */
++
++
++ return MFD_SUCCESS;
++} /* dessertAppParamsTable_init_data */
++
++/**
++ * container overview
++ *
++ */
++
++/**
++ * container initialization
++ *
++ * @param container_ptr_ptr A pointer to a container pointer. If you
++ * create a custom container, use this parameter to return it
++ * to the MFD helper. If set to NULL, the MFD helper will
++ * allocate a container for you.
++ *
++ * This function is called at startup to allow you to customize certain
++ * aspects of the access method. For the most part, it is for advanced
++ * users. The default code should suffice for most cases. If no custom
++ * container is allocated, the MFD code will create one for your.
++ *
++ * @remark
++ * This would also be a good place to do any initialization needed
++ * for you data source. For example, opening a connection to another
++ * process that will supply the data, opening a database, etc.
++ */
++void
++dessertAppParamsTable_container_init(netsnmp_container **
++ container_ptr_ptr, netsnmp_cache * cache)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_container_init", "called\n"));
++
++ if (NULL == container_ptr_ptr) {
++ snmp_log(LOG_ERR,
++ "bad container param to dessertAppParamsTable_container_init\n");
++ return;
++ }
++
++ /*
++ * For advanced users, you can use a custom container. If you
++ * do not create one, one will be created for you.
++ */
++ *container_ptr_ptr = NULL;
++ if (NULL == cache) {
++ snmp_log(LOG_ERR,
++ "bad cache param to dessertAppParamsTable_container_init\n");
++ return;
++ }
++
++ /*
++ * TODO:345:A: Set up dessertAppStatsTable cache properties.
++ *
++ * Also for advanced users, you can set parameters for the
++ * cache. Do not change the magic pointer, as it is used
++ * by the MFD helper. To completely disable caching, set
++ * cache->enabled to 0.
++ */
++ cache->timeout = DESSERTAPPPARAMSTABLE_CACHE_TIMEOUT; /* seconds */
++} /* dessertAppParamsTable_container_init */
++
++/**
++ * container shutdown
++ *
++ * @param container_ptr A pointer to the container.
++ *
++ * This function is called at shutdown to allow you to customize certain
++ * aspects of the access method. For the most part, it is for advanced
++ * users. The default code should suffice for most cases.
++ *
++ * This function is called before dessertAppParamsTable_container_free().
++ *
++ * @remark
++ * This would also be a good place to do any cleanup needed
++ * for you data source. For example, closing a connection to another
++ * process that supplied the data, closing a database, etc.
++ */
++void
++dessertAppParamsTable_container_shutdown(netsnmp_container * container_ptr)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_container_shutdown", "called\n"));
++
++ if (NULL == container_ptr) {
++ snmp_log(LOG_ERR,
++ "bad params to dessertAppParamsTable_container_shutdown\n");
++ return;
++ }
++
++} /* dessertAppParamsTable_container_shutdown */
++
++/**
++ * load initial data
++ *
++ * TODO:350:M: Implement dessertAppParamsTable data load
++ *
++ * @param container container to which items should be inserted
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_RESOURCE_UNAVAILABLE : Can't access data source
++ * @retval MFD_ERROR : other error.
++ *
++ * This function is called to load the index(es) (and data, optionally)
++ * for the every row in the data set.
++ *
++ * @remark
++ * While loading the data, the only important thing is the indexes.
++ * If access to your data is cheap/fast (e.g. you have a pointer to a
++ * structure in memory), it would make sense to update the data here.
++ * If, however, the accessing the data invovles more work (e.g. parsing
++ * some other existing data, or peforming calculations to derive the data),
++ * then you can limit yourself to setting the indexes and saving any
++ * information you will need later. Then use the saved information in
++ * dessertAppParamsTable_row_prep() for populating data.
++ *
++ * @note
++ * If you need consistency between rows (like you want statistics
++ * for each row to be from the same time frame), you should set all
++ * data here.
++ *
++ */
++int
++dessertAppParamsTable_container_load(netsnmp_container * container)
++{
++ dessertAppParamsTable_rowreq_ctx *rowreq_ctx;
++ size_t count = 0;
++
++ dessert_agentx_appparams_t *appparams_list = NULL;
++ dessert_agentx_appparams_t *appparam;
++
++ /*
++ * temporary storage for index values
++ */
++ long appParamsIndex;
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_container_load", "called\n"));
++ dessert_debug("dessertAppParamsTable_container_load called");
++
++ /* harvest the appparams from the getter callbacks registered via *dessert_agentx_appparams_add* */
++ if (_dessert_agentx_appparams_harvest_callbacks(&appparams_list)
++ == DESSERT_ERR) {
++ return MFD_RESOURCE_UNAVAILABLE;
++ }
++
++ /*
++ * TODO:351:M: |-> Load/update data in the dessertAppParamsTable container.
++ * loop over your dessertAppParamsTable data, allocate a rowreq context,
++ * set the index(es) [and data, optionally] and insert into
++ * the container.
++ */
++ DL_FOREACH(appparams_list, appparam) {
++
++ appParamsIndex = appparam->index;
++
++ /*
++ * TODO:352:M: | |-> set indexes in new dessertAppParamsTable rowreq context.
++ * data context will be set from the param (unless NULL,
++ * in which case a new data context will be allocated)
++ */
++ rowreq_ctx = dessertAppParamsTable_allocate_rowreq_ctx();
++ if (NULL == rowreq_ctx) {
++ snmp_log(LOG_ERR, "memory allocation failed\n");
++ return MFD_RESOURCE_UNAVAILABLE;
++ }
++ if (MFD_SUCCESS !=
++ dessertAppParamsTable_indexes_set(rowreq_ctx,
++ appParamsIndex)) {
++ snmp_log(LOG_ERR,
++ "error setting index while loading "
++ "dessertAppParamsTable data.\n");
++ dessertAppParamsTable_release_rowreq_ctx(rowreq_ctx);
++ continue;
++ }
++
++ /* clear all column flags */
++ rowreq_ctx->column_exists_flags = 0;
++
++ /* these columns are always present*/
++ rowreq_ctx->column_exists_flags |= COLUMN_APPPARAMSNAME_FLAG
++ | COLUMN_APPPARAMSDESC_FLAG | COLUMN_APPPARAMSVALUETYPE_FLAG;
++
++ rowreq_ctx->data.appParamsName_len = strlen(appparam->name);
++ strcpy(rowreq_ctx->data.appParamsName, appparam->name);
++
++ rowreq_ctx->data.appParamsDesc_len = strlen(appparam->desc);
++ strcpy(rowreq_ctx->data.appParamsDesc, appparam->desc);
++
++ appParamsValueType_map(&(rowreq_ctx->data.appParamsValueType), appparam->value_type);
++
++ /* which of the 'value'-columns is actually present? */
++ switch (appparam->value_type) {
++
++ case DESSERT_APPPARAMS_VALUETYPE_BOOL:
++ rowreq_ctx->column_exists_flags |= COLUMN_APPPARAMSTRUTHVALUE_FLAG;
++ appParamsTruthValue_map(&(rowreq_ctx->data.appParamsTruthValue) , appparam->bool);
++
++ break;
++
++ case DESSERT_APPPARAMS_VALUETYPE_INT32:
++ rowreq_ctx->column_exists_flags |= COLUMN_APPPARAMSINTEGER32_FLAG;
++ rowreq_ctx->data.appParamsInteger32 = appparam->int32;
++
++ break;
++
++ case DESSERT_APPPARAMS_VALUETYPE_UINT32:
++ rowreq_ctx->column_exists_flags |= COLUMN_APPPARAMSUNSIGNED32_FLAG;
++ rowreq_ctx->data.appParamsUnsigned32 = appparam->uint32;
++
++ break;
++
++ case DESSERT_APPPARAMS_VALUETYPE_OCTETSTRING:
++ rowreq_ctx->column_exists_flags |= COLUMN_APPPARAMSOCTETSTRING_FLAG;
++ rowreq_ctx->data.appParamsOctetString_len = appparam->octetstring_len;
++ memcpy(&(rowreq_ctx->data.appParamsOctetString), appparam->octetstring, appparam->octetstring_len);
++
++ break;
++
++ default:
++ dessert_err("appparam->value_type not valid!");
++ }
++
++ /*
++ * insert into table container
++ */
++ CONTAINER_INSERT(container, rowreq_ctx);
++ }
++
++ _dessert_agentx_appparams_free_list(&appparams_list);
++
++ DEBUGMSGT(("verbose:dessertAppParamsTable:dessertAppParamsTable_container_load", "inserted %d records\n", count));
++
++ return MFD_SUCCESS;
++} /* dessertAppParamsTable_container_load */
++
++/**
++ * container clean up
++ *
++ * @param container container with all current items
++ *
++ * This optional callback is called prior to all
++ * item's being removed from the container. If you
++ * need to do any processing before that, do it here.
++ *
++ * @note
++ * The MFD helper will take care of releasing all the row contexts.
++ *
++ */
++void
++dessertAppParamsTable_container_free(netsnmp_container * container)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_container_free", "called\n"));
++
++ /*
++ * TODO:380:M: Free dessertAppParamsTable container data.
++ */
++} /* dessertAppParamsTable_container_free */
++
++/**
++ * prepare row for processing.
++ *
++ * When the agent has located the row for a request, this function is
++ * called to prepare the row for processing. If you fully populated
++ * the data context during the index setup phase, you may not need to
++ * do anything.
++ *
++ * @param rowreq_ctx pointer to a context.
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error.
++ */
++int
++dessertAppParamsTable_row_prep(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_row_prep", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:390:o: Prepare row for request.
++ * If populating row data was delayed, this is the place to
++ * fill in the row for this request.
++ */
++
++ return MFD_SUCCESS;
++} /* dessertAppParamsTable_row_prep */
++
++/** @} */
+diff --git a/src/snmp/dessertAppParamsTable_data_access.h b/src/snmp/dessertAppParamsTable_data_access.h
+new file mode 100644
+index 0000000..2281bb1
+--- /dev/null
++++ b/src/snmp/dessertAppParamsTable_data_access.h
+@@ -0,0 +1,93 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 14170 $ of $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTAPPPARAMSTABLE_DATA_ACCESS_H
++#define DESSERTAPPPARAMSTABLE_DATA_ACCESS_H
++
++#include "dessert_internal.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++ /*
++ *********************************************************************
++ * function declarations
++ */
++
++ /*
++ *********************************************************************
++ * Table declarations
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertAppParamsTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++ /*
++ * DESSERT-MIB::dessertAppParamsTable is subid 11 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11, length: 13
++ */
++
++
++ int
++ dessertAppParamsTable_init_data(dessertAppParamsTable_registration
++ * dessertAppParamsTable_reg);
++
++
++ /*
++ * TODO:180:o: Review dessertAppParamsTable cache timeout.
++ * The number of seconds before the cache times out
++ */
++#define DESSERTAPPPARAMSTABLE_CACHE_TIMEOUT DESSERT_AGENTX_APPPARAMTABLE_CACHE_TIMEOUT
++
++ void dessertAppParamsTable_container_init(netsnmp_container
++ **
++ container_ptr_ptr,
++ netsnmp_cache *
++ cache);
++ void
++ dessertAppParamsTable_container_shutdown(netsnmp_container *
++ container_ptr);
++
++ int dessertAppParamsTable_container_load(netsnmp_container
++ * container);
++ void dessertAppParamsTable_container_free(netsnmp_container
++ * container);
++
++ int dessertAppParamsTable_cache_load(netsnmp_container *
++ container);
++ void dessertAppParamsTable_cache_free(netsnmp_container *
++ container);
++
++ /*
++ ***************************************************
++ *** START EXAMPLE CODE ***
++ ***---------------------------------------------***/
++ /*
++ *********************************************************************
++ * Since we have no idea how you really access your data, we'll go with
++ * a worst case example: a flat text file.
++ */
++#define MAX_LINE_SIZE 256
++ /*
++ ***---------------------------------------------***
++ *** END EXAMPLE CODE ***
++ ***************************************************/
++ int
++ dessertAppParamsTable_row_prep(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTAPPPARAMSTABLE_DATA_ACCESS_H */
+diff --git a/src/snmp/dessertAppParamsTable_data_get.c b/src/snmp/dessertAppParamsTable_data_get.c
+new file mode 100644
+index 0000000..f3b1327
+--- /dev/null
++++ b/src/snmp/dessertAppParamsTable_data_get.c
+@@ -0,0 +1,731 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 12088 $ of $
++ *
++ * $Id:$
++ */
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertAppParamsTable.h"
++
++
++/** @defgroup data_get data_get: Routines to get data
++ *
++ * TODO:230:M: Implement dessertAppParamsTable get routines.
++ * TODO:240:M: Implement dessertAppParamsTable mapping routines (if any).
++ *
++ * These routine are used to get the value for individual objects. The
++ * row context is passed, along with a pointer to the memory where the
++ * value should be copied.
++ *
++ * @{
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertAppParamsTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++/*
++ * DESSERT-MIB::dessertAppParamsTable is subid 11 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11, length: 13
++ */
++
++/*
++ * ---------------------------------------------------------------------
++ * * TODO:200:r: Implement dessertAppParamsTable data context functions.
++ */
++
++
++/**
++ * set mib index(es)
++ *
++ * @param tbl_idx mib index structure
++ * @param appParamsIndex_val
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error.
++ *
++ * @remark
++ * This convenience function is useful for setting all the MIB index
++ * components with a single function call. It is assume that the C values
++ * have already been mapped from their native/rawformat to the MIB format.
++ */
++int
++dessertAppParamsTable_indexes_set_tbl_idx(dessertAppParamsTable_mib_index *
++ tbl_idx, long appParamsIndex_val)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_indexes_set_tbl_idx", "called\n"));
++
++ /*
++ * appParamsIndex(1)/DessertAppParamsIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
++ */
++ tbl_idx->appParamsIndex = appParamsIndex_val;
++
++
++ return MFD_SUCCESS;
++} /* dessertAppParamsTable_indexes_set_tbl_idx */
++
++/**
++ * @internal
++ * set row context indexes
++ *
++ * @param reqreq_ctx the row context that needs updated indexes
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error.
++ *
++ * @remark
++ * This function sets the mib indexs, then updates the oid indexs
++ * from the mib index.
++ */
++int
++dessertAppParamsTable_indexes_set(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx, long appParamsIndex_val)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_indexes_set", "called\n"));
++
++ if (MFD_SUCCESS !=
++ dessertAppParamsTable_indexes_set_tbl_idx(&rowreq_ctx->tbl_idx,
++ appParamsIndex_val))
++ return MFD_ERROR;
++
++ /*
++ * convert mib index to oid index
++ */
++ rowreq_ctx->oid_idx.len = sizeof(rowreq_ctx->oid_tmp) / sizeof(oid);
++ if (0 != dessertAppParamsTable_index_to_oid(&rowreq_ctx->oid_idx,
++ &rowreq_ctx->tbl_idx)) {
++ return MFD_ERROR;
++ }
++
++ return MFD_SUCCESS;
++} /* dessertAppParamsTable_indexes_set */
++
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppParamsEntry.appParamsName
++ * appParamsName is subid 2 of dessertAppParamsEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.2
++ * Description:
++The name of the parameter.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 1 hashint 1
++ * settable 0
++ * hint: 255a
++ *
++ * Ranges: 0 - 255;
++ *
++ * Its syntax is DisplayString (based on perltype OCTETSTR)
++ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
++ * This data type requires a length. (Max 255)
++ */
++/**
++ * Extract the current value of the appParamsName data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appParamsName_val_ptr_ptr
++ * Pointer to storage for a char variable
++ * @param appParamsName_val_ptr_len_ptr
++ * Pointer to a size_t. On entry, it will contain the size (in bytes)
++ * pointed to by appParamsName.
++ * On exit, this value should contain the data size (in bytes).
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++*
++ * @note If you need more than (*appParamsName_val_ptr_len_ptr) bytes of memory,
++ * allocate it using malloc() and update appParamsName_val_ptr_ptr.
++ * <b>DO NOT</b> free the previous pointer.
++ * The MFD helper will release the memory you allocate.
++ *
++ * @remark If you call this function yourself, you are responsible
++ * for checking if the pointer changed, and freeing any
++ * previously allocated memory. (Not necessary if you pass
++ * in a pointer to static memory, obviously.)
++ */
++int
++appParamsName_get(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
++ char **appParamsName_val_ptr_ptr,
++ size_t *appParamsName_val_ptr_len_ptr)
++{
++ /** we should have a non-NULL pointer and enough storage */
++ netsnmp_assert((NULL != appParamsName_val_ptr_ptr)
++ && (NULL != *appParamsName_val_ptr_ptr));
++ netsnmp_assert(NULL != appParamsName_val_ptr_len_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsName_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the appParamsName data.
++ * copy (* appParamsName_val_ptr_ptr ) data and (* appParamsName_val_ptr_len_ptr ) from rowreq_ctx->data
++ */
++ /*
++ * make sure there is enough space for appParamsName data
++ */
++ if ((NULL == (*appParamsName_val_ptr_ptr)) ||
++ ((*appParamsName_val_ptr_len_ptr) <
++ (rowreq_ctx->data.appParamsName_len *
++ sizeof(rowreq_ctx->data.appParamsName[0])))) {
++ /*
++ * allocate space for appParamsName data
++ */
++ (*appParamsName_val_ptr_ptr) =
++ malloc(rowreq_ctx->data.appParamsName_len *
++ sizeof(rowreq_ctx->data.appParamsName[0]));
++ if (NULL == (*appParamsName_val_ptr_ptr)) {
++ snmp_log(LOG_ERR, "could not allocate memory\n");
++ return MFD_ERROR;
++ }
++ }
++ (*appParamsName_val_ptr_len_ptr) =
++ rowreq_ctx->data.appParamsName_len *
++ sizeof(rowreq_ctx->data.appParamsName[0]);
++ memcpy((*appParamsName_val_ptr_ptr), rowreq_ctx->data.appParamsName,
++ rowreq_ctx->data.appParamsName_len *
++ sizeof(rowreq_ctx->data.appParamsName[0]));
++
++ return MFD_SUCCESS;
++} /* appParamsName_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppParamsEntry.appParamsDesc
++ * appParamsDesc is subid 3 of dessertAppParamsEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.3
++ * Description:
++A short description of the parameter
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 1 hashint 1
++ * settable 0
++ * hint: 255a
++ *
++ * Ranges: 0 - 255;
++ *
++ * Its syntax is DisplayString (based on perltype OCTETSTR)
++ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
++ * This data type requires a length. (Max 255)
++ */
++/**
++ * Extract the current value of the appParamsDesc data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appParamsDesc_val_ptr_ptr
++ * Pointer to storage for a char variable
++ * @param appParamsDesc_val_ptr_len_ptr
++ * Pointer to a size_t. On entry, it will contain the size (in bytes)
++ * pointed to by appParamsDesc.
++ * On exit, this value should contain the data size (in bytes).
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++*
++ * @note If you need more than (*appParamsDesc_val_ptr_len_ptr) bytes of memory,
++ * allocate it using malloc() and update appParamsDesc_val_ptr_ptr.
++ * <b>DO NOT</b> free the previous pointer.
++ * The MFD helper will release the memory you allocate.
++ *
++ * @remark If you call this function yourself, you are responsible
++ * for checking if the pointer changed, and freeing any
++ * previously allocated memory. (Not necessary if you pass
++ * in a pointer to static memory, obviously.)
++ */
++int
++appParamsDesc_get(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
++ char **appParamsDesc_val_ptr_ptr,
++ size_t *appParamsDesc_val_ptr_len_ptr)
++{
++ /** we should have a non-NULL pointer and enough storage */
++ netsnmp_assert((NULL != appParamsDesc_val_ptr_ptr)
++ && (NULL != *appParamsDesc_val_ptr_ptr));
++ netsnmp_assert(NULL != appParamsDesc_val_ptr_len_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsDesc_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the appParamsDesc data.
++ * copy (* appParamsDesc_val_ptr_ptr ) data and (* appParamsDesc_val_ptr_len_ptr ) from rowreq_ctx->data
++ */
++ /*
++ * make sure there is enough space for appParamsDesc data
++ */
++ if ((NULL == (*appParamsDesc_val_ptr_ptr)) ||
++ ((*appParamsDesc_val_ptr_len_ptr) <
++ (rowreq_ctx->data.appParamsDesc_len *
++ sizeof(rowreq_ctx->data.appParamsDesc[0])))) {
++ /*
++ * allocate space for appParamsDesc data
++ */
++ (*appParamsDesc_val_ptr_ptr) =
++ malloc(rowreq_ctx->data.appParamsDesc_len *
++ sizeof(rowreq_ctx->data.appParamsDesc[0]));
++ if (NULL == (*appParamsDesc_val_ptr_ptr)) {
++ snmp_log(LOG_ERR, "could not allocate memory\n");
++ return MFD_ERROR;
++ }
++ }
++ (*appParamsDesc_val_ptr_len_ptr) =
++ rowreq_ctx->data.appParamsDesc_len *
++ sizeof(rowreq_ctx->data.appParamsDesc[0]);
++ memcpy((*appParamsDesc_val_ptr_ptr), rowreq_ctx->data.appParamsDesc,
++ rowreq_ctx->data.appParamsDesc_len *
++ sizeof(rowreq_ctx->data.appParamsDesc[0]));
++
++ return MFD_SUCCESS;
++} /* appParamsDesc_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppParamsEntry.appParamsValueType
++ * appParamsValueType is subid 4 of dessertAppParamsEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.4
++ * Description:
++Indicates which of the columns (appParamsTruthValue,
++ appParamsInterger32, appParamsUInteger32, appParamsOctetString) in the
++ dessertAppParamsTable is actually valid.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 1 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 0
++ *
++ * Enum range: 3/8. Values: bool(0), int32(1), uint32(2), counter64(3), octetstring(4)
++ *
++ * Its syntax is DessertAppValueType (based on perltype INTEGER)
++ * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
++ */
++/**
++ * map a value from its original native format to the MIB format.
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_ERROR : Any other error
++ *
++ * @note parameters follow the memset convention (dest, src).
++ *
++ * @note generation and use of this function can be turned off by re-running
++ * mib2c after adding the following line to the file
++ * defaults/node-appParamsValueType.m2d :
++ * @eval $m2c_node_skip_mapping = 1@
++ *
++ * @remark
++ * If the values for your data type don't exactly match the
++ * possible values defined by the mib, you should map them here.
++ * Otherwise, just do a direct copy.
++ */
++int
++appParamsValueType_map(u_long * mib_appParamsValueType_val_ptr,
++ u_long raw_appParamsValueType_val)
++{
++ netsnmp_assert(NULL != mib_appParamsValueType_val_ptr);
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsValueType_map",
++ "called\n"));
++
++ /*
++ * TODO:241:o: |-> Implement appParamsValueType enum mapping.
++ * uses INTERNAL_* macros defined in the header files
++ */
++ switch (raw_appParamsValueType_val) {
++ case INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_BOOL:
++ *mib_appParamsValueType_val_ptr = DESSERTAPPVALUETYPE_BOOL;
++ break;
++
++ case INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_INT32:
++ *mib_appParamsValueType_val_ptr = DESSERTAPPVALUETYPE_INT32;
++ break;
++
++ case INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_UINT32:
++ *mib_appParamsValueType_val_ptr = DESSERTAPPVALUETYPE_UINT32;
++ break;
++
++ case INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_OCTETSTRING:
++ *mib_appParamsValueType_val_ptr = DESSERTAPPVALUETYPE_OCTETSTRING;
++ break;
++
++ default:
++ snmp_log(LOG_ERR,
++ "couldn't map value %ld for appParamsValueType\n",
++ raw_appParamsValueType_val);
++ return MFD_ERROR;
++ }
++
++ return MFD_SUCCESS;
++} /* appParamsValueType_map */
++
++/**
++ * Extract the current value of the appParamsValueType data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appParamsValueType_val_ptr
++ * Pointer to storage for a long variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++appParamsValueType_get(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
++ u_long * appParamsValueType_val_ptr)
++{
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != appParamsValueType_val_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsValueType_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the appParamsValueType data.
++ * copy (* appParamsValueType_val_ptr ) from rowreq_ctx->data
++ */
++ (*appParamsValueType_val_ptr) = rowreq_ctx->data.appParamsValueType;
++
++ return MFD_SUCCESS;
++} /* appParamsValueType_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppParamsEntry.appParamsTruthValue
++ * appParamsTruthValue is subid 5 of dessertAppParamsEntry.
++ * Its status is Current, and its access level is ReadWrite.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.5
++ * Description:
++A parameter with TruthValue semantics.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 1 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 1
++ *
++ * Enum range: 2/8. Values: true(1), false(2)
++ *
++ * Its syntax is TruthValue (based on perltype INTEGER)
++ * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
++ */
++/**
++ * map a value from its original native format to the MIB format.
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_ERROR : Any other error
++ *
++ * @note parameters follow the memset convention (dest, src).
++ *
++ * @note generation and use of this function can be turned off by re-running
++ * mib2c after adding the following line to the file
++ * defaults/node-appParamsTruthValue.m2d :
++ * @eval $m2c_node_skip_mapping = 1@
++ *
++ * @remark
++ * If the values for your data type don't exactly match the
++ * possible values defined by the mib, you should map them here.
++ * Otherwise, just do a direct copy.
++ */
++int
++appParamsTruthValue_map(u_long * mib_appParamsTruthValue_val_ptr,
++ u_long raw_appParamsTruthValue_val)
++{
++ netsnmp_assert(NULL != mib_appParamsTruthValue_val_ptr);
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsTruthValue_map",
++ "called\n"));
++
++ /*
++ * TODO:241:o: |-> Implement appParamsTruthValue enum mapping.
++ * uses INTERNAL_* macros defined in the header files
++ */
++ switch (raw_appParamsTruthValue_val) {
++ case INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSTRUTHVALUE_TRUE:
++ *mib_appParamsTruthValue_val_ptr = TRUTHVALUE_TRUE;
++ break;
++
++ case INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSTRUTHVALUE_FALSE:
++ *mib_appParamsTruthValue_val_ptr = TRUTHVALUE_FALSE;
++ break;
++
++ default:
++ snmp_log(LOG_ERR,
++ "couldn't map value %ld for appParamsTruthValue\n",
++ raw_appParamsTruthValue_val);
++ return MFD_ERROR;
++ }
++
++ return MFD_SUCCESS;
++} /* appParamsTruthValue_map */
++
++/**
++ * Extract the current value of the appParamsTruthValue data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appParamsTruthValue_val_ptr
++ * Pointer to storage for a long variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++appParamsTruthValue_get(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
++ u_long * appParamsTruthValue_val_ptr)
++{
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != appParamsTruthValue_val_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsTruthValue_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the appParamsTruthValue data.
++ * copy (* appParamsTruthValue_val_ptr ) from rowreq_ctx->data
++ */
++ (*appParamsTruthValue_val_ptr) = rowreq_ctx->data.appParamsTruthValue;
++
++ return MFD_SUCCESS;
++} /* appParamsTruthValue_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppParamsEntry.appParamsInteger32
++ * appParamsInteger32 is subid 6 of dessertAppParamsEntry.
++ * Its status is Current, and its access level is ReadWrite.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.6
++ * Description:
++A parameter with Integer32 semantics.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 1
++ *
++ *
++ * Its syntax is INTEGER32 (based on perltype INTEGER32)
++ * The net-snmp type is ASN_INTEGER. The C type decl is long (long)
++ */
++/**
++ * Extract the current value of the appParamsInteger32 data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appParamsInteger32_val_ptr
++ * Pointer to storage for a long variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++appParamsInteger32_get(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
++ long *appParamsInteger32_val_ptr)
++{
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != appParamsInteger32_val_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsInteger32_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the appParamsInteger32 data.
++ * copy (* appParamsInteger32_val_ptr ) from rowreq_ctx->data
++ */
++ (*appParamsInteger32_val_ptr) = rowreq_ctx->data.appParamsInteger32;
++
++ return MFD_SUCCESS;
++} /* appParamsInteger32_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppParamsEntry.appParamsUnsigned32
++ * appParamsUnsigned32 is subid 7 of dessertAppParamsEntry.
++ * Its status is Current, and its access level is ReadWrite.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.7
++ * Description:
++A parameter with Unsigned32 semantics.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 1
++ *
++ *
++ * Its syntax is UNSIGNED32 (based on perltype UNSIGNED32)
++ * The net-snmp type is ASN_UNSIGNED. The C type decl is u_long (u_long)
++ */
++/**
++ * Extract the current value of the appParamsUnsigned32 data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appParamsUnsigned32_val_ptr
++ * Pointer to storage for a u_long variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++appParamsUnsigned32_get(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
++ u_long * appParamsUnsigned32_val_ptr)
++{
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != appParamsUnsigned32_val_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsUnsigned32_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the appParamsUnsigned32 data.
++ * copy (* appParamsUnsigned32_val_ptr ) from rowreq_ctx->data
++ */
++ (*appParamsUnsigned32_val_ptr) = rowreq_ctx->data.appParamsUnsigned32;
++
++ return MFD_SUCCESS;
++} /* appParamsUnsigned32_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppParamsEntry.appParamsOctetString
++ * appParamsOctetString is subid 9 of dessertAppParamsEntry.
++ * Its status is Current, and its access level is ReadWrite.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.9
++ * Description:
++A parameter containing of up to 1024 octets.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 1 hashint 1
++ * settable 1
++ * hint: 1024a
++ *
++ * Ranges: 0 - 1024;
++ *
++ * Its syntax is DessertApplicationOctetString (based on perltype OCTETSTR)
++ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
++ * This data type requires a length. (Max 1024)
++ */
++/**
++ * Extract the current value of the appParamsOctetString data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appParamsOctetString_val_ptr_ptr
++ * Pointer to storage for a char variable
++ * @param appParamsOctetString_val_ptr_len_ptr
++ * Pointer to a size_t. On entry, it will contain the size (in bytes)
++ * pointed to by appParamsOctetString.
++ * On exit, this value should contain the data size (in bytes).
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++*
++ * @note If you need more than (*appParamsOctetString_val_ptr_len_ptr) bytes of memory,
++ * allocate it using malloc() and update appParamsOctetString_val_ptr_ptr.
++ * <b>DO NOT</b> free the previous pointer.
++ * The MFD helper will release the memory you allocate.
++ *
++ * @remark If you call this function yourself, you are responsible
++ * for checking if the pointer changed, and freeing any
++ * previously allocated memory. (Not necessary if you pass
++ * in a pointer to static memory, obviously.)
++ */
++int
++appParamsOctetString_get(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
++ char **appParamsOctetString_val_ptr_ptr,
++ size_t *appParamsOctetString_val_ptr_len_ptr)
++{
++ /** we should have a non-NULL pointer and enough storage */
++ netsnmp_assert((NULL != appParamsOctetString_val_ptr_ptr)
++ && (NULL != *appParamsOctetString_val_ptr_ptr));
++ netsnmp_assert(NULL != appParamsOctetString_val_ptr_len_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsOctetString_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the appParamsOctetString data.
++ * copy (* appParamsOctetString_val_ptr_ptr ) data and (* appParamsOctetString_val_ptr_len_ptr ) from rowreq_ctx->data
++ */
++ /*
++ * make sure there is enough space for appParamsOctetString data
++ */
++ if ((NULL == (*appParamsOctetString_val_ptr_ptr)) ||
++ ((*appParamsOctetString_val_ptr_len_ptr) <
++ (rowreq_ctx->data.appParamsOctetString_len *
++ sizeof(rowreq_ctx->data.appParamsOctetString[0])))) {
++ /*
++ * allocate space for appParamsOctetString data
++ */
++ (*appParamsOctetString_val_ptr_ptr) =
++ malloc(rowreq_ctx->data.appParamsOctetString_len *
++ sizeof(rowreq_ctx->data.appParamsOctetString[0]));
++ if (NULL == (*appParamsOctetString_val_ptr_ptr)) {
++ snmp_log(LOG_ERR, "could not allocate memory\n");
++ return MFD_ERROR;
++ }
++ }
++ (*appParamsOctetString_val_ptr_len_ptr) =
++ rowreq_ctx->data.appParamsOctetString_len *
++ sizeof(rowreq_ctx->data.appParamsOctetString[0]);
++ memcpy((*appParamsOctetString_val_ptr_ptr),
++ rowreq_ctx->data.appParamsOctetString,
++ rowreq_ctx->data.appParamsOctetString_len *
++ sizeof(rowreq_ctx->data.appParamsOctetString[0]));
++
++ return MFD_SUCCESS;
++} /* appParamsOctetString_get */
++
++
++
++/** @} */
+diff --git a/src/snmp/dessertAppParamsTable_data_get.h b/src/snmp/dessertAppParamsTable_data_get.h
+new file mode 100644
+index 0000000..1e955ee
+--- /dev/null
++++ b/src/snmp/dessertAppParamsTable_data_get.h
+@@ -0,0 +1,136 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 12088 $ of $
++ *
++ * $Id:$
++ *
++ * @file dessertAppParamsTable_data_get.h
++ *
++ * @addtogroup get
++ *
++ * Prototypes for get functions
++ *
++ * @{
++ */
++#ifndef DESSERTAPPPARAMSTABLE_DATA_GET_H
++#define DESSERTAPPPARAMSTABLE_DATA_GET_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++ /*
++ *********************************************************************
++ * GET function declarations
++ */
++
++ /*
++ *********************************************************************
++ * GET Table declarations
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertAppParamsTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++ /*
++ * DESSERT-MIB::dessertAppParamsTable is subid 11 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11, length: 13
++ */
++ /*
++ * indexes
++ */
++ int appParamsIndex_map(long *mib_appParamsIndex_val_ptr,
++ long raw_appParamsIndex_val);
++
++ int appParamsName_map(char **mib_appParamsName_val_ptr_ptr,
++ size_t
++ *mib_appParamsName_val_ptr_len_ptr,
++ char *raw_appParamsName_val_ptr,
++ size_t raw_appParamsName_val_ptr_len,
++ int allow_realloc);
++ int appParamsName_get(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx,
++ char **appParamsName_val_ptr_ptr,
++ size_t
++ *appParamsName_val_ptr_len_ptr);
++ int appParamsDesc_map(char **mib_appParamsDesc_val_ptr_ptr,
++ size_t
++ *mib_appParamsDesc_val_ptr_len_ptr,
++ char *raw_appParamsDesc_val_ptr,
++ size_t raw_appParamsDesc_val_ptr_len,
++ int allow_realloc);
++ int appParamsDesc_get(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx,
++ char **appParamsDesc_val_ptr_ptr,
++ size_t
++ *appParamsDesc_val_ptr_len_ptr);
++ int appParamsValueType_map(u_long *
++ mib_appParamsValueType_val_ptr,
++ u_long
++ raw_appParamsValueType_val);
++ int appParamsValueType_get(dessertAppParamsTable_rowreq_ctx
++ * rowreq_ctx,
++ u_long *
++ appParamsValueType_val_ptr);
++ int appParamsTruthValue_map(u_long *
++ mib_appParamsTruthValue_val_ptr,
++ u_long
++ raw_appParamsTruthValue_val);
++ int
++ appParamsTruthValue_get(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx,
++ u_long * appParamsTruthValue_val_ptr);
++ int appParamsInteger32_map(long
++ *mib_appParamsInteger32_val_ptr,
++ long
++ raw_appParamsInteger32_val);
++ int appParamsInteger32_get(dessertAppParamsTable_rowreq_ctx
++ * rowreq_ctx,
++ long
++ *appParamsInteger32_val_ptr);
++ int appParamsUnsigned32_map(u_long *
++ mib_appParamsUnsigned32_val_ptr,
++ u_long
++ raw_appParamsUnsigned32_val);
++ int
++ appParamsUnsigned32_get(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx,
++ u_long * appParamsUnsigned32_val_ptr);
++ int appParamsOctetString_map(char
++ **mib_appParamsOctetString_val_ptr_ptr,
++ size_t
++ *mib_appParamsOctetString_val_ptr_len_ptr,
++ char
++ *raw_appParamsOctetString_val_ptr,
++ size_t
++ raw_appParamsOctetString_val_ptr_len,
++ int allow_realloc);
++ int
++ appParamsOctetString_get(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx,
++ char **appParamsOctetString_val_ptr_ptr,
++ size_t
++ *appParamsOctetString_val_ptr_len_ptr);
++
++
++ int
++ dessertAppParamsTable_indexes_set_tbl_idx
++ (dessertAppParamsTable_mib_index * tbl_idx,
++ long appParamsIndex_val);
++ int
++ dessertAppParamsTable_indexes_set(dessertAppParamsTable_rowreq_ctx
++ * rowreq_ctx,
++ long appParamsIndex_val);
++
++
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTAPPPARAMSTABLE_DATA_GET_H */
++/** @} */
+diff --git a/src/snmp/dessertAppParamsTable_data_set.c b/src/snmp/dessertAppParamsTable_data_set.c
+new file mode 100644
+index 0000000..2e849f6
+--- /dev/null
++++ b/src/snmp/dessertAppParamsTable_data_set.c
+@@ -0,0 +1,1241 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 12077 $ of $
++ *
++ * $Id:$
++ *
++ */
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertAppParamsTable.h"
++#include "dessertAppParamsTable_enums.h"
++#include "dessert_internal.h"
++
++
++/** @defgroup data_set data_set: Routines to set data
++ *
++ * These routines are used to set the value for individual objects. The
++ * row context is passed, along with the new value.
++ *
++ * @{
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertAppParamsTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++/*
++ * DESSERT-MIB::dessertAppParamsTable is subid 11 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11, length: 13
++ */
++ /*
++ * NOTE: if you update this chart, please update the versions in
++ * local/mib2c-conf.d/parent-set.m2i
++ * agent/mibgroup/helpers/baby_steps.c
++ * while you're at it.
++ */
++ /*
++ ***********************************************************************
++ * Baby Steps Flow Chart (2004.06.05) *
++ * *
++ * +--------------+ +================+ U = unconditional path *
++ * |optional state| ||required state|| S = path for success *
++ * +--------------+ +================+ E = path for error *
++ ***********************************************************************
++ *
++ * +--------------+
++ * | pre |
++ * | request |
++ * +--------------+
++ * | U
++ * +==============+
++ * +----------------|| object ||
++ * | E || lookup ||
++ * | +==============+
++ * | | S
++ * | +==============+
++ * | E || check ||
++ * |<---------------|| values ||
++ * | +==============+
++ * | | S
++ * | +==============+
++ * | +<-------|| undo ||
++ * | | E || setup ||
++ * | | +==============+
++ * | | | S
++ * | | +==============+
++ * | | || set ||-------------------------->+
++ * | | || value || E |
++ * | | +==============+ |
++ * | | | S |
++ * | | +--------------+ |
++ * | | | check |-------------------------->|
++ * | | | consistency | E |
++ * | | +--------------+ |
++ * | | | S |
++ * | | +==============+ +==============+ |
++ * | | || commit ||-------->|| undo || |
++ * | | || || E || commit || |
++ * | | +==============+ +==============+ |
++ * | | | S U |<--------+
++ * | | +--------------+ +==============+
++ * | | | irreversible | || undo ||
++ * | | | commit | || set ||
++ * | | +--------------+ +==============+
++ * | | | U U |
++ * | +-------------->|<------------------------+
++ * | +==============+
++ * | || undo ||
++ * | || cleanup ||
++ * | +==============+
++ * +---------------------->| U
++ * +--------------+
++ * | post |
++ * | request |
++ * +--------------+
++ *
++ */
++
++/**
++ * Setup up context with information needed to undo a set request.
++ *
++ * This function will be called before the individual node undo setup
++ * functions are called. If you need to do any undo setup that is not
++ * related to a specific column, you can do it here.
++ *
++ * Note that the undo context has been allocated with
++ * dessertAppParamsTable_allocate_data(), but may need extra
++ * initialization similar to what you may have done in
++ * dessertAppParamsTable_rowreq_ctx_init().
++ * Note that an individual node's undo_setup function will only be called
++ * if that node is being set to a new value.
++ *
++ * If there is any setup specific to a particular column (e.g. allocating
++ * memory for a string), you should do that setup in the node's undo_setup
++ * function, so it won't be done unless it is necessary.
++ *
++ * @param rowreq_ctx
++ * Pointer to the table context (dessertAppParamsTable_rowreq_ctx)
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_ERROR : error. set will fail.
++ */
++int
++dessertAppParamsTable_undo_setup(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx)
++{
++ int rc = MFD_SUCCESS;
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_undo_setup", "called\n"));
++
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:451:M: |-> Setup dessertAppParamsTable undo.
++ * set up dessertAppParamsTable undo information, in preparation for a set.
++ * Undo storage is in (* appParamsOctetString_val_ptr_ptr )*
++ */
++
++ return rc;
++} /* dessertAppParamsTable_undo_setup */
++
++/**
++ * Undo a set request.
++ *
++ * This function will be called before the individual node undo
++ * functions are called. If you need to do any undo that is not
++ * related to a specific column, you can do it here.
++ *
++ * Note that an individual node's undo function will only be called
++ * if that node is being set to a new value.
++ *
++ * If there is anything specific to a particular column (e.g. releasing
++ * memory for a string), you should do that setup in the node's undo
++ * function, so it won't be done unless it is necessary.
++ *
++ * @param rowreq_ctx
++ * Pointer to the table context (dessertAppParamsTable_rowreq_ctx)
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_ERROR : error. set will fail.
++ */
++int
++dessertAppParamsTable_undo(dessertAppParamsTable_rowreq_ctx * rowreq_ctx)
++{
++ int rc = MFD_SUCCESS;
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_undo",
++ "called\n"));
++
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:451:M: |-> dessertAppParamsTable undo.
++ * dessertAppParamsTable undo information, in response to a failed set.
++ * Undo storage is in (* appParamsOctetString_val_ptr_ptr )*
++ */
++
++ return rc;
++} /* dessertAppParamsTable_undo_setup */
++
++/**
++ * Cleanup up context undo information.
++ *
++ * This function will be called after set/commit processing. If you
++ * allocated any resources in undo_setup, this is the place to release
++ * those resources.
++ *
++ * This function is called regardless of the success or failure of the set
++ * request. If you need to perform different steps for cleanup depending
++ * on success or failure, you can add a flag to the rowreq_ctx.
++ *
++ * @param rowreq_ctx
++ * Pointer to the table context (dessertAppParamsTable_rowreq_ctx)
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_ERROR : error
++ */
++int
++dessertAppParamsTable_undo_cleanup(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx)
++{
++ int rc = MFD_SUCCESS;
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_undo_cleanup", "called\n"));
++
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:452:M: |-> Cleanup dessertAppParamsTable undo.
++ * Undo storage is in (* appParamsOctetString_val_ptr_ptr )*
++ */
++
++ return rc;
++} /* dessertAppParamsTable_undo_cleanup */
++
++/**
++ * commit new values.
++ *
++ * At this point, you should have done everything you can to ensure that
++ * this commit will not fail.
++ *
++ * Should you need different behavior depending on which columns were
++ * set, rowreq_ctx->column_set_flags will indicate which writeable columns were
++ * set. The definitions for the COLUMN_*_FLAG bits can be found in
++ * dessertAppParamsTable_oids.h.
++ * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
++ *
++ * @param dessertAppParamsTable_rowreq_ctx
++ * Pointer to the users context.
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_ERROR : error
++ */
++int
++dessertAppParamsTable_commit(dessertAppParamsTable_rowreq_ctx * rowreq_ctx)
++{
++ int rc = MFD_SUCCESS;
++ int save_flags;
++ dessert_agentx_appparams_t *appparam;
++ dessert_agentx_appparamscb_set_t *set;
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_commit", "called\n"));
++
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ set = _dessert_agentx_appparams_getsettercbforindex(rowreq_ctx->tbl_idx.appParamsIndex);
++
++ if (set == NULL) {
++ snmp_log(
++ LOG_ERR,
++ "dessertAppParamsTable commit failed, no setter for index %ld!\n",
++ rowreq_ctx->tbl_idx.appParamsIndex);
++ return MFD_ERROR;
++ }
++
++ /*
++ * save flags, then clear until we actually do something
++ */
++ save_flags = rowreq_ctx->column_set_flags;
++ rowreq_ctx->column_set_flags = 0;
++
++ appparam = malloc(sizeof(dessert_agentx_appparams_t));
++
++ appparam->index = rowreq_ctx->tbl_idx.appParamsIndex;
++ appparam->value_type = rowreq_ctx->data.appParamsValueType;
++
++ dessert_debug("commit\n"
++ "\n\t\trowreq_ctx->tbl_idx \t[%u]"
++ "\n\t\trowreq_ctx->data.appParamsValueType \t[%u]"
++ "\n\t\trowreq_ctx->data.appParamsTruthValue \t[%u]"
++ "\n\t\trowreq_ctx->data.appParamsInteger32 \t[%d]"
++ "\n\t\trowreq_ctx->data.appParamsUnsigned32 \t[%u]"
++ "\n\t\trowreq_ctx->data.appParamsOctetString_len \t[%u]"
++
++ "\n",rowreq_ctx->tbl_idx,
++ rowreq_ctx->data.appParamsValueType,
++ rowreq_ctx->data.appParamsTruthValue,
++ rowreq_ctx->data.appParamsInteger32,
++ rowreq_ctx->data.appParamsUnsigned32,
++ rowreq_ctx->data.appParamsOctetString_len
++ );
++
++ /*
++ * commit dessertAppParamsTable data
++ * 1) check the column's flag in save_flags to see if it was set.
++ * 2) clear the flag when you handle that column
++ * 3) set the column's flag in column_set_flags if it needs undo
++ * processing in case of a failure.
++ */
++ if (save_flags & COLUMN_APPPARAMSTRUTHVALUE_FLAG) {
++ /* clear appParamsTruthValue */
++ save_flags &= ~COLUMN_APPPARAMSTRUTHVALUE_FLAG;
++ /*
++ * commit column appParamsTruthValue.
++ */
++
++ appparam->bool = rowreq_ctx->data.appParamsTruthValue;
++
++ rc = set(appparam);
++ if (DESSERT_ERR == rc) {
++ snmp_log(LOG_ERR,
++ "dessertAppParamsTable column appParamsTruthValue commit failed\n");
++ } else {
++ /*
++ * set flag, in case we need to undo appParamsTruthValue
++ */
++ rowreq_ctx->column_set_flags |=
++ COLUMN_APPPARAMSTRUTHVALUE_FLAG;
++ }
++ }
++
++ if (save_flags & COLUMN_APPPARAMSINTEGER32_FLAG) {
++ /* clear appParamsInteger32 */
++ save_flags &= ~COLUMN_APPPARAMSINTEGER32_FLAG;
++ /*
++ * commit column appParamsInteger32.
++ */
++
++ appparam->int32 = rowreq_ctx->data.appParamsInteger32;
++
++ rc = set(appparam);
++ if (DESSERT_ERR == rc) {
++ snmp_log(LOG_ERR,
++ "dessertAppParamsTable column appParamsInteger32 commit failed\n");
++ } else {
++ /*
++ * set flag, in case we need to undo appParamsInteger32
++ */
++ rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSINTEGER32_FLAG;
++ }
++ }
++
++ if (save_flags & COLUMN_APPPARAMSUNSIGNED32_FLAG) {
++ /* clear appParamsUnsigned32 */
++ save_flags &= ~COLUMN_APPPARAMSUNSIGNED32_FLAG;
++ /*
++ * commit column appParamsUnsigned32.
++ */
++
++ appparam->uint32 = rowreq_ctx->data.appParamsUnsigned32;
++
++ rc = set(appparam);
++ if (DESSERT_ERR == rc) {
++ snmp_log(LOG_ERR,
++ "dessertAppParamsTable column appParamsUnsigned32 commit failed\n");
++ } else {
++ /*
++ * set flag, in case we need to undo appParamsUnsigned32
++ */
++ rowreq_ctx->column_set_flags |=
++ COLUMN_APPPARAMSUNSIGNED32_FLAG;
++ }
++ }
++
++ if (save_flags & COLUMN_APPPARAMSOCTETSTRING_FLAG) {
++ /* clear appParamsOctetString */
++ save_flags &= ~COLUMN_APPPARAMSOCTETSTRING_FLAG;
++ /*
++ * TODO:482:o: |-> commit column appParamsOctetString.
++ */
++
++ appparam->octetstring_len = rowreq_ctx->data.appParamsOctetString_len;
++ appparam->octetstring = malloc(sizeof(char) * appparam->octetstring_len);
++ memcpy(appparam->octetstring, rowreq_ctx->data.appParamsOctetString, rowreq_ctx->data.appParamsOctetString_len * sizeof(rowreq_ctx->data.appParamsOctetString[0]));
++
++ rc = set(appparam);
++ if (DESSERT_ERR == rc) {
++ snmp_log(LOG_ERR,
++ "dessertAppParamsTable column appParamsOctetString commit failed\n");
++ } else {
++ /*
++ * set flag, in case we need to undo appParamsOctetString
++ */
++ dessert_debug("dessertAppParamsTable column appParamsOctetString commited");
++ rowreq_ctx->column_set_flags |=
++ COLUMN_APPPARAMSOCTETSTRING_FLAG;
++ }
++ }
++
++ if (rc == DESSERT_ERR) rc = -1; else {rc = MFD_SUCCESS;}
++
++ /*
++ * if we successfully committed this row, set the dirty flag.
++ */
++ if (MFD_SUCCESS == rc) {
++ rowreq_ctx->rowreq_flags |= MFD_ROW_DIRTY;
++ }
++
++ if (save_flags) {
++ snmp_log(LOG_ERR, "unhandled columns (0x%x) in commit\n",
++ save_flags);
++ return MFD_ERROR;
++ }
++
++ _dessert_agentx_appparams_free(appparam);
++
++ return rc;
++} /* dessertAppParamsTable_commit */
++
++/**
++ * undo commit new values.
++ *
++ * Should you need different behavior depending on which columns were
++ * set, rowreq_ctx->column_set_flags will indicate which writeable columns were
++ * set. The definitions for the COLUMN_*_FLAG bits can be found in
++ * dessertAppParamsTable_oids.h.
++ * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
++ *
++ * @param dessertAppParamsTable_rowreq_ctx
++ * Pointer to the users context.
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_ERROR : error
++ */
++int
++dessertAppParamsTable_undo_commit(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx)
++{
++ int rc = MFD_SUCCESS;
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_undo_commit", "called\n"));
++
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:485:M: |-> Undo dessertAppParamsTable commit.
++ * check the column's flag in rowreq_ctx->column_set_flags to see
++ * if it was set during commit, then undo it.
++ *
++ * eg: if (rowreq_ctx->column_set_flags & COLUMN__FLAG) {}
++ */
++
++
++ /*
++ * if we successfully un-commited this row, clear the dirty flag.
++ */
++ if (MFD_SUCCESS == rc) {
++ rowreq_ctx->rowreq_flags &= ~MFD_ROW_DIRTY;
++ }
++
++ return rc;
++} /* dessertAppParamsTable_undo_commit */
++
++/*
++ * TODO:440:M: Implement dessertAppParamsTable node value checks.
++ * TODO:450:M: Implement dessertAppParamsTable undo functions.
++ * TODO:460:M: Implement dessertAppParamsTable set functions.
++ * TODO:480:M: Implement dessertAppParamsTable commit functions.
++ */
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppParamsEntry.appParamsTruthValue
++ * appParamsTruthValue is subid 5 of dessertAppParamsEntry.
++ * Its status is Current, and its access level is ReadWrite.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.5
++ * Description:
++A parameter with TruthValue semantics.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 1 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 1
++ *
++ * Enum range: 2/8. Values: true(1), false(2)
++ *
++ * Its syntax is TruthValue (based on perltype INTEGER)
++ * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
++ */
++/**
++ * Check that the proposed new value is potentially valid.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appParamsTruthValue_val
++ * A long containing the new value.
++ *
++ * @retval MFD_SUCCESS : incoming value is legal
++ * @retval MFD_NOT_VALID_NOW : incoming value is not valid now
++ * @retval MFD_NOT_VALID_EVER : incoming value is never valid
++ *
++ * This is the place to check for requirements that are not
++ * expressed in the mib syntax (for example, a requirement that
++ * is detailed in the description for an object).
++ *
++ * You should check that the requested change between the undo value and the
++ * new value is legal (ie, the transistion from one value to another
++ * is legal).
++ *
++ *@note
++ * This check is only to determine if the new value
++ * is \b potentially valid. This is the first check of many, and
++ * is one of the simplest ones.
++ *
++ *@note
++ * this is not the place to do any checks for values
++ * which depend on some other value in the mib. Those
++ * types of checks should be done in the
++ * dessertAppParamsTable_check_dependencies() function.
++ *
++ * The following checks have already been done for you:
++ * The syntax is ASN_INTEGER
++ * The value is one of true(1), false(2)
++ *
++ * If there a no other checks you need to do, simply return MFD_SUCCESS.
++ *
++ */
++int
++appParamsTruthValue_check_value(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx, u_long appParamsTruthValue_val)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsTruthValue_check_value", "called\n"));
++
++ /** should never get a NULL pointer */
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * Check for valid appParamsTruthValue value.
++ */
++
++ if (rowreq_ctx->data.appParamsValueType != DESSERT_APPPARAMS_VALUETYPE_BOOL) {
++
++ return MFD_NOT_VALID_EVER;
++ } else {
++
++ return MFD_SUCCESS; /* appParamsTruthValue value not illegal */
++ }
++} /* appParamsTruthValue_check_value */
++
++/**
++ * Save old value information
++ *
++ * @param rowreq_ctx
++ * Pointer to the table context (dessertAppParamsTable_rowreq_ctx)
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_ERROR : error. set will fail.
++ *
++ * This function will be called after the table level undo setup function
++ * dessertAppParamsTable_undo_setup has been called.
++ *
++ *@note
++ * this function will only be called if a new value is set for this column.
++ *
++ * If there is any setup specific to a particular column (e.g. allocating
++ * memory for a string), you should do that setup in this function, so it
++ * won't be done unless it is necessary.
++ */
++int
++appParamsTruthValue_undo_setup(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsTruthValue_undo_setup", "called\n"));
++
++ /** should never get a NULL pointer */
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:455:o: |-> Setup appParamsTruthValue undo.
++ */
++ /*
++ * copy appParamsTruthValue data
++ * set rowreq_ctx->undo->appParamsTruthValue from rowreq_ctx->data.appParamsTruthValue
++ */
++ rowreq_ctx->undo->appParamsTruthValue =
++ rowreq_ctx->data.appParamsTruthValue;
++
++
++ return MFD_SUCCESS;
++} /* appParamsTruthValue_undo_setup */
++
++/**
++ * Set the new value.
++ *
++ * @param rowreq_ctx
++ * Pointer to the users context. You should know how to
++ * manipulate the value from this object.
++ * @param appParamsTruthValue_val
++ * A long containing the new value.
++ */
++int
++appParamsTruthValue_set(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
++ u_long appParamsTruthValue_val)
++{
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsTruthValue_set",
++ "called\n"));
++
++ /** should never get a NULL pointer */
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:245:o: |-> Implement appParamsTruthValue reverse mapping.
++ * If the values for your data type don't exactly match the
++ * possible values defined by the mib, you should map them here.
++ */
++ /*
++ ***************************************************
++ *** START EXAMPLE CODE ***
++ ***---------------------------------------------***/
++ switch (appParamsTruthValue_val) {
++ case TRUTHVALUE_TRUE:
++ rowreq_ctx->data.appParamsTruthValue =
++ INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSTRUTHVALUE_TRUE;
++ break;
++
++ case TRUTHVALUE_FALSE:
++ rowreq_ctx->data.appParamsTruthValue =
++ INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSTRUTHVALUE_FALSE;
++ break;
++
++ default:
++ snmp_log(LOG_ERR,
++ "couldn't reverse map value %ld for appParamsTruthValue\n",
++ appParamsTruthValue_val);
++ return SNMP_ERR_GENERR;
++ }
++ /*
++ ***---------------------------------------------***
++ *** END EXAMPLE CODE ***
++ ***************************************************/
++
++ return MFD_SUCCESS;
++} /* appParamsTruthValue_set */
++
++/**
++ * undo the previous set.
++ *
++ * @param rowreq_ctx
++ * Pointer to the users context.
++ */
++int
++appParamsTruthValue_undo(dessertAppParamsTable_rowreq_ctx * rowreq_ctx)
++{
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsTruthValue_undo",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:456:o: |-> Clean up appParamsTruthValue undo.
++ */
++ /*
++ * copy appParamsTruthValue data
++ * set rowreq_ctx->data.appParamsTruthValue from rowreq_ctx->undo->appParamsTruthValue
++ */
++ rowreq_ctx->data.appParamsTruthValue =
++ rowreq_ctx->undo->appParamsTruthValue;
++
++
++ return MFD_SUCCESS;
++} /* appParamsTruthValue_undo */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppParamsEntry.appParamsInteger32
++ * appParamsInteger32 is subid 6 of dessertAppParamsEntry.
++ * Its status is Current, and its access level is ReadWrite.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.6
++ * Description:
++A parameter with Integer32 semantics.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 1
++ *
++ *
++ * Its syntax is INTEGER32 (based on perltype INTEGER32)
++ * The net-snmp type is ASN_INTEGER. The C type decl is long (long)
++ */
++/**
++ * Check that the proposed new value is potentially valid.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appParamsInteger32_val
++ * A long containing the new value.
++ *
++ * @retval MFD_SUCCESS : incoming value is legal
++ * @retval MFD_NOT_VALID_NOW : incoming value is not valid now
++ * @retval MFD_NOT_VALID_EVER : incoming value is never valid
++ *
++ * This is the place to check for requirements that are not
++ * expressed in the mib syntax (for example, a requirement that
++ * is detailed in the description for an object).
++ *
++ * You should check that the requested change between the undo value and the
++ * new value is legal (ie, the transistion from one value to another
++ * is legal).
++ *
++ *@note
++ * This check is only to determine if the new value
++ * is \b potentially valid. This is the first check of many, and
++ * is one of the simplest ones.
++ *
++ *@note
++ * this is not the place to do any checks for values
++ * which depend on some other value in the mib. Those
++ * types of checks should be done in the
++ * dessertAppParamsTable_check_dependencies() function.
++ *
++ * The following checks have already been done for you:
++ * The syntax is ASN_INTEGER
++ *
++ * If there a no other checks you need to do, simply return MFD_SUCCESS.
++ *
++ */
++int
++appParamsInteger32_check_value(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx, long appParamsInteger32_val)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsInteger32_check_value", "called\n"));
++
++ /** should never get a NULL pointer */
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * Check for valid appParamsInteger32 value.
++ */
++
++ dessert_debug("check_value\n\t\trowreq_ctx->data.appParamsValueType [%d]",rowreq_ctx->data.appParamsValueType);
++ if (rowreq_ctx->data.appParamsValueType != DESSERT_APPPARAMS_VALUETYPE_INT32) {
++
++ return MFD_NOT_VALID_EVER;
++ } else {
++
++ return MFD_SUCCESS; /* appParamsInteger32 value not illegal */
++ }
++} /* appParamsInteger32_check_value */
++
++/**
++ * Save old value information
++ *
++ * @param rowreq_ctx
++ * Pointer to the table context (dessertAppParamsTable_rowreq_ctx)
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_ERROR : error. set will fail.
++ *
++ * This function will be called after the table level undo setup function
++ * dessertAppParamsTable_undo_setup has been called.
++ *
++ *@note
++ * this function will only be called if a new value is set for this column.
++ *
++ * If there is any setup specific to a particular column (e.g. allocating
++ * memory for a string), you should do that setup in this function, so it
++ * won't be done unless it is necessary.
++ */
++int
++appParamsInteger32_undo_setup(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsInteger32_undo_setup", "called\n"));
++
++ /** should never get a NULL pointer */
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:455:o: |-> Setup appParamsInteger32 undo.
++ */
++ /*
++ * copy appParamsInteger32 data
++ * set rowreq_ctx->undo->appParamsInteger32 from rowreq_ctx->data.appParamsInteger32
++ */
++ rowreq_ctx->undo->appParamsInteger32 =
++ rowreq_ctx->data.appParamsInteger32;
++
++
++ return MFD_SUCCESS;
++} /* appParamsInteger32_undo_setup */
++
++/**
++ * Set the new value.
++ *
++ * @param rowreq_ctx
++ * Pointer to the users context. You should know how to
++ * manipulate the value from this object.
++ * @param appParamsInteger32_val
++ * A long containing the new value.
++ */
++int
++appParamsInteger32_set(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
++ long appParamsInteger32_val)
++{
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsInteger32_set",
++ "called\n"));
++
++ /** should never get a NULL pointer */
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:245:o: |-> Implement appParamsInteger32 reverse mapping.
++ * If the values for your data type don't exactly match the
++ * possible values defined by the mib, you should map them here.
++ */
++ /*
++ * TODO:461:M: |-> Set appParamsInteger32 value.
++ * set appParamsInteger32 value in rowreq_ctx->data
++ */
++ rowreq_ctx->data.appParamsInteger32 = appParamsInteger32_val;
++
++
++ return MFD_SUCCESS;
++} /* appParamsInteger32_set */
++
++/**
++ * undo the previous set.
++ *
++ * @param rowreq_ctx
++ * Pointer to the users context.
++ */
++int
++appParamsInteger32_undo(dessertAppParamsTable_rowreq_ctx * rowreq_ctx)
++{
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsInteger32_undo",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:456:o: |-> Clean up appParamsInteger32 undo.
++ */
++ /*
++ * copy appParamsInteger32 data
++ * set rowreq_ctx->data.appParamsInteger32 from rowreq_ctx->undo->appParamsInteger32
++ */
++ rowreq_ctx->data.appParamsInteger32 =
++ rowreq_ctx->undo->appParamsInteger32;
++
++
++ return MFD_SUCCESS;
++} /* appParamsInteger32_undo */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppParamsEntry.appParamsUnsigned32
++ * appParamsUnsigned32 is subid 7 of dessertAppParamsEntry.
++ * Its status is Current, and its access level is ReadWrite.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.7
++ * Description:
++A parameter with Unsigned32 semantics.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 1
++ *
++ *
++ * Its syntax is UNSIGNED32 (based on perltype UNSIGNED32)
++ * The net-snmp type is ASN_UNSIGNED. The C type decl is u_long (u_long)
++ */
++/**
++ * Check that the proposed new value is potentially valid.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appParamsUnsigned32_val
++ * A u_long containing the new value.
++ *
++ * @retval MFD_SUCCESS : incoming value is legal
++ * @retval MFD_NOT_VALID_NOW : incoming value is not valid now
++ * @retval MFD_NOT_VALID_EVER : incoming value is never valid
++ *
++ * This is the place to check for requirements that are not
++ * expressed in the mib syntax (for example, a requirement that
++ * is detailed in the description for an object).
++ *
++ * You should check that the requested change between the undo value and the
++ * new value is legal (ie, the transistion from one value to another
++ * is legal).
++ *
++ *@note
++ * This check is only to determine if the new value
++ * is \b potentially valid. This is the first check of many, and
++ * is one of the simplest ones.
++ *
++ *@note
++ * this is not the place to do any checks for values
++ * which depend on some other value in the mib. Those
++ * types of checks should be done in the
++ * dessertAppParamsTable_check_dependencies() function.
++ *
++ * The following checks have already been done for you:
++ * The syntax is ASN_UNSIGNED
++ *
++ * If there a no other checks you need to do, simply return MFD_SUCCESS.
++ *
++ */
++int
++appParamsUnsigned32_check_value(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx, u_long appParamsUnsigned32_val)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsUnsigned32_check_value", "called\n"));
++
++ /** should never get a NULL pointer */
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:441:o: |-> Check for valid appParamsUnsigned32 value.
++ */
++ if (rowreq_ctx->data.appParamsValueType != DESSERT_APPPARAMS_VALUETYPE_UINT32) {
++
++ return MFD_NOT_VALID_EVER;
++ } else {
++
++ return MFD_SUCCESS; /* appParamsUnsigned32 value not illegal */
++ }
++} /* appParamsUnsigned32_check_value */
++
++/**
++ * Save old value information
++ *
++ * @param rowreq_ctx
++ * Pointer to the table context (dessertAppParamsTable_rowreq_ctx)
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_ERROR : error. set will fail.
++ *
++ * This function will be called after the table level undo setup function
++ * dessertAppParamsTable_undo_setup has been called.
++ *
++ *@note
++ * this function will only be called if a new value is set for this column.
++ *
++ * If there is any setup specific to a particular column (e.g. allocating
++ * memory for a string), you should do that setup in this function, so it
++ * won't be done unless it is necessary.
++ */
++int
++appParamsUnsigned32_undo_setup(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsUnsigned32_undo_setup", "called\n"));
++
++ /** should never get a NULL pointer */
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:455:o: |-> Setup appParamsUnsigned32 undo.
++ */
++ /*
++ * copy appParamsUnsigned32 data
++ * set rowreq_ctx->undo->appParamsUnsigned32 from rowreq_ctx->data.appParamsUnsigned32
++ */
++ rowreq_ctx->undo->appParamsUnsigned32 =
++ rowreq_ctx->data.appParamsUnsigned32;
++
++
++ return MFD_SUCCESS;
++} /* appParamsUnsigned32_undo_setup */
++
++/**
++ * Set the new value.
++ *
++ * @param rowreq_ctx
++ * Pointer to the users context. You should know how to
++ * manipulate the value from this object.
++ * @param appParamsUnsigned32_val
++ * A u_long containing the new value.
++ */
++int
++appParamsUnsigned32_set(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
++ u_long appParamsUnsigned32_val)
++{
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsUnsigned32_set",
++ "called\n"));
++
++ /** should never get a NULL pointer */
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:245:o: |-> Implement appParamsUnsigned32 reverse mapping.
++ * If the values for your data type don't exactly match the
++ * possible values defined by the mib, you should map them here.
++ */
++ /*
++ * TODO:461:M: |-> Set appParamsUnsigned32 value.
++ * set appParamsUnsigned32 value in rowreq_ctx->data
++ */
++ rowreq_ctx->data.appParamsUnsigned32 = appParamsUnsigned32_val;
++
++
++ return MFD_SUCCESS;
++} /* appParamsUnsigned32_set */
++
++/**
++ * undo the previous set.
++ *
++ * @param rowreq_ctx
++ * Pointer to the users context.
++ */
++int
++appParamsUnsigned32_undo(dessertAppParamsTable_rowreq_ctx * rowreq_ctx)
++{
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsUnsigned32_undo",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:456:o: |-> Clean up appParamsUnsigned32 undo.
++ */
++ /*
++ * copy appParamsUnsigned32 data
++ * set rowreq_ctx->data.appParamsUnsigned32 from rowreq_ctx->undo->appParamsUnsigned32
++ */
++ rowreq_ctx->data.appParamsUnsigned32 =
++ rowreq_ctx->undo->appParamsUnsigned32;
++
++
++ return MFD_SUCCESS;
++} /* appParamsUnsigned32_undo */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppParamsEntry.appParamsOctetString
++ * appParamsOctetString is subid 9 of dessertAppParamsEntry.
++ * Its status is Current, and its access level is ReadWrite.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11.1.9
++ * Description:
++A parameter containing of up to 1024 octets.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 1 hashint 1
++ * settable 1
++ * hint: 1024a
++ *
++ * Ranges: 0 - 1024;
++ *
++ * Its syntax is DessertApplicationOctetString (based on perltype OCTETSTR)
++ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
++ * This data type requires a length. (Max 1024)
++ */
++/**
++ * Check that the proposed new value is potentially valid.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appParamsOctetString_val_ptr
++ * A char containing the new value.
++ * @param appParamsOctetString_val_ptr_len
++ * The size (in bytes) of the data pointed to by appParamsOctetString_val_ptr
++ *
++ * @retval MFD_SUCCESS : incoming value is legal
++ * @retval MFD_NOT_VALID_NOW : incoming value is not valid now
++ * @retval MFD_NOT_VALID_EVER : incoming value is never valid
++ *
++ * This is the place to check for requirements that are not
++ * expressed in the mib syntax (for example, a requirement that
++ * is detailed in the description for an object).
++ *
++ * You should check that the requested change between the undo value and the
++ * new value is legal (ie, the transistion from one value to another
++ * is legal).
++ *
++ *@note
++ * This check is only to determine if the new value
++ * is \b potentially valid. This is the first check of many, and
++ * is one of the simplest ones.
++ *
++ *@note
++ * this is not the place to do any checks for values
++ * which depend on some other value in the mib. Those
++ * types of checks should be done in the
++ * dessertAppParamsTable_check_dependencies() function.
++ *
++ * The following checks have already been done for you:
++ * The syntax is ASN_OCTET_STR
++ * The length is < sizeof(rowreq_ctx->data.appParamsOctetString).
++ * The length is in (one of) the range set(s): 0 - 1024
++ *
++ * If there a no other checks you need to do, simply return MFD_SUCCESS.
++ *
++ */
++int
++appParamsOctetString_check_value(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx,
++ char *appParamsOctetString_val_ptr,
++ size_t appParamsOctetString_val_ptr_len)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsOctetString_check_value", "called\n"));
++
++ /** should never get a NULL pointer */
++ netsnmp_assert(NULL != rowreq_ctx);
++ netsnmp_assert(NULL != appParamsOctetString_val_ptr);
++
++ /*
++ * TODO:441:o: |-> Check for valid appParamsOctetString value.
++ */
++ if (rowreq_ctx->data.appParamsValueType != DESSERT_APPPARAMS_VALUETYPE_OCTETSTRING) {
++
++ return MFD_NOT_VALID_EVER;
++ } else {
++
++ return MFD_SUCCESS; /* appParamsOctetString value not illegal */
++ }
++} /* appParamsOctetString_check_value */
++
++/**
++ * Save old value information
++ *
++ * @param rowreq_ctx
++ * Pointer to the table context (dessertAppParamsTable_rowreq_ctx)
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_ERROR : error. set will fail.
++ *
++ * This function will be called after the table level undo setup function
++ * dessertAppParamsTable_undo_setup has been called.
++ *
++ *@note
++ * this function will only be called if a new value is set for this column.
++ *
++ * If there is any setup specific to a particular column (e.g. allocating
++ * memory for a string), you should do that setup in this function, so it
++ * won't be done unless it is necessary.
++ */
++int
++appParamsOctetString_undo_setup(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsOctetString_undo_setup", "called\n"));
++
++ /** should never get a NULL pointer */
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:455:o: |-> Setup appParamsOctetString undo.
++ */
++ /*
++ * copy appParamsOctetString and appParamsOctetString_len data
++ * set rowreq_ctx->undo->appParamsOctetString from rowreq_ctx->data.appParamsOctetString
++ */
++ memcpy(rowreq_ctx->undo->appParamsOctetString,
++ rowreq_ctx->data.appParamsOctetString,
++ (rowreq_ctx->data.appParamsOctetString_len *
++ sizeof(rowreq_ctx->undo->appParamsOctetString[0])));
++ rowreq_ctx->undo->appParamsOctetString_len =
++ rowreq_ctx->data.appParamsOctetString_len;
++
++
++ return MFD_SUCCESS;
++} /* appParamsOctetString_undo_setup */
++
++/**
++ * Set the new value.
++ *
++ * @param rowreq_ctx
++ * Pointer to the users context. You should know how to
++ * manipulate the value from this object.
++ * @param appParamsOctetString_val_ptr
++ * A char containing the new value.
++ * @param appParamsOctetString_val_ptr_len
++ * The size (in bytes) of the data pointed to by appParamsOctetString_val_ptr
++ */
++int
++appParamsOctetString_set(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
++ char *appParamsOctetString_val_ptr,
++ size_t appParamsOctetString_val_ptr_len)
++{
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsOctetString_set",
++ "called\n"));
++
++ /** should never get a NULL pointer */
++ netsnmp_assert(NULL != rowreq_ctx);
++ netsnmp_assert(NULL != appParamsOctetString_val_ptr);
++
++ /*
++ * TODO:245:o: |-> Implement appParamsOctetString reverse mapping.
++ * If the values for your data type don't exactly match the
++ * possible values defined by the mib, you should map them here.
++ */
++ /*
++ * TODO:461:M: |-> Set appParamsOctetString value.
++ * set appParamsOctetString value in rowreq_ctx->data
++ */
++ memcpy(rowreq_ctx->data.appParamsOctetString,
++ appParamsOctetString_val_ptr, appParamsOctetString_val_ptr_len);
++ /** convert bytes to number of char */
++ rowreq_ctx->data.appParamsOctetString_len =
++ appParamsOctetString_val_ptr_len /
++ sizeof(appParamsOctetString_val_ptr[0]);
++
++
++ return MFD_SUCCESS;
++} /* appParamsOctetString_set */
++
++/**
++ * undo the previous set.
++ *
++ * @param rowreq_ctx
++ * Pointer to the users context.
++ */
++int
++appParamsOctetString_undo(dessertAppParamsTable_rowreq_ctx * rowreq_ctx)
++{
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:appParamsOctetString_undo",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:456:o: |-> Clean up appParamsOctetString undo.
++ */
++ /*
++ * copy appParamsOctetString and appParamsOctetString_len data
++ * set rowreq_ctx->data.appParamsOctetString from rowreq_ctx->undo->appParamsOctetString
++ */
++ memcpy(rowreq_ctx->data.appParamsOctetString,
++ rowreq_ctx->undo->appParamsOctetString,
++ (rowreq_ctx->undo->appParamsOctetString_len *
++ sizeof(rowreq_ctx->data.appParamsOctetString[0])));
++ rowreq_ctx->data.appParamsOctetString_len =
++ rowreq_ctx->undo->appParamsOctetString_len;
++
++
++ return MFD_SUCCESS;
++} /* appParamsOctetString_undo */
++
++/** @} */
+diff --git a/src/snmp/dessertAppParamsTable_data_set.h b/src/snmp/dessertAppParamsTable_data_set.h
+new file mode 100644
+index 0000000..588437a
+--- /dev/null
++++ b/src/snmp/dessertAppParamsTable_data_set.h
+@@ -0,0 +1,168 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 12077 $ of $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTAPPPARAMSTABLE_DATA_SET_H
++#define DESSERTAPPPARAMSTABLE_DATA_SET_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++ /*
++ *********************************************************************
++ * SET function declarations
++ */
++
++ /*
++ *********************************************************************
++ * SET Table declarations
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertAppParamsTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++ /*
++ * DESSERT-MIB::dessertAppParamsTable is subid 11 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11, length: 13
++ */
++
++
++ int
++ dessertAppParamsTable_undo_setup(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++ int
++ dessertAppParamsTable_undo_cleanup(dessertAppParamsTable_rowreq_ctx
++ * rowreq_ctx);
++ int
++ dessertAppParamsTable_undo(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++ int
++ dessertAppParamsTable_commit(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++ int
++ dessertAppParamsTable_undo_commit(dessertAppParamsTable_rowreq_ctx
++ * rowreq_ctx);
++
++
++ int
++ appParamsName_check_value(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx, char *appParamsName_val_ptr,
++ size_t appParamsName_val_ptr_len);
++ int
++ appParamsName_undo_setup(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++ int appParamsName_set(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx,
++ char *appParamsName_val_ptr,
++ size_t appParamsName_val_ptr_len);
++ int appParamsName_undo(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++
++ int
++ appParamsDesc_check_value(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx, char *appParamsDesc_val_ptr,
++ size_t appParamsDesc_val_ptr_len);
++ int
++ appParamsDesc_undo_setup(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++ int appParamsDesc_set(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx,
++ char *appParamsDesc_val_ptr,
++ size_t appParamsDesc_val_ptr_len);
++ int appParamsDesc_undo(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++
++ int
++ appParamsValueType_check_value(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx,
++ u_long appParamsValueType_val);
++ int
++ appParamsValueType_undo_setup(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++ int appParamsValueType_set(dessertAppParamsTable_rowreq_ctx
++ * rowreq_ctx,
++ u_long appParamsValueType_val);
++ int
++ appParamsValueType_undo(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++
++ int
++ appParamsTruthValue_check_value(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx,
++ u_long appParamsTruthValue_val);
++ int
++ appParamsTruthValue_undo_setup(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++ int
++ appParamsTruthValue_set(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx,
++ u_long appParamsTruthValue_val);
++ int
++ appParamsTruthValue_undo(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++
++ int
++ appParamsInteger32_check_value(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx,
++ long appParamsInteger32_val);
++ int
++ appParamsInteger32_undo_setup(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++ int appParamsInteger32_set(dessertAppParamsTable_rowreq_ctx
++ * rowreq_ctx,
++ long appParamsInteger32_val);
++ int
++ appParamsInteger32_undo(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++
++ int
++ appParamsUnsigned32_check_value(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx,
++ u_long appParamsUnsigned32_val);
++ int
++ appParamsUnsigned32_undo_setup(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++ int
++ appParamsUnsigned32_set(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx,
++ u_long appParamsUnsigned32_val);
++ int
++ appParamsUnsigned32_undo(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++
++ int
++ appParamsOctetString_check_value(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx,
++ char
++ *appParamsOctetString_val_ptr,
++ size_t
++ appParamsOctetString_val_ptr_len);
++ int
++ appParamsOctetString_undo_setup(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++ int
++ appParamsOctetString_set(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx,
++ char *appParamsOctetString_val_ptr,
++ size_t appParamsOctetString_val_ptr_len);
++ int
++ appParamsOctetString_undo(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx);
++
++
++ int
++ dessertAppParamsTable_check_dependencies
++ (dessertAppParamsTable_rowreq_ctx * ctx);
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTAPPPARAMSTABLE_DATA_SET_H */
+diff --git a/src/snmp/dessertAppParamsTable_enums.h b/src/snmp/dessertAppParamsTable_enums.h
+new file mode 100644
+index 0000000..8465c05
+--- /dev/null
++++ b/src/snmp/dessertAppParamsTable_enums.h
+@@ -0,0 +1,93 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * : generic-table-enums.m2c 12526 2005-07-15 22:41:16Z rstory $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTAPPPARAMSTABLE_ENUMS_H
++#define DESSERTAPPPARAMSTABLE_ENUMS_H
++
++#include <dessert/dessert.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++ /*
++ * NOTES on enums
++ * ==============
++ *
++ * Value Mapping
++ * -------------
++ * If the values for your data type don't exactly match the
++ * possible values defined by the mib, you should map them
++ * below. For example, a boolean flag (1/0) is usually represented
++ * as a TruthValue in a MIB, which maps to the values (1/2).
++ *
++ */
++/*************************************************************************
++ *************************************************************************
++ *
++ * enum definitions for table dessertAppParamsTable
++ *
++ *************************************************************************
++ *************************************************************************/
++
++/*************************************************************
++ * constants for enums for the MIB node
++ * appParamsValueType (DessertAppValueType / ASN_INTEGER)
++ *
++ * since a Textual Convention may be referenced more than once in a
++ * MIB, protect againt redefinitions of the enum values.
++ */
++#ifndef DESSERTAPPVALUETYPE_ENUMS
++#define DESSERTAPPVALUETYPE_ENUMS
++
++#define DESSERTAPPVALUETYPE_BOOL 0
++#define DESSERTAPPVALUETYPE_INT32 1
++#define DESSERTAPPVALUETYPE_UINT32 2
++#define DESSERTAPPVALUETYPE_COUNTER64 3
++#define DESSERTAPPVALUETYPE_OCTETSTRING 4
++
++#endif /* DESSERTAPPVALUETYPE_ENUMS */
++
++ /*
++ * TODO:140:o: Define your interal representation of appParamsValueType enums.
++ * (used for value mapping; see notes at top of file)
++ */
++#define INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_BOOL DESSERT_APPPARAMS_VALUETYPE_BOOL
++#define INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_INT32 DESSERT_APPPARAMS_VALUETYPE_INT32
++#define INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_UINT32 DESSERT_APPPARAMS_VALUETYPE_UINT32
++#define INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_COUNTER64 DESSERT_APPPARAMS_VALUETYPE_COUNTER64
++#define INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSVALUETYPE_OCTETSTRING DESSERT_APPPARAMS_VALUETYPE_OCTETSTRING
++
++
++/*************************************************************
++ * constants for enums for the MIB node
++ * appParamsTruthValue (TruthValue / ASN_INTEGER)
++ *
++ * since a Textual Convention may be referenced more than once in a
++ * MIB, protect againt redefinitions of the enum values.
++ */
++#ifndef TRUTHVALUE_ENUMS
++#define TRUTHVALUE_ENUMS
++
++#define TRUTHVALUE_TRUE 1
++#define TRUTHVALUE_FALSE 2
++
++#endif /* TRUTHVALUE_ENUMS */
++
++ /*
++ * TODO:140:o: Define your interal representation of appParamsTruthValue enums.
++ * (used for value mapping; see notes at top of file)
++ */
++#define INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSTRUTHVALUE_TRUE DESSERT_APPPARAMS_BOOL_TRUE
++#define INTERNAL_DESSERTAPPPARAMSTABLE_APPPARAMSTRUTHVALUE_FALSE DESSERT_APPPARAMS_BOOL_FALSE
++
++
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTAPPPARAMSTABLE_ENUMS_H */
+diff --git a/src/snmp/dessertAppParamsTable_interface.c b/src/snmp/dessertAppParamsTable_interface.c
+new file mode 100644
+index 0000000..4fc55e5
+--- /dev/null
++++ b/src/snmp/dessertAppParamsTable_interface.c
+@@ -0,0 +1,1843 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 15899 $ of $
++ *
++ * $Id:$
++ */
++/*
++ * *********************************************************************
++ * *********************************************************************
++ * *********************************************************************
++ * *** ***
++ * *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
++ * *** ***
++ * *** ***
++ * *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
++ * *** ***
++ * *** ***
++ * *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
++ * *** ***
++ * *** ***
++ * *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
++ * *** ***
++ * *** ***
++ * *********************************************************************
++ * *********************************************************************
++ * *********************************************************************
++ */
++
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertAppParamsTable.h"
++
++
++#include <net-snmp/agent/table_container.h>
++#include <net-snmp/library/container.h>
++
++#include "dessertAppParamsTable_interface.h"
++
++#include <ctype.h>
++
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertAppParamsTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++/*
++ * DESSERT-MIB::dessertAppParamsTable is subid 11 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.10.1.1.11, length: 13
++ */
++typedef struct dessertAppParamsTable_interface_ctx_s {
++
++ netsnmp_container *container;
++ netsnmp_cache *cache;
++
++ dessertAppParamsTable_registration *user_ctx;
++
++ netsnmp_table_registration_info tbl_info;
++
++ netsnmp_baby_steps_access_methods access_multiplexer;
++
++ u_int table_dirty;
++
++} dessertAppParamsTable_interface_ctx;
++
++static dessertAppParamsTable_interface_ctx dessertAppParamsTable_if_ctx;
++
++static void
++_dessertAppParamsTable_container_init(dessertAppParamsTable_interface_ctx *
++ if_ctx);
++static void
++_dessertAppParamsTable_container_shutdown
++(dessertAppParamsTable_interface_ctx * if_ctx);
++
++
++netsnmp_container *
++dessertAppParamsTable_container_get(void)
++{
++ return dessertAppParamsTable_if_ctx.container;
++}
++
++dessertAppParamsTable_registration *
++dessertAppParamsTable_registration_get(void)
++{
++ return dessertAppParamsTable_if_ctx.user_ctx;
++}
++
++dessertAppParamsTable_registration *
++dessertAppParamsTable_registration_set(dessertAppParamsTable_registration *
++ newreg)
++{
++ dessertAppParamsTable_registration *old =
++ dessertAppParamsTable_if_ctx.user_ctx;
++ dessertAppParamsTable_if_ctx.user_ctx = newreg;
++ return old;
++}
++
++int
++dessertAppParamsTable_container_size(void)
++{
++ return CONTAINER_SIZE(dessertAppParamsTable_if_ctx.container);
++}
++
++u_int
++dessertAppParamsTable_dirty_get(void)
++{
++ return dessertAppParamsTable_if_ctx.table_dirty;
++}
++
++void
++dessertAppParamsTable_dirty_set(u_int status)
++{
++ DEBUGMSGTL(("dessertAppParamsTable:dessertAppParamsTable_dirty_set",
++ "called. was %d, now %d\n",
++ dessertAppParamsTable_if_ctx.table_dirty, status));
++ dessertAppParamsTable_if_ctx.table_dirty = status;
++}
++
++/*
++ * mfd multiplexer modes
++ */
++static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_pre_request;
++static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_post_request;
++static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_object_lookup;
++static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_get_values;
++static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_check_objects;
++static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_undo_setup;
++static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_set_values;
++static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_undo_cleanup;
++static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_undo_values;
++static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_commit;
++static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_undo_commit;
++static Netsnmp_Node_Handler _mfd_dessertAppParamsTable_irreversible_commit;
++
++NETSNMP_STATIC_INLINE int
++_dessertAppParamsTable_undo_column(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx, netsnmp_variable_list * var,
++ int column);
++
++dessertAppParamsTable_data *dessertAppParamsTable_allocate_data(void);
++
++/**
++ * @internal
++ * Initialize the table dessertAppParamsTable
++ * (Define its contents and how it's structured)
++ */
++void
++_dessertAppParamsTable_initialize_interface
++ (dessertAppParamsTable_registration * reg_ptr, u_long flags)
++{
++ netsnmp_baby_steps_access_methods *access_multiplexer =
++ &dessertAppParamsTable_if_ctx.access_multiplexer;
++ netsnmp_table_registration_info *tbl_info =
++ &dessertAppParamsTable_if_ctx.tbl_info;
++ netsnmp_handler_registration *reginfo;
++ netsnmp_mib_handler *handler;
++ int mfd_modes = 0;
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_dessertAppParamsTable_initialize_interface", "called\n"));
++
++
++ /*************************************************
++ *
++ * save interface context for dessertAppParamsTable
++ */
++ /*
++ * Setting up the table's definition
++ */
++ netsnmp_table_helper_add_indexes(tbl_info, ASN_INTEGER,
++ /** index: appParamsIndex */
++ 0);
++
++ /*
++ * Define the minimum and maximum accessible columns. This
++ * optimizes retrival.
++ */
++ tbl_info->min_column = DESSERTAPPPARAMSTABLE_MIN_COL;
++ tbl_info->max_column = DESSERTAPPPARAMSTABLE_MAX_COL;
++
++ /*
++ * save users context
++ */
++ dessertAppParamsTable_if_ctx.user_ctx = reg_ptr;
++
++ /*
++ * call data access initialization code
++ */
++ dessertAppParamsTable_init_data(reg_ptr);
++
++ /*
++ * set up the container
++ */
++ _dessertAppParamsTable_container_init(&dessertAppParamsTable_if_ctx);
++ if (NULL == dessertAppParamsTable_if_ctx.container) {
++ snmp_log(LOG_ERR,
++ "could not initialize container for dessertAppParamsTable\n");
++ return;
++ }
++
++ /*
++ * access_multiplexer: REQUIRED wrapper for get request handling
++ */
++ access_multiplexer->object_lookup =
++ _mfd_dessertAppParamsTable_object_lookup;
++ access_multiplexer->get_values = _mfd_dessertAppParamsTable_get_values;
++
++ /*
++ * no wrappers yet
++ */
++ access_multiplexer->pre_request =
++ _mfd_dessertAppParamsTable_pre_request;
++ access_multiplexer->post_request =
++ _mfd_dessertAppParamsTable_post_request;
++
++
++ /*
++ * REQUIRED wrappers for set request handling
++ */
++ access_multiplexer->object_syntax_checks =
++ _mfd_dessertAppParamsTable_check_objects;
++ access_multiplexer->undo_setup = _mfd_dessertAppParamsTable_undo_setup;
++ access_multiplexer->undo_cleanup =
++ _mfd_dessertAppParamsTable_undo_cleanup;
++ access_multiplexer->set_values = _mfd_dessertAppParamsTable_set_values;
++ access_multiplexer->undo_sets = _mfd_dessertAppParamsTable_undo_values;
++
++ /*
++ * no wrappers yet
++ */
++ access_multiplexer->commit = _mfd_dessertAppParamsTable_commit;
++ access_multiplexer->undo_commit =
++ _mfd_dessertAppParamsTable_undo_commit;
++ access_multiplexer->irreversible_commit =
++ _mfd_dessertAppParamsTable_irreversible_commit;
++
++ /*************************************************
++ *
++ * Create a registration, save our reg data, register table.
++ */
++ DEBUGMSGTL(("dessertAppParamsTable:init_dessertAppParamsTable",
++ "Registering dessertAppParamsTable as a mibs-for-dummies table.\n"));
++ handler =
++ netsnmp_baby_steps_access_multiplexer_get(access_multiplexer);
++ reginfo =
++ netsnmp_handler_registration_create("dessertAppParamsTable",
++ handler,
++ dessertAppParamsTable_oid,
++ dessertAppParamsTable_oid_size,
++ HANDLER_CAN_BABY_STEP |
++ HANDLER_CAN_RWRITE);
++ if (NULL == reginfo) {
++ snmp_log(LOG_ERR,
++ "error registering table dessertAppParamsTable\n");
++ return;
++ }
++ reginfo->my_reg_void = &dessertAppParamsTable_if_ctx;
++
++ /*************************************************
++ *
++ * set up baby steps handler, create it and inject it
++ */
++ if (access_multiplexer->object_lookup)
++ mfd_modes |= BABY_STEP_OBJECT_LOOKUP;
++ if (access_multiplexer->set_values)
++ mfd_modes |= BABY_STEP_SET_VALUES;
++ if (access_multiplexer->irreversible_commit)
++ mfd_modes |= BABY_STEP_IRREVERSIBLE_COMMIT;
++ if (access_multiplexer->object_syntax_checks)
++ mfd_modes |= BABY_STEP_CHECK_OBJECT;
++
++ if (access_multiplexer->pre_request)
++ mfd_modes |= BABY_STEP_PRE_REQUEST;
++ if (access_multiplexer->post_request)
++ mfd_modes |= BABY_STEP_POST_REQUEST;
++
++ if (access_multiplexer->undo_setup)
++ mfd_modes |= BABY_STEP_UNDO_SETUP;
++ if (access_multiplexer->undo_cleanup)
++ mfd_modes |= BABY_STEP_UNDO_CLEANUP;
++ if (access_multiplexer->undo_sets)
++ mfd_modes |= BABY_STEP_UNDO_SETS;
++
++ if (access_multiplexer->row_creation)
++ mfd_modes |= BABY_STEP_ROW_CREATE;
++ if (access_multiplexer->consistency_checks)
++ mfd_modes |= BABY_STEP_CHECK_CONSISTENCY;
++ if (access_multiplexer->commit)
++ mfd_modes |= BABY_STEP_COMMIT;
++ if (access_multiplexer->undo_commit)
++ mfd_modes |= BABY_STEP_UNDO_COMMIT;
++
++ handler = netsnmp_baby_steps_handler_get(mfd_modes);
++ netsnmp_inject_handler(reginfo, handler);
++
++ /*************************************************
++ *
++ * inject row_merge helper with prefix rootoid_len + 2 (entry.col)
++ */
++ handler = netsnmp_get_row_merge_handler(reginfo->rootoid_len + 2);
++ netsnmp_inject_handler(reginfo, handler);
++
++ /*************************************************
++ *
++ * inject container_table helper
++ */
++ handler =
++ netsnmp_container_table_handler_get(tbl_info,
++ dessertAppParamsTable_if_ctx.
++ container,
++ TABLE_CONTAINER_KEY_NETSNMP_INDEX);
++ netsnmp_inject_handler(reginfo, handler);
++
++ /*************************************************
++ *
++ * inject cache helper
++ */
++ if (NULL != dessertAppParamsTable_if_ctx.cache) {
++ handler =
++ netsnmp_cache_handler_get(dessertAppParamsTable_if_ctx.cache);
++ netsnmp_inject_handler(reginfo, handler);
++ }
++
++ /*
++ * register table
++ */
++ netsnmp_register_table(reginfo, tbl_info);
++
++} /* _dessertAppParamsTable_initialize_interface */
++
++/**
++ * @internal
++ * Shutdown the table dessertAppParamsTable
++ */
++void
++_dessertAppParamsTable_shutdown_interface
++ (dessertAppParamsTable_registration * reg_ptr)
++{
++ /*
++ * shutdown the container
++ */
++ _dessertAppParamsTable_container_shutdown
++ (&dessertAppParamsTable_if_ctx);
++}
++
++void
++dessertAppParamsTable_valid_columns_set(netsnmp_column_info *vc)
++{
++ dessertAppParamsTable_if_ctx.tbl_info.valid_columns = vc;
++} /* dessertAppParamsTable_valid_columns_set */
++
++/**
++ * @internal
++ * convert the index component stored in the context to an oid
++ */
++int
++dessertAppParamsTable_index_to_oid(netsnmp_index * oid_idx,
++ dessertAppParamsTable_mib_index *
++ mib_idx)
++{
++ int err = SNMP_ERR_NOERROR;
++
++ /*
++ * temp storage for parsing indexes
++ */
++ /*
++ * appParamsIndex(1)/DessertAppParamsIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
++ */
++ netsnmp_variable_list var_appParamsIndex;
++
++ /*
++ * set up varbinds
++ */
++ memset(&var_appParamsIndex, 0x00, sizeof(var_appParamsIndex));
++ var_appParamsIndex.type = ASN_INTEGER;
++
++ /*
++ * chain temp index varbinds together
++ */
++ var_appParamsIndex.next_variable = NULL;
++
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_index_to_oid", "called\n"));
++
++ /*
++ * appParamsIndex(1)/DessertAppParamsIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
++ */
++ snmp_set_var_value(&var_appParamsIndex,
++ (u_char *) & mib_idx->appParamsIndex,
++ sizeof(mib_idx->appParamsIndex));
++
++
++ err = build_oid_noalloc(oid_idx->oids, oid_idx->len, &oid_idx->len,
++ NULL, 0, &var_appParamsIndex);
++ if (err)
++ snmp_log(LOG_ERR, "error %d converting index to oid\n", err);
++
++ /*
++ * parsing may have allocated memory. free it.
++ */
++ snmp_reset_var_buffers(&var_appParamsIndex);
++
++ return err;
++} /* dessertAppParamsTable_index_to_oid */
++
++/**
++ * extract dessertAppParamsTable indexes from a netsnmp_index
++ *
++ * @retval SNMP_ERR_NOERROR : no error
++ * @retval SNMP_ERR_GENERR : error
++ */
++int
++dessertAppParamsTable_index_from_oid(netsnmp_index * oid_idx,
++ dessertAppParamsTable_mib_index *
++ mib_idx)
++{
++ int err = SNMP_ERR_NOERROR;
++
++ /*
++ * temp storage for parsing indexes
++ */
++ /*
++ * appParamsIndex(1)/DessertAppParamsIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
++ */
++ netsnmp_variable_list var_appParamsIndex;
++
++ /*
++ * set up varbinds
++ */
++ memset(&var_appParamsIndex, 0x00, sizeof(var_appParamsIndex));
++ var_appParamsIndex.type = ASN_INTEGER;
++
++ /*
++ * chain temp index varbinds together
++ */
++ var_appParamsIndex.next_variable = NULL;
++
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_index_from_oid", "called\n"));
++
++ /*
++ * parse the oid into the individual index components
++ */
++ err = parse_oid_indexes(oid_idx->oids, oid_idx->len,
++ &var_appParamsIndex);
++ if (err == SNMP_ERR_NOERROR) {
++ /*
++ * copy out values
++ */
++ mib_idx->appParamsIndex =
++ *((long *) var_appParamsIndex.val.string);
++
++
++ }
++
++ /*
++ * parsing may have allocated memory. free it.
++ */
++ snmp_reset_var_buffers(&var_appParamsIndex);
++
++ return err;
++} /* dessertAppParamsTable_index_from_oid */
++
++
++/*
++ * dessertAppParamsTable_allocate_data
++ *
++ * Purpose: create new dessertAppParamsTable_data.
++ */
++dessertAppParamsTable_data *
++dessertAppParamsTable_allocate_data(void)
++{
++ dessertAppParamsTable_data *rtn =
++ SNMP_MALLOC_TYPEDEF(dessertAppParamsTable_data);
++
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_allocate_data", "called\n"));
++
++ if (NULL == rtn) {
++ snmp_log(LOG_ERR, "unable to malloc memory for new "
++ "dessertAppParamsTable_data.\n");
++ }
++
++ return rtn;
++} /* dessertAppParamsTable_allocate_data */
++
++/*
++ * dessertAppParamsTable_release_data
++ *
++ * Purpose: release dessertAppParamsTable data.
++ */
++void
++dessertAppParamsTable_release_data(dessertAppParamsTable_data * data)
++{
++ DEBUGMSGTL(("verbose:dessertAppParamsTable:dessertAppParamsTable_release_data", "called\n"));
++
++ free(data);
++} /* dessertAppParamsTable_release_data */
++
++/*
++ *********************************************************************
++ * @internal
++ * allocate resources for a dessertAppParamsTable_rowreq_ctx
++ */
++dessertAppParamsTable_rowreq_ctx *
++dessertAppParamsTable_allocate_rowreq_ctx(void)
++{
++ dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
++ SNMP_MALLOC_TYPEDEF(dessertAppParamsTable_rowreq_ctx);
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:dessertAppParamsTable_allocate_rowreq_ctx", "called\n"));
++
++ if (NULL == rowreq_ctx) {
++ snmp_log(LOG_ERR, "Couldn't allocate memory for a "
++ "dessertAppParamsTable_rowreq_ctx.\n");
++ return NULL;
++ }
++
++ rowreq_ctx->oid_idx.oids = rowreq_ctx->oid_tmp;
++
++ rowreq_ctx->dessertAppParamsTable_data_list = NULL;
++
++
++ return rowreq_ctx;
++} /* dessertAppParamsTable_allocate_rowreq_ctx */
++
++/*
++ * @internal
++ * release resources for a dessertAppParamsTable_rowreq_ctx
++ */
++void
++dessertAppParamsTable_release_rowreq_ctx(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx)
++{
++ DEBUGMSGTL(("internal:dessertAppParamsTable:dessertAppParamsTable_release_rowreq_ctx", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++
++ if (rowreq_ctx->undo)
++ dessertAppParamsTable_release_data(rowreq_ctx->undo);
++
++ /*
++ * free index oid pointer
++ */
++ if (rowreq_ctx->oid_idx.oids != rowreq_ctx->oid_tmp)
++ free(rowreq_ctx->oid_idx.oids);
++
++ SNMP_FREE(rowreq_ctx);
++} /* dessertAppParamsTable_release_rowreq_ctx */
++
++/**
++ * @internal
++ * wrapper
++ */
++static int
++_mfd_dessertAppParamsTable_pre_request(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration
++ *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ int rc;
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_pre_request", "called\n"));
++
++ if (1 != netsnmp_row_merge_status_first(reginfo, agtreq_info)) {
++ DEBUGMSGTL(("internal:dessertAppParamsTable",
++ "skipping additional pre_request\n"));
++ return SNMP_ERR_NOERROR;
++ }
++
++ rc = dessertAppParamsTable_pre_request(dessertAppParamsTable_if_ctx.
++ user_ctx);
++ if (MFD_SUCCESS != rc) {
++ /*
++ * nothing we can do about it but log it
++ */
++ DEBUGMSGTL(("dessertAppParamsTable", "error %d from "
++ "dessertAppParamsTable_pre_request\n", rc));
++ netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
++ }
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertAppParamsTable_pre_request */
++
++/**
++ * @internal
++ * wrapper
++ */
++static int
++_mfd_dessertAppParamsTable_post_request(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration
++ *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++ int rc, packet_rc;
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_post_request", "called\n"));
++
++ /*
++ * release row context, if deleted
++ */
++ if (rowreq_ctx && (rowreq_ctx->rowreq_flags & MFD_ROW_DELETED))
++ dessertAppParamsTable_release_rowreq_ctx(rowreq_ctx);
++
++ /*
++ * wait for last call before calling user
++ */
++ if (1 != netsnmp_row_merge_status_last(reginfo, agtreq_info)) {
++ DEBUGMSGTL(("internal:dessertAppParamsTable",
++ "waiting for last post_request\n"));
++ return SNMP_ERR_NOERROR;
++ }
++
++ packet_rc = netsnmp_check_all_requests_error(agtreq_info->asp, 0);
++ if ((MFD_SUCCESS != packet_rc) && dessertAppParamsTable_dirty_get()) {
++ /*
++ * we shouldn't get here. the undo steps should also clear
++ * the dirty flags.
++ */
++ snmp_log(LOG_WARNING,
++ "dessertAppParamsTable dirty flag set in post_request "
++ "but status != SUCCESS.\n");
++ }
++
++ rc = dessertAppParamsTable_post_request(dessertAppParamsTable_if_ctx.
++ user_ctx, packet_rc);
++ if (MFD_SUCCESS != rc) {
++ /*
++ * nothing we can do about it but log it
++ */
++ DEBUGMSGTL(("dessertAppParamsTable", "error %d from "
++ "dessertAppParamsTable_post_request\n", rc));
++ }
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertAppParamsTable_post_request */
++
++/**
++ * @internal
++ * wrapper
++ */
++static int
++_mfd_dessertAppParamsTable_object_lookup(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration
++ *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ int rc = SNMP_ERR_NOERROR;
++ dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_object_lookup", "called\n"));
++
++ /*
++ * get our context from mfd
++ * dessertAppParamsTable_interface_ctx *if_ctx =
++ * (dessertAppParamsTable_interface_ctx *)reginfo->my_reg_void;
++ */
++
++ if (NULL == rowreq_ctx) {
++ rc = SNMP_ERR_NOCREATION;
++ }
++
++ if (MFD_SUCCESS != rc)
++ netsnmp_request_set_error_all(requests, rc);
++ else
++ dessertAppParamsTable_row_prep(rowreq_ctx);
++
++ return SNMP_VALIDATE_ERR(rc);
++} /* _mfd_dessertAppParamsTable_object_lookup */
++
++/***********************************************************************
++ *
++ * GET processing
++ *
++ ***********************************************************************/
++/*
++ * @internal
++ * Retrieve the value for a particular column
++ */
++NETSNMP_STATIC_INLINE int
++_dessertAppParamsTable_get_column(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx, netsnmp_variable_list * var,
++ int column)
++{
++ int rc = SNMPERR_SUCCESS;
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "called for %d\n", column));
++
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ switch (column) {
++
++ /*
++ * appParamsName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ case COLUMN_APPPARAMSNAME:
++ if (!(COLUMN_APPPARAMSNAME_FLAG & rowreq_ctx->column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "column %d (appParamsName) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->type = ASN_OCTET_STR;
++ rc = appParamsName_get(rowreq_ctx, (char **) &var->val.string,
++ &var->val_len);
++ break;
++
++ /*
++ * appParamsDesc(3)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ case COLUMN_APPPARAMSDESC:
++ if (!(COLUMN_APPPARAMSDESC_FLAG & rowreq_ctx->column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "column %d (appParamsDesc) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->type = ASN_OCTET_STR;
++ rc = appParamsDesc_get(rowreq_ctx, (char **) &var->val.string,
++ &var->val_len);
++ break;
++
++ /*
++ * appParamsValueType(4)/DessertAppValueType/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
++ */
++ case COLUMN_APPPARAMSVALUETYPE:
++ if (!
++ (COLUMN_APPPARAMSVALUETYPE_FLAG & rowreq_ctx->
++ column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "column %d (appParamsValueType) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->val_len = sizeof(u_long);
++ var->type = ASN_INTEGER;
++ rc = appParamsValueType_get(rowreq_ctx,
++ (u_long *) var->val.string);
++ break;
++
++ /*
++ * appParamsTruthValue(5)/TruthValue/ASN_INTEGER/long(u_long)//l/A/W/E/r/d/h
++ */
++ case COLUMN_APPPARAMSTRUTHVALUE:
++ if (!
++ (COLUMN_APPPARAMSTRUTHVALUE_FLAG & rowreq_ctx->
++ column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "column %d (appParamsTruthValue) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->val_len = sizeof(u_long);
++ var->type = ASN_INTEGER;
++ rc = appParamsTruthValue_get(rowreq_ctx,
++ (u_long *) var->val.string);
++ break;
++
++ /*
++ * appParamsInteger32(6)/INTEGER32/ASN_INTEGER/long(long)//l/A/W/e/r/d/h
++ */
++ case COLUMN_APPPARAMSINTEGER32:
++ if (!
++ (COLUMN_APPPARAMSINTEGER32_FLAG & rowreq_ctx->
++ column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "column %d (appParamsInteger32) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->val_len = sizeof(long);
++ var->type = ASN_INTEGER;
++ rc = appParamsInteger32_get(rowreq_ctx, (long *) var->val.string);
++ break;
++
++ /*
++ * appParamsUnsigned32(7)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/W/e/r/d/h
++ */
++ case COLUMN_APPPARAMSUNSIGNED32:
++ if (!
++ (COLUMN_APPPARAMSUNSIGNED32_FLAG & rowreq_ctx->
++ column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "column %d (appParamsUnsigned32) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->val_len = sizeof(u_long);
++ var->type = ASN_UNSIGNED;
++ rc = appParamsUnsigned32_get(rowreq_ctx,
++ (u_long *) var->val.string);
++ break;
++
++ /*
++ * appParamsOctetString(9)/DessertApplicationOctetString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H
++ */
++ case COLUMN_APPPARAMSOCTETSTRING:
++ if (!
++ (COLUMN_APPPARAMSOCTETSTRING_FLAG & rowreq_ctx->
++ column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "column %d (appParamsOctetString) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->type = ASN_OCTET_STR;
++ rc = appParamsOctetString_get(rowreq_ctx,
++ (char **) &var->val.string,
++ &var->val_len);
++ break;
++
++ default:
++ if (DESSERTAPPPARAMSTABLE_MIN_COL <= column
++ && column <= DESSERTAPPPARAMSTABLE_MAX_COL) {
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_column", "assume column %d is reserved\n", column));
++ rc = MFD_SKIP;
++ } else {
++ snmp_log(LOG_ERR,
++ "unknown column %d in _dessertAppParamsTable_get_column\n",
++ column);
++ }
++ break;
++ }
++
++ return rc;
++} /* _dessertAppParamsTable_get_column */
++
++int
++_mfd_dessertAppParamsTable_get_values(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration
++ *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++ netsnmp_table_request_info *tri;
++ u_char *old_string;
++ void (*dataFreeHook) (void *);
++ int rc;
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_values", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ DEBUGMSGTL(("9:dessertAppParamsTable:_mfd_dessertAppParamsTable_get_values", "exists %p\n", rowreq_ctx->column_exists_flags));
++
++ for (; requests; requests = requests->next) {
++ /*
++ * save old pointer, so we can free it if replaced
++ */
++ old_string = requests->requestvb->val.string;
++ dataFreeHook = requests->requestvb->dataFreeHook;
++ if (NULL == requests->requestvb->val.string) {
++ requests->requestvb->val.string = requests->requestvb->buf;
++ requests->requestvb->val_len =
++ sizeof(requests->requestvb->buf);
++ } else if (requests->requestvb->buf ==
++ requests->requestvb->val.string) {
++ if (requests->requestvb->val_len !=
++ sizeof(requests->requestvb->buf))
++ requests->requestvb->val_len =
++ sizeof(requests->requestvb->buf);
++ }
++
++ /*
++ * get column data
++ */
++ tri = netsnmp_extract_table_info(requests);
++ if (NULL == tri)
++ continue;
++
++ rc = _dessertAppParamsTable_get_column(rowreq_ctx,
++ requests->requestvb,
++ tri->colnum);
++ if (rc) {
++ if (MFD_SKIP == rc) {
++ requests->requestvb->type = SNMP_NOSUCHINSTANCE;
++ rc = SNMP_ERR_NOERROR;
++ }
++ } else if (NULL == requests->requestvb->val.string) {
++ snmp_log(LOG_ERR, "NULL varbind data pointer!\n");
++ rc = SNMP_ERR_GENERR;
++ }
++ if (rc)
++ netsnmp_request_set_error(requests, SNMP_VALIDATE_ERR(rc));
++
++ /*
++ * if the buffer wasn't used previously for the old data (i.e. it
++ * was allcoated memory) and the get routine replaced the pointer,
++ * we need to free the previous pointer.
++ */
++ if (old_string && (old_string != requests->requestvb->buf) &&
++ (requests->requestvb->val.string != old_string)) {
++ if (dataFreeHook)
++ (*dataFreeHook) (old_string);
++ else
++ free(old_string);
++ }
++ } /* for results */
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertAppParamsTable_get_values */
++
++
++/***********************************************************************
++ *
++ * SET processing
++ *
++ ***********************************************************************/
++
++/*----------------------------------------------------------------------
++ *
++ * SET: Syntax checks
++ *
++ *---------------------------------------------------------------------*/
++/*
++ * @internal
++ * Check the syntax for a particular column
++ */
++NETSNMP_STATIC_INLINE int
++_dessertAppParamsTable_check_column(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx,
++ netsnmp_variable_list * var,
++ int column)
++{
++ int rc = SNMPERR_SUCCESS;
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_dessertAppParamsTable_check_column", "called for %d\n", column));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ switch (column) {
++ /*
++ * (INDEX) appParamsIndex(1)/DessertAppParamsIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
++ */
++ case COLUMN_APPPARAMSINDEX:
++ rc = SNMP_ERR_NOTWRITABLE; /* can not change index of active row */
++ break;
++
++ /*
++ * appParamsName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ case COLUMN_APPPARAMSNAME:
++ rc = SNMP_ERR_NOTWRITABLE;
++ break;
++
++ /*
++ * appParamsDesc(3)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ case COLUMN_APPPARAMSDESC:
++ rc = SNMP_ERR_NOTWRITABLE;
++ break;
++
++ /*
++ * appParamsValueType(4)/DessertAppValueType/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
++ */
++ case COLUMN_APPPARAMSVALUETYPE:
++ rc = SNMP_ERR_NOTWRITABLE;
++ break;
++
++ /*
++ * appParamsTruthValue(5)/TruthValue/ASN_INTEGER/long(u_long)//l/A/W/E/r/d/h
++ */
++ case COLUMN_APPPARAMSTRUTHVALUE:
++ rc = netsnmp_check_vb_type_and_size(var, ASN_INTEGER,
++ sizeof(rowreq_ctx->data.
++ appParamsTruthValue));
++ /*
++ * check that the value is one of defined enums
++ */
++ if ((SNMPERR_SUCCESS == rc)
++ && (*var->val.integer != TRUTHVALUE_TRUE)
++ && (*var->val.integer != TRUTHVALUE_FALSE)
++ ) {
++ rc = SNMP_ERR_WRONGVALUE;
++ }
++ if (SNMPERR_SUCCESS != rc) {
++ DEBUGMSGTL(("dessertAppParamsTable:_dessertAppParamsTable_check_column:appParamsTruthValue", "varbind validation failed (eg bad type or size)\n"));
++ } else {
++ rc = appParamsTruthValue_check_value(rowreq_ctx,
++ *((u_long *) var->val.
++ string));
++ if ((MFD_SUCCESS != rc) && (MFD_NOT_VALID_EVER != rc)
++ && (MFD_NOT_VALID_NOW != rc)) {
++ snmp_log(LOG_ERR,
++ "bad rc %d from appParamsTruthValue_check_value\n",
++ rc);
++ rc = SNMP_ERR_GENERR;
++ }
++ }
++ break;
++
++ /*
++ * appParamsInteger32(6)/INTEGER32/ASN_INTEGER/long(long)//l/A/W/e/r/d/h
++ */
++ case COLUMN_APPPARAMSINTEGER32:
++ rc = netsnmp_check_vb_type_and_size(var, ASN_INTEGER,
++ sizeof(rowreq_ctx->data.
++ appParamsInteger32));
++ if (SNMPERR_SUCCESS != rc) {
++ DEBUGMSGTL(("dessertAppParamsTable:_dessertAppParamsTable_check_column:appParamsInteger32", "varbind validation failed (eg bad type or size)\n"));
++ } else {
++ rc = appParamsInteger32_check_value(rowreq_ctx,
++ *((long *) var->val.
++ string));
++ if ((MFD_SUCCESS != rc) && (MFD_NOT_VALID_EVER != rc)
++ && (MFD_NOT_VALID_NOW != rc)) {
++ snmp_log(LOG_ERR,
++ "bad rc %d from appParamsInteger32_check_value\n",
++ rc);
++ rc = SNMP_ERR_GENERR;
++ }
++ }
++ break;
++
++ /*
++ * appParamsUnsigned32(7)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/W/e/r/d/h
++ */
++ case COLUMN_APPPARAMSUNSIGNED32:
++ rc = netsnmp_check_vb_type_and_size(var, ASN_UNSIGNED,
++ sizeof(rowreq_ctx->data.
++ appParamsUnsigned32));
++ if (SNMPERR_SUCCESS != rc) {
++ DEBUGMSGTL(("dessertAppParamsTable:_dessertAppParamsTable_check_column:appParamsUnsigned32", "varbind validation failed (eg bad type or size)\n"));
++ } else {
++ rc = appParamsUnsigned32_check_value(rowreq_ctx,
++ *((u_long *) var->val.
++ string));
++ if ((MFD_SUCCESS != rc) && (MFD_NOT_VALID_EVER != rc)
++ && (MFD_NOT_VALID_NOW != rc)) {
++ snmp_log(LOG_ERR,
++ "bad rc %d from appParamsUnsigned32_check_value\n",
++ rc);
++ rc = SNMP_ERR_GENERR;
++ }
++ }
++ break;
++
++ /*
++ * appParamsOctetString(9)/DessertApplicationOctetString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H
++ */
++ case COLUMN_APPPARAMSOCTETSTRING:
++ rc = netsnmp_check_vb_type_and_max_size(var, ASN_OCTET_STR,
++ sizeof(rowreq_ctx->data.
++ appParamsOctetString));
++ /*
++ * check defined range(s).
++ */
++ if ((SNMPERR_SUCCESS == rc)
++ && ((var->val_len < 0) || (var->val_len > 1024))
++ ) {
++ rc = SNMP_ERR_WRONGLENGTH;
++ }
++ if (SNMPERR_SUCCESS != rc) {
++ DEBUGMSGTL(("dessertAppParamsTable:_dessertAppParamsTable_check_column:appParamsOctetString", "varbind validation failed (eg bad type or size)\n"));
++ } else {
++ rc = appParamsOctetString_check_value(rowreq_ctx,
++ (char *) var->val.string,
++ var->val_len);
++ if ((MFD_SUCCESS != rc) && (MFD_NOT_VALID_EVER != rc)
++ && (MFD_NOT_VALID_NOW != rc)) {
++ snmp_log(LOG_ERR,
++ "bad rc %d from appParamsOctetString_check_value\n",
++ rc);
++ rc = SNMP_ERR_GENERR;
++ }
++ }
++ break;
++
++ default: /** We shouldn't get here */
++ rc = SNMP_ERR_GENERR;
++ snmp_log(LOG_ERR,
++ "unknown column %d in _dessertAppParamsTable_check_column\n",
++ column);
++ }
++
++ return rc;
++} /* _dessertAppParamsTable_check_column */
++
++int
++_mfd_dessertAppParamsTable_check_objects(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration
++ *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++ netsnmp_table_request_info *tri;
++ int rc;
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_check_objects", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ for (; requests; requests = requests->next) {
++
++ /*
++ * get column number from table request info, and check that column
++ */
++ tri = netsnmp_extract_table_info(requests);
++ if (NULL == tri)
++ continue;
++
++ rc = _dessertAppParamsTable_check_column(rowreq_ctx,
++ requests->requestvb,
++ tri->colnum);
++ if (rc) {
++ netsnmp_request_set_error(requests, SNMP_VALIDATE_ERR(rc));
++ break;
++ }
++
++ } /* for results */
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertAppParamsTable_check_objects */
++
++
++/*----------------------------------------------------------------------
++ *
++ * SET: Undo setup
++ *
++ *---------------------------------------------------------------------*/
++/*
++ * @internal
++ * Set the value for a particular column
++ */
++NETSNMP_STATIC_INLINE int
++_dessertAppParamsTable_undo_setup_column(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx, int column)
++{
++ int rc = SNMPERR_SUCCESS;
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_dessertAppParamsTable_undo_setup_column", "called for %d\n", column));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ switch (column) {
++
++ /*
++ * appParamsTruthValue(5)/TruthValue/ASN_INTEGER/long(u_long)//l/A/W/E/r/d/h
++ */
++ case COLUMN_APPPARAMSTRUTHVALUE:
++ rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSTRUTHVALUE_FLAG;
++ rc = appParamsTruthValue_undo_setup(rowreq_ctx);
++ break;
++
++ /*
++ * appParamsInteger32(6)/INTEGER32/ASN_INTEGER/long(long)//l/A/W/e/r/d/h
++ */
++ case COLUMN_APPPARAMSINTEGER32:
++ rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSINTEGER32_FLAG;
++ rc = appParamsInteger32_undo_setup(rowreq_ctx);
++ break;
++
++ /*
++ * appParamsUnsigned32(7)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/W/e/r/d/h
++ */
++ case COLUMN_APPPARAMSUNSIGNED32:
++ rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSUNSIGNED32_FLAG;
++ rc = appParamsUnsigned32_undo_setup(rowreq_ctx);
++ break;
++
++ /*
++ * appParamsOctetString(9)/DessertApplicationOctetString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H
++ */
++ case COLUMN_APPPARAMSOCTETSTRING:
++ rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSOCTETSTRING_FLAG;
++ rc = appParamsOctetString_undo_setup(rowreq_ctx);
++ break;
++
++ default:
++ snmp_log(LOG_ERR,
++ "unknown column %d in _dessertAppParamsTable_undo_setup_column\n",
++ column);
++ break;
++ }
++
++ return rc;
++} /* _dessertAppParamsTable_undo_setup_column */
++
++
++/**
++ * @internal
++ * undo setup
++ */
++int
++_mfd_dessertAppParamsTable_undo_setup(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration
++ *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ int rc;
++ dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_undo_setup", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * allocate undo context
++ */
++ rowreq_ctx->undo = dessertAppParamsTable_allocate_data();
++ if (NULL == rowreq_ctx->undo) {
++ /** msg already logged */
++ netsnmp_request_set_error_all(requests,
++ SNMP_ERR_RESOURCEUNAVAILABLE);
++ return SNMP_ERR_NOERROR;
++ }
++
++ /*
++ * row undo setup
++ */
++ rowreq_ctx->column_set_flags = 0;
++ rc = dessertAppParamsTable_undo_setup(rowreq_ctx);
++ if (MFD_SUCCESS != rc) {
++ DEBUGMSGTL(("dessertAppParamsTable:mfd", "error %d from "
++ "dessertAppParamsTable_undo_setup\n", rc));
++ netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
++ } else {
++ /*
++ * column undo setup
++ */
++ netsnmp_table_request_info *tri;
++ for (; requests; requests = requests->next) {
++ /*
++ * set column data
++ */
++ tri = netsnmp_extract_table_info(requests);
++ if (NULL == tri)
++ continue;
++
++ rc = _dessertAppParamsTable_undo_setup_column(rowreq_ctx,
++ tri->colnum);
++ if (MFD_SUCCESS != rc) {
++ DEBUGMSGTL(("dessertAppParamsTable:mfd", "error %d from "
++ "dessertAppParamsTable_undo_setup_column\n",
++ rc));
++ netsnmp_set_request_error(agtreq_info, requests,
++ SNMP_VALIDATE_ERR(rc));
++ }
++ } /* for results */
++ }
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertAppParamsTable_undo_setup */
++
++/**
++ * @internal
++ * undo setup
++ */
++int
++_mfd_dessertAppParamsTable_undo_cleanup(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration
++ *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++ int rc;
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_undo_cleanup", "called\n"));
++
++ /*
++ * failed row create in early stages has no rowreq_ctx
++ */
++ if (NULL == rowreq_ctx)
++ return MFD_SUCCESS;
++
++ /*
++ * call user cleanup
++ */
++ rc = dessertAppParamsTable_undo_cleanup(rowreq_ctx);
++ if (MFD_SUCCESS != rc) {
++ /*
++ * nothing we can do about it but log it
++ */
++ DEBUGMSGTL(("dessertAppParamsTable:mfd", "error %d from "
++ "dessertAppParamsTable_undo_cleanup\n", rc));
++ }
++
++ /*
++ * release undo context, if needed
++ */
++ if (rowreq_ctx->undo) {
++ dessertAppParamsTable_release_data(rowreq_ctx->undo);
++ rowreq_ctx->undo = NULL;
++ }
++
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertAppParamsTable_undo_cleanup */
++
++/*----------------------------------------------------------------------
++ *
++ * SET: Set values
++ *
++ *---------------------------------------------------------------------*/
++/*
++ * @internal
++ * Set the value for a particular column
++ */
++NETSNMP_STATIC_INLINE int
++_dessertAppParamsTable_set_column(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx, netsnmp_variable_list * var,
++ int column)
++{
++ int rc = SNMPERR_SUCCESS;
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_dessertAppParamsTable_set_column", "called for %d\n", column));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ switch (column) {
++
++ /*
++ * appParamsTruthValue(5)/TruthValue/ASN_INTEGER/long(u_long)//l/A/W/E/r/d/h
++ */
++ case COLUMN_APPPARAMSTRUTHVALUE:
++ rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSTRUTHVALUE_FLAG;
++ rc = appParamsTruthValue_set(rowreq_ctx,
++ *((u_long *) var->val.string));
++ break;
++
++ /*
++ * appParamsInteger32(6)/INTEGER32/ASN_INTEGER/long(long)//l/A/W/e/r/d/h
++ */
++ case COLUMN_APPPARAMSINTEGER32:
++ rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSINTEGER32_FLAG;
++ rc = appParamsInteger32_set(rowreq_ctx,
++ *((long *) var->val.string));
++ break;
++
++ /*
++ * appParamsUnsigned32(7)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/W/e/r/d/h
++ */
++ case COLUMN_APPPARAMSUNSIGNED32:
++ rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSUNSIGNED32_FLAG;
++ rc = appParamsUnsigned32_set(rowreq_ctx,
++ *((u_long *) var->val.string));
++ break;
++
++ /*
++ * appParamsOctetString(9)/DessertApplicationOctetString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H
++ */
++ case COLUMN_APPPARAMSOCTETSTRING:
++ rowreq_ctx->column_set_flags |= COLUMN_APPPARAMSOCTETSTRING_FLAG;
++ rc = appParamsOctetString_set(rowreq_ctx, (char *) var->val.string,
++ var->val_len);
++ break;
++
++ default:
++ snmp_log(LOG_ERR,
++ "unknown column %d in _dessertAppParamsTable_set_column\n",
++ column);
++ rc = SNMP_ERR_GENERR;
++ break;
++ }
++
++ return rc;
++} /* _dessertAppParamsTable_set_column */
++
++int
++_mfd_dessertAppParamsTable_set_values(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration
++ *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++ netsnmp_table_request_info *tri;
++ int rc = SNMP_ERR_NOERROR;
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_set_values", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ rowreq_ctx->column_set_flags = 0;
++ for (; requests; requests = requests->next) {
++ /*
++ * set column data
++ */
++ tri = netsnmp_extract_table_info(requests);
++ if (NULL == tri)
++ continue;
++
++ rc = _dessertAppParamsTable_set_column(rowreq_ctx,
++ requests->requestvb,
++ tri->colnum);
++ if (MFD_SUCCESS != rc) {
++ DEBUGMSGTL(("dessertAppParamsTable:mfd", "error %d from "
++ "dessertAppParamsTable_set_column\n", rc));
++ netsnmp_set_request_error(agtreq_info, requests,
++ SNMP_VALIDATE_ERR(rc));
++ }
++ } /* for results */
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertAppParamsTable_set_values */
++
++/*----------------------------------------------------------------------
++ *
++ * SET: commit
++ *
++ *---------------------------------------------------------------------*/
++/**
++ * @internal
++ * commit the values
++ */
++int
++_mfd_dessertAppParamsTable_commit(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration *reginfo,
++ netsnmp_agent_request_info *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ int rc;
++ dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_commit", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ rc = dessertAppParamsTable_commit(rowreq_ctx);
++ if (MFD_SUCCESS != rc) {
++ DEBUGMSGTL(("dessertAppParamsTable:mfd", "error %d from "
++ "dessertAppParamsTable_commit\n", rc));
++ netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
++ }
++
++ if (rowreq_ctx->rowreq_flags & MFD_ROW_DIRTY) {
++ /*
++ * if we successfully commited this row, set the dirty flag. Use the
++ * current value + 1 (i.e. dirty = # rows changed).
++ * this is checked in post_request...
++ */
++ dessertAppParamsTable_dirty_set(dessertAppParamsTable_dirty_get() + 1); /* set table dirty flag */
++ }
++
++ return SNMP_ERR_NOERROR;
++}
++
++int
++_mfd_dessertAppParamsTable_undo_commit(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration
++ *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ int rc;
++ dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_undo_commit", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ if (rowreq_ctx->rowreq_flags & MFD_ROW_DIRTY) {
++ u_int d = dessertAppParamsTable_dirty_get();
++
++ netsnmp_assert(d != 0);
++ if (d)
++ dessertAppParamsTable_dirty_set(d - 1);
++ }
++
++ rc = dessertAppParamsTable_undo_commit(rowreq_ctx);
++ if (MFD_SUCCESS != rc) {
++ /*
++ * nothing we can do about it but log it
++ */
++ DEBUGMSGTL(("dessertAppParamsTable:mfd", "error %d from "
++ "dessertAppParamsTable_undo_commit\n", rc));
++ }
++
++ if (rowreq_ctx->rowreq_flags & MFD_ROW_DIRTY) {
++ snmp_log(LOG_WARNING,
++ "dessertAppParamsTable row dirty flag still set after undo_commit\n");
++ rowreq_ctx->rowreq_flags &= ~MFD_ROW_DIRTY;
++ }
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertAppParamsTable_commit */
++
++/*----------------------------------------------------------------------
++ *
++ * SET: Undo
++ *
++ *---------------------------------------------------------------------*/
++/**
++ * @internal
++ * undo the value for a particular column
++ */
++NETSNMP_STATIC_INLINE int
++_dessertAppParamsTable_undo_column(dessertAppParamsTable_rowreq_ctx *
++ rowreq_ctx, netsnmp_variable_list * var,
++ int column)
++{
++ int rc = SNMPERR_SUCCESS;
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_dessertAppParamsTable_undo_column", "called for %d\n", column));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ switch (column) {
++
++ /*
++ * appParamsTruthValue(5)/TruthValue/ASN_INTEGER/long(u_long)//l/A/W/E/r/d/h
++ */
++ case COLUMN_APPPARAMSTRUTHVALUE:
++ rc = appParamsTruthValue_undo(rowreq_ctx);
++ break;
++
++ /*
++ * appParamsInteger32(6)/INTEGER32/ASN_INTEGER/long(long)//l/A/W/e/r/d/h
++ */
++ case COLUMN_APPPARAMSINTEGER32:
++ rc = appParamsInteger32_undo(rowreq_ctx);
++ break;
++
++ /*
++ * appParamsUnsigned32(7)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/W/e/r/d/h
++ */
++ case COLUMN_APPPARAMSUNSIGNED32:
++ rc = appParamsUnsigned32_undo(rowreq_ctx);
++ break;
++
++ /*
++ * appParamsOctetString(9)/DessertApplicationOctetString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H
++ */
++ case COLUMN_APPPARAMSOCTETSTRING:
++ rc = appParamsOctetString_undo(rowreq_ctx);
++ break;
++
++ default:
++ snmp_log(LOG_ERR,
++ "unknown column %d in _dessertAppParamsTable_undo_column\n",
++ column);
++ break;
++ }
++
++ return rc;
++} /* _dessertAppParamsTable_undo_column */
++
++int
++_mfd_dessertAppParamsTable_undo_values(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration
++ *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ int rc;
++ dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++ netsnmp_table_request_info *tri;
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_undo_values", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ rc = dessertAppParamsTable_undo(rowreq_ctx);
++ if (MFD_SUCCESS != rc) {
++ /*
++ * nothing we can do about it but log it
++ */
++ DEBUGMSGTL(("dessertAppParamsTable:mfd", "error %d from "
++ "dessertAppParamsTable_undo\n", rc));
++ }
++
++ for (; requests; requests = requests->next) {
++ /*
++ * set column data
++ */
++ tri = netsnmp_extract_table_info(requests);
++ if (NULL == tri)
++ continue;
++
++ rc = _dessertAppParamsTable_undo_column(rowreq_ctx,
++ requests->requestvb,
++ tri->colnum);
++ if (MFD_SUCCESS != rc) {
++ /*
++ * nothing we can do about it but log it
++ */
++ DEBUGMSGTL(("dessertAppParamsTable:mfd", "error %d from "
++ "dessertAppParamsTable_undo_column\n", rc));
++ }
++ } /* for results */
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertAppParamsTable_undo_values */
++
++/*----------------------------------------------------------------------
++ *
++ * SET: irreversible commit
++ *
++ *---------------------------------------------------------------------*/
++/**
++ * @internal
++ * commit irreversible actions
++ */
++int
++_mfd_dessertAppParamsTable_irreversible_commit(netsnmp_mib_handler
++ *handler,
++ netsnmp_handler_registration
++ *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info
++ *requests)
++{
++ dessertAppParamsTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_dessertAppParamsTable_irreversible:commit", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * check for and handle row creation/deletion
++ * and update column exist flags...
++ */
++ if (rowreq_ctx->rowreq_flags & MFD_ROW_DELETED) {
++ if (!(rowreq_ctx->rowreq_flags & MFD_ROW_CREATED))
++ CONTAINER_REMOVE(dessertAppParamsTable_if_ctx.container,
++ rowreq_ctx);
++ } else {
++ if (rowreq_ctx->column_set_flags) {
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_mfd_irreversible_commit", "updating exists (%p) w/set (%p) = %p\n", rowreq_ctx->column_exists_flags, rowreq_ctx->column_set_flags, (rowreq_ctx->column_exists_flags | rowreq_ctx->column_set_flags)));
++ rowreq_ctx->column_exists_flags |=
++ rowreq_ctx->column_set_flags;
++ rowreq_ctx->column_set_flags = 0;
++ }
++ }
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertAppParamsTable_irreversible_commit */
++
++/***********************************************************************
++ *
++ * DATA ACCESS
++ *
++ ***********************************************************************/
++static void _container_free(netsnmp_container * container);
++
++/**
++ * @internal
++ */
++static int
++_cache_load(netsnmp_cache * cache, void *vmagic)
++{
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_cache_load", "called\n"));
++
++ if ((NULL == cache) || (NULL == cache->magic)) {
++ snmp_log(LOG_ERR,
++ "invalid cache for dessertAppParamsTable_cache_load\n");
++ return -1;
++ }
++
++ /** should only be called for an invalid or expired cache */
++ netsnmp_assert((0 == cache->valid) || (1 == cache->expired));
++
++ /*
++ * call user code
++ */
++ return dessertAppParamsTable_container_load((netsnmp_container *)
++ cache->magic);
++} /* _cache_load */
++
++/**
++ * @internal
++ */
++static void
++_cache_free(netsnmp_cache * cache, void *magic)
++{
++ netsnmp_container *container;
++
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_cache_free", "called\n"));
++
++ if ((NULL == cache) || (NULL == cache->magic)) {
++ snmp_log(LOG_ERR,
++ "invalid cache in dessertAppParamsTable_cache_free\n");
++ return;
++ }
++
++ container = (netsnmp_container *) cache->magic;
++
++ _container_free(container);
++} /* _cache_free */
++
++/**
++ * @internal
++ */
++static void
++_container_item_free(dessertAppParamsTable_rowreq_ctx * rowreq_ctx,
++ void *context)
++{
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_container_item_free",
++ "called\n"));
++
++ if (NULL == rowreq_ctx)
++ return;
++
++ dessertAppParamsTable_release_rowreq_ctx(rowreq_ctx);
++} /* _container_item_free */
++
++/**
++ * @internal
++ */
++static void
++_container_free(netsnmp_container * container)
++{
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_container_free",
++ "called\n"));
++
++ if (NULL == container) {
++ snmp_log(LOG_ERR,
++ "invalid container in dessertAppParamsTable_container_free\n");
++ return;
++ }
++
++ /*
++ * call user code
++ */
++ dessertAppParamsTable_container_free(container);
++
++ /*
++ * free all items. inefficient, but easy.
++ */
++ CONTAINER_CLEAR(container,
++ (netsnmp_container_obj_func *) _container_item_free,
++ NULL);
++} /* _container_free */
++
++/**
++ * @internal
++ * initialize the container with functions or wrappers
++ */
++void
++_dessertAppParamsTable_container_init(dessertAppParamsTable_interface_ctx *
++ if_ctx)
++{
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_dessertAppParamsTable_container_init", "called\n"));
++
++ /*
++ * cache init
++ */
++ if_ctx->cache = netsnmp_cache_create(30, /* timeout in seconds */
++ _cache_load, _cache_free,
++ dessertAppParamsTable_oid,
++ dessertAppParamsTable_oid_size);
++
++ if (NULL == if_ctx->cache) {
++ snmp_log(LOG_ERR,
++ "error creating cache for dessertAppParamsTable\n");
++ return;
++ }
++
++ if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;
++
++ dessertAppParamsTable_container_init(&if_ctx->container,
++ if_ctx->cache);
++ if (NULL == if_ctx->container)
++ if_ctx->container =
++ netsnmp_container_find
++ ("dessertAppParamsTable:table_container");
++ if (NULL == if_ctx->container) {
++ snmp_log(LOG_ERR, "error creating container in "
++ "dessertAppParamsTable_container_init\n");
++ return;
++ }
++
++ if (NULL != if_ctx->cache)
++ if_ctx->cache->magic = (void *) if_ctx->container;
++} /* _dessertAppParamsTable_container_init */
++
++/**
++ * @internal
++ * shutdown the container with functions or wrappers
++ */
++void
++_dessertAppParamsTable_container_shutdown
++ (dessertAppParamsTable_interface_ctx * if_ctx)
++{
++ DEBUGMSGTL(("internal:dessertAppParamsTable:_dessertAppParamsTable_container_shutdown", "called\n"));
++
++ dessertAppParamsTable_container_shutdown(if_ctx->container);
++
++ _container_free(if_ctx->container);
++
++} /* _dessertAppParamsTable_container_shutdown */
++
++
++dessertAppParamsTable_rowreq_ctx *
++dessertAppParamsTable_row_find_by_mib_index(dessertAppParamsTable_mib_index
++ * mib_idx)
++{
++ dessertAppParamsTable_rowreq_ctx *rowreq_ctx;
++ oid oid_tmp[MAX_OID_LEN];
++ netsnmp_index oid_idx;
++ int rc;
++
++ /*
++ * set up storage for OID
++ */
++ oid_idx.oids = oid_tmp;
++ oid_idx.len = sizeof(oid_tmp) / sizeof(oid);
++
++ /*
++ * convert
++ */
++ rc = dessertAppParamsTable_index_to_oid(&oid_idx, mib_idx);
++ if (MFD_SUCCESS != rc)
++ return NULL;
++
++ rowreq_ctx =
++ CONTAINER_FIND(dessertAppParamsTable_if_ctx.container, &oid_idx);
++
++ return rowreq_ctx;
++}
+diff --git a/src/snmp/dessertAppParamsTable_interface.h b/src/snmp/dessertAppParamsTable_interface.h
+new file mode 100644
+index 0000000..42db682
+--- /dev/null
++++ b/src/snmp/dessertAppParamsTable_interface.h
+@@ -0,0 +1,101 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 15899 $ of $
++ *
++ * $Id:$
++ */
++/** @ingroup interface: Routines to interface to Net-SNMP
++ *
++ * \warning This code should not be modified, called directly,
++ * or used to interpret functionality. It is subject to
++ * change at any time.
++ *
++ * @{
++ */
++/*
++ * *********************************************************************
++ * *********************************************************************
++ * *********************************************************************
++ * *** ***
++ * *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
++ * *** ***
++ * *** ***
++ * *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
++ * *** ***
++ * *** ***
++ * *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
++ * *** ***
++ * *** ***
++ * *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
++ * *** ***
++ * *** ***
++ * *********************************************************************
++ * *********************************************************************
++ * *********************************************************************
++ */
++#ifndef DESSERTAPPPARAMSTABLE_INTERFACE_H
++#define DESSERTAPPPARAMSTABLE_INTERFACE_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++#include "dessertAppParamsTable.h"
++
++
++ /*
++ ********************************************************************
++ * Table declarations
++ */
++
++ /*
++ * PUBLIC interface initialization routine
++ */
++ void
++ _dessertAppParamsTable_initialize_interface
++ (dessertAppParamsTable_registration * user_ctx, u_long flags);
++ void
++ _dessertAppParamsTable_shutdown_interface
++ (dessertAppParamsTable_registration * user_ctx);
++
++ dessertAppParamsTable_registration
++ *dessertAppParamsTable_registration_get(void);
++
++ dessertAppParamsTable_registration
++ *dessertAppParamsTable_registration_set
++ (dessertAppParamsTable_registration * newreg);
++
++ netsnmp_container *dessertAppParamsTable_container_get(void);
++ int dessertAppParamsTable_container_size(void);
++
++ u_int dessertAppParamsTable_dirty_get(void);
++ void dessertAppParamsTable_dirty_set(u_int status);
++
++ dessertAppParamsTable_rowreq_ctx
++ *dessertAppParamsTable_allocate_rowreq_ctx(void);
++ void
++ dessertAppParamsTable_release_rowreq_ctx
++ (dessertAppParamsTable_rowreq_ctx * rowreq_ctx);
++
++ int dessertAppParamsTable_index_to_oid(netsnmp_index *
++ oid_idx,
++ dessertAppParamsTable_mib_index
++ * mib_idx);
++ int dessertAppParamsTable_index_from_oid(netsnmp_index *
++ oid_idx,
++ dessertAppParamsTable_mib_index
++ * mib_idx);
++
++ /*
++ * access to certain internals. use with caution!
++ */
++ void
++ dessertAppParamsTable_valid_columns_set(netsnmp_column_info *vc);
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTAPPPARAMSTABLE_INTERFACE_H */
++/** @} */
+diff --git a/src/snmp/dessertAppParamsTable_oids.h b/src/snmp/dessertAppParamsTable_oids.h
+new file mode 100644
+index 0000000..d36d8f8
+--- /dev/null
++++ b/src/snmp/dessertAppParamsTable_oids.h
+@@ -0,0 +1,56 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * : generic-table-oids.m2c 12855 2005-09-27 15:56:08Z rstory $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTAPPPARAMSTABLE_OIDS_H
++#define DESSERTAPPPARAMSTABLE_OIDS_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++ /*
++ * column number definitions for table dessertAppParamsTable
++ */
++#define DESSERTAPPPARAMSTABLE_OID 1,3,6,1,4,1,18898,0,19,10,1,1,9
++
++#define COLUMN_APPPARAMSINDEX 1
++
++#define COLUMN_APPPARAMSNAME 2
++#define COLUMN_APPPARAMSNAME_FLAG (0x1 << 1)
++
++#define COLUMN_APPPARAMSDESC 3
++#define COLUMN_APPPARAMSDESC_FLAG (0x1 << 2)
++
++#define COLUMN_APPPARAMSVALUETYPE 4
++#define COLUMN_APPPARAMSVALUETYPE_FLAG (0x1 << 3)
++
++#define COLUMN_APPPARAMSTRUTHVALUE 5
++#define COLUMN_APPPARAMSTRUTHVALUE_FLAG (0x1 << 4)
++
++#define COLUMN_APPPARAMSINTEGER32 6
++#define COLUMN_APPPARAMSINTEGER32_FLAG (0x1 << 5)
++
++#define COLUMN_APPPARAMSUNSIGNED32 7
++#define COLUMN_APPPARAMSUNSIGNED32_FLAG (0x1 << 6)
++
++#define COLUMN_APPPARAMSOCTETSTRING 9
++#define COLUMN_APPPARAMSOCTETSTRING_FLAG (0x1 << 8)
++
++
++#define DESSERTAPPPARAMSTABLE_MIN_COL COLUMN_APPPARAMSNAME
++#define DESSERTAPPPARAMSTABLE_MAX_COL COLUMN_APPPARAMSOCTETSTRING
++
++
++ /*
++ * OR together all the writable cols.
++ */
++#define DESSERTAPPPARAMSTABLE_SETTABLE_COLS (COLUMN_APPPARAMSTRUTHVALUE_FLAG | COLUMN_APPPARAMSINTEGER32_FLAG | COLUMN_APPPARAMSUNSIGNED32_FLAG | COLUMN_APPPARAMSOCTETSTRING_FLAG)
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTAPPPARAMSTABLE_OIDS_H */
+diff --git a/src/snmp/dessertAppStatsTable.c b/src/snmp/dessertAppStatsTable.c
+new file mode 100644
+index 0000000..0a45018
+--- /dev/null
++++ b/src/snmp/dessertAppStatsTable.c
+@@ -0,0 +1,173 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 14170 $ of $
++ *
++ * $Id:$
++ */
++/** \page MFD helper for dessertAppStatsTable
++ *
++ * \section intro Introduction
++ * Introductory text.
++ *
++ */
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertAppStatsTable.h"
++
++#include <net-snmp/agent/mib_modules.h>
++
++#include "dessertAppStatsTable_interface.h"
++
++oid dessertAppStatsTable_oid[] = { DESSERTAPPSTATSTABLE_OID };
++
++int dessertAppStatsTable_oid_size =
++OID_LENGTH(dessertAppStatsTable_oid);
++
++dessertAppStatsTable_registration dessertAppStatsTable_user_context;
++
++void initialize_table_dessertAppStatsTable(void);
++void shutdown_table_dessertAppStatsTable(void);
++
++
++/**
++ * Initializes the dessertAppStatsTable module
++ */
++void
++init_dessertAppStatsTable(void)
++{
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:init_dessertAppStatsTable",
++ "called\n"));
++
++ /*
++ * TODO:300:o: Perform dessertAppStatsTable one-time module initialization.
++ */
++
++ /*
++ * here we initialize all the tables we're planning on supporting
++ */
++ if (should_init("dessertAppStatsTable"))
++ initialize_table_dessertAppStatsTable();
++
++} /* init_dessertAppStatsTable */
++
++/**
++ * Shut-down the dessertAppStatsTable module (agent is exiting)
++ */
++void
++shutdown_dessertAppStatsTable(void)
++{
++ if (should_init("dessertAppStatsTable"))
++ shutdown_table_dessertAppStatsTable();
++
++}
++
++/**
++ * Initialize the table dessertAppStatsTable
++ * (Define its contents and how it's structured)
++ */
++void
++initialize_table_dessertAppStatsTable(void)
++{
++ dessertAppStatsTable_registration *user_context;
++ u_long flags;
++
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:initialize_table_dessertAppStatsTable", "called\n"));
++
++ /*
++ * TODO:301:o: Perform dessertAppStatsTable one-time table initialization.
++ */
++
++ /*
++ * TODO:302:o: |->Initialize dessertAppStatsTable user context
++ * if you'd like to pass in a pointer to some data for this
++ * table, allocate or set it up here.
++ */
++ /*
++ * a netsnmp_data_list is a simple way to store void pointers. A simple
++ * string token is used to add, find or remove pointers.
++ */
++ user_context =
++ netsnmp_create_data_list("dessertAppStatsTable", NULL, NULL);
++
++ /*
++ * No support for any flags yet, but in the future you would
++ * set any flags here.
++ */
++ flags = 0;
++
++ /*
++ * call interface initialization code
++ */
++ _dessertAppStatsTable_initialize_interface(user_context, flags);
++} /* initialize_table_dessertAppStatsTable */
++
++/**
++ * Shutdown the table dessertAppStatsTable
++ */
++void
++shutdown_table_dessertAppStatsTable(void)
++{
++ /*
++ * call interface shutdown code
++ */
++ _dessertAppStatsTable_shutdown_interface
++ (&dessertAppStatsTable_user_context);
++}
++
++/**
++ * pre-request callback
++ *
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error
++ */
++int
++dessertAppStatsTable_pre_request(dessertAppStatsTable_registration *
++ user_context)
++{
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_pre_request", "called\n"));
++
++ /*
++ * TODO:510:o: Perform dessertAppStatsTable pre-request actions.
++ */
++
++ return MFD_SUCCESS;
++} /* dessertAppStatsTable_pre_request */
++
++/**
++ * post-request callback
++ *
++ * Note:
++ * New rows have been inserted into the container, and
++ * deleted rows have been removed from the container and
++ * released.
++ *
++ * @param user_context
++ * @param rc : MFD_SUCCESS if all requests succeeded
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error (ignored)
++ */
++int
++dessertAppStatsTable_post_request(dessertAppStatsTable_registration *
++ user_context, int rc)
++{
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_post_request", "called\n"));
++
++ /*
++ * TODO:511:o: Perform dessertAppStatsTable post-request actions.
++ */
++
++ return MFD_SUCCESS;
++} /* dessertAppStatsTable_post_request */
++
++
++/** @{ */
+diff --git a/src/snmp/dessertAppStatsTable.h b/src/snmp/dessertAppStatsTable.h
+new file mode 100644
+index 0000000..1f8a4b3
+--- /dev/null
++++ b/src/snmp/dessertAppStatsTable.h
+@@ -0,0 +1,251 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 14170 $ of $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTAPPSTATSTABLE_H
++#define DESSERTAPPSTATSTABLE_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++/** @addtogroup misc misc: Miscellaneous routines
++ *
++ * @{
++ */
++#include <net-snmp/library/asn1.h>
++
++ /*
++ * other required module components
++ */
++ /* *INDENT-OFF* */
++config_add_mib(DESSERT-MIB)
++config_require(DESSERT-MIB/dessertAppStatsTable/dessertAppStatsTable_interface)
++config_require(DESSERT-MIB/dessertAppStatsTable/dessertAppStatsTable_data_access)
++config_require(DESSERT-MIB/dessertAppStatsTable/dessertAppStatsTable_data_get)
++config_require(DESSERT-MIB/dessertAppStatsTable/dessertAppStatsTable_data_set)
++ /* *INDENT-ON* */
++
++ /*
++ * OID and column number definitions for dessertAppStatsTable
++ */
++#include "dessertAppStatsTable_oids.h"
++
++ /*
++ * enum definions
++ */
++#include "dessertAppStatsTable_enums.h"
++
++ /*
++ *********************************************************************
++ * function declarations
++ */
++ void init_dessertAppStatsTable(void);
++ void shutdown_dessertAppStatsTable(void);
++
++ /*
++ *********************************************************************
++ * Table declarations
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertAppStatsTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++ /*
++ * DESSERT-MIB::dessertAppStatsTable is subid 9 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.9, length: 12
++ */
++ /*
++ *********************************************************************
++ * When you register your mib, you get to provide a generic
++ * pointer that will be passed back to you for most of the
++ * functions calls.
++ *
++ * TODO:100:r: Review all context structures
++ */
++ /*
++ * TODO:101:o: |-> Review dessertAppStatsTable registration context.
++ */
++ typedef netsnmp_data_list dessertAppStatsTable_registration;
++
++/**********************************************************************/
++ /*
++ * TODO:110:r: |-> Review dessertAppStatsTable data context structure.
++ * This structure is used to represent the data for dessertAppStatsTable.
++ */
++ /*
++ * This structure contains storage for all the columns defined in the
++ * dessertAppStatsTable.
++ */
++ typedef struct dessertAppStatsTable_data_s {
++
++ /*
++ * appStatsName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ char appStatsName[255];
++ size_t appStatsName_len; /* # of char elements, not bytes */
++
++ /*
++ * appStatsDesc(3)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ char appStatsDesc[255];
++ size_t appStatsDesc_len; /* # of char elements, not bytes */
++
++ /*
++ * appStatsNodeOrLink(4)/INTEGER/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
++ */
++ u_long appStatsNodeOrLink;
++
++ /*
++ * appStatsValueType(5)/INTEGER/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
++ */
++ u_long appStatsValueType;
++
++ /*
++ * appStatsMacAddress1(6)/MacAddress/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ char appStatsMacAddress1[6];
++ size_t appStatsMacAddress1_len; /* # of char elements, not bytes */
++
++ /*
++ * appStatsMacAddress2(7)/MacAddress/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ char appStatsMacAddress2[6];
++ size_t appStatsMacAddress2_len; /* # of char elements, not bytes */
++
++ /*
++ * appStatsTruthValue(8)/TruthValue/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
++ */
++ u_long appStatsTruthValue;
++
++ /*
++ * appStatsInteger32(9)/INTEGER32/ASN_INTEGER/long(long)//l/A/w/e/r/d/h
++ */
++ long appStatsInteger32;
++
++ /*
++ * appStatsUnsigned32(10)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/w/e/r/d/h
++ */
++ u_long appStatsUnsigned32;
++
++ /*
++ * appStatsCounter64(11)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ U64 appStatsCounter64;
++
++ /*
++ * appStatsOctetString(12)/OCTETSTR/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/h
++ */
++ char appStatsOctetString[1024];
++ size_t appStatsOctetString_len; /* # of char elements, not bytes */
++
++ } dessertAppStatsTable_data;
++
++
++ /*
++ * TODO:120:r: |-> Review dessertAppStatsTable mib index.
++ * This structure is used to represent the index for dessertAppStatsTable.
++ */
++ typedef struct dessertAppStatsTable_mib_index_s {
++
++ /*
++ * appStatsIndex(1)///()//L/a/w/e/r/d/h
++ */
++ long appStatsIndex;
++
++
++ } dessertAppStatsTable_mib_index;
++
++ /*
++ * TODO:121:r: | |-> Review dessertAppStatsTable max index length.
++ * If you KNOW that your indexes will never exceed a certain
++ * length, update this macro to that length.
++ */
++#define MAX_dessertAppStatsTable_IDX_LEN 1
++
++
++ /*
++ *********************************************************************
++ * TODO:130:o: |-> Review dessertAppStatsTable Row request (rowreq) context.
++ * When your functions are called, you will be passed a
++ * dessertAppStatsTable_rowreq_ctx pointer.
++ */
++ typedef struct dessertAppStatsTable_rowreq_ctx_s {
++
++ /** this must be first for container compare to work */
++ netsnmp_index oid_idx;
++ oid oid_tmp[MAX_dessertAppStatsTable_IDX_LEN];
++
++ dessertAppStatsTable_mib_index tbl_idx;
++
++ dessertAppStatsTable_data data;
++ unsigned int column_exists_flags; /* flags for existence */
++
++ /*
++ * flags per row. Currently, the first (lower) 8 bits are reserved
++ * for the user. See mfd.h for other flags.
++ */
++ u_int rowreq_flags;
++
++ /*
++ * TODO:131:o: | |-> Add useful data to dessertAppStatsTable rowreq context.
++ */
++
++ /*
++ * storage for future expansion
++ */
++ netsnmp_data_list *dessertAppStatsTable_data_list;
++
++ } dessertAppStatsTable_rowreq_ctx;
++
++ typedef struct dessertAppStatsTable_ref_rowreq_ctx_s {
++ dessertAppStatsTable_rowreq_ctx *rowreq_ctx;
++ } dessertAppStatsTable_ref_rowreq_ctx;
++
++ /*
++ *********************************************************************
++ * function prototypes
++ */
++ int
++ dessertAppStatsTable_pre_request(dessertAppStatsTable_registration
++ * user_context);
++ int
++ dessertAppStatsTable_post_request(dessertAppStatsTable_registration
++ * user_context, int rc);
++
++
++ dessertAppStatsTable_rowreq_ctx
++ *dessertAppStatsTable_row_find_by_mib_index
++ (dessertAppStatsTable_mib_index * mib_idx);
++
++ extern oid dessertAppStatsTable_oid[];
++ extern int dessertAppStatsTable_oid_size;
++
++
++#include "dessertAppStatsTable_interface.h"
++#include "dessertAppStatsTable_data_access.h"
++#include "dessertAppStatsTable_data_get.h"
++#include "dessertAppStatsTable_data_set.h"
++
++ /*
++ * DUMMY markers, ignore
++ *
++ * TODO:099:x: *************************************************************
++ * TODO:199:x: *************************************************************
++ * TODO:299:x: *************************************************************
++ * TODO:399:x: *************************************************************
++ * TODO:499:x: *************************************************************
++ */
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTAPPSTATSTABLE_H */
++/** @} */
+diff --git a/src/snmp/dessertAppStatsTable_data_access.c b/src/snmp/dessertAppStatsTable_data_access.c
+new file mode 100644
+index 0000000..958f057
+--- /dev/null
++++ b/src/snmp/dessertAppStatsTable_data_access.c
+@@ -0,0 +1,407 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 14170 $ of $
++ *
++ * $Id:$
++ */
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertAppStatsTable.h"
++#include "dessertAppStatsTable_data_access.h"
++#include <dessert/dessert.h>
++#include "dessert_internal.h"
++
++/** @ingroup interface
++ * @addtogroup data_access data_access: Routines to access data
++ *
++ * These routines are used to locate the data used to satisfy
++ * requests.
++ *
++ * @{
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertAppStatsTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++/*
++ * DESSERT-MIB::dessertAppStatsTable is subid 9 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.9, length: 12
++ */
++
++/**
++ * initialization for dessertAppStatsTable data access
++ *
++ * This function is called during startup to allow you to
++ * allocate any resources you need for the data table.
++ *
++ * @param dessertAppStatsTable_reg
++ * Pointer to dessertAppStatsTable_registration
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : unrecoverable error.
++ */
++int
++dessertAppStatsTable_init_data(dessertAppStatsTable_registration *
++ dessertAppStatsTable_reg)
++{
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_init_data", "called\n"));
++
++ /*
++ * TODO:303:o: Initialize dessertAppStatsTable data.
++ */
++ /*
++ ***************************************************
++ *** START EXAMPLE CODE ***
++ ***---------------------------------------------***/
++ /*
++ * if you are the sole writer for the file, you could
++ * open it here. However, as stated earlier, we are assuming
++ * the worst case, which in this case means that the file is
++ * written to by someone else, and might not even exist when
++ * we start up. So we can't do anything here.
++ */
++ /*
++ ***---------------------------------------------***
++ *** END EXAMPLE CODE ***
++ ***************************************************/
++
++ return MFD_SUCCESS;
++} /* dessertAppStatsTable_init_data */
++
++/**
++ * container overview
++ *
++ */
++
++/**
++ * container initialization
++ *
++ * @param container_ptr_ptr A pointer to a container pointer. If you
++ * create a custom container, use this parameter to return it
++ * to the MFD helper. If set to NULL, the MFD helper will
++ * allocate a container for you.
++ * @param cache A pointer to a cache structure. You can set the timeout
++ * and other cache flags using this pointer.
++ *
++ * This function is called at startup to allow you to customize certain
++ * aspects of the access method. For the most part, it is for advanced
++ * users. The default code should suffice for most cases. If no custom
++ * container is allocated, the MFD code will create one for your.
++ *
++ * This is also the place to set up cache behavior. The default, to
++ * simply set the cache timeout, will work well with the default
++ * container. If you are using a custom container, you may want to
++ * look at the cache helper documentation to see if there are any
++ * flags you want to set.
++ *
++ * @remark
++ * This would also be a good place to do any initialization needed
++ * for you data source. For example, opening a connection to another
++ * process that will supply the data, opening a database, etc.
++ */
++void
++dessertAppStatsTable_container_init(netsnmp_container ** container_ptr_ptr,
++ netsnmp_cache * cache)
++{
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_container_init", "called\n"));
++
++ if (NULL == container_ptr_ptr) {
++ snmp_log(LOG_ERR,
++ "bad container param to dessertAppStatsTable_container_init\n");
++ return;
++ }
++
++ /*
++ * For advanced users, you can use a custom container. If you
++ * do not create one, one will be created for you.
++ */
++ *container_ptr_ptr = NULL;
++
++ if (NULL == cache) {
++ snmp_log(LOG_ERR,
++ "bad cache param to dessertAppStatsTable_container_init\n");
++ return;
++ }
++
++ /*
++ * TODO:345:A: Set up dessertAppStatsTable cache properties.
++ *
++ * Also for advanced users, you can set parameters for the
++ * cache. Do not change the magic pointer, as it is used
++ * by the MFD helper. To completely disable caching, set
++ * cache->enabled to 0.
++ */
++ cache->timeout = DESSERTAPPSTATSTABLE_CACHE_TIMEOUT; /* seconds */
++} /* dessertAppStatsTable_container_init */
++
++/**
++ * container shutdown
++ *
++ * @param container_ptr A pointer to the container.
++ *
++ * This function is called at shutdown to allow you to customize certain
++ * aspects of the access method. For the most part, it is for advanced
++ * users. The default code should suffice for most cases.
++ *
++ * This function is called before dessertAppStatsTable_container_free().
++ *
++ * @remark
++ * This would also be a good place to do any cleanup needed
++ * for you data source. For example, closing a connection to another
++ * process that supplied the data, closing a database, etc.
++ */
++void
++dessertAppStatsTable_container_shutdown(netsnmp_container * container_ptr)
++{
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_container_shutdown", "called\n"));
++
++ if (NULL == container_ptr) {
++ snmp_log(LOG_ERR,
++ "bad params to dessertAppStatsTable_container_shutdown\n");
++ return;
++ }
++
++} /* dessertAppStatsTable_container_shutdown */
++
++/**
++ * load initial data
++ *
++ * This function will also be called by the cache helper to load
++ * the container again (after the container free function has been
++ * called to free the previous contents).
++ *
++ * @param container container to which items should be inserted
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_RESOURCE_UNAVAILABLE : Can't access data source
++ * @retval MFD_ERROR : other error.
++ *
++ * This function is called to load the index(es) (and data, optionally)
++ * for the every row in the data set.
++ *
++ * @remark
++ * While loading the data, the only important thing is the indexes.
++ * If access to your data is cheap/fast (e.g. you have a pointer to a
++ * structure in memory), it would make sense to update the data here.
++ * If, however, the accessing the data invovles more work (e.g. parsing
++ * some other existing data, or peforming calculations to derive the data),
++ * then you can limit yourself to setting the indexes and saving any
++ * information you will need later. Then use the saved information in
++ * dessertAppStatsTable_row_prep() for populating data.
++ *
++ * @note
++ * If you need consistency between rows (like you want statistics
++ * for each row to be from the same time frame), you should set all
++ * data here.
++ *
++ */
++int dessertAppStatsTable_container_load(netsnmp_container * container) {
++ dessertAppStatsTable_rowreq_ctx *rowreq_ctx;
++ size_t count = 0;
++
++ dessert_agentx_appstats_t *appstats_list = NULL;
++ dessert_agentx_appstats_t *appstat;
++
++ /*
++ * temporary storage for index values
++ */
++ long appStatsIndex;
++
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_container_load", "called\n"));
++ dessert_debug("dessertAppStatsTable_container_load called");
++
++ /* harvest the appstats from the callbacks registered via *dessert_agentx_appstats_add* */
++ if (_dessert_agentx_appstats_harvest_callbacks(&appstats_list)
++ == DESSERT_ERR)
++ return MFD_RESOURCE_UNAVAILABLE;
++
++ /*
++ * Load/update data in the dessertAppStatsTable container.
++ * loop over your dessertAppStatsTable data, allocate a rowreq context,
++ * set the index(es) [and data, optionally] and insert into
++ * the container.
++ */
++ DL_FOREACH(appstats_list, appstat) {
++
++ appStatsIndex = count++;
++
++ /*
++ * set indexes in new dessertAppStatsTable rowreq context.
++ */
++ rowreq_ctx = dessertAppStatsTable_allocate_rowreq_ctx();
++ if (NULL == rowreq_ctx) {
++ snmp_log(LOG_ERR, "memory allocation failed\n");
++ return MFD_RESOURCE_UNAVAILABLE;
++ }
++ if (MFD_SUCCESS != dessertAppStatsTable_indexes_set(rowreq_ctx,
++ appStatsIndex)) {
++ snmp_log(LOG_ERR, "error setting index while loading "
++ "dessertAppStatsTable data.\n");
++ dessertAppStatsTable_release_rowreq_ctx(rowreq_ctx);
++ continue;
++ }
++
++ /* clear all column flags */
++ rowreq_ctx->column_exists_flags = 0;
++
++ /* these columns are always present*/
++ rowreq_ctx->column_exists_flags |= COLUMN_APPSTATSNAME_FLAG
++ | COLUMN_APPSTATSDESC_FLAG | COLUMN_APPSTATSNODEORLINK_FLAG
++ | COLUMN_APPSTATSVALUETYPE_FLAG;
++
++ rowreq_ctx->data.appStatsName_len = strlen(appstat->name);
++ strcpy(rowreq_ctx->data.appStatsName, appstat->name);
++
++ rowreq_ctx->data.appStatsDesc_len = strlen(appstat->desc);
++ strcpy(rowreq_ctx->data.appStatsDesc, appstat->desc);
++
++ appStatsNodeOrLink_map(&(rowreq_ctx->data.appStatsNodeOrLink),appstat->node_or_link);
++ appStatsValueType_map(&(rowreq_ctx->data.appStatsValueType),appstat->value_type);
++
++ /* are the macaddress? columns present?*/
++ switch (appstat->node_or_link) {
++
++ case DESSERT_APPSTATS_NODEORLINK_NONE:
++ break;
++ case DESSERT_APPSTATS_NODEORLINK_NODE:
++ rowreq_ctx->column_exists_flags |= COLUMN_APPSTATSMACADDRESS1_FLAG;
++
++ rowreq_ctx->data.appStatsMacAddress1_len = ETHER_ADDR_LEN;
++ memcpy(rowreq_ctx->data.appStatsMacAddress1, appstat->macaddress1,
++ ETHER_ADDR_LEN);
++
++ break;
++ case DESSERT_APPSTATS_NODEORLINK_LINK:
++ rowreq_ctx->column_exists_flags |= COLUMN_APPSTATSMACADDRESS1_FLAG
++ | COLUMN_APPSTATSMACADDRESS2_FLAG;
++
++ rowreq_ctx->data.appStatsMacAddress1_len = ETHER_ADDR_LEN;
++ memcpy(rowreq_ctx->data.appStatsMacAddress1, appstat->macaddress1,
++ ETHER_ADDR_LEN);
++
++ rowreq_ctx->data.appStatsMacAddress2_len = ETHER_ADDR_LEN;
++ memcpy(rowreq_ctx->data.appStatsMacAddress2, appstat->macaddress2,
++ ETHER_ADDR_LEN);
++
++ break;
++ default:
++ dessert_err("appstats->node_or_link not valid!");
++ }
++
++ /* which of the 'value'-columns is actually present? */
++ switch (appstat->value_type) {
++
++ case DESSERT_APPSTATS_VALUETYPE_BOOL:
++ rowreq_ctx->column_exists_flags |= COLUMN_APPSTATSTRUTHVALUE_FLAG;
++ appStatsTruthValue_map(&(rowreq_ctx->data.appStatsTruthValue),appstat->bool);
++ break;
++
++ case DESSERT_APPSTATS_VALUETYPE_INT32:
++ rowreq_ctx->column_exists_flags |= COLUMN_APPSTATSINTEGER32_FLAG;
++ rowreq_ctx->data.appStatsInteger32 = appstat->int32;
++
++ break;
++
++ case DESSERT_APPSTATS_VALUETYPE_UINT32:
++ rowreq_ctx->column_exists_flags |= COLUMN_APPSTATSUNSIGNED32_FLAG;
++ rowreq_ctx->data.appStatsUnsigned32 = appstat->uint32;
++
++ break;
++
++ case DESSERT_APPSTATS_VALUETYPE_COUNTER64:
++ rowreq_ctx->column_exists_flags |= COLUMN_APPSTATSCOUNTER64_FLAG;
++ rowreq_ctx->data.appStatsCounter64.low = appstat->counter64
++ & 0xffffffff;
++ rowreq_ctx->data.appStatsCounter64.high = appstat->counter64 >> 32;
++
++ break;
++
++ case DESSERT_APPSTATS_VALUETYPE_OCTETSTRING:
++ rowreq_ctx->column_exists_flags |= COLUMN_APPSTATSOCTETSTRING_FLAG;
++ rowreq_ctx->data.appStatsOctetString_len = appstat->octetstring_len;
++ memcpy(&(rowreq_ctx->data.appStatsOctetString), appstat->octetstring, appstat->octetstring_len);
++
++ break;
++
++ default:
++ dessert_err("appstats->value_type not valid! [%s]", appstat->name);
++ }
++
++ /*
++ * insert into table container
++ */
++ CONTAINER_INSERT(container, rowreq_ctx);
++ }
++
++ _dessert_agentx_appstats_free_list(&appstats_list);
++
++ DEBUGMSGT(("verbose:dessertAppStatsTable:dessertAppStatsTable_container_load", "inserted %d records\n", count));
++
++ return MFD_SUCCESS;
++} /* dessertAppStatsTable_container_load */
++
++/**
++ * container clean up
++ *
++ * @param container container with all current items
++ *
++ * This optional callback is called prior to all
++ * item's being removed from the container. If you
++ * need to do any processing before that, do it here.
++ *
++ * @note
++ * The MFD helper will take care of releasing all the row contexts.
++ *
++ */
++void
++dessertAppStatsTable_container_free(netsnmp_container * container)
++{
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_container_free", "called\n"));
++
++ /*
++ * TODO:380:M: Free dessertAppStatsTable container data.
++ */
++} /* dessertAppStatsTable_container_free */
++
++/**
++ * prepare row for processing.
++ *
++ * When the agent has located the row for a request, this function is
++ * called to prepare the row for processing. If you fully populated
++ * the data context during the index setup phase, you may not need to
++ * do anything.
++ *
++ * @param rowreq_ctx pointer to a context.
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error.
++ */
++int
++dessertAppStatsTable_row_prep(dessertAppStatsTable_rowreq_ctx * rowreq_ctx)
++{
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_row_prep", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:390:o: Prepare row for request.
++ * If populating row data was delayed, this is the place to
++ * fill in the row for this request.
++ */
++
++ return MFD_SUCCESS;
++} /* dessertAppStatsTable_row_prep */
++
++/** @} */
+diff --git a/src/snmp/dessertAppStatsTable_data_access.h b/src/snmp/dessertAppStatsTable_data_access.h
+new file mode 100644
+index 0000000..10c407d
+--- /dev/null
++++ b/src/snmp/dessertAppStatsTable_data_access.h
+@@ -0,0 +1,93 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 14170 $ of $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTAPPSTATSTABLE_DATA_ACCESS_H
++#define DESSERTAPPSTATSTABLE_DATA_ACCESS_H
++
++#include "dessert_internal.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++ /*
++ *********************************************************************
++ * function declarations
++ */
++
++ /*
++ *********************************************************************
++ * Table declarations
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertAppStatsTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++ /*
++ * DESSERT-MIB::dessertAppStatsTable is subid 9 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.9, length: 12
++ */
++
++
++ int
++ dessertAppStatsTable_init_data(dessertAppStatsTable_registration *
++ dessertAppStatsTable_reg);
++
++
++ /*
++ * TODO:180:o: Review dessertAppStatsTable cache timeout.
++ * The number of seconds before the cache times out
++ */
++#define DESSERTAPPSTATSTABLE_CACHE_TIMEOUT DESSERT_AGENTX_APPSTATSTABLE_CACHE_TIMEOUT
++
++ void dessertAppStatsTable_container_init(netsnmp_container
++ **
++ container_ptr_ptr,
++ netsnmp_cache *
++ cache);
++ void
++ dessertAppStatsTable_container_shutdown(netsnmp_container *
++ container_ptr);
++
++ int dessertAppStatsTable_container_load(netsnmp_container *
++ container);
++ void dessertAppStatsTable_container_free(netsnmp_container *
++ container);
++
++ int dessertAppStatsTable_cache_load(netsnmp_container *
++ container);
++ void dessertAppStatsTable_cache_free(netsnmp_container *
++ container);
++
++ /*
++ ***************************************************
++ *** START EXAMPLE CODE ***
++ ***---------------------------------------------***/
++ /*
++ *********************************************************************
++ * Since we have no idea how you really access your data, we'll go with
++ * a worst case example: a flat text file.
++ */
++#define MAX_LINE_SIZE 256
++ /*
++ ***---------------------------------------------***
++ *** END EXAMPLE CODE ***
++ ***************************************************/
++ int
++ dessertAppStatsTable_row_prep(dessertAppStatsTable_rowreq_ctx *
++ rowreq_ctx);
++
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTAPPSTATSTABLE_DATA_ACCESS_H */
+diff --git a/src/snmp/dessertAppStatsTable_data_get.c b/src/snmp/dessertAppStatsTable_data_get.c
+new file mode 100644
+index 0000000..1185126
+--- /dev/null
++++ b/src/snmp/dessertAppStatsTable_data_get.c
+@@ -0,0 +1,1088 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 12088 $ of $
++ *
++ * $Id:$
++ */
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertAppStatsTable.h"
++
++
++/** @defgroup data_get data_get: Routines to get data
++ *
++ * TODO:230:M: Implement dessertAppStatsTable get routines.
++ * TODO:240:M: Implement dessertAppStatsTable mapping routines (if any).
++ *
++ * These routine are used to get the value for individual objects. The
++ * row context is passed, along with a pointer to the memory where the
++ * value should be copied.
++ *
++ * @{
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertAppStatsTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++/*
++ * DESSERT-MIB::dessertAppStatsTable is subid 9 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.9, length: 12
++ */
++
++/*
++ * ---------------------------------------------------------------------
++ * * TODO:200:r: Implement dessertAppStatsTable data context functions.
++ */
++
++
++/**
++ * set mib index(es)
++ *
++ * @param tbl_idx mib index structure
++ * @param appStatsIndex_val
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error.
++ *
++ * @remark
++ * This convenience function is useful for setting all the MIB index
++ * components with a single function call. It is assume that the C values
++ * have already been mapped from their native/rawformat to the MIB format.
++ */
++int
++dessertAppStatsTable_indexes_set_tbl_idx(dessertAppStatsTable_mib_index *
++ tbl_idx, long appStatsIndex_val)
++{
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_indexes_set_tbl_idx", "called\n"));
++
++ /*
++ * appStatsIndex(1)///()//L/a/w/e/r/d/h
++ */
++ tbl_idx->appStatsIndex = appStatsIndex_val;
++
++
++ return MFD_SUCCESS;
++} /* dessertAppStatsTable_indexes_set_tbl_idx */
++
++/**
++ * @internal
++ * set row context indexes
++ *
++ * @param reqreq_ctx the row context that needs updated indexes
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error.
++ *
++ * @remark
++ * This function sets the mib indexs, then updates the oid indexs
++ * from the mib index.
++ */
++int
++dessertAppStatsTable_indexes_set(dessertAppStatsTable_rowreq_ctx *
++ rowreq_ctx, long appStatsIndex_val)
++{
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_indexes_set", "called\n"));
++
++ if (MFD_SUCCESS !=
++ dessertAppStatsTable_indexes_set_tbl_idx(&rowreq_ctx->tbl_idx,
++ appStatsIndex_val))
++ return MFD_ERROR;
++
++ /*
++ * convert mib index to oid index
++ */
++ rowreq_ctx->oid_idx.len = sizeof(rowreq_ctx->oid_tmp) / sizeof(oid);
++ if (0 != dessertAppStatsTable_index_to_oid(&rowreq_ctx->oid_idx,
++ &rowreq_ctx->tbl_idx)) {
++ return MFD_ERROR;
++ }
++
++ return MFD_SUCCESS;
++} /* dessertAppStatsTable_indexes_set */
++
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppStatsEntry.appStatsName
++ * appStatsName is subid 2 of dessertAppStatsEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.2
++ * Description:
++The name of the statistical datum
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 1 hashint 1
++ * settable 0
++ * hint: 255a
++ *
++ * Ranges: 0 - 255;
++ *
++ * Its syntax is DisplayString (based on perltype OCTETSTR)
++ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
++ * This data type requires a length. (Max 255)
++ */
++/**
++ * Extract the current value of the appStatsName data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appStatsName_val_ptr_ptr
++ * Pointer to storage for a char variable
++ * @param appStatsName_val_ptr_len_ptr
++ * Pointer to a size_t. On entry, it will contain the size (in bytes)
++ * pointed to by appStatsName.
++ * On exit, this value should contain the data size (in bytes).
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++*
++ * @note If you need more than (*appStatsName_val_ptr_len_ptr) bytes of memory,
++ * allocate it using malloc() and update appStatsName_val_ptr_ptr.
++ * <b>DO NOT</b> free the previous pointer.
++ * The MFD helper will release the memory you allocate.
++ *
++ * @remark If you call this function yourself, you are responsible
++ * for checking if the pointer changed, and freeing any
++ * previously allocated memory. (Not necessary if you pass
++ * in a pointer to static memory, obviously.)
++ */
++int
++appStatsName_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
++ char **appStatsName_val_ptr_ptr,
++ size_t *appStatsName_val_ptr_len_ptr)
++{
++ /** we should have a non-NULL pointer and enough storage */
++ netsnmp_assert((NULL != appStatsName_val_ptr_ptr)
++ && (NULL != *appStatsName_val_ptr_ptr));
++ netsnmp_assert(NULL != appStatsName_val_ptr_len_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsName_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the appStatsName data.
++ * copy (* appStatsName_val_ptr_ptr ) data and (* appStatsName_val_ptr_len_ptr ) from rowreq_ctx->data
++ */
++ /*
++ * make sure there is enough space for appStatsName data
++ */
++ if ((NULL == (*appStatsName_val_ptr_ptr)) ||
++ ((*appStatsName_val_ptr_len_ptr) <
++ (rowreq_ctx->data.appStatsName_len *
++ sizeof(rowreq_ctx->data.appStatsName[0])))) {
++ /*
++ * allocate space for appStatsName data
++ */
++ (*appStatsName_val_ptr_ptr) =
++ malloc(rowreq_ctx->data.appStatsName_len *
++ sizeof(rowreq_ctx->data.appStatsName[0]));
++ if (NULL == (*appStatsName_val_ptr_ptr)) {
++ snmp_log(LOG_ERR, "could not allocate memory\n");
++ return MFD_ERROR;
++ }
++ }
++ (*appStatsName_val_ptr_len_ptr) =
++ rowreq_ctx->data.appStatsName_len *
++ sizeof(rowreq_ctx->data.appStatsName[0]);
++ memcpy((*appStatsName_val_ptr_ptr), rowreq_ctx->data.appStatsName,
++ rowreq_ctx->data.appStatsName_len *
++ sizeof(rowreq_ctx->data.appStatsName[0]));
++
++ return MFD_SUCCESS;
++} /* appStatsName_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppStatsEntry.appStatsDesc
++ * appStatsDesc is subid 3 of dessertAppStatsEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.3
++ * Description:
++A short description of the statistical datum
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 1 hashint 1
++ * settable 0
++ * hint: 255a
++ *
++ * Ranges: 0 - 255;
++ *
++ * Its syntax is DisplayString (based on perltype OCTETSTR)
++ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
++ * This data type requires a length. (Max 255)
++ */
++/**
++ * Extract the current value of the appStatsDesc data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appStatsDesc_val_ptr_ptr
++ * Pointer to storage for a char variable
++ * @param appStatsDesc_val_ptr_len_ptr
++ * Pointer to a size_t. On entry, it will contain the size (in bytes)
++ * pointed to by appStatsDesc.
++ * On exit, this value should contain the data size (in bytes).
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++*
++ * @note If you need more than (*appStatsDesc_val_ptr_len_ptr) bytes of memory,
++ * allocate it using malloc() and update appStatsDesc_val_ptr_ptr.
++ * <b>DO NOT</b> free the previous pointer.
++ * The MFD helper will release the memory you allocate.
++ *
++ * @remark If you call this function yourself, you are responsible
++ * for checking if the pointer changed, and freeing any
++ * previously allocated memory. (Not necessary if you pass
++ * in a pointer to static memory, obviously.)
++ */
++int
++appStatsDesc_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
++ char **appStatsDesc_val_ptr_ptr,
++ size_t *appStatsDesc_val_ptr_len_ptr)
++{
++ /** we should have a non-NULL pointer and enough storage */
++ netsnmp_assert((NULL != appStatsDesc_val_ptr_ptr)
++ && (NULL != *appStatsDesc_val_ptr_ptr));
++ netsnmp_assert(NULL != appStatsDesc_val_ptr_len_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsDesc_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the appStatsDesc data.
++ * copy (* appStatsDesc_val_ptr_ptr ) data and (* appStatsDesc_val_ptr_len_ptr ) from rowreq_ctx->data
++ */
++ /*
++ * make sure there is enough space for appStatsDesc data
++ */
++ if ((NULL == (*appStatsDesc_val_ptr_ptr)) ||
++ ((*appStatsDesc_val_ptr_len_ptr) <
++ (rowreq_ctx->data.appStatsDesc_len *
++ sizeof(rowreq_ctx->data.appStatsDesc[0])))) {
++ /*
++ * allocate space for appStatsDesc data
++ */
++ (*appStatsDesc_val_ptr_ptr) =
++ malloc(rowreq_ctx->data.appStatsDesc_len *
++ sizeof(rowreq_ctx->data.appStatsDesc[0]));
++ if (NULL == (*appStatsDesc_val_ptr_ptr)) {
++ snmp_log(LOG_ERR, "could not allocate memory\n");
++ return MFD_ERROR;
++ }
++ }
++ (*appStatsDesc_val_ptr_len_ptr) =
++ rowreq_ctx->data.appStatsDesc_len *
++ sizeof(rowreq_ctx->data.appStatsDesc[0]);
++ memcpy((*appStatsDesc_val_ptr_ptr), rowreq_ctx->data.appStatsDesc,
++ rowreq_ctx->data.appStatsDesc_len *
++ sizeof(rowreq_ctx->data.appStatsDesc[0]));
++
++ return MFD_SUCCESS;
++} /* appStatsDesc_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppStatsEntry.appStatsNodeOrLink
++ * appStatsNodeOrLink is subid 4 of dessertAppStatsEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.4
++ * Description:
++Determines which of the appStatsMacAddress{1,2} coloumns
++ is valid and therefore indicates whether the information provided
++ by this row relates to a node or a link.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 1 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 0
++ *
++ * Enum range: 3/8. Values: none(0), node(1), link(2)
++ *
++ * Its syntax is INTEGER (based on perltype INTEGER)
++ * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
++ */
++/**
++ * map a value from its original native format to the MIB format.
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_ERROR : Any other error
++ *
++ * @note parameters follow the memset convention (dest, src).
++ *
++ * @note generation and use of this function can be turned off by re-running
++ * mib2c after adding the following line to the file
++ * defaults/node-appStatsNodeOrLink.m2d :
++ * @eval $m2c_node_skip_mapping = 1@
++ *
++ * @remark
++ * If the values for your data type don't exactly match the
++ * possible values defined by the mib, you should map them here.
++ * Otherwise, just do a direct copy.
++ */
++int
++appStatsNodeOrLink_map(u_long * mib_appStatsNodeOrLink_val_ptr,
++ u_long raw_appStatsNodeOrLink_val)
++{
++ netsnmp_assert(NULL != mib_appStatsNodeOrLink_val_ptr);
++
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsNodeOrLink_map",
++ "called\n"));
++
++ /*
++ * TODO:241:o: |-> Implement appStatsNodeOrLink enum mapping.
++ * uses INTERNAL_* macros defined in the header files
++ */
++ switch (raw_appStatsNodeOrLink_val) {
++ case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSNODEORLINK_NONE:
++ *mib_appStatsNodeOrLink_val_ptr = APPSTATSNODEORLINK_NONE;
++ break;
++
++ case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSNODEORLINK_NODE:
++ *mib_appStatsNodeOrLink_val_ptr = APPSTATSNODEORLINK_NODE;
++ break;
++
++ case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSNODEORLINK_LINK:
++ *mib_appStatsNodeOrLink_val_ptr = APPSTATSNODEORLINK_LINK;
++ break;
++
++ default:
++ snmp_log(LOG_ERR,
++ "couldn't map value %ld for appStatsNodeOrLink\n",
++ raw_appStatsNodeOrLink_val);
++ return MFD_ERROR;
++ }
++
++ return MFD_SUCCESS;
++} /* appStatsNodeOrLink_map */
++
++/**
++ * Extract the current value of the appStatsNodeOrLink data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appStatsNodeOrLink_val_ptr
++ * Pointer to storage for a long variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++appStatsNodeOrLink_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
++ u_long * appStatsNodeOrLink_val_ptr)
++{
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != appStatsNodeOrLink_val_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsNodeOrLink_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the appStatsNodeOrLink data.
++ * copy (* appStatsNodeOrLink_val_ptr ) from rowreq_ctx->data
++ */
++ (*appStatsNodeOrLink_val_ptr) = rowreq_ctx->data.appStatsNodeOrLink;
++
++ return MFD_SUCCESS;
++} /* appStatsNodeOrLink_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppStatsEntry.appStatsValueType
++ * appStatsValueType is subid 5 of dessertAppStatsEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.5
++ * Description:
++Indicates which of the coloumns (appStatsTruthValue,
++ appStatsInterger32, appStatsUInteger32, appStatsCounter64,
++ appStatsOctetString) in the dessertAppStatsTable is actually valid.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 1 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 0
++ *
++ * Enum range: 3/8. Values: bool(0), int32(1), uint32(2), counter64(3), octetstring(4)
++ *
++ * Its syntax is INTEGER (based on perltype INTEGER)
++ * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
++ */
++/**
++ * map a value from its original native format to the MIB format.
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_ERROR : Any other error
++ *
++ * @note parameters follow the memset convention (dest, src).
++ *
++ * @note generation and use of this function can be turned off by re-running
++ * mib2c after adding the following line to the file
++ * defaults/node-appStatsValueType.m2d :
++ * @eval $m2c_node_skip_mapping = 1@
++ *
++ * @remark
++ * If the values for your data type don't exactly match the
++ * possible values defined by the mib, you should map them here.
++ * Otherwise, just do a direct copy.
++ */
++int
++appStatsValueType_map(u_long * mib_appStatsValueType_val_ptr,
++ u_long raw_appStatsValueType_val)
++{
++ netsnmp_assert(NULL != mib_appStatsValueType_val_ptr);
++
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsValueType_map",
++ "called\n"));
++
++ /*
++ * TODO:241:o: |-> Implement appStatsValueType enum mapping.
++ * uses INTERNAL_* macros defined in the header files
++ */
++ switch (raw_appStatsValueType_val) {
++ case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_BOOL:
++ *mib_appStatsValueType_val_ptr = APPSTATSVALUETYPE_BOOL;
++ break;
++
++ case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_INT32:
++ *mib_appStatsValueType_val_ptr = APPSTATSVALUETYPE_INT32;
++ break;
++
++ case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_UINT32:
++ *mib_appStatsValueType_val_ptr = APPSTATSVALUETYPE_UINT32;
++ break;
++
++ case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_COUNTER64:
++ *mib_appStatsValueType_val_ptr = APPSTATSVALUETYPE_COUNTER64;
++ break;
++
++ case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_OCTETSTRING:
++ *mib_appStatsValueType_val_ptr = APPSTATSVALUETYPE_OCTETSTRING;
++ break;
++
++ default:
++ snmp_log(LOG_ERR, "couldn't map value %ld for appStatsValueType\n",
++ raw_appStatsValueType_val);
++ return MFD_ERROR;
++ }
++
++ return MFD_SUCCESS;
++} /* appStatsValueType_map */
++
++/**
++ * Extract the current value of the appStatsValueType data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appStatsValueType_val_ptr
++ * Pointer to storage for a long variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++appStatsValueType_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
++ u_long * appStatsValueType_val_ptr)
++{
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != appStatsValueType_val_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsValueType_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the appStatsValueType data.
++ * copy (* appStatsValueType_val_ptr ) from rowreq_ctx->data
++ */
++ (*appStatsValueType_val_ptr) = rowreq_ctx->data.appStatsValueType;
++
++ return MFD_SUCCESS;
++} /* appStatsValueType_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppStatsEntry.appStatsMacAddress1
++ * appStatsMacAddress1 is subid 6 of dessertAppStatsEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.6
++ * Description:
++The hardware address of a node.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 1 hashint 1
++ * settable 0
++ * hint: 1x:
++ *
++ * Ranges: 6;
++ *
++ * Its syntax is MacAddress (based on perltype OCTETSTR)
++ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
++ * This data type requires a length. (Max 6)
++ */
++/**
++ * Extract the current value of the appStatsMacAddress1 data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appStatsMacAddress1_val_ptr_ptr
++ * Pointer to storage for a char variable
++ * @param appStatsMacAddress1_val_ptr_len_ptr
++ * Pointer to a size_t. On entry, it will contain the size (in bytes)
++ * pointed to by appStatsMacAddress1.
++ * On exit, this value should contain the data size (in bytes).
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++*
++ * @note If you need more than (*appStatsMacAddress1_val_ptr_len_ptr) bytes of memory,
++ * allocate it using malloc() and update appStatsMacAddress1_val_ptr_ptr.
++ * <b>DO NOT</b> free the previous pointer.
++ * The MFD helper will release the memory you allocate.
++ *
++ * @remark If you call this function yourself, you are responsible
++ * for checking if the pointer changed, and freeing any
++ * previously allocated memory. (Not necessary if you pass
++ * in a pointer to static memory, obviously.)
++ */
++int
++appStatsMacAddress1_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
++ char **appStatsMacAddress1_val_ptr_ptr,
++ size_t *appStatsMacAddress1_val_ptr_len_ptr)
++{
++ /** we should have a non-NULL pointer and enough storage */
++ netsnmp_assert((NULL != appStatsMacAddress1_val_ptr_ptr)
++ && (NULL != *appStatsMacAddress1_val_ptr_ptr));
++ netsnmp_assert(NULL != appStatsMacAddress1_val_ptr_len_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsMacAddress1_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the appStatsMacAddress1 data.
++ * copy (* appStatsMacAddress1_val_ptr_ptr ) data and (* appStatsMacAddress1_val_ptr_len_ptr ) from rowreq_ctx->data
++ */
++ /*
++ * make sure there is enough space for appStatsMacAddress1 data
++ */
++ if ((NULL == (*appStatsMacAddress1_val_ptr_ptr)) ||
++ ((*appStatsMacAddress1_val_ptr_len_ptr) <
++ (rowreq_ctx->data.appStatsMacAddress1_len *
++ sizeof(rowreq_ctx->data.appStatsMacAddress1[0])))) {
++ /*
++ * allocate space for appStatsMacAddress1 data
++ */
++ (*appStatsMacAddress1_val_ptr_ptr) =
++ malloc(rowreq_ctx->data.appStatsMacAddress1_len *
++ sizeof(rowreq_ctx->data.appStatsMacAddress1[0]));
++ if (NULL == (*appStatsMacAddress1_val_ptr_ptr)) {
++ snmp_log(LOG_ERR, "could not allocate memory\n");
++ return MFD_ERROR;
++ }
++ }
++ (*appStatsMacAddress1_val_ptr_len_ptr) =
++ rowreq_ctx->data.appStatsMacAddress1_len *
++ sizeof(rowreq_ctx->data.appStatsMacAddress1[0]);
++ memcpy((*appStatsMacAddress1_val_ptr_ptr),
++ rowreq_ctx->data.appStatsMacAddress1,
++ rowreq_ctx->data.appStatsMacAddress1_len *
++ sizeof(rowreq_ctx->data.appStatsMacAddress1[0]));
++
++ return MFD_SUCCESS;
++} /* appStatsMacAddress1_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppStatsEntry.appStatsMacAddress2
++ * appStatsMacAddress2 is subid 7 of dessertAppStatsEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.7
++ * Description:
++The hardware address of a second node.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 1 hashint 1
++ * settable 0
++ * hint: 1x:
++ *
++ * Ranges: 6;
++ *
++ * Its syntax is MacAddress (based on perltype OCTETSTR)
++ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
++ * This data type requires a length. (Max 6)
++ */
++/**
++ * Extract the current value of the appStatsMacAddress2 data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appStatsMacAddress2_val_ptr_ptr
++ * Pointer to storage for a char variable
++ * @param appStatsMacAddress2_val_ptr_len_ptr
++ * Pointer to a size_t. On entry, it will contain the size (in bytes)
++ * pointed to by appStatsMacAddress2.
++ * On exit, this value should contain the data size (in bytes).
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++*
++ * @note If you need more than (*appStatsMacAddress2_val_ptr_len_ptr) bytes of memory,
++ * allocate it using malloc() and update appStatsMacAddress2_val_ptr_ptr.
++ * <b>DO NOT</b> free the previous pointer.
++ * The MFD helper will release the memory you allocate.
++ *
++ * @remark If you call this function yourself, you are responsible
++ * for checking if the pointer changed, and freeing any
++ * previously allocated memory. (Not necessary if you pass
++ * in a pointer to static memory, obviously.)
++ */
++int
++appStatsMacAddress2_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
++ char **appStatsMacAddress2_val_ptr_ptr,
++ size_t *appStatsMacAddress2_val_ptr_len_ptr)
++{
++ /** we should have a non-NULL pointer and enough storage */
++ netsnmp_assert((NULL != appStatsMacAddress2_val_ptr_ptr)
++ && (NULL != *appStatsMacAddress2_val_ptr_ptr));
++ netsnmp_assert(NULL != appStatsMacAddress2_val_ptr_len_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsMacAddress2_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the appStatsMacAddress2 data.
++ * copy (* appStatsMacAddress2_val_ptr_ptr ) data and (* appStatsMacAddress2_val_ptr_len_ptr ) from rowreq_ctx->data
++ */
++ /*
++ * make sure there is enough space for appStatsMacAddress2 data
++ */
++ if ((NULL == (*appStatsMacAddress2_val_ptr_ptr)) ||
++ ((*appStatsMacAddress2_val_ptr_len_ptr) <
++ (rowreq_ctx->data.appStatsMacAddress2_len *
++ sizeof(rowreq_ctx->data.appStatsMacAddress2[0])))) {
++ /*
++ * allocate space for appStatsMacAddress2 data
++ */
++ (*appStatsMacAddress2_val_ptr_ptr) =
++ malloc(rowreq_ctx->data.appStatsMacAddress2_len *
++ sizeof(rowreq_ctx->data.appStatsMacAddress2[0]));
++ if (NULL == (*appStatsMacAddress2_val_ptr_ptr)) {
++ snmp_log(LOG_ERR, "could not allocate memory\n");
++ return MFD_ERROR;
++ }
++ }
++ (*appStatsMacAddress2_val_ptr_len_ptr) =
++ rowreq_ctx->data.appStatsMacAddress2_len *
++ sizeof(rowreq_ctx->data.appStatsMacAddress2[0]);
++ memcpy((*appStatsMacAddress2_val_ptr_ptr),
++ rowreq_ctx->data.appStatsMacAddress2,
++ rowreq_ctx->data.appStatsMacAddress2_len *
++ sizeof(rowreq_ctx->data.appStatsMacAddress2[0]));
++
++ return MFD_SUCCESS;
++} /* appStatsMacAddress2_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppStatsEntry.appStatsTruthValue
++ * appStatsTruthValue is subid 8 of dessertAppStatsEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.8
++ * Description:
++A statistical datum with TruthValue semantics.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 1 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 0
++ *
++ * Enum range: 2/8. Values: true(1), false(2)
++ *
++ * Its syntax is TruthValue (based on perltype INTEGER)
++ * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
++ */
++/**
++ * map a value from its original native format to the MIB format.
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_ERROR : Any other error
++ *
++ * @note parameters follow the memset convention (dest, src).
++ *
++ * @note generation and use of this function can be turned off by re-running
++ * mib2c after adding the following line to the file
++ * defaults/node-appStatsTruthValue.m2d :
++ * @eval $m2c_node_skip_mapping = 1@
++ *
++ * @remark
++ * If the values for your data type don't exactly match the
++ * possible values defined by the mib, you should map them here.
++ * Otherwise, just do a direct copy.
++ */
++int
++appStatsTruthValue_map(u_long * mib_appStatsTruthValue_val_ptr,
++ u_long raw_appStatsTruthValue_val)
++{
++ netsnmp_assert(NULL != mib_appStatsTruthValue_val_ptr);
++
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsTruthValue_map",
++ "called\n"));
++
++ /*
++ * TODO:241:o: |-> Implement appStatsTruthValue enum mapping.
++ * uses INTERNAL_* macros defined in the header files
++ */
++ switch (raw_appStatsTruthValue_val) {
++ case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSTRUTHVALUE_TRUE:
++ *mib_appStatsTruthValue_val_ptr = TRUTHVALUE_TRUE;
++ break;
++
++ case INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSTRUTHVALUE_FALSE:
++ *mib_appStatsTruthValue_val_ptr = TRUTHVALUE_FALSE;
++ break;
++
++ default:
++ snmp_log(LOG_ERR,
++ "couldn't map value %ld for appStatsTruthValue\n",
++ raw_appStatsTruthValue_val);
++ return MFD_ERROR;
++ }
++
++ return MFD_SUCCESS;
++} /* appStatsTruthValue_map */
++
++/**
++ * Extract the current value of the appStatsTruthValue data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appStatsTruthValue_val_ptr
++ * Pointer to storage for a long variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++appStatsTruthValue_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
++ u_long * appStatsTruthValue_val_ptr)
++{
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != appStatsTruthValue_val_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsTruthValue_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the appStatsTruthValue data.
++ * copy (* appStatsTruthValue_val_ptr ) from rowreq_ctx->data
++ */
++ (*appStatsTruthValue_val_ptr) = rowreq_ctx->data.appStatsTruthValue;
++
++ return MFD_SUCCESS;
++} /* appStatsTruthValue_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppStatsEntry.appStatsInteger32
++ * appStatsInteger32 is subid 9 of dessertAppStatsEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.9
++ * Description:
++A statistical datum with Integer32 semantics.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 0
++ *
++ *
++ * Its syntax is INTEGER32 (based on perltype INTEGER32)
++ * The net-snmp type is ASN_INTEGER. The C type decl is long (long)
++ */
++/**
++ * Extract the current value of the appStatsInteger32 data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appStatsInteger32_val_ptr
++ * Pointer to storage for a long variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++appStatsInteger32_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
++ long *appStatsInteger32_val_ptr)
++{
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != appStatsInteger32_val_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsInteger32_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the appStatsInteger32 data.
++ * copy (* appStatsInteger32_val_ptr ) from rowreq_ctx->data
++ */
++ (*appStatsInteger32_val_ptr) = rowreq_ctx->data.appStatsInteger32;
++
++ return MFD_SUCCESS;
++} /* appStatsInteger32_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppStatsEntry.appStatsUnsigned32
++ * appStatsUnsigned32 is subid 10 of dessertAppStatsEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.10
++ * Description:
++A statistical datum with Unsigned32 semantics.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 0
++ *
++ *
++ * Its syntax is UNSIGNED32 (based on perltype UNSIGNED32)
++ * The net-snmp type is ASN_UNSIGNED. The C type decl is u_long (u_long)
++ */
++/**
++ * Extract the current value of the appStatsUnsigned32 data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appStatsUnsigned32_val_ptr
++ * Pointer to storage for a u_long variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++appStatsUnsigned32_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
++ u_long * appStatsUnsigned32_val_ptr)
++{
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != appStatsUnsigned32_val_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsUnsigned32_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the appStatsUnsigned32 data.
++ * copy (* appStatsUnsigned32_val_ptr ) from rowreq_ctx->data
++ */
++ (*appStatsUnsigned32_val_ptr) = rowreq_ctx->data.appStatsUnsigned32;
++
++ return MFD_SUCCESS;
++} /* appStatsUnsigned32_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppStatsEntry.appStatsCounter64
++ * appStatsCounter64 is subid 11 of dessertAppStatsEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.11
++ * Description:
++A statistical datum with Counter64 semantics.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 0
++ *
++ *
++ * Its syntax is COUNTER64 (based on perltype COUNTER64)
++ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
++ */
++/**
++ * Extract the current value of the appStatsCounter64 data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appStatsCounter64_val_ptr
++ * Pointer to storage for a U64 variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++appStatsCounter64_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
++ U64 * appStatsCounter64_val_ptr)
++{
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != appStatsCounter64_val_ptr);
++
++ /*
++ * TODO:231:o: |-> copy appStatsCounter64 data.
++ * get (* appStatsCounter64_val_ptr ).low and (* appStatsCounter64_val_ptr ).high from rowreq_ctx->data
++ */
++ (*appStatsCounter64_val_ptr).high =
++ rowreq_ctx->data.appStatsCounter64.high;
++ (*appStatsCounter64_val_ptr).low =
++ rowreq_ctx->data.appStatsCounter64.low;
++
++
++ return MFD_SUCCESS;
++} /* appStatsCounter64_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertAppStatsEntry.appStatsOctetString
++ * appStatsOctetString is subid 12 of dessertAppStatsEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.9.1.12
++ * Description:
++A statistical datum containing of up to 1024 octets.
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 1 hashint 0
++ * settable 0
++ *
++ * Ranges: 0 - 1024;
++ *
++ * Its syntax is OCTETSTR (based on perltype OCTETSTR)
++ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
++ * This data type requires a length. (Max 1024)
++ */
++/**
++ * Extract the current value of the appStatsOctetString data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param appStatsOctetString_val_ptr_ptr
++ * Pointer to storage for a char variable
++ * @param appStatsOctetString_val_ptr_len_ptr
++ * Pointer to a size_t. On entry, it will contain the size (in bytes)
++ * pointed to by appStatsOctetString.
++ * On exit, this value should contain the data size (in bytes).
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++*
++ * @note If you need more than (*appStatsOctetString_val_ptr_len_ptr) bytes of memory,
++ * allocate it using malloc() and update appStatsOctetString_val_ptr_ptr.
++ * <b>DO NOT</b> free the previous pointer.
++ * The MFD helper will release the memory you allocate.
++ *
++ * @remark If you call this function yourself, you are responsible
++ * for checking if the pointer changed, and freeing any
++ * previously allocated memory. (Not necessary if you pass
++ * in a pointer to static memory, obviously.)
++ */
++int
++appStatsOctetString_get(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
++ char **appStatsOctetString_val_ptr_ptr,
++ size_t *appStatsOctetString_val_ptr_len_ptr)
++{
++ /** we should have a non-NULL pointer and enough storage */
++ netsnmp_assert((NULL != appStatsOctetString_val_ptr_ptr)
++ && (NULL != *appStatsOctetString_val_ptr_ptr));
++ netsnmp_assert(NULL != appStatsOctetString_val_ptr_len_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:appStatsOctetString_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the appStatsOctetString data.
++ * copy (* appStatsOctetString_val_ptr_ptr ) data and (* appStatsOctetString_val_ptr_len_ptr ) from rowreq_ctx->data
++ */
++ /*
++ * make sure there is enough space for appStatsOctetString data
++ */
++ if ((NULL == (*appStatsOctetString_val_ptr_ptr)) ||
++ ((*appStatsOctetString_val_ptr_len_ptr) <
++ (rowreq_ctx->data.appStatsOctetString_len *
++ sizeof(rowreq_ctx->data.appStatsOctetString[0])))) {
++ /*
++ * allocate space for appStatsOctetString data
++ */
++ (*appStatsOctetString_val_ptr_ptr) =
++ malloc(rowreq_ctx->data.appStatsOctetString_len *
++ sizeof(rowreq_ctx->data.appStatsOctetString[0]));
++ if (NULL == (*appStatsOctetString_val_ptr_ptr)) {
++ snmp_log(LOG_ERR, "could not allocate memory\n");
++ return MFD_ERROR;
++ }
++ }
++ (*appStatsOctetString_val_ptr_len_ptr) =
++ rowreq_ctx->data.appStatsOctetString_len *
++ sizeof(rowreq_ctx->data.appStatsOctetString[0]);
++ memcpy((*appStatsOctetString_val_ptr_ptr),
++ rowreq_ctx->data.appStatsOctetString,
++ rowreq_ctx->data.appStatsOctetString_len *
++ sizeof(rowreq_ctx->data.appStatsOctetString[0]));
++
++ return MFD_SUCCESS;
++} /* appStatsOctetString_get */
++
++
++
++/** @} */
+diff --git a/src/snmp/dessertAppStatsTable_data_get.h b/src/snmp/dessertAppStatsTable_data_get.h
+new file mode 100644
+index 0000000..b109d9c
+--- /dev/null
++++ b/src/snmp/dessertAppStatsTable_data_get.h
+@@ -0,0 +1,174 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 12088 $ of $
++ *
++ * $Id:$
++ *
++ * @file dessertAppStatsTable_data_get.h
++ *
++ * @addtogroup get
++ *
++ * Prototypes for get functions
++ *
++ * @{
++ */
++#ifndef DESSERTAPPSTATSTABLE_DATA_GET_H
++#define DESSERTAPPSTATSTABLE_DATA_GET_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++ /*
++ *********************************************************************
++ * GET function declarations
++ */
++
++ /*
++ *********************************************************************
++ * GET Table declarations
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertAppStatsTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++ /*
++ * DESSERT-MIB::dessertAppStatsTable is subid 9 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.9, length: 12
++ */
++ /*
++ * indexes
++ */
++ int appStatsIndex_map(uint *mib_appStatsIndex_val_ptr, uint
++ raw_appStatsIndex_val);
++
++ int appStatsName_map(char **mib_appStatsName_val_ptr_ptr,
++ size_t
++ *mib_appStatsName_val_ptr_len_ptr,
++ char *raw_appStatsName_val_ptr,
++ size_t raw_appStatsName_val_ptr_len,
++ int allow_realloc);
++ int appStatsName_get(dessertAppStatsTable_rowreq_ctx *
++ rowreq_ctx,
++ char **appStatsName_val_ptr_ptr,
++ size_t *appStatsName_val_ptr_len_ptr);
++ int appStatsDesc_map(char **mib_appStatsDesc_val_ptr_ptr,
++ size_t
++ *mib_appStatsDesc_val_ptr_len_ptr,
++ char *raw_appStatsDesc_val_ptr,
++ size_t raw_appStatsDesc_val_ptr_len,
++ int allow_realloc);
++ int appStatsDesc_get(dessertAppStatsTable_rowreq_ctx *
++ rowreq_ctx,
++ char **appStatsDesc_val_ptr_ptr,
++ size_t *appStatsDesc_val_ptr_len_ptr);
++ int appStatsNodeOrLink_map(u_long *
++ mib_appStatsNodeOrLink_val_ptr,
++ u_long
++ raw_appStatsNodeOrLink_val);
++ int appStatsNodeOrLink_get(dessertAppStatsTable_rowreq_ctx
++ * rowreq_ctx,
++ u_long *
++ appStatsNodeOrLink_val_ptr);
++ int appStatsValueType_map(u_long *
++ mib_appStatsValueType_val_ptr,
++ u_long
++ raw_appStatsValueType_val);
++ int appStatsValueType_get(dessertAppStatsTable_rowreq_ctx *
++ rowreq_ctx,
++ u_long *
++ appStatsValueType_val_ptr);
++ int appStatsMacAddress1_map(char
++ **mib_appStatsMacAddress1_val_ptr_ptr,
++ size_t
++ *mib_appStatsMacAddress1_val_ptr_len_ptr,
++ char
++ *raw_appStatsMacAddress1_val_ptr,
++ size_t
++ raw_appStatsMacAddress1_val_ptr_len,
++ int allow_realloc);
++ int appStatsMacAddress1_get(dessertAppStatsTable_rowreq_ctx
++ * rowreq_ctx,
++ char
++ **appStatsMacAddress1_val_ptr_ptr,
++ size_t
++ *appStatsMacAddress1_val_ptr_len_ptr);
++ int appStatsMacAddress2_map(char
++ **mib_appStatsMacAddress2_val_ptr_ptr,
++ size_t
++ *mib_appStatsMacAddress2_val_ptr_len_ptr,
++ char
++ *raw_appStatsMacAddress2_val_ptr,
++ size_t
++ raw_appStatsMacAddress2_val_ptr_len,
++ int allow_realloc);
++ int appStatsMacAddress2_get(dessertAppStatsTable_rowreq_ctx
++ * rowreq_ctx,
++ char
++ **appStatsMacAddress2_val_ptr_ptr,
++ size_t
++ *appStatsMacAddress2_val_ptr_len_ptr);
++ int appStatsTruthValue_map(u_long *
++ mib_appStatsTruthValue_val_ptr,
++ u_long
++ raw_appStatsTruthValue_val);
++ int appStatsTruthValue_get(dessertAppStatsTable_rowreq_ctx
++ * rowreq_ctx,
++ u_long *
++ appStatsTruthValue_val_ptr);
++ int appStatsInteger32_map(long
++ *mib_appStatsInteger32_val_ptr,
++ long raw_appStatsInteger32_val);
++ int appStatsInteger32_get(dessertAppStatsTable_rowreq_ctx *
++ rowreq_ctx,
++ long *appStatsInteger32_val_ptr);
++ int appStatsUnsigned32_map(u_long *
++ mib_appStatsUnsigned32_val_ptr,
++ u_long
++ raw_appStatsUnsigned32_val);
++ int appStatsUnsigned32_get(dessertAppStatsTable_rowreq_ctx
++ * rowreq_ctx,
++ u_long *
++ appStatsUnsigned32_val_ptr);
++ int appStatsCounter64_map(U64 *
++ mib_appStatsCounter64_val_ptr,
++ U64 raw_appStatsCounter64_val);
++ int appStatsCounter64_get(dessertAppStatsTable_rowreq_ctx *
++ rowreq_ctx,
++ U64 * appStatsCounter64_val_ptr);
++ int appStatsOctetString_map(char
++ **mib_appStatsOctetString_val_ptr_ptr,
++ size_t
++ *mib_appStatsOctetString_val_ptr_len_ptr,
++ char
++ *raw_appStatsOctetString_val_ptr,
++ size_t
++ raw_appStatsOctetString_val_ptr_len,
++ int allow_realloc);
++ int appStatsOctetString_get(dessertAppStatsTable_rowreq_ctx
++ * rowreq_ctx,
++ char
++ **appStatsOctetString_val_ptr_ptr,
++ size_t
++ *appStatsOctetString_val_ptr_len_ptr);
++
++
++ int
++ dessertAppStatsTable_indexes_set_tbl_idx
++ (dessertAppStatsTable_mib_index * tbl_idx, long appStatsIndex_val);
++ int
++ dessertAppStatsTable_indexes_set(dessertAppStatsTable_rowreq_ctx *
++ rowreq_ctx, long appStatsIndex_val);
++
++
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTAPPSTATSTABLE_DATA_GET_H */
++/** @} */
+diff --git a/src/snmp/dessertAppStatsTable_data_set.c b/src/snmp/dessertAppStatsTable_data_set.c
+new file mode 100644
+index 0000000..68ccfda
+--- /dev/null
++++ b/src/snmp/dessertAppStatsTable_data_set.c
+@@ -0,0 +1,28 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 12077 $ of $
++ *
++ * $Id:$
++ *
++ */
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertAppStatsTable.h"
++
++
++/** @defgroup data_set data_set: Routines to set data
++ *
++ * These routines are used to set the value for individual objects. The
++ * row context is passed, along with the new value.
++ *
++ * @{
++ */
++/** @} */
+diff --git a/src/snmp/dessertAppStatsTable_data_set.h b/src/snmp/dessertAppStatsTable_data_set.h
+new file mode 100644
+index 0000000..8e65c17
+--- /dev/null
++++ b/src/snmp/dessertAppStatsTable_data_set.h
+@@ -0,0 +1,28 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 12077 $ of $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTAPPSTATSTABLE_DATA_SET_H
++#define DESSERTAPPSTATSTABLE_DATA_SET_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++ /*
++ *********************************************************************
++ * SET function declarations
++ */
++
++ /*
++ *********************************************************************
++ * SET Table declarations
++ */
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTAPPSTATSTABLE_DATA_SET_H */
+diff --git a/src/snmp/dessertAppStatsTable_enums.h b/src/snmp/dessertAppStatsTable_enums.h
+new file mode 100644
+index 0000000..beb5cc2
+--- /dev/null
++++ b/src/snmp/dessertAppStatsTable_enums.h
+@@ -0,0 +1,118 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * : generic-table-enums.m2c 12526 2005-07-15 22:41:16Z rstory $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTAPPSTATSTABLE_ENUMS_H
++#define DESSERTAPPSTATSTABLE_ENUMS_H
++
++#include <dessert/dessert.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++ /*
++ * NOTES on enums
++ * ==============
++ *
++ * Value Mapping
++ * -------------
++ * If the values for your data type don't exactly match the
++ * possible values defined by the mib, you should map them
++ * below. For example, a boolean flag (1/0) is usually represented
++ * as a TruthValue in a MIB, which maps to the values (1/2).
++ *
++ */
++/*************************************************************************
++ *************************************************************************
++ *
++ * enum definitions for table dessertAppStatsTable
++ *
++ *************************************************************************
++ *************************************************************************/
++
++/*************************************************************
++ * constants for enums for the MIB node
++ * appStatsNodeOrLink (INTEGER / ASN_INTEGER)
++ *
++ * since a Textual Convention may be referenced more than once in a
++ * MIB, protect againt redefinitions of the enum values.
++ */
++#ifndef APPSTATSNODEORLINK_ENUMS
++#define APPSTATSNODEORLINK_ENUMS
++
++#define APPSTATSNODEORLINK_NONE 0
++#define APPSTATSNODEORLINK_NODE 1
++#define APPSTATSNODEORLINK_LINK 2
++
++#endif /* APPSTATSNODEORLINK_ENUMS */
++
++ /*
++ * TODO:140:o: Define your interal representation of appStatsNodeOrLink enums.
++ * (used for value mapping; see notes at top of file)
++ */
++#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSNODEORLINK_NONE DESSERT_APPSTATS_NODEORLINK_NONE
++#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSNODEORLINK_NODE DESSERT_APPSTATS_NODEORLINK_NODE
++#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSNODEORLINK_LINK DESSERT_APPSTATS_NODEORLINK_LINK
++
++
++/*************************************************************
++ * constants for enums for the MIB node
++ * appStatsValueType (INTEGER / ASN_INTEGER)
++ *
++ * since a Textual Convention may be referenced more than once in a
++ * MIB, protect againt redefinitions of the enum values.
++ */
++#ifndef APPSTATSVALUETYPE_ENUMS
++#define APPSTATSVALUETYPE_ENUMS
++
++#define APPSTATSVALUETYPE_BOOL 0
++#define APPSTATSVALUETYPE_INT32 1
++#define APPSTATSVALUETYPE_UINT32 2
++#define APPSTATSVALUETYPE_COUNTER64 3
++#define APPSTATSVALUETYPE_OCTETSTRING 4
++
++#endif /* APPSTATSVALUETYPE_ENUMS */
++
++ /*
++ * TODO:140:o: Define your interal representation of appStatsValueType enums.
++ * (used for value mapping; see notes at top of file)
++ */
++#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_BOOL DESSERT_APPSTATS_VALUETYPE_BOOL
++#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_INT32 DESSERT_APPSTATS_VALUETYPE_INT32
++#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_UINT32 DESSERT_APPSTATS_VALUETYPE_UINT32
++#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_COUNTER64 DESSERT_APPSTATS_VALUETYPE_COUNTER64
++#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSVALUETYPE_OCTETSTRING DESSERT_APPSTATS_VALUETYPE_OCTETSTRING
++
++
++/*************************************************************
++ * constants for enums for the MIB node
++ * appStatsTruthValue (TruthValue / ASN_INTEGER)
++ *
++ * since a Textual Convention may be referenced more than once in a
++ * MIB, protect againt redefinitions of the enum values.
++ */
++#ifndef TRUTHVALUE_ENUMS
++#define TRUTHVALUE_ENUMS
++
++#define TRUTHVALUE_TRUE 1
++#define TRUTHVALUE_FALSE 2
++
++#endif /* TRUTHVALUE_ENUMS */
++
++ /*
++ * TODO:140:o: Define your interal representation of appStatsTruthValue enums.
++ * (used for value mapping; see notes at top of file)
++ */
++#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSTRUTHVALUE_TRUE DESSERT_APPSTATS_BOOL_TRUE
++#define INTERNAL_DESSERTAPPSTATSTABLE_APPSTATSTRUTHVALUE_FALSE DESSERT_APPSTATS_BOOL_FALSE
++
++
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTAPPSTATSTABLE_ENUMS_H */
+diff --git a/src/snmp/dessertAppStatsTable_interface.c b/src/snmp/dessertAppStatsTable_interface.c
+new file mode 100644
+index 0000000..b024106
+--- /dev/null
++++ b/src/snmp/dessertAppStatsTable_interface.c
+@@ -0,0 +1,1069 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 15899 $ of $
++ *
++ * $Id:$
++ */
++/*
++ * *********************************************************************
++ * *********************************************************************
++ * *********************************************************************
++ * *** ***
++ * *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
++ * *** ***
++ * *** ***
++ * *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
++ * *** ***
++ * *** ***
++ * *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
++ * *** ***
++ * *** ***
++ * *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
++ * *** ***
++ * *** ***
++ * *********************************************************************
++ * *********************************************************************
++ * *********************************************************************
++ */
++
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertAppStatsTable.h"
++
++
++#include <net-snmp/agent/table_container.h>
++#include <net-snmp/library/container.h>
++
++#include "dessertAppStatsTable_interface.h"
++
++#include <ctype.h>
++
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertAppStatsTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++/*
++ * DESSERT-MIB::dessertAppStatsTable is subid 9 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.9, length: 12
++ */
++typedef struct dessertAppStatsTable_interface_ctx_s {
++
++ netsnmp_container *container;
++ netsnmp_cache *cache;
++
++ dessertAppStatsTable_registration *user_ctx;
++
++ netsnmp_table_registration_info tbl_info;
++
++ netsnmp_baby_steps_access_methods access_multiplexer;
++
++} dessertAppStatsTable_interface_ctx;
++
++static dessertAppStatsTable_interface_ctx dessertAppStatsTable_if_ctx;
++
++static void
++_dessertAppStatsTable_container_init(dessertAppStatsTable_interface_ctx *
++ if_ctx);
++static void
++_dessertAppStatsTable_container_shutdown(dessertAppStatsTable_interface_ctx
++ * if_ctx);
++
++
++netsnmp_container *
++dessertAppStatsTable_container_get(void)
++{
++ return dessertAppStatsTable_if_ctx.container;
++}
++
++dessertAppStatsTable_registration *
++dessertAppStatsTable_registration_get(void)
++{
++ return dessertAppStatsTable_if_ctx.user_ctx;
++}
++
++dessertAppStatsTable_registration *
++dessertAppStatsTable_registration_set(dessertAppStatsTable_registration *
++ newreg)
++{
++ dessertAppStatsTable_registration *old =
++ dessertAppStatsTable_if_ctx.user_ctx;
++ dessertAppStatsTable_if_ctx.user_ctx = newreg;
++ return old;
++}
++
++int
++dessertAppStatsTable_container_size(void)
++{
++ return CONTAINER_SIZE(dessertAppStatsTable_if_ctx.container);
++}
++
++/*
++ * mfd multiplexer modes
++ */
++static Netsnmp_Node_Handler _mfd_dessertAppStatsTable_pre_request;
++static Netsnmp_Node_Handler _mfd_dessertAppStatsTable_post_request;
++static Netsnmp_Node_Handler _mfd_dessertAppStatsTable_object_lookup;
++static Netsnmp_Node_Handler _mfd_dessertAppStatsTable_get_values;
++/**
++ * @internal
++ * Initialize the table dessertAppStatsTable
++ * (Define its contents and how it's structured)
++ */
++void
++_dessertAppStatsTable_initialize_interface
++ (dessertAppStatsTable_registration * reg_ptr, u_long flags)
++{
++ netsnmp_baby_steps_access_methods *access_multiplexer =
++ &dessertAppStatsTable_if_ctx.access_multiplexer;
++ netsnmp_table_registration_info *tbl_info =
++ &dessertAppStatsTable_if_ctx.tbl_info;
++ netsnmp_handler_registration *reginfo;
++ netsnmp_mib_handler *handler;
++ int mfd_modes = 0;
++
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_dessertAppStatsTable_initialize_interface", "called\n"));
++
++
++ /*************************************************
++ *
++ * save interface context for dessertAppStatsTable
++ */
++ /*
++ * Setting up the table's definition
++ */
++ netsnmp_table_helper_add_indexes(tbl_info,ASN_INTEGER,
++ /** index: appStatsIndex */
++ 0);
++
++ /*
++ * Define the minimum and maximum accessible columns. This
++ * optimizes retrival.
++ */
++ tbl_info->min_column = DESSERTAPPSTATSTABLE_MIN_COL;
++ tbl_info->max_column = DESSERTAPPSTATSTABLE_MAX_COL;
++
++ /*
++ * save users context
++ */
++ dessertAppStatsTable_if_ctx.user_ctx = reg_ptr;
++
++ /*
++ * call data access initialization code
++ */
++ dessertAppStatsTable_init_data(reg_ptr);
++
++ /*
++ * set up the container
++ */
++ _dessertAppStatsTable_container_init(&dessertAppStatsTable_if_ctx);
++ if (NULL == dessertAppStatsTable_if_ctx.container) {
++ snmp_log(LOG_ERR,
++ "could not initialize container for dessertAppStatsTable\n");
++ return;
++ }
++
++ /*
++ * access_multiplexer: REQUIRED wrapper for get request handling
++ */
++ access_multiplexer->object_lookup =
++ _mfd_dessertAppStatsTable_object_lookup;
++ access_multiplexer->get_values = _mfd_dessertAppStatsTable_get_values;
++
++ /*
++ * no wrappers yet
++ */
++ access_multiplexer->pre_request =
++ _mfd_dessertAppStatsTable_pre_request;
++ access_multiplexer->post_request =
++ _mfd_dessertAppStatsTable_post_request;
++
++
++ /*************************************************
++ *
++ * Create a registration, save our reg data, register table.
++ */
++ DEBUGMSGTL(("dessertAppStatsTable:init_dessertAppStatsTable",
++ "Registering dessertAppStatsTable as a mibs-for-dummies table.\n"));
++ handler =
++ netsnmp_baby_steps_access_multiplexer_get(access_multiplexer);
++ reginfo =
++ netsnmp_handler_registration_create("dessertAppStatsTable",
++ handler,
++ dessertAppStatsTable_oid,
++ dessertAppStatsTable_oid_size,
++ HANDLER_CAN_BABY_STEP |
++ HANDLER_CAN_RONLY);
++ if (NULL == reginfo) {
++ snmp_log(LOG_ERR,
++ "error registering table dessertAppStatsTable\n");
++ return;
++ }
++ reginfo->my_reg_void = &dessertAppStatsTable_if_ctx;
++
++ /*************************************************
++ *
++ * set up baby steps handler, create it and inject it
++ */
++ if (access_multiplexer->object_lookup)
++ mfd_modes |= BABY_STEP_OBJECT_LOOKUP;
++ if (access_multiplexer->set_values)
++ mfd_modes |= BABY_STEP_SET_VALUES;
++ if (access_multiplexer->irreversible_commit)
++ mfd_modes |= BABY_STEP_IRREVERSIBLE_COMMIT;
++ if (access_multiplexer->object_syntax_checks)
++ mfd_modes |= BABY_STEP_CHECK_OBJECT;
++
++ if (access_multiplexer->pre_request)
++ mfd_modes |= BABY_STEP_PRE_REQUEST;
++ if (access_multiplexer->post_request)
++ mfd_modes |= BABY_STEP_POST_REQUEST;
++
++ if (access_multiplexer->undo_setup)
++ mfd_modes |= BABY_STEP_UNDO_SETUP;
++ if (access_multiplexer->undo_cleanup)
++ mfd_modes |= BABY_STEP_UNDO_CLEANUP;
++ if (access_multiplexer->undo_sets)
++ mfd_modes |= BABY_STEP_UNDO_SETS;
++
++ if (access_multiplexer->row_creation)
++ mfd_modes |= BABY_STEP_ROW_CREATE;
++ if (access_multiplexer->consistency_checks)
++ mfd_modes |= BABY_STEP_CHECK_CONSISTENCY;
++ if (access_multiplexer->commit)
++ mfd_modes |= BABY_STEP_COMMIT;
++ if (access_multiplexer->undo_commit)
++ mfd_modes |= BABY_STEP_UNDO_COMMIT;
++
++ handler = netsnmp_baby_steps_handler_get(mfd_modes);
++ netsnmp_inject_handler(reginfo, handler);
++
++ /*************************************************
++ *
++ * inject row_merge helper with prefix rootoid_len + 2 (entry.col)
++ */
++ handler = netsnmp_get_row_merge_handler(reginfo->rootoid_len + 2);
++ netsnmp_inject_handler(reginfo, handler);
++
++ /*************************************************
++ *
++ * inject container_table helper
++ */
++ handler =
++ netsnmp_container_table_handler_get(tbl_info,
++ dessertAppStatsTable_if_ctx.
++ container,
++ TABLE_CONTAINER_KEY_NETSNMP_INDEX);
++ netsnmp_inject_handler(reginfo, handler);
++
++ /*************************************************
++ *
++ * inject cache helper
++ */
++ if (NULL != dessertAppStatsTable_if_ctx.cache) {
++ handler =
++ netsnmp_cache_handler_get(dessertAppStatsTable_if_ctx.cache);
++ netsnmp_inject_handler(reginfo, handler);
++ }
++
++ /*
++ * register table
++ */
++ netsnmp_register_table(reginfo, tbl_info);
++
++} /* _dessertAppStatsTable_initialize_interface */
++
++/**
++ * @internal
++ * Shutdown the table dessertAppStatsTable
++ */
++void
++_dessertAppStatsTable_shutdown_interface(dessertAppStatsTable_registration
++ * reg_ptr)
++{
++ /*
++ * shutdown the container
++ */
++ _dessertAppStatsTable_container_shutdown(&dessertAppStatsTable_if_ctx);
++}
++
++void
++dessertAppStatsTable_valid_columns_set(netsnmp_column_info *vc)
++{
++ dessertAppStatsTable_if_ctx.tbl_info.valid_columns = vc;
++} /* dessertAppStatsTable_valid_columns_set */
++
++/**
++ * @internal
++ * convert the index component stored in the context to an oid
++ */
++int
++dessertAppStatsTable_index_to_oid(netsnmp_index * oid_idx,
++ dessertAppStatsTable_mib_index * mib_idx)
++{
++ int err = SNMP_ERR_NOERROR;
++
++ /*
++ * temp storage for parsing indexes
++ */
++ /*
++ * appStatsIndex(1)///()//L/a/w/e/r/d/h
++ */
++ netsnmp_variable_list var_appStatsIndex;
++
++ /*
++ * set up varbinds
++ */
++ memset(&var_appStatsIndex, 0x00, sizeof(var_appStatsIndex));
++ var_appStatsIndex.type = ASN_INTEGER;
++
++ /*
++ * chain temp index varbinds together
++ */
++ var_appStatsIndex.next_variable = NULL;
++
++
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_index_to_oid", "called\n"));
++
++ /*
++ * appStatsIndex(1)///()//L/a/w/e/r/d/h
++ */
++ snmp_set_var_value(&var_appStatsIndex,
++ (u_char *) & mib_idx->appStatsIndex,
++ sizeof(mib_idx->appStatsIndex));
++
++
++ err = build_oid_noalloc(oid_idx->oids, oid_idx->len, &oid_idx->len,
++ NULL, 0, &var_appStatsIndex);
++ if (err)
++ snmp_log(LOG_ERR, "error %d converting index to oid\n", err);
++
++ /*
++ * parsing may have allocated memory. free it.
++ */
++ snmp_reset_var_buffers(&var_appStatsIndex);
++
++ return err;
++} /* dessertAppStatsTable_index_to_oid */
++
++/**
++ * extract dessertAppStatsTable indexes from a netsnmp_index
++ *
++ * @retval SNMP_ERR_NOERROR : no error
++ * @retval SNMP_ERR_GENERR : error
++ */
++int
++dessertAppStatsTable_index_from_oid(netsnmp_index * oid_idx,
++ dessertAppStatsTable_mib_index *
++ mib_idx)
++{
++ int err = SNMP_ERR_NOERROR;
++
++ /*
++ * temp storage for parsing indexes
++ */
++ /*
++ * appStatsIndex(1)///()//L/a/w/e/r/d/h
++ */
++ netsnmp_variable_list var_appStatsIndex;
++
++ /*
++ * set up varbinds
++ */
++ memset(&var_appStatsIndex, 0x00, sizeof(var_appStatsIndex));
++ var_appStatsIndex.type = ASN_INTEGER;
++
++ /*
++ * chain temp index varbinds together
++ */
++ var_appStatsIndex.next_variable = NULL;
++
++
++ DEBUGMSGTL(("verbose:dessertAppStatsTable:dessertAppStatsTable_index_from_oid", "called\n"));
++
++ /*
++ * parse the oid into the individual index components
++ */
++ err = parse_oid_indexes(oid_idx->oids, oid_idx->len,
++ &var_appStatsIndex);
++ if (err == SNMP_ERR_NOERROR) {
++ /*
++ * copy out values
++ */
++ mib_idx->appStatsIndex = *((long *)var_appStatsIndex.val.string);
++
++
++ }
++
++ /*
++ * parsing may have allocated memory. free it.
++ */
++ snmp_reset_var_buffers(&var_appStatsIndex);
++
++ return err;
++} /* dessertAppStatsTable_index_from_oid */
++
++
++/*
++ *********************************************************************
++ * @internal
++ * allocate resources for a dessertAppStatsTable_rowreq_ctx
++ */
++dessertAppStatsTable_rowreq_ctx *
++dessertAppStatsTable_allocate_rowreq_ctx(void)
++{
++ dessertAppStatsTable_rowreq_ctx *rowreq_ctx =
++ SNMP_MALLOC_TYPEDEF(dessertAppStatsTable_rowreq_ctx);
++
++ DEBUGMSGTL(("internal:dessertAppStatsTable:dessertAppStatsTable_allocate_rowreq_ctx", "called\n"));
++
++ if (NULL == rowreq_ctx) {
++ snmp_log(LOG_ERR, "Couldn't allocate memory for a "
++ "dessertAppStatsTable_rowreq_ctx.\n");
++ return NULL;
++ }
++
++ rowreq_ctx->oid_idx.oids = rowreq_ctx->oid_tmp;
++
++ rowreq_ctx->dessertAppStatsTable_data_list = NULL;
++
++
++ return rowreq_ctx;
++} /* dessertAppStatsTable_allocate_rowreq_ctx */
++
++/*
++ * @internal
++ * release resources for a dessertAppStatsTable_rowreq_ctx
++ */
++void
++dessertAppStatsTable_release_rowreq_ctx(dessertAppStatsTable_rowreq_ctx *
++ rowreq_ctx)
++{
++ DEBUGMSGTL(("internal:dessertAppStatsTable:dessertAppStatsTable_release_rowreq_ctx", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++
++ /*
++ * free index oid pointer
++ */
++ if (rowreq_ctx->oid_idx.oids != rowreq_ctx->oid_tmp)
++ free(rowreq_ctx->oid_idx.oids);
++
++ SNMP_FREE(rowreq_ctx);
++} /* dessertAppStatsTable_release_rowreq_ctx */
++
++/**
++ * @internal
++ * wrapper
++ */
++static int
++_mfd_dessertAppStatsTable_pre_request(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration
++ *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ int rc;
++
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_pre_request", "called\n"));
++
++ if (1 != netsnmp_row_merge_status_first(reginfo, agtreq_info)) {
++ DEBUGMSGTL(("internal:dessertAppStatsTable",
++ "skipping additional pre_request\n"));
++ return SNMP_ERR_NOERROR;
++ }
++
++ rc = dessertAppStatsTable_pre_request(dessertAppStatsTable_if_ctx.
++ user_ctx);
++ if (MFD_SUCCESS != rc) {
++ /*
++ * nothing we can do about it but log it
++ */
++ DEBUGMSGTL(("dessertAppStatsTable", "error %d from "
++ "dessertAppStatsTable_pre_request\n", rc));
++ netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
++ }
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertAppStatsTable_pre_request */
++
++/**
++ * @internal
++ * wrapper
++ */
++static int
++_mfd_dessertAppStatsTable_post_request(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration
++ *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ dessertAppStatsTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++ int rc, packet_rc;
++
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_post_request", "called\n"));
++
++ /*
++ * release row context, if deleted
++ */
++ if (rowreq_ctx && (rowreq_ctx->rowreq_flags & MFD_ROW_DELETED))
++ dessertAppStatsTable_release_rowreq_ctx(rowreq_ctx);
++
++ /*
++ * wait for last call before calling user
++ */
++ if (1 != netsnmp_row_merge_status_last(reginfo, agtreq_info)) {
++ DEBUGMSGTL(("internal:dessertAppStatsTable",
++ "waiting for last post_request\n"));
++ return SNMP_ERR_NOERROR;
++ }
++
++ packet_rc = netsnmp_check_all_requests_error(agtreq_info->asp, 0);
++ rc = dessertAppStatsTable_post_request(dessertAppStatsTable_if_ctx.
++ user_ctx, packet_rc);
++ if (MFD_SUCCESS != rc) {
++ /*
++ * nothing we can do about it but log it
++ */
++ DEBUGMSGTL(("dessertAppStatsTable", "error %d from "
++ "dessertAppStatsTable_post_request\n", rc));
++ }
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertAppStatsTable_post_request */
++
++/**
++ * @internal
++ * wrapper
++ */
++static int
++_mfd_dessertAppStatsTable_object_lookup(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration
++ *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ int rc = SNMP_ERR_NOERROR;
++ dessertAppStatsTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_object_lookup", "called\n"));
++
++ /*
++ * get our context from mfd
++ * dessertAppStatsTable_interface_ctx *if_ctx =
++ * (dessertAppStatsTable_interface_ctx *)reginfo->my_reg_void;
++ */
++
++ if (NULL == rowreq_ctx) {
++ rc = SNMP_ERR_NOCREATION;
++ }
++
++ if (MFD_SUCCESS != rc)
++ netsnmp_request_set_error_all(requests, rc);
++ else
++ dessertAppStatsTable_row_prep(rowreq_ctx);
++
++ return SNMP_VALIDATE_ERR(rc);
++} /* _mfd_dessertAppStatsTable_object_lookup */
++
++/***********************************************************************
++ *
++ * GET processing
++ *
++ ***********************************************************************/
++/*
++ * @internal
++ * Retrieve the value for a particular column
++ */
++NETSNMP_STATIC_INLINE int
++_dessertAppStatsTable_get_column(dessertAppStatsTable_rowreq_ctx *
++ rowreq_ctx, netsnmp_variable_list * var,
++ int column)
++{
++ int rc = SNMPERR_SUCCESS;
++
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "called for %d\n", column));
++
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ switch (column) {
++
++ /*
++ * appStatsName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ case COLUMN_APPSTATSNAME:
++ if (!(COLUMN_APPSTATSNAME_FLAG & rowreq_ctx->column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsName) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->type = ASN_OCTET_STR;
++ rc = appStatsName_get(rowreq_ctx, (char **) &var->val.string,
++ &var->val_len);
++ break;
++
++ /*
++ * appStatsDesc(3)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ case COLUMN_APPSTATSDESC:
++ if (!(COLUMN_APPSTATSDESC_FLAG & rowreq_ctx->column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsDesc) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->type = ASN_OCTET_STR;
++ rc = appStatsDesc_get(rowreq_ctx, (char **) &var->val.string,
++ &var->val_len);
++ break;
++
++ /*
++ * appStatsNodeOrLink(4)/INTEGER/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
++ */
++ case COLUMN_APPSTATSNODEORLINK:
++ if (!
++ (COLUMN_APPSTATSNODEORLINK_FLAG & rowreq_ctx->
++ column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsNodeOrLink) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->val_len = sizeof(u_long);
++ var->type = ASN_INTEGER;
++ rc = appStatsNodeOrLink_get(rowreq_ctx,
++ (u_long *) var->val.string);
++ break;
++
++ /*
++ * appStatsValueType(5)/INTEGER/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
++ */
++ case COLUMN_APPSTATSVALUETYPE:
++ if (!
++ (COLUMN_APPSTATSVALUETYPE_FLAG & rowreq_ctx->
++ column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsValueType) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->val_len = sizeof(u_long);
++ var->type = ASN_INTEGER;
++ rc = appStatsValueType_get(rowreq_ctx, (u_long *) var->val.string);
++ break;
++
++ /*
++ * appStatsMacAddress1(6)/MacAddress/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ case COLUMN_APPSTATSMACADDRESS1:
++ if (!
++ (COLUMN_APPSTATSMACADDRESS1_FLAG & rowreq_ctx->
++ column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsMacAddress1) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->type = ASN_OCTET_STR;
++ rc = appStatsMacAddress1_get(rowreq_ctx,
++ (char **) &var->val.string,
++ &var->val_len);
++ break;
++
++ /*
++ * appStatsMacAddress2(7)/MacAddress/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ case COLUMN_APPSTATSMACADDRESS2:
++ if (!
++ (COLUMN_APPSTATSMACADDRESS2_FLAG & rowreq_ctx->
++ column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsMacAddress2) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->type = ASN_OCTET_STR;
++ rc = appStatsMacAddress2_get(rowreq_ctx,
++ (char **) &var->val.string,
++ &var->val_len);
++ break;
++
++ /*
++ * appStatsTruthValue(8)/TruthValue/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
++ */
++ case COLUMN_APPSTATSTRUTHVALUE:
++ if (!
++ (COLUMN_APPSTATSTRUTHVALUE_FLAG & rowreq_ctx->
++ column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsTruthValue) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->val_len = sizeof(u_long);
++ var->type = ASN_INTEGER;
++ rc = appStatsTruthValue_get(rowreq_ctx,
++ (u_long *) var->val.string);
++ break;
++
++ /*
++ * appStatsInteger32(9)/INTEGER32/ASN_INTEGER/long(long)//l/A/w/e/r/d/h
++ */
++ case COLUMN_APPSTATSINTEGER32:
++ if (!
++ (COLUMN_APPSTATSINTEGER32_FLAG & rowreq_ctx->
++ column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsInteger32) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->val_len = sizeof(long);
++ var->type = ASN_INTEGER;
++ rc = appStatsInteger32_get(rowreq_ctx, (long *) var->val.string);
++ break;
++
++ /*
++ * appStatsUnsigned32(10)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/w/e/r/d/h
++ */
++ case COLUMN_APPSTATSUNSIGNED32:
++ if (!
++ (COLUMN_APPSTATSUNSIGNED32_FLAG & rowreq_ctx->
++ column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsUnsigned32) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->val_len = sizeof(u_long);
++ var->type = ASN_UNSIGNED;
++ rc = appStatsUnsigned32_get(rowreq_ctx,
++ (u_long *) var->val.string);
++ break;
++
++ /*
++ * appStatsCounter64(11)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ case COLUMN_APPSTATSCOUNTER64:
++ if (!
++ (COLUMN_APPSTATSCOUNTER64_FLAG & rowreq_ctx->
++ column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsCounter64) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->val_len = sizeof(U64);
++ var->type = ASN_COUNTER64;
++ rc = appStatsCounter64_get(rowreq_ctx, (U64 *) var->val.string);
++ break;
++
++ /*
++ * appStatsOctetString(12)/OCTETSTR/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/h
++ */
++ case COLUMN_APPSTATSOCTETSTRING:
++ if (!
++ (COLUMN_APPSTATSOCTETSTRING_FLAG & rowreq_ctx->
++ column_exists_flags)) {
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "column %d (appStatsOctetString) doesn't exist\n", column));
++ return MFD_SKIP;
++ }
++
++ var->type = ASN_OCTET_STR;
++ rc = appStatsOctetString_get(rowreq_ctx,
++ (char **) &var->val.string,
++ &var->val_len);
++ break;
++
++ default:
++ if (DESSERTAPPSTATSTABLE_MIN_COL <= column
++ && column <= DESSERTAPPSTATSTABLE_MAX_COL) {
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_column", "assume column %d is reserved\n", column));
++ rc = MFD_SKIP;
++ } else {
++ snmp_log(LOG_ERR,
++ "unknown column %d in _dessertAppStatsTable_get_column\n",
++ column);
++ }
++ break;
++ }
++
++ return rc;
++} /* _dessertAppStatsTable_get_column */
++
++int
++_mfd_dessertAppStatsTable_get_values(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ dessertAppStatsTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++ netsnmp_table_request_info *tri;
++ u_char *old_string;
++ void (*dataFreeHook) (void *);
++ int rc;
++
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_values", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ DEBUGMSGTL(("9:dessertAppStatsTable:_mfd_dessertAppStatsTable_get_values", "exists %p\n", rowreq_ctx->column_exists_flags));
++
++ for (; requests; requests = requests->next) {
++ /*
++ * save old pointer, so we can free it if replaced
++ */
++ old_string = requests->requestvb->val.string;
++ dataFreeHook = requests->requestvb->dataFreeHook;
++ if (NULL == requests->requestvb->val.string) {
++ requests->requestvb->val.string = requests->requestvb->buf;
++ requests->requestvb->val_len =
++ sizeof(requests->requestvb->buf);
++ } else if (requests->requestvb->buf ==
++ requests->requestvb->val.string) {
++ if (requests->requestvb->val_len !=
++ sizeof(requests->requestvb->buf))
++ requests->requestvb->val_len =
++ sizeof(requests->requestvb->buf);
++ }
++
++ /*
++ * get column data
++ */
++ tri = netsnmp_extract_table_info(requests);
++ if (NULL == tri)
++ continue;
++
++ rc = _dessertAppStatsTable_get_column(rowreq_ctx,
++ requests->requestvb,
++ tri->colnum);
++ if (rc) {
++ if (MFD_SKIP == rc) {
++ requests->requestvb->type = SNMP_NOSUCHINSTANCE;
++ rc = SNMP_ERR_NOERROR;
++ }
++ } else if (NULL == requests->requestvb->val.string) {
++ snmp_log(LOG_ERR, "NULL varbind data pointer!\n");
++ rc = SNMP_ERR_GENERR;
++ }
++ if (rc)
++ netsnmp_request_set_error(requests, SNMP_VALIDATE_ERR(rc));
++
++ /*
++ * if the buffer wasn't used previously for the old data (i.e. it
++ * was allcoated memory) and the get routine replaced the pointer,
++ * we need to free the previous pointer.
++ */
++ if (old_string && (old_string != requests->requestvb->buf) &&
++ (requests->requestvb->val.string != old_string)) {
++ if (dataFreeHook)
++ (*dataFreeHook) (old_string);
++ else
++ free(old_string);
++ }
++ } /* for results */
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertAppStatsTable_get_values */
++
++
++/***********************************************************************
++ *
++ * SET processing
++ *
++ ***********************************************************************/
++
++/*
++ * SET PROCESSING NOT APPLICABLE (per MIB or user setting)
++ */
++/***********************************************************************
++ *
++ * DATA ACCESS
++ *
++ ***********************************************************************/
++static void _container_free(netsnmp_container * container);
++
++/**
++ * @internal
++ */
++static int
++_cache_load(netsnmp_cache * cache, void *vmagic)
++{
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_cache_load", "called\n"));
++
++ if ((NULL == cache) || (NULL == cache->magic)) {
++ snmp_log(LOG_ERR,
++ "invalid cache for dessertAppStatsTable_cache_load\n");
++ return -1;
++ }
++
++ /** should only be called for an invalid or expired cache */
++ netsnmp_assert((0 == cache->valid) || (1 == cache->expired));
++
++ /*
++ * call user code
++ */
++ return dessertAppStatsTable_container_load((netsnmp_container *)
++ cache->magic);
++} /* _cache_load */
++
++/**
++ * @internal
++ */
++static void
++_cache_free(netsnmp_cache * cache, void *magic)
++{
++ netsnmp_container *container;
++
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_cache_free", "called\n"));
++
++ if ((NULL == cache) || (NULL == cache->magic)) {
++ snmp_log(LOG_ERR,
++ "invalid cache in dessertAppStatsTable_cache_free\n");
++ return;
++ }
++
++ container = (netsnmp_container *) cache->magic;
++
++ _container_free(container);
++} /* _cache_free */
++
++/**
++ * @internal
++ */
++static void
++_container_item_free(dessertAppStatsTable_rowreq_ctx * rowreq_ctx,
++ void *context)
++{
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_container_item_free",
++ "called\n"));
++
++ if (NULL == rowreq_ctx)
++ return;
++
++ dessertAppStatsTable_release_rowreq_ctx(rowreq_ctx);
++} /* _container_item_free */
++
++/**
++ * @internal
++ */
++static void
++_container_free(netsnmp_container * container)
++{
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_container_free",
++ "called\n"));
++
++ if (NULL == container) {
++ snmp_log(LOG_ERR,
++ "invalid container in dessertAppStatsTable_container_free\n");
++ return;
++ }
++
++ /*
++ * call user code
++ */
++ dessertAppStatsTable_container_free(container);
++
++ /*
++ * free all items. inefficient, but easy.
++ */
++ CONTAINER_CLEAR(container,
++ (netsnmp_container_obj_func *) _container_item_free,
++ NULL);
++} /* _container_free */
++
++/**
++ * @internal
++ * initialize the container with functions or wrappers
++ */
++void
++_dessertAppStatsTable_container_init(dessertAppStatsTable_interface_ctx *
++ if_ctx)
++{
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_dessertAppStatsTable_container_init", "called\n"));
++
++ /*
++ * cache init
++ */
++ if_ctx->cache = netsnmp_cache_create(30, /* timeout in seconds */
++ _cache_load, _cache_free,
++ dessertAppStatsTable_oid,
++ dessertAppStatsTable_oid_size);
++
++ if (NULL == if_ctx->cache) {
++ snmp_log(LOG_ERR,
++ "error creating cache for dessertAppStatsTable\n");
++ return;
++ }
++
++ if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;
++
++ dessertAppStatsTable_container_init(&if_ctx->container, if_ctx->cache);
++ if (NULL == if_ctx->container)
++ if_ctx->container =
++ netsnmp_container_find("dessertAppStatsTable:table_container");
++ if (NULL == if_ctx->container) {
++ snmp_log(LOG_ERR, "error creating container in "
++ "dessertAppStatsTable_container_init\n");
++ return;
++ }
++
++ if (NULL != if_ctx->cache)
++ if_ctx->cache->magic = (void *) if_ctx->container;
++} /* _dessertAppStatsTable_container_init */
++
++/**
++ * @internal
++ * shutdown the container with functions or wrappers
++ */
++void
++_dessertAppStatsTable_container_shutdown(dessertAppStatsTable_interface_ctx
++ * if_ctx)
++{
++ DEBUGMSGTL(("internal:dessertAppStatsTable:_dessertAppStatsTable_container_shutdown", "called\n"));
++
++ dessertAppStatsTable_container_shutdown(if_ctx->container);
++
++ _container_free(if_ctx->container);
++
++} /* _dessertAppStatsTable_container_shutdown */
++
++
++dessertAppStatsTable_rowreq_ctx *
++dessertAppStatsTable_row_find_by_mib_index(dessertAppStatsTable_mib_index *
++ mib_idx)
++{
++ dessertAppStatsTable_rowreq_ctx *rowreq_ctx;
++ oid oid_tmp[MAX_OID_LEN];
++ netsnmp_index oid_idx;
++ int rc;
++
++ /*
++ * set up storage for OID
++ */
++ oid_idx.oids = oid_tmp;
++ oid_idx.len = sizeof(oid_tmp) / sizeof(oid);
++
++ /*
++ * convert
++ */
++ rc = dessertAppStatsTable_index_to_oid(&oid_idx, mib_idx);
++ if (MFD_SUCCESS != rc)
++ return NULL;
++
++ rowreq_ctx =
++ CONTAINER_FIND(dessertAppStatsTable_if_ctx.container, &oid_idx);
++
++ return rowreq_ctx;
++}
+diff --git a/src/snmp/dessertAppStatsTable_interface.h b/src/snmp/dessertAppStatsTable_interface.h
+new file mode 100644
+index 0000000..7fa936e
+--- /dev/null
++++ b/src/snmp/dessertAppStatsTable_interface.h
+@@ -0,0 +1,98 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 15899 $ of $
++ *
++ * $Id:$
++ */
++/** @ingroup interface: Routines to interface to Net-SNMP
++ *
++ * \warning This code should not be modified, called directly,
++ * or used to interpret functionality. It is subject to
++ * change at any time.
++ *
++ * @{
++ */
++/*
++ * *********************************************************************
++ * *********************************************************************
++ * *********************************************************************
++ * *** ***
++ * *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
++ * *** ***
++ * *** ***
++ * *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
++ * *** ***
++ * *** ***
++ * *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
++ * *** ***
++ * *** ***
++ * *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
++ * *** ***
++ * *** ***
++ * *********************************************************************
++ * *********************************************************************
++ * *********************************************************************
++ */
++#ifndef DESSERTAPPSTATSTABLE_INTERFACE_H
++#define DESSERTAPPSTATSTABLE_INTERFACE_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++#include "dessertAppStatsTable.h"
++
++
++ /*
++ ********************************************************************
++ * Table declarations
++ */
++
++ /*
++ * PUBLIC interface initialization routine
++ */
++ void
++ _dessertAppStatsTable_initialize_interface
++ (dessertAppStatsTable_registration * user_ctx, u_long flags);
++ void
++ _dessertAppStatsTable_shutdown_interface
++ (dessertAppStatsTable_registration * user_ctx);
++
++ dessertAppStatsTable_registration
++ *dessertAppStatsTable_registration_get(void);
++
++ dessertAppStatsTable_registration
++ *dessertAppStatsTable_registration_set
++ (dessertAppStatsTable_registration * newreg);
++
++ netsnmp_container *dessertAppStatsTable_container_get(void);
++ int dessertAppStatsTable_container_size(void);
++
++ dessertAppStatsTable_rowreq_ctx
++ *dessertAppStatsTable_allocate_rowreq_ctx(void);
++ void
++ dessertAppStatsTable_release_rowreq_ctx
++ (dessertAppStatsTable_rowreq_ctx * rowreq_ctx);
++
++ int dessertAppStatsTable_index_to_oid(netsnmp_index *
++ oid_idx,
++ dessertAppStatsTable_mib_index
++ * mib_idx);
++ int dessertAppStatsTable_index_from_oid(netsnmp_index *
++ oid_idx,
++ dessertAppStatsTable_mib_index
++ * mib_idx);
++
++ /*
++ * access to certain internals. use with caution!
++ */
++ void
++ dessertAppStatsTable_valid_columns_set(netsnmp_column_info *vc);
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTAPPSTATSTABLE_INTERFACE_H */
++/** @} */
+diff --git a/src/snmp/dessertAppStatsTable_oids.h b/src/snmp/dessertAppStatsTable_oids.h
+new file mode 100644
+index 0000000..2eba41a
+--- /dev/null
++++ b/src/snmp/dessertAppStatsTable_oids.h
+@@ -0,0 +1,64 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * : generic-table-oids.m2c 12855 2005-09-27 15:56:08Z rstory $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTAPPSTATSTABLE_OIDS_H
++#define DESSERTAPPSTATSTABLE_OIDS_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++ /*
++ * column number definitions for table dessertAppStatsTable
++ */
++#define DESSERTAPPSTATSTABLE_OID 1,3,6,1,4,1,18898,0,19,10,1,1,8
++
++#define COLUMN_APPSTATSINDEX 1
++
++#define COLUMN_APPSTATSNAME 2
++#define COLUMN_APPSTATSNAME_FLAG (0x1 << 1)
++
++#define COLUMN_APPSTATSDESC 3
++#define COLUMN_APPSTATSDESC_FLAG (0x1 << 2)
++
++#define COLUMN_APPSTATSNODEORLINK 4
++#define COLUMN_APPSTATSNODEORLINK_FLAG (0x1 << 3)
++
++#define COLUMN_APPSTATSVALUETYPE 5
++#define COLUMN_APPSTATSVALUETYPE_FLAG (0x1 << 4)
++
++#define COLUMN_APPSTATSMACADDRESS1 6
++#define COLUMN_APPSTATSMACADDRESS1_FLAG (0x1 << 5)
++
++#define COLUMN_APPSTATSMACADDRESS2 7
++#define COLUMN_APPSTATSMACADDRESS2_FLAG (0x1 << 6)
++
++#define COLUMN_APPSTATSTRUTHVALUE 8
++#define COLUMN_APPSTATSTRUTHVALUE_FLAG (0x1 << 7)
++
++#define COLUMN_APPSTATSINTEGER32 9
++#define COLUMN_APPSTATSINTEGER32_FLAG (0x1 << 8)
++
++#define COLUMN_APPSTATSUNSIGNED32 10
++#define COLUMN_APPSTATSUNSIGNED32_FLAG (0x1 << 9)
++
++#define COLUMN_APPSTATSCOUNTER64 11
++#define COLUMN_APPSTATSCOUNTER64_FLAG (0x1 << 10)
++
++#define COLUMN_APPSTATSOCTETSTRING 12
++#define COLUMN_APPSTATSOCTETSTRING_FLAG (0x1 << 11)
++
++
++#define DESSERTAPPSTATSTABLE_MIN_COL COLUMN_APPSTATSNAME
++#define DESSERTAPPSTATSTABLE_MAX_COL COLUMN_APPSTATSOCTETSTRING
++
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTAPPSTATSTABLE_OIDS_H */
+diff --git a/src/snmp/dessertMeshifTable.c b/src/snmp/dessertMeshifTable.c
+new file mode 100644
+index 0000000..4c1c049
+--- /dev/null
++++ b/src/snmp/dessertMeshifTable.c
+@@ -0,0 +1,214 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 14170 $ of $
++ *
++ * $Id:$
++ */
++/** \page MFD helper for dessertMeshifTable
++ *
++ * \section intro Introduction
++ * Introductory text.
++ *
++ */
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertMeshifTable.h"
++
++#include <net-snmp/agent/mib_modules.h>
++
++#include "dessertMeshifTable_interface.h"
++
++oid dessertMeshifTable_oid[] = { DESSERTMESHIFTABLE_OID };
++
++int dessertMeshifTable_oid_size =
++OID_LENGTH(dessertMeshifTable_oid);
++
++dessertMeshifTable_registration dessertMeshifTable_user_context;
++
++void initialize_table_dessertMeshifTable(void);
++void shutdown_table_dessertMeshifTable(void);
++
++
++/**
++ * Initializes the dessertMeshifTable module
++ */
++void
++init_dessertMeshifTable(void)
++{
++ DEBUGMSGTL(("verbose:dessertMeshifTable:init_dessertMeshifTable",
++ "called\n"));
++
++ /*
++ * TODO:300:o: Perform dessertMeshifTable one-time module initialization.
++ */
++
++ /*
++ * here we initialize all the tables we're planning on supporting
++ */
++ if (should_init("dessertMeshifTable"))
++ initialize_table_dessertMeshifTable();
++
++} /* init_dessertMeshifTable */
++
++/**
++ * Shut-down the dessertMeshifTable module (agent is exiting)
++ */
++void
++shutdown_dessertMeshifTable(void)
++{
++ if (should_init("dessertMeshifTable"))
++ shutdown_table_dessertMeshifTable();
++
++}
++
++/**
++ * Initialize the table dessertMeshifTable
++ * (Define its contents and how it's structured)
++ */
++void
++initialize_table_dessertMeshifTable(void)
++{
++ dessertMeshifTable_registration *user_context;
++ u_long flags;
++
++ DEBUGMSGTL(("verbose:dessertMeshifTable:initialize_table_dessertMeshifTable", "called\n"));
++
++ /*
++ * TODO:301:o: Perform dessertMeshifTable one-time table initialization.
++ */
++
++ /*
++ * TODO:302:o: |->Initialize dessertMeshifTable user context
++ * if you'd like to pass in a pointer to some data for this
++ * table, allocate or set it up here.
++ */
++ /*
++ * a netsnmp_data_list is a simple way to store void pointers. A simple
++ * string token is used to add, find or remove pointers.
++ */
++ user_context =
++ netsnmp_create_data_list("dessertMeshifTable", NULL, NULL);
++
++ /*
++ * No support for any flags yet, but in the future you would
++ * set any flags here.
++ */
++ flags = 0;
++
++ /*
++ * call interface initialization code
++ */
++ _dessertMeshifTable_initialize_interface(user_context, flags);
++} /* initialize_table_dessertMeshifTable */
++
++/**
++ * Shutdown the table dessertMeshifTable
++ */
++void
++shutdown_table_dessertMeshifTable(void)
++{
++ /*
++ * call interface shutdown code
++ */
++ _dessertMeshifTable_shutdown_interface
++ (&dessertMeshifTable_user_context);
++}
++
++/**
++ * extra context initialization (eg default values)
++ *
++ * @param rowreq_ctx : row request context
++ * @param user_init_ctx : void pointer for user (parameter to rowreq_ctx_allocate)
++ *
++ * @retval MFD_SUCCESS : no errors
++ * @retval MFD_ERROR : error (context allocate will fail)
++ */
++int
++dessertMeshifTable_rowreq_ctx_init(dessertMeshifTable_rowreq_ctx *
++ rowreq_ctx, void *user_init_ctx)
++{
++ DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_rowreq_ctx_init", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:210:o: |-> Perform extra dessertMeshifTable rowreq initialization. (eg DEFVALS)
++ */
++
++ return MFD_SUCCESS;
++} /* dessertMeshifTable_rowreq_ctx_init */
++
++/**
++ * extra context cleanup
++ *
++ */
++void
++dessertMeshifTable_rowreq_ctx_cleanup(dessertMeshifTable_rowreq_ctx *
++ rowreq_ctx)
++{
++ DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_rowreq_ctx_cleanup", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:211:o: |-> Perform extra dessertMeshifTable rowreq cleanup.
++ */
++} /* dessertMeshifTable_rowreq_ctx_cleanup */
++
++/**
++ * pre-request callback
++ *
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error
++ */
++int
++dessertMeshifTable_pre_request(dessertMeshifTable_registration *
++ user_context)
++{
++ DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_pre_request", "called\n"));
++
++ /*
++ * TODO:510:o: Perform dessertMeshifTable pre-request actions.
++ */
++
++ return MFD_SUCCESS;
++} /* dessertMeshifTable_pre_request */
++
++/**
++ * post-request callback
++ *
++ * Note:
++ * New rows have been inserted into the container, and
++ * deleted rows have been removed from the container and
++ * released.
++ *
++ * @param user_context
++ * @param rc : MFD_SUCCESS if all requests succeeded
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error (ignored)
++ */
++int
++dessertMeshifTable_post_request(dessertMeshifTable_registration *
++ user_context, int rc)
++{
++ DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_post_request", "called\n"));
++
++ /*
++ * TODO:511:o: Perform dessertMeshifTable post-request actions.
++ */
++
++ return MFD_SUCCESS;
++} /* dessertMeshifTable_post_request */
++
++
++/** @{ */
+diff --git a/src/snmp/dessertMeshifTable.h b/src/snmp/dessertMeshifTable.h
+new file mode 100644
+index 0000000..afa9b3a
+--- /dev/null
++++ b/src/snmp/dessertMeshifTable.h
+@@ -0,0 +1,222 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 14170 $ of $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTMESHIFTABLE_H
++#define DESSERTMESHIFTABLE_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/** @addtogroup misc misc: Miscellaneous routines
++ *
++ * @{
++ */
++#include <net-snmp/library/asn1.h>
++
++/*
++ * other required module components
++ */
++/* *INDENT-OFF* */
++config_add_mib(DESSERT-MIB)
++config_require(DESSERT-MIB/dessertMeshifTable/dessertMeshifTable_interface)
++config_require(DESSERT-MIB/dessertMeshifTable/dessertMeshifTable_data_access)
++config_require(DESSERT-MIB/dessertMeshifTable/dessertMeshifTable_data_get)
++config_require(DESSERT-MIB/dessertMeshifTable/dessertMeshifTable_data_set)
++/* *INDENT-ON* */
++
++/*
++ * OID and column number definitions for dessertMeshifTable
++ */
++#include "dessertMeshifTable_oids.h"
++
++/*
++ * enum definions
++ */
++#include "dessertMeshifTable_enums.h"
++
++/*
++ *********************************************************************
++ * function declarations
++ */
++void init_dessertMeshifTable(void);
++void shutdown_dessertMeshifTable(void);
++
++/*
++ *********************************************************************
++ * Table declarations
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertMeshifTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++/*
++ * DESSERT-MIB::dessertMeshifTable is subid 5 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.5, length: 12
++ */
++/*
++ *********************************************************************
++ * When you register your mib, you get to provide a generic
++ * pointer that will be passed back to you for most of the
++ * functions calls.
++ *
++ * TODO:100:r: Review all context structures
++ */
++/*
++ * TODO:101:o: |-> Review dessertMeshifTable registration context.
++ */
++typedef netsnmp_data_list dessertMeshifTable_registration;
++
++/**********************************************************************/
++/*
++ * TODO:110:r: |-> Review dessertMeshifTable data context structure.
++ * This structure is used to represent the data for dessertMeshifTable.
++ */
++/*
++ * This structure contains storage for all the columns defined in the
++ * dessertMeshifTable.
++ */
++typedef struct dessertMeshifTable_data_s {
++
++ /*
++ * meshifName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ char meshifName[255];
++ size_t meshifName_len; /* # of char elements, not bytes */
++
++ /*
++ * meshifMacAddress(3)/MacAddress/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ char meshifMacAddress[6];
++ size_t meshifMacAddress_len; /* # of char elements, not bytes */
++
++ /*
++ * meshifInPkts(4)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ U64 meshifInPkts;
++
++ /*
++ * meshifOutPkts(5)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ U64 meshifOutPkts;
++
++ /*
++ * meshifInOctets(6)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ U64 meshifInOctets;
++
++ /*
++ * meshifOutOctets(7)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ U64 meshifOutOctets;
++
++} dessertMeshifTable_data;
++
++/*
++ * TODO:120:r: |-> Review dessertMeshifTable mib index.
++ * This structure is used to represent the index for dessertMeshifTable.
++ */
++typedef struct dessertMeshifTable_mib_index_s {
++
++ /*
++ * meshifIndex(1)///()//L/a/w/e/r/d/h
++ */
++ long meshifIndex;
++
++} dessertMeshifTable_mib_index;
++
++/*
++ * TODO:121:r: | |-> Review dessertMeshifTable max index length.
++ * If you KNOW that your indexes will never exceed a certain
++ * length, update this macro to that length.
++ */
++#define MAX_dessertMeshifTable_IDX_LEN 1
++
++/*
++ *********************************************************************
++ * TODO:130:o: |-> Review dessertMeshifTable Row request (rowreq) context.
++ * When your functions are called, you will be passed a
++ * dessertMeshifTable_rowreq_ctx pointer.
++ */
++typedef struct dessertMeshifTable_rowreq_ctx_s {
++
++ /** this must be first for container compare to work */
++ netsnmp_index oid_idx;
++ oid oid_tmp[MAX_dessertMeshifTable_IDX_LEN];
++
++ dessertMeshifTable_mib_index tbl_idx;
++
++ dessertMeshifTable_data data;
++
++ /*
++ * flags per row. Currently, the first (lower) 8 bits are reserved
++ * for the user. See mfd.h for other flags.
++ */
++ u_int rowreq_flags;
++
++ /*
++ * TODO:131:o: | |-> Add useful data to dessertMeshifTable rowreq context.
++ */
++
++ /*
++ * storage for future expansion
++ */
++ netsnmp_data_list *dessertMeshifTable_data_list;
++
++} dessertMeshifTable_rowreq_ctx;
++
++typedef struct dessertMeshifTable_ref_rowreq_ctx_s {
++ dessertMeshifTable_rowreq_ctx *rowreq_ctx;
++} dessertMeshifTable_ref_rowreq_ctx;
++
++/*
++ *********************************************************************
++ * function prototypes
++ */
++int
++dessertMeshifTable_pre_request(dessertMeshifTable_registration * user_context);
++int
++dessertMeshifTable_post_request(dessertMeshifTable_registration * user_context,
++ int rc);
++
++int
++dessertMeshifTable_rowreq_ctx_init(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
++ void *user_init_ctx);
++void
++dessertMeshifTable_rowreq_ctx_cleanup(
++ dessertMeshifTable_rowreq_ctx * rowreq_ctx);
++
++dessertMeshifTable_rowreq_ctx
++*dessertMeshifTable_row_find_by_mib_index(
++ dessertMeshifTable_mib_index * mib_idx);
++
++extern oid dessertMeshifTable_oid[];
++extern int dessertMeshifTable_oid_size;
++
++#include "dessertMeshifTable_interface.h"
++#include "dessertMeshifTable_data_access.h"
++#include "dessertMeshifTable_data_get.h"
++#include "dessertMeshifTable_data_set.h"
++
++/*
++ * DUMMY markers, ignore
++ *
++ * TODO:099:x: *************************************************************
++ * TODO:199:x: *************************************************************
++ * TODO:299:x: *************************************************************
++ * TODO:399:x: *************************************************************
++ * TODO:499:x: *************************************************************
++ */
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTMESHIFTABLE_H */
++/** @} */
+diff --git a/src/snmp/dessertMeshifTable_data_access.c b/src/snmp/dessertMeshifTable_data_access.c
+new file mode 100644
+index 0000000..8cb7b5a
+--- /dev/null
++++ b/src/snmp/dessertMeshifTable_data_access.c
+@@ -0,0 +1,371 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 14170 $ of $
++ *
++ * $Id:$
++ */
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++#include "dessertMeshifTable_data_access.h"
++
++/** @ingroup interface
++ * @addtogroup data_access data_access: Routines to access data
++ *
++ * These routines are used to locate the data used to satisfy
++ * requests.
++ *
++ * @{
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertMeshifTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++/*
++ * DESSERT-MIB::dessertMeshifTable is subid 5 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.5, length: 12
++ */
++
++/**
++ * initialization for dessertMeshifTable data access
++ *
++ * This function is called during startup to allow you to
++ * allocate any resources you need for the data table.
++ *
++ * @param dessertMeshifTable_reg
++ * Pointer to dessertMeshifTable_registration
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : unrecoverable error.
++ */
++int
++dessertMeshifTable_init_data(dessertMeshifTable_registration *
++ dessertMeshifTable_reg)
++{
++ DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_init_data",
++ "called\n"));
++ dessert_debug("dessertMeshifTable_container_load called");
++ /*
++ * TODO:303:o: Initialize dessertMeshifTable data.
++ */
++ /*
++ ***************************************************
++ *** START EXAMPLE CODE ***
++ ***---------------------------------------------***/
++ /*
++ * if you are the sole writer for the file, you could
++ * open it here. However, as stated earlier, we are assuming
++ * the worst case, which in this case means that the file is
++ * written to by someone else, and might not even exist when
++ * we start up. So we can't do anything here.
++ */
++ /*
++ ***---------------------------------------------***
++ *** END EXAMPLE CODE ***
++ ***************************************************/
++
++ return MFD_SUCCESS;
++} /* dessertMeshifTable_init_data */
++
++/**
++ * container overview
++ *
++ */
++
++/**
++ * container initialization
++ *
++ * @param container_ptr_ptr A pointer to a container pointer. If you
++ * create a custom container, use this parameter to return it
++ * to the MFD helper. If set to NULL, the MFD helper will
++ * allocate a container for you.
++ * @param cache A pointer to a cache structure. You can set the timeout
++ * and other cache flags using this pointer.
++ *
++ * This function is called at startup to allow you to customize certain
++ * aspects of the access method. For the most part, it is for advanced
++ * users. The default code should suffice for most cases. If no custom
++ * container is allocated, the MFD code will create one for your.
++ *
++ * This is also the place to set up cache behavior. The default, to
++ * simply set the cache timeout, will work well with the default
++ * container. If you are using a custom container, you may want to
++ * look at the cache helper documentation to see if there are any
++ * flags you want to set.
++ *
++ * @remark
++ * This would also be a good place to do any initialization needed
++ * for you data source. For example, opening a connection to another
++ * process that will supply the data, opening a database, etc.
++ */
++void
++dessertMeshifTable_container_init(netsnmp_container ** container_ptr_ptr,
++ netsnmp_cache * cache)
++{
++ DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_container_init", "called\n"));
++
++ if (NULL == container_ptr_ptr) {
++ snmp_log(LOG_ERR,
++ "bad container param to dessertMeshifTable_container_init\n");
++ return;
++ }
++
++ /*
++ * For advanced users, you can use a custom container. If you
++ * do not create one, one will be created for you.
++ */
++ *container_ptr_ptr = NULL;
++
++ if (NULL == cache) {
++ snmp_log(LOG_ERR,
++ "bad cache param to dessertMeshifTable_container_init\n");
++ return;
++ }
++
++ /*
++ * TODO:345:A: Set up dessertMeshifTable cache properties.
++ *
++ * Also for advanced users, you can set parameters for the
++ * cache. Do not change the magic pointer, as it is used
++ * by the MFD helper. To completely disable caching, set
++ * cache->enabled to 0.
++ */
++ cache->timeout = DESSERTMESHIFTABLE_CACHE_TIMEOUT; /* seconds */
++} /* dessertMeshifTable_container_init */
++
++/**
++ * container shutdown
++ *
++ * @param container_ptr A pointer to the container.
++ *
++ * This function is called at shutdown to allow you to customize certain
++ * aspects of the access method. For the most part, it is for advanced
++ * users. The default code should suffice for most cases.
++ *
++ * This function is called before dessertMeshifTable_container_free().
++ *
++ * @remark
++ * This would also be a good place to do any cleanup needed
++ * for you data source. For example, closing a connection to another
++ * process that supplied the data, closing a database, etc.
++ */
++void
++dessertMeshifTable_container_shutdown(netsnmp_container * container_ptr)
++{
++ DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_container_shutdown", "called\n"));
++
++ if (NULL == container_ptr) {
++ snmp_log(LOG_ERR,
++ "bad params to dessertMeshifTable_container_shutdown\n");
++ return;
++ }
++
++} /* dessertMeshifTable_container_shutdown */
++
++/**
++ * load initial data
++ *
++ * TODO:350:M: Implement dessertMeshifTable data load
++ * This function will also be called by the cache helper to load
++ * the container again (after the container free function has been
++ * called to free the previous contents).
++ *
++ * @param container container to which items should be inserted
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_RESOURCE_UNAVAILABLE : Can't access data source
++ * @retval MFD_ERROR : other error.
++ *
++ * This function is called to load the index(es) (and data, optionally)
++ * for the every row in the data set.
++ *
++ * @remark
++ * While loading the data, the only important thing is the indexes.
++ * If access to your data is cheap/fast (e.g. you have a pointer to a
++ * structure in memory), it would make sense to update the data here.
++ * If, however, the accessing the data invovles more work (e.g. parsing
++ * some other existing data, or peforming calculations to derive the data),
++ * then you can limit yourself to setting the indexes and saving any
++ * information you will need later. Then use the saved information in
++ * dessertMeshifTable_row_prep() for populating data.
++ *
++ * @note
++ * If you need consistency between rows (like you want statistics
++ * for each row to be from the same time frame), you should set all
++ * data here.
++ *
++ */
++int
++dessertMeshifTable_container_load(netsnmp_container * container)
++{
++ dessertMeshifTable_rowreq_ctx *rowreq_ctx;
++ dessert_meshif_t *meshif;
++ size_t count = 0;
++
++ char inPkts[I64CHARSZ+1];
++ char outPkts[I64CHARSZ+1];
++ char inOctets[I64CHARSZ+1];
++ char outOctets[I64CHARSZ+1];
++
++ /*
++ * temporary storage for index values
++ */
++ /*
++ * meshifIndex(1)///()//L/a/w/e/r/d/h
++ */
++ long meshifIndex = -1;
++
++ dessert_debug("dessertMeshifTable_container_load called");
++ DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_container_load", "called\n"));
++
++
++
++ /*
++ * TODO:351:M: |-> Load/update data in the dessertMeshifTable container.
++ * loop over your dessertMeshifTable data, allocate a rowreq context,
++ * set the index(es) [and data, optionally] and insert into
++ * the container.
++ */
++ pthread_rwlock_rdlock(&dessert_cfglock);
++ DL_FOREACH(dessert_meshiflist_get(), meshif){
++
++ meshifIndex = ++count;
++
++ /*
++ * TODO:352:M: | |-> set indexes in new dessertMeshifTable rowreq context.
++ * data context will be set from the param (unless NULL,
++ * in which case a new data context will be allocated)
++ */
++ rowreq_ctx = dessertMeshifTable_allocate_rowreq_ctx(NULL);
++ if (NULL == rowreq_ctx) {
++ snmp_log(LOG_ERR, "memory allocation failed\n");
++ pthread_rwlock_unlock(&dessert_cfglock);
++ return MFD_RESOURCE_UNAVAILABLE;
++ }
++
++ if (MFD_SUCCESS != dessertMeshifTable_indexes_set(rowreq_ctx,
++ meshifIndex)) {
++ snmp_log(LOG_ERR, "error setting index while loading "
++ "dessertMeshifTable data.\n");
++ dessertMeshifTable_release_rowreq_ctx(rowreq_ctx);
++ continue;
++ }
++
++ /*
++ * TODO:352:r: | |-> populate dessertMeshifTable data context.
++ * Populate data context here. (optionally, delay until row prep)
++ */
++
++ rowreq_ctx->data.meshifName_len = strlen(meshif->if_name);
++ strcpy(rowreq_ctx->data.meshifName, meshif->if_name);
++
++ rowreq_ctx->data.meshifMacAddress_len = 6;
++ memcpy(rowreq_ctx->data.meshifMacAddress, meshif->hwaddr, 6);
++
++ pthread_mutex_lock(&(meshif->cnt_mutex));
++
++ rowreq_ctx->data.meshifInPkts.low = meshif->ipkts & 0xffffffff;
++ rowreq_ctx->data.meshifInPkts.high = meshif->ipkts >> 32;
++
++ rowreq_ctx->data.meshifOutPkts.low = meshif->opkts & 0xffffffff;
++ rowreq_ctx->data.meshifOutPkts.high = meshif->opkts >> 32;
++
++ rowreq_ctx->data.meshifInOctets.low = meshif->ibytes & 0xffffffff;
++ rowreq_ctx->data.meshifInOctets.high = meshif->ibytes >> 32;
++
++ rowreq_ctx->data.meshifOutOctets.low = meshif->obytes & 0xffffffff;
++ rowreq_ctx->data.meshifOutOctets.high = meshif->obytes >> 32;
++
++
++ printU64(inPkts, &rowreq_ctx->data.meshifInPkts);
++ printU64(outPkts, &rowreq_ctx->data.meshifOutPkts);
++ printU64(inOctets, &rowreq_ctx->data.meshifInOctets);
++ printU64(outOctets, &rowreq_ctx->data.meshifOutOctets);
++
++
++ dessert_debug("inPkts [%s] [%u]", inPkts, meshif->ipkts);
++ dessert_debug("outPkts [%s] [%u]", outPkts, meshif->opkts);
++ dessert_debug("inOctets [%s] [%u]", inOctets, meshif->ibytes);
++ dessert_debug("outOctets [%s] [%u]", outOctets,meshif->obytes);
++
++
++ pthread_mutex_unlock(&(meshif->cnt_mutex));
++
++ /*
++ * insert into table container
++ */
++ CONTAINER_INSERT(container, rowreq_ctx);
++ }
++ pthread_rwlock_unlock(&dessert_cfglock);
++
++
++
++ DEBUGMSGT(("verbose:dessertMeshifTable:dessertMeshifTable_container_load", "inserted %d records\n", count));
++
++ if (meshifIndex == -1) return MFD_RESOURCE_UNAVAILABLE;
++
++ return MFD_SUCCESS;
++} /* dessertMeshifTable_container_load */
++
++/**
++ * container clean up
++ *
++ * @param container container with all current items
++ *
++ * This optional callback is called prior to all
++ * item's being removed from the container. If you
++ * need to do any processing before that, do it here.
++ *
++ * @note
++ * The MFD helper will take care of releasing all the row contexts.
++ *
++ */
++void
++dessertMeshifTable_container_free(netsnmp_container * container)
++{
++ DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_container_free", "called\n"));
++
++ /*
++ * TODO:380:M: Free dessertMeshifTable container data.
++ */
++} /* dessertMeshifTable_container_free */
++
++/**
++ * prepare row for processing.
++ *
++ * When the agent has located the row for a request, this function is
++ * called to prepare the row for processing. If you fully populated
++ * the data context during the index setup phase, you may not need to
++ * do anything.
++ *
++ * @param rowreq_ctx pointer to a context.
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error.
++ */
++int
++dessertMeshifTable_row_prep(dessertMeshifTable_rowreq_ctx * rowreq_ctx)
++{
++ DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_row_prep",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:390:o: Prepare row for request.
++ * If populating row data was delayed, this is the place to
++ * fill in the row for this request.
++ */
++
++ return MFD_SUCCESS;
++} /* dessertMeshifTable_row_prep */
++
++/** @} */
+diff --git a/src/snmp/dessertMeshifTable_data_access.h b/src/snmp/dessertMeshifTable_data_access.h
+new file mode 100644
+index 0000000..f9ddd5c
+--- /dev/null
++++ b/src/snmp/dessertMeshifTable_data_access.h
+@@ -0,0 +1,77 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 14170 $ of $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTMESHIFTABLE_DATA_ACCESS_H
++#define DESSERTMESHIFTABLE_DATA_ACCESS_H
++
++#include "dessert_internal.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++ /*
++ *********************************************************************
++ * function declarations
++ */
++
++ /*
++ *********************************************************************
++ * Table declarations
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertMeshifTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++ /*
++ * DESSERT-MIB::dessertMeshifTable is subid 5 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.5, length: 12
++ */
++
++
++ int
++ dessertMeshifTable_init_data(dessertMeshifTable_registration *
++ dessertMeshifTable_reg);
++
++
++ /*
++ * TODO:180:o: Review dessertMeshifTable cache timeout.
++ * The number of seconds before the cache times out
++ */
++#define DESSERTMESHIFTABLE_CACHE_TIMEOUT DESSERT_AGENTX_MESHIFTABLE_CACHE_TIMEOUT
++
++ void dessertMeshifTable_container_init(netsnmp_container **
++ container_ptr_ptr,
++ netsnmp_cache *
++ cache);
++ void dessertMeshifTable_container_shutdown(netsnmp_container
++ * container_ptr);
++
++ int dessertMeshifTable_container_load(netsnmp_container *
++ container);
++ void dessertMeshifTable_container_free(netsnmp_container *
++ container);
++
++ int dessertMeshifTable_cache_load(netsnmp_container *
++ container);
++ void dessertMeshifTable_cache_free(netsnmp_container *
++ container);
++
++ int
++ dessertMeshifTable_row_prep(dessertMeshifTable_rowreq_ctx *
++ rowreq_ctx);
++
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTMESHIFTABLE_DATA_ACCESS_H */
+diff --git a/src/snmp/dessertMeshifTable_data_get.c b/src/snmp/dessertMeshifTable_data_get.c
+new file mode 100644
+index 0000000..6dd56c0
+--- /dev/null
++++ b/src/snmp/dessertMeshifTable_data_get.c
+@@ -0,0 +1,522 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 12088 $ of $
++ *
++ * $Id:$
++ */
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertMeshifTable.h"
++
++
++/** @defgroup data_get data_get: Routines to get data
++ *
++ * TODO:230:M: Implement dessertMeshifTable get routines.
++ * TODO:240:M: Implement dessertMeshifTable mapping routines (if any).
++ *
++ * These routine are used to get the value for individual objects. The
++ * row context is passed, along with a pointer to the memory where the
++ * value should be copied.
++ *
++ * @{
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertMeshifTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++/*
++ * DESSERT-MIB::dessertMeshifTable is subid 5 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.5, length: 12
++ */
++
++/*
++ * ---------------------------------------------------------------------
++ * * TODO:200:r: Implement dessertMeshifTable data context functions.
++ */
++
++
++/**
++ * set mib index(es)
++ *
++ * @param tbl_idx mib index structure
++ * @param meshifIndex_val
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error.
++ *
++ * @remark
++ * This convenience function is useful for setting all the MIB index
++ * components with a single function call. It is assume that the C values
++ * have already been mapped from their native/rawformat to the MIB format.
++ */
++int
++dessertMeshifTable_indexes_set_tbl_idx(dessertMeshifTable_mib_index *
++ tbl_idx, long meshifIndex_val)
++{
++ DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_indexes_set_tbl_idx", "called\n"));
++
++ /*
++ * meshifIndex(1)///()//L/a/w/e/r/d/h
++ */
++ tbl_idx->meshifIndex = meshifIndex_val;
++
++
++ return MFD_SUCCESS;
++} /* dessertMeshifTable_indexes_set_tbl_idx */
++
++/**
++ * @internal
++ * set row context indexes
++ *
++ * @param reqreq_ctx the row context that needs updated indexes
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error.
++ *
++ * @remark
++ * This function sets the mib indexs, then updates the oid indexs
++ * from the mib index.
++ */
++int
++dessertMeshifTable_indexes_set(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
++ long meshifIndex_val)
++{
++ DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_indexes_set", "called\n"));
++
++ if (MFD_SUCCESS !=
++ dessertMeshifTable_indexes_set_tbl_idx(&rowreq_ctx->tbl_idx,
++ meshifIndex_val))
++ return MFD_ERROR;
++
++ /*
++ * convert mib index to oid index
++ */
++ rowreq_ctx->oid_idx.len = sizeof(rowreq_ctx->oid_tmp) / sizeof(oid);
++ if (0 != dessertMeshifTable_index_to_oid(&rowreq_ctx->oid_idx,
++ &rowreq_ctx->tbl_idx)) {
++ return MFD_ERROR;
++ }
++
++ return MFD_SUCCESS;
++} /* dessertMeshifTable_indexes_set */
++
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertMeshifEntry.meshifName
++ * meshifName is subid 2 of dessertMeshifEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.5.1.2
++ * Description:
++name of interface
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 1 hashint 1
++ * settable 0
++ * hint: 255a
++ *
++ * Ranges: 0 - 255;
++ *
++ * Its syntax is DisplayString (based on perltype OCTETSTR)
++ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
++ * This data type requires a length. (Max 255)
++ */
++/**
++ * Extract the current value of the meshifName data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param meshifName_val_ptr_ptr
++ * Pointer to storage for a char variable
++ * @param meshifName_val_ptr_len_ptr
++ * Pointer to a size_t. On entry, it will contain the size (in bytes)
++ * pointed to by meshifName.
++ * On exit, this value should contain the data size (in bytes).
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++*
++ * @note If you need more than (*meshifName_val_ptr_len_ptr) bytes of memory,
++ * allocate it using malloc() and update meshifName_val_ptr_ptr.
++ * <b>DO NOT</b> free the previous pointer.
++ * The MFD helper will release the memory you allocate.
++ *
++ * @remark If you call this function yourself, you are responsible
++ * for checking if the pointer changed, and freeing any
++ * previously allocated memory. (Not necessary if you pass
++ * in a pointer to static memory, obviously.)
++ */
++int
++meshifName_get(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
++ char **meshifName_val_ptr_ptr,
++ size_t *meshifName_val_ptr_len_ptr)
++{
++ /** we should have a non-NULL pointer and enough storage */
++ netsnmp_assert((NULL != meshifName_val_ptr_ptr)
++ && (NULL != *meshifName_val_ptr_ptr));
++ netsnmp_assert(NULL != meshifName_val_ptr_len_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertMeshifTable:meshifName_get", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the meshifName data.
++ * copy (* meshifName_val_ptr_ptr ) data and (* meshifName_val_ptr_len_ptr ) from rowreq_ctx->data
++ */
++ /*
++ * make sure there is enough space for meshifName data
++ */
++ if ((NULL == (*meshifName_val_ptr_ptr)) ||
++ ((*meshifName_val_ptr_len_ptr) <
++ (rowreq_ctx->data.meshifName_len *
++ sizeof(rowreq_ctx->data.meshifName[0])))) {
++ /*
++ * allocate space for meshifName data
++ */
++ (*meshifName_val_ptr_ptr) =
++ malloc(rowreq_ctx->data.meshifName_len *
++ sizeof(rowreq_ctx->data.meshifName[0]));
++ if (NULL == (*meshifName_val_ptr_ptr)) {
++ snmp_log(LOG_ERR, "could not allocate memory\n");
++ return MFD_ERROR;
++ }
++ }
++ (*meshifName_val_ptr_len_ptr) =
++ rowreq_ctx->data.meshifName_len *
++ sizeof(rowreq_ctx->data.meshifName[0]);
++ memcpy((*meshifName_val_ptr_ptr), rowreq_ctx->data.meshifName,
++ rowreq_ctx->data.meshifName_len *
++ sizeof(rowreq_ctx->data.meshifName[0]));
++
++ return MFD_SUCCESS;
++} /* meshifName_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertMeshifEntry.meshifMacAddress
++ * meshifMacAddress is subid 3 of dessertMeshifEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.5.1.3
++ * Description:
++hardware address of interface
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 1 hashint 1
++ * settable 0
++ * hint: 1x:
++ *
++ * Ranges: 6;
++ *
++ * Its syntax is MacAddress (based on perltype OCTETSTR)
++ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
++ * This data type requires a length. (Max 6)
++ */
++/**
++ * Extract the current value of the meshifMacAddress data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param meshifMacAddress_val_ptr_ptr
++ * Pointer to storage for a char variable
++ * @param meshifMacAddress_val_ptr_len_ptr
++ * Pointer to a size_t. On entry, it will contain the size (in bytes)
++ * pointed to by meshifMacAddress.
++ * On exit, this value should contain the data size (in bytes).
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++*
++ * @note If you need more than (*meshifMacAddress_val_ptr_len_ptr) bytes of memory,
++ * allocate it using malloc() and update meshifMacAddress_val_ptr_ptr.
++ * <b>DO NOT</b> free the previous pointer.
++ * The MFD helper will release the memory you allocate.
++ *
++ * @remark If you call this function yourself, you are responsible
++ * for checking if the pointer changed, and freeing any
++ * previously allocated memory. (Not necessary if you pass
++ * in a pointer to static memory, obviously.)
++ */
++int
++meshifMacAddress_get(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
++ char **meshifMacAddress_val_ptr_ptr,
++ size_t *meshifMacAddress_val_ptr_len_ptr)
++{
++ /** we should have a non-NULL pointer and enough storage */
++ netsnmp_assert((NULL != meshifMacAddress_val_ptr_ptr)
++ && (NULL != *meshifMacAddress_val_ptr_ptr));
++ netsnmp_assert(NULL != meshifMacAddress_val_ptr_len_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertMeshifTable:meshifMacAddress_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the meshifMacAddress data.
++ * copy (* meshifMacAddress_val_ptr_ptr ) data and (* meshifMacAddress_val_ptr_len_ptr ) from rowreq_ctx->data
++ */
++ /*
++ * make sure there is enough space for meshifMacAddress data
++ */
++ if ((NULL == (*meshifMacAddress_val_ptr_ptr)) ||
++ ((*meshifMacAddress_val_ptr_len_ptr) <
++ (rowreq_ctx->data.meshifMacAddress_len *
++ sizeof(rowreq_ctx->data.meshifMacAddress[0])))) {
++ /*
++ * allocate space for meshifMacAddress data
++ */
++ (*meshifMacAddress_val_ptr_ptr) =
++ malloc(rowreq_ctx->data.meshifMacAddress_len *
++ sizeof(rowreq_ctx->data.meshifMacAddress[0]));
++ if (NULL == (*meshifMacAddress_val_ptr_ptr)) {
++ snmp_log(LOG_ERR, "could not allocate memory\n");
++ return MFD_ERROR;
++ }
++ }
++ (*meshifMacAddress_val_ptr_len_ptr) =
++ rowreq_ctx->data.meshifMacAddress_len *
++ sizeof(rowreq_ctx->data.meshifMacAddress[0]);
++ memcpy((*meshifMacAddress_val_ptr_ptr),
++ rowreq_ctx->data.meshifMacAddress,
++ rowreq_ctx->data.meshifMacAddress_len *
++ sizeof(rowreq_ctx->data.meshifMacAddress[0]));
++
++ return MFD_SUCCESS;
++} /* meshifMacAddress_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertMeshifEntry.meshifInPkts
++ * meshifInPkts is subid 4 of dessertMeshifEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.5.1.4
++ * Description:
++packet counter in
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 0
++ *
++ *
++ * Its syntax is COUNTER64 (based on perltype COUNTER64)
++ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
++ */
++/**
++ * Extract the current value of the meshifInPkts data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param meshifInPkts_val_ptr
++ * Pointer to storage for a U64 variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++meshifInPkts_get(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
++ U64 * meshifInPkts_val_ptr)
++{
++ char inPkts[I64CHARSZ+1];
++
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != meshifInPkts_val_ptr);
++
++ /*
++ * TODO:231:o: |-> copy meshifInPkts data.
++ * get (* meshifInPkts_val_ptr ).low and (* meshifInPkts_val_ptr ).high from rowreq_ctx->data
++ */
++ (*meshifInPkts_val_ptr).high = rowreq_ctx->data.meshifInPkts.high;
++ (*meshifInPkts_val_ptr).low = rowreq_ctx->data.meshifInPkts.low;
++
++ printU64(inPkts, meshifInPkts_val_ptr);
++
++ return MFD_SUCCESS;
++} /* meshifInPkts_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertMeshifEntry.meshifOutPkts
++ * meshifOutPkts is subid 5 of dessertMeshifEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.5.1.5
++ * Description:
++packet counter out
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 0
++ *
++ *
++ * Its syntax is COUNTER64 (based on perltype COUNTER64)
++ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
++ */
++/**
++ * Extract the current value of the meshifOutPkts data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param meshifOutPkts_val_ptr
++ * Pointer to storage for a U64 variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++meshifOutPkts_get(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
++ U64 * meshifOutPkts_val_ptr)
++{
++ char outPkts[I64CHARSZ+1];
++
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != meshifOutPkts_val_ptr);
++
++ /*
++ * TODO:231:o: |-> copy meshifOutPkts data.
++ * get (* meshifOutPkts_val_ptr ).low and (* meshifOutPkts_val_ptr ).high from rowreq_ctx->data
++ */
++ (*meshifOutPkts_val_ptr).high = rowreq_ctx->data.meshifOutPkts.high;
++ (*meshifOutPkts_val_ptr).low = rowreq_ctx->data.meshifOutPkts.low;
++
++ printU64(outPkts, meshifOutPkts_val_ptr);
++
++
++
++
++ return MFD_SUCCESS;
++} /* meshifOutPkts_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertMeshifEntry.meshifInOctets
++ * meshifInOctets is subid 6 of dessertMeshifEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.5.1.6
++ * Description:
++octet counter in
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 0
++ *
++ *
++ * Its syntax is COUNTER64 (based on perltype COUNTER64)
++ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
++ */
++/**
++ * Extract the current value of the meshifInOctets data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param meshifInOctets_val_ptr
++ * Pointer to storage for a U64 variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++meshifInOctets_get(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
++ U64 * meshifInOctets_val_ptr)
++{
++ char inOctets[I64CHARSZ+1];
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != meshifInOctets_val_ptr);
++
++ /*
++ * TODO:231:o: |-> copy meshifInOctets data.
++ * get (* meshifInOctets_val_ptr ).low and (* meshifInOctets_val_ptr ).high from rowreq_ctx->data
++ */
++ (*meshifInOctets_val_ptr).high = rowreq_ctx->data.meshifInOctets.high;
++ (*meshifInOctets_val_ptr).low = rowreq_ctx->data.meshifInOctets.low;
++
++ printU64(inOctets, meshifInOctets_val_ptr);
++
++
++ return MFD_SUCCESS;
++} /* meshifInOctets_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT-MIB::dessertMeshifEntry.meshifOutOctets
++ * meshifOutOctets is subid 7 of dessertMeshifEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.5.1.7
++ * Description:
++octet counter out
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 0
++ *
++ *
++ * Its syntax is COUNTER64 (based on perltype COUNTER64)
++ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
++ */
++/**
++ * Extract the current value of the meshifOutOctets data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param meshifOutOctets_val_ptr
++ * Pointer to storage for a U64 variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++meshifOutOctets_get(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
++ U64 * meshifOutOctets_val_ptr)
++{
++ char outOctets[I64CHARSZ+1];
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != meshifOutOctets_val_ptr);
++
++ /*
++ * TODO:231:o: |-> copy meshifOutOctets data.
++ * get (* meshifOutOctets_val_ptr ).low and (* meshifOutOctets_val_ptr ).high from rowreq_ctx->data
++ */
++ (*meshifOutOctets_val_ptr).high =
++ rowreq_ctx->data.meshifOutOctets.high;
++ (*meshifOutOctets_val_ptr).low = rowreq_ctx->data.meshifOutOctets.low;
++
++ printU64(outOctets, meshifOutOctets_val_ptr);
++
++
++ return MFD_SUCCESS;
++} /* meshifOutOctets_get */
++
++
++
++/** @} */
+diff --git a/src/snmp/dessertMeshifTable_data_get.h b/src/snmp/dessertMeshifTable_data_get.h
+new file mode 100644
+index 0000000..0a7657d
+--- /dev/null
++++ b/src/snmp/dessertMeshifTable_data_get.h
+@@ -0,0 +1,109 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 12088 $ of $
++ *
++ * $Id:$
++ *
++ * @file dessertMeshifTable_data_get.h
++ *
++ * @addtogroup get
++ *
++ * Prototypes for get functions
++ *
++ * @{
++ */
++#ifndef DESSERTMESHIFTABLE_DATA_GET_H
++#define DESSERTMESHIFTABLE_DATA_GET_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++ /*
++ *********************************************************************
++ * GET function declarations
++ */
++
++ /*
++ *********************************************************************
++ * GET Table declarations
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertMeshifTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++ /*
++ * DESSERT-MIB::dessertMeshifTable is subid 5 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.5, length: 12
++ */
++ /*
++ * indexes
++ */
++ int meshifIndex_map(uint *mib_meshifIndex_val_ptr, uint
++ raw_meshifIndex_val);
++
++ int meshifName_map(char **mib_meshifName_val_ptr_ptr,
++ size_t *mib_meshifName_val_ptr_len_ptr,
++ char *raw_meshifName_val_ptr,
++ size_t raw_meshifName_val_ptr_len,
++ int allow_realloc);
++ int meshifName_get(dessertMeshifTable_rowreq_ctx *
++ rowreq_ctx,
++ char **meshifName_val_ptr_ptr,
++ size_t *meshifName_val_ptr_len_ptr);
++ int meshifMacAddress_map(char
++ **mib_meshifMacAddress_val_ptr_ptr,
++ size_t
++ *mib_meshifMacAddress_val_ptr_len_ptr,
++ char
++ *raw_meshifMacAddress_val_ptr,
++ size_t
++ raw_meshifMacAddress_val_ptr_len,
++ int allow_realloc);
++ int meshifMacAddress_get(dessertMeshifTable_rowreq_ctx *
++ rowreq_ctx,
++ char
++ **meshifMacAddress_val_ptr_ptr,
++ size_t
++ *meshifMacAddress_val_ptr_len_ptr);
++ int meshifInPkts_map(U64 * mib_meshifInPkts_val_ptr,
++ U64 raw_meshifInPkts_val);
++ int meshifInPkts_get(dessertMeshifTable_rowreq_ctx *
++ rowreq_ctx,
++ U64 * meshifInPkts_val_ptr);
++ int meshifOutPkts_map(U64 * mib_meshifOutPkts_val_ptr,
++ U64 raw_meshifOutPkts_val);
++ int meshifOutPkts_get(dessertMeshifTable_rowreq_ctx *
++ rowreq_ctx,
++ U64 * meshifOutPkts_val_ptr);
++ int meshifInOctets_map(U64 * mib_meshifInOctets_val_ptr,
++ U64 raw_meshifInOctets_val);
++ int meshifInOctets_get(dessertMeshifTable_rowreq_ctx *
++ rowreq_ctx,
++ U64 * meshifInOctets_val_ptr);
++ int meshifOutOctets_map(U64 * mib_meshifOutOctets_val_ptr,
++ U64 raw_meshifOutOctets_val);
++ int meshifOutOctets_get(dessertMeshifTable_rowreq_ctx *
++ rowreq_ctx,
++ U64 * meshifOutOctets_val_ptr);
++
++
++ int
++ dessertMeshifTable_indexes_set_tbl_idx(dessertMeshifTable_mib_index
++ * tbl_idx, long meshifIndex_val);
++ int
++ dessertMeshifTable_indexes_set(dessertMeshifTable_rowreq_ctx *
++ rowreq_ctx, long meshifIndex_val);
++
++
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTMESHIFTABLE_DATA_GET_H */
++/** @} */
+diff --git a/src/snmp/dessertMeshifTable_data_set.c b/src/snmp/dessertMeshifTable_data_set.c
+new file mode 100644
+index 0000000..7cc7af1
+--- /dev/null
++++ b/src/snmp/dessertMeshifTable_data_set.c
+@@ -0,0 +1,28 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 12077 $ of $
++ *
++ * $Id:$
++ *
++ */
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertMeshifTable.h"
++
++
++/** @defgroup data_set data_set: Routines to set data
++ *
++ * These routines are used to set the value for individual objects. The
++ * row context is passed, along with the new value.
++ *
++ * @{
++ */
++/** @} */
+diff --git a/src/snmp/dessertMeshifTable_data_set.h b/src/snmp/dessertMeshifTable_data_set.h
+new file mode 100644
+index 0000000..2a96aaf
+--- /dev/null
++++ b/src/snmp/dessertMeshifTable_data_set.h
+@@ -0,0 +1,28 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 12077 $ of $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTMESHIFTABLE_DATA_SET_H
++#define DESSERTMESHIFTABLE_DATA_SET_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++ /*
++ *********************************************************************
++ * SET function declarations
++ */
++
++ /*
++ *********************************************************************
++ * SET Table declarations
++ */
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTMESHIFTABLE_DATA_SET_H */
+diff --git a/src/snmp/dessertMeshifTable_enums.h b/src/snmp/dessertMeshifTable_enums.h
+new file mode 100644
+index 0000000..4b9b078
+--- /dev/null
++++ b/src/snmp/dessertMeshifTable_enums.h
+@@ -0,0 +1,39 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * : generic-table-enums.m2c 12526 2005-07-15 22:41:16Z rstory $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTMESHIFTABLE_ENUMS_H
++#define DESSERTMESHIFTABLE_ENUMS_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++ /*
++ * NOTES on enums
++ * ==============
++ *
++ * Value Mapping
++ * -------------
++ * If the values for your data type don't exactly match the
++ * possible values defined by the mib, you should map them
++ * below. For example, a boolean flag (1/0) is usually represented
++ * as a TruthValue in a MIB, which maps to the values (1/2).
++ *
++ */
++/*************************************************************************
++ *************************************************************************
++ *
++ * enum definitions for table dessertMeshifTable
++ *
++ *************************************************************************
++ *************************************************************************/
++
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTMESHIFTABLE_ENUMS_H */
+diff --git a/src/snmp/dessertMeshifTable_interface.c b/src/snmp/dessertMeshifTable_interface.c
+new file mode 100644
+index 0000000..976dcd6
+--- /dev/null
++++ b/src/snmp/dessertMeshifTable_interface.c
+@@ -0,0 +1,944 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 15899 $ of $
++ *
++ * $Id:$
++ */
++/*
++ * *********************************************************************
++ * *********************************************************************
++ * *********************************************************************
++ * *** ***
++ * *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
++ * *** ***
++ * *** ***
++ * *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
++ * *** ***
++ * *** ***
++ * *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
++ * *** ***
++ * *** ***
++ * *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
++ * *** ***
++ * *** ***
++ * *********************************************************************
++ * *********************************************************************
++ * *********************************************************************
++ */
++
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertMeshifTable.h"
++
++
++#include <net-snmp/agent/table_container.h>
++#include <net-snmp/library/container.h>
++
++#include "dessertMeshifTable_interface.h"
++
++#include <ctype.h>
++
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertMeshifTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++/*
++ * DESSERT-MIB::dessertMeshifTable is subid 5 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.5, length: 12
++ */
++typedef struct dessertMeshifTable_interface_ctx_s {
++
++ netsnmp_container *container;
++ netsnmp_cache *cache;
++
++ dessertMeshifTable_registration *user_ctx;
++
++ netsnmp_table_registration_info tbl_info;
++
++ netsnmp_baby_steps_access_methods access_multiplexer;
++
++} dessertMeshifTable_interface_ctx;
++
++static dessertMeshifTable_interface_ctx dessertMeshifTable_if_ctx;
++
++static void
++_dessertMeshifTable_container_init(dessertMeshifTable_interface_ctx *
++ if_ctx);
++static void
++_dessertMeshifTable_container_shutdown(dessertMeshifTable_interface_ctx *
++ if_ctx);
++
++
++netsnmp_container *
++dessertMeshifTable_container_get(void)
++{
++ return dessertMeshifTable_if_ctx.container;
++}
++
++dessertMeshifTable_registration *
++dessertMeshifTable_registration_get(void)
++{
++ return dessertMeshifTable_if_ctx.user_ctx;
++}
++
++dessertMeshifTable_registration *
++dessertMeshifTable_registration_set(dessertMeshifTable_registration *
++ newreg)
++{
++ dessertMeshifTable_registration *old =
++ dessertMeshifTable_if_ctx.user_ctx;
++ dessertMeshifTable_if_ctx.user_ctx = newreg;
++ return old;
++}
++
++int
++dessertMeshifTable_container_size(void)
++{
++ return CONTAINER_SIZE(dessertMeshifTable_if_ctx.container);
++}
++
++/*
++ * mfd multiplexer modes
++ */
++static Netsnmp_Node_Handler _mfd_dessertMeshifTable_pre_request;
++static Netsnmp_Node_Handler _mfd_dessertMeshifTable_post_request;
++static Netsnmp_Node_Handler _mfd_dessertMeshifTable_object_lookup;
++static Netsnmp_Node_Handler _mfd_dessertMeshifTable_get_values;
++/**
++ * @internal
++ * Initialize the table dessertMeshifTable
++ * (Define its contents and how it's structured)
++ */
++void
++_dessertMeshifTable_initialize_interface(dessertMeshifTable_registration *
++ reg_ptr, u_long flags)
++{
++ netsnmp_baby_steps_access_methods *access_multiplexer =
++ &dessertMeshifTable_if_ctx.access_multiplexer;
++ netsnmp_table_registration_info *tbl_info =
++ &dessertMeshifTable_if_ctx.tbl_info;
++ netsnmp_handler_registration *reginfo;
++ netsnmp_mib_handler *handler;
++ int mfd_modes = 0;
++
++ DEBUGMSGTL(("internal:dessertMeshifTable:_dessertMeshifTable_initialize_interface", "called\n"));
++
++
++ /*************************************************
++ *
++ * save interface context for dessertMeshifTable
++ */
++ /*
++ * Setting up the table's definition
++ */
++ netsnmp_table_helper_add_indexes(tbl_info,ASN_INTEGER,
++ /** index: meshifIndex */
++ 0);
++
++ /*
++ * Define the minimum and maximum accessible columns. This
++ * optimizes retrival.
++ */
++ tbl_info->min_column = DESSERTMESHIFTABLE_MIN_COL;
++ tbl_info->max_column = DESSERTMESHIFTABLE_MAX_COL;
++
++ /*
++ * save users context
++ */
++ dessertMeshifTable_if_ctx.user_ctx = reg_ptr;
++
++ /*
++ * call data access initialization code
++ */
++ dessertMeshifTable_init_data(reg_ptr);
++
++ /*
++ * set up the container
++ */
++ _dessertMeshifTable_container_init(&dessertMeshifTable_if_ctx);
++ if (NULL == dessertMeshifTable_if_ctx.container) {
++ snmp_log(LOG_ERR,
++ "could not initialize container for dessertMeshifTable\n");
++ return;
++ }
++
++ /*
++ * access_multiplexer: REQUIRED wrapper for get request handling
++ */
++ access_multiplexer->object_lookup =
++ _mfd_dessertMeshifTable_object_lookup;
++ access_multiplexer->get_values = _mfd_dessertMeshifTable_get_values;
++
++ /*
++ * no wrappers yet
++ */
++ access_multiplexer->pre_request = _mfd_dessertMeshifTable_pre_request;
++ access_multiplexer->post_request =
++ _mfd_dessertMeshifTable_post_request;
++
++
++ /*************************************************
++ *
++ * Create a registration, save our reg data, register table.
++ */
++ DEBUGMSGTL(("dessertMeshifTable:init_dessertMeshifTable",
++ "Registering dessertMeshifTable as a mibs-for-dummies table.\n"));
++ handler =
++ netsnmp_baby_steps_access_multiplexer_get(access_multiplexer);
++ reginfo =
++ netsnmp_handler_registration_create("dessertMeshifTable", handler,
++ dessertMeshifTable_oid,
++ dessertMeshifTable_oid_size,
++ HANDLER_CAN_BABY_STEP |
++ HANDLER_CAN_RONLY);
++ if (NULL == reginfo) {
++ snmp_log(LOG_ERR, "error registering table dessertMeshifTable\n");
++ return;
++ }
++ reginfo->my_reg_void = &dessertMeshifTable_if_ctx;
++
++ /*************************************************
++ *
++ * set up baby steps handler, create it and inject it
++ */
++ if (access_multiplexer->object_lookup)
++ mfd_modes |= BABY_STEP_OBJECT_LOOKUP;
++ if (access_multiplexer->set_values)
++ mfd_modes |= BABY_STEP_SET_VALUES;
++ if (access_multiplexer->irreversible_commit)
++ mfd_modes |= BABY_STEP_IRREVERSIBLE_COMMIT;
++ if (access_multiplexer->object_syntax_checks)
++ mfd_modes |= BABY_STEP_CHECK_OBJECT;
++
++ if (access_multiplexer->pre_request)
++ mfd_modes |= BABY_STEP_PRE_REQUEST;
++ if (access_multiplexer->post_request)
++ mfd_modes |= BABY_STEP_POST_REQUEST;
++
++ if (access_multiplexer->undo_setup)
++ mfd_modes |= BABY_STEP_UNDO_SETUP;
++ if (access_multiplexer->undo_cleanup)
++ mfd_modes |= BABY_STEP_UNDO_CLEANUP;
++ if (access_multiplexer->undo_sets)
++ mfd_modes |= BABY_STEP_UNDO_SETS;
++
++ if (access_multiplexer->row_creation)
++ mfd_modes |= BABY_STEP_ROW_CREATE;
++ if (access_multiplexer->consistency_checks)
++ mfd_modes |= BABY_STEP_CHECK_CONSISTENCY;
++ if (access_multiplexer->commit)
++ mfd_modes |= BABY_STEP_COMMIT;
++ if (access_multiplexer->undo_commit)
++ mfd_modes |= BABY_STEP_UNDO_COMMIT;
++
++ handler = netsnmp_baby_steps_handler_get(mfd_modes);
++ netsnmp_inject_handler(reginfo, handler);
++
++ /*************************************************
++ *
++ * inject row_merge helper with prefix rootoid_len + 2 (entry.col)
++ */
++ handler = netsnmp_get_row_merge_handler(reginfo->rootoid_len + 2);
++ netsnmp_inject_handler(reginfo, handler);
++
++ /*************************************************
++ *
++ * inject container_table helper
++ */
++ handler =
++ netsnmp_container_table_handler_get(tbl_info,
++ dessertMeshifTable_if_ctx.
++ container,
++ TABLE_CONTAINER_KEY_NETSNMP_INDEX);
++ netsnmp_inject_handler(reginfo, handler);
++
++ /*************************************************
++ *
++ * inject cache helper
++ */
++ if (NULL != dessertMeshifTable_if_ctx.cache) {
++ handler =
++ netsnmp_cache_handler_get(dessertMeshifTable_if_ctx.cache);
++ netsnmp_inject_handler(reginfo, handler);
++ }
++
++ /*
++ * register table
++ */
++ netsnmp_register_table(reginfo, tbl_info);
++
++} /* _dessertMeshifTable_initialize_interface */
++
++/**
++ * @internal
++ * Shutdown the table dessertMeshifTable
++ */
++void
++_dessertMeshifTable_shutdown_interface(dessertMeshifTable_registration *
++ reg_ptr)
++{
++ /*
++ * shutdown the container
++ */
++ _dessertMeshifTable_container_shutdown(&dessertMeshifTable_if_ctx);
++}
++
++void
++dessertMeshifTable_valid_columns_set(netsnmp_column_info *vc)
++{
++ dessertMeshifTable_if_ctx.tbl_info.valid_columns = vc;
++} /* dessertMeshifTable_valid_columns_set */
++
++/**
++ * @internal
++ * convert the index component stored in the context to an oid
++ */
++int
++dessertMeshifTable_index_to_oid(netsnmp_index * oid_idx,
++ dessertMeshifTable_mib_index * mib_idx)
++{
++ int err = SNMP_ERR_NOERROR;
++
++ /*
++ * temp storage for parsing indexes
++ */
++ /*
++ * meshifIndex(1)///()//L/a/w/e/r/d/h
++ */
++ netsnmp_variable_list var_meshifIndex;
++
++ /*
++ * set up varbinds
++ */
++ memset(&var_meshifIndex, 0x00, sizeof(var_meshifIndex));
++ var_meshifIndex.type = ASN_INTEGER;
++
++ /*
++ * chain temp index varbinds together
++ */
++ var_meshifIndex.next_variable = NULL;
++
++
++ DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_index_to_oid", "called\n"));
++
++ /*
++ * meshifIndex(1)///()//L/a/w/e/r/d/h
++ */
++ snmp_set_var_value(&var_meshifIndex, (u_char *) & mib_idx->meshifIndex,
++ sizeof(mib_idx->meshifIndex));
++
++
++ err = build_oid_noalloc(oid_idx->oids, oid_idx->len, &oid_idx->len,
++ NULL, 0, &var_meshifIndex);
++ if (err)
++ snmp_log(LOG_ERR, "error %d converting index to oid\n", err);
++
++ /*
++ * parsing may have allocated memory. free it.
++ */
++ snmp_reset_var_buffers(&var_meshifIndex);
++
++ return err;
++} /* dessertMeshifTable_index_to_oid */
++
++/**
++ * extract dessertMeshifTable indexes from a netsnmp_index
++ *
++ * @retval SNMP_ERR_NOERROR : no error
++ * @retval SNMP_ERR_GENERR : error
++ */
++int
++dessertMeshifTable_index_from_oid(netsnmp_index * oid_idx,
++ dessertMeshifTable_mib_index * mib_idx)
++{
++ int err = SNMP_ERR_NOERROR;
++
++ /*
++ * temp storage for parsing indexes
++ */
++ /*
++ * meshifIndex(1)///()//L/a/w/e/r/d/h
++ */
++ netsnmp_variable_list var_meshifIndex;
++
++ /*
++ * set up varbinds
++ */
++ memset(&var_meshifIndex, 0x00, sizeof(var_meshifIndex));
++ var_meshifIndex.type = ASN_INTEGER;
++
++ /*
++ * chain temp index varbinds together
++ */
++ var_meshifIndex.next_variable = NULL;
++
++
++ DEBUGMSGTL(("verbose:dessertMeshifTable:dessertMeshifTable_index_from_oid", "called\n"));
++
++ /*
++ * parse the oid into the individual index components
++ */
++ err = parse_oid_indexes(oid_idx->oids, oid_idx->len, &var_meshifIndex);
++ if (err == SNMP_ERR_NOERROR) {
++ /*
++ * copy out values
++ */
++ mib_idx->meshifIndex = *((long *)var_meshifIndex.val.string);
++
++
++ }
++
++ /*
++ * parsing may have allocated memory. free it.
++ */
++ snmp_reset_var_buffers(&var_meshifIndex);
++
++ return err;
++} /* dessertMeshifTable_index_from_oid */
++
++
++/*
++ *********************************************************************
++ * @internal
++ * allocate resources for a dessertMeshifTable_rowreq_ctx
++ */
++dessertMeshifTable_rowreq_ctx *
++dessertMeshifTable_allocate_rowreq_ctx(void *user_init_ctx)
++{
++ dessertMeshifTable_rowreq_ctx *rowreq_ctx =
++ SNMP_MALLOC_TYPEDEF(dessertMeshifTable_rowreq_ctx);
++
++ DEBUGMSGTL(("internal:dessertMeshifTable:dessertMeshifTable_allocate_rowreq_ctx", "called\n"));
++
++ if (NULL == rowreq_ctx) {
++ snmp_log(LOG_ERR, "Couldn't allocate memory for a "
++ "dessertMeshifTable_rowreq_ctx.\n");
++ return NULL;
++ }
++
++ rowreq_ctx->oid_idx.oids = rowreq_ctx->oid_tmp;
++
++ rowreq_ctx->dessertMeshifTable_data_list = NULL;
++
++ /*
++ * if we allocated data, call init routine
++ */
++ if (!(rowreq_ctx->rowreq_flags & MFD_ROW_DATA_FROM_USER)) {
++ if (SNMPERR_SUCCESS !=
++ dessertMeshifTable_rowreq_ctx_init(rowreq_ctx,
++ user_init_ctx)) {
++ dessertMeshifTable_release_rowreq_ctx(rowreq_ctx);
++ rowreq_ctx = NULL;
++ }
++ }
++
++ return rowreq_ctx;
++} /* dessertMeshifTable_allocate_rowreq_ctx */
++
++/*
++ * @internal
++ * release resources for a dessertMeshifTable_rowreq_ctx
++ */
++void
++dessertMeshifTable_release_rowreq_ctx(dessertMeshifTable_rowreq_ctx *
++ rowreq_ctx)
++{
++ DEBUGMSGTL(("internal:dessertMeshifTable:dessertMeshifTable_release_rowreq_ctx", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ dessertMeshifTable_rowreq_ctx_cleanup(rowreq_ctx);
++
++ /*
++ * free index oid pointer
++ */
++ if (rowreq_ctx->oid_idx.oids != rowreq_ctx->oid_tmp)
++ free(rowreq_ctx->oid_idx.oids);
++
++ SNMP_FREE(rowreq_ctx);
++} /* dessertMeshifTable_release_rowreq_ctx */
++
++/**
++ * @internal
++ * wrapper
++ */
++static int
++_mfd_dessertMeshifTable_pre_request(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ int rc;
++
++ DEBUGMSGTL(("internal:dessertMeshifTable:_mfd_dessertMeshifTable_pre_request", "called\n"));
++
++ if (1 != netsnmp_row_merge_status_first(reginfo, agtreq_info)) {
++ DEBUGMSGTL(("internal:dessertMeshifTable",
++ "skipping additional pre_request\n"));
++ return SNMP_ERR_NOERROR;
++ }
++
++ rc = dessertMeshifTable_pre_request(dessertMeshifTable_if_ctx.
++ user_ctx);
++ if (MFD_SUCCESS != rc) {
++ /*
++ * nothing we can do about it but log it
++ */
++ DEBUGMSGTL(("dessertMeshifTable", "error %d from "
++ "dessertMeshifTable_pre_request\n", rc));
++ netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
++ }
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertMeshifTable_pre_request */
++
++/**
++ * @internal
++ * wrapper
++ */
++static int
++_mfd_dessertMeshifTable_post_request(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ dessertMeshifTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++ int rc, packet_rc;
++
++ DEBUGMSGTL(("internal:dessertMeshifTable:_mfd_dessertMeshifTable_post_request", "called\n"));
++
++ /*
++ * release row context, if deleted
++ */
++ if (rowreq_ctx && (rowreq_ctx->rowreq_flags & MFD_ROW_DELETED))
++ dessertMeshifTable_release_rowreq_ctx(rowreq_ctx);
++
++ /*
++ * wait for last call before calling user
++ */
++ if (1 != netsnmp_row_merge_status_last(reginfo, agtreq_info)) {
++ DEBUGMSGTL(("internal:dessertMeshifTable",
++ "waiting for last post_request\n"));
++ return SNMP_ERR_NOERROR;
++ }
++
++ packet_rc = netsnmp_check_all_requests_error(agtreq_info->asp, 0);
++ rc = dessertMeshifTable_post_request(dessertMeshifTable_if_ctx.
++ user_ctx, packet_rc);
++ if (MFD_SUCCESS != rc) {
++ /*
++ * nothing we can do about it but log it
++ */
++ DEBUGMSGTL(("dessertMeshifTable", "error %d from "
++ "dessertMeshifTable_post_request\n", rc));
++ }
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertMeshifTable_post_request */
++
++/**
++ * @internal
++ * wrapper
++ */
++static int
++_mfd_dessertMeshifTable_object_lookup(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration
++ *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ int rc = SNMP_ERR_NOERROR;
++ dessertMeshifTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++
++ DEBUGMSGTL(("internal:dessertMeshifTable:_mfd_dessertMeshifTable_object_lookup", "called\n"));
++
++ /*
++ * get our context from mfd
++ * dessertMeshifTable_interface_ctx *if_ctx =
++ * (dessertMeshifTable_interface_ctx *)reginfo->my_reg_void;
++ */
++
++ if (NULL == rowreq_ctx) {
++ rc = SNMP_ERR_NOCREATION;
++ }
++
++ if (MFD_SUCCESS != rc)
++ netsnmp_request_set_error_all(requests, rc);
++ else
++ dessertMeshifTable_row_prep(rowreq_ctx);
++
++ return SNMP_VALIDATE_ERR(rc);
++} /* _mfd_dessertMeshifTable_object_lookup */
++
++/***********************************************************************
++ *
++ * GET processing
++ *
++ ***********************************************************************/
++/*
++ * @internal
++ * Retrieve the value for a particular column
++ */
++NETSNMP_STATIC_INLINE int
++_dessertMeshifTable_get_column(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
++ netsnmp_variable_list * var, int column)
++{
++ int rc = SNMPERR_SUCCESS;
++
++ DEBUGMSGTL(("internal:dessertMeshifTable:_mfd_dessertMeshifTable_get_column", "called for %d\n", column));
++
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ switch (column) {
++
++ /*
++ * meshifName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ case COLUMN_MESHIFNAME:
++ var->type = ASN_OCTET_STR;
++ rc = meshifName_get(rowreq_ctx, (char **) &var->val.string,
++ &var->val_len);
++ break;
++
++ /*
++ * meshifMacAddress(3)/MacAddress/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ case COLUMN_MESHIFMACADDRESS:
++ var->type = ASN_OCTET_STR;
++ rc = meshifMacAddress_get(rowreq_ctx, (char **) &var->val.string,
++ &var->val_len);
++ break;
++
++ /*
++ * meshifInPkts(4)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ case COLUMN_MESHIFINPKTS:
++ var->val_len = sizeof(U64);
++ var->type = ASN_COUNTER64;
++ rc = meshifInPkts_get(rowreq_ctx, (U64 *) var->val.string);
++ break;
++
++ /*
++ * meshifOutPkts(5)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ case COLUMN_MESHIFOUTPKTS:
++ var->val_len = sizeof(U64);
++ var->type = ASN_COUNTER64;
++ rc = meshifOutPkts_get(rowreq_ctx, (U64 *) var->val.string);
++ break;
++
++ /*
++ * meshifInOctets(6)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ case COLUMN_MESHIFINOCTETS:
++ var->val_len = sizeof(U64);
++ var->type = ASN_COUNTER64;
++ rc = meshifInOctets_get(rowreq_ctx, (U64 *) var->val.string);
++ break;
++
++ /*
++ * meshifOutOctets(7)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ case COLUMN_MESHIFOUTOCTETS:
++ var->val_len = sizeof(U64);
++ var->type = ASN_COUNTER64;
++ rc = meshifOutOctets_get(rowreq_ctx, (U64 *) var->val.string);
++ break;
++
++ default:
++ if (DESSERTMESHIFTABLE_MIN_COL <= column
++ && column <= DESSERTMESHIFTABLE_MAX_COL) {
++ DEBUGMSGTL(("internal:dessertMeshifTable:_mfd_dessertMeshifTable_get_column", "assume column %d is reserved\n", column));
++ rc = MFD_SKIP;
++ } else {
++ snmp_log(LOG_ERR,
++ "unknown column %d in _dessertMeshifTable_get_column\n",
++ column);
++ }
++ break;
++ }
++
++ return rc;
++} /* _dessertMeshifTable_get_column */
++
++int
++_mfd_dessertMeshifTable_get_values(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration *reginfo,
++ netsnmp_agent_request_info *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ dessertMeshifTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++ netsnmp_table_request_info *tri;
++ u_char *old_string;
++ void (*dataFreeHook) (void *);
++ int rc;
++
++ DEBUGMSGTL(("internal:dessertMeshifTable:_mfd_dessertMeshifTable_get_values", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ for (; requests; requests = requests->next) {
++ /*
++ * save old pointer, so we can free it if replaced
++ */
++ old_string = requests->requestvb->val.string;
++ dataFreeHook = requests->requestvb->dataFreeHook;
++ if (NULL == requests->requestvb->val.string) {
++ requests->requestvb->val.string = requests->requestvb->buf;
++ requests->requestvb->val_len =
++ sizeof(requests->requestvb->buf);
++ } else if (requests->requestvb->buf ==
++ requests->requestvb->val.string) {
++ if (requests->requestvb->val_len !=
++ sizeof(requests->requestvb->buf))
++ requests->requestvb->val_len =
++ sizeof(requests->requestvb->buf);
++ }
++
++ /*
++ * get column data
++ */
++ tri = netsnmp_extract_table_info(requests);
++ if (NULL == tri)
++ continue;
++
++ rc = _dessertMeshifTable_get_column(rowreq_ctx,
++ requests->requestvb,
++ tri->colnum);
++ if (rc) {
++ if (MFD_SKIP == rc) {
++ requests->requestvb->type = SNMP_NOSUCHINSTANCE;
++ rc = SNMP_ERR_NOERROR;
++ }
++ } else if (NULL == requests->requestvb->val.string) {
++ snmp_log(LOG_ERR, "NULL varbind data pointer!\n");
++ rc = SNMP_ERR_GENERR;
++ }
++ if (rc)
++ netsnmp_request_set_error(requests, SNMP_VALIDATE_ERR(rc));
++
++ /*
++ * if the buffer wasn't used previously for the old data (i.e. it
++ * was allcoated memory) and the get routine replaced the pointer,
++ * we need to free the previous pointer.
++ */
++ if (old_string && (old_string != requests->requestvb->buf) &&
++ (requests->requestvb->val.string != old_string)) {
++ if (dataFreeHook)
++ (*dataFreeHook) (old_string);
++ else
++ free(old_string);
++ }
++ } /* for results */
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertMeshifTable_get_values */
++
++
++/***********************************************************************
++ *
++ * SET processing
++ *
++ ***********************************************************************/
++
++/*
++ * SET PROCESSING NOT APPLICABLE (per MIB or user setting)
++ */
++/***********************************************************************
++ *
++ * DATA ACCESS
++ *
++ ***********************************************************************/
++static void _container_free(netsnmp_container * container);
++
++/**
++ * @internal
++ */
++static int
++_cache_load(netsnmp_cache * cache, void *vmagic)
++{
++ DEBUGMSGTL(("internal:dessertMeshifTable:_cache_load", "called\n"));
++
++ if ((NULL == cache) || (NULL == cache->magic)) {
++ snmp_log(LOG_ERR,
++ "invalid cache for dessertMeshifTable_cache_load\n");
++ return -1;
++ }
++
++ /** should only be called for an invalid or expired cache */
++ netsnmp_assert((0 == cache->valid) || (1 == cache->expired));
++
++ /*
++ * call user code
++ */
++ return dessertMeshifTable_container_load((netsnmp_container *) cache->
++ magic);
++} /* _cache_load */
++
++/**
++ * @internal
++ */
++static void
++_cache_free(netsnmp_cache * cache, void *magic)
++{
++ netsnmp_container *container;
++
++ DEBUGMSGTL(("internal:dessertMeshifTable:_cache_free", "called\n"));
++
++ if ((NULL == cache) || (NULL == cache->magic)) {
++ snmp_log(LOG_ERR,
++ "invalid cache in dessertMeshifTable_cache_free\n");
++ return;
++ }
++
++ container = (netsnmp_container *) cache->magic;
++
++ _container_free(container);
++} /* _cache_free */
++
++/**
++ * @internal
++ */
++static void
++_container_item_free(dessertMeshifTable_rowreq_ctx * rowreq_ctx,
++ void *context)
++{
++ DEBUGMSGTL(("internal:dessertMeshifTable:_container_item_free",
++ "called\n"));
++
++ if (NULL == rowreq_ctx)
++ return;
++
++ dessertMeshifTable_release_rowreq_ctx(rowreq_ctx);
++} /* _container_item_free */
++
++/**
++ * @internal
++ */
++static void
++_container_free(netsnmp_container * container)
++{
++ DEBUGMSGTL(("internal:dessertMeshifTable:_container_free",
++ "called\n"));
++
++ if (NULL == container) {
++ snmp_log(LOG_ERR,
++ "invalid container in dessertMeshifTable_container_free\n");
++ return;
++ }
++
++ /*
++ * call user code
++ */
++ dessertMeshifTable_container_free(container);
++
++ /*
++ * free all items. inefficient, but easy.
++ */
++ CONTAINER_CLEAR(container,
++ (netsnmp_container_obj_func *) _container_item_free,
++ NULL);
++} /* _container_free */
++
++/**
++ * @internal
++ * initialize the container with functions or wrappers
++ */
++void
++_dessertMeshifTable_container_init(dessertMeshifTable_interface_ctx *
++ if_ctx)
++{
++ DEBUGMSGTL(("internal:dessertMeshifTable:_dessertMeshifTable_container_init", "called\n"));
++
++ /*
++ * cache init
++ */
++ if_ctx->cache = netsnmp_cache_create(30, /* timeout in seconds */
++ _cache_load, _cache_free,
++ dessertMeshifTable_oid,
++ dessertMeshifTable_oid_size);
++
++ if (NULL == if_ctx->cache) {
++ snmp_log(LOG_ERR, "error creating cache for dessertMeshifTable\n");
++ return;
++ }
++
++ if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;
++
++ dessertMeshifTable_container_init(&if_ctx->container, if_ctx->cache);
++ if (NULL == if_ctx->container)
++ if_ctx->container =
++ netsnmp_container_find("dessertMeshifTable:table_container");
++ if (NULL == if_ctx->container) {
++ snmp_log(LOG_ERR, "error creating container in "
++ "dessertMeshifTable_container_init\n");
++ return;
++ }
++
++ if (NULL != if_ctx->cache)
++ if_ctx->cache->magic = (void *) if_ctx->container;
++} /* _dessertMeshifTable_container_init */
++
++/**
++ * @internal
++ * shutdown the container with functions or wrappers
++ */
++void
++_dessertMeshifTable_container_shutdown(dessertMeshifTable_interface_ctx *
++ if_ctx)
++{
++ DEBUGMSGTL(("internal:dessertMeshifTable:_dessertMeshifTable_container_shutdown", "called\n"));
++
++ dessertMeshifTable_container_shutdown(if_ctx->container);
++
++ _container_free(if_ctx->container);
++
++} /* _dessertMeshifTable_container_shutdown */
++
++
++dessertMeshifTable_rowreq_ctx *
++dessertMeshifTable_row_find_by_mib_index(dessertMeshifTable_mib_index *
++ mib_idx)
++{
++ dessertMeshifTable_rowreq_ctx *rowreq_ctx;
++ oid oid_tmp[MAX_OID_LEN];
++ netsnmp_index oid_idx;
++ int rc;
++
++ /*
++ * set up storage for OID
++ */
++ oid_idx.oids = oid_tmp;
++ oid_idx.len = sizeof(oid_tmp) / sizeof(oid);
++
++ /*
++ * convert
++ */
++ rc = dessertMeshifTable_index_to_oid(&oid_idx, mib_idx);
++ if (MFD_SUCCESS != rc)
++ return NULL;
++
++ rowreq_ctx =
++ CONTAINER_FIND(dessertMeshifTable_if_ctx.container, &oid_idx);
++
++ return rowreq_ctx;
++}
+diff --git a/src/snmp/dessertMeshifTable_interface.h b/src/snmp/dessertMeshifTable_interface.h
+new file mode 100644
+index 0000000..5bee20c
+--- /dev/null
++++ b/src/snmp/dessertMeshifTable_interface.h
+@@ -0,0 +1,98 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 15899 $ of $
++ *
++ * $Id:$
++ */
++/** @ingroup interface: Routines to interface to Net-SNMP
++ *
++ * \warning This code should not be modified, called directly,
++ * or used to interpret functionality. It is subject to
++ * change at any time.
++ *
++ * @{
++ */
++/*
++ * *********************************************************************
++ * *********************************************************************
++ * *********************************************************************
++ * *** ***
++ * *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
++ * *** ***
++ * *** ***
++ * *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
++ * *** ***
++ * *** ***
++ * *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
++ * *** ***
++ * *** ***
++ * *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
++ * *** ***
++ * *** ***
++ * *********************************************************************
++ * *********************************************************************
++ * *********************************************************************
++ */
++#ifndef DESSERTMESHIFTABLE_INTERFACE_H
++#define DESSERTMESHIFTABLE_INTERFACE_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++#include "dessertMeshifTable.h"
++
++
++ /*
++ ********************************************************************
++ * Table declarations
++ */
++
++ /*
++ * PUBLIC interface initialization routine
++ */
++ void
++ _dessertMeshifTable_initialize_interface
++ (dessertMeshifTable_registration * user_ctx, u_long flags);
++ void
++ _dessertMeshifTable_shutdown_interface
++ (dessertMeshifTable_registration * user_ctx);
++
++ dessertMeshifTable_registration
++ *dessertMeshifTable_registration_get(void);
++
++ dessertMeshifTable_registration
++ *dessertMeshifTable_registration_set
++ (dessertMeshifTable_registration * newreg);
++
++ netsnmp_container *dessertMeshifTable_container_get(void);
++ int dessertMeshifTable_container_size(void);
++
++ dessertMeshifTable_rowreq_ctx
++ *dessertMeshifTable_allocate_rowreq_ctx(void *);
++ void
++ dessertMeshifTable_release_rowreq_ctx(dessertMeshifTable_rowreq_ctx
++ * rowreq_ctx);
++
++ int dessertMeshifTable_index_to_oid(netsnmp_index *
++ oid_idx,
++ dessertMeshifTable_mib_index
++ * mib_idx);
++ int dessertMeshifTable_index_from_oid(netsnmp_index *
++ oid_idx,
++ dessertMeshifTable_mib_index
++ * mib_idx);
++
++ /*
++ * access to certain internals. use with caution!
++ */
++ void
++ dessertMeshifTable_valid_columns_set(netsnmp_column_info *vc);
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTMESHIFTABLE_INTERFACE_H */
++/** @} */
+diff --git a/src/snmp/dessertMeshifTable_oids.h b/src/snmp/dessertMeshifTable_oids.h
+new file mode 100644
+index 0000000..cbb5334
+--- /dev/null
++++ b/src/snmp/dessertMeshifTable_oids.h
+@@ -0,0 +1,43 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * : generic-table-oids.m2c 12855 2005-09-27 15:56:08Z rstory $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTMESHIFTABLE_OIDS_H
++#define DESSERTMESHIFTABLE_OIDS_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++ /*
++ * column number definitions for table dessertMeshifTable
++ */
++#define DESSERTMESHIFTABLE_OID 1,3,6,1,4,1,18898,0,19,10,1,1,5
++
++#define COLUMN_MESHIFINDEX 1
++
++#define COLUMN_MESHIFNAME 2
++
++#define COLUMN_MESHIFMACADDRESS 3
++
++#define COLUMN_MESHIFINPKTS 4
++
++#define COLUMN_MESHIFOUTPKTS 5
++
++#define COLUMN_MESHIFINOCTETS 6
++
++#define COLUMN_MESHIFOUTOCTETS 7
++
++
++#define DESSERTMESHIFTABLE_MIN_COL COLUMN_MESHIFNAME
++#define DESSERTMESHIFTABLE_MAX_COL COLUMN_MESHIFOUTOCTETS
++
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTMESHIFTABLE_OIDS_H */
+diff --git a/src/snmp/dessertObjects.c b/src/snmp/dessertObjects.c
+new file mode 100644
+index 0000000..cecc53e
+--- /dev/null
++++ b/src/snmp/dessertObjects.c
+@@ -0,0 +1,165 @@
++/**
++ * Note: this file originally auto-generated by mib2c using
++ * : mib2c.scalar.conf 11805 2005-01-07 09:37:18Z dts12 $
++ */
++
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++#include "dessert_internal.h"
++
++/** Initializes the dessertObjects module */
++void
++init_dessertObjects(void)
++{
++ static oid dessertMeshifNumber_oid[] =
++ { 1, 3, 6, 1, 4, 1, 18898, 0, 19, 10, 1, 1, 4 };
++ static oid applicationVersion_oid[] =
++ { 1, 3, 6, 1, 4, 1, 18898, 0, 19, 10, 1, 1, 3, 2 };
++ static oid protocollShortName_oid[] =
++ { 1, 3, 6, 1, 4, 1, 18898, 0, 19, 10, 1, 1, 3, 3 };
++
++ DEBUGMSGTL((AGENT, "Initializing\n"));
++
++ netsnmp_register_scalar(netsnmp_create_handler_registration
++ ("dessertMeshifNumber",
++ handle_dessertMeshifNumber,
++ dessertMeshifNumber_oid,
++ OID_LENGTH(dessertMeshifNumber_oid),
++ HANDLER_CAN_RONLY));
++ netsnmp_register_scalar(netsnmp_create_handler_registration
++ ("applicationVersion",
++ handle_applicationVersion,
++ applicationVersion_oid,
++ OID_LENGTH(applicationVersion_oid),
++ HANDLER_CAN_RONLY));
++ netsnmp_register_scalar(netsnmp_create_handler_registration
++ ("protocollShortName",
++ handle_protocollShortName,
++ protocollShortName_oid,
++ OID_LENGTH(protocollShortName_oid),
++ HANDLER_CAN_RONLY));
++}
++
++int
++handle_dessertMeshifNumber(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration *reginfo,
++ netsnmp_agent_request_info *reqinfo,
++ netsnmp_request_info *requests)
++{
++ u_char meshif_count;
++
++ dessert_meshif_t *meshif;
++
++ DL_FOREACH(dessert_meshiflist_get(), meshif){
++ meshif_count++;
++ }
++
++ /*
++ * We are never called for a GETNEXT if it's registered as a
++ * "instance", as it's "magically" handled for us.
++ */
++
++ /*
++ * a instance handler also only hands us one request at a time, so
++ * we don't need to loop over a list of requests; we'll only get one.
++ */
++
++ switch (reqinfo->mode) {
++
++ case MODE_GET:
++ DEBUGMSGTL((AGENT, "handle_dessertMeshifNumber:MODE_GET\n"));
++ snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
++ (u_char *) &meshif_count, sizeof(u_char));
++ break;
++
++
++ default:
++ /*
++ * we should never get here, so this is a really bad error
++ */
++ snmp_log(LOG_ERR,
++ "unknown mode (%d) in handle_dessertMeshifNumber\n",
++ reqinfo->mode);
++ return SNMP_ERR_GENERR;
++ }
++
++ return SNMP_ERR_NOERROR;
++}
++
++int
++handle_applicationVersion(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration *reginfo,
++ netsnmp_agent_request_info *reqinfo,
++ netsnmp_request_info *requests)
++{
++ /*
++ * We are never called for a GETNEXT if it's registered as a
++ * "instance", as it's "magically" handled for us.
++ */
++
++ /*
++ * a instance handler also only hands us one request at a time, so
++ * we don't need to loop over a list of requests; we'll only get one.
++ */
++
++ switch (reqinfo->mode) {
++
++ case MODE_GET:
++ DEBUGMSGTL((AGENT, "handle_applicationVersion:MODE_GET\n"));
++ snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
++ (u_char *) &dessert_ver, sizeof(dessert_ver));
++ break;
++
++
++ default:
++ /*
++ * we should never get here, so this is a really bad error
++ */
++ snmp_log(LOG_ERR,
++ "unknown mode (%d) in handle_applicationVersion\n",
++ reqinfo->mode);
++ return SNMP_ERR_GENERR;
++ }
++
++ return SNMP_ERR_NOERROR;
++}
++
++int
++handle_protocollShortName(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration *reginfo,
++ netsnmp_agent_request_info *reqinfo,
++ netsnmp_request_info *requests)
++{
++ /*
++ * We are never called for a GETNEXT if it's registered as a
++ * "instance", as it's "magically" handled for us.
++ */
++
++ /*
++ * a instance handler also only hands us one request at a time, so
++ * we don't need to loop over a list of requests; we'll only get one.
++ */
++
++ switch (reqinfo->mode) {
++
++ case MODE_GET:
++ DEBUGMSGTL((AGENT, "handle_protocollShortName:MODE_GET\n"));
++ snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
++ (u_char *) dessert_proto, DESSERT_PROTO_STRLEN+1);
++ break;
++
++
++ default:
++ /*
++ * we should never get here, so this is a really bad error
++ */
++ snmp_log(LOG_ERR,
++ "unknown mode (%d) in handle_protocollShortName\n",
++ reqinfo->mode);
++ return SNMP_ERR_GENERR;
++ }
++
++ return SNMP_ERR_NOERROR;
++}
+diff --git a/src/snmp/dessertObjects.h b/src/snmp/dessertObjects.h
+new file mode 100644
+index 0000000..520601d
+--- /dev/null
++++ b/src/snmp/dessertObjects.h
+@@ -0,0 +1,17 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * : mib2c.scalar.conf 11805 2005-01-07 09:37:18Z dts12 $
++ */
++#ifndef DESSERTOBJECTS_H
++#define DESSERTOBJECTS_H
++
++
++/*
++ * function declarations
++ */
++void init_dessertObjects(void);
++Netsnmp_Node_Handler handle_dessertMeshifNumber;
++Netsnmp_Node_Handler handle_applicationVersion;
++Netsnmp_Node_Handler handle_protocollShortName;
++
++#endif /* DESSERTOBJECTS_H */
+diff --git a/src/snmp/dessertSysifTable.c b/src/snmp/dessertSysifTable.c
+new file mode 100644
+index 0000000..63cf3ee
+--- /dev/null
++++ b/src/snmp/dessertSysifTable.c
+@@ -0,0 +1,215 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 14170 $ of $
++ *
++ * $Id:$
++ */
++/** \page MFD helper for dessertSysifTable
++ *
++ * \section intro Introduction
++ * Introductory text.
++ *
++ */
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertSysifTable.h"
++
++#include <net-snmp/agent/mib_modules.h>
++
++#include "dessertSysifTable_interface.h"
++
++oid dessertSysifTable_oid[] = { DESSERTSYSIFTABLE_OID };
++
++int dessertSysifTable_oid_size =
++OID_LENGTH(dessertSysifTable_oid);
++
++dessertSysifTable_registration dessertSysifTable_user_context;
++
++void initialize_table_dessertSysifTable(void);
++void shutdown_table_dessertSysifTable(void);
++
++
++/**
++ * Initializes the dessertSysifTable module
++ */
++void
++init_dessertSysifTable(void)
++{
++ DEBUGMSGTL(("verbose:dessertSysifTable:init_dessertSysifTable",
++ "called\n"));
++
++ /*
++ * TODO:300:o: Perform dessertSysifTable one-time module initialization.
++ */
++
++ /*
++ * here we initialize all the tables we're planning on supporting
++ */
++ if (should_init("dessertSysifTable"))
++ initialize_table_dessertSysifTable();
++
++} /* init_dessertSysifTable */
++
++/**
++ * Shut-down the dessertSysifTable module (agent is exiting)
++ */
++void
++shutdown_dessertSysifTable(void)
++{
++ if (should_init("dessertSysifTable"))
++ shutdown_table_dessertSysifTable();
++
++}
++
++/**
++ * Initialize the table dessertSysifTable
++ * (Define its contents and how it's structured)
++ */
++void
++initialize_table_dessertSysifTable(void)
++{
++ dessertSysifTable_registration *user_context;
++ u_long flags;
++
++ DEBUGMSGTL(("verbose:dessertSysifTable:initialize_table_dessertSysifTable", "called\n"));
++
++ /*
++ * TODO:301:o: Perform dessertSysifTable one-time table initialization.
++ */
++
++ /*
++ * TODO:302:o: |->Initialize dessertSysifTable user context
++ * if you'd like to pass in a pointer to some data for this
++ * table, allocate or set it up here.
++ */
++ /*
++ * a netsnmp_data_list is a simple way to store void pointers. A simple
++ * string token is used to add, find or remove pointers.
++ */
++ user_context =
++ netsnmp_create_data_list("dessertSysifTable", NULL, NULL);
++
++ /*
++ * No support for any flags yet, but in the future you would
++ * set any flags here.
++ */
++ flags = 0;
++
++ /*
++ * call interface initialization code
++ */
++ _dessertSysifTable_initialize_interface(user_context, flags);
++} /* initialize_table_dessertSysifTable */
++
++/**
++ * Shutdown the table dessertSysifTable
++ */
++void
++shutdown_table_dessertSysifTable(void)
++{
++ /*
++ * call interface shutdown code
++ */
++ _dessertSysifTable_shutdown_interface(&dessertSysifTable_user_context);
++}
++
++/**
++ * extra context initialization (eg default values)
++ *
++ * @param rowreq_ctx : row request context
++ * @param user_init_ctx : void pointer for user (parameter to rowreq_ctx_allocate)
++ *
++ * @retval MFD_SUCCESS : no errors
++ * @retval MFD_ERROR : error (context allocate will fail)
++ */
++int
++dessertSysifTable_rowreq_ctx_init(dessertSysifTable_rowreq_ctx *
++ rowreq_ctx, void *user_init_ctx)
++{
++ DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_rowreq_ctx_init", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:210:o: |-> Perform extra dessertSysifTable rowreq initialization. (eg DEFVALS)
++ */
++
++ return MFD_SUCCESS;
++} /* dessertSysifTable_rowreq_ctx_init */
++
++/**
++ * extra context cleanup
++ *
++ */
++void
++dessertSysifTable_rowreq_ctx_cleanup(dessertSysifTable_rowreq_ctx *
++ rowreq_ctx)
++{
++ DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_rowreq_ctx_cleanup", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:211:o: |-> Perform extra dessertSysifTable rowreq cleanup.
++ */
++} /* dessertSysifTable_rowreq_ctx_cleanup */
++
++/**
++ * pre-request callback
++ *
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error
++ */
++int
++dessertSysifTable_pre_request(dessertSysifTable_registration *
++ user_context)
++{
++ DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_pre_request",
++ "called\n"));
++
++ /*
++ * TODO:510:o: Perform dessertSysifTable pre-request actions.
++ */
++
++ return MFD_SUCCESS;
++} /* dessertSysifTable_pre_request */
++
++/**
++ * post-request callback
++ *
++ * Note:
++ * New rows have been inserted into the container, and
++ * deleted rows have been removed from the container and
++ * released.
++ *
++ * @param user_context
++ * @param rc : MFD_SUCCESS if all requests succeeded
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error (ignored)
++ */
++int
++dessertSysifTable_post_request(dessertSysifTable_registration *
++ user_context, int rc)
++{
++ DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_post_request",
++ "called\n"));
++
++ /*
++ * TODO:511:o: Perform dessertSysifTable post-request actions.
++ */
++
++ return MFD_SUCCESS;
++} /* dessertSysifTable_post_request */
++
++
++/** @{ */
+diff --git a/src/snmp/dessertSysifTable.h b/src/snmp/dessertSysifTable.h
+new file mode 100644
+index 0000000..30f4300
+--- /dev/null
++++ b/src/snmp/dessertSysifTable.h
+@@ -0,0 +1,230 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 14170 $ of $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTSYSIFTABLE_H
++#define DESSERTSYSIFTABLE_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++/** @addtogroup misc misc: Miscellaneous routines
++ *
++ * @{
++ */
++#include <net-snmp/library/asn1.h>
++
++ /*
++ * other required module components
++ */
++ /* *INDENT-OFF* */
++config_add_mib(DESSERT2-MIB)
++config_require(DESSERT2-MIB/dessertSysifTable/dessertSysifTable_interface)
++config_require(DESSERT2-MIB/dessertSysifTable/dessertSysifTable_data_access)
++config_require(DESSERT2-MIB/dessertSysifTable/dessertSysifTable_data_get)
++config_require(DESSERT2-MIB/dessertSysifTable/dessertSysifTable_data_set)
++ /* *INDENT-ON* */
++
++ /*
++ * OID and column number definitions for dessertSysifTable
++ */
++#include "dessertSysifTable_oids.h"
++
++ /*
++ * enum definions
++ */
++#include "dessertSysifTable_enums.h"
++
++
++
++/*
++ *********************************************************************
++ * function declarations
++ */
++ void init_dessertSysifTable(void);
++ void shutdown_dessertSysifTable(void);
++
++ /*
++ *********************************************************************
++ * Table declarations
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertSysifTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++ /*
++ * DESSERT2-MIB::dessertSysifTable is subid 7 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.7, length: 12
++ */
++ /*
++ *********************************************************************
++ * When you register your mib, you get to provide a generic
++ * pointer that will be passed back to you for most of the
++ * functions calls.
++ *
++ * TODO:100:r: Review all context structures
++ */
++ /*
++ * TODO:101:o: |-> Review dessertSysifTable registration context.
++ */
++ typedef netsnmp_data_list dessertSysifTable_registration;
++
++/**********************************************************************/
++ /*
++ * TODO:110:r: |-> Review dessertSysifTable data context structure.
++ * This structure is used to represent the data for dessertSysifTable.
++ */
++ /*
++ * This structure contains storage for all the columns defined in the
++ * dessertSysifTable.
++ */
++ typedef struct dessertSysifTable_data_s {
++
++ /*
++ * sysifName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ char sysifName[255];
++ size_t sysifName_len; /* # of char elements, not bytes */
++
++ /*
++ * sysifMacAddress(3)/MacAddress/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ char sysifMacAddress[6];
++ size_t sysifMacAddress_len; /* # of char elements, not bytes */
++
++ /*
++ * sysifInPkts(4)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ U64 sysifInPkts;
++
++ /*
++ * sysifOutPkts(5)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ U64 sysifOutPkts;
++
++ /*
++ * sysifInOctets(6)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ U64 sysifInOctets;
++
++ /*
++ * sysifOutOctets(7)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ U64 sysifOutOctets;
++
++ } dessertSysifTable_data;
++
++
++ /*
++ * TODO:120:r: |-> Review dessertSysifTable mib index.
++ * This structure is used to represent the index for dessertSysifTable.
++ */
++ typedef struct dessertSysifTable_mib_index_s {
++
++ /*
++ * sysifIndex(1)///()//L/a/w/e/r/d/h
++ */
++ long sysifIndex;
++
++
++ } dessertSysifTable_mib_index;
++
++ /*
++ * TODO:121:r: | |-> Review dessertSysifTable max index length.
++ * If you KNOW that your indexes will never exceed a certain
++ * length, update this macro to that length.
++ */
++#define MAX_dessertSysifTable_IDX_LEN 1
++
++
++ /*
++ *********************************************************************
++ * TODO:130:o: |-> Review dessertSysifTable Row request (rowreq) context.
++ * When your functions are called, you will be passed a
++ * dessertSysifTable_rowreq_ctx pointer.
++ */
++ typedef struct dessertSysifTable_rowreq_ctx_s {
++
++ /** this must be first for container compare to work */
++ netsnmp_index oid_idx;
++ oid oid_tmp[MAX_dessertSysifTable_IDX_LEN];
++
++ dessertSysifTable_mib_index tbl_idx;
++
++ dessertSysifTable_data data;
++
++ /*
++ * flags per row. Currently, the first (lower) 8 bits are reserved
++ * for the user. See mfd.h for other flags.
++ */
++ u_int rowreq_flags;
++
++ /*
++ * TODO:131:o: | |-> Add useful data to dessertSysifTable rowreq context.
++ */
++
++ /*
++ * storage for future expansion
++ */
++ netsnmp_data_list *dessertSysifTable_data_list;
++
++ } dessertSysifTable_rowreq_ctx;
++
++ typedef struct dessertSysifTable_ref_rowreq_ctx_s {
++ dessertSysifTable_rowreq_ctx *rowreq_ctx;
++ } dessertSysifTable_ref_rowreq_ctx;
++
++ /*
++ *********************************************************************
++ * function prototypes
++ */
++ int
++ dessertSysifTable_pre_request(dessertSysifTable_registration *
++ user_context);
++ int
++ dessertSysifTable_post_request(dessertSysifTable_registration *
++ user_context, int rc);
++
++ int
++ dessertSysifTable_rowreq_ctx_init(dessertSysifTable_rowreq_ctx *
++ rowreq_ctx, void *user_init_ctx);
++ void
++ dessertSysifTable_rowreq_ctx_cleanup(dessertSysifTable_rowreq_ctx *
++ rowreq_ctx);
++
++
++ dessertSysifTable_rowreq_ctx
++ *dessertSysifTable_row_find_by_mib_index
++ (dessertSysifTable_mib_index * mib_idx);
++
++ extern oid dessertSysifTable_oid[];
++ extern int dessertSysifTable_oid_size;
++
++#include "dessertSysifTable_interface.h"
++#include "dessertSysifTable_data_access.h"
++#include "dessertSysifTable_data_get.h"
++#include "dessertSysifTable_data_set.h"
++
++ /*
++ * DUMMY markers, ignore
++ *
++ * TODO:099:x: *************************************************************
++ * TODO:199:x: *************************************************************
++ * TODO:299:x: *************************************************************
++ * TODO:399:x: *************************************************************
++ * TODO:499:x: *************************************************************
++ */
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTSYSIFTABLE_H */
++/** @} */
+diff --git a/src/snmp/dessertSysifTable_data_access.c b/src/snmp/dessertSysifTable_data_access.c
+new file mode 100644
+index 0000000..b409a89
+--- /dev/null
++++ b/src/snmp/dessertSysifTable_data_access.c
+@@ -0,0 +1,336 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 14170 $ of $
++ *
++ * $Id:$
++ */
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++#include "dessertSysifTable_data_access.h"
++
++/** @ingroup interface
++ * @addtogroup data_access data_access: Routines to access data
++ *
++ * These routines are used to locate the data used to satisfy
++ * requests.
++ *
++ * @{
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertSysifTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++/*
++ * DESSERT2-MIB::dessertSysifTable is subid 7 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.7, length: 12
++ */
++
++/**
++ * initialization for dessertSysifTable data access
++ *
++ * This function is called during startup to allow you to
++ * allocate any resources you need for the data table.
++ *
++ * @param dessertSysifTable_reg
++ * Pointer to dessertSysifTable_registration
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : unrecoverable error.
++ */
++int
++dessertSysifTable_init_data(dessertSysifTable_registration *
++ dessertSysifTable_reg)
++{
++ DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_init_data",
++ "called\n"));
++
++ return MFD_SUCCESS;
++} /* dessertSysifTable_init_data */
++
++/**
++ * container overview
++ *
++ */
++
++/**
++ * container initialization
++ *
++ * @param container_ptr_ptr A pointer to a container pointer. If you
++ * create a custom container, use this parameter to return it
++ * to the MFD helper. If set to NULL, the MFD helper will
++ * allocate a container for you.
++ * @param cache A pointer to a cache structure. You can set the timeout
++ * and other cache flags using this pointer.
++ *
++ * This function is called at startup to allow you to customize certain
++ * aspects of the access method. For the most part, it is for advanced
++ * users. The default code should suffice for most cases. If no custom
++ * container is allocated, the MFD code will create one for your.
++ *
++ * This is also the place to set up cache behavior. The default, to
++ * simply set the cache timeout, will work well with the default
++ * container. If you are using a custom container, you may want to
++ * look at the cache helper documentation to see if there are any
++ * flags you want to set.
++ *
++ * @remark
++ * This would also be a good place to do any initialization needed
++ * for you data source. For example, opening a connection to another
++ * process that will supply the data, opening a database, etc.
++ */
++void
++dessertSysifTable_container_init(netsnmp_container ** container_ptr_ptr,
++ netsnmp_cache * cache)
++{
++ DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_container_init", "called\n"));
++ dessert_debug("dessertSysifTable_container_load called");
++ if (NULL == container_ptr_ptr) {
++ snmp_log(LOG_ERR,
++ "bad container param to dessertSysifTable_container_init\n");
++ return;
++ }
++
++ /*
++ * For advanced users, you can use a custom container. If you
++ * do not create one, one will be created for you.
++ */
++ *container_ptr_ptr = NULL;
++
++ if (NULL == cache) {
++ snmp_log(LOG_ERR,
++ "bad cache param to dessertSysifTable_container_init\n");
++ return;
++ }
++
++ /*
++ * TODO:345:A: Set up dessertSysifTable cache properties.
++ *
++ * Also for advanced users, you can set parameters for the
++ * cache. Do not change the magic pointer, as it is used
++ * by the MFD helper. To completely disable caching, set
++ * cache->enabled to 0.
++ */
++ cache->timeout = DESSERTSYSIFTABLE_CACHE_TIMEOUT; /* seconds */
++} /* dessertSysifTable_container_init */
++
++/**
++ * container shutdown
++ *
++ * @param container_ptr A pointer to the container.
++ *
++ * This function is called at shutdown to allow you to customize certain
++ * aspects of the access method. For the most part, it is for advanced
++ * users. The default code should suffice for most cases.
++ *
++ * This function is called before dessertSysifTable_container_free().
++ *
++ * @remark
++ * This would also be a good place to do any cleanup needed
++ * for you data source. For example, closing a connection to another
++ * process that supplied the data, closing a database, etc.
++ */
++void
++dessertSysifTable_container_shutdown(netsnmp_container * container_ptr)
++{
++ DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_container_shutdown", "called\n"));
++
++ if (NULL == container_ptr) {
++ snmp_log(LOG_ERR,
++ "bad params to dessertSysifTable_container_shutdown\n");
++ return;
++ }
++
++} /* dessertSysifTable_container_shutdown */
++
++/**
++ * load initial data
++ *
++ * TODO:350:M: Implement dessertSysifTable data load
++ * This function will also be called by the cache helper to load
++ * the container again (after the container free function has been
++ * called to free the previous contents).
++ *
++ * @param container container to which items should be inserted
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_RESOURCE_UNAVAILABLE : Can't access data source
++ * @retval MFD_ERROR : other error.
++ *
++ * This function is called to load the index(es) (and data, optionally)
++ * for the every row in the data set.
++ *
++ * @remark
++ * While loading the data, the only important thing is the indexes.
++ * If access to your data is cheap/fast (e.g. you have a pointer to a
++ * structure in memory), it would make sense to update the data here.
++ * If, however, the accessing the data invovles more work (e.g. parsing
++ * some other existing data, or peforming calculations to derive the data),
++ * then you can limit yourself to setting the indexes and saving any
++ * information you will need later. Then use the saved information in
++ * dessertSysifTable_row_prep() for populating data.
++ *
++ * @note
++ * If you need consistency between rows (like you want statistics
++ * for each row to be from the same time frame), you should set all
++ * data here.
++ *
++ */
++int dessertSysifTable_container_load(netsnmp_container * container) {
++
++ dessertSysifTable_rowreq_ctx *rowreq_ctx;
++ dessert_sysif_t *sysif = _dessert_sysif; /* TODO: change if multiple tun/tap interfaces are supported*/
++
++ char inPkts[I64CHARSZ + 1];
++ char outPkts[I64CHARSZ + 1];
++ char inOctets[I64CHARSZ + 1];
++ char outOctets[I64CHARSZ + 1];
++
++ /*
++ * temporary storage for index values
++ */
++ /*
++ * sysifIndex(1)///()//L/a/w/e/r/d/h
++ */
++ long sysifIndex = 0;
++
++ dessert_debug("dessertSysifTable_container_load called");
++ DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_container_load", "called\n"));
++
++ /*
++ * TODO:351:M: |-> Load/update data in the dessertSysTable container.
++ * loop over your dessertSysifTable data, allocate a rowreq context,
++ * set the index(es) [and data, optionally] and insert into
++ * the container.
++ */
++
++ /*
++ * TODO:352:M: | |-> set indexes in new dessertSysifTable rowreq context.
++ * data context will be set from the param (unless NULL,
++ * in which case a new data context will be allocated)
++ */
++ rowreq_ctx = dessertSysifTable_allocate_rowreq_ctx(NULL);
++ if (NULL == rowreq_ctx) {
++ snmp_log(LOG_ERR, "memory allocation failed\n");
++ return MFD_RESOURCE_UNAVAILABLE;
++ }
++
++ if (MFD_SUCCESS != dessertSysifTable_indexes_set(rowreq_ctx, sysifIndex)) {
++ snmp_log(LOG_ERR, "error setting index while loading "
++ "dessertSysTable data.\n");
++ dessertSysifTable_release_rowreq_ctx(rowreq_ctx);
++ return MFD_RESOURCE_UNAVAILABLE;
++ }
++
++ /*
++ * TODO:352:r: | |-> populate dessertMeshifTable data context.
++ * Populate data context here. (optionally, delay until row prep)
++ */
++ /*
++ * non-TRANSIENT data: no need to copy. set pointer to data
++ */
++
++ rowreq_ctx->data.sysifName_len = strlen(sysif->if_name);
++ strcpy(rowreq_ctx->data.sysifName, sysif->if_name);
++
++ rowreq_ctx->data.sysifMacAddress_len = 6;
++ memcpy(rowreq_ctx->data.sysifMacAddress, sysif->hwaddr, 6);
++
++ pthread_mutex_lock(&(sysif->cnt_mutex));
++
++ rowreq_ctx->data.sysifInPkts.low = sysif->ipkts & 0xffffffff;
++ rowreq_ctx->data.sysifInPkts.high = sysif->ipkts >> 32;
++
++ rowreq_ctx->data.sysifOutPkts.low = sysif->opkts & 0xffffffff;
++ rowreq_ctx->data.sysifOutPkts.high = sysif->opkts >> 32;
++
++ rowreq_ctx->data.sysifInOctets.low = sysif->ibytes & 0xffffffff;
++ rowreq_ctx->data.sysifInOctets.high = sysif->ibytes >> 32;
++
++ rowreq_ctx->data.sysifOutOctets.low = sysif->obytes & 0xffffffff;
++ rowreq_ctx->data.sysifOutOctets.high = sysif->obytes >> 32;
++
++ printU64(inPkts, &rowreq_ctx->data.sysifInPkts);
++ printU64(outPkts, &rowreq_ctx->data.sysifOutPkts);
++ printU64(inOctets, &rowreq_ctx->data.sysifInOctets);
++ printU64(outOctets, &rowreq_ctx->data.sysifOutOctets);
++
++ dessert_debug("inPkts [%s] [%u]", inPkts, sysif->ipkts);
++ dessert_debug("outPkts [%s] [%u]", outPkts, sysif->opkts);
++ dessert_debug("inOctets [%s] [%u]", inOctets, sysif->ibytes);
++ dessert_debug("outOctets [%s] [%u]", outOctets, sysif->obytes);
++
++ pthread_mutex_unlock(&(sysif->cnt_mutex));
++
++ /*
++ * insert into table container
++ */
++ CONTAINER_INSERT(container, rowreq_ctx);
++
++ DEBUGMSGT(("verbose:dessertSysifTable:dessertSysifTable_container_load", "inserted 1 record(s)\n"));
++
++ return MFD_SUCCESS;
++} /* dessertSysifTable_container_load */
++
++/**
++ * container clean up
++ *
++ * @param container container with all current items
++ *
++ * This optional callback is called prior to all
++ * item's being removed from the container. If you
++ * need to do any processing before that, do it here.
++ *
++ * @note
++ * The MFD helper will take care of releasing all the row contexts.
++ *
++ */
++void
++dessertSysifTable_container_free(netsnmp_container * container)
++{
++ DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_container_free", "called\n"));
++
++ /*
++ * TODO:380:M: Free dessertSysifTable container data.
++ */
++} /* dessertSysifTable_container_free */
++
++/**
++ * prepare row for processing.
++ *
++ * When the agent has located the row for a request, this function is
++ * called to prepare the row for processing. If you fully populated
++ * the data context during the index setup phase, you may not need to
++ * do anything.
++ *
++ * @param rowreq_ctx pointer to a context.
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error.
++ */
++int
++dessertSysifTable_row_prep(dessertSysifTable_rowreq_ctx * rowreq_ctx)
++{
++ DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_row_prep",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:390:o: Prepare row for request.
++ * If populating row data was delayed, this is the place to
++ * fill in the row for this request.
++ */
++
++ return MFD_SUCCESS;
++} /* dessertSysifTable_row_prep */
++
++/** @} */
+diff --git a/src/snmp/dessertSysifTable_data_access.h b/src/snmp/dessertSysifTable_data_access.h
+new file mode 100644
+index 0000000..5c68bbd
+--- /dev/null
++++ b/src/snmp/dessertSysifTable_data_access.h
+@@ -0,0 +1,90 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 14170 $ of $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTSYSIFTABLE_DATA_ACCESS_H
++#define DESSERTSYSIFTABLE_DATA_ACCESS_H
++
++#include "dessert_internal.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++ /*
++ *********************************************************************
++ * function declarations
++ */
++
++ /*
++ *********************************************************************
++ * Table declarations
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertSysifTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++ /*
++ * DESSERT2-MIB::dessertSysifTable is subid 7 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.7, length: 12
++ */
++
++
++ int
++ dessertSysifTable_init_data(dessertSysifTable_registration *
++ dessertSysifTable_reg);
++
++
++ /*
++ * TODO:180:o: Review dessertSysifTable cache timeout.
++ * The number of seconds before the cache times out
++ */
++#define DESSERTSYSIFTABLE_CACHE_TIMEOUT DESSERT_AGENTX_SYSIFTABLE_CACHE_TIMEOUT
++
++ void dessertSysifTable_container_init(netsnmp_container **
++ container_ptr_ptr,
++ netsnmp_cache *
++ cache);
++ void dessertSysifTable_container_shutdown(netsnmp_container
++ * container_ptr);
++
++ int dessertSysifTable_container_load(netsnmp_container *
++ container);
++ void dessertSysifTable_container_free(netsnmp_container *
++ container);
++
++ int dessertSysifTable_cache_load(netsnmp_container *
++ container);
++ void dessertSysifTable_cache_free(netsnmp_container *
++ container);
++
++ /*
++ ***************************************************
++ *** START EXAMPLE CODE ***
++ ***---------------------------------------------***/
++ /*
++ *********************************************************************
++ * Since we have no idea how you really access your data, we'll go with
++ * a worst case example: a flat text file.
++ */
++#define MAX_LINE_SIZE 256
++ /*
++ ***---------------------------------------------***
++ *** END EXAMPLE CODE ***
++ ***************************************************/
++ int dessertSysifTable_row_prep(dessertSysifTable_rowreq_ctx
++ * rowreq_ctx);
++
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTSYSIFTABLE_DATA_ACCESS_H */
+diff --git a/src/snmp/dessertSysifTable_data_get.c b/src/snmp/dessertSysifTable_data_get.c
+new file mode 100644
+index 0000000..a4afe75
+--- /dev/null
++++ b/src/snmp/dessertSysifTable_data_get.c
+@@ -0,0 +1,507 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 12088 $ of $
++ *
++ * $Id:$
++ */
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertSysifTable.h"
++
++
++/** @defgroup data_get data_get: Routines to get data
++ *
++ * TODO:230:M: Implement dessertSysifTable get routines.
++ * TODO:240:M: Implement dessertSysifTable mapping routines (if any).
++ *
++ * These routine are used to get the value for individual objects. The
++ * row context is passed, along with a pointer to the memory where the
++ * value should be copied.
++ *
++ * @{
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertSysifTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++/*
++ * DESSERT2-MIB::dessertSysifTable is subid 7 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.7, length: 12
++ */
++
++/*
++ * ---------------------------------------------------------------------
++ * * TODO:200:r: Implement dessertSysifTable data context functions.
++ */
++
++
++/**
++ * set mib index(es)
++ *
++ * @param tbl_idx mib index structure
++ * @param sysifIndex_val
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error.
++ *
++ * @remark
++ * This convenience function is useful for setting all the MIB index
++ * components with a single function call. It is assume that the C values
++ * have already been mapped from their native/rawformat to the MIB format.
++ */
++int
++dessertSysifTable_indexes_set_tbl_idx(dessertSysifTable_mib_index *
++ tbl_idx, long sysifIndex_val)
++{
++ DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_indexes_set_tbl_idx", "called\n"));
++
++ /*
++ * sysifIndex(1)///()//L/a/w/e/r/d/h
++ */
++ tbl_idx->sysifIndex = sysifIndex_val;
++
++
++ return MFD_SUCCESS;
++} /* dessertSysifTable_indexes_set_tbl_idx */
++
++/**
++ * @internal
++ * set row context indexes
++ *
++ * @param reqreq_ctx the row context that needs updated indexes
++ *
++ * @retval MFD_SUCCESS : success.
++ * @retval MFD_ERROR : other error.
++ *
++ * @remark
++ * This function sets the mib indexs, then updates the oid indexs
++ * from the mib index.
++ */
++int
++dessertSysifTable_indexes_set(dessertSysifTable_rowreq_ctx * rowreq_ctx,
++ long sysifIndex_val)
++{
++ DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_indexes_set",
++ "called\n"));
++
++ if (MFD_SUCCESS !=
++ dessertSysifTable_indexes_set_tbl_idx(&rowreq_ctx->tbl_idx,
++ sysifIndex_val))
++ return MFD_ERROR;
++
++ /*
++ * convert mib index to oid index
++ */
++ rowreq_ctx->oid_idx.len = sizeof(rowreq_ctx->oid_tmp) / sizeof(oid);
++ if (0 != dessertSysifTable_index_to_oid(&rowreq_ctx->oid_idx,
++ &rowreq_ctx->tbl_idx)) {
++ return MFD_ERROR;
++ }
++
++ return MFD_SUCCESS;
++} /* dessertSysifTable_indexes_set */
++
++
++/*---------------------------------------------------------------------
++ * DESSERT2-MIB::dessertSysifEntry.sysifName
++ * sysifName is subid 2 of dessertSysifEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.7.1.2
++ * Description:
++name of interface
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 1 hashint 1
++ * settable 0
++ * hint: 255a
++ *
++ * Ranges: 0 - 255;
++ *
++ * Its syntax is DisplayString (based on perltype OCTETSTR)
++ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
++ * This data type requires a length. (Max 255)
++ */
++/**
++ * Extract the current value of the sysifName data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param sysifName_val_ptr_ptr
++ * Pointer to storage for a char variable
++ * @param sysifName_val_ptr_len_ptr
++ * Pointer to a size_t. On entry, it will contain the size (in bytes)
++ * pointed to by sysifName.
++ * On exit, this value should contain the data size (in bytes).
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++*
++ * @note If you need more than (*sysifName_val_ptr_len_ptr) bytes of memory,
++ * allocate it using malloc() and update sysifName_val_ptr_ptr.
++ * <b>DO NOT</b> free the previous pointer.
++ * The MFD helper will release the memory you allocate.
++ *
++ * @remark If you call this function yourself, you are responsible
++ * for checking if the pointer changed, and freeing any
++ * previously allocated memory. (Not necessary if you pass
++ * in a pointer to static memory, obviously.)
++ */
++int
++sysifName_get(dessertSysifTable_rowreq_ctx * rowreq_ctx,
++ char **sysifName_val_ptr_ptr,
++ size_t *sysifName_val_ptr_len_ptr)
++{
++ /** we should have a non-NULL pointer and enough storage */
++ netsnmp_assert((NULL != sysifName_val_ptr_ptr)
++ && (NULL != *sysifName_val_ptr_ptr));
++ netsnmp_assert(NULL != sysifName_val_ptr_len_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertSysifTable:sysifName_get", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the sysifName data.
++ * copy (* sysifName_val_ptr_ptr ) data and (* sysifName_val_ptr_len_ptr ) from rowreq_ctx->data
++ */
++ /*
++ * make sure there is enough space for sysifName data
++ */
++ if ((NULL == (*sysifName_val_ptr_ptr)) ||
++ ((*sysifName_val_ptr_len_ptr) <
++ (rowreq_ctx->data.sysifName_len *
++ sizeof(rowreq_ctx->data.sysifName[0])))) {
++ /*
++ * allocate space for sysifName data
++ */
++ (*sysifName_val_ptr_ptr) =
++ malloc(rowreq_ctx->data.sysifName_len *
++ sizeof(rowreq_ctx->data.sysifName[0]));
++ if (NULL == (*sysifName_val_ptr_ptr)) {
++ snmp_log(LOG_ERR, "could not allocate memory\n");
++ return MFD_ERROR;
++ }
++ }
++ (*sysifName_val_ptr_len_ptr) =
++ rowreq_ctx->data.sysifName_len *
++ sizeof(rowreq_ctx->data.sysifName[0]);
++ memcpy((*sysifName_val_ptr_ptr), rowreq_ctx->data.sysifName,
++ rowreq_ctx->data.sysifName_len *
++ sizeof(rowreq_ctx->data.sysifName[0]));
++
++ return MFD_SUCCESS;
++} /* sysifName_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT2-MIB::dessertSysifEntry.sysifMacAddress
++ * sysifMacAddress is subid 3 of dessertSysifEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.7.1.3
++ * Description:
++hardware address of interface
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 1 hashint 1
++ * settable 0
++ * hint: 1x:
++ *
++ * Ranges: 6;
++ *
++ * Its syntax is MacAddress (based on perltype OCTETSTR)
++ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
++ * This data type requires a length. (Max 6)
++ */
++/**
++ * Extract the current value of the sysifMacAddress data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param sysifMacAddress_val_ptr_ptr
++ * Pointer to storage for a char variable
++ * @param sysifMacAddress_val_ptr_len_ptr
++ * Pointer to a size_t. On entry, it will contain the size (in bytes)
++ * pointed to by sysifMacAddress.
++ * On exit, this value should contain the data size (in bytes).
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++*
++ * @note If you need more than (*sysifMacAddress_val_ptr_len_ptr) bytes of memory,
++ * allocate it using malloc() and update sysifMacAddress_val_ptr_ptr.
++ * <b>DO NOT</b> free the previous pointer.
++ * The MFD helper will release the memory you allocate.
++ *
++ * @remark If you call this function yourself, you are responsible
++ * for checking if the pointer changed, and freeing any
++ * previously allocated memory. (Not necessary if you pass
++ * in a pointer to static memory, obviously.)
++ */
++int
++sysifMacAddress_get(dessertSysifTable_rowreq_ctx * rowreq_ctx,
++ char **sysifMacAddress_val_ptr_ptr,
++ size_t *sysifMacAddress_val_ptr_len_ptr)
++{
++ /** we should have a non-NULL pointer and enough storage */
++ netsnmp_assert((NULL != sysifMacAddress_val_ptr_ptr)
++ && (NULL != *sysifMacAddress_val_ptr_ptr));
++ netsnmp_assert(NULL != sysifMacAddress_val_ptr_len_ptr);
++
++
++ DEBUGMSGTL(("verbose:dessertSysifTable:sysifMacAddress_get",
++ "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ /*
++ * TODO:231:o: |-> Extract the current value of the sysifMacAddress data.
++ * copy (* sysifMacAddress_val_ptr_ptr ) data and (* sysifMacAddress_val_ptr_len_ptr ) from rowreq_ctx->data
++ */
++ /*
++ * make sure there is enough space for sysifMacAddress data
++ */
++ if ((NULL == (*sysifMacAddress_val_ptr_ptr)) ||
++ ((*sysifMacAddress_val_ptr_len_ptr) <
++ (rowreq_ctx->data.sysifMacAddress_len *
++ sizeof(rowreq_ctx->data.sysifMacAddress[0])))) {
++ /*
++ * allocate space for sysifMacAddress data
++ */
++ (*sysifMacAddress_val_ptr_ptr) =
++ malloc(rowreq_ctx->data.sysifMacAddress_len *
++ sizeof(rowreq_ctx->data.sysifMacAddress[0]));
++ if (NULL == (*sysifMacAddress_val_ptr_ptr)) {
++ snmp_log(LOG_ERR, "could not allocate memory\n");
++ return MFD_ERROR;
++ }
++ }
++ (*sysifMacAddress_val_ptr_len_ptr) =
++ rowreq_ctx->data.sysifMacAddress_len *
++ sizeof(rowreq_ctx->data.sysifMacAddress[0]);
++ memcpy((*sysifMacAddress_val_ptr_ptr),
++ rowreq_ctx->data.sysifMacAddress,
++ rowreq_ctx->data.sysifMacAddress_len *
++ sizeof(rowreq_ctx->data.sysifMacAddress[0]));
++
++ return MFD_SUCCESS;
++} /* sysifMacAddress_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT2-MIB::dessertSysifEntry.sysifInPkts
++ * sysifInPkts is subid 4 of dessertSysifEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.7.1.4
++ * Description:
++packet counter in
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 0
++ *
++ *
++ * Its syntax is COUNTER64 (based on perltype COUNTER64)
++ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
++ */
++/**
++ * Extract the current value of the sysifInPkts data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param sysifInPkts_val_ptr
++ * Pointer to storage for a U64 variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++sysifInPkts_get(dessertSysifTable_rowreq_ctx * rowreq_ctx,
++ U64 * sysifInPkts_val_ptr)
++{
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != sysifInPkts_val_ptr);
++
++ /*
++ * TODO:231:o: |-> copy sysifInPkts data.
++ * get (* sysifInPkts_val_ptr ).low and (* sysifInPkts_val_ptr ).high from rowreq_ctx->data
++ */
++ (*sysifInPkts_val_ptr).high = rowreq_ctx->data.sysifInPkts.high;
++ (*sysifInPkts_val_ptr).low = rowreq_ctx->data.sysifInPkts.low;
++
++
++ return MFD_SUCCESS;
++} /* sysifInPkts_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT2-MIB::dessertSysifEntry.sysifOutPkts
++ * sysifOutPkts is subid 5 of dessertSysifEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.7.1.5
++ * Description:
++packet counter out
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 0
++ *
++ *
++ * Its syntax is COUNTER64 (based on perltype COUNTER64)
++ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
++ */
++/**
++ * Extract the current value of the sysifOutPkts data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param sysifOutPkts_val_ptr
++ * Pointer to storage for a U64 variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++sysifOutPkts_get(dessertSysifTable_rowreq_ctx * rowreq_ctx,
++ U64 * sysifOutPkts_val_ptr)
++{
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != sysifOutPkts_val_ptr);
++
++ /*
++ * TODO:231:o: |-> copy sysifOutPkts data.
++ * get (* sysifOutPkts_val_ptr ).low and (* sysifOutPkts_val_ptr ).high from rowreq_ctx->data
++ */
++ (*sysifOutPkts_val_ptr).high = rowreq_ctx->data.sysifOutPkts.high;
++ (*sysifOutPkts_val_ptr).low = rowreq_ctx->data.sysifOutPkts.low;
++
++
++ return MFD_SUCCESS;
++} /* sysifOutPkts_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT2-MIB::dessertSysifEntry.sysifInOctets
++ * sysifInOctets is subid 6 of dessertSysifEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.7.1.6
++ * Description:
++octet counter in
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 0
++ *
++ *
++ * Its syntax is COUNTER64 (based on perltype COUNTER64)
++ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
++ */
++/**
++ * Extract the current value of the sysifInOctets data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param sysifInOctets_val_ptr
++ * Pointer to storage for a U64 variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++sysifInOctets_get(dessertSysifTable_rowreq_ctx * rowreq_ctx,
++ U64 * sysifInOctets_val_ptr)
++{
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != sysifInOctets_val_ptr);
++
++ /*
++ * TODO:231:o: |-> copy sysifInOctets data.
++ * get (* sysifInOctets_val_ptr ).low and (* sysifInOctets_val_ptr ).high from rowreq_ctx->data
++ */
++ (*sysifInOctets_val_ptr).high = rowreq_ctx->data.sysifInOctets.high;
++ (*sysifInOctets_val_ptr).low = rowreq_ctx->data.sysifInOctets.low;
++
++
++ return MFD_SUCCESS;
++} /* sysifInOctets_get */
++
++/*---------------------------------------------------------------------
++ * DESSERT2-MIB::dessertSysifEntry.sysifOutOctets
++ * sysifOutOctets is subid 7 of dessertSysifEntry.
++ * Its status is Current, and its access level is ReadOnly.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.7.1.7
++ * Description:
++octet counter out
++ *
++ * Attributes:
++ * accessible 1 isscalar 0 enums 0 hasdefval 0
++ * readable 1 iscolumn 1 ranges 0 hashint 0
++ * settable 0
++ *
++ *
++ * Its syntax is COUNTER64 (based on perltype COUNTER64)
++ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
++ */
++/**
++ * Extract the current value of the sysifOutOctets data.
++ *
++ * Set a value using the data context for the row.
++ *
++ * @param rowreq_ctx
++ * Pointer to the row request context.
++ * @param sysifOutOctets_val_ptr
++ * Pointer to storage for a U64 variable
++ *
++ * @retval MFD_SUCCESS : success
++ * @retval MFD_SKIP : skip this node (no value for now)
++ * @retval MFD_ERROR : Any other error
++ */
++int
++sysifOutOctets_get(dessertSysifTable_rowreq_ctx * rowreq_ctx,
++ U64 * sysifOutOctets_val_ptr)
++{
++ /** we should have a non-NULL pointer */
++ netsnmp_assert(NULL != sysifOutOctets_val_ptr);
++
++ /*
++ * TODO:231:o: |-> copy sysifOutOctets data.
++ * get (* sysifOutOctets_val_ptr ).low and (* sysifOutOctets_val_ptr ).high from rowreq_ctx->data
++ */
++ (*sysifOutOctets_val_ptr).high = rowreq_ctx->data.sysifOutOctets.high;
++ (*sysifOutOctets_val_ptr).low = rowreq_ctx->data.sysifOutOctets.low;
++
++
++ return MFD_SUCCESS;
++} /* sysifOutOctets_get */
++
++
++
++/** @} */
+diff --git a/src/snmp/dessertSysifTable_data_get.h b/src/snmp/dessertSysifTable_data_get.h
+new file mode 100644
+index 0000000..19e8426
+--- /dev/null
++++ b/src/snmp/dessertSysifTable_data_get.h
+@@ -0,0 +1,105 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 12088 $ of $
++ *
++ * $Id:$
++ *
++ * @file dessertSysifTable_data_get.h
++ *
++ * @addtogroup get
++ *
++ * Prototypes for get functions
++ *
++ * @{
++ */
++#ifndef DESSERTSYSIFTABLE_DATA_GET_H
++#define DESSERTSYSIFTABLE_DATA_GET_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++ /*
++ *********************************************************************
++ * GET function declarations
++ */
++
++ /*
++ *********************************************************************
++ * GET Table declarations
++ */
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertSysifTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++ /*
++ * DESSERT2-MIB::dessertSysifTable is subid 7 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.7, length: 12
++ */
++ /*
++ * indexes
++ */
++ int sysifIndex_map(uint* *mib_sysifIndex_val_ptr,
++ uint raw_sysifIndex_val);
++
++ int sysifName_map(char **mib_sysifName_val_ptr_ptr,
++ size_t *mib_sysifName_val_ptr_len_ptr,
++ char *raw_sysifName_val_ptr,
++ size_t raw_sysifName_val_ptr_len,
++ int allow_realloc);
++ int sysifName_get(dessertSysifTable_rowreq_ctx *
++ rowreq_ctx, char **sysifName_val_ptr_ptr,
++ size_t *sysifName_val_ptr_len_ptr);
++ int sysifMacAddress_map(char
++ **mib_sysifMacAddress_val_ptr_ptr,
++ size_t
++ *mib_sysifMacAddress_val_ptr_len_ptr,
++ char *raw_sysifMacAddress_val_ptr,
++ size_t
++ raw_sysifMacAddress_val_ptr_len,
++ int allow_realloc);
++ int sysifMacAddress_get(dessertSysifTable_rowreq_ctx *
++ rowreq_ctx,
++ char **sysifMacAddress_val_ptr_ptr,
++ size_t
++ *sysifMacAddress_val_ptr_len_ptr);
++ int sysifInPkts_map(U64 * mib_sysifInPkts_val_ptr,
++ U64 raw_sysifInPkts_val);
++ int sysifInPkts_get(dessertSysifTable_rowreq_ctx *
++ rowreq_ctx, U64 * sysifInPkts_val_ptr);
++ int sysifOutPkts_map(U64 * mib_sysifOutPkts_val_ptr,
++ U64 raw_sysifOutPkts_val);
++ int sysifOutPkts_get(dessertSysifTable_rowreq_ctx *
++ rowreq_ctx,
++ U64 * sysifOutPkts_val_ptr);
++ int sysifInOctets_map(U64 * mib_sysifInOctets_val_ptr,
++ U64 raw_sysifInOctets_val);
++ int sysifInOctets_get(dessertSysifTable_rowreq_ctx *
++ rowreq_ctx,
++ U64 * sysifInOctets_val_ptr);
++ int sysifOutOctets_map(U64 * mib_sysifOutOctets_val_ptr,
++ U64 raw_sysifOutOctets_val);
++ int sysifOutOctets_get(dessertSysifTable_rowreq_ctx *
++ rowreq_ctx,
++ U64 * sysifOutOctets_val_ptr);
++
++
++ int
++ dessertSysifTable_indexes_set_tbl_idx(dessertSysifTable_mib_index *
++ tbl_idx, long sysifIndex_val);
++ int
++ dessertSysifTable_indexes_set(dessertSysifTable_rowreq_ctx *
++ rowreq_ctx, long sysifIndex_val);
++
++
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTSYSIFTABLE_DATA_GET_H */
++/** @} */
+diff --git a/src/snmp/dessertSysifTable_data_set.c b/src/snmp/dessertSysifTable_data_set.c
+new file mode 100644
+index 0000000..8f3c98e
+--- /dev/null
++++ b/src/snmp/dessertSysifTable_data_set.c
+@@ -0,0 +1,28 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 12077 $ of $
++ *
++ * $Id:$
++ *
++ */
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertSysifTable.h"
++
++
++/** @defgroup data_set data_set: Routines to set data
++ *
++ * These routines are used to set the value for individual objects. The
++ * row context is passed, along with the new value.
++ *
++ * @{
++ */
++/** @} */
+diff --git a/src/snmp/dessertSysifTable_data_set.h b/src/snmp/dessertSysifTable_data_set.h
+new file mode 100644
+index 0000000..ab7d732
+--- /dev/null
++++ b/src/snmp/dessertSysifTable_data_set.h
+@@ -0,0 +1,28 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 12077 $ of $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTSYSIFTABLE_DATA_SET_H
++#define DESSERTSYSIFTABLE_DATA_SET_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++ /*
++ *********************************************************************
++ * SET function declarations
++ */
++
++ /*
++ *********************************************************************
++ * SET Table declarations
++ */
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTSYSIFTABLE_DATA_SET_H */
+diff --git a/src/snmp/dessertSysifTable_enums.h b/src/snmp/dessertSysifTable_enums.h
+new file mode 100644
+index 0000000..f18e25d
+--- /dev/null
++++ b/src/snmp/dessertSysifTable_enums.h
+@@ -0,0 +1,39 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * : generic-table-enums.m2c 12526 2005-07-15 22:41:16Z rstory $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTSYSIFTABLE_ENUMS_H
++#define DESSERTSYSIFTABLE_ENUMS_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++ /*
++ * NOTES on enums
++ * ==============
++ *
++ * Value Mapping
++ * -------------
++ * If the values for your data type don't exactly match the
++ * possible values defined by the mib, you should map them
++ * below. For example, a boolean flag (1/0) is usually represented
++ * as a TruthValue in a MIB, which maps to the values (1/2).
++ *
++ */
++/*************************************************************************
++ *************************************************************************
++ *
++ * enum definitions for table dessertSysifTable
++ *
++ *************************************************************************
++ *************************************************************************/
++
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTSYSIFTABLE_ENUMS_H */
+diff --git a/src/snmp/dessertSysifTable_interface.c b/src/snmp/dessertSysifTable_interface.c
+new file mode 100644
+index 0000000..0355204
+--- /dev/null
++++ b/src/snmp/dessertSysifTable_interface.c
+@@ -0,0 +1,936 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 15899 $ of $
++ *
++ * $Id:$
++ */
++/*
++ * *********************************************************************
++ * *********************************************************************
++ * *********************************************************************
++ * *** ***
++ * *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
++ * *** ***
++ * *** ***
++ * *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
++ * *** ***
++ * *** ***
++ * *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
++ * *** ***
++ * *** ***
++ * *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
++ * *** ***
++ * *** ***
++ * *********************************************************************
++ * *********************************************************************
++ * *********************************************************************
++ */
++
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertSysifTable.h"
++
++
++#include <net-snmp/agent/table_container.h>
++#include <net-snmp/library/container.h>
++
++#include "dessertSysifTable_interface.h"
++
++#include <ctype.h>
++
++/**********************************************************************
++ **********************************************************************
++ ***
++ *** Table dessertSysifTable
++ ***
++ **********************************************************************
++ **********************************************************************/
++/*
++ * DESSERT2-MIB::dessertSysifTable is subid 7 of dessertObjects.
++ * Its status is Current.
++ * OID: .1.3.6.1.4.1.18898.0.19.42.1.7, length: 12
++ */
++typedef struct dessertSysifTable_interface_ctx_s {
++
++ netsnmp_container *container;
++ netsnmp_cache *cache;
++
++ dessertSysifTable_registration *user_ctx;
++
++ netsnmp_table_registration_info tbl_info;
++
++ netsnmp_baby_steps_access_methods access_multiplexer;
++
++} dessertSysifTable_interface_ctx;
++
++static dessertSysifTable_interface_ctx dessertSysifTable_if_ctx;
++
++static void
++_dessertSysifTable_container_init(dessertSysifTable_interface_ctx *
++ if_ctx);
++static void
++_dessertSysifTable_container_shutdown(dessertSysifTable_interface_ctx *
++ if_ctx);
++
++
++netsnmp_container *
++dessertSysifTable_container_get(void)
++{
++ return dessertSysifTable_if_ctx.container;
++}
++
++dessertSysifTable_registration *
++dessertSysifTable_registration_get(void)
++{
++ return dessertSysifTable_if_ctx.user_ctx;
++}
++
++dessertSysifTable_registration *
++dessertSysifTable_registration_set(dessertSysifTable_registration * newreg)
++{
++ dessertSysifTable_registration *old =
++ dessertSysifTable_if_ctx.user_ctx;
++ dessertSysifTable_if_ctx.user_ctx = newreg;
++ return old;
++}
++
++int
++dessertSysifTable_container_size(void)
++{
++ return CONTAINER_SIZE(dessertSysifTable_if_ctx.container);
++}
++
++/*
++ * mfd multiplexer modes
++ */
++static Netsnmp_Node_Handler _mfd_dessertSysifTable_pre_request;
++static Netsnmp_Node_Handler _mfd_dessertSysifTable_post_request;
++static Netsnmp_Node_Handler _mfd_dessertSysifTable_object_lookup;
++static Netsnmp_Node_Handler _mfd_dessertSysifTable_get_values;
++/**
++ * @internal
++ * Initialize the table dessertSysifTable
++ * (Define its contents and how it's structured)
++ */
++void
++_dessertSysifTable_initialize_interface(dessertSysifTable_registration *
++ reg_ptr, u_long flags)
++{
++ netsnmp_baby_steps_access_methods *access_multiplexer =
++ &dessertSysifTable_if_ctx.access_multiplexer;
++ netsnmp_table_registration_info *tbl_info =
++ &dessertSysifTable_if_ctx.tbl_info;
++ netsnmp_handler_registration *reginfo;
++ netsnmp_mib_handler *handler;
++ int mfd_modes = 0;
++
++ DEBUGMSGTL(("internal:dessertSysifTable:_dessertSysifTable_initialize_interface", "called\n"));
++
++
++ /*************************************************
++ *
++ * save interface context for dessertSysifTable
++ */
++ /*
++ * Setting up the table's definition
++ */
++ netsnmp_table_helper_add_indexes(tbl_info,
++ /** index: sysifIndex */
++ 0);
++
++ /*
++ * Define the minimum and maximum accessible columns. This
++ * optimizes retrival.
++ */
++ tbl_info->min_column = DESSERTSYSIFTABLE_MIN_COL;
++ tbl_info->max_column = DESSERTSYSIFTABLE_MAX_COL;
++
++ /*
++ * save users context
++ */
++ dessertSysifTable_if_ctx.user_ctx = reg_ptr;
++
++ /*
++ * call data access initialization code
++ */
++ dessertSysifTable_init_data(reg_ptr);
++
++ /*
++ * set up the container
++ */
++ _dessertSysifTable_container_init(&dessertSysifTable_if_ctx);
++ if (NULL == dessertSysifTable_if_ctx.container) {
++ snmp_log(LOG_ERR,
++ "could not initialize container for dessertSysifTable\n");
++ return;
++ }
++
++ /*
++ * access_multiplexer: REQUIRED wrapper for get request handling
++ */
++ access_multiplexer->object_lookup =
++ _mfd_dessertSysifTable_object_lookup;
++ access_multiplexer->get_values = _mfd_dessertSysifTable_get_values;
++
++ /*
++ * no wrappers yet
++ */
++ access_multiplexer->pre_request = _mfd_dessertSysifTable_pre_request;
++ access_multiplexer->post_request = _mfd_dessertSysifTable_post_request;
++
++
++ /*************************************************
++ *
++ * Create a registration, save our reg data, register table.
++ */
++ DEBUGMSGTL(("dessertSysifTable:init_dessertSysifTable",
++ "Registering dessertSysifTable as a mibs-for-dummies table.\n"));
++ handler =
++ netsnmp_baby_steps_access_multiplexer_get(access_multiplexer);
++ reginfo =
++ netsnmp_handler_registration_create("dessertSysifTable", handler,
++ dessertSysifTable_oid,
++ dessertSysifTable_oid_size,
++ HANDLER_CAN_BABY_STEP |
++ HANDLER_CAN_RONLY);
++ if (NULL == reginfo) {
++ snmp_log(LOG_ERR, "error registering table dessertSysifTable\n");
++ return;
++ }
++ reginfo->my_reg_void = &dessertSysifTable_if_ctx;
++
++ /*************************************************
++ *
++ * set up baby steps handler, create it and inject it
++ */
++ if (access_multiplexer->object_lookup)
++ mfd_modes |= BABY_STEP_OBJECT_LOOKUP;
++ if (access_multiplexer->set_values)
++ mfd_modes |= BABY_STEP_SET_VALUES;
++ if (access_multiplexer->irreversible_commit)
++ mfd_modes |= BABY_STEP_IRREVERSIBLE_COMMIT;
++ if (access_multiplexer->object_syntax_checks)
++ mfd_modes |= BABY_STEP_CHECK_OBJECT;
++
++ if (access_multiplexer->pre_request)
++ mfd_modes |= BABY_STEP_PRE_REQUEST;
++ if (access_multiplexer->post_request)
++ mfd_modes |= BABY_STEP_POST_REQUEST;
++
++ if (access_multiplexer->undo_setup)
++ mfd_modes |= BABY_STEP_UNDO_SETUP;
++ if (access_multiplexer->undo_cleanup)
++ mfd_modes |= BABY_STEP_UNDO_CLEANUP;
++ if (access_multiplexer->undo_sets)
++ mfd_modes |= BABY_STEP_UNDO_SETS;
++
++ if (access_multiplexer->row_creation)
++ mfd_modes |= BABY_STEP_ROW_CREATE;
++ if (access_multiplexer->consistency_checks)
++ mfd_modes |= BABY_STEP_CHECK_CONSISTENCY;
++ if (access_multiplexer->commit)
++ mfd_modes |= BABY_STEP_COMMIT;
++ if (access_multiplexer->undo_commit)
++ mfd_modes |= BABY_STEP_UNDO_COMMIT;
++
++ handler = netsnmp_baby_steps_handler_get(mfd_modes);
++ netsnmp_inject_handler(reginfo, handler);
++
++ /*************************************************
++ *
++ * inject row_merge helper with prefix rootoid_len + 2 (entry.col)
++ */
++ handler = netsnmp_get_row_merge_handler(reginfo->rootoid_len + 2);
++ netsnmp_inject_handler(reginfo, handler);
++
++ /*************************************************
++ *
++ * inject container_table helper
++ */
++ handler =
++ netsnmp_container_table_handler_get(tbl_info,
++ dessertSysifTable_if_ctx.
++ container,
++ TABLE_CONTAINER_KEY_NETSNMP_INDEX);
++ netsnmp_inject_handler(reginfo, handler);
++
++ /*************************************************
++ *
++ * inject cache helper
++ */
++ if (NULL != dessertSysifTable_if_ctx.cache) {
++ handler =
++ netsnmp_cache_handler_get(dessertSysifTable_if_ctx.cache);
++ netsnmp_inject_handler(reginfo, handler);
++ }
++
++ /*
++ * register table
++ */
++ netsnmp_register_table(reginfo, tbl_info);
++
++} /* _dessertSysifTable_initialize_interface */
++
++/**
++ * @internal
++ * Shutdown the table dessertSysifTable
++ */
++void
++_dessertSysifTable_shutdown_interface(dessertSysifTable_registration *
++ reg_ptr)
++{
++ /*
++ * shutdown the container
++ */
++ _dessertSysifTable_container_shutdown(&dessertSysifTable_if_ctx);
++}
++
++void
++dessertSysifTable_valid_columns_set(netsnmp_column_info *vc)
++{
++ dessertSysifTable_if_ctx.tbl_info.valid_columns = vc;
++} /* dessertSysifTable_valid_columns_set */
++
++/**
++ * @internal
++ * convert the index component stored in the context to an oid
++ */
++int
++dessertSysifTable_index_to_oid(netsnmp_index * oid_idx,
++ dessertSysifTable_mib_index * mib_idx)
++{
++ int err = SNMP_ERR_NOERROR;
++
++ /*
++ * temp storage for parsing indexes
++ */
++ /*
++ * sysifIndex(1)///()//L/a/w/e/r/d/h
++ */
++ netsnmp_variable_list var_sysifIndex;
++
++ /*
++ * set up varbinds
++ */
++ memset(&var_sysifIndex, 0x00, sizeof(var_sysifIndex));
++ var_sysifIndex.type = ASN_INTEGER;
++
++ /*
++ * chain temp index varbinds together
++ */
++ var_sysifIndex.next_variable = NULL;
++
++
++ DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_index_to_oid",
++ "called\n"));
++
++ /*
++ * sysifIndex(1)///()//L/a/w/e/r/d/h
++ */
++ snmp_set_var_value(&var_sysifIndex, (u_char *) & mib_idx->sysifIndex,
++ sizeof(mib_idx->sysifIndex));
++
++
++ err = build_oid_noalloc(oid_idx->oids, oid_idx->len, &oid_idx->len,
++ NULL, 0, &var_sysifIndex);
++ if (err)
++ snmp_log(LOG_ERR, "error %d converting index to oid\n", err);
++
++ /*
++ * parsing may have allocated memory. free it.
++ */
++ snmp_reset_var_buffers(&var_sysifIndex);
++
++ return err;
++} /* dessertSysifTable_index_to_oid */
++
++/**
++ * extract dessertSysifTable indexes from a netsnmp_index
++ *
++ * @retval SNMP_ERR_NOERROR : no error
++ * @retval SNMP_ERR_GENERR : error
++ */
++int
++dessertSysifTable_index_from_oid(netsnmp_index * oid_idx,
++ dessertSysifTable_mib_index * mib_idx)
++{
++ int err = SNMP_ERR_NOERROR;
++
++ /*
++ * temp storage for parsing indexes
++ */
++ /*
++ * sysifIndex(1)///()//L/a/w/e/r/d/h
++ */
++ netsnmp_variable_list var_sysifIndex;
++
++ /*
++ * set up varbinds
++ */
++ memset(&var_sysifIndex, 0x00, sizeof(var_sysifIndex));
++ var_sysifIndex.type = ASN_INTEGER;
++
++ /*
++ * chain temp index varbinds together
++ */
++ var_sysifIndex.next_variable = NULL;
++
++
++ DEBUGMSGTL(("verbose:dessertSysifTable:dessertSysifTable_index_from_oid", "called\n"));
++
++ /*
++ * parse the oid into the individual index components
++ */
++ err = parse_oid_indexes(oid_idx->oids, oid_idx->len, &var_sysifIndex);
++ if (err == SNMP_ERR_NOERROR) {
++ /*
++ * copy out values
++ */
++ mib_idx->sysifIndex = *((long *)var_sysifIndex.val.string);
++
++
++ }
++
++ /*
++ * parsing may have allocated memory. free it.
++ */
++ snmp_reset_var_buffers(&var_sysifIndex);
++
++ return err;
++} /* dessertSysifTable_index_from_oid */
++
++
++/*
++ *********************************************************************
++ * @internal
++ * allocate resources for a dessertSysifTable_rowreq_ctx
++ */
++dessertSysifTable_rowreq_ctx *
++dessertSysifTable_allocate_rowreq_ctx(void *user_init_ctx)
++{
++ dessertSysifTable_rowreq_ctx *rowreq_ctx =
++ SNMP_MALLOC_TYPEDEF(dessertSysifTable_rowreq_ctx);
++
++ DEBUGMSGTL(("internal:dessertSysifTable:dessertSysifTable_allocate_rowreq_ctx", "called\n"));
++
++ if (NULL == rowreq_ctx) {
++ snmp_log(LOG_ERR, "Couldn't allocate memory for a "
++ "dessertSysifTable_rowreq_ctx.\n");
++ return NULL;
++ }
++
++ rowreq_ctx->oid_idx.oids = rowreq_ctx->oid_tmp;
++
++ rowreq_ctx->dessertSysifTable_data_list = NULL;
++
++ /*
++ * if we allocated data, call init routine
++ */
++ if (!(rowreq_ctx->rowreq_flags & MFD_ROW_DATA_FROM_USER)) {
++ if (SNMPERR_SUCCESS !=
++ dessertSysifTable_rowreq_ctx_init(rowreq_ctx, user_init_ctx)) {
++ dessertSysifTable_release_rowreq_ctx(rowreq_ctx);
++ rowreq_ctx = NULL;
++ }
++ }
++
++ return rowreq_ctx;
++} /* dessertSysifTable_allocate_rowreq_ctx */
++
++/*
++ * @internal
++ * release resources for a dessertSysifTable_rowreq_ctx
++ */
++void
++dessertSysifTable_release_rowreq_ctx(dessertSysifTable_rowreq_ctx *
++ rowreq_ctx)
++{
++ DEBUGMSGTL(("internal:dessertSysifTable:dessertSysifTable_release_rowreq_ctx", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ dessertSysifTable_rowreq_ctx_cleanup(rowreq_ctx);
++
++ /*
++ * free index oid pointer
++ */
++ if (rowreq_ctx->oid_idx.oids != rowreq_ctx->oid_tmp)
++ free(rowreq_ctx->oid_idx.oids);
++
++ SNMP_FREE(rowreq_ctx);
++} /* dessertSysifTable_release_rowreq_ctx */
++
++/**
++ * @internal
++ * wrapper
++ */
++static int
++_mfd_dessertSysifTable_pre_request(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration *reginfo,
++ netsnmp_agent_request_info *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ int rc;
++
++ DEBUGMSGTL(("internal:dessertSysifTable:_mfd_dessertSysifTable_pre_request", "called\n"));
++
++ if (1 != netsnmp_row_merge_status_first(reginfo, agtreq_info)) {
++ DEBUGMSGTL(("internal:dessertSysifTable",
++ "skipping additional pre_request\n"));
++ return SNMP_ERR_NOERROR;
++ }
++
++ rc = dessertSysifTable_pre_request(dessertSysifTable_if_ctx.user_ctx);
++ if (MFD_SUCCESS != rc) {
++ /*
++ * nothing we can do about it but log it
++ */
++ DEBUGMSGTL(("dessertSysifTable", "error %d from "
++ "dessertSysifTable_pre_request\n", rc));
++ netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
++ }
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertSysifTable_pre_request */
++
++/**
++ * @internal
++ * wrapper
++ */
++static int
++_mfd_dessertSysifTable_post_request(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ dessertSysifTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++ int rc, packet_rc;
++
++ DEBUGMSGTL(("internal:dessertSysifTable:_mfd_dessertSysifTable_post_request", "called\n"));
++
++ /*
++ * release row context, if deleted
++ */
++ if (rowreq_ctx && (rowreq_ctx->rowreq_flags & MFD_ROW_DELETED))
++ dessertSysifTable_release_rowreq_ctx(rowreq_ctx);
++
++ /*
++ * wait for last call before calling user
++ */
++ if (1 != netsnmp_row_merge_status_last(reginfo, agtreq_info)) {
++ DEBUGMSGTL(("internal:dessertSysifTable",
++ "waiting for last post_request\n"));
++ return SNMP_ERR_NOERROR;
++ }
++
++ packet_rc = netsnmp_check_all_requests_error(agtreq_info->asp, 0);
++ rc = dessertSysifTable_post_request(dessertSysifTable_if_ctx.user_ctx,
++ packet_rc);
++ if (MFD_SUCCESS != rc) {
++ /*
++ * nothing we can do about it but log it
++ */
++ DEBUGMSGTL(("dessertSysifTable", "error %d from "
++ "dessertSysifTable_post_request\n", rc));
++ }
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertSysifTable_post_request */
++
++/**
++ * @internal
++ * wrapper
++ */
++static int
++_mfd_dessertSysifTable_object_lookup(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration *reginfo,
++ netsnmp_agent_request_info
++ *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ int rc = SNMP_ERR_NOERROR;
++ dessertSysifTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++
++ DEBUGMSGTL(("internal:dessertSysifTable:_mfd_dessertSysifTable_object_lookup", "called\n"));
++
++ /*
++ * get our context from mfd
++ * dessertSysifTable_interface_ctx *if_ctx =
++ * (dessertSysifTable_interface_ctx *)reginfo->my_reg_void;
++ */
++
++ if (NULL == rowreq_ctx) {
++ rc = SNMP_ERR_NOCREATION;
++ }
++
++ if (MFD_SUCCESS != rc)
++ netsnmp_request_set_error_all(requests, rc);
++ else
++ dessertSysifTable_row_prep(rowreq_ctx);
++
++ return SNMP_VALIDATE_ERR(rc);
++} /* _mfd_dessertSysifTable_object_lookup */
++
++/***********************************************************************
++ *
++ * GET processing
++ *
++ ***********************************************************************/
++/*
++ * @internal
++ * Retrieve the value for a particular column
++ */
++NETSNMP_STATIC_INLINE int
++_dessertSysifTable_get_column(dessertSysifTable_rowreq_ctx * rowreq_ctx,
++ netsnmp_variable_list * var, int column)
++{
++ int rc = SNMPERR_SUCCESS;
++
++ DEBUGMSGTL(("internal:dessertSysifTable:_mfd_dessertSysifTable_get_column", "called for %d\n", column));
++
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ switch (column) {
++
++ /*
++ * sysifName(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ case COLUMN_SYSIFNAME:
++ var->type = ASN_OCTET_STR;
++ rc = sysifName_get(rowreq_ctx, (char **) &var->val.string,
++ &var->val_len);
++ break;
++
++ /*
++ * sysifMacAddress(3)/MacAddress/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
++ */
++ case COLUMN_SYSIFMACADDRESS:
++ var->type = ASN_OCTET_STR;
++ rc = sysifMacAddress_get(rowreq_ctx, (char **) &var->val.string,
++ &var->val_len);
++ break;
++
++ /*
++ * sysifInPkts(4)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ case COLUMN_SYSIFINPKTS:
++ var->val_len = sizeof(U64);
++ var->type = ASN_COUNTER64;
++ rc = sysifInPkts_get(rowreq_ctx, (U64 *) var->val.string);
++ break;
++
++ /*
++ * sysifOutPkts(5)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ case COLUMN_SYSIFOUTPKTS:
++ var->val_len = sizeof(U64);
++ var->type = ASN_COUNTER64;
++ rc = sysifOutPkts_get(rowreq_ctx, (U64 *) var->val.string);
++ break;
++
++ /*
++ * sysifInOctets(6)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ case COLUMN_SYSIFINOCTETS:
++ var->val_len = sizeof(U64);
++ var->type = ASN_COUNTER64;
++ rc = sysifInOctets_get(rowreq_ctx, (U64 *) var->val.string);
++ break;
++
++ /*
++ * sysifOutOctets(7)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
++ */
++ case COLUMN_SYSIFOUTOCTETS:
++ var->val_len = sizeof(U64);
++ var->type = ASN_COUNTER64;
++ rc = sysifOutOctets_get(rowreq_ctx, (U64 *) var->val.string);
++ break;
++
++ default:
++ if (DESSERTSYSIFTABLE_MIN_COL <= column
++ && column <= DESSERTSYSIFTABLE_MAX_COL) {
++ DEBUGMSGTL(("internal:dessertSysifTable:_mfd_dessertSysifTable_get_column", "assume column %d is reserved\n", column));
++ rc = MFD_SKIP;
++ } else {
++ snmp_log(LOG_ERR,
++ "unknown column %d in _dessertSysifTable_get_column\n",
++ column);
++ }
++ break;
++ }
++
++ return rc;
++} /* _dessertSysifTable_get_column */
++
++int
++_mfd_dessertSysifTable_get_values(netsnmp_mib_handler *handler,
++ netsnmp_handler_registration *reginfo,
++ netsnmp_agent_request_info *agtreq_info,
++ netsnmp_request_info *requests)
++{
++ dessertSysifTable_rowreq_ctx *rowreq_ctx =
++ netsnmp_container_table_row_extract(requests);
++ netsnmp_table_request_info *tri;
++ u_char *old_string;
++ void (*dataFreeHook) (void *);
++ int rc;
++
++ DEBUGMSGTL(("internal:dessertSysifTable:_mfd_dessertSysifTable_get_values", "called\n"));
++
++ netsnmp_assert(NULL != rowreq_ctx);
++
++ for (; requests; requests = requests->next) {
++ /*
++ * save old pointer, so we can free it if replaced
++ */
++ old_string = requests->requestvb->val.string;
++ dataFreeHook = requests->requestvb->dataFreeHook;
++ if (NULL == requests->requestvb->val.string) {
++ requests->requestvb->val.string = requests->requestvb->buf;
++ requests->requestvb->val_len =
++ sizeof(requests->requestvb->buf);
++ } else if (requests->requestvb->buf ==
++ requests->requestvb->val.string) {
++ if (requests->requestvb->val_len !=
++ sizeof(requests->requestvb->buf))
++ requests->requestvb->val_len =
++ sizeof(requests->requestvb->buf);
++ }
++
++ /*
++ * get column data
++ */
++ tri = netsnmp_extract_table_info(requests);
++ if (NULL == tri)
++ continue;
++
++ rc = _dessertSysifTable_get_column(rowreq_ctx, requests->requestvb,
++ tri->colnum);
++ if (rc) {
++ if (MFD_SKIP == rc) {
++ requests->requestvb->type = SNMP_NOSUCHINSTANCE;
++ rc = SNMP_ERR_NOERROR;
++ }
++ } else if (NULL == requests->requestvb->val.string) {
++ snmp_log(LOG_ERR, "NULL varbind data pointer!\n");
++ rc = SNMP_ERR_GENERR;
++ }
++ if (rc)
++ netsnmp_request_set_error(requests, SNMP_VALIDATE_ERR(rc));
++
++ /*
++ * if the buffer wasn't used previously for the old data (i.e. it
++ * was allcoated memory) and the get routine replaced the pointer,
++ * we need to free the previous pointer.
++ */
++ if (old_string && (old_string != requests->requestvb->buf) &&
++ (requests->requestvb->val.string != old_string)) {
++ if (dataFreeHook)
++ (*dataFreeHook) (old_string);
++ else
++ free(old_string);
++ }
++ } /* for results */
++
++ return SNMP_ERR_NOERROR;
++} /* _mfd_dessertSysifTable_get_values */
++
++
++/***********************************************************************
++ *
++ * SET processing
++ *
++ ***********************************************************************/
++
++/*
++ * SET PROCESSING NOT APPLICABLE (per MIB or user setting)
++ */
++/***********************************************************************
++ *
++ * DATA ACCESS
++ *
++ ***********************************************************************/
++static void _container_free(netsnmp_container * container);
++
++/**
++ * @internal
++ */
++static int
++_cache_load(netsnmp_cache * cache, void *vmagic)
++{
++ DEBUGMSGTL(("internal:dessertSysifTable:_cache_load", "called\n"));
++
++ if ((NULL == cache) || (NULL == cache->magic)) {
++ snmp_log(LOG_ERR,
++ "invalid cache for dessertSysifTable_cache_load\n");
++ return -1;
++ }
++
++ /** should only be called for an invalid or expired cache */
++ netsnmp_assert((0 == cache->valid) || (1 == cache->expired));
++
++ /*
++ * call user code
++ */
++ return dessertSysifTable_container_load((netsnmp_container *) cache->
++ magic);
++} /* _cache_load */
++
++/**
++ * @internal
++ */
++static void
++_cache_free(netsnmp_cache * cache, void *magic)
++{
++ netsnmp_container *container;
++
++ DEBUGMSGTL(("internal:dessertSysifTable:_cache_free", "called\n"));
++
++ if ((NULL == cache) || (NULL == cache->magic)) {
++ snmp_log(LOG_ERR,
++ "invalid cache in dessertSysifTable_cache_free\n");
++ return;
++ }
++
++ container = (netsnmp_container *) cache->magic;
++
++ _container_free(container);
++} /* _cache_free */
++
++/**
++ * @internal
++ */
++static void
++_container_item_free(dessertSysifTable_rowreq_ctx * rowreq_ctx,
++ void *context)
++{
++ DEBUGMSGTL(("internal:dessertSysifTable:_container_item_free",
++ "called\n"));
++
++ if (NULL == rowreq_ctx)
++ return;
++
++ dessertSysifTable_release_rowreq_ctx(rowreq_ctx);
++} /* _container_item_free */
++
++/**
++ * @internal
++ */
++static void
++_container_free(netsnmp_container * container)
++{
++ DEBUGMSGTL(("internal:dessertSysifTable:_container_free", "called\n"));
++
++ if (NULL == container) {
++ snmp_log(LOG_ERR,
++ "invalid container in dessertSysifTable_container_free\n");
++ return;
++ }
++
++ /*
++ * call user code
++ */
++ dessertSysifTable_container_free(container);
++
++ /*
++ * free all items. inefficient, but easy.
++ */
++ CONTAINER_CLEAR(container,
++ (netsnmp_container_obj_func *) _container_item_free,
++ NULL);
++} /* _container_free */
++
++/**
++ * @internal
++ * initialize the container with functions or wrappers
++ */
++void
++_dessertSysifTable_container_init(dessertSysifTable_interface_ctx * if_ctx)
++{
++ DEBUGMSGTL(("internal:dessertSysifTable:_dessertSysifTable_container_init", "called\n"));
++
++ /*
++ * cache init
++ */
++ if_ctx->cache = netsnmp_cache_create(30, /* timeout in seconds */
++ _cache_load, _cache_free,
++ dessertSysifTable_oid,
++ dessertSysifTable_oid_size);
++
++ if (NULL == if_ctx->cache) {
++ snmp_log(LOG_ERR, "error creating cache for dessertSysifTable\n");
++ return;
++ }
++
++ if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;
++
++ dessertSysifTable_container_init(&if_ctx->container, if_ctx->cache);
++ if (NULL == if_ctx->container)
++ if_ctx->container =
++ netsnmp_container_find("dessertSysifTable:table_container");
++ if (NULL == if_ctx->container) {
++ snmp_log(LOG_ERR, "error creating container in "
++ "dessertSysifTable_container_init\n");
++ return;
++ }
++
++ if (NULL != if_ctx->cache)
++ if_ctx->cache->magic = (void *) if_ctx->container;
++} /* _dessertSysifTable_container_init */
++
++/**
++ * @internal
++ * shutdown the container with functions or wrappers
++ */
++void
++_dessertSysifTable_container_shutdown(dessertSysifTable_interface_ctx *
++ if_ctx)
++{
++ DEBUGMSGTL(("internal:dessertSysifTable:_dessertSysifTable_container_shutdown", "called\n"));
++
++ dessertSysifTable_container_shutdown(if_ctx->container);
++
++ _container_free(if_ctx->container);
++
++} /* _dessertSysifTable_container_shutdown */
++
++
++dessertSysifTable_rowreq_ctx *
++dessertSysifTable_row_find_by_mib_index(dessertSysifTable_mib_index *
++ mib_idx)
++{
++ dessertSysifTable_rowreq_ctx *rowreq_ctx;
++ oid oid_tmp[MAX_OID_LEN];
++ netsnmp_index oid_idx;
++ int rc;
++
++ /*
++ * set up storage for OID
++ */
++ oid_idx.oids = oid_tmp;
++ oid_idx.len = sizeof(oid_tmp) / sizeof(oid);
++
++ /*
++ * convert
++ */
++ rc = dessertSysifTable_index_to_oid(&oid_idx, mib_idx);
++ if (MFD_SUCCESS != rc)
++ return NULL;
++
++ rowreq_ctx =
++ CONTAINER_FIND(dessertSysifTable_if_ctx.container, &oid_idx);
++
++ return rowreq_ctx;
++}
+diff --git a/src/snmp/dessertSysifTable_interface.h b/src/snmp/dessertSysifTable_interface.h
+new file mode 100644
+index 0000000..c47cbee
+--- /dev/null
++++ b/src/snmp/dessertSysifTable_interface.h
+@@ -0,0 +1,97 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 15899 $ of $
++ *
++ * $Id:$
++ */
++/** @ingroup interface: Routines to interface to Net-SNMP
++ *
++ * \warning This code should not be modified, called directly,
++ * or used to interpret functionality. It is subject to
++ * change at any time.
++ *
++ * @{
++ */
++/*
++ * *********************************************************************
++ * *********************************************************************
++ * *********************************************************************
++ * *** ***
++ * *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
++ * *** ***
++ * *** ***
++ * *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
++ * *** ***
++ * *** ***
++ * *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
++ * *** ***
++ * *** ***
++ * *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
++ * *** ***
++ * *** ***
++ * *********************************************************************
++ * *********************************************************************
++ * *********************************************************************
++ */
++#ifndef DESSERTSYSIFTABLE_INTERFACE_H
++#define DESSERTSYSIFTABLE_INTERFACE_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++#include "dessertSysifTable.h"
++
++
++ /*
++ ********************************************************************
++ * Table declarations
++ */
++
++ /*
++ * PUBLIC interface initialization routine
++ */
++ void
++ _dessertSysifTable_initialize_interface
++ (dessertSysifTable_registration * user_ctx, u_long flags);
++ void
++ _dessertSysifTable_shutdown_interface
++ (dessertSysifTable_registration * user_ctx);
++
++ dessertSysifTable_registration
++ *dessertSysifTable_registration_get(void);
++
++ dessertSysifTable_registration
++ *dessertSysifTable_registration_set(dessertSysifTable_registration
++ * newreg);
++
++ netsnmp_container *dessertSysifTable_container_get(void);
++ int dessertSysifTable_container_size(void);
++
++ dessertSysifTable_rowreq_ctx
++ *dessertSysifTable_allocate_rowreq_ctx(void *);
++ void
++ dessertSysifTable_release_rowreq_ctx(dessertSysifTable_rowreq_ctx *
++ rowreq_ctx);
++
++ int dessertSysifTable_index_to_oid(netsnmp_index * oid_idx,
++ dessertSysifTable_mib_index
++ * mib_idx);
++ int dessertSysifTable_index_from_oid(netsnmp_index *
++ oid_idx,
++ dessertSysifTable_mib_index
++ * mib_idx);
++
++ /*
++ * access to certain internals. use with caution!
++ */
++ void dessertSysifTable_valid_columns_set(netsnmp_column_info
++ *vc);
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTSYSIFTABLE_INTERFACE_H */
++/** @} */
+diff --git a/src/snmp/dessertSysifTable_oids.h b/src/snmp/dessertSysifTable_oids.h
+new file mode 100644
+index 0000000..e3a61c8
+--- /dev/null
++++ b/src/snmp/dessertSysifTable_oids.h
+@@ -0,0 +1,43 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * : generic-table-oids.m2c 12855 2005-09-27 15:56:08Z rstory $
++ *
++ * $Id:$
++ */
++#ifndef DESSERTSYSIFTABLE_OIDS_H
++#define DESSERTSYSIFTABLE_OIDS_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++ /*
++ * column number definitions for table dessertSysifTable
++ */
++#define DESSERTSYSIFTABLE_OID 1,3,6,1,4,1,18898,0,19,10,1,1,7
++
++#define COLUMN_SYSIFINDEX 1
++
++#define COLUMN_SYSIFNAME 2
++
++#define COLUMN_SYSIFMACADDRESS 3
++
++#define COLUMN_SYSIFINPKTS 4
++
++#define COLUMN_SYSIFOUTPKTS 5
++
++#define COLUMN_SYSIFINOCTETS 6
++
++#define COLUMN_SYSIFOUTOCTETS 7
++
++
++#define DESSERTSYSIFTABLE_MIN_COL COLUMN_SYSIFNAME
++#define DESSERTSYSIFTABLE_MAX_COL COLUMN_SYSIFOUTOCTETS
++
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* DESSERTSYSIFTABLE_OIDS_H */
+diff --git a/src/snmp/dessertSysifTable_subagent.c b/src/snmp/dessertSysifTable_subagent.c
+new file mode 100644
+index 0000000..4f3d47a
+--- /dev/null
++++ b/src/snmp/dessertSysifTable_subagent.c
+@@ -0,0 +1,202 @@
++/*
++ * Note: this file originally auto-generated by mib2c using
++ * version : 15795 $ of $
++ */
++/*
++ * standard Net-SNMP includes
++ */
++#include <net-snmp/net-snmp-config.h>
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++
++/*
++ * include our parent header
++ */
++#include "dessertSysifTable.h"
++
++#include <signal.h>
++
++static int keep_running;
++
++static RETSIGTYPE
++stop_server(int a)
++{
++ keep_running = 0;
++}
++
++static void
++usage(void)
++{
++ printf
++ ("usage: dessertSysifTable [-D<tokens>] [-f] [-L] [-M] [-H] [LISTENING ADDRESSES]\n"
++ "\t-f Do not fork() from the calling shell.\n"
++ "\t-DTOKEN[,TOKEN,...]\n"
++ "\t\tTurn on debugging output for the given TOKEN(s).\n"
++ "\t\tWithout any tokens specified, it defaults to printing\n"
++ "\t\tall the tokens (which is equivalent to the keyword 'ALL').\n"
++ "\t\tYou might want to try ALL for extremely verbose output.\n"
++ "\t\tNote: You can't put a space between the -D and the TOKENs.\n"
++ "\t-H\tDisplay a list of configuration file directives\n"
++ "\t\tunderstood by the agent and then exit.\n"
++ "\t-M\tRun as a normal SNMP Agent instead of an AgentX sub-agent.\n"
++ "\t-x ADDRESS\tconnect to master agent at ADDRESS (default /var/agentx/master).\n"
++ "\t-L\tDo not open a log file; print all messages to stderr.\n");
++ exit(0);
++}
++
++int
++main(int argc, char **argv)
++{
++ int agentx_subagent = 1; /* change this if you want to be a SNMP master agent */
++ /*
++ * Defs for arg-handling code: handles setting of policy-related variables
++ */
++ int ch;
++ extern char *optarg;
++ int dont_fork = 0, use_syslog = 0;
++ char *agentx_socket = NULL;
++
++ while ((ch = getopt(argc, argv, "D:fHLMx:")) != EOF)
++ switch (ch) {
++ case 'D':
++ debug_register_tokens(optarg);
++ snmp_set_do_debugging(1);
++ break;
++ case 'f':
++ dont_fork = 1;
++ break;
++ case 'H':
++ netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID,
++ NETSNMP_DS_AGENT_NO_ROOT_ACCESS, 1);
++ init_agent("dessertSysifTable"); /* register our .conf handlers */
++ init_dessertSysifTable();
++ init_snmp("dessertSysifTable");
++ fprintf(stderr, "Configuration directives understood:\n");
++ read_config_print_usage(" ");
++ exit(0);
++ case 'M':
++ agentx_subagent = 0;
++ break;
++ case 'L':
++ use_syslog = 0; /* use stderr */
++ break;
++ case 'x':
++ agentx_socket = optarg;
++ break;
++ default:
++ fprintf(stderr, "unknown option %c\n", ch);
++ usage();
++ }
++
++ if (optind < argc) {
++ int i;
++ /*
++ * There are optional transport addresses on the command line.
++ */
++ DEBUGMSGTL(("snmpd/main", "optind %d, argc %d\n", optind, argc));
++ for (i = optind; i < argc; i++) {
++ char *c, *astring;
++ if ((c = netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
++ NETSNMP_DS_AGENT_PORTS))) {
++ astring = malloc(strlen(c) + 2 + strlen(argv[i]));
++ if (astring == NULL) {
++ fprintf(stderr, "malloc failure processing argv[%d]\n",
++ i);
++ exit(1);
++ }
++ sprintf(astring, "%s,%s", c, argv[i]);
++ netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
++ NETSNMP_DS_AGENT_PORTS, astring);
++ SNMP_FREE(astring);
++ } else {
++ netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
++ NETSNMP_DS_AGENT_PORTS, argv[i]);
++ }
++ }
++ DEBUGMSGTL(("snmpd/main", "port spec: %s\n",
++ netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
++ NETSNMP_DS_AGENT_PORTS)));
++ }
++
++ /*
++ * we're an agentx subagent?
++ */
++ if (agentx_subagent) {
++ /*
++ * make us a agentx client.
++ */
++ netsnmp_enable_subagent();
++ if (NULL != agentx_socket)
++ netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
++ NETSNMP_DS_AGENT_X_SOCKET,
++ agentx_socket);
++ }
++
++ snmp_disable_log();
++ if (use_syslog)
++ snmp_enable_calllog();
++ else
++ snmp_enable_stderrlog();
++
++ /*
++ * daemonize
++ */
++ if (!dont_fork) {
++ int rc = netsnmp_daemonize(1, !use_syslog);
++ if (rc)
++ exit(-1);
++ }
++
++ /*
++ * initialize tcp/ip if necessary
++ */
++ SOCK_STARTUP;
++
++ /*
++ * initialize the agent library
++ */
++ init_agent("dessertSysifTable");
++
++ /*
++ * init dessertSysifTable mib code
++ */
++ init_dessertSysifTable();
++
++ /*
++ * read dessertSysifTable.conf files.
++ */
++ init_snmp("dessertSysifTable");
++
++ /*
++ * If we're going to be a snmp master agent, initial the ports
++ */
++ if (!agentx_subagent)
++ init_master_agent(); /* open the port to listen on (defaults to udp:161) */
++
++ /*
++ * In case we recevie a request to stop (kill -TERM or kill -INT)
++ */
++ keep_running = 1;
++ signal(SIGTERM, stop_server);
++ signal(SIGINT, stop_server);
++
++ /*
++ * you're main loop here...
++ */
++ while (keep_running) {
++ /*
++ * if you use select(), see snmp_select_info() in snmp_api(3)
++ */
++ /*
++ * --- OR ---
++ */
++ agent_check_and_process(1); /* 0 == don't block */
++ }
++
++ /*
++ * at shutdown time
++ */
++ snmp_shutdown("dessertSysifTable");
++ SOCK_CLEANUP;
++ exit(0);
++}
+diff --git a/utlist.h b/utlist.h
+deleted file mode 100644
+index 40ebbc6..0000000
+--- a/utlist.h
++++ /dev/null
+@@ -1,349 +0,0 @@
+-/*
+-Copyright (c) 2007-2009, Troy D. Hanson
+-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.
+-
+-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.
+-*/
+-
+-#ifndef UTLIST_H
+-#define UTLIST_H
+-
+-#define UTLIST_VERSION 1.8
+-
+-/*
+- * This file contains macros to manipulate singly and doubly-linked lists.
+- *
+- * 1. LL_ macros: singly-linked lists.
+- * 2. DL_ macros: doubly-linked lists.
+- * 3. CDL_ macros: circular doubly-linked lists.
+- *
+- * To use singly-linked lists, your structure must have a "next" pointer.
+- * To use doubly-linked lists, your structure must "prev" and "next" pointers.
+- * Either way, the pointer to the head of the list must be initialized to NULL.
+- *
+- * ----------------.EXAMPLE -------------------------
+- * struct item {
+- * int id;
+- * struct item *prev, *next;
+- * }
+- *
+- * struct item *list = NULL:
+- *
+- * int main() {
+- * struct item *item;
+- * ... allocate and populate item ...
+- * DL_APPEND(list, item);
+- * }
+- * --------------------------------------------------
+- *
+- * For doubly-linked lists, the append and delete macros are O(1)
+- * For singly-linked lists, append and delete are O(n) but prepend is O(1)
+- * The sort macro is O(n log(n)) for all types of single/double/circular lists.
+- */
+-
+-/******************************************************************************
+- * The sort macro is an adaptation of Simon Tatham's O(n log(n)) mergesort *
+- * Unwieldy variable names used here to avoid shadowing passed-in variables. *
+- *****************************************************************************/
+-#define LL_SORT(list, cmp) \
+-do { \
+- __typeof__(list) _ls_p, _ls_q, _ls_e, _ls_tail, _ls_oldhead; \
+- int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \
+- if (list) { \
+- _ls_insize = 1; \
+- _ls_looping = 1; \
+- while (_ls_looping) { \
+- _ls_p = list; \
+- _ls_oldhead = list; \
+- list = NULL; \
+- _ls_tail = NULL; \
+- _ls_nmerges = 0; \
+- while (_ls_p) { \
+- _ls_nmerges++; \
+- _ls_q = _ls_p; \
+- _ls_psize = 0; \
+- for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \
+- _ls_psize++; \
+- _ls_q = _ls_q->next; \
+- if (!_ls_q) break; \
+- } \
+- _ls_qsize = _ls_insize; \
+- while (_ls_psize > 0 || (_ls_qsize > 0 && _ls_q)) { \
+- if (_ls_psize == 0) { \
+- _ls_e = _ls_q; _ls_q = _ls_q->next; _ls_qsize--; \
+- } else if (_ls_qsize == 0 || !_ls_q) { \
+- _ls_e = _ls_p; _ls_p = _ls_p->next; _ls_psize--; \
+- } else if (cmp(_ls_p,_ls_q) <= 0) { \
+- _ls_e = _ls_p; _ls_p = _ls_p->next; _ls_psize--; \
+- } else { \
+- _ls_e = _ls_q; _ls_q = _ls_q->next; _ls_qsize--; \
+- } \
+- if (_ls_tail) { \
+- _ls_tail->next = _ls_e; \
+- } else { \
+- list = _ls_e; \
+- } \
+- _ls_tail = _ls_e; \
+- } \
+- _ls_p = _ls_q; \
+- } \
+- _ls_tail->next = NULL; \
+- if (_ls_nmerges <= 1) { \
+- _ls_looping=0; \
+- } \
+- _ls_insize *= 2; \
+- } \
+- } \
+-} while (0)
+-
+-#define DL_SORT(list, cmp) \
+-do { \
+- __typeof__(list) _ls_p, _ls_q, _ls_e, _ls_tail, _ls_oldhead; \
+- int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \
+- if (list) { \
+- _ls_insize = 1; \
+- _ls_looping = 1; \
+- while (_ls_looping) { \
+- _ls_p = list; \
+- _ls_oldhead = list; \
+- list = NULL; \
+- _ls_tail = NULL; \
+- _ls_nmerges = 0; \
+- while (_ls_p) { \
+- _ls_nmerges++; \
+- _ls_q = _ls_p; \
+- _ls_psize = 0; \
+- for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \
+- _ls_psize++; \
+- _ls_q = _ls_q->next; \
+- if (!_ls_q) break; \
+- } \
+- _ls_qsize = _ls_insize; \
+- while (_ls_psize > 0 || (_ls_qsize > 0 && _ls_q)) { \
+- if (_ls_psize == 0) { \
+- _ls_e = _ls_q; _ls_q = _ls_q->next; _ls_qsize--; \
+- } else if (_ls_qsize == 0 || !_ls_q) { \
+- _ls_e = _ls_p; _ls_p = _ls_p->next; _ls_psize--; \
+- } else if (cmp(_ls_p,_ls_q) <= 0) { \
+- _ls_e = _ls_p; _ls_p = _ls_p->next; _ls_psize--; \
+- } else { \
+- _ls_e = _ls_q; _ls_q = _ls_q->next; _ls_qsize--; \
+- } \
+- if (_ls_tail) { \
+- _ls_tail->next = _ls_e; \
+- } else { \
+- list = _ls_e; \
+- } \
+- _ls_e->prev = _ls_tail; \
+- _ls_tail = _ls_e; \
+- } \
+- _ls_p = _ls_q; \
+- } \
+- list->prev = _ls_tail; \
+- _ls_tail->next = NULL; \
+- if (_ls_nmerges <= 1) { \
+- _ls_looping=0; \
+- } \
+- _ls_insize *= 2; \
+- } \
+- } \
+-} while (0)
+-
+-#define CDL_SORT(list, cmp) \
+-do { \
+- __typeof__(list) _ls_p, _ls_q, _ls_e, _ls_tail, _ls_oldhead; \
+- int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \
+- if (list) { \
+- _ls_insize = 1; \
+- _ls_looping = 1; \
+- while (_ls_looping) { \
+- _ls_p = list; \
+- _ls_oldhead = list; \
+- list = NULL; \
+- _ls_tail = NULL; \
+- _ls_nmerges = 0; \
+- while (_ls_p) { \
+- _ls_nmerges++; \
+- _ls_q = _ls_p; \
+- _ls_psize = 0; \
+- for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \
+- _ls_psize++; \
+- _ls_q = ((_ls_q->next == _ls_oldhead) ? NULL : _ls_q->next); \
+- if (!_ls_q) break; \
+- } \
+- _ls_qsize = _ls_insize; \
+- while (_ls_psize > 0 || (_ls_qsize > 0 && _ls_q)) { \
+- if (_ls_psize == 0) { \
+- _ls_e = _ls_q; _ls_q = _ls_q->next; _ls_qsize--; \
+- if (_ls_q == _ls_oldhead) { _ls_q = NULL; } \
+- } else if (_ls_qsize == 0 || !_ls_q) { \
+- _ls_e = _ls_p; _ls_p = _ls_p->next; _ls_psize--; \
+- if (_ls_p == _ls_oldhead) { _ls_p = NULL; } \
+- } else if (cmp(_ls_p,_ls_q) <= 0) { \
+- _ls_e = _ls_p; _ls_p = _ls_p->next; _ls_psize--; \
+- if (_ls_p == _ls_oldhead) { _ls_p = NULL; } \
+- } else { \
+- _ls_e = _ls_q; _ls_q = _ls_q->next; _ls_qsize--; \
+- if (_ls_q == _ls_oldhead) { _ls_q = NULL; } \
+- } \
+- if (_ls_tail) { \
+- _ls_tail->next = _ls_e; \
+- } else { \
+- list = _ls_e; \
+- } \
+- _ls_e->prev = _ls_tail; \
+- _ls_tail = _ls_e; \
+- } \
+- _ls_p = _ls_q; \
+- } \
+- list->prev = _ls_tail; \
+- _ls_tail->next = list; \
+- if (_ls_nmerges <= 1) { \
+- _ls_looping=0; \
+- } \
+- _ls_insize *= 2; \
+- } \
+- } \
+-} while (0)
+-
+-/******************************************************************************
+- * singly linked list macros (non-circular) *
+- *****************************************************************************/
+-#define LL_PREPEND(head,add) \
+-do { \
+- (add)->next = head; \
+- head = add; \
+-} while (0)
+-
+-#define LL_APPEND(head,add) \
+-do { \
+- __typeof__(head) _tmp; \
+- (add)->next=NULL; \
+- if (head) { \
+- _tmp = head; \
+- while (_tmp->next) { _tmp = _tmp->next; } \
+- _tmp->next=(add); \
+- } else { \
+- (head)=(add); \
+- } \
+-} while (0)
+-
+-#define LL_DELETE(head,del) \
+-do { \
+- __typeof__(head) _tmp; \
+- if ((head) == (del)) { \
+- (head)=(head)->next; \
+- } else { \
+- _tmp = head; \
+- while (_tmp->next && (_tmp->next != (del))) { \
+- _tmp = _tmp->next; \
+- } \
+- if (_tmp->next) { \
+- _tmp->next = ((del)->next); \
+- } \
+- } \
+-} while (0)
+-
+-#define LL_FOREACH(head,el) \
+- for(el=head;el;el=el->next)
+-
+-/******************************************************************************
+- * doubly linked list macros (non-circular) *
+- *****************************************************************************/
+-#define DL_PREPEND(head,add) \
+-do { \
+- (add)->next = head; \
+- if (head) { \
+- (add)->prev = (head)->prev; \
+- (head)->prev = (add); \
+- } else { \
+- (add)->prev = (add); \
+- } \
+- (head) = (add); \
+-} while (0)
+-
+-#define DL_APPEND(head,add) \
+-do { \
+- if (head) { \
+- (add)->prev = (head)->prev; \
+- (head)->prev->next = (add); \
+- (head)->prev = (add); \
+- (add)->next = NULL; \
+- } else { \
+- (head)=(add); \
+- (head)->prev = (head); \
+- (head)->next = NULL; \
+- } \
+-} while (0);
+-
+-#define DL_DELETE(head,del) \
+-do { \
+- if ((del)->prev == (del)) { \
+- (head)=NULL; \
+- } else if ((del)==(head)) { \
+- (del)->next->prev = (del)->prev; \
+- (head) = (del)->next; \
+- } else { \
+- (del)->prev->next = (del)->next; \
+- if ((del)->next) { \
+- (del)->next->prev = (del)->prev; \
+- } else { \
+- (head)->prev = (del)->prev; \
+- } \
+- } \
+-} while (0);
+-
+-
+-#define DL_FOREACH(head,el) \
+- for(el=head;el;el=el->next)
+-
+-/******************************************************************************
+- * circular doubly linked list macros *
+- *****************************************************************************/
+-#define CDL_PREPEND(head,add) \
+-do { \
+- if (head) { \
+- (add)->prev = (head)->prev; \
+- (add)->next = (head); \
+- (head)->prev = (add); \
+- (add)->prev->next = (add); \
+- } else { \
+- (add)->prev = (add); \
+- (add)->next = (add); \
+- } \
+-(head)=(add); \
+-} while (0)
+-
+-#define CDL_DELETE(head,del) \
+-do { \
+- if ( ((head)==(del)) && ((head)->next == (head))) { \
+- (head) = 0L; \
+- } else { \
+- (del)->next->prev = (del)->prev; \
+- (del)->prev->next = (del)->next; \
+- if ((del) == (head)) (head)=(del)->next; \
+- } \
+-} while (0);
+-
+-#define CDL_FOREACH(head,el) \
+- for(el=head;el;el= (el->next==head ? 0L : el->next))
+-
+-
+-#endif /* UTLIST_H */
+-
+--
+1.6.5.4
+
diff --git a/recipes/libdessert/libdessert_0.86.14.bb b/recipes/libdessert/libdessert_0.86.14.bb
new file mode 100644
index 0000000000..dff7ad32a1
--- /dev/null
+++ b/recipes/libdessert/libdessert_0.86.14.bb
@@ -0,0 +1,15 @@
+DESCRIPTION = "DES-SERT (DES Simple and Extensible Routing-Framework for Testbeds)"
+HOMEPAGE = "http://www.des-testbed.net/DES-SERT"
+SECTION = "devel"
+LICENSE = "GPL"
+PR = "r1"
+
+DEPENDS = "net-snmp libpcap libcli"
+
+SRC_URI = "http://www.des-testbed.net/sites/default/files/${PN}${PV}.tar.gz \
+ file://0001-big-fat-autotools-patch.patch;patch=1 \
+ "
+
+S = "${WORKDIR}/${PN}0.86-${PV}"
+
+inherit autotools