diff options
author | Henning Heinold <heinold@inf.fu-berlin.de> | 2009-12-08 11:53:16 +0100 |
---|---|---|
committer | Henning Heinold <heinold@inf.fu-berlin.de> | 2009-12-08 11:54:17 +0100 |
commit | 6676586580fa15bbf5a4d430a45b96b2e4875c7d (patch) | |
tree | 4fc48668c7de1a1780babe5c37031a5c81c8f26e /recipes | |
parent | cc665bd8eae066519430782f0397301fbd94b81b (diff) |
libdessert: introduce framework to develop routing protocols
Diffstat (limited to 'recipes')
-rw-r--r-- | recipes/libdessert/files/0001-big-fat-autotools-patch.patch | 78653 | ||||
-rw-r--r-- | recipes/libdessert/libdessert_0.86.14.bb | 15 |
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, ð); +- 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, ð); +- +- /* 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, ð); ++ 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, ð); ++ ++ /* 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 |