From e97e7f36f5de3c13c06f297954fc0dac06477ad8 Mon Sep 17 00:00:00 2001 From: Packit Bot Date: May 07 2021 10:11:49 +0000 Subject: ipset-7.1 base --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a2aeac6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +*~ +*.la +*.lo +*.o +*.pc +.deps/ +.libs/ +Makefile +Makefile.in + +*.o.cmd +*.ko +*.ko.cmd +*.mod.c +*.mod.o.cmd +.tmp_versions +Module.symvers +modules.order +kernel/include/linux/netfilter/ipset/ip_set_compat.h + +/aclocal.m4 +/autom4te.cache/ +/build-aux/ +/config.* +/configure +/libtool +/stamp-h1 + +/libltdl/ diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..623b625 --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + 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 +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 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 + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This 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 Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..3049eae --- /dev/null +++ b/ChangeLog @@ -0,0 +1,661 @@ +7.1 + - Add compatibility support for strscpy() + - Correct the manpage about the sort option + - Add missing functions to libipset.map + - configure.ac: Fix build regression on RHEL/CentOS/SL + (Serhey Popovych) + - Implement sorting for hash types in the ipset tool + - Fix to list/save into file specified by option + (reported by Isaac Good) + +7.0 + - Introduction of new commands and protocol version 7, updated + kernel include files + - Add compatibility support for async in pernet_operations + - Use more robust awk patterns to check for backward compatibility + - Prepare the ipset tool to handle multiple protocol version + - Fix warning message handling + - Correct to test null valued entry in hash:net6,port,net6 test + - Library reworked to support embedding ipset completely + - Add compatibility to support kvcalloc() + - Validate string type attributes in attr2data() (Stefano Brivio) + - manpage: Add comment about matching on destination MAC address + (Stefano Brivio) + - Add compatibility to support is_zero_ether_addr() + - Fix use-after-free in ipset_parse_name_compat() (Stefano Brivio) + - Fix leak in build_argv() on line parsing error (Stefano Brivio) + - Simplify return statement in ipset_mnl_query() (Stefano Brivio) + - tests/check_klog.sh: Try dmesg too, don't let shell terminate script + (Stefano Brivio) + +6.38 + - Fix API version number + +6.37 + - Fix parsing service names for ports (reported by Yuri D'Elia) + +6.36 + - Use 'ss' in runtest.sh but fall back to deprecated 'net-tools' + command (bugzilla id #1209) + - build: do install libipset/args.h (Jan Engelhardt) + - Add test to verify wraparound fix + +6.35 + - Userspace revision handling is reworked + - Replace the last reference to u_int8_t with uint8_t. + +6.34 + - testsuite: Make sure it can be run over ssh :-) + - Reset state after a command failed, when multiple ones are issued + (bugzilla id #1158, reported by Dimitri Grischin) + - Handle padding attribute properly in userspace. + - Test to check the fix to add an IPv4 range containing more than 2^31 + addresses + - Fix the include guards on the include/libipset/linux_ip_set*.h + (bugzilla id #1139, suggested by Quentin Armitage) + - New function added in commit 54802b2c is missing from libipset.map + (bugzilla id #1182, reported by irherder@gmail.com) + +6.33 + - Report if the option is supported by a newer kernel release + - ipset: Fix ipset command replacement in runtest.sh (Neutron Soutmun) + - Correct a test: number of entries may be outdated + +6.32 + - Fix possible truncated output in ipset output buffer handling + (Reported by Omri Bahumi and Yoni Lavi). + - Missing prototype added in ipset_hash_ipmac.c (debugging) + +6.31 + - Update manpage about the size parameter of list:set types. + - New test to verify that only the intended entries are deleted at hash + types. + +6.30 + - Drop extra comma from error message (Neutron Soutmun) + - Fix the incorrect dynamic/static modules list (Neutron Soutmun) + - Correct tests to check the number of entries too + - hash:ipmac type support added to ipset, userspace part (Tomasz Chilinski) + +6.29 + - Suppress unnecessary stderr in command loop for resize and list + - Correction in comment test + - Support chroot buildroots (reported by Jan Engelhardt) + - Fix "configure" breakage due to pkg-config related changes + (reported by Jan Engelhardt) + +6.28 + - Support older pkg-config packages + - Add bash completion to the install routine (Mart Frauenlob) + - Fix misleading error message with comment extension + - Test added to check 0.0.0.0/0,iface to be matched in + hash:net,iface type + - Fix link with libtool >= 2.4.4 (Olivier Blin) + +6.27 + - Handle uint64_t alignment issue in ipset tool + +6.26 + - Out of bound access in hash:net* types fixed (reported by Dave Jones): + new tests added to the testsuite to verify the fix + - Warn about loaded in ip_set modules at module installation + - Use IPSET_BIN in resize-and-list.sh and suppress echoing of loop + variable + - Manpage typo corrections (David Wittman) + - Fix grammar error in manpage (Neutron Soutmun) + +6.25.1 + - ipset manpage: refer to iptables-extensions + - Update userspace header file from the kernel tree + - Handle 'extern "C" {' in check_libmap.sh + +6.25 + - Add element count to all set types header + - Add element count to hash headers (Eric B Munson) + - Support linking libipset to C++ programs (reported by Pavel Odintsov) + - ipset: propose rewording in manpage (Neutron Soutmun) + - More compatibility checking and simplifications to support the + 2.6.32 kernel tree + - Compatibility: define RCU_INIT_POINTER when __rcu is not defined + - Compatibility: check kernel source for list_last_entry + (CentOS7, reported by Ricardo Klein) + - Make possible to pass extra flags to sparse + +6.24 + - The "extra" subdirectory for kernel modules may have a full subtree + (reported by Jesper Dangaard Brouer) + - Add more compatibility checkings to support older kernel releases + - Make_global.am: Don't include host headers (Baruch Siach) + - Alignment problem between 64bit kernel 32bit userspace fixed + (reported by Sven-Haegar Koch) + - Add script to check libipset.map for missing symbols + - Update libipset.map with ipset_parse_tcp_udp_port (Thomas Backlund) + - libipset: Bump lib version and update map file (Neutron Soutmun) + - Bash utilities updated + - ipset: Fix hyphen used as minus sign in manpage (Neutron Soutmun) + +6.23 + - The utils are updated from their sources + - Order create and add options in manpage so that generic ones + come first + - Centralise generic create options (family, hashsize, maxelem) + on top of man page in the generic options section. (Mart Frauenlob) + - Support glibc < 2.9 (fixes bugzilla id #891) + - Add description of hash:mac set type to man page. (Mart Frauenlob) + - Add missing space for skbinfo option synopsis. (Mart Frauenlob) + - The library/API versions were forgotten to bump (reported by + Sergei Zhirikov) + - Retry printing when sprintf fails (reported by Stig Thormodsrud) + +6.22 + - hash:mac type added to ipset + - Add test to check mark mapping + - ipset: remove extran newline on debug output (Holger Eitzenberger) + - ipset: avoid duplicate command flags (Holger Eitzenberger) + - Remove a duplicate debug print (Holger Eitzenberger) + - ipset: man: Add the skbinfo extension documentation. (Anton Danilov) + - libipset: Add userspace support of the skbinfo extension of the list + set type. (Anton Danilov) + - libipset: Add userspace support of the skbinfo extension of the hash + set types. (Anton Danilov) + - libipset: Add userspace support of the skbinfo extension of the + bitmap set types. (Anton Danilov) + - libipset: Add userspace code for the skbinfo extension support. + (Anton Danilov) + - Make possible to compile ipset with IPSET_DEBUG from the dist. + (Clinton Roy) + - libipset: print third element in debugging (Sergey Popovich) + - ipset: Handle missing leading zeros in ethernet address parser + (Janeks Jaunups) + - ipset: Pass IPSET_BIN to test scripts to change binary location + (Neutron Soutmun) + - ipset: Fix grammar error in manpage (Neutron Soutmun) + - ipset: Fix printf format warning (Neutron Soutmun) + +6.21.1 + - The bash utilities are updated + - Fix libipset library release versioning (reported by Mathieu Bridon) + +6.21 + - ipset: add userspace support for forceadd (Josh Hunt) + - kernel: uapi: fix MARKMASK attr ABI breakage (Florian Westphal) + - lib: fix ifname 'physdev:' prefix parsing (Florian Westphal) + - Prepare the kernel for create option flags when no extension is needed + - print mark & mark mask in hex rather then decimal (Vytas Dauksa) + - add markmask for hash:ip,mark data type (Vytas Dauksa) + - add hash:ip,mark data type to ipset (Vytas Dauksa) + - ipset: manpage: correct add action synopsis for hash:net,port,net. + (Mart Frauenlob) + - ipset: manpage: remove spare comma for hash:net,net test action. + (Mart Frauenlob) + - Fix all set output from list/save when set with counters in use. + (Sergey Popovich) + - ipset: Fix malformed output from list/save for ICMP types in port field + (Sergey Popovich) + - ipset: fix timeout data type size (Nikolay Martynov) + +6.20.1 + - build: fix incorrect library versioning (Jan Engelhardt) + - netfilter: ipset: Fix configure failure when --with-kmod=no + (Oliver Smith) + - Avoid clashing with configured kernel in [CONFIG_]IP_SET_MAX + +6.20 + - Missing comment support added to hash:ip,port,ip and hash:net,iface + types + - Compatibility code is modified not to rely on kernel version numbers + - Add userspace code to support hash:net,port,net kernel module + (Oliver Smith) + - Tests added to check comment extension + - Add new userspace set revisions for comment support (Oliver Smith) + - Support comments in the userspace library (Oliver Smith) + - Rework the "fake" argument parsing for ipset restore (Oliver Smith) + - Add userspace code to support hash:net,net kernel module + (Oliver Smith) + - Add test to verify CIDR tracking + - configure: uclinux is also linux (Gustavo Zacarias) + - Add specifying protocol for bitmap:port (Quentin Armitage) + - Remove artifical restriction of netmask values for hash:ip type + (Reported by Quentin Armitage, netfilter bugzilla id #844) + - Make sure called test scripts can be executed (reported by Tomas Budai) + - Manpage fix: not just identical, but compatible type of sets can be + swapped (Reported by Quentin Armitage, netfilter bugzilla id #843) + - Fix error message typo (Reported by Quentin Armitage, netfilter bugzilla + id #843) + - Parse option "family" first, because other options may depend on it + (Bug reported by Quentin Armitage, closed netfilter bugzilla #841) + - Change 2nd parameter type of ipset_parse_elem (Quentin Armitage) + - Report broken netlink messages in debug mode + - Fix hyphen used as minus sign in manpage (Neutron Soutmun) + - libipset.pc must be installed via 'make install' (Eric Leblond) + +6.19 + - Check at modules_install whether depmod ignores the extra subdir + (reported by Husnu Demir and tian fang) + - The utils are updated from their sources + - Manpage typing error correction (reported by Husnu Demir) + - Update testsuite as the trailing space was eliminated at listings + - Add sparse checking support to userspace + - Improve XML output: add element tag and root element (suggested by Lucas + Hamie) + - Manpage updates + - Add new testsuite entries to verify counters and the new type + implementation + - Introduce the new set type revisions with counter support + - Support counters in the ipset library + - The uapi include split in the package itself + +6.18 + - Kernel part bugfix release + +6.17 + - Fix revision printing in XML mode (reported by Mart Frauenlob) + - Correct "Suspicious condition (assignment + comparison)" (Thomas Jarosch) + - Fix error path when protocol number is used with port range + - Interactive mode error after syntax error (reported by Mart Frauenlob) + - The ipset_bash_completion tool is added + - The ipset_list tool is added + +6.16 + - Remove all modules before testing resize + - build: support for Linux 3.7 UAPI (Jan Engelhardt) + +6.15 + - Fix interactive mode (Fredrik Eriksson) + - Use gethostbyname2 instead of getaddrinfo + - Make tests/check_cidrs.sh script executable + - Add tests to check completely ranges with hash types + - Make easier to apply the netlink.patch + - Support protocol numbers as well, not only protocol names + - Add (back) the debug flag to configure + - Add simple test to check cidr book-keeping + +6.14 + - Support to match elements marked with "nomatch" in hash:*net* sets + - Coding style fixes + - The set type revision number is added to the header part of listing + - Help prints list type revision and terse description + - Add /0 network support to hash:net,iface type + - Fix errors when compiling in debug mode (Krunal Patel) + - Make sure IPPROTO_UDPLITE is defined + - build: restore -version-info (Jan Engelhardt) + +6.13 + - Explain in more detail src/dst for hash:net,iface + - ipset help lists set types multiple times, fixed + (reported by Mr Dash Four) + - The commandline parser was too permissive, make it more strict + - Allow saving to/restoring from a file without shell redirection + - Fix typo of word "unkown" to "unknown" (Neutron Soutmun) + +6.12.1 + - Enable silent (kernel style) compile messages + - Fix build failed on --disable-dependency-tracking + (Neutron Soutmun) + - Add tarball target to Makefile + +6.12 + - Cleanup generated files by make tidy + - Add more CC warning option to debug mode + - Report syntax error messages immediately + - Suppress false syntax error messages + - Add configure summary for the ipset userspace tool + - Add dynamic module support to ipset userspace tool + (Neutron Soutmun) + - Move ipset_port_usage() into lib (Neutron Soutmun) + - Fix invalid assignment to const void pointer (bug reported by Seblu) + - Remove unused variables (warnings fixed) + - Fix timeout value overflow bug at large timeout parameters + (bug reported by Andreas Herz) + - Improve ipset help text messages (Mr Dash Four) + +6.11 + - Support hostnames and service names with dash + - Exceptions support added to hash:*net* types + - Log warning when a hash type of set gets full + - Set types moved into libipset library + - Library map file added in order to support library versioning + - doc: Linux 2.6.39 already has the defs (Jan Engelhardt) + - build: install libipset in the right place (Jan Engelhardt) + - Provide a pkgconfig file (Jan Engelhardt) + - build: make distcheck work and use POSIX mode for tarball generation + (Jan Engelhardt) + - build: install libipset/linux_ip_set_list.h (Jan Engelhardt) + - build: include libipset/nfproto.h (Jan Engelhardt) + - build: process include/libipset/ (Jan Engelhardt) + - build: use AC_CONFIG_AUX_DIR and stash away tools (Jan Engelhardt) + - Update .gitignore (Jan Engelhardt) + +6.10 + - Tests added to check ICMP/ICMPv6 type/code parsing + - ICMP/ICMPv6 type/code parser bug fixed (bug reported by Sabitov) + - ipset: fix lookup of tcp port names (Stephen Hemminger) + - Optionally disable building the kernel module (Mathieu Bridon) + - Make tidy complete + +6.9 + - build: move ipset_errcode into library (Jan Engelhardt) + - build: abort autogen on subcommand failure (Jan Engelhardt) + - ipset: use NFPROTO_ constants (Jan Engelhardt) + - Propagate "expose userspace-relevant parts in ip_set.h" to ipset source + +6.8 + - Update the manpage and document the limits in hash:net,iface. + - README file corrections from Richard Lucassen + +6.7 + - Whitespace and coding fixes, detected by checkpatch.pl + - hash:net,iface type introduced + - hash:* tests may seem to fail due to the too wide grep pattern, fix them + - Remove iptree tests and compatibility element parsing + - hash:net test may seem to fail due to the too wide grep pattern, fix it + - Fix long time uncovered bug at adding string attributes to the netlink + messages + - Fix warnings reported by valgrind + - Remove supporting set types iptree and iptreemap + +6.6 + - Restore with bitmap:port and list:set types did not work, fixed + - Accept "\r\n" terminated COMMIT command in restore files + - Fix the message sequence number book-keeping + - Protocol-level debugging support added + - hash:net stress test in range notation added + - ipset_mnl_query: in debug mode print the errno returned by the cb + function + - Accept "\r\n" terminated lines in restore files + - Remove outdated checking of IPv6 support from configure.ac + +6.5 + - Support range for IPv4 at adding/deleting elements for hash:*net* types + - Disable type revisions which are not supported both by the kernel and + ipset + - Update ipset help text to reflect SCTP and UDPLITE support + - Ignore -n flag (list just setnames) when sets are to be saved + +6.4 + - Get rid of the trailing empty line at listing sets + - Fix XML listing, remove broken unused "elements" tag + - Support listing setnames and headers too + - Sorting is dependent on the locale settings, use LC_ALL=C + - Use unified diff output in tests + +6.3 + - Testsuite changes: keep temporary files + - bitmap:ip,mac type requires "src" for MAC: manpage is updated to reflect + the change + - Testsuite checks added (SET target and dir parameter checks) + +6.2 + - Manpage update + +6.1 + - Manpage was not installed (reported by Mark A. Ziesemer) + - SCTP, UDPLITE support to the hash:*port* types added + +6.0 + - Print protocol version together with ipset version + - Testsuite compatibility with debugging enabled + - Allow "new" as a commad alias to "create" + - ipset: improve command argument parsing (Holger Eitzenberger) + - ipset: avoid the unnecessary argv[] loop (Holger Eitzenberger) + - ipset: pass ipset_arg argument pointer (Holger Eitzenberger) + - Separate ipset errnos completely from system ones and bump protocol + version + - Fix the spelling error fix :-) (Ferenc Wagner) + - Resolving IP addresses did not work at listing/saving sets, fixed + - ipset: fix spelling error (Holger Eitzenberger) + - ipset: fix the Netlink sequence number (Holger Eitzenberger) + - ipset: turn Set name[] into a const pointer (Holger Eitzenberger) + - Check ICMP and ICMPv6 with the set match and target in the testsuite + - Avoid possible syntax clashing at saving hostnames + +5.3 + - Set the non-debug compiling the default + - Testsuite fix of ospf replaced with vrrp. + - Fix build with NDEBUG defined (Holger Eitzenberger) + - Do session initialization once (Holger Eitzenberger) + - Make IPv4 and IPv6 address handling similar (Holger Eitzenberger) + - Show correct line numbers in restore output for parser errors + (Holger Eitzenberger) + - Replace ospf with vrrp in the testsuite + - Remove autogenerated files (Jan Engelhardt) + - Use only AC_CANONICAL_HOST (Jan Engelhardt) + +5.2 + - Handle internal printing errors + - Use cast to void * instead of memcpy as Sparc workaround at sockaddr_XXX + (suggested by Jan Engelhardt) + - Listing/saving of large sets could produce broken listing, fixed. + - Support libtool < 2.2 + +5.1 + - Test cases for IPv6 restore and more complex restore sessions added + - Restore mode did not work for IPv6, fixed (reported by Elie Rosenblum) + - libipset: static annotations (Jan Engelhardt) + - libipset: const annotations (Jan Engelhardt) + - libipset: remove redundant casts (Jan Engelhardt) + - libipset: remove redundant indirection via union name (Jan Engelhardt) + - libipset: ipset_strncpy is really a strlcpy-type operation + (Jan Engelhardt) + - Prevent calling Makefile directly in the kernel/ subdirectory + - Put back the Sparc specific workaround at getaddrinfo + (reported by Jan Engelhardt) + - Check old system kernel header files + - Check from `configure` that the kernel source is patched with + netlink.patch + - Use configure to detect compiler warning flags + - Try to solve PKG_CHECK_MODULES issue (reported by Rob Sterenborg) + - Fix incorrect comparison in check_allowed (reported by Jan Engelhardt) + +5.0 + - New main branch - ipset completely rewritten + +4.2 + - Checking null entries when listing/saving hash types of sets + deleted because it's unnecessary and can mask possible errors. + +4.1 + - Manpage fixes and corrections (Jan Engelhardt) + +4.0 + - New protocol is introduced to handle aligment issues properly + (bug reported by Georg Chini) + - Binding support is removed + +3.1 + - Correct format specifiers and change %i to %d (Jan Engelhardt) + +3.0 + - New kernel-userspace protocol release + - Bigendian and 64/32bit fixes (Stefan Gula, bugzilla id 593) + - tests/runtests.sh changed to support old bash shells + +2.5.0 + - On parisc architecture cast increases required aligment (bugzilla + id 582), fixed. + - Respect LDFLAGS settings at compile time (Peter Volkov). + +2.4.8 + - In order to disable the extra warning flags, NO_EXTRA_WARN_FLAGS + variable added to userspace Makefile + +2.4.5 + - Some compiler warning options are too aggressive and + therefore disabled. + +2.4.4 + - Premature checking prevents to add valid elements to hash + types, fixed (bug reported by JC Janos). + - Local variable shadows another variable, fixed (reported + by Jan Engelhardt). + - More compiler warning options added and warnings fixed. + +2.4.3 + - Include file was missing from userspace set type + modules, reported by Krzysztof Oledzki and Sven Wegener. + +2.4.2 + - Only kernel part changes, see kernel/ChangeLog + +2.4.1 + - macipmap type reported misleading deprecated separator + tokens and printed the old one at listing set elements + (bug reported by Krzysztof Oledzki) + - Warn only once about deprecated separator tokens in + restore mode. + +2.4 + - Added KBUILD_OUTPUT support (Sven Wegener) + - Fix memory leak in ipset_iptreemap (Sven Wegener) + - Fix multiple compiler warnings (Sven Wegener) + - ipportiphash, ipportnethash and setlist types added + - binding marked as deprecated functionality + - element separator token changed to ',' in anticipating + IPv6 addresses, old separator tokens are still supported + - unnecessary includes removed + - ipset does not try to resolve IP addresses when listing + the content of sets (default changed) + - manpage updated + - ChangeLog forked for kernel part + +2.3.3a + - Fix to compile ipset with 2.4.26.x tree statically (bug reported by + G.W. Haywood) + +2.3.3 + - compatibility for the 2.6.x kernel tree improved and compiler warnings + fixed (Jan Engelhardt) + - compatibility fixes for the 2.4.36.x kernel tree added + +2.3.2 + - including limits.h for UINT_MAX is required with glibc-2.8 (pud) + - needless cast from and to void pointers cleanups in iptreemap (Sven Wegener) + - Initial ipset release with kernel modules included. + +2.3.1 + - segfault on --unbind :all: :all: fixed (reported by bugzilla, + report and patch sent by Tom Eastep) + - User input parameters are sanitized everywhere + - Initial testsuite added and 'test' target to the Makefile + added: few bugs discovered and fixed + - typo in macipmap type prevented to use max size set of this type + - *map types are made sure to allow and use max size of sets + +2.3.0 + - jiffies rollover bug in iptree type fixed (reported by Lukasz Nierycho + and others) + - endiannes bug in iptree type fixed (spotted by Jan Engelhardt) + - iptreemap type added (submitted by Sven Wegener) + - 2.6.22/23 compatibility fixes (Jeremy Jacque) + - typo fixes in ipset (Neville D) + - separator changed to ':' from '%' (old one still supported) in ipset + +2.2.9a + - use correct type (socklen_t) for getsockopt (H. Nakano) + - incorrect return codes fixed (Tomasz Lemiech, Alexey Bortnikov) + - kernel header dependency removed (asm/bitops.h) + - ipset now tries to load in the ip_set kernel module if the protocol + is not available + +2.2.9 + - 'ipset -N' did not generate proper return code + - 'limit' module parameter added to the kernel modules of the + iphash, ipporthash, nethash and iptree type of sets so that + the maximal number of elements can now be limited + - zero valued entries (port 0 or IP address 0.0.0.0) were + detected as members of the hash/tree kind of sets + (reported by Andrew Kraslavsky) + - list and save operations used the external identifier + of the sets for the bindings instead of the internal one + (reported by Amin Azez) + +2.2.8 + - Nasty off-by-one bug fixed in iptree type of sets + (bug reported by Pablo Sole) + +2.2.7 + All patches were submitted by Jones Desougi + - missing or confusing error message fixes for ipporthash + - minor correction in debugging in nethash + - copy-paste bug in kernel set types at memory allocation + checking fixed + - unified memory allocations in ipset + +2.2.6 + - memory allocation in iptree is changed to GFP_ATOMIC because + we hold a lock (bug reported by Radek Hladik) + - compatibility fix: __nocast is not defined in all 2.6 branches + (problem reported by Ming-Ching Tiew) + - manpage corrections + +2.2.5 + - garbage collector of iptree type of sets is fixed: flushing + sets/removing kernel module could corrupt the timer + - new ipporthash type added + - manpage fixes and corrections + +2.2.4 + - half-fixed memory allocation bug in iphash and nethash finally + completely fixed (bug reported by Nikolai Malykh) + - restrictions to enter zero-valued entries into all non-hash type sets + were removed + - Too strict check on the set size of ipmap type was corrected + +2.2.3 + - memory allocation bug in iphash and nethash in connection with the SET + target was fixed (bug reported by Nikolai Malykh) + - lockhelp.h was removed from the 2.6.13 kernel tree, ip_set.c is + updated accordingly (Cardoso Didier, Samir Bellabes) + - manpage is updated to clearly state the command order in restore mode + +2.2.2 + - Jiffies rollover bug in ip_set_iptree reported and fixed by Rob Nielsen + - Compiler warning in the non-SMP case fixed (Marcus Sundberg) + - slab cache names shrunk in order to be compatible with 2.4.* (Marcus + Sundberg) + +2.2.1 + - Magic number in ip_set_nethash.h was mistyped (bug reported by Rob + Carlson) + - ipset can now test IP addresses in nethash type of sets (i.e. addresses + in netblocks added to the set) + +2.2.0 + - Locking bug in ip_set_nethash.c (Clifford Wolf and Rob Carlson) + - Makefile contained an unnecessary variable in IPSET_LIB_DIR (Clifford + Wolf) + - Safety checkings of restore in ipset was incomplete (Robin H. Johnson) + - More careful resizing by avoiding locking completely + - stdin stored internally in a temporary file, so we can feed 'ipset -R' + from a pipe + - iptree maptype added + +2.1 + - Lock debugging used with debugless lock definiton (Piotr Chytla and + others). + - Bindings were not properly filled out at listing (kernel) + - When listing sets from kernel, id was not added to the set structure + (ipset) + - nethash maptype added + - ipset manpage corrections (macipmap) + +2.0.1 + - Missing -fPIC in Makefile (Robert Iakobashvili) + - Cut'n'paste bug at saving macipmap types (Vincent Bernat). + - Bug in printing/saving SET targets reported and fixed by Michal + Pokrywka + +2.0 + - Chaining of sets are changed: child sets replaced by bindings + - Kernel-userspace communication reorganized to minimize the number + of syscalls + - Save and restore functionality implemented + - iphash type reworked: clashing resolved by double-hashing and by + dynamically growing the set + +1.0 + - Renamed to ipset + - Rewritten to support child pools + - portmap, iphash pool support added + - too much other mods here and there to list... + diff --git a/ChangeLog.ippool b/ChangeLog.ippool new file mode 100644 index 0000000..669c304 --- /dev/null +++ b/ChangeLog.ippool @@ -0,0 +1,59 @@ +Original changelog as ippool: + +0.3.2b +- Fixed missing kfree(pool) (Martin Josefsson) + +0.3.2a +- Added libipt_pool.c and libipt_POOL.c (Martin Josefsson) + + +0.3.2 +- Passes pointers to skb's around instead of ip's in the (Martin Josefsson) + kernel modules. +- Added a new pooltype, macipmap, which matches ip's (Martin Josefsson) + against macaddresses. +- Cleaned up a lot of typedefs. (Martin Josefsson) +- Fixed an unlocking of the wrong lock. (Martin Josefsson) +- Fixed a refcount bug when allocated memory was too (Martin Josefsson) + small. +- Fixed a free() of unallocated memory. (Martin Josefsson) +- Switched from kmalloc/kfree to vmalloc/vfree for (Martin Josefsson) + pool-listings/additions. + + +0.3.1 +- Changed the API between userspace modules and base. (Joakim Axelsson) + Moved the memberdata pointer to module self. + As a result of this Protocolversion is increased to 4. +- Fixed problems with crashing null-pooltype (Joakim Axelsson) +- Fixed problems with compiling warnings (Joakim Axelsson) + in null pooltype. + + +0.3.0: +- Changed the listing to use getsockopt. (Joakim Axelsson) + /proc is left for debuging purpose. + This is a mayor change. + Protocolversion is increased to 3 +- Added support for --quiet (Joakim Axelsson) +- Added support for --sorted (Joakim Axelsson) +- Added support for --numeric (Joakim Axelsson) +- Added support for --exact (Joakim Axelsson) +- Added -Z (Zero) which zero's the counter (Joakim Axelsson) + on one or all pools. +- Added support for --debug that prints all debug-messages (Joakim Axelsosn) + in userspace. Need to be compiled with + IP_POOL_DEBUG tho. +- Added null pooltype. For demostration and (Joakim Axelsson) + pooltype skeleton mostly +- Fixed bug with possibly renaming to an already (Joakim Axelsson) + existing pool. +- Change error to OTHER_PROBLEM on add and del IP. (Joakim Axelsson) + +0.2.1-0.2.3 +- Better handling of references (Patrick Schaaf) +- Various bugfixes (Patrick Schaaf) +- Cleaning up the code in kernelspace (Patrick Schaaf) + +0.2.0: +- Rewrote the entrie system. Modulized it. (Joakim Axelsson) diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..23e5f25 --- /dev/null +++ b/INSTALL @@ -0,0 +1,236 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +These are generic installation instructions. + + 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 only 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. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. 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. + +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=c89 CFLAGS=-O2 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 must use a version of `make' that +supports the `VPATH' variable, such as 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 `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have 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. + +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. + +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). Here is a another example: + + /bin/bash ./configure CONFIG_SHELL=/bin/bash + +Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent +configuration-related scripts to be executed by `/bin/bash'. + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--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. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/Make_global.am b/Make_global.am new file mode 100644 index 0000000..673aa41 --- /dev/null +++ b/Make_global.am @@ -0,0 +1,89 @@ +# This is _NOT_ the library release version, it's an API version. +# Please read Chapter 6 "Library interface versions" of the libtool +# documentation before making any modification +# +# http://sources.redhat.com/autobook/autobook/autobook_91.html +# +# The version scheme used by Libtool tracks interfaces, where an interface +# is the set of exported entry points into the library. All Libtool libraries +# start with `-version-info' set to `0:0:0' -- this will be the default +# version number if you don't explicitly set it on the Libtool link command +# line. The meaning of these numbers (from left to right) is as follows: +# +# current +# The number of the current interface exported by the library. A current +# value of `0', means that you are calling the interface exported by this +# library interface 0. +# +# revision +# The implementation number of the most recent interface exported by this +# library. In this case, a revision value of `0' means that this is the +# first implementation of the interface. +# +# If the next release of this library exports the same interface, but has +# a different implementation (perhaps some bugs have been fixed), the +# revision number will be higher, but current number will be the same. +# In that case, when given a choice, the library with the highest revision +# will always be used by the runtime loader. +# +# age +# The number of previous additional interfaces supported by this library. +# If age were `2', then this library can be linked into executables which +# were built with a release of this library that exported the current +# interface number, current, or any of the previous two interfaces. +# +# By definition age must be less than or equal to current. At the outset, +# only the first ever interface is implemented, so age can only be `0'. +# +# 1. If you have changed any of the sources for this library, the revision +# number must be incremented. +# This is a new revision of the current interface. +# +# 2. If the interface has changed, then current must be incremented, and +# revision reset to `0'. +# This is the first revision of a new interface. +# +# 3. If the new interface is a superset of the previous interface (that is, +# if the previous interface has not been broken by the changes in this +# new release), then age must be incremented. +# This release is backwards compatible with the previous release. +# +# 4. If the new interface has removed elements with respect to the previous +# interface, then you have broken backward compatibility and age must be +# reset to `0'. +# This release has a new, but backwards incompatible interface. +# +# For example, if the next release of the library included some new commands +# for an existing socket protocol, you would use -version-info 1:0:1. +# This is the first revision of a new interface. This release is backwards +# compatible with the previous release. +# +# Later, you implement a faster way of handling part of the algorithm at the +# core of the library, and release it with -version-info 1:1:1. This is a new +# revision of the current interface. +# +# Unfortunately the speed of your new implementation can only be fully +# exploited by changing the API to access the structures at a lower level, +# which breaks compatibility with the previous interface, so you release it +# as -version-info 2:0:0. This release has a new, but backwards incompatible +# interface. + +# curr:rev:age +LIBVERSION = 14:0:1 + +AM_CPPFLAGS = $(kinclude_CFLAGS) $(all_includes) -I$(top_srcdir)/include + +AM_CFLAGS = -std=gnu99 + +if ENABLE_DEBUG +AM_CFLAGS += -g -g3 -ggdb -gdwarf-2 -DIPSET_DEBUG -Wall -Werror +else +AM_CFLAGS += -O2 -DNDEBUG +endif + +SPARSE = sparse +SPARSE_FLAGS = -Wsparse-all -I../include $(SPARSE_EXT_FLAGS) +IPSET_AM_V_CHECK = $(ipset_am__v_CHECK_$(V)) +ipset_am__v_CHECK_ = $(ipset_am__v_CHECK_$(AM_DEFAULT_VERBOSITY)) +ipset_am__v_CHECK_0 = @echo " CHECK " $<; + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..8d718e1 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,147 @@ +## Process this file with automake to produce Makefile.in + +ACLOCAL_AMFLAGS = -I m4 + +include $(top_srcdir)/Make_global.am + +if ! WITH_KBUILDDIR +KBUILD_OUTPUT=/lib/modules/`uname -r`/build +else +KBUILD_OUTPUT=$(KBUILDDIR) +endif +if ! WITH_MAXSETS +IP_SET_MAX=256 +else +IP_SET_MAX=$(MAXSETS) +endif + +SUBDIRS = include/libipset lib src utils +INSTALL_MOD_PATH = / + +sparse: + $(MAKE) -C lib sparse-check + $(MAKE) -C src sparse-check + +modules_sparse: +if WITH_KMOD + ${MAKE} -C $(KBUILD_OUTPUT) M=$$PWD/kernel/net \ + V=$V W=1 C=2 CF="-D__CHECK_ENDIAN__ -Wsparse-all" \ + KCFLAGS="-DPACKAGE_VERSION=$(PACKAGE_VERSION) -DCHECK_KCONFIG -Wextra" \ + IP_SET_MAX=$(IP_SET_MAX) KDIR=$$PWD/kernel modules +else + @echo Skipping kernel modules due to --with-kmod=no +endif + +modules: +if WITH_KMOD + ${MAKE} -C $(KBUILD_OUTPUT) M=$$PWD/kernel/net V=$V \ + KCFLAGS="-DPACKAGE_VERSION=$(PACKAGE_VERSION)" \ + IP_SET_MAX=$(IP_SET_MAX) KDIR=$$PWD/kernel modules +else + @echo Skipping kernel modules due to --with-kmod=no +endif + +define DEPMOD_WARNING + +!!! WARNING !!! WARNING !!! WARNING !!! + +Your distribution seems to ignore the /lib/modules//extra/ +subdirectory, where the ipset kernel modules are installed. + +Add the 'extra' directory to the search definition of your depmod +configuration (/etc/depmod.conf or /etc/depmod.d/) and re-run + + depmod + +otherwise the ipset kernel modules in the extra subdir will be ignored. + +endef +export DEPMOD_WARNING + +define MODULE_WARNING + +!!! WARNING !!! WARNING !!! WARNING !!! + +Your running system has got ipset related kernel modules loaded in. +You MUST rmmod the ip_set* kernel modules in order to make possible +for the system to load in the newly installed ones. +endef +export MODULE_WARNING + +modules_install: +if WITH_KMOD + ${MAKE} -C $(KBUILD_OUTPUT) M=$$PWD/kernel/net \ + KDIR=$$PWD/kernel modules_install + @modinfo -b ${INSTALL_MOD_PATH} ip_set_hash_ip | ${GREP} /extra/ >/dev/null || echo "$$DEPMOD_WARNING" + @lsmod | ${GREP} '^ip_set' >/dev/null && echo "$$MODULE_WARNING" +else + @echo Skipping kernel modules due to --with-kmod=no +endif + +modules_clean: +if WITH_KMOD + ${MAKE} -C $(KBUILD_OUTPUT) M=$$PWD/kernel/net \ + KDIR=$$PWD/kernel clean +else + @echo Skipping kernel modules due to --with-kmod=no +endif + +update_includes: + for x in ip_set.h ip_set_bitmap.h ip_set_hash.h ip_set_list.h; do \ + sed -r -e 's@#(ifndef|define|endif[ \t]*/[*])[ \t]*_UAPI@#\1 @' \ + -e 's@^#include @@' \ + kernel/include/uapi/linux/netfilter/ipset/$$x \ + > include/libipset/linux_$$x; \ + done + +update_utils: + wget -4 -O /tmp/ipset-bash-completion.tar.gz http://sourceforge.net/projects/ipset-bashcompl/files/latest/download + cd utils/ipset_bash_completion; tar xz --strip-components=1 -f /tmp/ipset-bash-completion.tar.gz + rm -f /tmp/ipset-bash-completion.tar.gz + wget -4 -O /tmp/ipset-list.tar.gz http://sourceforge.net/projects/ipset-list/files/latest/download + cd utils/ipset_list; tar xz --strip-components=1 -f /tmp/ipset-list.tar.gz + rm -f /tmp/ipset-list.tar.gz + +check_libmap: + @./check_libmap.sh + +tests: + cd tests; ./runtest.sh + +cleanup_dirs := . include/libipset lib src tests + +tidy: distclean modules_clean + rm -rf .deps $(foreach dir,$(cleanup_dirs),$(wildcard $(dir)/*~)) + rm -rf aclocal.m4 autom4te.cache + rm -rf config.* configure compile depcomp install-sh libtool ltmain.sh + rm -rf Makefile Makefile.in lib/Makefile lib/Makefile.in src/Makefile src/Makefile.in + rm -rf missing stamp-h1 m4/libtool.m4 m4/lt*.m4 + rm -rf lib/ipset_settype_check lib/types_init.c + find . -name '*~' -delete + +tarball: + rm -Rf /tmp/ipset-${PACKAGE_VERSION}; + pushd ${top_srcdir} && git archive --prefix=ipset-${PACKAGE_VERSION}/ HEAD | tar -C /tmp -x && popd; + pushd /tmp/ipset-${PACKAGE_VERSION} && ./autogen.sh && popd; + tar -C /tmp -cjf ipset-${PACKAGE_VERSION}.tar.bz2 --owner=root --group=root ipset-${PACKAGE_VERSION}/; + rm -Rf /tmp/ipset-${PACKAGE_VERSION}; + +help: + @echo ' - Compile userspace' + @echo ' modules - Compile kernel modules' + @echo ' install - Install userspace' + @echo ' modules_install - Install kernel modules' + @echo ' clean - Remove generated userspace files' + @echo ' modules_clean - Remove generated kernelspace files' + @echo ' tidy - Tidy up the whole source tree' + @echo ' tests - Run testsuite' + @echo ' sparse - Check userspace with sparse' + @echo ' modules_sparse - Check kernelspace with sparse' + @echo ' update_includes - Update userspace include files' + @echo ' update_utils - Update bash utilities' + @echo ' check_libmap - Check libipset.map for missing symbols' + @echo ' tarball - Create a tarball for a new release' + +.PHONY: modules modules_instal modules_clean update_includes tests tarball + +DISTCHECK_CONFIGURE_FLAGS = --with-kmod=no diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..a29b1ef --- /dev/null +++ b/Makefile.in @@ -0,0 +1,1094 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 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@ + +# This is _NOT_ the library release version, it's an API version. +# Please read Chapter 6 "Library interface versions" of the libtool +# documentation before making any modification +# +# http://sources.redhat.com/autobook/autobook/autobook_91.html +# +# The version scheme used by Libtool tracks interfaces, where an interface +# is the set of exported entry points into the library. All Libtool libraries +# start with `-version-info' set to `0:0:0' -- this will be the default +# version number if you don't explicitly set it on the Libtool link command +# line. The meaning of these numbers (from left to right) is as follows: +# +# current +# The number of the current interface exported by the library. A current +# value of `0', means that you are calling the interface exported by this +# library interface 0. +# +# revision +# The implementation number of the most recent interface exported by this +# library. In this case, a revision value of `0' means that this is the +# first implementation of the interface. +# +# If the next release of this library exports the same interface, but has +# a different implementation (perhaps some bugs have been fixed), the +# revision number will be higher, but current number will be the same. +# In that case, when given a choice, the library with the highest revision +# will always be used by the runtime loader. +# +# age +# The number of previous additional interfaces supported by this library. +# If age were `2', then this library can be linked into executables which +# were built with a release of this library that exported the current +# interface number, current, or any of the previous two interfaces. +# +# By definition age must be less than or equal to current. At the outset, +# only the first ever interface is implemented, so age can only be `0'. +# +# 1. If you have changed any of the sources for this library, the revision +# number must be incremented. +# This is a new revision of the current interface. +# +# 2. If the interface has changed, then current must be incremented, and +# revision reset to `0'. +# This is the first revision of a new interface. +# +# 3. If the new interface is a superset of the previous interface (that is, +# if the previous interface has not been broken by the changes in this +# new release), then age must be incremented. +# This release is backwards compatible with the previous release. +# +# 4. If the new interface has removed elements with respect to the previous +# interface, then you have broken backward compatibility and age must be +# reset to `0'. +# This release has a new, but backwards incompatible interface. +# +# For example, if the next release of the library included some new commands +# for an existing socket protocol, you would use -version-info 1:0:1. +# This is the first revision of a new interface. This release is backwards +# compatible with the previous release. +# +# Later, you implement a faster way of handling part of the algorithm at the +# core of the library, and release it with -version-info 1:1:1. This is a new +# revision of the current interface. +# +# Unfortunately the speed of your new implementation can only be fully +# exploited by changing the API to access the structures at a lower level, +# which breaks compatibility with the previous interface, so you release it +# as -version-info 2:0:0. This release has a new, but backwards incompatible +# interface. +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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@ +@ENABLE_DEBUG_TRUE@am__append_1 = -g -g3 -ggdb -gdwarf-2 -DIPSET_DEBUG -Wall -Werror +@ENABLE_DEBUG_FALSE@am__append_2 = -O2 -DNDEBUG +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltargz.m4 \ + $(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) +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 = \ + kernel/include/linux/netfilter/ipset/ip_set_compat.h +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-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 \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ + $(top_srcdir)/Make_global.am $(top_srcdir)/build-aux/compile \ + $(top_srcdir)/build-aux/config.guess \ + $(top_srcdir)/build-aux/config.sub \ + $(top_srcdir)/build-aux/install-sh \ + $(top_srcdir)/build-aux/ltmain.sh \ + $(top_srcdir)/build-aux/missing \ + $(top_srcdir)/kernel/include/linux/netfilter/ipset/ip_set_compat.h.in \ + COPYING ChangeLog INSTALL README build-aux/compile \ + build-aux/config.guess build-aux/config.sub \ + build-aux/install-sh build-aux/ltmain.sh build-aux/missing +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_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 +GZIP_ENV = --best +DIST_TARGETS = dist-gzip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +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@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +HAVE_CHECKENTRY_BOOL = @HAVE_CHECKENTRY_BOOL@ +HAVE_ETHER_ADDR_COPY = @HAVE_ETHER_ADDR_COPY@ +HAVE_ETHER_ADDR_EQUAL = @HAVE_ETHER_ADDR_EQUAL@ +HAVE_EXPORT_H = @HAVE_EXPORT_H@ +HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H = @HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H@ +HAVE_IPV6_SKIP_EXTHDR_ARGS = @HAVE_IPV6_SKIP_EXTHDR_ARGS@ +HAVE_IS_ZERO_ETHER_ADDR = @HAVE_IS_ZERO_ETHER_ADDR@ +HAVE_KVCALLOC = @HAVE_KVCALLOC@ +HAVE_KVFREE = @HAVE_KVFREE@ +HAVE_LIST_LAST_ENTRY = @HAVE_LIST_LAST_ENTRY@ +HAVE_LIST_NEXT_ENTRY = @HAVE_LIST_NEXT_ENTRY@ +HAVE_LOCKDEP_NFNL_IS_HELD = @HAVE_LOCKDEP_NFNL_IS_HELD@ +HAVE_NETLINK_DUMP_START_ARGS = @HAVE_NETLINK_DUMP_START_ARGS@ +HAVE_NETLINK_EXTENDED_ACK = @HAVE_NETLINK_EXTENDED_ACK@ +HAVE_NET_IN_NFNL_CALLBACK_FN = @HAVE_NET_IN_NFNL_CALLBACK_FN@ +HAVE_NET_IN_XT_ACTION_PARAM = @HAVE_NET_IN_XT_ACTION_PARAM@ +HAVE_NET_OPS_ASYNC = @HAVE_NET_OPS_ASYNC@ +HAVE_NET_OPS_ID = @HAVE_NET_OPS_ID@ +HAVE_NFNL_LOCK_SUBSYS = @HAVE_NFNL_LOCK_SUBSYS@ +HAVE_NFNL_MSG_TYPE = @HAVE_NFNL_MSG_TYPE@ +HAVE_NF_BRIDGE_GET_PHYSDEV = @HAVE_NF_BRIDGE_GET_PHYSDEV@ +HAVE_NLA_PUT_64BIT = @HAVE_NLA_PUT_64BIT@ +HAVE_NLA_PUT_BE16 = @HAVE_NLA_PUT_BE16@ +HAVE_NLA_PUT_BE64 = @HAVE_NLA_PUT_BE64@ +HAVE_NLA_PUT_IN_ADDR = @HAVE_NLA_PUT_IN_ADDR@ +HAVE_NL_INFO_PORTID = @HAVE_NL_INFO_PORTID@ +HAVE_NS_CAPABLE = @HAVE_NS_CAPABLE@ +HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS = @HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS@ +HAVE_PASSING_EXTENDED_ACK_TO_PARSERS = @HAVE_PASSING_EXTENDED_ACK_TO_PARSERS@ +HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE = @HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE@ +HAVE_STATE_IN_XT_ACTION_PARAM = @HAVE_STATE_IN_XT_ACTION_PARAM@ +HAVE_STRSCPY = @HAVE_STRSCPY@ +HAVE_STRUCT_XT_ACTION_PARAM = @HAVE_STRUCT_XT_ACTION_PARAM@ +HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET = @HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET@ +HAVE_TCF_EMATCH_STRUCT_NET = @HAVE_TCF_EMATCH_STRUCT_NET@ +HAVE_TC_SKB_PROTOCOL = @HAVE_TC_SKB_PROTOCOL@ +HAVE_TIMER_SETUP = @HAVE_TIMER_SETUP@ +HAVE_TYPEDEF_SCTP_SCTPHDR_T = @HAVE_TYPEDEF_SCTP_SCTPHDR_T@ +HAVE_USER_NS_IN_STRUCT_NET = @HAVE_USER_NS_IN_STRUCT_NET@ +HAVE_VZALLOC = @HAVE_VZALLOC@ +HAVE_XT_FAMILY = @HAVE_XT_FAMILY@ +HAVE_XT_MTCHK_PARAM_STRUCT_NET = @HAVE_XT_MTCHK_PARAM_STRUCT_NET@ +HAVE_XT_NET = @HAVE_XT_NET@ +HAVE_XT_TARGET_PARAM = @HAVE_XT_TARGET_PARAM@ +INCLTDL = @INCLTDL@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KBUILDDIR = @KBUILDDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBADD_DL = @LIBADD_DL@ +LIBADD_DLD_LINK = @LIBADD_DLD_LINK@ +LIBADD_DLOPEN = @LIBADD_DLOPEN@ +LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@ +LIBLTDL = @LIBLTDL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTDLDEPS = @LTDLDEPS@ +LTDLINCL = @LTDLINCL@ +LTDLOPEN = @LTDLOPEN@ +LTLIBOBJS = @LTLIBOBJS@ +LT_ARGZ_H = @LT_ARGZ_H@ +LT_CONFIG_H = @LT_CONFIG_H@ +LT_DLLOADERS = @LT_DLLOADERS@ +LT_DLPREOPEN = @LT_DLPREOPEN@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAXSETS = @MAXSETS@ +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@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SETTYPE_MODLIST = @SETTYPE_MODLIST@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +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_AR = @ac_ct_AR@ +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@ +bashcompdir = @bashcompdir@ +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@ +libmnl_CFLAGS = @libmnl_CFLAGS@ +libmnl_LIBS = @libmnl_LIBS@ +localedir = @localedir@ +localstatedir = @localstatedir@ +ltdl_LIBOBJS = @ltdl_LIBOBJS@ +ltdl_LTLIBOBJS = @ltdl_LTLIBOBJS@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sys_symbol_underscore = @sys_symbol_underscore@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +ACLOCAL_AMFLAGS = -I m4 + +# curr:rev:age +LIBVERSION = 14:0:1 +AM_CPPFLAGS = $(kinclude_CFLAGS) $(all_includes) -I$(top_srcdir)/include +AM_CFLAGS = -std=gnu99 $(am__append_1) $(am__append_2) +SPARSE = sparse +SPARSE_FLAGS = -Wsparse-all -I../include $(SPARSE_EXT_FLAGS) +IPSET_AM_V_CHECK = $(ipset_am__v_CHECK_$(V)) +ipset_am__v_CHECK_ = $(ipset_am__v_CHECK_$(AM_DEFAULT_VERBOSITY)) +ipset_am__v_CHECK_0 = @echo " CHECK " $<; +@WITH_KBUILDDIR_FALSE@KBUILD_OUTPUT = /lib/modules/`uname -r`/build +@WITH_KBUILDDIR_TRUE@KBUILD_OUTPUT = $(KBUILDDIR) +@WITH_MAXSETS_FALSE@IP_SET_MAX = 256 +@WITH_MAXSETS_TRUE@IP_SET_MAX = $(MAXSETS) +SUBDIRS = include/libipset lib src utils +INSTALL_MOD_PATH = / +cleanup_dirs := . include/libipset lib src tests +DISTCHECK_CONFIGURE_FLAGS = --with-kmod=no +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/Make_global.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign 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_srcdir)/Make_global.am $(am__empty): + +$(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 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +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 +kernel/include/linux/netfilter/ipset/ip_set_compat.h: $(top_builddir)/config.status $(top_srcdir)/kernel/include/linux/netfilter/ipset/ip_set_compat.h.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 + +# 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. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + 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" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + 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; \ + $(am__define_uniq_tagged_files); \ + 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-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +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 \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + 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 -755 \ + -exec chmod u+rwx,go+rx {} \; -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__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_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) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(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) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(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/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(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__post_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: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { 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 config.h +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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +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-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: + +.MAKE: $(am__recursive_targets) all install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am clean clean-cscope clean-generic \ + clean-libtool cscope cscopelist-am ctags ctags-am dist \ + dist-all dist-bzip2 dist-gzip dist-lzip 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-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-am uninstall \ + uninstall-am + +.PRECIOUS: Makefile + + +sparse: + $(MAKE) -C lib sparse-check + $(MAKE) -C src sparse-check + +modules_sparse: +@WITH_KMOD_TRUE@ ${MAKE} -C $(KBUILD_OUTPUT) M=$$PWD/kernel/net \ +@WITH_KMOD_TRUE@ V=$V W=1 C=2 CF="-D__CHECK_ENDIAN__ -Wsparse-all" \ +@WITH_KMOD_TRUE@ KCFLAGS="-DPACKAGE_VERSION=$(PACKAGE_VERSION) -DCHECK_KCONFIG -Wextra" \ +@WITH_KMOD_TRUE@ IP_SET_MAX=$(IP_SET_MAX) KDIR=$$PWD/kernel modules +@WITH_KMOD_FALSE@ @echo Skipping kernel modules due to --with-kmod=no + +modules: +@WITH_KMOD_TRUE@ ${MAKE} -C $(KBUILD_OUTPUT) M=$$PWD/kernel/net V=$V \ +@WITH_KMOD_TRUE@ KCFLAGS="-DPACKAGE_VERSION=$(PACKAGE_VERSION)" \ +@WITH_KMOD_TRUE@ IP_SET_MAX=$(IP_SET_MAX) KDIR=$$PWD/kernel modules +@WITH_KMOD_FALSE@ @echo Skipping kernel modules due to --with-kmod=no + +define DEPMOD_WARNING + +!!! WARNING !!! WARNING !!! WARNING !!! + +Your distribution seems to ignore the /lib/modules//extra/ +subdirectory, where the ipset kernel modules are installed. + +Add the 'extra' directory to the search definition of your depmod +configuration (/etc/depmod.conf or /etc/depmod.d/) and re-run + + depmod + +otherwise the ipset kernel modules in the extra subdir will be ignored. + +endef +export DEPMOD_WARNING + +define MODULE_WARNING + +!!! WARNING !!! WARNING !!! WARNING !!! + +Your running system has got ipset related kernel modules loaded in. +You MUST rmmod the ip_set* kernel modules in order to make possible +for the system to load in the newly installed ones. +endef +export MODULE_WARNING + +modules_install: +@WITH_KMOD_TRUE@ ${MAKE} -C $(KBUILD_OUTPUT) M=$$PWD/kernel/net \ +@WITH_KMOD_TRUE@ KDIR=$$PWD/kernel modules_install +@WITH_KMOD_TRUE@ @modinfo -b ${INSTALL_MOD_PATH} ip_set_hash_ip | ${GREP} /extra/ >/dev/null || echo "$$DEPMOD_WARNING" +@WITH_KMOD_TRUE@ @lsmod | ${GREP} '^ip_set' >/dev/null && echo "$$MODULE_WARNING" +@WITH_KMOD_FALSE@ @echo Skipping kernel modules due to --with-kmod=no + +modules_clean: +@WITH_KMOD_TRUE@ ${MAKE} -C $(KBUILD_OUTPUT) M=$$PWD/kernel/net \ +@WITH_KMOD_TRUE@ KDIR=$$PWD/kernel clean +@WITH_KMOD_FALSE@ @echo Skipping kernel modules due to --with-kmod=no + +update_includes: + for x in ip_set.h ip_set_bitmap.h ip_set_hash.h ip_set_list.h; do \ + sed -r -e 's@#(ifndef|define|endif[ \t]*/[*])[ \t]*_UAPI@#\1 @' \ + -e 's@^#include @@' \ + kernel/include/uapi/linux/netfilter/ipset/$$x \ + > include/libipset/linux_$$x; \ + done + +update_utils: + wget -4 -O /tmp/ipset-bash-completion.tar.gz http://sourceforge.net/projects/ipset-bashcompl/files/latest/download + cd utils/ipset_bash_completion; tar xz --strip-components=1 -f /tmp/ipset-bash-completion.tar.gz + rm -f /tmp/ipset-bash-completion.tar.gz + wget -4 -O /tmp/ipset-list.tar.gz http://sourceforge.net/projects/ipset-list/files/latest/download + cd utils/ipset_list; tar xz --strip-components=1 -f /tmp/ipset-list.tar.gz + rm -f /tmp/ipset-list.tar.gz + +check_libmap: + @./check_libmap.sh + +tests: + cd tests; ./runtest.sh + +tidy: distclean modules_clean + rm -rf .deps $(foreach dir,$(cleanup_dirs),$(wildcard $(dir)/*~)) + rm -rf aclocal.m4 autom4te.cache + rm -rf config.* configure compile depcomp install-sh libtool ltmain.sh + rm -rf Makefile Makefile.in lib/Makefile lib/Makefile.in src/Makefile src/Makefile.in + rm -rf missing stamp-h1 m4/libtool.m4 m4/lt*.m4 + rm -rf lib/ipset_settype_check lib/types_init.c + find . -name '*~' -delete + +tarball: + rm -Rf /tmp/ipset-${PACKAGE_VERSION}; + pushd ${top_srcdir} && git archive --prefix=ipset-${PACKAGE_VERSION}/ HEAD | tar -C /tmp -x && popd; + pushd /tmp/ipset-${PACKAGE_VERSION} && ./autogen.sh && popd; + tar -C /tmp -cjf ipset-${PACKAGE_VERSION}.tar.bz2 --owner=root --group=root ipset-${PACKAGE_VERSION}/; + rm -Rf /tmp/ipset-${PACKAGE_VERSION}; + +help: + @echo ' - Compile userspace' + @echo ' modules - Compile kernel modules' + @echo ' install - Install userspace' + @echo ' modules_install - Install kernel modules' + @echo ' clean - Remove generated userspace files' + @echo ' modules_clean - Remove generated kernelspace files' + @echo ' tidy - Tidy up the whole source tree' + @echo ' tests - Run testsuite' + @echo ' sparse - Check userspace with sparse' + @echo ' modules_sparse - Check kernelspace with sparse' + @echo ' update_includes - Update userspace include files' + @echo ' update_utils - Update bash utilities' + @echo ' check_libmap - Check libipset.map for missing symbols' + @echo ' tarball - Create a tarball for a new release' + +.PHONY: modules modules_instal modules_clean update_includes tests tarball + +# 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/README b/README new file mode 100644 index 0000000..08b3598 --- /dev/null +++ b/README @@ -0,0 +1,89 @@ +This is the ipset source tree. Follow the next steps to install ipset. +If you upgrade from an earlier 5.x release, please read the UPGRADE +instructions too. + +0. You need the source tree of your kernel (version >= 2.6.32) + and it have to be configured with ip6tables support enabled, + modules compiled. For kernel versions < 2.6.39 please apply + the netlink.patch against your kernel tree, which adds the + new subsystem identifier for ipset. + + Recompile and install the patched kernel and its modules. Please note, + you have to run the patched kernel for ipset to work. + + The ipset source code depends on the libmnl library so the library + must be installed. You can download the libmnl library from + + git://git.netfilter.org/libmnl.git + +1. Initialize the compiling environment for ipset. The packages automake, + autoconf, pkg-config and libtool are required. + + % ./autogen.sh + +2. Run `./configure` and then compile the ipset binary and the kernel + modules. + + Configure parameters can be used to to override the default path + to the kernel source tree (/lib/modules/`uname -r`/build), + the maximum number of sets (256), the default hash sizes (1024). + See `./configure --help`. + + % ./configure + % make + % make modules + +3. Install the binary and the kernel modules + + # make install + # make modules_install + + After installing the modules, you can run the testsuite as well. + Please note, several assumptions must be met for the testsuite: + + - no sets defined + - iptables/ip6tables rules are not set up + - the destination for kernel logs is /var/log/kern.log + - the networks 10.255.255.0/24 and 1002:1002:1002:1002::/64 + are not in use + - sendip utility is installed + + # make tests + +4. Cleanup the source tree + + % make clean + % make modules_clean + +That's it! + +Read the ipset(8) and iptables(8), ip6tables(8) manpages on how to use +ipset and its match and target from iptables. + +Compatibilities and incompatibilities: + +- The ipset 6.x userspace utility contains a backward compatibility + interface to support the commandline syntax of ipset 4.x. + The commandline syntax of ipset 6.x is fully compatible with 5.x. +- The ipset 6.x userspace utility can't talk to the kernel part of ipset 5.x + or 4.x. +- The ipset 6.x kernel part can't talk to the userspace utility from + ipset 5.x or 4.x. +- The ipset 6.x kernel part can work together with the set match and SET + target from iptables 1.4.7 and below, however if you need the IPv6 support + from ipset 6.x, then you have to use iptables 1.4.9 or above. + +The ipset 6.x can interpret the commandline syntax of ipset 4.x, however +some internal changes mean different behaviour: + +- The "--matchunset" flag for the macipmap type is ignored and not used + anymore. +- The "--probes" and "--resize" parameters of the hash types are ignored + and not used anymore. +- The "--from", "--to" and "--network" parameters of the ipporthash, + ipportiphash and ipportnethash types are ignored and not used anymore. +- The hash types are not resized when new entries are added by the SET + target. If you use a set together with the SET target, create it with + the proper size because it won't be resized automatically. +- The iptree, iptreemap types are not implemented in ipset 6.x. The types + are automatically substituted with the hash:ip type. diff --git a/UPGRADE b/UPGRADE new file mode 100644 index 0000000..dfa677d --- /dev/null +++ b/UPGRADE @@ -0,0 +1,19 @@ +ipset 6.x, 5.x upgrade notices + +- From ipset 5.0-5.3 to 5.4 or above: + + Due to the source code reorganization, some macros were moved to + the netlink.patch. Therefore when upgrading, you have two choices: + + a. force the application of the new netlink.patch + + kernel-source-dir # patch -p1 -f < ipset-curr-dir/netlink.patch + + b. remove the earlier netlink.patch and apply the new one: + + kernel-source-dir # patch -p1 -R < ipset-before-5.4-dir/netlink.patch + kernel-source-dir # patch -p1 < ipset-curr-dir/netlink.patch + + You do not need to recompile your kernel. + + Of course the kernel modules in ipset must be compiled and installed. diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..7b3075d --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,1436 @@ +# generated automatically by aclocal 1.15 -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +dnl serial 11 (pkg-config-0.29) +dnl +dnl Copyright © 2004 Scott James Remnant . +dnl Copyright © 2012-2015 Dan Nicholson +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +dnl 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that +dnl program. + +dnl PKG_PREREQ(MIN-VERSION) +dnl ----------------------- +dnl Since: 0.29 +dnl +dnl Verify that the version of the pkg-config macros are at least +dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's +dnl installed version of pkg-config, this checks the developer's version +dnl of pkg.m4 when generating configure. +dnl +dnl To ensure that this macro is defined, also add: +dnl m4_ifndef([PKG_PREREQ], +dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) +dnl +dnl See the "Since" comment for each macro you use to see what version +dnl of the macros you require. +m4_defun([PKG_PREREQ], +[m4_define([PKG_MACROS_VERSION], [0.29]) +m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, + [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) +])dnl PKG_PREREQ + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +dnl Since: 0.16 +dnl +dnl Search for the pkg-config tool and set the PKG_CONFIG variable to +dnl first found in the path. Checks that the version of pkg-config found +dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is +dnl used since that's the first version where most current features of +dnl pkg-config existed. +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])dnl PKG_PROG_PKG_CONFIG + +dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------------------------------- +dnl Since: 0.18 +dnl +dnl Check to see whether a particular set of modules exists. Similar to +dnl PKG_CHECK_MODULES(), but does not set variables or print errors. +dnl +dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +dnl only at the first occurence in configure.ac, so if the first place +dnl it's called might be skipped (such as if it is within an "if", you +dnl have to call PKG_CHECK_EXISTS manually +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +dnl --------------------------------------------- +dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting +dnl pkg_failed based on the result. +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])dnl _PKG_CONFIG + +dnl _PKG_SHORT_ERRORS_SUPPORTED +dnl --------------------------- +dnl Internal check to see if pkg-config supports short errors. +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])dnl _PKG_SHORT_ERRORS_SUPPORTED + + +dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl -------------------------------------------------------------- +dnl Since: 0.4.0 +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES might not happen, you should be sure to include an +dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])dnl PKG_CHECK_MODULES + + +dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl --------------------------------------------------------------------- +dnl Since: 0.29 +dnl +dnl Checks for existence of MODULES and gathers its build flags with +dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags +dnl and VARIABLE-PREFIX_LIBS from --libs. +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to +dnl include an explicit call to PKG_PROG_PKG_CONFIG in your +dnl configure.ac. +AC_DEFUN([PKG_CHECK_MODULES_STATIC], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +_save_PKG_CONFIG=$PKG_CONFIG +PKG_CONFIG="$PKG_CONFIG --static" +PKG_CHECK_MODULES($@) +PKG_CONFIG=$_save_PKG_CONFIG[]dnl +])dnl PKG_CHECK_MODULES_STATIC + + +dnl PKG_INSTALLDIR([DIRECTORY]) +dnl ------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable pkgconfigdir as the location where a module +dnl should install pkg-config .pc files. By default the directory is +dnl $libdir/pkgconfig, but the default can be changed by passing +dnl DIRECTORY. The user can override through the --with-pkgconfigdir +dnl parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_INSTALLDIR + + +dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) +dnl -------------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable noarch_pkgconfigdir as the location where a +dnl module should install arch-independent pkg-config .pc files. By +dnl default the directory is $datadir/pkgconfig, but the default can be +dnl changed by passing DIRECTORY. The user can override through the +dnl --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_NOARCH_INSTALLDIR + + +dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------- +dnl Since: 0.28 +dnl +dnl Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])dnl PKG_CHECK_VAR + +# Copyright (C) 2002-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.15' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.15], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.15])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[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". + rm -rf conftest.dir + 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_$1_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 + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [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 10 /bin/sh. + echo '/* dummy */' > 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 + ;; + msvc7 | msvc7msys | 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_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf 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")` + 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"` + # 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'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + 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 +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_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"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != 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 +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[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 +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[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. +AC_MSG_CHECKING([for style of include used by $am_make]) +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 +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +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 --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# 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]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +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 ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + 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 + 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". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# 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. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/ax_cflags_gcc_option.m4]) +m4_include([m4/libtool.m4]) +m4_include([m4/ltargz.m4]) +m4_include([m4/ltdl.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..9c0f327 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,5 @@ +#!/bin/sh -e + +aclocal -I m4 +autoreconf -fi +rm -Rf autom4te.cache diff --git a/build-aux/compile b/build-aux/compile new file mode 100755 index 0000000..a85b723 --- /dev/null +++ b/build-aux/compile @@ -0,0 +1,347 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2012-10-14.11; # UTC + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# 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 . + +# 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. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# 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/build-aux/config.guess b/build-aux/config.guess new file mode 100755 index 0000000..2e9ad7f --- /dev/null +++ b/build-aux/config.guess @@ -0,0 +1,1462 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2016 Free Software Foundation, Inc. + +timestamp='2016-10-02' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception 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. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2016 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 + +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /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 ;; + earmv*) + arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-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) and ABI. + case "${UNAME_MACHINE_ARCH}" in + earm*) + os=netbsdelf + ;; + 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 + # Determine ABI tags. + case "${UNAME_MACHINE_ARCH}" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` + ;; + 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/[-_].*//' | cut -d. -f1,2` + ;; + 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}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${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 ;; + *:Sortix:*:*) + echo ${UNAME_MACHINE}-unknown-sortix + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = hppa2.0w ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + *:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`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 "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + else + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + e2k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + k1om:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + mips64el:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-${LIBC} + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-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 ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-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 + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'` + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; +esac + +cat >&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/build-aux/config.sub b/build-aux/config.sub new file mode 100755 index 0000000..dd2ca93 --- /dev/null +++ b/build-aux/config.sub @@ -0,0 +1,1825 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2016 Free Software Foundation, Inc. + +timestamp='2016-11-04' + +# 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception 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. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# 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 or ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2016 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ + kopensolaris*-gnu* | cloudabi*-eabi* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | ba \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | 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 \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 | or1k | or1knd | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pru \ + | pyramid \ + | riscv32 | riscv64 \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | ba-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | e2k-* | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | k1om-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | 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-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | or1k*-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pru-* \ + | pyramid-* \ + | riscv32-* | riscv64-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | visium-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + asmjs) + basic_machine=asmjs-unknown + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + e500v[12]) + basic_machine=powerpc-unknown + os=$os"spe" + ;; + e500v[12]-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + os=$os"spe" + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i686-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 + ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle) + 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) + 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 | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* | -cloudabi* | -sortix* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ + | -onefs* | -tirtos* | -phoenix* | -fuchsia*) + # 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 + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -ios) + ;; + -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 + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/build-aux/depcomp b/build-aux/depcomp new file mode 100755 index 0000000..fc98710 --- /dev/null +++ b/build-aux/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2013-05-30.07; # UTC + +# Copyright (C) 1999-2014 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 . + +# 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 . + +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 outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +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" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# 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 + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 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=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +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 -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## 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). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - 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 -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # 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. +## 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. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -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 -ne 0; then + 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 ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # 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 + ;; + +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. + set_dir_from "$object" + set_base_from "$object" + 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 -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + 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. + set_dir_from "$object" + set_base_from "$object" + 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 -ne 0; then + 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,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_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. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool 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$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # 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 + ;; + +#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|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | 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" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | 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::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$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/build-aux/install-sh b/build-aux/install-sh new file mode 100755 index 0000000..59990a1 --- /dev/null +++ b/build-aux/install-sh @@ -0,0 +1,508 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2014-09-12.12; # 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. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# 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_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 +is_target_a_directory=possibly + +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 + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + dstdir=`dirname "$dst"` + 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. + ;; + *) + # $RANDOM is not portable (e.g. dash); use it when possible to + # lower collision chance + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 + + # As "mkdir -p" follows symlinks and we work in /tmp possibly; so + # create the $tmpdir first (and fail if unsuccessful) to make sure + # that nobody tries to guess the $tmpdir name. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/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-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 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 + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + 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/build-aux/ltmain.sh b/build-aux/ltmain.sh new file mode 100644 index 0000000..a736cf9 --- /dev/null +++ b/build-aux/ltmain.sh @@ -0,0 +1,11156 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2015 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 this program. If not, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION="2.4.6 Debian-2.4.6-2" +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 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. + +# 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. + +# 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. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES 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 . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +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 + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +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 + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# 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. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_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 '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +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. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# 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. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# 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" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_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 "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || 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_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# 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 () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_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. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# 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). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet 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 () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet 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 () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2014-01-07.03; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 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. + +# 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 . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + done + + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# my_options_prep_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# my_option_validation_result=$func_quote_for_eval_result +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result=$func_run_hooks_result +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + + # Adjust func_parse_options positional parameters to match + eval set dummy "$func_run_hooks_result"; shift + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --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 + --no-warnings equivalent to '-Wnone' + --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 more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$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. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +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) + version: $progname $scriptversion Debian-2.4.6-2 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "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 yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; 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 +} + + +# 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 +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + # 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 + + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + 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 $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; 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=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# 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= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# 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 | func_generated_by_libtool_p +} + +# 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 yes = "$lalib_p" +} + +# 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 () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# 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_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# 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 () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + 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 () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$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 () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + 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 "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # 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_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # 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 yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# 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. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # 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_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # 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_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # 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) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append 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_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append 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_append_quoted base_compile "$lastarg" + 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 | *.go | *.obj | *.sx | *.cu | *.cup) + 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 yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot 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 yes = "$build_old_libs"; 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 no = "$pic_mode" && test pass_all != "$deplibs_check_method"; 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 no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; 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 yes = "$need_locks"; 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 warn = "$need_locks"; 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 + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; 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 + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + 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 yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + 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 no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_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 build PIC objects only + -prefer-non-pic try to build 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 + -Wc,FLAG pass FLAG directly to the compiler + +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-dir 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 + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -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 + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -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 + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +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 '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # 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 $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # 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 + func_append 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 + -* | *.la | *.lo ) ;; + *) + # 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_append_quoted args "$file" + done + + if $opt_dry_run; then + # 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 + else + 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 + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + 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" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + 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 "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + 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" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_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 -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + 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=: + if $isdir; 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. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # 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 "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -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 "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "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_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + 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" && func_append 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 yes = "$build_old_libs"; 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=: + 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 "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + 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 "$file$stripped_ext" | $SED "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_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_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 install = "$opt_mode" && 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 () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; 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 "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $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 + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + 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 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 + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + 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" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append 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" "${nlist}I"' + + # 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 "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "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 "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# 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. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + 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 + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + 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_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + 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 () +{ + $debug_cmd + + 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` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + 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 "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $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 | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# 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 where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $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. +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 + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED '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 \"\$file\" | $SED '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 \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_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 \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; 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" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && 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 \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${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\ +" +} + + +# 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 < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#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 + +/* path handling portability macros */ +#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 */ + +#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 (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +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_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +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_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 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; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + 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]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + 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 = (size_t) (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 (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + 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 (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + 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) + { + lt_debugprintf (__FILE__, __LINE__, + "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 + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "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 (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t 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) + { + size_t orig_value_len = strlen (orig_value); + size_t 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; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + 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 + # what 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 that 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 + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + 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 yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && 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 + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append 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 "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append 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 none = "$pic_object" && + test none = "$non_pic_object"; 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 none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append 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 dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; 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 none = "$pic_object"; 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 + ;; + os2dllname) + os2dllname=$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 rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append 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 + ;; + + -bindir) + prev=bindir + 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-export-symbols = "X$arg"; 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" + if test -z "$func_stripname_result"; 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 + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # 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 "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # 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-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + 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|--sysroot) + func_append 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|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append 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 + ;; + + -os2dllname) + prev=os2dllname + 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_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append 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" + func_append arg " $func_quote_for_eval_result" + func_append 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" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append 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 + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -specs=* GCC specs files + # -stdlib=* select c++ std lib with clang + # -fsanitize=* Clang/GCC memory and address sanitizer + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ + -specs=*|-fsanitize=*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append 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 none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append 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 dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; 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 none = "$pic_object"; 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. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + 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 yes = "$export_dynamic" && 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 \"\$$shlibpath_var\" \| \$SED \'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\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # 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_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; 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 "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append 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=false + 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 lib,link = "$linkmode,$pass"; 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 lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; 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 lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; 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 .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; 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=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + 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." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # 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 "$inherited_linker_flags" | $SED '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 "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; 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. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + elif test prog != "$linkmode" && test lib != "$linkmode"; 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= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + 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 dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + 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. + func_append dlprefiles " $lib $dependency_libs" + else + func_append 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 yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && 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 + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append 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 dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append 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" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append 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" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; 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 prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; 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_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + 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:"*) ;; + *) func_append 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 "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + 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 built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append 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 yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; 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 lib = "$linkmode" && + test yes = "$hardcode_into_libs"; 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 "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append 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* | *os2*) + 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 prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; 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 cannot + # 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 no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; 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 yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; 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 + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; 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 prog = "$linkmode"; 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 unsupported != "$hardcode_direct"; 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 yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; 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 cannot 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 yes = "$module"; 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 no = "$build_old_libs"; 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 lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; 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 "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + 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 + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append 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 link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # 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 "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=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 "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # 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 + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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 + func_append 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 no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; 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 pass_all != "$deplibs_check_method"; 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!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; 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 + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|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" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; 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 0 -ne "$loop"; 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) # correct to gnu/linux during the next big refactor + 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 0 -ne "$loop"; 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. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + 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 no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; 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 -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "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 + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; 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 "*) ;; + *) func_append 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 "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append 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 yes = "$build_libtool_need_lc"; then + func_append 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 </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + 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 "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append 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. + func_append 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 yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append 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 \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append 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. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; 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 + ;; + esac + ;; + 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 " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; 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 no = "$build_old_libs"; 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 no = "$allow_undefined"; 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 no = "$build_old_libs"; 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 " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED '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 "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append 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 yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + 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"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append 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 "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append 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 relink = "$opt_mode" || 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 + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$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 + func_append 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 + func_dll_def_p "$export_symbols" || { + # 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 + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || 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 cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + 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 : != "$skipped_export"; 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 "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && 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 + func_append 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 "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + 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 + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; 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 yes = "$module" && 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 : != "$skipped_export" && + 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 + func_basename "$output" + output_la=$func_basename_result + + # 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 : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + 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 -z "$objlist" || + 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 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$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~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + 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 + } + + 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_quiet || { + 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 relink = "$opt_mode"; 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 + + ${skipped_export-false} && { + 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 "$include_expsyms" | $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 + func_append 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 + } + + 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 yes = "$module" && 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 + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + 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 relink = "$opt_mode"; 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 relink = "$opt_mode"; 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 yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + 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 + + test yes = "$build_libtool_libs" || { + 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 + } + + if test -n "$pic_flag" || test default != "$pic_mode"; 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" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && 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 " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED '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 CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED '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 "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append 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 "*) ;; + *) func_append 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"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append 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;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append 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"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append 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 yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED '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=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # 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 + } + + 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 + func_append 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 + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; 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 "$link_command" | $SED '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 $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # 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" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED '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 $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # 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 "$relink_command" | $SED "$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 + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; 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 + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append 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 + func_append 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" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + 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 + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + 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 -z "$oldobjs"; 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 yes = "$build_old_libs" && 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 "$relink_command" | $SED "$sed_quote_subst"` + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; 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 + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append 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" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append 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" + func_append newdlprefiles " ${lt_sysroot:+=}$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 + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $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 cannot 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 no,yes = "$installed,$need_relink"; 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 +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + 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) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + 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 $rmforce; 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 + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || 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 none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; 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 + func_append 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 + func_append 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 + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # 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 +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_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 +# where 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: diff --git a/build-aux/missing b/build-aux/missing new file mode 100755 index 0000000..f62bbae --- /dev/null +++ b/build-aux/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2013-10-28.13; # UTC + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 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 . + +# 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 + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + 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 + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# 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/check_const b/check_const new file mode 100755 index 0000000..61b9f31 --- /dev/null +++ b/check_const @@ -0,0 +1,8 @@ +#! /usr/bin/awk -f + +# include/linux/nfnetlink.h: nfnl_callback +# include/linux/netlink.h: netlink_dump_start +{ if (/^(struct nfnl_callback|extern int netlink_dump)/) { check=1 } } +{ if (check == 1 && /(^};|...\);)/) { check=0 } } + +{ if (check == 1 && /const struct nlmsghdr/) { print "const" } } diff --git a/check_libmap.sh b/check_libmap.sh new file mode 100755 index 0000000..c8931f9 --- /dev/null +++ b/check_libmap.sh @@ -0,0 +1,14 @@ +#!/bin/sh +for file in include/libipset/*.h; do + case $file in + */ui.h) continue ;; + esac + grep ^extern $file | sed -r -e 's/\(.*//' -e 's/.* \*?//' | egrep -v '\[|\;' +done | while read symbol; do + if [ -z "$symbol" -o "$symbol" = '{' ]; then + continue + fi + if [ -z "`grep \" $symbol\;\" lib/libipset.map`" ]; then + echo "Symbol $symbol is missing from libipset.map" + fi +done diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..4173144 --- /dev/null +++ b/config.h.in @@ -0,0 +1,204 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Debug messages. */ +#undef ENABLE_DEBUG + +/* Define to 1 if you have the `argz_add' function. */ +#undef HAVE_ARGZ_ADD + +/* Define to 1 if you have the `argz_append' function. */ +#undef HAVE_ARGZ_APPEND + +/* Define to 1 if you have the `argz_count' function. */ +#undef HAVE_ARGZ_COUNT + +/* Define to 1 if you have the `argz_create_sep' function. */ +#undef HAVE_ARGZ_CREATE_SEP + +/* Define to 1 if you have the header file. */ +#undef HAVE_ARGZ_H + +/* Define to 1 if you have the `argz_insert' function. */ +#undef HAVE_ARGZ_INSERT + +/* Define to 1 if you have the `argz_next' function. */ +#undef HAVE_ARGZ_NEXT + +/* Define to 1 if you have the `argz_stringify' function. */ +#undef HAVE_ARGZ_STRINGIFY + +/* Define to 1 if you have the `closedir' function. */ +#undef HAVE_CLOSEDIR + +/* Define to 1 if you have the declaration of `cygwin_conv_path', and to 0 if + you don't. */ +#undef HAVE_DECL_CYGWIN_CONV_PATH + +/* Define to 1 if you have the declaration of `NLA_F_NESTED', and to 0 if you + don't. */ +#undef HAVE_DECL_NLA_F_NESTED + +/* Define to 1 if you have the declaration of `NLA_F_NET_BYTEORDER', and to 0 + if you don't. */ +#undef HAVE_DECL_NLA_F_NET_BYTEORDER + +/* Define to 1 if you have the declaration of `NLA_TYPE_MASK', and to 0 if you + don't. */ +#undef HAVE_DECL_NLA_TYPE_MASK + +/* Define to 1 if you have the header file. */ +#undef HAVE_DIRENT_H + +/* Define if you have the GNU dld library. */ +#undef HAVE_DLD + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLD_H + +/* Define to 1 if you have the `dlerror' function. */ +#undef HAVE_DLERROR + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DL_H + +/* Define if you have the _dyld_func_lookup function. */ +#undef HAVE_DYLD + +/* Define to 1 if the system has the type `error_t'. */ +#undef HAVE_ERROR_T + +/* Define to 1 if you have the `gethostbyname2' function. */ +#undef HAVE_GETHOSTBYNAME2 + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define if you have the libdl library or equivalent. */ +#undef HAVE_LIBDL + +/* Define if libdlloader will be built on this platform */ +#undef HAVE_LIBDLLOADER + +/* Define this if a modern libltdl is already installed */ +#undef HAVE_LTDL + +/* Define to 1 if you have the header file. */ +#undef HAVE_MACH_O_DYLD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `opendir' function. */ +#undef HAVE_OPENDIR + +/* Define if libtool can extract symbol lists from object files. */ +#undef HAVE_PRELOADED_SYMBOLS + +/* Define to 1 if you have the `readdir' function. */ +#undef HAVE_READDIR + +/* Define if you have the shl_load function. */ +#undef HAVE_SHL_LOAD + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strlcat' function. */ +#undef HAVE_STRLCAT + +/* Define to 1 if you have the `strlcpy' function. */ +#undef HAVE_STRLCPY + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_DL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if the system has the type `union nf_inet_addr'. */ +#undef HAVE_UNION_NF_INET_ADDR + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* This value is set to 1 to indicate that the system argz facility works */ +#undef HAVE_WORKING_ARGZ + +/* Define if the OS needs help to load dependent libraries for dlopen(). */ +#undef LTDL_DLOPEN_DEPLIBS + +/* Define to the system default library search path. */ +#undef LT_DLSEARCH_PATH + +/* The archive extension */ +#undef LT_LIBEXT + +/* The archive prefix */ +#undef LT_LIBPREFIX + +/* Define to the extension used for runtime loadable modules, say, ".so". */ +#undef LT_MODULE_EXT + +/* Define to the name of the environment variable that determines the run-time + module search path. */ +#undef LT_MODULE_PATH_VAR + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#undef LT_OBJDIR + +/* Define to the shared library suffix, say, ".dylib". */ +#undef LT_SHARED_EXT + +/* Define to the shared archive member specification, say "(shr.o)". */ +#undef LT_SHARED_LIB_MEMBER + +/* Define if dlsym() requires a leading underscore in symbol names. */ +#undef NEED_USCORE + +/* 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 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* Define so that glibc/gnulib argp.h does not typedef error_t. */ +#undef __error_t_defined + +/* Define to a type to use for 'error_t' if it is not otherwise available. */ +#undef error_t diff --git a/configure b/configure new file mode 100755 index 0000000..2a2bf48 --- /dev/null +++ b/configure @@ -0,0 +1,19752 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for ipset 7.1. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +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 +test -x / || 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 -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || 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 : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +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: kadlec@blackhole.kfki.hu about your system, including +$0: any error possibly output before this message. Then +$0: install a modern shell, or manually run the script +$0: under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # 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 -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +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 + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# 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'" + +SHELL=${CONFIG_SHELL-/bin/sh} + +lt_ltdl_dir='libltdl' + +lt_dlopen_dir=$lt_ltdl_dir; lt_libobj_prefix=$lt_ltdl_dir/ + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='ipset' +PACKAGE_TARNAME='ipset' +PACKAGE_VERSION='7.1' +PACKAGE_STRING='ipset 7.1' +PACKAGE_BUGREPORT='kadlec@blackhole.kfki.hu' +PACKAGE_URL='' + +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='ltdl_LTLIBOBJS +ltdl_LIBOBJS +am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +HAVE_STRSCPY +HAVE_LOCKDEP_NFNL_IS_HELD +HAVE_TIMER_SETUP +HAVE_TYPEDEF_SCTP_SCTPHDR_T +HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS +HAVE_PASSING_EXTENDED_ACK_TO_PARSERS +HAVE_NETLINK_EXTENDED_ACK +HAVE_NFNL_MSG_TYPE +HAVE_XT_NET +HAVE_XT_FAMILY +HAVE_STATE_IN_XT_ACTION_PARAM +HAVE_NET_IN_XT_ACTION_PARAM +HAVE_TC_SKB_PROTOCOL +HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H +HAVE_NET_IN_NFNL_CALLBACK_FN +HAVE_NLA_PUT_IN_ADDR +HAVE_NF_BRIDGE_GET_PHYSDEV +HAVE_ETHER_ADDR_COPY +HAVE_LIST_NEXT_ENTRY +HAVE_LIST_LAST_ENTRY +HAVE_TCF_EMATCH_STRUCT_NET +HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET +HAVE_XT_MTCHK_PARAM_STRUCT_NET +HAVE_KVFREE +HAVE_KVCALLOC +HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE +HAVE_USER_NS_IN_STRUCT_NET +HAVE_NET_OPS_ASYNC +HAVE_NET_OPS_ID +HAVE_XT_TARGET_PARAM +HAVE_CHECKENTRY_BOOL +HAVE_IPV6_SKIP_EXTHDR_ARGS +HAVE_EXPORT_H +HAVE_NFNL_LOCK_SUBSYS +HAVE_NS_CAPABLE +HAVE_NETLINK_DUMP_START_ARGS +HAVE_NL_INFO_PORTID +HAVE_NLA_PUT_64BIT +HAVE_NLA_PUT_BE64 +HAVE_NLA_PUT_BE16 +HAVE_IS_ZERO_ETHER_ADDR +HAVE_ETHER_ADDR_EQUAL +HAVE_VZALLOC +HAVE_STRUCT_XT_ACTION_PARAM +libmnl_LIBS +libmnl_CFLAGS +ENABLE_SHARED_FALSE +ENABLE_SHARED_TRUE +ENABLE_STATIC_FALSE +ENABLE_STATIC_TRUE +ENABLE_SETTYPE_MODULES_FALSE +ENABLE_SETTYPE_MODULES_TRUE +SETTYPE_MODLIST +ENABLE_DEBUG_FALSE +ENABLE_DEBUG_TRUE +MAXSETS +WITH_MAXSETS_FALSE +WITH_MAXSETS_TRUE +bashcompdir +KBUILDDIR +WITH_KBUILDDIR_FALSE +WITH_KBUILDDIR_TRUE +WITH_KMOD_FALSE +WITH_KMOD_TRUE +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG +LTDLOPEN +LT_CONFIG_H +CONVENIENCE_LTDL_FALSE +CONVENIENCE_LTDL_TRUE +INSTALL_LTDL_FALSE +INSTALL_LTDL_TRUE +LT_ARGZ_H +sys_symbol_underscore +LIBADD_DL +LT_DLPREOPEN +LIBADD_DLD_LINK +LIBADD_SHL_LOAD +LIBADD_DLOPEN +LT_DLLOADERS +INCLTDL +LTDLINCL +LTDLDEPS +LIBLTDL +CPP +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +DLLTOOL +OBJDUMP +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +LIBTOOL +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +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 +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +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_silent_rules +enable_static +enable_shared +with_pic +enable_fast_install +with_aix_soname +enable_dependency_tracking +with_gnu_ld +with_sysroot +enable_libtool_lock +with_included_ltdl +with_ltdl_include +with_ltdl_lib +enable_ltdl_install +with_kmod +with_kbuild +with_ksource +enable_bashcompl +with_maxsets +enable_verbose +enable_debug +enable_settype_modules +with_settype_modules_list +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +LT_SYS_LIBRARY_PATH +CPP +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR +bashcompdir +libmnl_CFLAGS +libmnl_LIBS' + + +# 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' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -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 runstatedir +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 + 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 ipset 7.1 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] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --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/ipset] + --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 ipset 7.1:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-static[=PKGS] build static libraries [default=yes] + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-ltdl-install install libltdl + --enable-bashcompl Install bash completion for ipset + --enable-verbose Enable verbose mode at compiling/linking. + --enable-debug enable debug messages [default=disabled] + --enable-settype-modules + Enable set type modules support + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot[=DIR] Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + --with-included-ltdl use the GNU ltdl sources included here + --with-ltdl-include=DIR use the ltdl headers installed in DIR + --with-ltdl-lib=DIR use the libltdl.la installed in DIR + --with-kmod=yes/no Build the kernel module (default: yes) + --with-kbuild=PATH Path to kernel build directory + --with-ksource=PATH Path to kernel source directory, if not the same as + the kernel build directory + --with-maxsets=256 Maximal numer of sets supported by the kernel + --with-settype-modules-list="mod1 mod2 ..." + List of dynamic loading modules, ignored if + settype-modules is disabled. It could be "all" to + build all available settypes as modules + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + CPP C preprocessor + PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path + bashcompdir value of completionsdir for bash-completion, overriding + pkg-config + libmnl_CFLAGS + C compiler flags for libmnl, overriding pkg-config + libmnl_LIBS linker flags for libmnl, overriding pkg-config + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +ipset configure 7.1 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES +# --------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. +ac_fn_c_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_decl + +# 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 eval \${$3+:} false; 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; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type +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 ipset $as_me 7.1, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_aux_dir= +for ac_dir in build-aux "$srcdir"/build-aux; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + +ac_config_headers="$ac_config_headers config.h" + +am__api_version='1.15' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$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; } +# 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 ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + 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 + 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 + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + 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; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +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 --is-lightweight"; then + am_missing_run="$MISSING " +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+set}" != 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 ${ac_cv_prog_STRIP+:} false; 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 as_fn_executable_p "$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 ${ac_cv_prog_ac_ct_STRIP+:} false; 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 as_fn_executable_p "$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 ${ac_cv_path_mkdir+:} false; 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 + as_fn_executable_p "$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; } + +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 ${ac_cv_prog_AWK+:} false; 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 as_fn_executable_p "$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 eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +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 + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +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='ipset' + VERSION='7.1' + + +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"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a pax tar archive" >&5 +$as_echo_n "checking how to create a pax tar archive... " >&6; } + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_pax-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + { echo "$as_me:$LINENO: $_am_tar --version" >&5 + ($_am_tar --version) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && break + done + am__tar="$_am_tar --format=posix -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=posix -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x pax -w "$$tardir"' + am__tar_='pax -L -x pax -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H pax -L' + am__tar_='find "$tardir" -print | cpio -o -H pax -L' + am__untar='cpio -i -H pax -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_pax}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 + (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + rm -rf conftest.dir + if test -s conftest.tar; then + { echo "$as_me:$LINENO: $am__untar &5 + ($am__untar &5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 + (cat conftest.dir/file) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + grep GrepMe conftest.dir/file >/dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + if ${am_cv_prog_tar_pax+:} false; then : + $as_echo_n "(cached) " >&6 +else + am_cv_prog_tar_pax=$_am_tool +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_pax" >&5 +$as_echo "$am_cv_prog_tar_pax" >&6; } + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + + +# 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 + + + + + + + + + +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.4.6' +macro_revision='2.4.6' + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Backslashify 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' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +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='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +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 +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +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 + + +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 ${am_cv_CC_dependencies_compiler_type+:} false; 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". + rm -rf conftest.dir + 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 10 /bin/sh. + echo '/* dummy */' > 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 + ;; + msvc7 | msvc7msys | 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 for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; 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" + as_fn_executable_p "$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 ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$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 ${ac_cv_path_FGREP+:} false; 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" + as_fn_executable_p "$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 no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; 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 yes = "$with_gnu_ld"; 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 ${lt_cv_path_LD+:} false; 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 &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 ${lt_cv_prog_gnu_ld+:} false; 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 &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 ${lt_cv_path_NM+:} false; 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 + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + 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 no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; 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 as_fn_executable_p "$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 "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; 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 as_fn_executable_p "$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 + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + 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 ${lt_cv_nm_interface+:} false; 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:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: 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; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find 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 ${lt_cv_sys_max_cmd_len+:} false; 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; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + 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; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # 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 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + 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" && \ + test undefined != "$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`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 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"} + +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 how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $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 ${lt_cv_ld_reload_flag+:} false; 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 + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; 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 ${ac_cv_prog_OBJDUMP+:} false; 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 as_fn_executable_p "$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 ${ac_cv_prog_ac_ct_OBJDUMP+:} false; 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 as_fn_executable_p "$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 ${lt_cv_deplibs_check_method+:} false; 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 +# that 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 + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + 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 + ;; + +haiku*) + 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])(-bit)?( [LM]SB)? 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 glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | 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* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; 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 + ;; +os2*) + 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_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +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}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $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 +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $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_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="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 + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$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 +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 + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$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_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 + + + test -n "$ac_ct_AR" && break +done + + 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 +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +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 ${ac_cv_prog_STRIP+:} false; 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 as_fn_executable_p "$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 ${ac_cv_prog_ac_ct_STRIP+:} false; 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 as_fn_executable_p "$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 ${ac_cv_prog_RANLIB+:} false; 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 as_fn_executable_p "$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 ${ac_cv_prog_ac_ct_RANLIB+:} false; 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 as_fn_executable_p "$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 + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# 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 ${lt_cv_sys_global_symbol_pipe+:} false; 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 ia64 = "$host_cpu"; 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 + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# 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"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$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"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/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, + # D for any global variable and I for any imported 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};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,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 + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # 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 +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#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. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$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_globsym_save_LIBS=$LIBS + lt_globsym_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_globsym_save_LIBS + CFLAGS=$lt_globsym_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 yes = "$pipe_works"; 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 + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +$as_echo "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +$as_echo_n "checking for a working dd... " >&6; } +if ${ac_cv_path_lt_DD+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_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 dd; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +$as_echo "$ac_cv_path_lt_DD" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +$as_echo_n "checking how to truncate binary pipes... " >&6; } +if ${lt_cv_truncate_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +$as_echo "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || 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 what ABI is being produced by ac_compile, and set mode + # options accordingly. + 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 what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "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 yes = "$lt_cv_prog_gnu_ld"; 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* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "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 + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + 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*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + 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" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + 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 ${lt_cv_cc_needs_belf+:} false; 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 yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + 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*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + 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 + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $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 +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $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_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + 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 + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + 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 ${ac_cv_prog_DSYMUTIL+:} false; 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 as_fn_executable_p "$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 ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; 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 as_fn_executable_p "$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 ${ac_cv_prog_NMEDIT+:} false; 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 as_fn_executable_p "$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 ${ac_cv_prog_ac_ct_NMEDIT+:} false; 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 as_fn_executable_p "$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 ${ac_cv_prog_LIPO+:} false; 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 as_fn_executable_p "$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 ${ac_cv_prog_ac_ct_LIPO+:} false; 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 as_fn_executable_p "$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 ${ac_cv_prog_OTOOL+:} false; 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 as_fn_executable_p "$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 ${ac_cv_prog_ac_ct_OTOOL+:} false; 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 as_fn_executable_p "$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 ${ac_cv_prog_OTOOL64+:} false; 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 as_fn_executable_p "$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 ${ac_cv_prog_ac_ct_OTOOL64+:} false; 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 as_fn_executable_p "$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 ${lt_cv_apple_cc_single_mod+:} false; 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 there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; 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 ${lt_cv_ld_exported_symbols_list+:} false; 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; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&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 yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; 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" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + 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 ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in 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" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + + +# Set options +enable_dlopen=yes + + + + + 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 --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + pic_mode=default +fi + + + + + + + + + # 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 + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test "${with_aix_soname+set}" = set; then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else + if ${lt_cv_with_aix_soname+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +$as_echo "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# 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 ${lt_cv_objdir+:} false; 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 set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# 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 + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# 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 ${lt_cv_path_MAGIC_CMD+:} false; 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 ${lt_cv_path_MAGIC_CMD+:} false; 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 yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $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 ${lt_cv_prog_compiler_rtti_exceptions+:} false; 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" ## exclude from sc_useless_quotes_in_assignment + # 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:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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 yes = "$lt_cv_prog_compiler_rtti_exceptions"; 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= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + 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' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + 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 + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + 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 ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + 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' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + 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 | kopensolaris*-gnu | 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' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # 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* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # 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='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + 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* | sunf77* | sunf90* | sunf95*) + 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 that 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}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# 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 ${lt_cv_prog_compiler_pic_works+:} false; 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" ## exclude from sc_useless_quotes_in_assignment + # 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:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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 yes = "$lt_cv_prog_compiler_pic_works"; 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 ${lt_cv_prog_compiler_static_works+:} false; 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 "$_lt_linker_boilerplate" | $SED '/^$/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 yes = "$lt_cv_prog_compiler_static_works"; 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 ${lt_cv_prog_compiler_c_o+:} false; 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:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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 ${lt_cv_prog_compiler_c_o+:} false; 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:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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 no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; 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 no = "$hard_links"; 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_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 yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; 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 | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [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 ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, 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 install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_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 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' + export_dynamic_flag_spec='$wl--export-all-symbols' + 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/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + 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, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; 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 + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + 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 | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; 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 no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + 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; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # 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; func_echo_all \"$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' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + 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; func_echo_all \"$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 yes = "$supports_anon_versioning"; 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 + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # 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='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; 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 $linker_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 $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $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 $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $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 cannot +*** 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 $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $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 no = "$ld_shlibs"; 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 yes = "$GCC" && 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 ia64 = "$host_cpu"; 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 GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX 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") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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 + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + 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,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; 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. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + 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 + } + }' + lt_cv_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 "$lt_cv_aix_libpath_"; then + lt_cv_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 "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; 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. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + 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 + } + }' + lt_cv_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 "$lt_cv_aix_libpath_"; then + lt_cv_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 "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +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' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + 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. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # 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 $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + 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 `func_echo_all "$deplibs" | $SED '\''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' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + 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 + ;; + + # 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 $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$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 "x$output_objdir/$soname" = "x$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 yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $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 no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$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 yes,no = "$GCC,$with_gnu_ld"; 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 $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $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' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + 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 "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $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 + + ;; + esac + fi + if test no = "$with_gnu_ld"; 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 yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $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. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + 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) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=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_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + link_all_deplibs=no + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -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 + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + 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* | bitrig*) + 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__`"; 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 + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + osf3*) + if test yes = "$GCC"; 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" && func_echo_all "$wl-set_version $wl$verstring"` $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" && func_echo_all "-set_version $verstring"` -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 yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $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" && func_echo_all "-set_version $verstring"` -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 "-set_version $verstring"` -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 yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $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 $pic_flag $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 yes = "$GCC"; 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 sequent = "$host_vendor"; 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 yes = "$GCC"; 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 CANNOT 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 yes = "$GCC"; 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 sni = "$host_vendor"; 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 no = "$ld_shlibs" && 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 yes,yes = "$GCC,$enable_shared"; 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; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $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 + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + 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 yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # 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 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # 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` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + 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" + elif test -n "$lt_multi_os_dir"; then + 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; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +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 # correct to gnu/linux during the next big refactor + 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 # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; 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 + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.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' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # 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' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + 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=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $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 # correct to gnu/linux during the next big refactor + 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,$cc_basename in + yes,*) + # gcc + 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="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + 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 + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + 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 + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # 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' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # 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 # correct to gnu/linux during the next big refactor + 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 + ;; + +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[23].*) 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$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + 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 + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + 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=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + 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 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + 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' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + 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 + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # 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 + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + 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 : + lt_cv_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 + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # 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 + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) 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;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 # correct to gnu/linux during the next big refactor + 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* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + 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 + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + 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' + ;; + +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 # correct to gnu/linux during the next big refactor + 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 yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 # correct to gnu/linux during the next big refactor + 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=sco + 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 yes = "$with_gnu_ld"; 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 # correct to gnu/linux during the next big refactor + 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 # correct to gnu/linux during the next big refactor + 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 no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $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 yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; 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 relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; 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 ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; 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 ${ac_cv_lib_dld_shl_load+:} false; 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" = xyes; 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" = xyes; 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 ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + 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 ${ac_cv_lib_svld_dlopen+:} false; 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" = xyes; 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 ${ac_cv_lib_dld_dld_link+:} false; 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" = xyes; then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && 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 ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; 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 $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#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 + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 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; + else puts (dlerror ()); + } + /* 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 yes = "$lt_cv_dlopen_self"; 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 ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; 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 $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#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 + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 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; + else puts (dlerror ()); + } + /* 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 what 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + 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 yes = "$enable_shared" || 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: + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking what extension is used for runtime loadable modules" >&5 +$as_echo_n "checking what extension is used for runtime loadable modules... " >&6; } +if ${libltdl_cv_shlibext+:} false; then : + $as_echo_n "(cached) " >&6 +else + +module=yes +eval libltdl_cv_shlibext=$shrext_cmds +module=no +eval libltdl_cv_shrext=$shrext_cmds + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libltdl_cv_shlibext" >&5 +$as_echo "$libltdl_cv_shlibext" >&6; } +if test -n "$libltdl_cv_shlibext"; then + +cat >>confdefs.h <<_ACEOF +#define LT_MODULE_EXT "$libltdl_cv_shlibext" +_ACEOF + +fi +if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then + +cat >>confdefs.h <<_ACEOF +#define LT_SHARED_EXT "$libltdl_cv_shrext" +_ACEOF + +fi +if test -n "$shared_archive_member_spec"; then + +cat >>confdefs.h <<_ACEOF +#define LT_SHARED_LIB_MEMBER "($shared_archive_member_spec.o)" +_ACEOF + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking what variable specifies run-time module search path" >&5 +$as_echo_n "checking what variable specifies run-time module search path... " >&6; } +if ${lt_cv_module_path_var+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_module_path_var=$shlibpath_var +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_module_path_var" >&5 +$as_echo "$lt_cv_module_path_var" >&6; } +if test -n "$lt_cv_module_path_var"; then + +cat >>confdefs.h <<_ACEOF +#define LT_MODULE_PATH_VAR "$lt_cv_module_path_var" +_ACEOF + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the default library search path" >&5 +$as_echo_n "checking for the default library search path... " >&6; } +if ${lt_cv_sys_dlsearch_path+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_dlsearch_path=$sys_lib_dlsearch_path_spec +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_dlsearch_path" >&5 +$as_echo "$lt_cv_sys_dlsearch_path" >&6; } +if test -n "$lt_cv_sys_dlsearch_path"; then + sys_dlsearch_path= + for dir in $lt_cv_sys_dlsearch_path; do + if test -z "$sys_dlsearch_path"; then + sys_dlsearch_path=$dir + else + sys_dlsearch_path=$sys_dlsearch_path$PATH_SEPARATOR$dir + fi + done + +cat >>confdefs.h <<_ACEOF +#define LT_DLSEARCH_PATH "$sys_dlsearch_path" +_ACEOF + +fi + + +LT_DLLOADERS= + + +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 + +lt_dlload_save_LIBS=$LIBS + +LIBADD_DLOPEN= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 +$as_echo_n "checking for library containing dlopen... " >&6; } +if ${ac_cv_search_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +for ac_lib in '' dl; 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_dlopen=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_dlopen+:} false; then : + break +fi +done +if ${ac_cv_search_dlopen+:} false; then : + +else + ac_cv_search_dlopen=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5 +$as_echo "$ac_cv_search_dlopen" >&6; } +ac_res=$ac_cv_search_dlopen +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +$as_echo "#define HAVE_LIBDL 1" >>confdefs.h + + if test "$ac_cv_search_dlopen" != "none required"; then + LIBADD_DLOPEN=-ldl + fi + libltdl_cv_lib_dl_dlopen=yes + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la" +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if HAVE_DLFCN_H +# include +#endif + +int +main () +{ +dlopen(0, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +$as_echo "#define HAVE_LIBDL 1" >>confdefs.h + + libltdl_cv_func_dlopen=yes + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; 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" = xyes; then : + +$as_echo "#define HAVE_LIBDL 1" >>confdefs.h + + LIBADD_DLOPEN=-lsvld libltdl_cv_func_dlopen=yes + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la" +fi + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + +if test yes = "$libltdl_cv_func_dlopen" || test yes = "$libltdl_cv_lib_dl_dlopen" +then + lt_save_LIBS=$LIBS + LIBS="$LIBS $LIBADD_DLOPEN" + for ac_func in dlerror +do : + ac_fn_c_check_func "$LINENO" "dlerror" "ac_cv_func_dlerror" +if test "x$ac_cv_func_dlerror" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLERROR 1 +_ACEOF + +fi +done + + LIBS=$lt_save_LIBS +fi + + +LIBADD_SHL_LOAD= +ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + +$as_echo "#define HAVE_SHL_LOAD 1" >>confdefs.h + + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la" +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 ${ac_cv_lib_dld_shl_load+:} false; 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" = xyes; then : + +$as_echo "#define HAVE_SHL_LOAD 1" >>confdefs.h + + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la" + LIBADD_SHL_LOAD=-ldld +fi + +fi + + + +case $host_os in +darwin[1567].*) +# We only want this for pre-Mac OS X 10.4. + ac_fn_c_check_func "$LINENO" "_dyld_func_lookup" "ac_cv_func__dyld_func_lookup" +if test "x$ac_cv_func__dyld_func_lookup" = xyes; then : + +$as_echo "#define HAVE_DYLD 1" >>confdefs.h + + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la" +fi + + ;; +beos*) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la" + ;; +cygwin* | mingw* | pw32*) + ac_fn_c_check_decl "$LINENO" "cygwin_conv_path" "ac_cv_have_decl_cygwin_conv_path" "#include +" +if test "x$ac_cv_have_decl_cygwin_conv_path" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_CYGWIN_CONV_PATH $ac_have_decl +_ACEOF + + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la" + ;; +esac + +{ $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 ${ac_cv_lib_dld_dld_link+:} false; 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" = xyes; then : + +$as_echo "#define HAVE_DLD 1" >>confdefs.h + + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la" +fi + + + + +LT_DLPREOPEN= +if test -n "$LT_DLLOADERS" +then + for lt_loader in $LT_DLLOADERS; do + LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader " + done + +$as_echo "#define HAVE_LIBDLLOADER 1" >>confdefs.h + +fi + + +LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD" + + +LIBS=$lt_dlload_save_LIBS +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 _ prefix in compiled symbols" >&5 +$as_echo_n "checking for _ prefix in compiled symbols... " >&6; } +if ${lt_cv_sys_symbol_underscore+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_symbol_underscore=no + cat > conftest.$ac_ext <<_LT_EOF +void nm_test_func(){} +int main(){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. + ac_nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$ac_nlist"; then + # See whether the symbols have a leading underscore. + if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then + lt_cv_sys_symbol_underscore=yes + else + if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then + : + else + echo "configure: cannot find nm_test_func in $ac_nlist" >&5 + fi + fi + else + echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "configure: failed program was:" >&5 + cat conftest.c >&5 + fi + rm -rf conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_symbol_underscore" >&5 +$as_echo "$lt_cv_sys_symbol_underscore" >&6; } + sys_symbol_underscore=$lt_cv_sys_symbol_underscore + + +if test yes = "$lt_cv_sys_symbol_underscore"; then + if test yes = "$libltdl_cv_func_dlopen" || test yes = "$libltdl_cv_lib_dl_dlopen"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have to add an underscore for dlsym" >&5 +$as_echo_n "checking whether we have to add an underscore for dlsym... " >&6; } +if ${libltdl_cv_need_uscore+:} false; then : + $as_echo_n "(cached) " >&6 +else + libltdl_cv_need_uscore=unknown + dlsym_uscore_save_LIBS=$LIBS + LIBS="$LIBS $LIBADD_DLOPEN" + libname=conftmod # stay within 8.3 filename limits! + cat >$libname.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif +int fnord () { return 42; } +_LT_EOF + + # ltfn_module_cmds module_cmds + # Execute tilde-delimited MODULE_CMDS with environment primed for + # $module_cmds or $archive_cmds type content. + ltfn_module_cmds () + {( # subshell avoids polluting parent global environment + module_cmds_save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$module_cmds_save_ifs + libobjs=$libname.$ac_objext; lib=$libname$libltdl_cv_shlibext + rpath=/not-exists; soname=$libname$libltdl_cv_shlibext; output_objdir=. + major=; versuffix=; verstring=; deplibs= + ECHO=echo; wl=$lt_prog_compiler_wl; allow_undefined_flag= + eval $cmd + done + IFS=$module_cmds_save_ifs + )} + + # Compile a loadable module using libtool macro expansion results. + $CC $pic_flag -c $libname.$ac_ext + ltfn_module_cmds "${module_cmds:-$archive_cmds}" + + # Try to fetch fnord with dlsym(). + libltdl_dlunknown=0; libltdl_dlnouscore=1; libltdl_dluscore=2 + cat >conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" +#if HAVE_DLFCN_H +#include +#endif +#include +#ifndef RTLD_GLOBAL +# ifdef DL_GLOBAL +# define RTLD_GLOBAL DL_GLOBAL +# else +# define RTLD_GLOBAL 0 +# endif +#endif +#ifndef RTLD_NOW +# ifdef DL_NOW +# define RTLD_NOW DL_NOW +# else +# define RTLD_NOW 0 +# endif +#endif +int main () { + void *handle = dlopen ("`pwd`/$libname$libltdl_cv_shlibext", RTLD_GLOBAL|RTLD_NOW); + int status = $libltdl_dlunknown; + if (handle) { + if (dlsym (handle, "fnord")) + status = $libltdl_dlnouscore; + else { + if (dlsym (handle, "_fnord")) + status = $libltdl_dluscore; + else + puts (dlerror ()); + } + dlclose (handle); + } 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 + libltdl_status=$? + case x$libltdl_status in + x$libltdl_dlnouscore) libltdl_cv_need_uscore=no ;; + x$libltdl_dluscore) libltdl_cv_need_uscore=yes ;; + x*) libltdl_cv_need_uscore=unknown ;; + esac + fi + rm -rf conftest* $libname* + LIBS=$dlsym_uscore_save_LIBS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libltdl_cv_need_uscore" >&5 +$as_echo "$libltdl_cv_need_uscore" >&6; } + fi +fi + +if test yes = "$libltdl_cv_need_uscore"; then + +$as_echo "#define NEED_USCORE 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether deplibs are loaded by dlopen" >&5 +$as_echo_n "checking whether deplibs are loaded by dlopen... " >&6; } +if ${lt_cv_sys_dlopen_deplibs+:} false; then : + $as_echo_n "(cached) " >&6 +else + # PORTME does your system automatically load deplibs for dlopen? + # or its logical equivalent (e.g. shl_load for HP-UX < 11) + # For now, we just catch OSes we know something about -- in the + # future, we'll try test this programmatically. + lt_cv_sys_dlopen_deplibs=unknown + case $host_os in + aix3*|aix4.1.*|aix4.2.*) + # Unknown whether this is true for these versions of AIX, but + # we want this 'case' here to explicitly catch those versions. + lt_cv_sys_dlopen_deplibs=unknown + ;; + aix[4-9]*) + lt_cv_sys_dlopen_deplibs=yes + ;; + amigaos*) + case $host_cpu in + powerpc) + lt_cv_sys_dlopen_deplibs=no + ;; + esac + ;; + bitrig*) + lt_cv_sys_dlopen_deplibs=yes + ;; + darwin*) + # Assuming the user has installed a libdl from somewhere, this is true + # If you are looking for one http://www.opendarwin.org/projects/dlcompat + lt_cv_sys_dlopen_deplibs=yes + ;; + freebsd* | dragonfly*) + lt_cv_sys_dlopen_deplibs=yes + ;; + gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu) + # GNU and its variants, using gnu ld.so (Glibc) + lt_cv_sys_dlopen_deplibs=yes + ;; + hpux10*|hpux11*) + lt_cv_sys_dlopen_deplibs=yes + ;; + interix*) + lt_cv_sys_dlopen_deplibs=yes + ;; + irix[12345]*|irix6.[01]*) + # Catch all versions of IRIX before 6.2, and indicate that we don't + # know how it worked for any of those versions. + lt_cv_sys_dlopen_deplibs=unknown + ;; + irix*) + # The case above catches anything before 6.2, and it's known that + # at 6.2 and later dlopen does load deplibs. + lt_cv_sys_dlopen_deplibs=yes + ;; + netbsd* | netbsdelf*-gnu) + lt_cv_sys_dlopen_deplibs=yes + ;; + openbsd*) + lt_cv_sys_dlopen_deplibs=yes + ;; + osf[1234]*) + # dlopen did load deplibs (at least at 4.x), but until the 5.x series, + # it did *not* use an RPATH in a shared library to find objects the + # library depends on, so we explicitly say 'no'. + lt_cv_sys_dlopen_deplibs=no + ;; + osf5.0|osf5.0a|osf5.1) + # dlopen *does* load deplibs and with the right loader patch applied + # it even uses RPATH in a shared library to search for shared objects + # that the library depends on, but there's no easy way to know if that + # patch is installed. Since this is the case, all we can really + # say is unknown -- it depends on the patch being installed. If + # it is, this changes to 'yes'. Without it, it would be 'no'. + lt_cv_sys_dlopen_deplibs=unknown + ;; + osf*) + # the two cases above should catch all versions of osf <= 5.1. Read + # the comments above for what we know about them. + # At > 5.1, deplibs are loaded *and* any RPATH in a shared library + # is used to find them so we can finally say 'yes'. + lt_cv_sys_dlopen_deplibs=yes + ;; + qnx*) + lt_cv_sys_dlopen_deplibs=yes + ;; + solaris*) + lt_cv_sys_dlopen_deplibs=yes + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + libltdl_cv_sys_dlopen_deplibs=yes + ;; + esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_dlopen_deplibs" >&5 +$as_echo "$lt_cv_sys_dlopen_deplibs" >&6; } +if test yes != "$lt_cv_sys_dlopen_deplibs"; then + +$as_echo "#define LTDL_DLOPEN_DEPLIBS 1" >>confdefs.h + +fi + + +for ac_header in argz.h +do : + ac_fn_c_check_header_compile "$LINENO" "argz.h" "ac_cv_header_argz_h" "$ac_includes_default +" +if test "x$ac_cv_header_argz_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ARGZ_H 1 +_ACEOF + +fi + +done + + +ac_fn_c_check_type "$LINENO" "error_t" "ac_cv_type_error_t" "#if defined(HAVE_ARGZ_H) +# include +#endif +" +if test "x$ac_cv_type_error_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_ERROR_T 1 +_ACEOF + + +else + +$as_echo "#define error_t int" >>confdefs.h + + +$as_echo "#define __error_t_defined 1" >>confdefs.h + +fi + + +LT_ARGZ_H= +for ac_func in argz_add argz_append argz_count argz_create_sep argz_insert \ + argz_next argz_stringify +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +else + LT_ARGZ_H=lt__argz.h; + + _LT_LIBOBJS="$_LT_LIBOBJS lt__argz.$ac_objext" + +fi +done + + +if test -z "$LT_ARGZ_H"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if argz actually works" >&5 +$as_echo_n "checking if argz actually works... " >&6; } +if ${lt_cv_sys_argz_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host_os in #( + *cygwin*) + lt_cv_sys_argz_works=no + if test no != "$cross_compiling"; then + lt_cv_sys_argz_works="guessing no" + else + lt_sed_extract_leading_digits='s/^\([0-9\.]*\).*/\1/' + save_IFS=$IFS + IFS=-. + set x `uname -r | sed -e "$lt_sed_extract_leading_digits"` + IFS=$save_IFS + lt_os_major=${2-0} + lt_os_minor=${3-0} + lt_os_micro=${4-0} + if test 1 -lt "$lt_os_major" \ + || { test 1 -eq "$lt_os_major" \ + && { test 5 -lt "$lt_os_minor" \ + || { test 5 -eq "$lt_os_minor" \ + && test 24 -lt "$lt_os_micro"; }; }; }; then + lt_cv_sys_argz_works=yes + fi + fi + ;; #( + *) lt_cv_sys_argz_works=yes ;; + esac +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_argz_works" >&5 +$as_echo "$lt_cv_sys_argz_works" >&6; } + if test yes = "$lt_cv_sys_argz_works"; then : + +$as_echo "#define HAVE_WORKING_ARGZ 1" >>confdefs.h + +else + LT_ARGZ_H=lt__argz.h + + + _LT_LIBOBJS="$_LT_LIBOBJS lt__argz.$ac_objext" + +fi +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether libtool supports -dlopen/-dlpreopen" >&5 +$as_echo_n "checking whether libtool supports -dlopen/-dlpreopen... " >&6; } +if ${libltdl_cv_preloaded_symbols+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$lt_cv_sys_global_symbol_pipe"; then + libltdl_cv_preloaded_symbols=yes + else + libltdl_cv_preloaded_symbols=no + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libltdl_cv_preloaded_symbols" >&5 +$as_echo "$libltdl_cv_preloaded_symbols" >&6; } +if test yes = "$libltdl_cv_preloaded_symbols"; then + +$as_echo "#define HAVE_PRELOADED_SYMBOLS 1" >>confdefs.h + +fi + +# Set options + + + + + + + + + + + +# Check whether --with-included_ltdl was given. +if test "${with_included_ltdl+set}" = set; then : + withval=$with_included_ltdl; +fi + + +if test yes != "$with_included_ltdl"; then + # We are not being forced to use the included libltdl sources, so + # decide whether there is a useful installed version we can use. + ac_fn_c_check_header_compile "$LINENO" "ltdl.h" "ac_cv_header_ltdl_h" "$ac_includes_default + +" +if test "x$ac_cv_header_ltdl_h" = xyes; then : + ac_fn_c_check_decl "$LINENO" "lt_dlinterface_register" "ac_cv_have_decl_lt_dlinterface_register" "$ac_includes_default + #include +" +if test "x$ac_cv_have_decl_lt_dlinterface_register" = xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lt_dladvise_preload in -lltdl" >&5 +$as_echo_n "checking for lt_dladvise_preload in -lltdl... " >&6; } +if ${ac_cv_lib_ltdl_lt_dladvise_preload+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lltdl $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 lt_dladvise_preload (); +int +main () +{ +return lt_dladvise_preload (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ltdl_lt_dladvise_preload=yes +else + ac_cv_lib_ltdl_lt_dladvise_preload=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_ltdl_lt_dladvise_preload" >&5 +$as_echo "$ac_cv_lib_ltdl_lt_dladvise_preload" >&6; } +if test "x$ac_cv_lib_ltdl_lt_dladvise_preload" = xyes; then : + with_included_ltdl=no +else + with_included_ltdl=yes +fi + +else + with_included_ltdl=yes +fi + +else + with_included_ltdl=yes +fi + + +fi + + + + +# Check whether --with-ltdl_include was given. +if test "${with_ltdl_include+set}" = set; then : + withval=$with_ltdl_include; +fi + + +if test -n "$with_ltdl_include"; then + if test -f "$with_ltdl_include/ltdl.h"; then : + else + as_fn_error $? "invalid ltdl include directory: '$with_ltdl_include'" "$LINENO" 5 + fi +else + with_ltdl_include=no +fi + + +# Check whether --with-ltdl_lib was given. +if test "${with_ltdl_lib+set}" = set; then : + withval=$with_ltdl_lib; +fi + + +if test -n "$with_ltdl_lib"; then + if test -f "$with_ltdl_lib/libltdl.la"; then : + else + as_fn_error $? "invalid ltdl library directory: '$with_ltdl_lib'" "$LINENO" 5 + fi +else + with_ltdl_lib=no +fi + +case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in + ,yes,no,no,) + case $enable_ltdl_convenience in + no) as_fn_error $? "this package needs a convenience libltdl" "$LINENO" 5 ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; +esac +LIBLTDL='$(top_build_prefix)'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdlc.la" +LTDLDEPS=$LIBLTDL +LTDLINCL='-I$(top_srcdir)'"${lt_ltdl_dir+/$lt_ltdl_dir}" + + + + + +# For backwards non-gettext consistent compatibility... +INCLTDL=$LTDLINCL + + + ;; + ,no,no,no,) + # If the included ltdl is not to be used, then use the + # preinstalled libltdl we found. + +$as_echo "#define HAVE_LTDL 1" >>confdefs.h + + LIBLTDL=-lltdl + LTDLDEPS= + LTDLINCL= + ;; + ,no*,no,*) + as_fn_error $? "'--with-ltdl-include' and '--with-ltdl-lib' options must be used together" "$LINENO" 5 + ;; + *) with_included_ltdl=no + LIBLTDL="-L$with_ltdl_lib -lltdl" + LTDLDEPS= + LTDLINCL=-I$with_ltdl_include + ;; +esac +INCLTDL=$LTDLINCL + +# Report our decision... +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find libltdl headers" >&5 +$as_echo_n "checking where to find libltdl headers... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $LTDLINCL" >&5 +$as_echo "$LTDLINCL" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find libltdl library" >&5 +$as_echo_n "checking where to find libltdl library... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBLTDL" >&5 +$as_echo "$LIBLTDL" >&6; } + + + +# Check whether --enable-ltdl-install was given. +if test "${enable_ltdl_install+set}" = set; then : + enableval=$enable_ltdl_install; +fi + + +case ,$enable_ltdl_install,$enable_ltdl_convenience in + *yes*) ;; + *) enable_ltdl_convenience=yes ;; +esac + + if test no != "${enable_ltdl_install-no}"; then + INSTALL_LTDL_TRUE= + INSTALL_LTDL_FALSE='#' +else + INSTALL_LTDL_TRUE='#' + INSTALL_LTDL_FALSE= +fi + + if test no != "${enable_ltdl_convenience-no}"; then + CONVENIENCE_LTDL_TRUE= + CONVENIENCE_LTDL_FALSE='#' +else + CONVENIENCE_LTDL_TRUE='#' + CONVENIENCE_LTDL_FALSE= +fi + + + + + + +# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS +# the user used. This is so that ltdl.h can pick up the parent projects +# config.h file, The first file in AC_CONFIG_HEADERS must contain the +# definitions required by ltdl.c. +# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility). + + + +for ac_header in unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_func in closedir opendir readdir +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +else + + + _LT_LIBOBJS="$_LT_LIBOBJS lt__dirent.$ac_objext" + +fi +done + +for ac_func in strlcat strlcpy +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +else + + + _LT_LIBOBJS="$_LT_LIBOBJS lt__strl.$ac_objext" + +fi +done + + + +cat >>confdefs.h <<_ACEOF +#define LT_LIBEXT "$libext" +_ACEOF + + +name= +eval "lt_libprefix=\"$libname_spec\"" + +cat >>confdefs.h <<_ACEOF +#define LT_LIBPREFIX "$lt_libprefix" +_ACEOF + + +name=ltdl +eval "LTDLOPEN=\"$libname_spec\"" + + + + + + + + +# Only expand once: + + + + + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + 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 + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; 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" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi +fi + +case "$host" in +*-*-linux* | *-*-uclinux*) ;; +*) as_fn_error $? "Linux systems supported exclusively!" "$LINENO" 5;; +esac + + +# Check whether --with-kmod was given. +if test "${with_kmod+set}" = set; then : + withval=$with_kmod; BUILDKMOD="$withval"; +else + BUILDKMOD="yes"; +fi + + if test "$BUILDKMOD" == "yes"; then + WITH_KMOD_TRUE= + WITH_KMOD_FALSE='#' +else + WITH_KMOD_TRUE='#' + WITH_KMOD_FALSE= +fi + + + +# Check whether --with-kbuild was given. +if test "${with_kbuild+set}" = set; then : + withval=$with_kbuild; KBUILDDIR="$withval"; +fi + + +# Check whether --with-ksource was given. +if test "${with_ksource+set}" = set; then : + withval=$with_ksource; KSOURCEDIR="$withval"; +fi + + if test "$KBUILDDIR" != ""; then + WITH_KBUILDDIR_TRUE= + WITH_KBUILDDIR_FALSE='#' +else + WITH_KBUILDDIR_TRUE='#' + WITH_KBUILDDIR_FALSE= +fi + + + +# Check whether --enable-bashcompl was given. +if test "${enable_bashcompl+set}" = set; then : + enableval=$enable_bashcompl; enable_bashcompl="$enableval" +else + enable_bashcompl="no" +fi + + +# backward compatibility with older pkg-config + + +if test "x$enable_bashcompl" = "xyes"; then + +if test -n "$bashcompdir"; then + pkg_cv_bashcompdir="$bashcompdir" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"bash-completion\""; } >&5 + ($PKG_CONFIG --exists --print-errors "bash-completion") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_bashcompdir=`$PKG_CONFIG --variable="completionsdir" "bash-completion" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +bashcompdir=$pkg_cv_bashcompdir + +if test "x$bashcompdir" = x""; then : + bashcompdir="${sysconfdir}/bash_completion.d" +fi + +fi + +if test "$BUILDKMOD" == "yes" +then +if test "$KBUILDDIR" != "" +then + kbuilddir="$KBUILDDIR" +else + kbuilddir="/lib/modules/`uname -r`/build" +fi + +if test -n "$KSOURCEDIR"; then + ksourcedir="$KSOURCEDIR" +elif test -e "$kbuilddir/include/linux/netfilter/nfnetlink.h"; then + ksourcedir="$kbuilddir" +else + ksourcedir="/lib/modules/$(uname -r)/source" +fi +if test ! -e "$ksourcedir/include/linux/netfilter/nfnetlink.h" +then + as_fn_error $? "Invalid kernel source directory $ksourcedir" "$LINENO" 5 +fi + +if test ! -e "$kbuilddir/.config" +then + as_fn_error $? "The kernel build directory $kbuilddir is not configured" "$LINENO" 5 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$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" + + +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 ${ac_cv_prog_AWK+:} false; 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 as_fn_executable_p "$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 + + +if ! $GREP -q "NFNL_SUBSYS_IPSET" "$ksourcedir/include/linux/netfilter/nfnetlink.h" && \ + ! $GREP -q "NFNL_SUBSYS_IPSET" "$ksourcedir/include/uapi/linux/netfilter/nfnetlink.h"; +then + as_fn_error $? "The kernel source directory $ksourcedir is not patched with netlink.patch to support ipset" "$LINENO" 5 +fi +fi + + +# Check whether --with-maxsets was given. +if test "${with_maxsets+set}" = set; then : + withval=$with_maxsets; MAXSETS="$withval"; +fi + + if test "$MAXSETS" != ""; then + WITH_MAXSETS_TRUE= + WITH_MAXSETS_FALSE='#' +else + WITH_MAXSETS_TRUE='#' + WITH_MAXSETS_FALSE= +fi + + + +# Check whether --enable-verbose was given. +if test "${enable_verbose+set}" = set; then : + enableval=$enable_verbose; case "${enableval}" in + yes) enable_verbose=yes ;; + no) enable_verbose=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-verbose" "$LINENO" 5 ;; + esac +else + enable_verbose=no +fi + + +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; +else + enable_debug=no +fi + +if test "x$enable_debug" = "xyes"; then : + + +$as_echo "#define ENABLE_DEBUG 1" >>confdefs.h + + +fi + if test "x$enable_debug" = xyes; then + ENABLE_DEBUG_TRUE= + ENABLE_DEBUG_FALSE='#' +else + ENABLE_DEBUG_TRUE='#' + ENABLE_DEBUG_FALSE= +fi + + +# Check whether --enable-settype_modules was given. +if test "${enable_settype_modules+set}" = set; then : + enableval=$enable_settype_modules; enable_settype_modules="$enableval" +else + enable_settype_modules="no" +fi + + + +# Check whether --with-settype_modules_list was given. +if test "${with_settype_modules_list+set}" = set; then : + withval=$with_settype_modules_list; SETTYPE_MODLIST_RAW="$withval"; +fi + + +SETTYPE_MODLIST= +if test "x$enable_settype_modules" = "xyes"; then + for mod in $SETTYPE_MODLIST_RAW; do + if echo $mod | grep "all"; then + m="${mod}" + else + if echo $mod | grep "ipset_"; then + m="${mod}.c" + else + m="ipset_${mod}.c" + fi + fi + + SETTYPE_MODLIST="${SETTYPE_MODLIST} $m" + done + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for configuration with dynamic loading modules... $SETTYPE_MODLIST_RAW" >&5 +$as_echo "checking for configuration with dynamic loading modules... $SETTYPE_MODLIST_RAW" >&6; } +fi + + + if test "x$enable_settype_modules" = xyes; then + ENABLE_SETTYPE_MODULES_TRUE= + ENABLE_SETTYPE_MODULES_FALSE='#' +else + ENABLE_SETTYPE_MODULES_TRUE='#' + ENABLE_SETTYPE_MODULES_FALSE= +fi + + + if test "x$enable_static" = xyes; then + ENABLE_STATIC_TRUE= + ENABLE_STATIC_FALSE='#' +else + ENABLE_STATIC_TRUE='#' + ENABLE_STATIC_FALSE= +fi + + if test "x$enable_shared" = xyes; then + ENABLE_SHARED_TRUE= + ENABLE_SHARED_FALSE='#' +else + ENABLE_SHARED_TRUE='#' + ENABLE_SHARED_FALSE= +fi + + +: ${CFLAGS=""} + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$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 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +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 + + +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 ${am_cv_CC_dependencies_compiler_type+:} false; 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". + rm -rf conftest.dir + 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 10 /bin/sh. + echo '/* dummy */' > 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 + ;; + msvc7 | msvc7msys | 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 + + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libmnl" >&5 +$as_echo_n "checking for libmnl... " >&6; } + +if test -n "$libmnl_CFLAGS"; then + pkg_cv_libmnl_CFLAGS="$libmnl_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmnl >= 1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libmnl >= 1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_libmnl_CFLAGS=`$PKG_CONFIG --cflags "libmnl >= 1" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$libmnl_LIBS"; then + pkg_cv_libmnl_LIBS="$libmnl_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmnl >= 1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libmnl >= 1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_libmnl_LIBS=`$PKG_CONFIG --libs "libmnl >= 1" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + libmnl_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libmnl >= 1" 2>&1` + else + libmnl_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libmnl >= 1" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$libmnl_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (libmnl >= 1) were not met: + +$libmnl_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables libmnl_CFLAGS +and libmnl_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables libmnl_CFLAGS +and libmnl_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see . +See \`config.log' for more details" "$LINENO" 5; } +else + libmnl_CFLAGS=$pkg_cv_libmnl_CFLAGS + libmnl_LIBS=$pkg_cv_libmnl_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + + +ac_fn_c_check_decl "$LINENO" "NLA_F_NESTED" "ac_cv_have_decl_NLA_F_NESTED" "#include +#include +" +if test "x$ac_cv_have_decl_NLA_F_NESTED" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_NLA_F_NESTED $ac_have_decl +_ACEOF +if test $ac_have_decl = 1; then : + +else + as_fn_error $? "System kernel header files are older than 2.6.24, use CFLAGS for non-default location" "$LINENO" 5 +fi +ac_fn_c_check_decl "$LINENO" "NLA_F_NET_BYTEORDER" "ac_cv_have_decl_NLA_F_NET_BYTEORDER" "#include +#include +" +if test "x$ac_cv_have_decl_NLA_F_NET_BYTEORDER" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_NLA_F_NET_BYTEORDER $ac_have_decl +_ACEOF +if test $ac_have_decl = 1; then : + +else + as_fn_error $? "System kernel header files are older than 2.6.24, use CFLAGS for non-default location" "$LINENO" 5 +fi +ac_fn_c_check_decl "$LINENO" "NLA_TYPE_MASK" "ac_cv_have_decl_NLA_TYPE_MASK" "#include +#include +" +if test "x$ac_cv_have_decl_NLA_TYPE_MASK" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_NLA_TYPE_MASK $ac_have_decl +_ACEOF +if test $ac_have_decl = 1; then : + +else + as_fn_error $? "System kernel header files are older than 2.6.24, use CFLAGS for non-default location" "$LINENO" 5 +fi + + +ac_fn_c_check_type "$LINENO" "union nf_inet_addr" "ac_cv_type_union_nf_inet_addr" "#include +#include +#include +" +if test "x$ac_cv_type_union_nf_inet_addr" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_UNION_NF_INET_ADDR 1 +_ACEOF + + +fi + + +for ac_func in gethostbyname2 +do : + ac_fn_c_check_func "$LINENO" "gethostbyname2" "ac_cv_func_gethostbyname2" +if test "x$ac_cv_func_gethostbyname2" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETHOSTBYNAME2 1 +_ACEOF + +fi +done + + +if test "$BUILDKMOD" == "yes" +then +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for struct xt_action_param" >&5 +$as_echo_n "checking kernel source for struct xt_action_param... " >&6; } +if test -f $ksourcedir/include/linux/netfilter/x_tables.h && \ + $GREP -q 'struct xt_action_param' $ksourcedir/include/linux/netfilter/x_tables.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_STRUCT_XT_ACTION_PARAM=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_STRUCT_XT_ACTION_PARAM=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for vzalloc" >&5 +$as_echo_n "checking kernel source for vzalloc... " >&6; } +if test -f $ksourcedir/include/linux/vmalloc.h && \ + $GREP -q 'vzalloc' $ksourcedir/include/linux/vmalloc.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_VZALLOC=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_VZALLOC=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for ether_addr_equal" >&5 +$as_echo_n "checking kernel source for ether_addr_equal... " >&6; } +if test -f $ksourcedir/include/linux/etherdevice.h && \ + $GREP -q 'ether_addr_equal' $ksourcedir/include/linux/etherdevice.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_ETHER_ADDR_EQUAL=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_ETHER_ADDR_EQUAL=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for is_zero_ether_addr" >&5 +$as_echo_n "checking kernel source for is_zero_ether_addr... " >&6; } +if test -f $ksourcedir/include/linux/etherdevice.h && \ + $GREP -q 'is_zero_ether_addr' $ksourcedir/include/linux/etherdevice.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_IS_ZERO_ETHER_ADDR=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_IS_ZERO_ETHER_ADDR=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for nla_put_be16" >&5 +$as_echo_n "checking kernel source for nla_put_be16... " >&6; } +if test -f $ksourcedir/include/net/netlink.h && \ + $GREP -q 'nla_put_be16' $ksourcedir/include/net/netlink.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_NLA_PUT_BE16=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_NLA_PUT_BE16=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for nla_put_be64" >&5 +$as_echo_n "checking kernel source for nla_put_be64... " >&6; } +if test -f $ksourcedir/include/net/netlink.h && \ + $GREP -q 'nla_put_be64' $ksourcedir/include/net/netlink.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_NLA_PUT_BE64=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_NLA_PUT_BE64=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for nla_put_64bit" >&5 +$as_echo_n "checking kernel source for nla_put_64bit... " >&6; } +if test -f $ksourcedir/include/net/netlink.h && \ + $GREP -q 'nla_put_64bit' $ksourcedir/include/net/netlink.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_NLA_PUT_64BIT=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_NLA_PUT_64BIT=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for portid in nl_info" >&5 +$as_echo_n "checking kernel source for portid in nl_info... " >&6; } +if test -f $ksourcedir/include/linux/netlink.h && \ + $AWK '/^struct netlink_skb_parms /,/^}/' $ksourcedir/include/linux/netlink.h | $GREP -q 'portid;'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_NL_INFO_PORTID=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_NL_INFO_PORTID=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for netlink_dump_start args" >&5 +$as_echo_n "checking kernel source for netlink_dump_start args... " >&6; } +if test -f $ksourcedir/include/linux/netlink.h && \ + $AWK '/ netlink_dump_start\(/,/\)/' $ksourcedir/include/linux/netlink.h | $GREP -q 'done.*;'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: 5 args" >&5 +$as_echo "5 args" >&6; } + HAVE_NETLINK_DUMP_START_ARGS=5 + +elif test -f $ksourcedir/include/linux/netlink.h && \ + $AWK '/ netlink_dump_start\(/,/\)/' $ksourcedir/include/linux/netlink.h | $GREP -q 'min_dump_alloc.*;'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: 6 args" >&5 +$as_echo "6 args" >&6; } + HAVE_NETLINK_DUMP_START_ARGS=6 + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: 4 args" >&5 +$as_echo "4 args" >&6; } + HAVE_NETLINK_DUMP_START_ARGS=4 + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for ns_capable" >&5 +$as_echo_n "checking kernel source for ns_capable... " >&6; } +if test -f $ksourcedir/include/linux/capability.h && \ + $GREP -q 'ns_capable' $ksourcedir/include/linux/capability.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_NS_CAPABLE=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_NS_CAPABLE=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for nfnl_lock per subsys" >&5 +$as_echo_n "checking kernel source for nfnl_lock per subsys... " >&6; } +if test -f $ksourcedir/include/linux/netfilter/nfnetlink.h && \ + $GREP -q 'nfnl_lock.* subsys_id' $ksourcedir/include/linux/netfilter/nfnetlink.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_NFNL_LOCK_SUBSYS=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_NFNL_LOCK_SUBSYS=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for export.h" >&5 +$as_echo_n "checking kernel source for export.h... " >&6; } +if test -f $ksourcedir/include/linux/export.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_EXPORT_H=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_EXPORT_H=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for ipv6_skip_exthdr args" >&5 +$as_echo_n "checking kernel source for ipv6_skip_exthdr args... " >&6; } +if test -f $ksourcedir/include/net/ipv6.h && \ + $AWK '/ ipv6_skip_exthdr\(/,/\)/' $ksourcedir/include/net/ipv6.h | $GREP -q 'frag_offp'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: 4 args" >&5 +$as_echo "4 args" >&6; } + HAVE_IPV6_SKIP_EXTHDR_ARGS=4 + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: 3 args" >&5 +$as_echo "3 args" >&6; } + HAVE_IPV6_SKIP_EXTHDR_ARGS=3 + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for bool checkentry function prototype" >&5 +$as_echo_n "checking kernel source for bool checkentry function prototype... " >&6; } +if test -f $ksourcedir/include/linux/netfilter/x_tables.h && \ + $GREP -q 'bool .\*checkentry.' $ksourcedir/include/linux/netfilter/x_tables.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_CHECKENTRY_BOOL=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_CHECKENTRY_BOOL=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for old struct xt_target_param" >&5 +$as_echo_n "checking kernel source for old struct xt_target_param... " >&6; } +if test -f $ksourcedir/include/linux/netfilter/x_tables.h && \ + $GREP -q '^struct xt_target_param ' $ksourcedir/include/linux/netfilter/x_tables.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_XT_TARGET_PARAM=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_XT_TARGET_PARAM=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for id in struct pernet_operations" >&5 +$as_echo_n "checking kernel source for id in struct pernet_operations... " >&6; } +if test -f $ksourcedir/include/net/net_namespace.h && \ + $AWK '/^struct pernet_operations /,/^}/' $ksourcedir/include/net/net_namespace.h | $GREP -q 'int \*id;'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_NET_OPS_ID=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_NET_OPS_ID=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for async in struct pernet_operations" >&5 +$as_echo_n "checking kernel source for async in struct pernet_operations... " >&6; } +if test -f $ksourcedir/include/net/net_namespace.h && \ + $AWK '/^struct pernet_operations /,/^}/' $ksourcedir/include/net/net_namespace.h | $GREP -q 'bool async;'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_NET_OPS_ASYNC=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_NET_OPS_ASYNC=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for user_ns in struct net" >&5 +$as_echo_n "checking kernel source for user_ns in struct net... " >&6; } +if test -f $ksourcedir/include/net/net_namespace.h && \ + $AWK '/^struct net \{/,/^}/' $ksourcedir/include/net/net_namespace.h | $GREP -q 'user_ns'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_USER_NS_IN_STRUCT_NET=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_USER_NS_IN_STRUCT_NET=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for rbtree_postorder_for_each_entry_safe" >&5 +$as_echo_n "checking kernel source for rbtree_postorder_for_each_entry_safe... " >&6; } +if test -f $ksourcedir/include/linux/rbtree.h && \ + $GREP -q 'rbtree_postorder_for_each_entry_safe' $ksourcedir/include/linux/rbtree.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for kvcalloc" >&5 +$as_echo_n "checking kernel source for kvcalloc... " >&6; } +if test -f $ksourcedir/include/linux/mm.h && \ + $GREP -q 'kvcalloc' $ksourcedir/include/linux/mm.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_KVCALLOC=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_KVCALLOC=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for kvfree" >&5 +$as_echo_n "checking kernel source for kvfree... " >&6; } +if test -f $ksourcedir/include/linux/mm.h && \ + $GREP -q 'kvfree' $ksourcedir/include/linux/mm.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_KVFREE=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_KVFREE=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for struct net in struct xt_mtchk_param" >&5 +$as_echo_n "checking kernel source for struct net in struct xt_mtchk_param... " >&6; } +if test -f $ksourcedir/include/linux/netfilter/x_tables.h && \ + $AWK '/^struct xt_mtchk_param /,/^}/' $ksourcedir/include/linux/netfilter/x_tables.h | \ + $GREP -q 'struct net '; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_XT_MTCHK_PARAM_STRUCT_NET=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_XT_MTCHK_PARAM_STRUCT_NET=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for struct net in the change function of tcf_ematch_ops" >&5 +$as_echo_n "checking kernel source for struct net in the change function of tcf_ematch_ops... " >&6; } +if test -f $ksourcedir/include/net/pkt_cls.h && \ + $AWK '/^struct tcf_ematch_ops /,/^}/' $ksourcedir/include/net/pkt_cls.h | \ + $GREP -q '\*change..struct net \*net'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for struct net in struct tcf_ematch" >&5 +$as_echo_n "checking kernel source for struct net in struct tcf_ematch... " >&6; } +if test -f $ksourcedir/include/net/pkt_cls.h && \ + $AWK '/^struct tcf_ematch /,/^}/' $ksourcedir/include/net/pkt_cls.h | \ + $GREP -q 'struct net'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_TCF_EMATCH_STRUCT_NET=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_TCF_EMATCH_STRUCT_NET=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for list_last_entry" >&5 +$as_echo_n "checking kernel source for list_last_entry... " >&6; } +if test -f $ksourcedir/include/linux/list.h && \ + $GREP -q 'list_last_entry' $ksourcedir/include/linux/list.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_LIST_LAST_ENTRY=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_LIST_LAST_ENTRY=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for list_next_entry" >&5 +$as_echo_n "checking kernel source for list_next_entry... " >&6; } +if test -f $ksourcedir/include/linux/list.h && \ + $GREP -q 'list_next_entry' $ksourcedir/include/linux/list.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_LIST_NEXT_ENTRY=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_LIST_NEXT_ENTRY=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for ether_addr_copy" >&5 +$as_echo_n "checking kernel source for ether_addr_copy... " >&6; } +if test -f $ksourcedir/include/linux/etherdevice.h && \ + $GREP -q 'ether_addr_copy' $ksourcedir/include/linux/etherdevice.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_ETHER_ADDR_COPY=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_ETHER_ADDR_COPY=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for nf_bridge_get_physindev" >&5 +$as_echo_n "checking kernel source for nf_bridge_get_physindev... " >&6; } +if test -f $ksourcedir/include/linux/netfilter_bridge.h && \ + $GREP -q 'nf_bridge_get_physindev' $ksourcedir/include/linux/netfilter_bridge.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_NF_BRIDGE_GET_PHYSDEV=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_NF_BRIDGE_GET_PHYSDEV=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for nla_put_in_addr" >&5 +$as_echo_n "checking kernel source for nla_put_in_addr... " >&6; } +if test -f $ksourcedir/include/net/netlink.h && \ + $GREP -q 'nla_put_in_add' $ksourcedir/include/net/netlink.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_NLA_PUT_IN_ADDR=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_NLA_PUT_IN_ADDR=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for struct net in the call() function in struct nfnl_callback" >&5 +$as_echo_n "checking kernel source for struct net in the call() function in struct nfnl_callback... " >&6; } +if test -f $ksourcedir/include/linux/netfilter/nfnetlink.h && \ + $AWK '/^struct nfnl_callback /,/\);$/' $ksourcedir/include/linux/netfilter/nfnetlink.h | \ + $GREP -q 'struct net'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_NET_IN_NFNL_CALLBACK_FN=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_NET_IN_NFNL_CALLBACK_FN=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for EXPORT_SYMBOL_GPL in module.h" >&5 +$as_echo_n "checking kernel source for EXPORT_SYMBOL_GPL in module.h... " >&6; } +if test -f $ksourcedir/include/linux/module.h && \ + $GREP -q 'EXPORT_SYMBOL_GPL' $ksourcedir/include/linux/module.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for tc_skb_protocol in pkt_sched.h" >&5 +$as_echo_n "checking kernel source for tc_skb_protocol in pkt_sched.h... " >&6; } +if test -f $ksourcedir/include/net/pkt_sched.h && \ + $GREP -q 'tc_skb_protocol' $ksourcedir/include/net/pkt_sched.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_TC_SKB_PROTOCOL=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_TC_SKB_PROTOCOL=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for struct net in struct xt_action_param" >&5 +$as_echo_n "checking kernel source for struct net in struct xt_action_param... " >&6; } +if test -f $ksourcedir/include/linux/netfilter/x_tables.h && \ + $AWK '/^struct xt_action_param /,/^}/' $ksourcedir/include/linux/netfilter/x_tables.h | \ + $GREP -q 'struct net '; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_NET_IN_XT_ACTION_PARAM=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_NET_IN_XT_ACTION_PARAM=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for struct nf_hook_state in struct xt_action_param" >&5 +$as_echo_n "checking kernel source for struct nf_hook_state in struct xt_action_param... " >&6; } +if test -f $ksourcedir/include/linux/netfilter/x_tables.h && \ + $AWK '/^struct xt_action_param /,/^}/' $ksourcedir/include/linux/netfilter/x_tables.h | \ + $GREP -q 'struct nf_hook_state '; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_STATE_IN_XT_ACTION_PARAM=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_STATE_IN_XT_ACTION_PARAM=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for xt_family() in x_tables.h" >&5 +$as_echo_n "checking kernel source for xt_family() in x_tables.h... " >&6; } +if test -f $ksourcedir/include/linux/netfilter/x_tables.h && \ + $GREP -q 'xt_family' $ksourcedir/include/linux/netfilter/x_tables.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_XT_FAMILY=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_XT_FAMILY=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for xt_net() in x_tables.h" >&5 +$as_echo_n "checking kernel source for xt_net() in x_tables.h... " >&6; } +if test -f $ksourcedir/include/linux/netfilter/x_tables.h && \ + $GREP -q 'xt_net' $ksourcedir/include/linux/netfilter/x_tables.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_XT_NET=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_XT_NET=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for nfnl_msg_type() in nfnetlink.h" >&5 +$as_echo_n "checking kernel source for nfnl_msg_type() in nfnetlink.h... " >&6; } +if test -f $ksourcedir/include/linux/netfilter/nfnetlink.h && \ + $GREP -q 'nfnl_msg_type' $ksourcedir/include/linux/netfilter/nfnetlink.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_NFNL_MSG_TYPE=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_NFNL_MSG_TYPE=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for netlink extended ACK" >&5 +$as_echo_n "checking kernel source for netlink extended ACK... " >&6; } +if test -f $ksourcedir/include/linux/netlink.h && \ + $AWK '/^extern void netlink_ack\(/,/\)/' $ksourcedir/include/linux/netlink.h | $GREP -q 'const struct netlink_ext_ack'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_NETLINK_EXTENDED_ACK=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_NETLINK_EXTENDED_ACK=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for passing extended ACK struct to parsing functions" >&5 +$as_echo_n "checking kernel source for passing extended ACK struct to parsing functions... " >&6; } +if test -f $ksourcedir/include/net/netlink.h && \ + $AWK '/^static inline int nla_parse_nested\(/,/\)/' $ksourcedir/include/net/netlink.h | $GREP -q 'struct netlink_ext_ack'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_PASSING_EXTENDED_ACK_TO_PARSERS=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_PASSING_EXTENDED_ACK_TO_PARSERS=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for passing extended ACK struct to callback functions" >&5 +$as_echo_n "checking kernel source for passing extended ACK struct to callback functions... " >&6; } +if test -f $ksourcedir/include/linux/netfilter/nfnetlink.h && \ + $AWK '/^struct nfnl_callback /,/^}/' $ksourcedir/include/linux/netfilter/nfnetlink.h | $GREP -q 'struct netlink_ext_ack'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for no typedef sctp_sctphdr_t" >&5 +$as_echo_n "checking kernel source for no typedef sctp_sctphdr_t... " >&6; } +if test -f $ksourcedir/include/linux/sctp.h && \ + $GREP -q '^typedef struct sctphdr' $ksourcedir/include/linux/sctp.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_TYPEDEF_SCTP_SCTPHDR_T=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_TYPEDEF_SCTP_SCTPHDR_T=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for timer_setup in timer.h" >&5 +$as_echo_n "checking kernel source for timer_setup in timer.h... " >&6; } +if test -f $ksourcedir/include/linux/timer.h && \ + $GREP -q ' timer_setup' $ksourcedir/include/linux/timer.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_TIMER_SETUP=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_TIMER_SETUP=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for lockdep_nfnl_is_held() in nfnetlink.h" >&5 +$as_echo_n "checking kernel source for lockdep_nfnl_is_held() in nfnetlink.h... " >&6; } +if test -f $ksourcedir/include/linux/netfilter/nfnetlink.h && \ + $GREP -q ' lockdep_nfnl_is_held' $ksourcedir/include/linux/netfilter/nfnetlink.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_LOCKDEP_NFNL_IS_HELD=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_LOCKDEP_NFNL_IS_HELD=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for strscpy() in string.h" >&5 +$as_echo_n "checking kernel source for strscpy() in string.h... " >&6; } +if test -f $ksourcedir/include/linux/timer.h && \ + $GREP -q ' strscpy' $ksourcedir/include/linux/string.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_STRSCPY=define + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_STRSCPY=undef + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel source for struct net_generic" >&5 +$as_echo_n "checking kernel source for struct net_generic... " >&6; } +if test -f $ksourcedir/include/net/netns/generic.h && \ + $GREP -q 'struct net_generic' $ksourcedir/include/net/netns/generic.h; 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" >&5 +$as_echo "no" >&6; } + as_fn_error $? "Netns support is required in the Linux kernel tree" "$LINENO" 5 +fi +fi + +if test "x$enable_debug" = "xyes" +then +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Waggregate-return" >&5 +$as_echo_n "checking CFLAGS for gcc -Waggregate-return... " >&6; } +if ${ax_cv_cflags_gcc_option__Waggregate_return+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Waggregate_return="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Waggregate-return" "-pedantic % -Waggregate-return %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Waggregate_return=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Waggregate_return" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Waggregate_return" >&6; } +var=$ax_cv_cflags_gcc_option__Waggregate_return +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wbad-function-cast" >&5 +$as_echo_n "checking CFLAGS for gcc -Wbad-function-cast... " >&6; } +if ${ax_cv_cflags_gcc_option__Wbad_function_cast+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wbad_function_cast="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wbad-function-cast" "-pedantic % -Wbad-function-cast %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wbad_function_cast=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wbad_function_cast" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wbad_function_cast" >&6; } +var=$ax_cv_cflags_gcc_option__Wbad_function_cast +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wcast-align" >&5 +$as_echo_n "checking CFLAGS for gcc -Wcast-align... " >&6; } +if ${ax_cv_cflags_gcc_option__Wcast_align+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wcast_align="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wcast-align" "-pedantic % -Wcast-align %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wcast_align=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wcast_align" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wcast_align" >&6; } +var=$ax_cv_cflags_gcc_option__Wcast_align +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wcast-qual" >&5 +$as_echo_n "checking CFLAGS for gcc -Wcast-qual... " >&6; } +if ${ax_cv_cflags_gcc_option__Wcast_qual+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wcast_qual="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wcast-qual" "-pedantic % -Wcast-qual %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wcast_qual=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wcast_qual" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wcast_qual" >&6; } +var=$ax_cv_cflags_gcc_option__Wcast_qual +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Werror" >&5 +$as_echo_n "checking CFLAGS for gcc -Werror... " >&6; } +if ${ax_cv_cflags_gcc_option__Werror+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Werror="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Werror" "-pedantic % -Werror %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Werror=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Werror" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Werror" >&6; } +var=$ax_cv_cflags_gcc_option__Werror +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wextra" >&5 +$as_echo_n "checking CFLAGS for gcc -Wextra... " >&6; } +if ${ax_cv_cflags_gcc_option__Wextra+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wextra="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wextra" "-pedantic % -Wextra %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wextra=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wextra" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wextra" >&6; } +var=$ax_cv_cflags_gcc_option__Wextra +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wfloat-equal" >&5 +$as_echo_n "checking CFLAGS for gcc -Wfloat-equal... " >&6; } +if ${ax_cv_cflags_gcc_option__Wfloat_equal+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wfloat_equal="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wfloat-equal" "-pedantic % -Wfloat-equal %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wfloat_equal=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wfloat_equal" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wfloat_equal" >&6; } +var=$ax_cv_cflags_gcc_option__Wfloat_equal +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wformat=2" >&5 +$as_echo_n "checking CFLAGS for gcc -Wformat=2... " >&6; } +if ${ax_cv_cflags_gcc_option__Wformat_2+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wformat_2="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wformat=2" "-pedantic % -Wformat=2 %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wformat_2=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wformat_2" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wformat_2" >&6; } +var=$ax_cv_cflags_gcc_option__Wformat_2 +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wjump-misses-init" >&5 +$as_echo_n "checking CFLAGS for gcc -Wjump-misses-init... " >&6; } +if ${ax_cv_cflags_gcc_option__Wjump_misses_init+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wjump_misses_init="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wjump-misses-init" "-pedantic % -Wjump-misses-init %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wjump_misses_init=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wjump_misses_init" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wjump_misses_init" >&6; } +var=$ax_cv_cflags_gcc_option__Wjump_misses_init +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Winit-self" >&5 +$as_echo_n "checking CFLAGS for gcc -Winit-self... " >&6; } +if ${ax_cv_cflags_gcc_option__Winit_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Winit_self="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Winit-self" "-pedantic % -Winit-self %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Winit_self=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Winit_self" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Winit_self" >&6; } +var=$ax_cv_cflags_gcc_option__Winit_self +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Winline" >&5 +$as_echo_n "checking CFLAGS for gcc -Winline... " >&6; } +if ${ax_cv_cflags_gcc_option__Winline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Winline="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Winline" "-pedantic % -Winline %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Winline=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Winline" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Winline" >&6; } +var=$ax_cv_cflags_gcc_option__Winline +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wlogical-op" >&5 +$as_echo_n "checking CFLAGS for gcc -Wlogical-op... " >&6; } +if ${ax_cv_cflags_gcc_option__Wlogical_op+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wlogical_op="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wlogical-op" "-pedantic % -Wlogical-op %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wlogical_op=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wlogical_op" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wlogical_op" >&6; } +var=$ax_cv_cflags_gcc_option__Wlogical_op +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wmissing-declarations" >&5 +$as_echo_n "checking CFLAGS for gcc -Wmissing-declarations... " >&6; } +if ${ax_cv_cflags_gcc_option__Wmissing_declarations+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wmissing_declarations="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wmissing-declarations" "-pedantic % -Wmissing-declarations %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wmissing_declarations=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wmissing_declarations" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wmissing_declarations" >&6; } +var=$ax_cv_cflags_gcc_option__Wmissing_declarations +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wmissing-format-attribute" >&5 +$as_echo_n "checking CFLAGS for gcc -Wmissing-format-attribute... " >&6; } +if ${ax_cv_cflags_gcc_option__Wmissing_format_attribute+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wmissing_format_attribute="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wmissing-format-attribute" "-pedantic % -Wmissing-format-attribute %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wmissing_format_attribute=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wmissing_format_attribute" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wmissing_format_attribute" >&6; } +var=$ax_cv_cflags_gcc_option__Wmissing_format_attribute +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wmissing-prototypes" >&5 +$as_echo_n "checking CFLAGS for gcc -Wmissing-prototypes... " >&6; } +if ${ax_cv_cflags_gcc_option__Wmissing_prototypes+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wmissing_prototypes="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wmissing-prototypes" "-pedantic % -Wmissing-prototypes %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wmissing_prototypes=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wmissing_prototypes" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wmissing_prototypes" >&6; } +var=$ax_cv_cflags_gcc_option__Wmissing_prototypes +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wnested-externs" >&5 +$as_echo_n "checking CFLAGS for gcc -Wnested-externs... " >&6; } +if ${ax_cv_cflags_gcc_option__Wnested_externs+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wnested_externs="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wnested-externs" "-pedantic % -Wnested-externs %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wnested_externs=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wnested_externs" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wnested_externs" >&6; } +var=$ax_cv_cflags_gcc_option__Wnested_externs +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wno-missing-field-initializers" >&5 +$as_echo_n "checking CFLAGS for gcc -Wno-missing-field-initializers... " >&6; } +if ${ax_cv_cflags_gcc_option__Wno_missing_field_initializers+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wno_missing_field_initializers="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wno-missing-field-initializers" "-pedantic % -Wno-missing-field-initializers %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wno_missing_field_initializers=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wno_missing_field_initializers" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wno_missing_field_initializers" >&6; } +var=$ax_cv_cflags_gcc_option__Wno_missing_field_initializers +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wold-style-definition" >&5 +$as_echo_n "checking CFLAGS for gcc -Wold-style-definition... " >&6; } +if ${ax_cv_cflags_gcc_option__Wold_style_definition+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wold_style_definition="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wold-style-definition" "-pedantic % -Wold-style-definition %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wold_style_definition=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wold_style_definition" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wold_style_definition" >&6; } +var=$ax_cv_cflags_gcc_option__Wold_style_definition +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Woverlength-strings" >&5 +$as_echo_n "checking CFLAGS for gcc -Woverlength-strings... " >&6; } +if ${ax_cv_cflags_gcc_option__Woverlength_strings+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Woverlength_strings="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Woverlength-strings" "-pedantic % -Woverlength-strings %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Woverlength_strings=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Woverlength_strings" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Woverlength_strings" >&6; } +var=$ax_cv_cflags_gcc_option__Woverlength_strings +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wpacked" >&5 +$as_echo_n "checking CFLAGS for gcc -Wpacked... " >&6; } +if ${ax_cv_cflags_gcc_option__Wpacked+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wpacked="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wpacked" "-pedantic % -Wpacked %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wpacked=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wpacked" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wpacked" >&6; } +var=$ax_cv_cflags_gcc_option__Wpacked +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wredundant-decls" >&5 +$as_echo_n "checking CFLAGS for gcc -Wredundant-decls... " >&6; } +if ${ax_cv_cflags_gcc_option__Wredundant_decls+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wredundant_decls="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wredundant-decls" "-pedantic % -Wredundant-decls %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wredundant_decls=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wredundant_decls" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wredundant_decls" >&6; } +var=$ax_cv_cflags_gcc_option__Wredundant_decls +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wrwrite-strings" >&5 +$as_echo_n "checking CFLAGS for gcc -Wrwrite-strings... " >&6; } +if ${ax_cv_cflags_gcc_option__Wrwrite_strings+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wrwrite_strings="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wrwrite-strings" "-pedantic % -Wrwrite-strings %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wrwrite_strings=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wrwrite_strings" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wrwrite_strings" >&6; } +var=$ax_cv_cflags_gcc_option__Wrwrite_strings +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wshadow" >&5 +$as_echo_n "checking CFLAGS for gcc -Wshadow... " >&6; } +if ${ax_cv_cflags_gcc_option__Wshadow+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wshadow="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wshadow" "-pedantic % -Wshadow %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wshadow=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wshadow" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wshadow" >&6; } +var=$ax_cv_cflags_gcc_option__Wshadow +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wsign-compare" >&5 +$as_echo_n "checking CFLAGS for gcc -Wsign-compare... " >&6; } +if ${ax_cv_cflags_gcc_option__Wsign_compare+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wsign_compare="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wsign-compare" "-pedantic % -Wsign-compare %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wsign_compare=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wsign_compare" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wsign_compare" >&6; } +var=$ax_cv_cflags_gcc_option__Wsign_compare +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wstrict-prototypes" >&5 +$as_echo_n "checking CFLAGS for gcc -Wstrict-prototypes... " >&6; } +if ${ax_cv_cflags_gcc_option__Wstrict_prototypes+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wstrict_prototypes="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wstrict-prototypes" "-pedantic % -Wstrict-prototypes %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wstrict_prototypes=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wstrict_prototypes" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wstrict_prototypes" >&6; } +var=$ax_cv_cflags_gcc_option__Wstrict_prototypes +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wswitch-default" >&5 +$as_echo_n "checking CFLAGS for gcc -Wswitch-default... " >&6; } +if ${ax_cv_cflags_gcc_option__Wswitch_default+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wswitch_default="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wswitch-default" "-pedantic % -Wswitch-default %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wswitch_default=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wswitch_default" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wswitch_default" >&6; } +var=$ax_cv_cflags_gcc_option__Wswitch_default +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wundef" >&5 +$as_echo_n "checking CFLAGS for gcc -Wundef... " >&6; } +if ${ax_cv_cflags_gcc_option__Wundef+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wundef="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wundef" "-pedantic % -Wundef %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wundef=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wundef" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wundef" >&6; } +var=$ax_cv_cflags_gcc_option__Wundef +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wuninitialized" >&5 +$as_echo_n "checking CFLAGS for gcc -Wuninitialized... " >&6; } +if ${ax_cv_cflags_gcc_option__Wuninitialized+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wuninitialized="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wuninitialized" "-pedantic % -Wuninitialized %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wuninitialized=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wuninitialized" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wuninitialized" >&6; } +var=$ax_cv_cflags_gcc_option__Wuninitialized +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wunused" >&5 +$as_echo_n "checking CFLAGS for gcc -Wunused... " >&6; } +if ${ax_cv_cflags_gcc_option__Wunused+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wunused="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wunused" "-pedantic % -Wunused %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wunused=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wunused" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wunused" >&6; } +var=$ax_cv_cflags_gcc_option__Wunused +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wvla" >&5 +$as_echo_n "checking CFLAGS for gcc -Wvla... " >&6; } +if ${ax_cv_cflags_gcc_option__Wvla+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wvla="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wvla" "-pedantic % -Wvla %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wvla=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wvla" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wvla" >&6; } +var=$ax_cv_cflags_gcc_option__Wvla +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for gcc -Wwrite-strings" >&5 +$as_echo_n "checking CFLAGS for gcc -Wwrite-strings... " >&6; } +if ${ax_cv_cflags_gcc_option__Wwrite_strings+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_cflags_gcc_option__Wwrite_strings="no, unknown" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_save_CFLAGS="$CFLAGS" +for ac_arg in "-pedantic -Werror % -Wwrite-strings" "-pedantic % -Wwrite-strings %% no, obsolete" # +do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_cflags_gcc_option__Wwrite_strings=`echo $ac_arg | sed -e 's,.*% *,,'`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + CFLAGS="$ac_save_CFLAGS" + 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: $ax_cv_cflags_gcc_option__Wwrite_strings" >&5 +$as_echo "$ax_cv_cflags_gcc_option__Wwrite_strings" >&6; } +var=$ax_cv_cflags_gcc_option__Wwrite_strings +case ".$var" in + .ok|.ok,*) ;; + .|.no|.no,*) ;; + *) + if echo " $CFLAGS " | grep " $var " 2>&1 >/dev/null + then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$var"; } >&5 + (: CFLAGS does contain $var) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$var\""; } >&5 + (: CFLAGS="$CFLAGS $var") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $var" + fi + ;; +esac + +fi + +ac_config_files="$ac_config_files Makefile include/libipset/Makefile lib/Makefile lib/libipset.pc src/Makefile utils/Makefile kernel/include/linux/netfilter/ipset/ip_set_compat.h" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + 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 "${INSTALL_LTDL_TRUE}" && test -z "${INSTALL_LTDL_FALSE}"; then + as_fn_error $? "conditional \"INSTALL_LTDL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CONVENIENCE_LTDL_TRUE}" && test -z "${CONVENIENCE_LTDL_FALSE}"; then + as_fn_error $? "conditional \"CONVENIENCE_LTDL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +LT_CONFIG_H=config.h + + _ltdl_libobjs= + _ltdl_ltlibobjs= + if test -n "$_LT_LIBOBJS"; then + # Remove the extension. + _lt_sed_drop_objext='s/\.o$//;s/\.obj$//' + for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do + _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext" + _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo" + done + fi + ltdl_LIBOBJS=$_ltdl_libobjs + + ltdl_LTLIBOBJS=$_ltdl_ltlibobjs + + +if test -z "${WITH_KMOD_TRUE}" && test -z "${WITH_KMOD_FALSE}"; then + as_fn_error $? "conditional \"WITH_KMOD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_KBUILDDIR_TRUE}" && test -z "${WITH_KBUILDDIR_FALSE}"; then + as_fn_error $? "conditional \"WITH_KBUILDDIR\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_MAXSETS_TRUE}" && test -z "${WITH_MAXSETS_FALSE}"; then + as_fn_error $? "conditional \"WITH_MAXSETS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_DEBUG_TRUE}" && test -z "${ENABLE_DEBUG_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_DEBUG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_SETTYPE_MODULES_TRUE}" && test -z "${ENABLE_SETTYPE_MODULES_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_SETTYPE_MODULES\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_STATIC_TRUE}" && test -z "${ENABLE_STATIC_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_STATIC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_SHARED_TRUE}" && test -z "${ENABLE_SHARED_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_SHARED\" 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 + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +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 + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# 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 ipset $as_me 7.1, which was +generated by GNU Autoconf 2.69. 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 ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +ipset config.status 7.1 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 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=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# 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' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +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_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + 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 \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that 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' + 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" ;; + "include/libipset/Makefile") CONFIG_FILES="$CONFIG_FILES include/libipset/Makefile" ;; + "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; + "lib/libipset.pc") CONFIG_FILES="$CONFIG_FILES lib/libipset.pc" ;; + "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;; + "kernel/include/linux/netfilter/ipset/ip_set_compat.h") CONFIG_FILES="$CONFIG_FILES kernel/include/linux/netfilter/ipset/ip_set_compat.h" ;; + + *) 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= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :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="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + 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 "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# 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"" || { + # Older Autoconf 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"` + # 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'`; 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 that 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 +# Generated automatically by $as_me ($PACKAGE) $VERSION +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 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 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 this program. If not, see . + + +# The names of the tagged configurations supported by this script. +available_tags='' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# 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 + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# 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 + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# 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 + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# 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 + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# 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 into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# 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 lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# 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 + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# 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 + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# 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 + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# 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 + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# 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 + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# 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 + +# 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 + +# 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 + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_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 + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_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 set != "${COLLECT_NAMES+set}"; 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 '$q' "$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 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PACKAGE userspace tool configuration:" >&5 +$as_echo "$PACKAGE userspace tool configuration:" >&6; } +if test "x$bashcompdir" != "x"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Bash completion directory: ${bashcompdir}" >&5 +$as_echo " Bash completion directory: ${bashcompdir}" >&6; } +fi +if test "x$enable_settype_modules" != "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Dynamic module loading: disabled" >&5 +$as_echo " Dynamic module loading: disabled" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Dynamic module loading: enabled" >&5 +$as_echo " Dynamic module loading: enabled" >&6; } +fi +IPSET_ALL_MODULES="`ls ${srcdir}/lib/ipset_*.c|sed -e 's/^.*lib\///' -e 's/\.c$//'`" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Static modules:" >&5 +$as_echo " Static modules:" >&6; } +if test "x$SETTYPE_MODLIST" = "x"; then + for mod in $IPSET_ALL_MODULES; do + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${mod}" >&5 +$as_echo " ${mod}" >&6; } + done + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Dynamic modules:" >&5 +$as_echo " Dynamic modules:" >&6; } +elif echo $SETTYPE_MODLIST | grep "all" >/dev/null; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Dynamic modules:" >&5 +$as_echo " Dynamic modules:" >&6; } + for mod in $IPSET_ALL_MODULES; do + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${mod}" >&5 +$as_echo " ${mod}" >&6; } + done +else + for mod in $IPSET_ALL_MODULES; do + if echo $SETTYPE_MODLIST | grep -w "$mod" >/dev/null; then + : + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${mod}" >&5 +$as_echo " ${mod}" >&6; } + fi + done + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Dynamic modules:" >&5 +$as_echo " Dynamic modules:" >&6; } + for mod in $IPSET_ALL_MODULES; do + if echo $SETTYPE_MODLIST | grep -w "$mod" >/dev/null; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${mod}" >&5 +$as_echo " ${mod}" >&6; } + fi + done +fi diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..4a8220b --- /dev/null +++ b/configure.ac @@ -0,0 +1,747 @@ +dnl Boilerplate +AC_INIT([ipset], [7.1], [kadlec@blackhole.kfki.hu]) +AC_CONFIG_AUX_DIR([build-aux]) +AC_CANONICAL_HOST +AC_CONFIG_MACRO_DIR([m4]) +AC_CONFIG_HEADER([config.h]) +AM_INIT_AUTOMAKE([foreign subdir-objects tar-pax]) +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +AC_ENABLE_STATIC +LT_INIT([dlopen]) +LT_CONFIG_LTDL_DIR([libltdl]) +LTDL_INIT([nonrecursive]) + +PKG_PROG_PKG_CONFIG + +dnl Shortcut: Linux supported alone +case "$host" in +*-*-linux* | *-*-uclinux*) ;; +*) AC_MSG_ERROR([Linux systems supported exclusively!]);; +esac + +dnl Optionnally disable building the kernel module +AC_ARG_WITH([kmod], + AS_HELP_STRING([--with-kmod=yes/no], + [Build the kernel module (default: yes)]), + [BUILDKMOD="$withval";], + [BUILDKMOD="yes";]) +AM_CONDITIONAL(WITH_KMOD, test "$BUILDKMOD" == "yes") + +dnl Additional arguments +dnl Kernel build directory or source tree +AC_ARG_WITH([kbuild], + AS_HELP_STRING([--with-kbuild=PATH], + [Path to kernel build directory]), + [KBUILDDIR="$withval";]) +AC_ARG_WITH([ksource], + AS_HELP_STRING([--with-ksource=PATH], + [Path to kernel source directory, if not the same as the kernel build directory]), + [KSOURCEDIR="$withval";]) +AM_CONDITIONAL(WITH_KBUILDDIR, test "$KBUILDDIR" != "") +AC_SUBST(KBUILDDIR) + +dnl ipset bash compspec - bash shell programmable completion +AC_ARG_ENABLE([bashcompl], + AS_HELP_STRING([--enable-bashcompl], + [Install bash completion for ipset]), + [enable_bashcompl="$enableval"], [enable_bashcompl="no"]) + +# backward compatibility with older pkg-config +m4_ifndef([PKG_CHECK_VAR], [ +# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# ------------------------------------------- +# Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])# PKG_CHECK_VAR +]) + +if test "x$enable_bashcompl" = "xyes"; then + PKG_CHECK_VAR(bashcompdir, [bash-completion], [completionsdir], , bashcompdir="${sysconfdir}/bash_completion.d") + AC_SUBST(bashcompdir) +fi + +if test "$BUILDKMOD" == "yes" +then +dnl Sigh: check kernel version dependencies +if test "$KBUILDDIR" != "" +then + kbuilddir="$KBUILDDIR" +else + kbuilddir="/lib/modules/`uname -r`/build" +fi + +if test -n "$KSOURCEDIR"; then + ksourcedir="$KSOURCEDIR" +elif test -e "$kbuilddir/include/linux/netfilter/nfnetlink.h"; then + ksourcedir="$kbuilddir" +else + ksourcedir="/lib/modules/$(uname -r)/source" +fi +if test ! -e "$ksourcedir/include/linux/netfilter/nfnetlink.h" +then + AC_MSG_ERROR([Invalid kernel source directory $ksourcedir]) +fi + +if test ! -e "$kbuilddir/.config" +then + AC_MSG_ERROR([The kernel build directory $kbuilddir is not configured]) +fi + +AC_PROG_GREP +AC_PROG_AWK + +if ! $GREP -q "NFNL_SUBSYS_IPSET" "$ksourcedir/include/linux/netfilter/nfnetlink.h" && \ + ! $GREP -q "NFNL_SUBSYS_IPSET" "$ksourcedir/include/uapi/linux/netfilter/nfnetlink.h"; +then + AC_MSG_ERROR([The kernel source directory $ksourcedir is not patched with netlink.patch to support ipset]) +fi +fi + +dnl Maximal number of sets supported by the kernel, default 256 +AC_ARG_WITH([maxsets], + AS_HELP_STRING([--with-maxsets=256], + [Maximal numer of sets supported by the kernel]), + [MAXSETS="$withval";]) +AM_CONDITIONAL(WITH_MAXSETS, test "$MAXSETS" != "") +AC_SUBST(MAXSETS) + +dnl Verbose compiling +AC_ARG_ENABLE([verbose], + AS_HELP_STRING([--enable-verbose], + [Enable verbose mode at compiling/linking.]), + [case "${enableval}" in + yes) enable_verbose=yes ;; + no) enable_verbose=no ;; + *) AC_MSG_ERROR([bad value ${enableval} for --enable-verbose]) ;; + esac], [enable_verbose=no]) + +AC_ARG_ENABLE([debug], + AS_HELP_STRING([--enable-debug], [enable debug messages @<:@default=disabled@:>@]), + [], [enable_debug=no]) +AS_IF([test "x$enable_debug" = "xyes"], [ + AC_DEFINE(ENABLE_DEBUG, [1], [Debug messages.]) +]) +AM_CONDITIONAL([ENABLE_DEBUG], [test "x$enable_debug" = xyes]) + +dnl Enable type modules +AC_ARG_ENABLE([settype_modules], + AS_HELP_STRING([--enable-settype-modules], + [Enable set type modules support]), + [enable_settype_modules="$enableval"], + [enable_settype_modules="no"]) + +AC_ARG_WITH([settype_modules_list], + AS_HELP_STRING([--with-settype-modules-list="mod1 mod2 ..."], + [List of dynamic loading modules, ignored if settype-modules is disabled. It could be "all" to build all available settypes as modules]), + [SETTYPE_MODLIST_RAW="$withval";]) + +SETTYPE_MODLIST= +if test "x$enable_settype_modules" = "xyes"; then + for mod in $SETTYPE_MODLIST_RAW; do + if echo $mod | grep "all"; then + m="${mod}" + else + if echo $mod | grep "ipset_"; then + m="${mod}.c" + else + m="ipset_${mod}.c" + fi + fi + + SETTYPE_MODLIST="${SETTYPE_MODLIST} $m" + done + + AC_MSG_RESULT([checking for configuration with dynamic loading modules... $SETTYPE_MODLIST_RAW]) +fi +AC_SUBST(SETTYPE_MODLIST) + +AM_CONDITIONAL([ENABLE_SETTYPE_MODULES], [test "x$enable_settype_modules" = xyes]) + +AM_CONDITIONAL([ENABLE_STATIC], [test "x$enable_static" = xyes]) +AM_CONDITIONAL([ENABLE_SHARED], [test "x$enable_shared" = xyes]) + +dnl Checks for programs +: ${CFLAGS=""} + +AC_PROG_CC +AM_PROG_CC_C_O +AC_PROG_LIBTOOL +AC_PROG_INSTALL +AC_PROG_LN_S + +dnl Checks for libraries +PKG_CHECK_MODULES([libmnl], [libmnl >= 1]) + +dnl Checks for header files + +dnl Checks for declarations +AC_CHECK_DECLS([NLA_F_NESTED, NLA_F_NET_BYTEORDER, NLA_TYPE_MASK],, + [AC_MSG_ERROR([System kernel header files are older than 2.6.24, use CFLAGS for non-default location])], + [#include +#include ]) + +dnl Checks for typedefs, structures +AC_CHECK_TYPES([union nf_inet_addr],,,[#include +#include +#include ]) + +dnl Checks for functions +AC_CHECK_FUNCS(gethostbyname2) + +if test "$BUILDKMOD" == "yes" +then +dnl Check kernel incompatibilities... Ugly like hell +AC_MSG_CHECKING([kernel source for struct xt_action_param]) +if test -f $ksourcedir/include/linux/netfilter/x_tables.h && \ + $GREP -q 'struct xt_action_param' $ksourcedir/include/linux/netfilter/x_tables.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_STRUCT_XT_ACTION_PARAM, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_STRUCT_XT_ACTION_PARAM, undef) +fi + +AC_MSG_CHECKING([kernel source for vzalloc]) +if test -f $ksourcedir/include/linux/vmalloc.h && \ + $GREP -q 'vzalloc' $ksourcedir/include/linux/vmalloc.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_VZALLOC, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_VZALLOC, undef) +fi + +AC_MSG_CHECKING([kernel source for ether_addr_equal]) +if test -f $ksourcedir/include/linux/etherdevice.h && \ + $GREP -q 'ether_addr_equal' $ksourcedir/include/linux/etherdevice.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_ETHER_ADDR_EQUAL, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_ETHER_ADDR_EQUAL, undef) +fi + +AC_MSG_CHECKING([kernel source for is_zero_ether_addr]) +if test -f $ksourcedir/include/linux/etherdevice.h && \ + $GREP -q 'is_zero_ether_addr' $ksourcedir/include/linux/etherdevice.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_IS_ZERO_ETHER_ADDR, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_IS_ZERO_ETHER_ADDR, undef) +fi + +AC_MSG_CHECKING([kernel source for nla_put_be16]) +if test -f $ksourcedir/include/net/netlink.h && \ + $GREP -q 'nla_put_be16' $ksourcedir/include/net/netlink.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_NLA_PUT_BE16, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_NLA_PUT_BE16, undef) +fi + +AC_MSG_CHECKING([kernel source for nla_put_be64]) +if test -f $ksourcedir/include/net/netlink.h && \ + $GREP -q 'nla_put_be64' $ksourcedir/include/net/netlink.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_NLA_PUT_BE64, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_NLA_PUT_BE64, undef) +fi + +AC_MSG_CHECKING([kernel source for nla_put_64bit]) +if test -f $ksourcedir/include/net/netlink.h && \ + $GREP -q 'nla_put_64bit' $ksourcedir/include/net/netlink.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_NLA_PUT_64BIT, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_NLA_PUT_64BIT, undef) +fi + +AC_MSG_CHECKING([kernel source for portid in nl_info]) +if test -f $ksourcedir/include/linux/netlink.h && \ + $AWK '/^struct netlink_skb_parms /,/^}/' $ksourcedir/include/linux/netlink.h | $GREP -q 'portid;'; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_NL_INFO_PORTID, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_NL_INFO_PORTID, undef) +fi + +AC_MSG_CHECKING([kernel source for netlink_dump_start args]) +if test -f $ksourcedir/include/linux/netlink.h && \ + $AWK '/ netlink_dump_start\(/,/\)/' $ksourcedir/include/linux/netlink.h | $GREP -q 'done.*;'; then + AC_MSG_RESULT(5 args) + AC_SUBST(HAVE_NETLINK_DUMP_START_ARGS, 5) +elif test -f $ksourcedir/include/linux/netlink.h && \ + $AWK '/ netlink_dump_start\(/,/\)/' $ksourcedir/include/linux/netlink.h | $GREP -q 'min_dump_alloc.*;'; then + AC_MSG_RESULT(6 args) + AC_SUBST(HAVE_NETLINK_DUMP_START_ARGS, 6) +else + AC_MSG_RESULT(4 args) + AC_SUBST(HAVE_NETLINK_DUMP_START_ARGS, 4) +fi + +AC_MSG_CHECKING([kernel source for ns_capable]) +if test -f $ksourcedir/include/linux/capability.h && \ + $GREP -q 'ns_capable' $ksourcedir/include/linux/capability.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_NS_CAPABLE, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_NS_CAPABLE, undef) +fi + +AC_MSG_CHECKING([kernel source for nfnl_lock per subsys]) +if test -f $ksourcedir/include/linux/netfilter/nfnetlink.h && \ + $GREP -q 'nfnl_lock.* subsys_id' $ksourcedir/include/linux/netfilter/nfnetlink.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_NFNL_LOCK_SUBSYS, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_NFNL_LOCK_SUBSYS, undef) +fi + +AC_MSG_CHECKING([kernel source for export.h]) +if test -f $ksourcedir/include/linux/export.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_EXPORT_H, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_EXPORT_H, undef) +fi + +AC_MSG_CHECKING([kernel source for ipv6_skip_exthdr args]) +if test -f $ksourcedir/include/net/ipv6.h && \ + $AWK '/ ipv6_skip_exthdr\(/,/\)/' $ksourcedir/include/net/ipv6.h | $GREP -q 'frag_offp'; then + AC_MSG_RESULT(4 args) + AC_SUBST(HAVE_IPV6_SKIP_EXTHDR_ARGS, 4) +else + AC_MSG_RESULT(3 args) + AC_SUBST(HAVE_IPV6_SKIP_EXTHDR_ARGS, 3) +fi + +AC_MSG_CHECKING([kernel source for bool checkentry function prototype]) +if test -f $ksourcedir/include/linux/netfilter/x_tables.h && \ + $GREP -q 'bool .\*checkentry.' $ksourcedir/include/linux/netfilter/x_tables.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_CHECKENTRY_BOOL, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_CHECKENTRY_BOOL, undef) +fi + +AC_MSG_CHECKING([kernel source for old struct xt_target_param]) +if test -f $ksourcedir/include/linux/netfilter/x_tables.h && \ + $GREP -q '^struct xt_target_param ' $ksourcedir/include/linux/netfilter/x_tables.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_XT_TARGET_PARAM, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_XT_TARGET_PARAM, undef) +fi + +AC_MSG_CHECKING([kernel source for id in struct pernet_operations]) +if test -f $ksourcedir/include/net/net_namespace.h && \ + $AWK '/^struct pernet_operations /,/^}/' $ksourcedir/include/net/net_namespace.h | $GREP -q 'int \*id;'; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_NET_OPS_ID, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_NET_OPS_ID, undef) +fi + +AC_MSG_CHECKING([kernel source for async in struct pernet_operations]) +if test -f $ksourcedir/include/net/net_namespace.h && \ + $AWK '/^struct pernet_operations /,/^}/' $ksourcedir/include/net/net_namespace.h | $GREP -q 'bool async;'; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_NET_OPS_ASYNC, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_NET_OPS_ASYNC, undef) +fi + +AC_MSG_CHECKING([kernel source for user_ns in struct net]) +if test -f $ksourcedir/include/net/net_namespace.h && \ + $AWK '/^struct net \{/,/^}/' $ksourcedir/include/net/net_namespace.h | $GREP -q 'user_ns'; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_USER_NS_IN_STRUCT_NET, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_USER_NS_IN_STRUCT_NET, undef) +fi + +AC_MSG_CHECKING([kernel source for rbtree_postorder_for_each_entry_safe]) +if test -f $ksourcedir/include/linux/rbtree.h && \ + $GREP -q 'rbtree_postorder_for_each_entry_safe' $ksourcedir/include/linux/rbtree.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE, undef) +fi + +AC_MSG_CHECKING([kernel source for kvcalloc]) +if test -f $ksourcedir/include/linux/mm.h && \ + $GREP -q 'kvcalloc' $ksourcedir/include/linux/mm.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_KVCALLOC, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_KVCALLOC, undef) +fi + +AC_MSG_CHECKING([kernel source for kvfree]) +if test -f $ksourcedir/include/linux/mm.h && \ + $GREP -q 'kvfree' $ksourcedir/include/linux/mm.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_KVFREE, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_KVFREE, undef) +fi + +AC_MSG_CHECKING([kernel source for struct net in struct xt_mtchk_param]) +if test -f $ksourcedir/include/linux/netfilter/x_tables.h && \ + $AWK '/^struct xt_mtchk_param /,/^}/' $ksourcedir/include/linux/netfilter/x_tables.h | \ + $GREP -q 'struct net '; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_XT_MTCHK_PARAM_STRUCT_NET, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_XT_MTCHK_PARAM_STRUCT_NET, undef) +fi + +AC_MSG_CHECKING([kernel source for struct net in the change function of tcf_ematch_ops]) +if test -f $ksourcedir/include/net/pkt_cls.h && \ + $AWK '/^struct tcf_ematch_ops /,/^}/' $ksourcedir/include/net/pkt_cls.h | \ + $GREP -q '\*change..struct net \*net'; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET, undef) +fi + +AC_MSG_CHECKING([kernel source for struct net in struct tcf_ematch]) +if test -f $ksourcedir/include/net/pkt_cls.h && \ + $AWK '/^struct tcf_ematch /,/^}/' $ksourcedir/include/net/pkt_cls.h | \ + $GREP -q 'struct net'; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_TCF_EMATCH_STRUCT_NET, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_TCF_EMATCH_STRUCT_NET, undef) +fi + +AC_MSG_CHECKING([kernel source for list_last_entry]) +if test -f $ksourcedir/include/linux/list.h && \ + $GREP -q 'list_last_entry' $ksourcedir/include/linux/list.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_LIST_LAST_ENTRY, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_LIST_LAST_ENTRY, undef) +fi + +AC_MSG_CHECKING([kernel source for list_next_entry]) +if test -f $ksourcedir/include/linux/list.h && \ + $GREP -q 'list_next_entry' $ksourcedir/include/linux/list.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_LIST_NEXT_ENTRY, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_LIST_NEXT_ENTRY, undef) +fi + +AC_MSG_CHECKING([kernel source for ether_addr_copy]) +if test -f $ksourcedir/include/linux/etherdevice.h && \ + $GREP -q 'ether_addr_copy' $ksourcedir/include/linux/etherdevice.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_ETHER_ADDR_COPY, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_ETHER_ADDR_COPY, undef) +fi + +AC_MSG_CHECKING([kernel source for nf_bridge_get_physindev]) +if test -f $ksourcedir/include/linux/netfilter_bridge.h && \ + $GREP -q 'nf_bridge_get_physindev' $ksourcedir/include/linux/netfilter_bridge.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_NF_BRIDGE_GET_PHYSDEV, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_NF_BRIDGE_GET_PHYSDEV, undef) +fi + +AC_MSG_CHECKING([kernel source for nla_put_in_addr]) +if test -f $ksourcedir/include/net/netlink.h && \ + $GREP -q 'nla_put_in_add' $ksourcedir/include/net/netlink.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_NLA_PUT_IN_ADDR, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_NLA_PUT_IN_ADDR, undef) +fi + +AC_MSG_CHECKING([kernel source for struct net in the call() function in struct nfnl_callback]) +if test -f $ksourcedir/include/linux/netfilter/nfnetlink.h && \ + $AWK '/^struct nfnl_callback /,/\);$/' $ksourcedir/include/linux/netfilter/nfnetlink.h | \ + $GREP -q 'struct net'; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_NET_IN_NFNL_CALLBACK_FN, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_NET_IN_NFNL_CALLBACK_FN, undef) +fi + +AC_MSG_CHECKING([kernel source for EXPORT_SYMBOL_GPL in module.h]) +if test -f $ksourcedir/include/linux/module.h && \ + $GREP -q 'EXPORT_SYMBOL_GPL' $ksourcedir/include/linux/module.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H, undef) +fi + +AC_MSG_CHECKING([kernel source for tc_skb_protocol in pkt_sched.h]) +if test -f $ksourcedir/include/net/pkt_sched.h && \ + $GREP -q 'tc_skb_protocol' $ksourcedir/include/net/pkt_sched.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_TC_SKB_PROTOCOL, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_TC_SKB_PROTOCOL, undef) +fi + +AC_MSG_CHECKING([kernel source for struct net in struct xt_action_param]) +if test -f $ksourcedir/include/linux/netfilter/x_tables.h && \ + $AWK '/^struct xt_action_param /,/^}/' $ksourcedir/include/linux/netfilter/x_tables.h | \ + $GREP -q 'struct net '; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_NET_IN_XT_ACTION_PARAM, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_NET_IN_XT_ACTION_PARAM, undef) +fi + +AC_MSG_CHECKING([kernel source for struct nf_hook_state in struct xt_action_param]) +if test -f $ksourcedir/include/linux/netfilter/x_tables.h && \ + $AWK '/^struct xt_action_param /,/^}/' $ksourcedir/include/linux/netfilter/x_tables.h | \ + $GREP -q 'struct nf_hook_state '; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_STATE_IN_XT_ACTION_PARAM, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_STATE_IN_XT_ACTION_PARAM, undef) +fi + +AC_MSG_CHECKING([kernel source for xt_family() in x_tables.h]) +if test -f $ksourcedir/include/linux/netfilter/x_tables.h && \ + $GREP -q 'xt_family' $ksourcedir/include/linux/netfilter/x_tables.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_XT_FAMILY, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_XT_FAMILY, undef) +fi + +AC_MSG_CHECKING([kernel source for xt_net() in x_tables.h]) +if test -f $ksourcedir/include/linux/netfilter/x_tables.h && \ + $GREP -q 'xt_net' $ksourcedir/include/linux/netfilter/x_tables.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_XT_NET, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_XT_NET, undef) +fi + +AC_MSG_CHECKING([kernel source for nfnl_msg_type() in nfnetlink.h]) +if test -f $ksourcedir/include/linux/netfilter/nfnetlink.h && \ + $GREP -q 'nfnl_msg_type' $ksourcedir/include/linux/netfilter/nfnetlink.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_NFNL_MSG_TYPE, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_NFNL_MSG_TYPE, undef) +fi + +AC_MSG_CHECKING([kernel source for netlink extended ACK]) +if test -f $ksourcedir/include/linux/netlink.h && \ + $AWK '/^extern void netlink_ack\(/,/\)/' $ksourcedir/include/linux/netlink.h | $GREP -q 'const struct netlink_ext_ack'; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_NETLINK_EXTENDED_ACK, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_NETLINK_EXTENDED_ACK, undef) +fi + +AC_MSG_CHECKING([kernel source for passing extended ACK struct to parsing functions]) +if test -f $ksourcedir/include/net/netlink.h && \ + $AWK '/^static inline int nla_parse_nested\(/,/\)/' $ksourcedir/include/net/netlink.h | $GREP -q 'struct netlink_ext_ack'; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_PASSING_EXTENDED_ACK_TO_PARSERS, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_PASSING_EXTENDED_ACK_TO_PARSERS, undef) +fi + +AC_MSG_CHECKING([kernel source for passing extended ACK struct to callback functions]) +if test -f $ksourcedir/include/linux/netfilter/nfnetlink.h && \ + $AWK '/^struct nfnl_callback /,/^}/' $ksourcedir/include/linux/netfilter/nfnetlink.h | $GREP -q 'struct netlink_ext_ack'; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS, undef) +fi + +AC_MSG_CHECKING([kernel source for no typedef sctp_sctphdr_t]) +if test -f $ksourcedir/include/linux/sctp.h && \ + $GREP -q '^typedef struct sctphdr' $ksourcedir/include/linux/sctp.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_TYPEDEF_SCTP_SCTPHDR_T, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_TYPEDEF_SCTP_SCTPHDR_T, undef) +fi + +AC_MSG_CHECKING([kernel source for timer_setup in timer.h]) +if test -f $ksourcedir/include/linux/timer.h && \ + $GREP -q ' timer_setup' $ksourcedir/include/linux/timer.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_TIMER_SETUP, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_TIMER_SETUP, undef) +fi + +AC_MSG_CHECKING([kernel source for lockdep_nfnl_is_held() in nfnetlink.h]) +if test -f $ksourcedir/include/linux/netfilter/nfnetlink.h && \ + $GREP -q ' lockdep_nfnl_is_held' $ksourcedir/include/linux/netfilter/nfnetlink.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_LOCKDEP_NFNL_IS_HELD, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_LOCKDEP_NFNL_IS_HELD, undef) +fi + +AC_MSG_CHECKING([kernel source for strscpy() in string.h]) +if test -f $ksourcedir/include/linux/timer.h && \ + $GREP -q ' strscpy' $ksourcedir/include/linux/string.h; then + AC_MSG_RESULT(yes) + AC_SUBST(HAVE_STRSCPY, define) +else + AC_MSG_RESULT(no) + AC_SUBST(HAVE_STRSCPY, undef) +fi + +AC_MSG_CHECKING([kernel source for struct net_generic]) +if test -f $ksourcedir/include/net/netns/generic.h && \ + $GREP -q 'struct net_generic' $ksourcedir/include/net/netns/generic.h; then + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) + AC_MSG_ERROR([Netns support is required in the Linux kernel tree]) +fi +fi + +dnl Checks for compiler characteristics. +dnl Check extra warning flags except +dnl -Wconversion -> we need it +dnl -Wunreachable-code -> fails with ntoh* +dnl -Wpointer-arith -> limbnl uses it +dnl -Wsign-conversion -> libmnl +if test "x$enable_debug" = "xyes" +then +AX_CFLAGS_GCC_OPTION(-Waggregate-return) +AX_CFLAGS_GCC_OPTION(-Wbad-function-cast) +AX_CFLAGS_GCC_OPTION(-Wcast-align) +AX_CFLAGS_GCC_OPTION(-Wcast-qual) +AX_CFLAGS_GCC_OPTION(-Werror) +AX_CFLAGS_GCC_OPTION(-Wextra) +AX_CFLAGS_GCC_OPTION(-Wfloat-equal) +AX_CFLAGS_GCC_OPTION(-Wformat=2) +AX_CFLAGS_GCC_OPTION(-Wjump-misses-init) +AX_CFLAGS_GCC_OPTION(-Winit-self) +AX_CFLAGS_GCC_OPTION(-Winline) +AX_CFLAGS_GCC_OPTION(-Wlogical-op) +AX_CFLAGS_GCC_OPTION(-Wmissing-declarations) +AX_CFLAGS_GCC_OPTION(-Wmissing-format-attribute) +AX_CFLAGS_GCC_OPTION(-Wmissing-prototypes) +AX_CFLAGS_GCC_OPTION(-Wnested-externs) +AX_CFLAGS_GCC_OPTION(-Wno-missing-field-initializers) +AX_CFLAGS_GCC_OPTION(-Wold-style-definition) +AX_CFLAGS_GCC_OPTION(-Woverlength-strings) +AX_CFLAGS_GCC_OPTION(-Wpacked) +AX_CFLAGS_GCC_OPTION(-Wredundant-decls) +AX_CFLAGS_GCC_OPTION(-Wrwrite-strings) +AX_CFLAGS_GCC_OPTION(-Wshadow) +AX_CFLAGS_GCC_OPTION(-Wsign-compare) +AX_CFLAGS_GCC_OPTION(-Wstrict-prototypes) +AX_CFLAGS_GCC_OPTION(-Wswitch-default) +AX_CFLAGS_GCC_OPTION(-Wundef) +AX_CFLAGS_GCC_OPTION(-Wuninitialized) +AX_CFLAGS_GCC_OPTION(-Wunused) +AX_CFLAGS_GCC_OPTION(-Wvla) +AX_CFLAGS_GCC_OPTION(-Wwrite-strings) +fi +dnl Checks for library functions. + +dnl Generate output +AC_CONFIG_FILES([Makefile include/libipset/Makefile + lib/Makefile lib/libipset.pc src/Makefile utils/Makefile + kernel/include/linux/netfilter/ipset/ip_set_compat.h]) +AC_OUTPUT + +dnl Summary +AC_MSG_RESULT([]) +AC_MSG_RESULT([$PACKAGE userspace tool configuration:]) +if test "x$bashcompdir" != "x"; then + AC_MSG_RESULT([ Bash completion directory: ${bashcompdir}]) +fi +if test "x$enable_settype_modules" != "xyes"; then + AC_MSG_RESULT([ Dynamic module loading: disabled]) +else + AC_MSG_RESULT([ Dynamic module loading: enabled]) +fi +IPSET_ALL_MODULES="`ls ${srcdir}/lib/ipset_*.c|sed -e 's/^.*lib\///' -e 's/\.c$//'`" +AC_MSG_RESULT([ Static modules:]) +if test "x$SETTYPE_MODLIST" = "x"; then + for mod in $IPSET_ALL_MODULES; do + AC_MSG_RESULT([ ${mod}]) + done + AC_MSG_RESULT([ Dynamic modules:]) +elif echo $SETTYPE_MODLIST | grep "all" >/dev/null; then + AC_MSG_RESULT([ Dynamic modules:]) + for mod in $IPSET_ALL_MODULES; do + AC_MSG_RESULT([ ${mod}]) + done +else + for mod in $IPSET_ALL_MODULES; do + if echo $SETTYPE_MODLIST | grep -w "$mod" >/dev/null; then + : + else + AC_MSG_RESULT([ ${mod}]) + fi + done + AC_MSG_RESULT([ Dynamic modules:]) + for mod in $IPSET_ALL_MODULES; do + if echo $SETTYPE_MODLIST | grep -w "$mod" >/dev/null; then + AC_MSG_RESULT([ ${mod}]) + fi + done +fi diff --git a/include/libipset/Makefile.am b/include/libipset/Makefile.am new file mode 100644 index 0000000..c7f7b2b --- /dev/null +++ b/include/libipset/Makefile.am @@ -0,0 +1,22 @@ +pkgincludedir = ${includedir}/libipset +pkginclude_HEADERS = \ + args.h \ + data.h \ + errcode.h \ + linux_ip_set_bitmap.h \ + linux_ip_set.h \ + linux_ip_set_hash.h \ + linux_ip_set_list.h \ + mnl.h \ + nf_inet_addr.h \ + nfproto.h \ + parse.h \ + pfxlen.h \ + print.h \ + session.h \ + transport.h \ + types.h \ + ipset.h \ + utils.h + +EXTRA_DIST = debug.h icmp.h icmpv6.h diff --git a/include/libipset/Makefile.in b/include/libipset/Makefile.in new file mode 100644 index 0000000..9ed214d --- /dev/null +++ b/include/libipset/Makefile.in @@ -0,0 +1,647 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 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@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@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/libipset +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltargz.m4 \ + $(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +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__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(pkgincludedir)" +HEADERS = $(pkginclude_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +pkgincludedir = ${includedir}/libipset +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +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@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +HAVE_CHECKENTRY_BOOL = @HAVE_CHECKENTRY_BOOL@ +HAVE_ETHER_ADDR_COPY = @HAVE_ETHER_ADDR_COPY@ +HAVE_ETHER_ADDR_EQUAL = @HAVE_ETHER_ADDR_EQUAL@ +HAVE_EXPORT_H = @HAVE_EXPORT_H@ +HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H = @HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H@ +HAVE_IPV6_SKIP_EXTHDR_ARGS = @HAVE_IPV6_SKIP_EXTHDR_ARGS@ +HAVE_IS_ZERO_ETHER_ADDR = @HAVE_IS_ZERO_ETHER_ADDR@ +HAVE_KVCALLOC = @HAVE_KVCALLOC@ +HAVE_KVFREE = @HAVE_KVFREE@ +HAVE_LIST_LAST_ENTRY = @HAVE_LIST_LAST_ENTRY@ +HAVE_LIST_NEXT_ENTRY = @HAVE_LIST_NEXT_ENTRY@ +HAVE_LOCKDEP_NFNL_IS_HELD = @HAVE_LOCKDEP_NFNL_IS_HELD@ +HAVE_NETLINK_DUMP_START_ARGS = @HAVE_NETLINK_DUMP_START_ARGS@ +HAVE_NETLINK_EXTENDED_ACK = @HAVE_NETLINK_EXTENDED_ACK@ +HAVE_NET_IN_NFNL_CALLBACK_FN = @HAVE_NET_IN_NFNL_CALLBACK_FN@ +HAVE_NET_IN_XT_ACTION_PARAM = @HAVE_NET_IN_XT_ACTION_PARAM@ +HAVE_NET_OPS_ASYNC = @HAVE_NET_OPS_ASYNC@ +HAVE_NET_OPS_ID = @HAVE_NET_OPS_ID@ +HAVE_NFNL_LOCK_SUBSYS = @HAVE_NFNL_LOCK_SUBSYS@ +HAVE_NFNL_MSG_TYPE = @HAVE_NFNL_MSG_TYPE@ +HAVE_NF_BRIDGE_GET_PHYSDEV = @HAVE_NF_BRIDGE_GET_PHYSDEV@ +HAVE_NLA_PUT_64BIT = @HAVE_NLA_PUT_64BIT@ +HAVE_NLA_PUT_BE16 = @HAVE_NLA_PUT_BE16@ +HAVE_NLA_PUT_BE64 = @HAVE_NLA_PUT_BE64@ +HAVE_NLA_PUT_IN_ADDR = @HAVE_NLA_PUT_IN_ADDR@ +HAVE_NL_INFO_PORTID = @HAVE_NL_INFO_PORTID@ +HAVE_NS_CAPABLE = @HAVE_NS_CAPABLE@ +HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS = @HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS@ +HAVE_PASSING_EXTENDED_ACK_TO_PARSERS = @HAVE_PASSING_EXTENDED_ACK_TO_PARSERS@ +HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE = @HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE@ +HAVE_STATE_IN_XT_ACTION_PARAM = @HAVE_STATE_IN_XT_ACTION_PARAM@ +HAVE_STRSCPY = @HAVE_STRSCPY@ +HAVE_STRUCT_XT_ACTION_PARAM = @HAVE_STRUCT_XT_ACTION_PARAM@ +HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET = @HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET@ +HAVE_TCF_EMATCH_STRUCT_NET = @HAVE_TCF_EMATCH_STRUCT_NET@ +HAVE_TC_SKB_PROTOCOL = @HAVE_TC_SKB_PROTOCOL@ +HAVE_TIMER_SETUP = @HAVE_TIMER_SETUP@ +HAVE_TYPEDEF_SCTP_SCTPHDR_T = @HAVE_TYPEDEF_SCTP_SCTPHDR_T@ +HAVE_USER_NS_IN_STRUCT_NET = @HAVE_USER_NS_IN_STRUCT_NET@ +HAVE_VZALLOC = @HAVE_VZALLOC@ +HAVE_XT_FAMILY = @HAVE_XT_FAMILY@ +HAVE_XT_MTCHK_PARAM_STRUCT_NET = @HAVE_XT_MTCHK_PARAM_STRUCT_NET@ +HAVE_XT_NET = @HAVE_XT_NET@ +HAVE_XT_TARGET_PARAM = @HAVE_XT_TARGET_PARAM@ +INCLTDL = @INCLTDL@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KBUILDDIR = @KBUILDDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBADD_DL = @LIBADD_DL@ +LIBADD_DLD_LINK = @LIBADD_DLD_LINK@ +LIBADD_DLOPEN = @LIBADD_DLOPEN@ +LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@ +LIBLTDL = @LIBLTDL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTDLDEPS = @LTDLDEPS@ +LTDLINCL = @LTDLINCL@ +LTDLOPEN = @LTDLOPEN@ +LTLIBOBJS = @LTLIBOBJS@ +LT_ARGZ_H = @LT_ARGZ_H@ +LT_CONFIG_H = @LT_CONFIG_H@ +LT_DLLOADERS = @LT_DLLOADERS@ +LT_DLPREOPEN = @LT_DLPREOPEN@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAXSETS = @MAXSETS@ +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@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SETTYPE_MODLIST = @SETTYPE_MODLIST@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +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_AR = @ac_ct_AR@ +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@ +bashcompdir = @bashcompdir@ +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@ +libmnl_CFLAGS = @libmnl_CFLAGS@ +libmnl_LIBS = @libmnl_LIBS@ +localedir = @localedir@ +localstatedir = @localstatedir@ +ltdl_LIBOBJS = @ltdl_LIBOBJS@ +ltdl_LTLIBOBJS = @ltdl_LTLIBOBJS@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sys_symbol_underscore = @sys_symbol_underscore@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +pkginclude_HEADERS = \ + args.h \ + data.h \ + errcode.h \ + linux_ip_set_bitmap.h \ + linux_ip_set.h \ + linux_ip_set_hash.h \ + linux_ip_set_list.h \ + mnl.h \ + nf_inet_addr.h \ + nfproto.h \ + parse.h \ + pfxlen.h \ + print.h \ + session.h \ + transport.h \ + types.h \ + ipset.h \ + utils.h + +EXTRA_DIST = debug.h icmp.h icmpv6.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) --foreign include/libipset/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign include/libipset/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-pkgincludeHEADERS: $(pkginclude_HEADERS) + @$(NORMAL_INSTALL) + @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ + fi; \ + 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_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ + done + +uninstall-pkgincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + 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-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +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)$(pkgincludedir)"; 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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +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-pkgincludeHEADERS + +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-pkgincludeHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool cscopelist-am ctags ctags-am 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-pkgincludeHEADERS 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 tags-am uninstall uninstall-am \ + uninstall-pkgincludeHEADERS + +.PRECIOUS: Makefile + + +# 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/libipset/args.h b/include/libipset/args.h new file mode 100644 index 0000000..3a9929f --- /dev/null +++ b/include/libipset/args.h @@ -0,0 +1,71 @@ +/* Copyright 2017 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef LIBIPSET_ARGS_H +#define LIBIPSET_ARGS_H + +/* Keywords */ +enum ipset_keywords { + IPSET_ARG_NONE = 0, + /* Family and aliases */ + IPSET_ARG_FAMILY, /* family */ + IPSET_ARG_INET, /* -4 */ + IPSET_ARG_INET6, /* -6 */ + /* Hash types */ + IPSET_ARG_HASHSIZE, /* hashsize */ + IPSET_ARG_MAXELEM, /* maxelem */ + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, /* probes */ + IPSET_ARG_RESIZE, /* resize */ + IPSET_ARG_GC, /* gc */ + IPSET_ARG_IGNORED_FROM, /* from */ + IPSET_ARG_IGNORED_TO, /* to */ + IPSET_ARG_IGNORED_NETWORK, /* network */ + /* List type */ + IPSET_ARG_SIZE, /* size */ + /* IP-type elements */ + IPSET_ARG_IPRANGE, /* range */ + IPSET_ARG_NETMASK, /* netmask */ + /* Port-type elements */ + IPSET_ARG_PORTRANGE, /* range */ + /* Setname type elements */ + IPSET_ARG_BEFORE, /* before */ + IPSET_ARG_AFTER, /* after */ + /* Backward compatibility */ + IPSET_ARG_FROM_IP, /* from */ + IPSET_ARG_TO_IP, /* to */ + IPSET_ARG_NETWORK, /* network */ + IPSET_ARG_FROM_PORT, /* from */ + IPSET_ARG_TO_PORT, /* to */ + /* Extra flags, options */ + IPSET_ARG_FORCEADD, /* forceadd */ + IPSET_ARG_MARKMASK, /* markmask */ + IPSET_ARG_NOMATCH, /* nomatch */ + /* Extensions */ + IPSET_ARG_TIMEOUT, /* timeout */ + IPSET_ARG_COUNTERS, /* counters */ + IPSET_ARG_PACKETS, /* packets */ + IPSET_ARG_BYTES, /* bytes */ + IPSET_ARG_COMMENT, /* comment */ + IPSET_ARG_ADT_COMMENT, /* comment */ + IPSET_ARG_SKBINFO, /* skbinfo */ + IPSET_ARG_SKBMARK, /* skbmark */ + IPSET_ARG_SKBPRIO, /* skbprio */ + IPSET_ARG_SKBQUEUE, /* skbqueue */ + IPSET_ARG_MAX, +}; + +#ifdef __cplusplus +extern "C" { +#endif + +extern const struct ipset_arg * ipset_keyword(enum ipset_keywords i); +extern const char * ipset_ignored_optname(unsigned int opt); +#ifdef __cplusplus +} +#endif + +#endif /* LIBIPSET_ARGS_H */ diff --git a/include/libipset/compat.h b/include/libipset/compat.h new file mode 100644 index 0000000..9616a8b --- /dev/null +++ b/include/libipset/compat.h @@ -0,0 +1,70 @@ +/* Copyright 2014 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef LIBIPSET_COMPAT_H +#define LIBIPSET_COMPAT_H + +#ifndef be64toh + +#include +/* Swap bytes in 64 bit value. */ +#if __BYTE_ORDER == __LITTLE_ENDIAN +/* From bits/byteswap.h in eglibc source: */ +#define __bswap_constant_32(x) \ + ((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >> 8) | \ + (((x) & 0x0000ff00u) << 8) | (((x) & 0x000000ffu) << 24)) + +#ifdef __GNUC__ +# define __bswap_32(x) \ + (__extension__ \ + ({ register unsigned int __bsx = (x); __bswap_constant_32 (__bsx); })) +#else +static __inline unsigned int +__bswap_32 (unsigned int __bsx) +{ + return __bswap_constant_32 (__bsx); +} +#endif + +#if defined __GNUC__ && __GNUC__ >= 2 +/* Swap bytes in 64 bit value. */ +# define __bswap_constant_64(x) \ + ((((x) & 0xff00000000000000ull) >> 56) \ + | (((x) & 0x00ff000000000000ull) >> 40) \ + | (((x) & 0x0000ff0000000000ull) >> 24) \ + | (((x) & 0x000000ff00000000ull) >> 8) \ + | (((x) & 0x00000000ff000000ull) << 8) \ + | (((x) & 0x0000000000ff0000ull) << 24) \ + | (((x) & 0x000000000000ff00ull) << 40) \ + | (((x) & 0x00000000000000ffull) << 56)) + +# define __bswap_64(x) \ + (__extension__ \ + ({ union { __extension__ unsigned long long int __ll; \ + unsigned int __l[2]; } __w, __r; \ + if (__builtin_constant_p (x)) \ + __r.__ll = __bswap_constant_64 (x); \ + else \ + { \ + __w.__ll = (x); \ + __r.__l[0] = __bswap_32 (__w.__l[1]); \ + __r.__l[1] = __bswap_32 (__w.__l[0]); \ + } \ + __r.__ll; })) +#else +#error "Unsupported, you need at least gcc 3.x" +#endif + +#define be64toh(x) __bswap_64(x) +#define htobe64(x) __bswap_64(x) +#else +#define be64toh(x) (x) +#define htobe64(x) (x) +#endif + +#endif + +#endif /* LIBIPSET_COMPAT_H */ diff --git a/include/libipset/data.h b/include/libipset/data.h new file mode 100644 index 0000000..744b010 --- /dev/null +++ b/include/libipset/data.h @@ -0,0 +1,176 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef LIBIPSET_DATA_H +#define LIBIPSET_DATA_H + +#include /* bool */ +#include /* union nf_inet_addr */ + +/* Data options */ +enum ipset_opt { + IPSET_OPT_NONE = 0, + /* Common ones */ + IPSET_SETNAME, + IPSET_OPT_TYPENAME, + IPSET_OPT_FAMILY, + /* CADT options */ + IPSET_OPT_IP, + IPSET_OPT_IP_FROM = IPSET_OPT_IP, + IPSET_OPT_IP_TO, + IPSET_OPT_CIDR, + IPSET_OPT_MARK, + IPSET_OPT_PORT, + IPSET_OPT_PORT_FROM = IPSET_OPT_PORT, + IPSET_OPT_PORT_TO, + IPSET_OPT_TIMEOUT, + /* Create-specific options */ + IPSET_OPT_GC, + IPSET_OPT_HASHSIZE, + IPSET_OPT_MAXELEM, + IPSET_OPT_MARKMASK, + IPSET_OPT_NETMASK, + IPSET_OPT_PROBES, + IPSET_OPT_RESIZE, + IPSET_OPT_SIZE, + IPSET_OPT_FORCEADD, + /* Create-specific options, filled out by the kernel */ + IPSET_OPT_ELEMENTS, + IPSET_OPT_REFERENCES, + IPSET_OPT_MEMSIZE, + /* ADT-specific options */ + IPSET_OPT_ETHER, + IPSET_OPT_NAME, + IPSET_OPT_NAMEREF, + IPSET_OPT_IP2, + IPSET_OPT_CIDR2, + IPSET_OPT_IP2_TO, + IPSET_OPT_PROTO, + IPSET_OPT_IFACE, + /* Swap/rename to */ + IPSET_OPT_SETNAME2, + /* Flags */ + IPSET_OPT_EXIST, + IPSET_OPT_BEFORE, + IPSET_OPT_PHYSDEV, + IPSET_OPT_NOMATCH, + IPSET_OPT_COUNTERS, + IPSET_OPT_PACKETS, + IPSET_OPT_BYTES, + IPSET_OPT_CREATE_COMMENT, + IPSET_OPT_ADT_COMMENT, + IPSET_OPT_SKBINFO, + IPSET_OPT_SKBMARK, + IPSET_OPT_SKBPRIO, + IPSET_OPT_SKBQUEUE, + /* Internal options */ + IPSET_OPT_FLAGS = 48, /* IPSET_FLAG_EXIST| */ + IPSET_OPT_CADT_FLAGS, /* IPSET_FLAG_BEFORE| */ + IPSET_OPT_ELEM, + IPSET_OPT_TYPE, + IPSET_OPT_LINENO, + IPSET_OPT_REVISION, + IPSET_OPT_REVISION_MIN, + IPSET_OPT_INDEX, + IPSET_OPT_MAX, +}; + +#define IPSET_FLAG(opt) (1ULL << (opt)) +#define IPSET_FLAGS_ALL (~0ULL) + +#define IPSET_CREATE_FLAGS \ + (IPSET_FLAG(IPSET_OPT_FAMILY) \ + | IPSET_FLAG(IPSET_OPT_TYPENAME)\ + | IPSET_FLAG(IPSET_OPT_TYPE) \ + | IPSET_FLAG(IPSET_OPT_IP) \ + | IPSET_FLAG(IPSET_OPT_IP_TO) \ + | IPSET_FLAG(IPSET_OPT_CIDR) \ + | IPSET_FLAG(IPSET_OPT_PORT) \ + | IPSET_FLAG(IPSET_OPT_PORT_TO) \ + | IPSET_FLAG(IPSET_OPT_TIMEOUT) \ + | IPSET_FLAG(IPSET_OPT_GC) \ + | IPSET_FLAG(IPSET_OPT_HASHSIZE)\ + | IPSET_FLAG(IPSET_OPT_MAXELEM) \ + | IPSET_FLAG(IPSET_OPT_MARKMASK)\ + | IPSET_FLAG(IPSET_OPT_NETMASK) \ + | IPSET_FLAG(IPSET_OPT_PROBES) \ + | IPSET_FLAG(IPSET_OPT_RESIZE) \ + | IPSET_FLAG(IPSET_OPT_SIZE) \ + | IPSET_FLAG(IPSET_OPT_COUNTERS)\ + | IPSET_FLAG(IPSET_OPT_CREATE_COMMENT)\ + | IPSET_FLAG(IPSET_OPT_FORCEADD)\ + | IPSET_FLAG(IPSET_OPT_SKBINFO)) + +#define IPSET_ADT_FLAGS \ + (IPSET_FLAG(IPSET_OPT_IP) \ + | IPSET_FLAG(IPSET_OPT_IP_TO) \ + | IPSET_FLAG(IPSET_OPT_CIDR) \ + | IPSET_FLAG(IPSET_OPT_MARK) \ + | IPSET_FLAG(IPSET_OPT_PORT) \ + | IPSET_FLAG(IPSET_OPT_PORT_TO) \ + | IPSET_FLAG(IPSET_OPT_TIMEOUT) \ + | IPSET_FLAG(IPSET_OPT_ETHER) \ + | IPSET_FLAG(IPSET_OPT_NAME) \ + | IPSET_FLAG(IPSET_OPT_NAMEREF) \ + | IPSET_FLAG(IPSET_OPT_IP2) \ + | IPSET_FLAG(IPSET_OPT_CIDR2) \ + | IPSET_FLAG(IPSET_OPT_PROTO) \ + | IPSET_FLAG(IPSET_OPT_IFACE) \ + | IPSET_FLAG(IPSET_OPT_CADT_FLAGS)\ + | IPSET_FLAG(IPSET_OPT_BEFORE) \ + | IPSET_FLAG(IPSET_OPT_PHYSDEV) \ + | IPSET_FLAG(IPSET_OPT_NOMATCH) \ + | IPSET_FLAG(IPSET_OPT_PACKETS) \ + | IPSET_FLAG(IPSET_OPT_BYTES) \ + | IPSET_FLAG(IPSET_OPT_ADT_COMMENT)\ + | IPSET_FLAG(IPSET_OPT_SKBMARK) \ + | IPSET_FLAG(IPSET_OPT_SKBPRIO) \ + | IPSET_FLAG(IPSET_OPT_SKBQUEUE)) + +struct ipset_data; + +#ifdef __cplusplus +extern "C" { +#endif + +extern void ipset_strlcpy(char *dst, const char *src, size_t len); +extern void ipset_strlcat(char *dst, const char *src, size_t len); +extern bool ipset_data_flags_test(const struct ipset_data *data, + uint64_t flags); +extern void ipset_data_flags_set(struct ipset_data *data, uint64_t flags); +extern void ipset_data_flags_unset(struct ipset_data *data, uint64_t flags); +extern bool ipset_data_ignored(struct ipset_data *data, enum ipset_opt opt); +extern bool ipset_data_test_ignored(struct ipset_data *data, + enum ipset_opt opt); + +extern int ipset_data_set(struct ipset_data *data, enum ipset_opt opt, + const void *value); +extern const void *ipset_data_get(const struct ipset_data *data, + enum ipset_opt opt); + +static inline bool +ipset_data_test(const struct ipset_data *data, enum ipset_opt opt) +{ + return ipset_data_flags_test(data, IPSET_FLAG(opt)); +} + +/* Shortcuts */ +extern const char *ipset_data_setname(const struct ipset_data *data); +extern uint8_t ipset_data_family(const struct ipset_data *data); +extern uint8_t ipset_data_cidr(const struct ipset_data *data); +extern uint64_t ipset_data_flags(const struct ipset_data *data); + +extern void ipset_data_reset(struct ipset_data *data); +extern struct ipset_data *ipset_data_init(void); +extern void ipset_data_fini(struct ipset_data *data); + +extern size_t ipset_data_sizeof(enum ipset_opt opt, uint8_t family); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBIPSET_DATA_H */ diff --git a/include/libipset/debug.h b/include/libipset/debug.h new file mode 100644 index 0000000..b9d5479 --- /dev/null +++ b/include/libipset/debug.h @@ -0,0 +1,33 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef LIBIPSET_DEBUG_H +#define LIBIPSET_DEBUG_H + +#ifdef IPSET_DEBUG +#include +#include +#include +#define D(fmt, args...) \ + fprintf(stderr, "%s: %s: " fmt "\n", __FILE__, __func__ , ## args) +#define IF_D(test, fmt, args...) \ + if (test) \ + D(fmt , ## args) + +static inline void +dump_nla(struct nlattr *nla[], int maxlen) +{ + int i; + for (i = 0; i < maxlen; i++) + D("nla[%u] does%s exist", i, nla[i] ? "" : " NOT"); +} +#else +#define D(fmt, args...) +#define IF_D(test, fmt, args...) +#define dump_nla(nla, maxlen) +#endif + +#endif /* LIBIPSET_DEBUG_H */ diff --git a/include/libipset/errcode.h b/include/libipset/errcode.h new file mode 100644 index 0000000..6b9dfe0 --- /dev/null +++ b/include/libipset/errcode.h @@ -0,0 +1,32 @@ +/* Copyright 2007-2008 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef LIBIPSET_ERRCODE_H +#define LIBIPSET_ERRCODE_H + +#include /* enum ipset_cmd */ + +struct ipset_session; + +/* Kernel error code to message table */ +struct ipset_errcode_table { + int errcode; /* error code returned by the kernel */ + enum ipset_cmd cmd; /* issued command */ + const char *message; /* error message the code translated to */ +}; + +#ifdef __cplusplus +extern "C" { +#endif + +extern int ipset_errcode(struct ipset_session *session, enum ipset_cmd cmd, + int errcode); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBIPSET_ERRCODE_H */ diff --git a/include/libipset/icmp.h b/include/libipset/icmp.h new file mode 100644 index 0000000..914b5e8 --- /dev/null +++ b/include/libipset/icmp.h @@ -0,0 +1,24 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef LIBIPSET_ICMP_H +#define LIBIPSET_ICMP_H + +#include /* uintxx_t */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern const char *id_to_icmp(uint8_t id); +extern const char *icmp_to_name(uint8_t type, uint8_t code); +extern int name_to_icmp(const char *str, uint16_t *typecode); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBIPSET_ICMP_H */ diff --git a/include/libipset/icmpv6.h b/include/libipset/icmpv6.h new file mode 100644 index 0000000..69c1119 --- /dev/null +++ b/include/libipset/icmpv6.h @@ -0,0 +1,24 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef LIBIPSET_ICMPV6_H +#define LIBIPSET_ICMPV6_H + +#include /* uintxx_t */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern const char *id_to_icmpv6(uint8_t id); +extern const char *icmpv6_to_name(uint8_t type, uint8_t code); +extern int name_to_icmpv6(const char *str, uint16_t *typecode); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBIPSET_ICMPV6_H */ diff --git a/include/libipset/ipset.h b/include/libipset/ipset.h new file mode 100644 index 0000000..7eba74e --- /dev/null +++ b/include/libipset/ipset.h @@ -0,0 +1,90 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef LIBIPSET_IPSET_H +#define LIBIPSET_IPSET_H + +#include /* bool */ +#include /* enum ipset_cmd */ +#include /* ipset_session_* */ +#include /* ipset_load_types */ + +#define IPSET_CMD_ALIASES 3 + +/* Commands in userspace */ +struct ipset_commands { + enum ipset_cmd cmd; + int has_arg; + const char *name[IPSET_CMD_ALIASES]; + const char *help; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +extern const struct ipset_commands ipset_commands[]; + +struct ipset_session; +struct ipset_data; +struct ipset; + + +/* Environment options */ +struct ipset_envopts { + int flag; + int has_arg; + const char *name[2]; + const char *help; + int (*parse)(struct ipset *ipset, int flag, const char *str); + int (*print)(char *buf, unsigned int len, + const struct ipset_data *data, int flag, uint8_t env); +}; + +extern const struct ipset_envopts ipset_envopts[]; + +extern bool ipset_match_cmd(const char *arg, const char * const name[]); +extern bool ipset_match_option(const char *arg, const char * const name[]); +extern bool ipset_match_envopt(const char *arg, const char * const name[]); +extern void ipset_port_usage(void); +extern int ipset_parse_filename(struct ipset *ipset, int opt, const char *str); +extern int ipset_parse_output(struct ipset *ipset, + int opt, const char *str); +extern int ipset_envopt_parse(struct ipset *ipset, + int env, const char *str); + +enum ipset_exittype { + IPSET_NO_PROBLEM = 0, + IPSET_OTHER_PROBLEM, + IPSET_PARAMETER_PROBLEM, + IPSET_VERSION_PROBLEM, + IPSET_SESSION_PROBLEM, +}; + +typedef int (*ipset_custom_errorfn)(struct ipset *ipset, void *p, + int status, const char *msg, ...) + __attribute__ ((format (printf, 4, 5))); +typedef int (*ipset_standard_errorfn)(struct ipset *ipset, void *p); + +extern struct ipset_session * ipset_session(struct ipset *ipset); +extern bool ipset_is_interactive(struct ipset *ipset); +extern int ipset_custom_printf(struct ipset *ipset, + ipset_custom_errorfn custom_error, + ipset_standard_errorfn standard_error, + ipset_print_outfn outfn, + void *p); + +extern int ipset_parse_argv(struct ipset *ipset, int argc, char *argv[]); +extern int ipset_parse_line(struct ipset *ipset, char *line); +extern int ipset_parse_stream(struct ipset *ipset, FILE *f); +extern struct ipset * ipset_init(void); +extern int ipset_fini(struct ipset *ipset); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBIPSET_IPSET_H */ diff --git a/include/libipset/linux_ip_set.h b/include/libipset/linux_ip_set.h new file mode 100644 index 0000000..68a2087 --- /dev/null +++ b/include/libipset/linux_ip_set.h @@ -0,0 +1,309 @@ +/* Copyright (C) 2000-2002 Joakim Axelsson + * Patrick Schaaf + * Martin Josefsson + * Copyright (C) 2003-2011 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef _IP_SET_H +#define _IP_SET_H + +#include + +/* The protocol versions */ +#define IPSET_PROTOCOL 7 +#define IPSET_PROTOCOL_MIN 6 + +/* The max length of strings including NUL: set and type identifiers */ +#define IPSET_MAXNAMELEN 32 + +/* The maximum permissible comment length we will accept over netlink */ +#define IPSET_MAX_COMMENT_SIZE 255 + +/* Message types and commands */ +enum ipset_cmd { + IPSET_CMD_NONE, + IPSET_CMD_PROTOCOL, /* 1: Return protocol version */ + IPSET_CMD_CREATE, /* 2: Create a new (empty) set */ + IPSET_CMD_DESTROY, /* 3: Destroy a (empty) set */ + IPSET_CMD_FLUSH, /* 4: Remove all elements from a set */ + IPSET_CMD_RENAME, /* 5: Rename a set */ + IPSET_CMD_SWAP, /* 6: Swap two sets */ + IPSET_CMD_LIST, /* 7: List sets */ + IPSET_CMD_SAVE, /* 8: Save sets */ + IPSET_CMD_ADD, /* 9: Add an element to a set */ + IPSET_CMD_DEL, /* 10: Delete an element from a set */ + IPSET_CMD_TEST, /* 11: Test an element in a set */ + IPSET_CMD_HEADER, /* 12: Get set header data only */ + IPSET_CMD_TYPE, /* 13: Get set type */ + IPSET_CMD_GET_BYNAME, /* 14: Get set index by name */ + IPSET_CMD_GET_BYINDEX, /* 15: Get set name by index */ + IPSET_MSG_MAX, /* Netlink message commands */ + + /* Commands in userspace: */ + IPSET_CMD_RESTORE = IPSET_MSG_MAX, /* 16: Enter restore mode */ + IPSET_CMD_HELP, /* 17: Get help */ + IPSET_CMD_VERSION, /* 18: Get program version */ + IPSET_CMD_QUIT, /* 19: Quit from interactive mode */ + + IPSET_CMD_MAX, + + IPSET_CMD_COMMIT = IPSET_CMD_MAX, /* 20: Commit buffered commands */ +}; + +/* Attributes at command level */ +enum { + IPSET_ATTR_UNSPEC, + IPSET_ATTR_PROTOCOL, /* 1: Protocol version */ + IPSET_ATTR_SETNAME, /* 2: Name of the set */ + IPSET_ATTR_TYPENAME, /* 3: Typename */ + IPSET_ATTR_SETNAME2 = IPSET_ATTR_TYPENAME, /* Setname at rename/swap */ + IPSET_ATTR_REVISION, /* 4: Settype revision */ + IPSET_ATTR_FAMILY, /* 5: Settype family */ + IPSET_ATTR_FLAGS, /* 6: Flags at command level */ + IPSET_ATTR_DATA, /* 7: Nested attributes */ + IPSET_ATTR_ADT, /* 8: Multiple data containers */ + IPSET_ATTR_LINENO, /* 9: Restore lineno */ + IPSET_ATTR_PROTOCOL_MIN, /* 10: Minimal supported version number */ + IPSET_ATTR_REVISION_MIN = IPSET_ATTR_PROTOCOL_MIN, /* type rev min */ + IPSET_ATTR_INDEX, /* 11: Kernel index of set */ + __IPSET_ATTR_CMD_MAX, +}; +#define IPSET_ATTR_CMD_MAX (__IPSET_ATTR_CMD_MAX - 1) + +/* CADT specific attributes */ +enum { + IPSET_ATTR_IP = IPSET_ATTR_UNSPEC + 1, + IPSET_ATTR_IP_FROM = IPSET_ATTR_IP, + IPSET_ATTR_IP_TO, /* 2 */ + IPSET_ATTR_CIDR, /* 3 */ + IPSET_ATTR_PORT, /* 4 */ + IPSET_ATTR_PORT_FROM = IPSET_ATTR_PORT, + IPSET_ATTR_PORT_TO, /* 5 */ + IPSET_ATTR_TIMEOUT, /* 6 */ + IPSET_ATTR_PROTO, /* 7 */ + IPSET_ATTR_CADT_FLAGS, /* 8 */ + IPSET_ATTR_CADT_LINENO = IPSET_ATTR_LINENO, /* 9 */ + IPSET_ATTR_MARK, /* 10 */ + IPSET_ATTR_MARKMASK, /* 11 */ + /* Reserve empty slots */ + IPSET_ATTR_CADT_MAX = 16, + /* Create-only specific attributes */ + IPSET_ATTR_GC, + IPSET_ATTR_HASHSIZE, + IPSET_ATTR_MAXELEM, + IPSET_ATTR_NETMASK, + IPSET_ATTR_PROBES, + IPSET_ATTR_RESIZE, + IPSET_ATTR_SIZE, + /* Kernel-only */ + IPSET_ATTR_ELEMENTS, + IPSET_ATTR_REFERENCES, + IPSET_ATTR_MEMSIZE, + + __IPSET_ATTR_CREATE_MAX, +}; +#define IPSET_ATTR_CREATE_MAX (__IPSET_ATTR_CREATE_MAX - 1) + +/* ADT specific attributes */ +enum { + IPSET_ATTR_ETHER = IPSET_ATTR_CADT_MAX + 1, + IPSET_ATTR_NAME, + IPSET_ATTR_NAMEREF, + IPSET_ATTR_IP2, + IPSET_ATTR_CIDR2, + IPSET_ATTR_IP2_TO, + IPSET_ATTR_IFACE, + IPSET_ATTR_BYTES, + IPSET_ATTR_PACKETS, + IPSET_ATTR_COMMENT, + IPSET_ATTR_SKBMARK, + IPSET_ATTR_SKBPRIO, + IPSET_ATTR_SKBQUEUE, + IPSET_ATTR_PAD, + __IPSET_ATTR_ADT_MAX, +}; +#define IPSET_ATTR_ADT_MAX (__IPSET_ATTR_ADT_MAX - 1) + +/* IP specific attributes */ +enum { + IPSET_ATTR_IPADDR_IPV4 = IPSET_ATTR_UNSPEC + 1, + IPSET_ATTR_IPADDR_IPV6, + __IPSET_ATTR_IPADDR_MAX, +}; +#define IPSET_ATTR_IPADDR_MAX (__IPSET_ATTR_IPADDR_MAX - 1) + +/* Error codes */ +enum ipset_errno { + IPSET_ERR_PRIVATE = 4096, + IPSET_ERR_PROTOCOL, + IPSET_ERR_FIND_TYPE, + IPSET_ERR_MAX_SETS, + IPSET_ERR_BUSY, + IPSET_ERR_EXIST_SETNAME2, + IPSET_ERR_TYPE_MISMATCH, + IPSET_ERR_EXIST, + IPSET_ERR_INVALID_CIDR, + IPSET_ERR_INVALID_NETMASK, + IPSET_ERR_INVALID_FAMILY, + IPSET_ERR_TIMEOUT, + IPSET_ERR_REFERENCED, + IPSET_ERR_IPADDR_IPV4, + IPSET_ERR_IPADDR_IPV6, + IPSET_ERR_COUNTER, + IPSET_ERR_COMMENT, + IPSET_ERR_INVALID_MARKMASK, + IPSET_ERR_SKBINFO, + + /* Type specific error codes */ + IPSET_ERR_TYPE_SPECIFIC = 4352, +}; + +/* Flags at command level or match/target flags, lower half of cmdattrs*/ +enum ipset_cmd_flags { + IPSET_FLAG_BIT_EXIST = 0, + IPSET_FLAG_EXIST = (1 << IPSET_FLAG_BIT_EXIST), + IPSET_FLAG_BIT_LIST_SETNAME = 1, + IPSET_FLAG_LIST_SETNAME = (1 << IPSET_FLAG_BIT_LIST_SETNAME), + IPSET_FLAG_BIT_LIST_HEADER = 2, + IPSET_FLAG_LIST_HEADER = (1 << IPSET_FLAG_BIT_LIST_HEADER), + IPSET_FLAG_BIT_SKIP_COUNTER_UPDATE = 3, + IPSET_FLAG_SKIP_COUNTER_UPDATE = + (1 << IPSET_FLAG_BIT_SKIP_COUNTER_UPDATE), + IPSET_FLAG_BIT_SKIP_SUBCOUNTER_UPDATE = 4, + IPSET_FLAG_SKIP_SUBCOUNTER_UPDATE = + (1 << IPSET_FLAG_BIT_SKIP_SUBCOUNTER_UPDATE), + IPSET_FLAG_BIT_MATCH_COUNTERS = 5, + IPSET_FLAG_MATCH_COUNTERS = (1 << IPSET_FLAG_BIT_MATCH_COUNTERS), + IPSET_FLAG_BIT_RETURN_NOMATCH = 7, + IPSET_FLAG_RETURN_NOMATCH = (1 << IPSET_FLAG_BIT_RETURN_NOMATCH), + IPSET_FLAG_BIT_MAP_SKBMARK = 8, + IPSET_FLAG_MAP_SKBMARK = (1 << IPSET_FLAG_BIT_MAP_SKBMARK), + IPSET_FLAG_BIT_MAP_SKBPRIO = 9, + IPSET_FLAG_MAP_SKBPRIO = (1 << IPSET_FLAG_BIT_MAP_SKBPRIO), + IPSET_FLAG_BIT_MAP_SKBQUEUE = 10, + IPSET_FLAG_MAP_SKBQUEUE = (1 << IPSET_FLAG_BIT_MAP_SKBQUEUE), + IPSET_FLAG_CMD_MAX = 15, +}; + +/* Flags at CADT attribute level, upper half of cmdattrs */ +enum ipset_cadt_flags { + IPSET_FLAG_BIT_BEFORE = 0, + IPSET_FLAG_BEFORE = (1 << IPSET_FLAG_BIT_BEFORE), + IPSET_FLAG_BIT_PHYSDEV = 1, + IPSET_FLAG_PHYSDEV = (1 << IPSET_FLAG_BIT_PHYSDEV), + IPSET_FLAG_BIT_NOMATCH = 2, + IPSET_FLAG_NOMATCH = (1 << IPSET_FLAG_BIT_NOMATCH), + IPSET_FLAG_BIT_WITH_COUNTERS = 3, + IPSET_FLAG_WITH_COUNTERS = (1 << IPSET_FLAG_BIT_WITH_COUNTERS), + IPSET_FLAG_BIT_WITH_COMMENT = 4, + IPSET_FLAG_WITH_COMMENT = (1 << IPSET_FLAG_BIT_WITH_COMMENT), + IPSET_FLAG_BIT_WITH_FORCEADD = 5, + IPSET_FLAG_WITH_FORCEADD = (1 << IPSET_FLAG_BIT_WITH_FORCEADD), + IPSET_FLAG_BIT_WITH_SKBINFO = 6, + IPSET_FLAG_WITH_SKBINFO = (1 << IPSET_FLAG_BIT_WITH_SKBINFO), + IPSET_FLAG_CADT_MAX = 15, +}; + +/* The flag bits which correspond to the non-extension create flags */ +enum ipset_create_flags { + IPSET_CREATE_FLAG_BIT_FORCEADD = 0, + IPSET_CREATE_FLAG_FORCEADD = (1 << IPSET_CREATE_FLAG_BIT_FORCEADD), + IPSET_CREATE_FLAG_BIT_MAX = 7, +}; + +/* Commands with settype-specific attributes */ +enum ipset_adt { + IPSET_ADD, + IPSET_DEL, + IPSET_TEST, + IPSET_ADT_MAX, + IPSET_CREATE = IPSET_ADT_MAX, + IPSET_CADT_MAX, +}; + +/* Sets are identified by an index in kernel space. Tweak with ip_set_id_t + * and IPSET_INVALID_ID if you want to increase the max number of sets. + * Also, IPSET_ATTR_INDEX must be changed. + */ +typedef __u16 ip_set_id_t; + +#define IPSET_INVALID_ID 65535 + +enum ip_set_dim { + IPSET_DIM_ZERO = 0, + IPSET_DIM_ONE, + IPSET_DIM_TWO, + IPSET_DIM_THREE, + /* Max dimension in elements. + * If changed, new revision of iptables match/target is required. + */ + IPSET_DIM_MAX = 6, + /* Backward compatibility: set match revision 2 */ + IPSET_BIT_RETURN_NOMATCH = 7, +}; + +/* Option flags for kernel operations */ +enum ip_set_kopt { + IPSET_INV_MATCH = (1 << IPSET_DIM_ZERO), + IPSET_DIM_ONE_SRC = (1 << IPSET_DIM_ONE), + IPSET_DIM_TWO_SRC = (1 << IPSET_DIM_TWO), + IPSET_DIM_THREE_SRC = (1 << IPSET_DIM_THREE), + IPSET_RETURN_NOMATCH = (1 << IPSET_BIT_RETURN_NOMATCH), +}; + +enum { + IPSET_COUNTER_NONE = 0, + IPSET_COUNTER_EQ, + IPSET_COUNTER_NE, + IPSET_COUNTER_LT, + IPSET_COUNTER_GT, +}; + +/* Backward compatibility for set match v3 */ +struct ip_set_counter_match0 { + __u8 op; + __u64 value; +}; + +struct ip_set_counter_match { + __u64 __attribute__((aligned(8))) value; + __u8 op; +}; + +/* Interface to iptables/ip6tables */ + +#define SO_IP_SET 83 + +union ip_set_name_index { + char name[IPSET_MAXNAMELEN]; + ip_set_id_t index; +}; + +#define IP_SET_OP_GET_BYNAME 0x00000006 /* Get set index by name */ +struct ip_set_req_get_set { + unsigned int op; + unsigned int version; + union ip_set_name_index set; +}; + +#define IP_SET_OP_GET_BYINDEX 0x00000007 /* Get set name by index */ +/* Uses ip_set_req_get_set */ + +#define IP_SET_OP_GET_FNAME 0x00000008 /* Get set index and family */ +struct ip_set_req_get_set_family { + unsigned int op; + unsigned int version; + unsigned int family; + union ip_set_name_index set; +}; + +#define IP_SET_OP_VERSION 0x00000100 /* Ask kernel version */ +struct ip_set_req_version { + unsigned int op; + unsigned int version; +}; + +#endif /* _IP_SET_H */ diff --git a/include/libipset/linux_ip_set_bitmap.h b/include/libipset/linux_ip_set_bitmap.h new file mode 100644 index 0000000..a3652c2 --- /dev/null +++ b/include/libipset/linux_ip_set_bitmap.h @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef __IP_SET_BITMAP_H +#define __IP_SET_BITMAP_H + + + +/* Bitmap type specific error codes */ +enum { + /* The element is out of the range of the set */ + IPSET_ERR_BITMAP_RANGE = IPSET_ERR_TYPE_SPECIFIC, + /* The range exceeds the size limit of the set type */ + IPSET_ERR_BITMAP_RANGE_SIZE, +}; + + +#endif /* __IP_SET_BITMAP_H */ diff --git a/include/libipset/linux_ip_set_hash.h b/include/libipset/linux_ip_set_hash.h new file mode 100644 index 0000000..3753952 --- /dev/null +++ b/include/libipset/linux_ip_set_hash.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef __IP_SET_HASH_H +#define __IP_SET_HASH_H + + + +/* Hash type specific error codes */ +enum { + /* Hash is full */ + IPSET_ERR_HASH_FULL = IPSET_ERR_TYPE_SPECIFIC, + /* Null-valued element */ + IPSET_ERR_HASH_ELEM, + /* Invalid protocol */ + IPSET_ERR_INVALID_PROTO, + /* Protocol missing but must be specified */ + IPSET_ERR_MISSING_PROTO, + /* Range not supported */ + IPSET_ERR_HASH_RANGE_UNSUPPORTED, + /* Invalid range */ + IPSET_ERR_HASH_RANGE, +}; + + +#endif /* __IP_SET_HASH_H */ diff --git a/include/libipset/linux_ip_set_list.h b/include/libipset/linux_ip_set_list.h new file mode 100644 index 0000000..650e308 --- /dev/null +++ b/include/libipset/linux_ip_set_list.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef __IP_SET_LIST_H +#define __IP_SET_LIST_H + + + +/* List type specific error codes */ +enum { + /* Set name to be added/deleted/tested does not exist. */ + IPSET_ERR_NAME = IPSET_ERR_TYPE_SPECIFIC, + /* list:set type is not permitted to add */ + IPSET_ERR_LOOP, + /* Missing reference set */ + IPSET_ERR_BEFORE, + /* Reference set does not exist */ + IPSET_ERR_NAMEREF, + /* Set is full */ + IPSET_ERR_LIST_FULL, + /* Reference set is not added to the set */ + IPSET_ERR_REF_EXIST, +}; + + +#endif /* __IP_SET_LIST_H */ diff --git a/include/libipset/list_sort.h b/include/libipset/list_sort.h new file mode 100644 index 0000000..70bb02d --- /dev/null +++ b/include/libipset/list_sort.h @@ -0,0 +1,103 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_LIST_SORT_H +#define _LINUX_LIST_SORT_H + +/* List manipulations from include/linux/list.h */ +struct list_head { + struct list_head *next, *prev; +}; + +static inline void INIT_LIST_HEAD(struct list_head *list) +{ + list->next = list; + list->prev = list; +} + +static inline int list_empty(const struct list_head *head) +{ + return head->next == head; +} + +#define container_of(ptr, type, member) ({ \ + typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + +#define list_entry(ptr, type, member) \ + container_of(ptr, type, member) + +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->next, type, member) + +static inline void __list_add(struct list_head *new, + struct list_head *prev, + struct list_head *next) +{ + next->prev = new; + new->next = next; + new->prev = prev; + prev->next = new; +} + +static inline void list_add(struct list_head *new, struct list_head *head) +{ + __list_add(new, head, head->next); +} + +static inline void list_add_tail(struct list_head *new, struct list_head *head) +{ + __list_add(new, head->prev, head); +} + +static inline void __list_del(struct list_head *prev, struct list_head *next) +{ + next->prev = prev; + prev->next = next; +} + +static inline void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + // entry->next = (void *) 0; + // entry->prev = (void *) 0; +} + +static inline void __list_splice(const struct list_head *list, + struct list_head *prev, + struct list_head *next) +{ + struct list_head *first = list->next; + struct list_head *last = list->prev; + + first->prev = prev; + prev->next = first; + + last->next = next; + next->prev = last; +} + +static inline void list_splice(const struct list_head *list, + struct list_head *head) +{ + if (!list_empty(list)) + __list_splice(list, head, head->next); +} + +#define list_for_each_entry(pos, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = list_entry(pos->member.next, typeof(*pos), member)) + +#define list_for_each_entry_safe(pos, n, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member), \ + n = list_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, typeof(*n), member)) + +#ifndef unlikely +#define unlikely(x) (!!(x) == 0) +#endif + +extern void list_sort(void *priv, struct list_head *head, + int (*cmp)(void *priv, struct list_head *a, + struct list_head *b)); +#endif diff --git a/include/libipset/mnl.h b/include/libipset/mnl.h new file mode 100644 index 0000000..7aaf44e --- /dev/null +++ b/include/libipset/mnl.h @@ -0,0 +1,36 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef LIBIPSET_MNL_H +#define LIBIPSET_MNL_H + +#include /* uintxx_t */ +#include /* libmnl backend */ + +#include /* struct ipset_transport */ + +#ifndef NFNETLINK_V0 +#define NFNETLINK_V0 0 + +struct nfgenmsg { + uint8_t nfgen_family; + uint8_t version; + uint16_t res_id; +}; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +extern int ipset_get_nlmsg_type(const struct nlmsghdr *nlh); +extern const struct ipset_transport ipset_mnl_transport; + +#ifdef __cplusplus +} +#endif + +#endif /* LIBIPSET_MNL_H */ diff --git a/include/libipset/nf_inet_addr.h b/include/libipset/nf_inet_addr.h new file mode 100644 index 0000000..6c94e15 --- /dev/null +++ b/include/libipset/nf_inet_addr.h @@ -0,0 +1,22 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef LIBIPSET_NF_INET_ADDR_H +#define LIBIPSET_NF_INET_ADDR_H + +#include /* uint32_t */ +#include /* struct in[6]_addr */ + +/* The structure to hold IP addresses, same as in linux/netfilter.h */ +union nf_inet_addr { + uint32_t all[4]; + uint32_t ip; + uint32_t ip6[4]; + struct in_addr in; + struct in6_addr in6; +}; + +#endif /* LIBIPSET_NF_INET_ADDR_H */ diff --git a/include/libipset/nfproto.h b/include/libipset/nfproto.h new file mode 100644 index 0000000..800da11 --- /dev/null +++ b/include/libipset/nfproto.h @@ -0,0 +1,19 @@ +#ifndef LIBIPSET_NFPROTO_H +#define LIBIPSET_NFPROTO_H + +/* + * The constants to select, same as in linux/netfilter.h. + * Like nf_inet_addr.h, this is just here so that we need not to rely on + * the presence of a recent-enough netfilter.h. + */ +enum { + NFPROTO_UNSPEC = 0, + NFPROTO_IPV4 = 2, + NFPROTO_ARP = 3, + NFPROTO_BRIDGE = 7, + NFPROTO_IPV6 = 10, + NFPROTO_DECNET = 12, + NFPROTO_NUMPROTO, +}; + +#endif /* LIBIPSET_NFPROTO_H */ diff --git a/include/libipset/parse.h b/include/libipset/parse.h new file mode 100644 index 0000000..8b68618 --- /dev/null +++ b/include/libipset/parse.h @@ -0,0 +1,125 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef LIBIPSET_PARSE_H +#define LIBIPSET_PARSE_H + +#include /* enum ipset_opt */ + +/* For parsing/printing data */ +#define IPSET_CIDR_SEPARATOR "/" +#define IPSET_RANGE_SEPARATOR "-" +#define IPSET_ELEM_SEPARATOR "," +#define IPSET_NAME_SEPARATOR "," +#define IPSET_PROTO_SEPARATOR ":" +#define IPSET_ESCAPE_START "[" +#define IPSET_ESCAPE_END "]" + +struct ipset_session; +struct ipset_arg; + +typedef int (*ipset_parsefn)(struct ipset_session *s, + enum ipset_opt opt, const char *str); + +#ifdef __cplusplus +extern "C" { +#endif + +extern int ipset_parse_ether(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_port(struct ipset_session *session, + enum ipset_opt opt, const char *str, + const char *proto); +extern int ipset_parse_mark(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_tcpudp_port(struct ipset_session *session, + enum ipset_opt opt, const char *str, + const char *proto); +extern int ipset_parse_tcp_port(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_single_tcp_port(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_proto(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_icmp(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_icmpv6(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_proto_port(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_tcp_udp_port(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_family(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_ip(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_single_ip(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_net(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_range(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_netrange(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_iprange(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_ipnet(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_ip4_single6(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_ip4_net6(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_name(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_before(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_after(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_setname(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_timeout(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_uint64(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_uint32(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_uint16(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_uint8(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_netmask(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_flag(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_typename(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_iface(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_comment(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_skbmark(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_skbprio(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_ignored(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_elem(struct ipset_session *session, + bool optional, const char *str); +extern int ipset_call_parser(struct ipset_session *session, + const struct ipset_arg *arg, + const char *str); + +/* Compatibility parser functions */ +extern int ipset_parse_iptimeout(struct ipset_session *session, + enum ipset_opt opt, const char *str); +extern int ipset_parse_name_compat(struct ipset_session *session, + enum ipset_opt opt, const char *str); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBIPSET_PARSE_H */ diff --git a/include/libipset/pfxlen.h b/include/libipset/pfxlen.h new file mode 100644 index 0000000..c2c7e0c --- /dev/null +++ b/include/libipset/pfxlen.h @@ -0,0 +1,157 @@ +#ifndef _NET_PFXLEN_H +#define _NET_PFXLEN_H 1 + +#include +#ifdef HAVE_PFXLEN_H +#include +#else + +#include /* union nf_inet_addr */ + +#define E(a, b, c, d) \ + {.ip6 = { \ + __constant_htonl(a), __constant_htonl(b), \ + __constant_htonl(c), __constant_htonl(d), \ + } } + +/* + * This table works for both IPv4 and IPv6; + * just use prefixlen_netmask_map[prefixlength].ip. + */ +static const union nf_inet_addr prefixlen_netmask_map[] = { + E(0x00000000, 0x00000000, 0x00000000, 0x00000000), + E(0x80000000, 0x00000000, 0x00000000, 0x00000000), + E(0xC0000000, 0x00000000, 0x00000000, 0x00000000), + E(0xE0000000, 0x00000000, 0x00000000, 0x00000000), + E(0xF0000000, 0x00000000, 0x00000000, 0x00000000), + E(0xF8000000, 0x00000000, 0x00000000, 0x00000000), + E(0xFC000000, 0x00000000, 0x00000000, 0x00000000), + E(0xFE000000, 0x00000000, 0x00000000, 0x00000000), + E(0xFF000000, 0x00000000, 0x00000000, 0x00000000), + E(0xFF800000, 0x00000000, 0x00000000, 0x00000000), + E(0xFFC00000, 0x00000000, 0x00000000, 0x00000000), + E(0xFFE00000, 0x00000000, 0x00000000, 0x00000000), + E(0xFFF00000, 0x00000000, 0x00000000, 0x00000000), + E(0xFFF80000, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFC0000, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFE0000, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFF0000, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFF8000, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFFC000, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFFE000, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFFF000, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFFF800, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFFFC00, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFFFE00, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFFFF00, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFFFF80, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFFFFC0, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFFFFE0, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFFFFF0, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFFFFF8, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFFFFFC, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFFFFFE, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0x80000000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xC0000000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xE0000000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xF0000000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xF8000000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFC000000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFE000000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFF000000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFF800000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFC00000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFE00000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFF00000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFF80000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFC0000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFE0000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFF0000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFF8000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFC000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFE000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFF000, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFF800, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFC00, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFE00, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFF00, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFF80, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFC0, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFE0, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFF0, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFF8, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFC, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFE, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0x80000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xC0000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xE0000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xF0000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xF8000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFC000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFE000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFF800000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFC00000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFE00000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFF00000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFF80000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFC0000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFE0000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF8000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFC000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFF000, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFF800, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFC00, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFE00, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFF00, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFF80, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFC0, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFE0, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFF0, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFF8, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFC, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x80000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xC0000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xE0000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF0000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF8000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFC000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFE000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF800000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFC00000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFE00000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFF00000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFF80000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFC0000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFE0000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF8000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFC000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFF000), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFF800), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFC00), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFE00), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFF00), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFF80), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFC0), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFE0), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFF0), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFF8), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFC), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE), + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF), +}; +#endif /* !HAVE_PFXLEN_H */ + +#define PFXLEN(n) prefixlen_netmask_map[n].ip +#define PFXLEN6(n) prefixlen_netmask_map[n].ip6 + +#endif diff --git a/include/libipset/print.h b/include/libipset/print.h new file mode 100644 index 0000000..2103ce1 --- /dev/null +++ b/include/libipset/print.h @@ -0,0 +1,88 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef LIBIPSET_PRINT_H +#define LIBIPSET_PRINT_H + +#include /* enum ipset_opt */ + +typedef int (*ipset_printfn)(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); + +#ifdef __cplusplus +extern "C" { +#endif + +extern int ipset_print_ether(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_family(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_type(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_ip(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_ipaddr(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_number(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_name(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_port(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_mark(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_iface(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_comment(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_skbmark(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_skbprio(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_proto(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_icmp(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_icmpv6(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_proto_port(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_flag(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); +extern int ipset_print_elem(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); + +#define ipset_print_portnum ipset_print_number + +extern int ipset_print_data(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt, uint8_t env); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBIPSET_PRINT_H */ diff --git a/include/libipset/session.h b/include/libipset/session.h new file mode 100644 index 0000000..8618402 --- /dev/null +++ b/include/libipset/session.h @@ -0,0 +1,142 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef LIBIPSET_SESSION_H +#define LIBIPSET_SESSION_H + +#include /* bool */ +#include /* uintxx_t */ +#include /* printf */ + +#include /* enum ipset_cmd */ + +/* Report and output buffer sizes */ +#define IPSET_ERRORBUFLEN 1024 +#define IPSET_OUTBUFLEN 8192 + +struct ipset_session; +struct ipset_data; + +#ifdef __cplusplus +extern "C" { +#endif + +extern struct ipset_data * + ipset_session_data(const struct ipset_session *session); +extern struct ipset_handle * + ipset_session_handle(const struct ipset_session *session); +extern const struct ipset_type * + ipset_saved_type(const struct ipset_session *session); +extern void ipset_session_lineno(struct ipset_session *session, + uint32_t lineno); +extern void * ipset_session_printf_private(struct ipset_session *session); + +enum ipset_err_type { + IPSET_NO_ERROR, + IPSET_WARNING, /* Success code when exit */ + IPSET_NOTICE, /* Error code and exit in non interactive mode */ + IPSET_ERROR, /* Error code and exit */ +}; + +extern int ipset_session_report(struct ipset_session *session, + enum ipset_err_type type, + const char *fmt, ...); +extern int ipset_session_warning_as_error(struct ipset_session *session); + +#define ipset_err(session, fmt, args...) \ + ipset_session_report(session, IPSET_ERROR, fmt , ## args) + +#define ipset_warn(session, fmt, args...) \ + ipset_session_report(session, IPSET_WARNING, fmt , ## args) + +#define ipset_notice(session, fmt, args...) \ + ipset_session_report(session, IPSET_NOTICE, fmt , ## args) + +#define ipset_errptr(session, fmt, args...) ({ \ + ipset_session_report(session, IPSET_ERROR, fmt , ## args); \ + NULL; \ +}) + +extern void ipset_session_report_reset(struct ipset_session *session); +extern const char *ipset_session_report_msg(const struct ipset_session *session); +extern enum ipset_err_type ipset_session_report_type( + const struct ipset_session *session); + +#define ipset_session_data_set(session, opt, value) \ + ipset_data_set(ipset_session_data(session), opt, value) +#define ipset_session_data_get(session, opt) \ + ipset_data_get(ipset_session_data(session), opt) + +/* Environment option flags */ +enum ipset_envopt { + IPSET_ENV_BIT_SORTED = 0, + IPSET_ENV_SORTED = (1 << IPSET_ENV_BIT_SORTED), + IPSET_ENV_BIT_QUIET = 1, + IPSET_ENV_QUIET = (1 << IPSET_ENV_BIT_QUIET), + IPSET_ENV_BIT_RESOLVE = 2, + IPSET_ENV_RESOLVE = (1 << IPSET_ENV_BIT_RESOLVE), + IPSET_ENV_BIT_EXIST = 3, + IPSET_ENV_EXIST = (1 << IPSET_ENV_BIT_EXIST), + IPSET_ENV_BIT_LIST_SETNAME = 4, + IPSET_ENV_LIST_SETNAME = (1 << IPSET_ENV_BIT_LIST_SETNAME), + IPSET_ENV_BIT_LIST_HEADER = 5, + IPSET_ENV_LIST_HEADER = (1 << IPSET_ENV_BIT_LIST_HEADER), +}; + +extern bool ipset_envopt_test(struct ipset_session *session, + enum ipset_envopt env); +extern void ipset_envopt_set(struct ipset_session *session, + enum ipset_envopt env); +extern void ipset_envopt_unset(struct ipset_session *session, + enum ipset_envopt env); + +enum ipset_output_mode { + IPSET_LIST_NONE, + IPSET_LIST_PLAIN, + IPSET_LIST_SAVE, + IPSET_LIST_XML, +}; + +extern int ipset_session_output(struct ipset_session *session, + enum ipset_output_mode mode); + +extern int ipset_commit(struct ipset_session *session); +extern int ipset_cmd(struct ipset_session *session, enum ipset_cmd cmd, + uint32_t lineno); + +typedef int (*ipset_print_outfn)(struct ipset_session *session, + void *p, const char *fmt, ...) + __attribute__ ((format (printf, 3, 4))); + +extern int ipset_session_print_outfn(struct ipset_session *session, + ipset_print_outfn outfn, + void *p); + +enum ipset_io_type { + IPSET_IO_INPUT, + IPSET_IO_OUTPUT, +}; + +extern int ipset_session_io_full(struct ipset_session *session, + const char *filename, enum ipset_io_type what); +extern int ipset_session_io_normal(struct ipset_session *session, + const char *filename, enum ipset_io_type what); +extern FILE * ipset_session_io_stream(struct ipset_session *session, + enum ipset_io_type what); +extern int ipset_session_io_close(struct ipset_session *session, + enum ipset_io_type what); + +extern struct ipset_session *ipset_session_init(ipset_print_outfn outfn, + void *p); +extern int ipset_session_fini(struct ipset_session *session); + +extern void ipset_debug_msg(const char *dir, void *buffer, int len); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBIPSET_SESSION_H */ diff --git a/include/libipset/transport.h b/include/libipset/transport.h new file mode 100644 index 0000000..a9209cd --- /dev/null +++ b/include/libipset/transport.h @@ -0,0 +1,27 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef LIBIPSET_TRANSPORT_H +#define LIBIPSET_TRANSPORT_H + +#include /* uintxx_t */ +#include /* struct nlmsghdr */ + +#include /* mnl_cb_t */ + +#include /* enum ipset_cmd */ + +struct ipset_handle; + +struct ipset_transport { + struct ipset_handle * (*init)(mnl_cb_t *cb_ctl, void *data); + int (*fini)(struct ipset_handle *handle); + void (*fill_hdr)(struct ipset_handle *handle, enum ipset_cmd cmd, + void *buffer, size_t len, uint8_t envflags); + int (*query)(struct ipset_handle *handle, void *buffer, size_t len); +}; + +#endif /* LIBIPSET_TRANSPORT_H */ diff --git a/include/libipset/types.h b/include/libipset/types.h new file mode 100644 index 0000000..bb71d88 --- /dev/null +++ b/include/libipset/types.h @@ -0,0 +1,140 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef LIBIPSET_TYPES_H +#define LIBIPSET_TYPES_H + +#include /* NULL */ +#include /* uintxx_t */ + +#include /* enum ipset_keywords */ +#include /* enum ipset_opt */ +#include /* ipset_parsefn */ +#include /* ipset_printfn */ +#include /* IPSET_MAXNAMELEN */ +#include /* for NFPROTO_ */ + +/* Family rules: + * - NFPROTO_UNSPEC: type is family-neutral + * - NFPROTO_IPV4: type supports IPv4 only + * - NFPROTO_IPV6: type supports IPv6 only + * Special (userspace) ipset-only extra value: + * - NFPROTO_IPSET_IPV46: type supports both IPv4 and IPv6 + */ +enum { + NFPROTO_IPSET_IPV46 = 255, +}; + +/* The maximal type dimension userspace supports */ +#define IPSET_DIM_UMAX 3 + +/* Parser options */ +enum { + IPSET_NO_ARG = -1, + IPSET_OPTIONAL_ARG, + IPSET_MANDATORY_ARG, + IPSET_MANDATORY_ARG2, +}; + +struct ipset_session; + +/* Parse and print type-specific arguments */ +struct ipset_arg { + const char *name[2]; /* option names */ + int has_arg; /* mandatory/optional/no arg */ + enum ipset_opt opt; /* argumentum type */ + ipset_parsefn parse; /* parser function */ + ipset_printfn print; /* printing function */ + const char *help; /* help text */ +}; + +/* Type check against the kernel */ +enum { + IPSET_KERNEL_MISMATCH = -1, + IPSET_KERNEL_CHECK_NEEDED, + IPSET_KERNEL_OK, +}; + +/* How element parts are parsed */ +struct ipset_elem { + ipset_parsefn parse; /* elem parser function */ + ipset_printfn print; /* elem print function */ + enum ipset_opt opt; /* elem option */ +}; + +#define IPSET_OPTARG_MAX 24 + +/* How other CADT args are parsed */ +struct ipset_optarg { + enum ipset_keywords args[IPSET_OPTARG_MAX];/* args */ + uint64_t need; /* needed flags */ + uint64_t full; /* all possible flags */ + const char *help; /* help text */ +}; + +/* The set types in userspace + * we could collapse 'args' and 'mandatory' to two-element lists + * but for the readability the full list is supported. + */ +struct ipset_type { + const char *name; + uint8_t revision; /* revision number */ + uint8_t family; /* supported family */ + uint8_t dimension; /* elem dimension */ + int8_t kernel_check; /* kernel check */ + bool last_elem_optional; /* last element optional */ + struct ipset_elem elem[IPSET_DIM_UMAX]; /* parse elem */ + ipset_parsefn compat_parse_elem; /* compatibility parser */ + struct ipset_optarg cmd[IPSET_CADT_MAX];/* optional arguments */ + const char *usage; /* terse usage */ + void (*usagefn)(void); /* additional usage */ + const char *description; /* short revision description */ + struct ipset_type *next; + const char *alias[]; /* name alias(es) */ +}; + +#ifdef __cplusplus +extern "C" { +#endif + +extern int ipset_cache_add(const char *name, const struct ipset_type *type, + uint8_t family); +extern int ipset_cache_del(const char *name); +extern int ipset_cache_rename(const char *from, const char *to); +extern int ipset_cache_swap(const char *from, const char *to); + +extern int ipset_cache_init(void); +extern void ipset_cache_fini(void); + +extern const struct ipset_type * + ipset_type_get(struct ipset_session *session, enum ipset_cmd cmd); +extern const struct ipset_type * + ipset_type_check(struct ipset_session *session); +extern const struct ipset_type * + ipset_type_higher_rev(const struct ipset_type *type); + +extern int ipset_type_add(struct ipset_type *type); +extern const struct ipset_type *ipset_types(void); +extern const char *ipset_typename_resolve(const char *str); +extern bool ipset_match_typename(const char *str, + const struct ipset_type *t); +extern void ipset_load_types(void); + +#ifdef __cplusplus +} +#endif + +#ifdef TYPE_INCLUSIVE +# ifdef _INIT +# undef _init +# define _init _INIT +# endif +#else +# undef _init +# define _init __attribute__((constructor)) _INIT +#endif + +#endif /* LIBIPSET_TYPES_H */ diff --git a/include/libipset/utils.h b/include/libipset/utils.h new file mode 100644 index 0000000..3cd29da --- /dev/null +++ b/include/libipset/utils.h @@ -0,0 +1,53 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef LIBIPSET_UTILS_H +#define LIBIPSET_UTILS_H + +#include /* strcmp */ +#include /* struct in[6]_addr */ +#ifndef IPPROTO_UDPLITE +#define IPPROTO_UDPLITE 136 +#endif + +/* String equality tests */ +#define STREQ(a, b) (strcmp(a, b) == 0) +#define STRNEQ(a, b, n) (strncmp(a, b, n) == 0) +#define STRCASEQ(a, b) (strcasecmp(a, b) == 0) +#define STRNCASEQ(a, b, n) (strncasecmp(a, b, n) == 0) + +/* Stringify tokens */ +#define _STR(c) #c +#define STR(c) _STR(c) + +/* Min/max */ +#define MIN(a, b) (a < b ? a : b) +#define MAX(a, b) (a > b ? a : b) + +#define UNUSED __attribute__ ((unused)) +#ifdef NDEBUG +#define ASSERT_UNUSED UNUSED +#else +#define ASSERT_UNUSED +#endif + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x))) +#endif + +static inline void +in4cpy(struct in_addr *dest, const struct in_addr *src) +{ + dest->s_addr = src->s_addr; +} + +static inline void +in6cpy(struct in6_addr *dest, const struct in6_addr *src) +{ + memcpy(dest, src, sizeof(struct in6_addr)); +} + +#endif /* LIBIPSET_UTILS_H */ diff --git a/kernel/ChangeLog b/kernel/ChangeLog new file mode 100644 index 0000000..0b53a3d --- /dev/null +++ b/kernel/ChangeLog @@ -0,0 +1,666 @@ +7.1 + - netfilter/ipset: replace a strncpy() with strscpy() (Qian Cai) + - netfilter: ipset: fix ip_set_byindex function (Florent Fourcot) + - netfilter: ipset: do not call ipset_nest_end after nla_nest_cancel + (Pan Bian) + - Correct workaround in patch "Fix calling ip_set() macro at dumping" + +7.0 + - Introduction of new commands and protocol version 7 + - License cleanup: add SPDX license identifier to uapi header files with + no license (Greg Kroah-Hartman) + - net: Convert ip_set_net_ops (Kirill Tkhai) + - netfilter: Replace spin_is_locked() with lockdep (Lance Roy) + - Fix calling ip_set() macro at dumping + - Correct rcu_dereference() call in ip_set_put_comment() + - netfilter: ipset: fix ip_set_list allocation failure (Andrey Ryabinin) + - ipset: Make invalid MAC address checks consisten (Stefano Brivio) + - ipset: Allow matching on destination MAC address for mac and ipmac sets + (Stefano Brivio) + - netfilter: ipset: actually allow allowable CIDR 0 in hash:net,port,net + (Eric Westbrook) + - ipset: list:set: Decrease refcount synchronously on deletion and replace + (Stefano Brivio) + - netfilter: ipset: forbid family for hash:mac sets (Florent Fourcot) + - Limit max timeout value to (UINT_MAX >> 1)/MSEC_PER_SEC + - List timing out entries with "timeout 1" instead of zero timeout value + (Fixes bugzilla #1258) + - netfilter: xt_set: Check hook mask correctly (Serhey Popovych) + +6.37 + - netfilter: ipset: Use is_zero_ether_addr instead of static and memcmp + (Joe Perches) + +6.36 + - Remove duplicate module description + - netfilter: remove messages print and boot/module load time + (Pablo Neira Ayuso) + - Fix wraparound bug introduced in commit 48596a8ddc46 in v6.34 + (reported by Thomas Schwark) + +6.35 + - netfilter: mark expected switch fall-throughs (Gustavo A. R. Silva) + - License cleanup: add SPDX GPL-2.0 license identifier to files with no + license (Greg Kroah-Hartman) + - Backport patch: netfilter: ipset: use nfnl_mutex_is_locked + - Missing nfnl_lock()/nfnl_unlock() is added to ip_set_net_exit() + - netfilter: ipset: use nfnl_mutex_is_locked (Florian Westphal) + - netfilter: ipset: add resched points during set listing + (Florian Westphal) + - Fix "don't update counters" mode when counters used at the matching + - Backport patch: netfilter: ipset: Convert timers to use timer_setup() + - netfilter: ipset: use swap macro instead of _manually_ swapping values + (Gustavo A. R. Silva) + - netfilter: ipset: Fix race between dump and swap (Ross Lagerwall) + - netfilter: ipset: pernet ops must be unregistered last (Florian + Westphal) + +6.34 + - Fix adding an IPv4 range containing more than 2^31 addresses + (bugzilla id #1005, reported by Oleg Serditov and Oliver Ford) + +6.33 + - Backport patch: sctp: remove the typedef sctp_sctphdr_t + - Backport patch: netfilter: nfnetlink: extended ACK reporting + - ipset: remove unused function __ip_set_get_netlink (Aaron Conole) + - Backport patch: netlink: pass extended ACK struct to parsing functions + - Backport patch netlink: extended ACK reporting + - netfilter: Remove exceptional & on function name (Arushi Singhal) + - Backport missing part of patch: netfilter: Remove unnecessary cast on + void pointer + - Backport nfnl_msg_type() + - netfilter: ipset: ipset list may return wrong member count for set with + timeout (Vishwanath Pai) + - netfilter: ipset: deduplicate prefixlen maps (Aaron Conole) + - Fix sparse warnings + - netfilter: ipset: Compress return logic (simran singhal) + - netfilter: ipset: Remove unnecessary cast on void pointer (simran + singhal) + - Compatibility: handle changes in 4.10 kernel tree + +6.31 + - netfilter: ipset: Null pointer exception in ipset list:set + (Vishwanath Pai) + - Fix bug: sometimes valid entries in hash:* types of sets were evicted + (reported by Eric Ewanco) + - Correct copyright owner + - Revert patch "Correct rcu_dereference_bh_nfnl() usage" + +6.30 + - netfilter: ipset: hash: fix boolreturn.cocci warnings + (Fengguang Wu) + - Fix the nla_put_net64() API changes backport + - netfilter: ipset: Fixing unnamed union init (Elad Raz) + - netfilter: x_tables: Use par->net instead of computing from the passed + net devices (Eric W. Biederman) + - Correct the reported memory size for bitmap:* types + - Fix coding styles reported by checkpatch.pl, already in kernel + - netfilter: x_tables: Pass struct net in xt_action_param + (Eric W. Biederman) + - net: sched: fix skb->protocol use in case of accelerated vlan path + (Jiri Pirko) + - Check IPSET_ATTR_ETHER netlink attribute length in hash:ipmac too + - netfilter: fix include files for compilation (Mikko Rapeli) + - ipset: Backports for the nla_put_net64() API changes (Neutron Soutmun) + - netfilter: ipset: use setup_timer() and mod_timer(). + (Muhammad Falak R Wani) + - hash:ipmac type support added to ipset (Tomasz Chilinski) + +6.29 + - Fix race condition in ipset save, swap and delete (Vishwanath Pai) + +6.28 + - Check IPSET_ATTR_ETHER netlink attribute length + - Fix __aligned_u64 compatibility support for older kernel releases + - Add compatibility to support EXPORT_SYMBOL_GPL in module.h + - Fix set:list type crash when flush/dump set in parallel + - pass down netns pointer to call() and call_rcu() (backport) + - allow a 0 netmask with hash_netiface type (Florian Westphal) + +6.27 + - Fix reported memory size for hash:* types + - Fix hash type expire: release empty hash bucket block + - Fix hash type expiration: incorrect index fixed + - Collapse same condition body to a single one + - Fix extension alignment + - Compatibility: include linux/export.h when needed + - Compatibility: make sure vmalloc.h is included for kvfree() + - Compatibility: Fix detecting 'struct net' in 'struct tcf_ematch' + - Compatibility: Protect definition of RCU_INIT_POINTER in compatibility + header file + - netfilter: ipset: Fix sleeping memory allocation in atomic context + (Nikolay Borisov) + +6.26 + - Out of bound access in hash:net* types fixed (reported by Dave Jones) + - Make struct htype per ipset family (originally from Sergey Popovich) + - Optimize hash creation routine (originally from Sergey Popovich) + - Make sure element data size is a multiple of u32 (originally from Sergey + Popovich) + - Make NLEN compile time constant for hash types (originally from Sergey + Popovich) + - Simplify mtype_expire() for hash types (originally from Sergey Popovich) + - Count non-static extension memory into the set memory size for userspace + - net: sched: Simplify em_ipset_match (Eric W. Biederman) + +6.25.1 + - net/netfilter/ipset: work around gcc-4.4.4 initializer bug + (Andrew Morton) + +6.25 + - Add element count to all set types header + - Add element count to hash headers (Eric B Munson) + - implement nla_put_in_addr and nla_put_in6_addr (Jiri Benc) + - deinline ip_set_put_extensions() (Denys Vlasenko) + - Fix error path in mtype_resize() when new hash bucket cannot be + allocated + - There is no need to call synchronize_rcu() after list_add_rcu() + - Fix typo in function name get_phyoutdev_name() + - Separate memsize calculation code into dedicated functions (originally + from Sergey Popovich) + - Split extensions into separate files (originally from Sergey Popovich) + - Improve comment extension helpers (originally from Sergey Popovich) + - Improve skbinfo get/init helpers (originally from Sergey Popovich) + - Headers file cleanup (originally from Sergey Popovich) + - Correct rcu_dereference_bh_nfnl() usage (originally from Sergey + Popovich) + - add helpers for fetching physin/outdev (Florian Westphal) + - When a single set is destroyed, make sure it can't be grabbed by dump + - In comment extension ip_set_comment_free() is always called in a safe + path + - Add rcu_barrier() to module removal in the bitmap types too + - Fix coding styles reported by the most recent checkpatch.pl + - Make sure bitmap:ip,mac detects the proper MAC even when it's + overwritten + - RCU safe comment extension handling + - Make sure the proper is_destroyed value is checked at dumping + - Fix broken commit "Check extensions attributes before getting + extensions." + - Improve preprocessor macros checks (Sergey Popovich) + - Fix hashing for ipv6 sets (Sergey Popovich) + - Fix ext_*() macros so pointers returned by these macros could be + referenced directly (Sergey Popovich) + - Check for comment netlink attribute length (Sergey Popovich) + - Return bool values instead of int (Sergey Popovich) + - Check CIDR value only when attribute is given (Sergey Popovich) + - Make sure we always return line number on batch (Sergey Popovich) + - Permit CIDR equal to the host address CIDR in IPv6 (Sergey Popovich) + - Use HOST_MASK literal to represent host address CIDR len (Sergey + Popovich) + - Check IPSET_ATTR_PORT only once (Sergey Popovich) + - Check extensions attributes before getting extensions (Sergey Popovich) + - Use SET_WITH_*() helpers to test set extensions (Sergey Popovich) + - Return ipset error instead of bool (Sergey Popovich) + - Preprocessor directices cleanup (Sergey Popovich) + - No need to make nomatch bitfield (Sergey Popovich) + - Make sure bit operations are not reordered + - Properly calculate extensions offsets and total length (Sergey Popovich) + - Fix cidr handling for hash:*net* types, reported by Jonathan Johnson + - fix boolreturn.cocci warnings (Fengguang Wu) + - make ip_set_get_ip*_port to use skb_network_offset (Alexander Drozdov) + - Make sure listing doesn't grab a set which is just being destroyed. + - Missing rcu_read_lock() and _unlock() in mtype_list() fixed + - Fix coding styles reported by checkpatch.pl + - Use nlmsg_total_size instead of NLMSG_SPACE in ip_set_core.c + - There's no need to call synchronize_rcu() with kfree_rcu() + - Call rcu_barrier() in module removal path + - Call synchronize_rcu() in set type (un)register functions only when + needed + - Remove an unused macro + - Give a better name to a macro in ip_set_core.c + - Resolve the STREQ macro to make the code more readable, and use + nla_strlcpy where possible + - Use MSEC_PER_SEC consistently + - Remove unnecessary integer RCU handling and fix other sparse warnings + - Fix sparse warning "cast to restricted __be32" + +6.24 + - netfilter: ipset: small potential read beyond the end of buffer + (Dan Carpenter) + - Fix parallel resizing and listing of the same set + - styles warned by checkpatch.pl fixed + - Introduce RCU in all set types instead of rwlock per set + (performance tested by Jesper Dangaard Brouer) + - Remove rbtree from hash:net,iface in order to run under RCU + - Explicitly add padding elements to hash:net,net and hash:net,port,net + - Allocate the proper size of memory when /0 networks are supported + - Simplify cidr handling for hash:*net* types + - Indicate when /0 networks are supported + - Kernel API changes in em_ipset.c, support both old and new ones + - netfilter: Convert uses of __constant_ to (Joe Perches) + - net: use the new API kvfree() (WANG Cong) + - treewide: fix errors in print (Masanari Iida) + - netfilter: use IS_ENABLED(CONFIG_BRIDGE_NETFILTER) (Pablo Neira Ayuso) + - Use IS_ENABLED macro and define it if required + - Alignment problem between 64bit kernel 32bit userspace fixed + (reported by Sven-Haegar Koch) + - netfilter: ipset: off by one in ip_set_nfnl_get_byindex() + (Dan Carpenter) + +6.23 + - Support updating extensions when the set is full + (fixes bugzilla id #880) + +6.22 + - hash:mac type added to ipset + - skbinfo extension: send nonzero extension elements only to userspace + - netfilter: Convert pr_warning to pr_warn (Joe Perches) + - netfilter: ipset: Add skbinfo extension support to SET target. + (Anton Danilov) + - netfilter: ipset: Add skbinfo extension kernel support for the list + set type. (Anton Danilov) + - netfilter: ipset: Add skbinfo extension kernel support for the hash + set types. (Anton Danilov) + - netfilter: ipset: Add skbinfo extension kernel support for the + bitmap set types. (Anton Danilov) + - netfilter: ipset: Add skbinfo extension kernel support in the ipset + core. (Anton Danilov) + - Fix static checker warning in ip_set_core.c (reported by Dan Carpenter) + - Fix warn: integer overflows 'sizeof(*map) + size * set->dsize' + (reported by Dan Carpenter) + - net/netfilter/ipset: Resolve missing-field-initializer warnings + (Mark Rustad) + - netnet,netportnet: Fix value range support for IPv4 (Sergey Popovich) + - Removed invalid IPSET_ATTR_MARKMASK validation (Vytas Dauksa) + +6.21.1 + - netfilter: ip_set: rename nfnl_dereference()/nfnl_set() + (Patrick McHardy) + +6.21 + - ipset: add forceadd kernel support for hash set types (Josh Hunt) + - netfilter: ipset: move registration message to init from net_init + (Ilia Mirkin) + - kernel: uapi: fix MARKMASK attr ABI breakage (Florian Westphal) + - Prepare the kernel for create option flags when no extension is needed + - add markmask for hash:ip,mark data type (Vytas Dauksa) + - add hash:ip,mark data type to ipset (Vytas Dauksa) + - ipset: remove unused code (Stephen Hemminger) + - netfilter: ipset: Add hash: fix coccinelle warnings (Fengguang Wu) + - Typo in ip_set_hash_netnet.c fixed (David Binderman) + - net ipset: use rbtree postorder iteration instead of opencoding + (Cody P Schafer) + - ipset: Follow manual page behavior for SET target on list:set + (Sergey Popovich) + +6.20.1 + - netfilter: ipset: remove duplicate define (Michael Opdenacker) + - net->user_ns is available starting from 3.8, add compatibility + checking (reported by Jan Engelhardt) + - Fix memory allocation for bitmap:port (reported by Quentin Armitage) + - Avoid clashing with configured kernel in [CONFIG_]IP_SET_MAX + - The unnamed union initialization may lead to compilation error + (reported by Husnu Demir) + - Use dev_net() instead of the direct access to ->nd_net (reported by + the kbuild test robot) + +6.20 + - Compatibility code is modified not to rely on kernel version numbers + - Use netlink callback dump args only + - Add hash:net,port,net module to kernel (Oliver Smith) + - Add net namespace for ipset (Vitaly Lavrov) + - Use a common function at listing the extensions of the elements + - For set:list types, replaced elements must be zeroed out + - Fix hash resizing with comments + - Support comments in the list-type ipset (Oliver Smith) + - Support comments in bitmap-type ipsets (Oliver Smith) + - Support comments in hash-type ipsets (Oliver Smith) + - Support comments for ipset entries in the core (Oliver Smith) + - Add hash:net,net module to kernel (Oliver Smith) + - Fix serious failure in CIDR tracking (Oliver Smith) + - list:set: make sure all elements are checked by the gc + - Support extensions which need a per data destroy function + - Generalize extensions support + - Move extension data to set structure + - Rename extension offset ids to extension ids + - Prepare ipset to support multiple networks for hash types + - Introduce new operation to get both setname and family + - Validate the set family and not the set type family at swapping + (Bug reported by Quentin Armitage, netfilter bugzilla id #843) + - Consistent userspace testing with nomatch flag + - Skip really non-first fragments for IPv6 when getting port/protocol + - ipset standalone package needs to ship em_ipset.c (reported by Jan + Engelhardt) + +6.19 + - Compatibility fixes to keep the support of kernels back to 2.6.32 + - Backport nla_put_net64 + - Support package fragments for IPv4 protos without ports + (Anders K. Pedersen) + - Use fix sized type for timeout in the extension part + - Make sure kernel configured properly for sparse checkings + - Fix "may be used uninitialized" warnings (reported by Pablo Neira + Ayuso) + - Rename simple macro names to avoid namespace issues. (reported by + David Laight) + - Fix sparse warnings due to missing rcu annotations (reported by + Pablo Neira Ayuso) + - Sparse warning about shadowed variable fixed + - Don't call ip_nest_end needlessly in the error path (suggested by + Pablo Neira Ayuso) + - set match: add support to match the counters + - The list:set type with counter support + - The hash types with counter support + - The bitmap types with counter support + - Introduce the counter extension in the core + - list:set type using the extension interface + - Hash types using the unified code base + - Unified hash type generation + - Bitmap types using the unified code base + - Unified bitmap type generation + - Introduce extensions to elements in the core + - Move often used IPv6 address masking function to header file + - Make possible to test elements marked with nomatch, from userspace + - netfilter ipset: Use ipv6_addr_equal() where appropriate. + (YOSHIFUJI Hideaki) + - Add a compatibility header file for easier maintenance + - The uapi include split in the package itself + - Reorder modules a little bit in Kbuild + +6.18 + - list:set: update reference counter when last element pushed off + - hash:*net*: nomatch flag not excluded on set resize + +6.17 + - Make sure ip_set_max isn't set to IPSET_INVALID_ID + - netfilter: ipset: timeout values corrupted on set resize (Josh Hunt) + - "Directory not empty" error message (reported by John Brendler) + +6.16.1 + - Add ipset package version to external module description + - Backport RCU handling up to 2.6.32.x + +6.16 + - Netlink pid is renamed to portid in kernel 3.7.0 + - Fix RCU handling when the number of maximal sets are increased + - netfilter: ipset: fix netiface set name overflow (Florian Westphal) + +6.15 + - Increase the number of maximal sets automatically as needed + - Restore the support of kernel versions between 2.6.32 and 2.6.35 + - Fix range bug in hash:ip,port,net + - Revert, then reapply cidr book keeping patch to handle /0 + +6.14 + - Support to match elements marked with "nomatch" in hash:*net* sets + - Coding style fixes + - Include supported revisions in module description + - Add /0 network support to hash:net,iface type + - Fix cidr book keeping for hash:*net* types + - Check and reject crazy /0 input parameters + - Backport ether_addr_equal + - Coding style fix, backport from kernel + - net: cleanup unsigned to unsigned int (Eric Dumazet) + +6.13 + - ipset: Handle properly an IPSET_CMD_NONE (Tomasz Bursztyka) + - netfilter: ipset: hash:net,iface: fix interface comparison (Florian + Westphal) + - Timeout fixing bug broke SET target special timeout value, fixed + - Use MSEC_PER_SEC instead of harcoded value + +6.12 + - Backport nla_put_net* functions as NLA_PUT* were removed + - netlink: add netlink_dump_control structure for netlink_dump_start() + - ipset: Stop using NLA_PUT*(). + - Fix hash size checking in kernel (bug reported by Seblu) + - Correct README file about minimal required iptables version + (Oskar Berggren) + - Sparse warnings "incorrect type in assignment" fixed + - Fix timeout value overflow bug at large timeout parameters + (bug reported by Andreas Herz) + - ipv6: Add fragment reporting to ipv6_skip_exthdr(). + - net: remove ipv6_addr_copy() + - Fix the inclusion of linux/export.h (Henry Culver) + +6.11 + - hash:net,iface timeout bug fixed + - Exceptions support added to hash:*net* types + - net: Add export.h for EXPORT_SYMBOL/THIS_MODULE to non-modules + - Log warning when a hash type of set gets ful + +6.10 + - Invert the logic to include version.h in ip_set_core.c + - Suppress false compile-time warnings about uninitialized variable ip_to + +6.9.1 + - Fix compiling ipset as external kernel modules + +6.9 + - Complete Kconfig with hash:net,iface type (standalone package) + - rtnetlink: Compute and store minimum ifinfo dump size (Greg Rose) + - Remove redundant linux/version.h includes from net/ (Jesper Juhl) + - ipset: use NFPROTO_ constants (Jan Engelhardt) + - netfilter: ipset: expose userspace-relevant parts in ip_set.h + (Jan Engelhardt) + - netfilter: ipset: avoid use of kernel-only types (Jan Engelhardt) + - netfilter: Remove unnecessary OOM logging messages (Joe Perches) + - Dumping error triggered removing references twice and lead to kernel BUG + - Autoload set type modules safely + +6.8 + - Fix compiler warnings "'hash_ip4_data_next' declared inline after being + called" (Chris Friesen) + - hash:net,iface fixed to handle overlapping nets behind different + interfaces + - Make possible to hash some part of the data element only. + +6.7 + - Whitespace and coding fixes, detected by checkpatch.pl + - hash:net,iface type introduced + - Use the stored first cidr value instead of '1' + - Fix return code for destroy when sets are in use + - Add xt_action_param to the variant level kadt functions, ipset API change + - Drop supporting kernel versions below 2.6.35 + +6.6 + - Use unified from/to address masking and check the usage + - ip_set_flush returned -EPROTO instead of -IPSET_ERR_PROTOCOL, fixed + - Take into account cidr value for the from address when creating the set + - Adding ranges to hash types with timeout could still fail, fixed + - Removed old, not used hashing method ip_set_chash + - Remove variable 'ret' in type_pf_tdel(), which is set but not used + - Use proper timeout parameter to jiffies conversion + +6.5 + - Support range for IPv4 at adding/deleting elements for hash:*net* types + - Set type support with multiple revisions added + - Fix adding ranges to hash types + +6.4 + - Support listing setnames and headers too + - Fix the order of listing of sets + - Options and flags support added to the kernel API + +6.3 + - ipset/Kconfig was a mixed up kernel config file, fixed (Michael Tokarev) + - bitmap:ip,mac type requires "src" for MAC, enforce it + - whitespace fixes: some space before tab slipped in + - set match and SET target fixes (bugs reported by Lennert Buytenhek) + +6.2 + - list:set timeout variant fixes + - References are protected by rwlock instead of mutex + - Add explicit text message to detect patched kernel (netlink.patch) + - Timeout can be modified for already added elements + +6.1 + - The hash:*port* types ignored the address range with non TCP/UDP, fixed + - Fix checking the revision number of the set type at create command + - SCTP, UDPLITE support to hash:*port* types added + - Fix revision reporting got broken by the revision checking patch + +6.0 + - Reorganized kernel/ subdir + - netfilter: ipset: fix linking with CONFIG_IPV6=n (Patrick McHardy) + - netfilter: ipset: send error message manually + - netfilter: ipset: add missing break statemtns in + ip_set_get_ip_port() (Patrick McHardy) + - netfilter: ipset: add missing include to xt_set.h (Patrick McHardy) + - netfilter: ipset: remove unnecessary includes (Patrick McHardy) + - netfilter: ipset: use nla_parse_nested() (Patrick McHardy) + - Separate ipset errnos completely from system ones and bump protocol + version + - Use better error codes in xt_set.c + - Fix sparse warning about shadowed definition + - bitmap:ip type: flavour specific adt functions (Patrick McHardy's review) + - bitmap:port type: flavour specific adt functions (Patrick McHardy's + review) + - Move the type specifici attribute validation to the core + (suggested by Patrick McHardy) + - Use vzalloc() instead of __vmalloc() (Eric Dumazet, Patrick McHardy) + - Use meaningful error messages in xt_set.c (Patrick McHardy's review) + - Constified attribute cannot be written (Patrick McHardy's review) + - Send (N)ACK at dumping only when NLM_F_ACK is set + (Patrick McHardy's review) + - Correct the error codes: use ENOENT and EMSGSIZE (Patrick McHardy's + review) + +5.4 + - Fixed broken ICMP and ICMPv6 handling + - Fix trailing whitespaces and pr_* messages + - Un-inline functions which are not small enough (suggested by Patrick McHardy) + - Fix module loading at create/header command (reported by Patrick McHardy) + - Fix wrong kzalloc flag in type_pf_expire + - The get_ip*_port functions are too large to be inlined, move into the core + - Add missing __GFP_HIGHMEM flag to __vmalloc (suggested by Eric Dumazet) + - Enforce network-order data in the netlink protocol + - Use annotated types and fix sparse warnings (suggested by Patrick McHardy) + - Move ip_set_alloc, ip_set_free and ip_set_get_ipaddr* into core + (suggested by Patrick McHardy) + - NETMASK*, HOSTMASK* macros are too generic, use small inline functions + (suggested by Patrick McHardy) + - Use static LIST_HEAD() for ip_set_type_list (suggested by Patrick McHardy) + - Move NLA_PUT_NET* macros to include/net/netlink.h (suggested by Patrick + McHardy) + - The module parameter max_sets should be unsigned int (reported by Patrick + McHardy) + - Get rid of ip_set_kernel.h (suggested by Patrick McHardy) + - Fix the placement style of boolean operators at continued lines + (suggested by Patrick McHardy) + +5.3 + - There is no need to call synchronize_net() at swapping + - Replace strncpy with strlcpy at creating a set + - Update copyright date and some style changes + - Use jhash.h accepted in kernel, with backward compatibility + - Separate prefixlens from ip_set core + - Remove unused ctnl parameter from call_ad (Jan Engelhardt) + - Comment the possible return values of the add/del/test type-functions + +5.2 + - Kernel version check at minimal supported version was mistyped, now fixed. + +5.1 + - Kernel version compatibility: support bumped starting from 2.6.34 + (Supporting older kernel releases would mean too much burden for me, + sorry.) + - kernel: use EXPORT_SYMBOL_GPL (Jan Engelhardt) + - kernel: const annotations (Jan Engelhardt) + - kernel: use __read_mostly for registration-type structures + (Jan Engelhardt) + - kernel: do not mix const and __read_mostly (Jan Engelhardt) + - xt_set: avoid user types in exported kernel headers (Jan Engelhardt) + - build: enable parallel building (Jan Engelhardt) + - Fix Kbuild for me to delete backup files + +5.0 + - New main branch - ipset completely rewritten + +4.2 + - nethash and ipportnethash types counted every entry twice + which could produce bogus entries when listing/saving these types + of sets (bug reported by Husnu Demir) + +4.1 + - Do not use init_MUTEX either (Jan Engelhardt) + - Improve listing/saving hash type of sets by not copying empty + entries unnecessarily to userspace. + +4.0 + - Compilation of ip_set_iptree.c fails with kernel 2.6.20 due to + missing include of linux/jiffies.h (Jan Engelhardt) + - Do not use DECLARE_MUTEX (compatibility fix on 2.6.31-rt, Jan + Engelhardt) + - Flushing iptreemap type of sets caused high ksoftirqd load due to + zeroed out gc parameter (bug reported by Georg Chini) + - New protocol is introduced to handle aligment issues properly + (bug reported by Georg Chini) + - Binding support is removed + +3.2 + - Mixed up formats in ip_set_iptree.c (Rob Sterenborg) + - Don't use 'bool' for backward compatibility reasons (Rob Sterenborg) + +3.1 + - Nonexistent sets were reported as existing sets when testing + from userspace in setlist type of sets (bug reported by Victor A. + Safronov) + - When saving sets, setlist type of sets must come last in order + to satisfy the dependency from the elements (bug reported by Marty B.) + - Sparse insists that the flags argument to kmalloc() is gfp_t + (Stephen Hemminger) + - Correct format specifiers and change %i to %d (Jan Engelhardt) + - Fix the definition of 'bool' for kernels <= 2.6.18 (Jan Engelhardt) + +3.0 + - New kernel-userspace protocol release + - Bigendian and 64/32bit fixes (Stefan Gula, bugzilla id 593) + - Support of 2.4.3[67].* kernels fixed + - Compiling with debugging enabled fixed + +2.5.0 + - Use the spinlock initiator instead of setting the locks directly + as it causes compilation errors with 2.6.29-rt (Jan Engelhardt). +2.4.9 + - References to the old include file replaced with new one in order to + really use the new Jenkins' hash function. + +2.4.8 + - The Jenkins' hash lookup2() replaced with Jenkins' faster/better lookup3() + hash function. + - Bug fixed: after elements are added and deleted from a hash, an element + can successfully be added in spite it's already in the hash and thus + duplicates can occur (Shih-Yi Chen). + - Compatibility with old gcc without 'bool' added. + +2.4.7 + - Typo which broke compilation with kernels < 2.6.28 + fixed (reported by Richard Lucassen, Danny Rawlins) + +2.4.6 + - Compatibility fix for kernels >= 2.6.28 + +2.4.5 + - setlist type does not work properly together with swapping + sets, bug reported by Thomas Jacob. + - Include linux/capability.h explicitly in ip_set.c (Jan Engelhardt) + +2.4.4 + - Premature checking prevents to add valid elements to hash + types, fixed (bug reported by JC Janos). + +2.4.2 + - When flushing a nethash/ipportnethash type of set, it can + lead to a kernel crash due to a wrong type declaration, + bug reported by Krzysztof Oledzki. + - iptree and iptreemap types require the header file linux/timer.h, + also reported by Krzysztof Oledzki. + +2.4.1 + - Zero-valued element are not accepted by hash type of sets + because we cannot make a difference between a zero-valued + element and not-set element. +2.4 + - ipportiphash, ipportnethash and setlist types added + - set type modules reworked to avoid code duplication + as much as possible, code unification macros + - expand_macros Makefile target added to help debugging + code unification macros + - ip_set_addip_kernel and ip_set_delip_kernel + changed from void to int, __ip_set_get_byname and + __ip_set_put_byid added for the sake of setlist type + - unnecessary includes removed + - compatibility fix for kernels >= 2.6.27: + semaphore.h was moved from asm/ to linux/ (James King) + - ChangeLog forked for kernel part diff --git a/kernel/include/linux/jhash.h b/kernel/include/linux/jhash.h new file mode 100644 index 0000000..72ca901 --- /dev/null +++ b/kernel/include/linux/jhash.h @@ -0,0 +1,169 @@ +#ifndef _LINUX_JHASH_H +#define _LINUX_JHASH_H + +/* jhash.h: Jenkins hash support. + * + * Copyright (C) 2006. Bob Jenkins (bob_jenkins@burtleburtle.net) + * + * http://burtleburtle.net/bob/hash/ + * + * These are the credits from Bob's sources: + * + * lookup3.c, by Bob Jenkins, May 2006, Public Domain. + * + * These are functions for producing 32-bit hashes for hash table lookup. + * hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final() + * are externally useful functions. Routines to test the hash are included + * if SELF_TEST is defined. You can use this free for any purpose. It's in + * the public domain. It has no warranty. + * + * Copyright (C) 2009-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * I've modified Bob's hash to be useful in the Linux kernel, and + * any bugs present are my fault. + * Jozsef + */ +#include +#include + +/* Best hash sizes are of power of two */ +#define jhash_size(n) ((u32)1<<(n)) +/* Mask the hash value, i.e (value & jhash_mask(n)) instead of (value % n) */ +#define jhash_mask(n) (jhash_size(n)-1) + +/* __jhash_mix -- mix 3 32-bit values reversibly. */ +#define __jhash_mix(a, b, c) \ +{ \ + a -= c; a ^= rol32(c, 4); c += b; \ + b -= a; b ^= rol32(a, 6); a += c; \ + c -= b; c ^= rol32(b, 8); b += a; \ + a -= c; a ^= rol32(c, 16); c += b; \ + b -= a; b ^= rol32(a, 19); a += c; \ + c -= b; c ^= rol32(b, 4); b += a; \ +} + +/* __jhash_final - final mixing of 3 32-bit values (a,b,c) into c */ +#define __jhash_final(a, b, c) \ +{ \ + c ^= b; c -= rol32(b, 14); \ + a ^= c; a -= rol32(c, 11); \ + b ^= a; b -= rol32(a, 25); \ + c ^= b; c -= rol32(b, 16); \ + a ^= c; a -= rol32(c, 4); \ + b ^= a; b -= rol32(a, 14); \ + c ^= b; c -= rol32(b, 24); \ +} + +/* An arbitrary initial parameter */ +#define JHASH_INITVAL 0xdeadbeef + +/* jhash - hash an arbitrary key + * @k: sequence of bytes as key + * @length: the length of the key + * @initval: the previous hash, or an arbitray value + * + * The generic version, hashes an arbitrary sequence of bytes. + * No alignment or length assumptions are made about the input key. + * + * Returns the hash value of the key. The result depends on endianness. + */ +static inline u32 jhash(const void *key, u32 length, u32 initval) +{ + u32 a, b, c; + const u8 *k = key; + + /* Set up the internal state */ + a = b = c = JHASH_INITVAL + length + initval; + + /* All but the last block: affect some 32 bits of (a,b,c) */ + while (length > 12) { + a += __get_unaligned_cpu32(k); + b += __get_unaligned_cpu32(k + 4); + c += __get_unaligned_cpu32(k + 8); + __jhash_mix(a, b, c); + length -= 12; + k += 12; + } + /* Last block: affect all 32 bits of (c) */ + /* All the case statements fall through */ + switch (length) { + case 12: c += (u32)k[11]<<24; + case 11: c += (u32)k[10]<<16; + case 10: c += (u32)k[9]<<8; + case 9: c += k[8]; + case 8: b += (u32)k[7]<<24; + case 7: b += (u32)k[6]<<16; + case 6: b += (u32)k[5]<<8; + case 5: b += k[4]; + case 4: a += (u32)k[3]<<24; + case 3: a += (u32)k[2]<<16; + case 2: a += (u32)k[1]<<8; + case 1: a += k[0]; + __jhash_final(a, b, c); + case 0: /* Nothing left to add */ + break; + } + + return c; +} + +/* jhash2 - hash an array of u32's + * @k: the key which must be an array of u32's + * @length: the number of u32's in the key + * @initval: the previous hash, or an arbitray value + * + * Returns the hash value of the key. + */ +static inline u32 jhash2(const u32 *k, u32 length, u32 initval) +{ + u32 a, b, c; + + /* Set up the internal state */ + a = b = c = JHASH_INITVAL + (length<<2) + initval; + + /* Handle most of the key */ + while (length > 3) { + a += k[0]; + b += k[1]; + c += k[2]; + __jhash_mix(a, b, c); + length -= 3; + k += 3; + } + + /* Handle the last 3 u32's: all the case statements fall through */ + switch (length) { + case 3: c += k[2]; + case 2: b += k[1]; + case 1: a += k[0]; + __jhash_final(a, b, c); + case 0: /* Nothing left to add */ + break; + } + + return c; +} + +/* jhash_3words - hash exactly 3, 2 or 1 word(s) */ +static inline u32 jhash_3words(u32 a, u32 b, u32 c, u32 initval) +{ + a += JHASH_INITVAL; + b += JHASH_INITVAL; + c += initval; + + __jhash_final(a, b, c); + + return c; +} + +static inline u32 jhash_2words(u32 a, u32 b, u32 initval) +{ + return jhash_3words(a, b, 0, initval); +} + +static inline u32 jhash_1word(u32 a, u32 initval) +{ + return jhash_3words(a, 0, 0, initval); +} + +#endif /* _LINUX_JHASH_H */ diff --git a/kernel/include/linux/netfilter/ipset/ip_set.h b/kernel/include/linux/netfilter/ipset/ip_set.h new file mode 100644 index 0000000..f2b946f --- /dev/null +++ b/kernel/include/linux/netfilter/ipset/ip_set.h @@ -0,0 +1,479 @@ +/* Copyright (C) 2000-2002 Joakim Axelsson + * Patrick Schaaf + * Martin Josefsson + * Copyright (C) 2003-2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef _IP_SET_H +#define _IP_SET_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define _IP_SET_MODULE_DESC(a, b, c) \ + MODULE_DESCRIPTION(a " type of IP sets, revisions " b "-" c) +#define IP_SET_MODULE_DESC(a, b, c) \ + _IP_SET_MODULE_DESC(a, __stringify(b), __stringify(c)) + +/* Set features */ +enum ip_set_feature { + IPSET_TYPE_IP_FLAG = 0, + IPSET_TYPE_IP = (1 << IPSET_TYPE_IP_FLAG), + IPSET_TYPE_PORT_FLAG = 1, + IPSET_TYPE_PORT = (1 << IPSET_TYPE_PORT_FLAG), + IPSET_TYPE_MAC_FLAG = 2, + IPSET_TYPE_MAC = (1 << IPSET_TYPE_MAC_FLAG), + IPSET_TYPE_IP2_FLAG = 3, + IPSET_TYPE_IP2 = (1 << IPSET_TYPE_IP2_FLAG), + IPSET_TYPE_NAME_FLAG = 4, + IPSET_TYPE_NAME = (1 << IPSET_TYPE_NAME_FLAG), + IPSET_TYPE_IFACE_FLAG = 5, + IPSET_TYPE_IFACE = (1 << IPSET_TYPE_IFACE_FLAG), + IPSET_TYPE_MARK_FLAG = 6, + IPSET_TYPE_MARK = (1 << IPSET_TYPE_MARK_FLAG), + IPSET_TYPE_NOMATCH_FLAG = 7, + IPSET_TYPE_NOMATCH = (1 << IPSET_TYPE_NOMATCH_FLAG), + /* Strictly speaking not a feature, but a flag for dumping: + * this settype must be dumped last */ + IPSET_DUMP_LAST_FLAG = 8, + IPSET_DUMP_LAST = (1 << IPSET_DUMP_LAST_FLAG), +}; + +/* Set extensions */ +enum ip_set_extension { + IPSET_EXT_BIT_TIMEOUT = 0, + IPSET_EXT_TIMEOUT = (1 << IPSET_EXT_BIT_TIMEOUT), + IPSET_EXT_BIT_COUNTER = 1, + IPSET_EXT_COUNTER = (1 << IPSET_EXT_BIT_COUNTER), + IPSET_EXT_BIT_COMMENT = 2, + IPSET_EXT_COMMENT = (1 << IPSET_EXT_BIT_COMMENT), + IPSET_EXT_BIT_SKBINFO = 3, + IPSET_EXT_SKBINFO = (1 << IPSET_EXT_BIT_SKBINFO), + /* Mark set with an extension which needs to call destroy */ + IPSET_EXT_BIT_DESTROY = 7, + IPSET_EXT_DESTROY = (1 << IPSET_EXT_BIT_DESTROY), +}; + +#define SET_WITH_TIMEOUT(s) ((s)->extensions & IPSET_EXT_TIMEOUT) +#define SET_WITH_COUNTER(s) ((s)->extensions & IPSET_EXT_COUNTER) +#define SET_WITH_COMMENT(s) ((s)->extensions & IPSET_EXT_COMMENT) +#define SET_WITH_SKBINFO(s) ((s)->extensions & IPSET_EXT_SKBINFO) +#define SET_WITH_FORCEADD(s) ((s)->flags & IPSET_CREATE_FLAG_FORCEADD) + +/* Extension id, in size order */ +enum ip_set_ext_id { + IPSET_EXT_ID_COUNTER = 0, + IPSET_EXT_ID_TIMEOUT, + IPSET_EXT_ID_SKBINFO, + IPSET_EXT_ID_COMMENT, + IPSET_EXT_ID_MAX, +}; + +struct ip_set; + +/* Extension type */ +struct ip_set_ext_type { + /* Destroy extension private data (can be NULL) */ + void (*destroy)(struct ip_set *set, void *ext); + enum ip_set_extension type; + enum ipset_cadt_flags flag; + /* Size and minimal alignment */ + u8 len; + u8 align; +}; + +extern const struct ip_set_ext_type ip_set_extensions[]; + +struct ip_set_counter { + atomic64_t bytes; + atomic64_t packets; +}; + +struct ip_set_comment_rcu { + struct rcu_head rcu; + char str[0]; +}; + +struct ip_set_comment { + struct ip_set_comment_rcu __rcu *c; +}; + +struct ip_set_skbinfo { + u32 skbmark; + u32 skbmarkmask; + u32 skbprio; + u16 skbqueue; + u16 __pad; +}; + +struct ip_set_ext { + struct ip_set_skbinfo skbinfo; + u64 packets; + u64 bytes; + char *comment; + u32 timeout; + u8 packets_op; + u8 bytes_op; +}; + +struct ip_set; + +#define ext_timeout(e, s) \ +((unsigned long *)(((void *)(e)) + (s)->offset[IPSET_EXT_ID_TIMEOUT])) +#define ext_counter(e, s) \ +((struct ip_set_counter *)(((void *)(e)) + (s)->offset[IPSET_EXT_ID_COUNTER])) +#define ext_comment(e, s) \ +((struct ip_set_comment *)(((void *)(e)) + (s)->offset[IPSET_EXT_ID_COMMENT])) +#define ext_skbinfo(e, s) \ +((struct ip_set_skbinfo *)(((void *)(e)) + (s)->offset[IPSET_EXT_ID_SKBINFO])) + +typedef int (*ipset_adtfn)(struct ip_set *set, void *value, + const struct ip_set_ext *ext, + struct ip_set_ext *mext, u32 cmdflags); + +/* Kernel API function options */ +struct ip_set_adt_opt { + u8 family; /* Actual protocol family */ + u8 dim; /* Dimension of match/target */ + u8 flags; /* Direction and negation flags */ + u32 cmdflags; /* Command-like flags */ + struct ip_set_ext ext; /* Extensions */ +}; + +/* Set type, variant-specific part */ +struct ip_set_type_variant { + /* Kernelspace: test/add/del entries + * returns negative error code, + * zero for no match/success to add/delete + * positive for matching element */ + int (*kadt)(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt); + + /* Userspace: test/add/del entries + * returns negative error code, + * zero for no match/success to add/delete + * positive for matching element */ + int (*uadt)(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried); + + /* Low level add/del/test functions */ + ipset_adtfn adt[IPSET_ADT_MAX]; + + /* When adding entries and set is full, try to resize the set */ + int (*resize)(struct ip_set *set, bool retried); + /* Destroy the set */ + void (*destroy)(struct ip_set *set); + /* Flush the elements */ + void (*flush)(struct ip_set *set); + /* Expire entries before listing */ + void (*expire)(struct ip_set *set); + /* List set header data */ + int (*head)(struct ip_set *set, struct sk_buff *skb); + /* List elements */ + int (*list)(const struct ip_set *set, struct sk_buff *skb, + struct netlink_callback *cb); + /* Keep listing private when resizing runs parallel */ + void (*uref)(struct ip_set *set, struct netlink_callback *cb, + bool start); + + /* Return true if "b" set is the same as "a" + * according to the create set parameters */ + bool (*same_set)(const struct ip_set *a, const struct ip_set *b); +}; + +/* The core set type structure */ +struct ip_set_type { + struct list_head list; + + /* Typename */ + char name[IPSET_MAXNAMELEN]; + /* Protocol version */ + u8 protocol; + /* Set type dimension */ + u8 dimension; + /* + * Supported family: may be NFPROTO_UNSPEC for both + * NFPROTO_IPV4/NFPROTO_IPV6. + */ + u8 family; + /* Type revisions */ + u8 revision_min, revision_max; + /* Set features to control swapping */ + u16 features; + + /* Create set */ + int (*create)(struct net *net, struct ip_set *set, + struct nlattr *tb[], u32 flags); + + /* Attribute policies */ + const struct nla_policy create_policy[IPSET_ATTR_CREATE_MAX + 1]; + const struct nla_policy adt_policy[IPSET_ATTR_ADT_MAX + 1]; + + /* Set this to THIS_MODULE if you are a module, otherwise NULL */ + struct module *me; +}; + +/* register and unregister set type */ +extern int ip_set_type_register(struct ip_set_type *set_type); +extern void ip_set_type_unregister(struct ip_set_type *set_type); + +/* A generic IP set */ +struct ip_set { + /* The name of the set */ + char name[IPSET_MAXNAMELEN]; + /* Lock protecting the set data */ + spinlock_t lock; + /* References to the set */ + u32 ref; + /* References to the set for netlink events like dump, + * ref can be swapped out by ip_set_swap + */ + u32 ref_netlink; + /* The core set type */ + struct ip_set_type *type; + /* The type variant doing the real job */ + const struct ip_set_type_variant *variant; + /* The actual INET family of the set */ + u8 family; + /* The type revision */ + u8 revision; + /* Extensions */ + u8 extensions; + /* Create flags */ + u8 flags; + /* Default timeout value, if enabled */ + u32 timeout; + /* Number of elements (vs timeout) */ + u32 elements; + /* Size of the dynamic extensions (vs timeout) */ + size_t ext_size; + /* Element data size */ + size_t dsize; + /* Offsets to extensions in elements */ + size_t offset[IPSET_EXT_ID_MAX]; + /* The type specific data */ + void *data; +}; + +static inline void +ip_set_ext_destroy(struct ip_set *set, void *data) +{ + /* Check that the extension is enabled for the set and + * call it's destroy function for its extension part in data. + */ + if (SET_WITH_COMMENT(set)) + ip_set_extensions[IPSET_EXT_ID_COMMENT].destroy( + set, ext_comment(data, set)); +} + +static inline int +ip_set_put_flags(struct sk_buff *skb, struct ip_set *set) +{ + u32 cadt_flags = 0; + + if (SET_WITH_TIMEOUT(set)) + if (unlikely(nla_put_net32(skb, IPSET_ATTR_TIMEOUT, + htonl(set->timeout)))) + return -EMSGSIZE; + if (SET_WITH_COUNTER(set)) + cadt_flags |= IPSET_FLAG_WITH_COUNTERS; + if (SET_WITH_COMMENT(set)) + cadt_flags |= IPSET_FLAG_WITH_COMMENT; + if (SET_WITH_SKBINFO(set)) + cadt_flags |= IPSET_FLAG_WITH_SKBINFO; + if (SET_WITH_FORCEADD(set)) + cadt_flags |= IPSET_FLAG_WITH_FORCEADD; + + if (!cadt_flags) + return 0; + return nla_put_net32(skb, IPSET_ATTR_CADT_FLAGS, htonl(cadt_flags)); +} + +/* Netlink CB args */ +enum { + IPSET_CB_NET = 0, /* net namespace */ + IPSET_CB_PROTO, /* ipset protocol */ + IPSET_CB_DUMP, /* dump single set/all sets */ + IPSET_CB_INDEX, /* set index */ + IPSET_CB_PRIVATE, /* set private data */ + IPSET_CB_ARG0, /* type specific */ +}; + +/* register and unregister set references */ +extern ip_set_id_t ip_set_get_byname(struct net *net, + const char *name, struct ip_set **set); +extern void ip_set_put_byindex(struct net *net, ip_set_id_t index); +extern void ip_set_name_byindex(struct net *net, ip_set_id_t index, char *name); +extern ip_set_id_t ip_set_nfnl_get_byindex(struct net *net, ip_set_id_t index); +extern void ip_set_nfnl_put(struct net *net, ip_set_id_t index); + +/* API for iptables set match, and SET target */ + +extern int ip_set_add(ip_set_id_t id, const struct sk_buff *skb, + const struct xt_action_param *par, + struct ip_set_adt_opt *opt); +extern int ip_set_del(ip_set_id_t id, const struct sk_buff *skb, + const struct xt_action_param *par, + struct ip_set_adt_opt *opt); +extern int ip_set_test(ip_set_id_t id, const struct sk_buff *skb, + const struct xt_action_param *par, + struct ip_set_adt_opt *opt); + +/* Utility functions */ +extern void *ip_set_alloc(size_t size); +extern void ip_set_free(void *members); +extern int ip_set_get_ipaddr4(struct nlattr *nla, __be32 *ipaddr); +extern int ip_set_get_ipaddr6(struct nlattr *nla, union nf_inet_addr *ipaddr); +extern size_t ip_set_elem_len(struct ip_set *set, struct nlattr *tb[], + size_t len, size_t align); +extern int ip_set_get_extensions(struct ip_set *set, struct nlattr *tb[], + struct ip_set_ext *ext); +extern int ip_set_put_extensions(struct sk_buff *skb, const struct ip_set *set, + const void *e, bool active); +extern bool ip_set_match_extensions(struct ip_set *set, + const struct ip_set_ext *ext, + struct ip_set_ext *mext, + u32 flags, void *data); + +static inline int +ip_set_get_hostipaddr4(struct nlattr *nla, u32 *ipaddr) +{ + __be32 ip; + int ret = ip_set_get_ipaddr4(nla, &ip); + + if (ret) + return ret; + *ipaddr = ntohl(ip); + return 0; +} + +/* Ignore IPSET_ERR_EXIST errors if asked to do so? */ +static inline bool +ip_set_eexist(int ret, u32 flags) +{ + return ret == -IPSET_ERR_EXIST && (flags & IPSET_FLAG_EXIST); +} + +/* Match elements marked with nomatch */ +static inline bool +ip_set_enomatch(int ret, u32 flags, enum ipset_adt adt, struct ip_set *set) +{ + return adt == IPSET_TEST && + (set->type->features & IPSET_TYPE_NOMATCH) && + ((flags >> 16) & IPSET_FLAG_NOMATCH) && + (ret > 0 || ret == -ENOTEMPTY); +} + +/* Check the NLA_F_NET_BYTEORDER flag */ +static inline bool +ip_set_attr_netorder(struct nlattr *tb[], int type) +{ + return tb[type] && (tb[type]->nla_type & NLA_F_NET_BYTEORDER); +} + +static inline bool +ip_set_optattr_netorder(struct nlattr *tb[], int type) +{ + return !tb[type] || (tb[type]->nla_type & NLA_F_NET_BYTEORDER); +} + +/* Useful converters */ +static inline u32 +ip_set_get_h32(const struct nlattr *attr) +{ + return ntohl(nla_get_be32(attr)); +} + +static inline u16 +ip_set_get_h16(const struct nlattr *attr) +{ + return ntohs(nla_get_be16(attr)); +} + +#define ipset_nest_start(skb, attr) nla_nest_start(skb, attr | NLA_F_NESTED) +#define ipset_nest_end(skb, start) nla_nest_end(skb, start) + +static inline int nla_put_ipaddr4(struct sk_buff *skb, int type, __be32 ipaddr) +{ + struct nlattr *__nested = ipset_nest_start(skb, type); + int ret; + + if (!__nested) + return -EMSGSIZE; + ret = nla_put_in_addr(skb, IPSET_ATTR_IPADDR_IPV4, ipaddr); + if (!ret) + ipset_nest_end(skb, __nested); + return ret; +} + +static inline int nla_put_ipaddr6(struct sk_buff *skb, int type, + const struct in6_addr *ipaddrptr) +{ + struct nlattr *__nested = ipset_nest_start(skb, type); + int ret; + + if (!__nested) + return -EMSGSIZE; + ret = nla_put_in6_addr(skb, IPSET_ATTR_IPADDR_IPV6, ipaddrptr); + if (!ret) + ipset_nest_end(skb, __nested); + return ret; +} + +/* Get address from skbuff */ +static inline __be32 +ip4addr(const struct sk_buff *skb, bool src) +{ + return src ? ip_hdr(skb)->saddr : ip_hdr(skb)->daddr; +} + +static inline void +ip4addrptr(const struct sk_buff *skb, bool src, __be32 *addr) +{ + *addr = src ? ip_hdr(skb)->saddr : ip_hdr(skb)->daddr; +} + +static inline void +ip6addrptr(const struct sk_buff *skb, bool src, struct in6_addr *addr) +{ + memcpy(addr, src ? &ipv6_hdr(skb)->saddr : &ipv6_hdr(skb)->daddr, + sizeof(*addr)); +} + +/* Calculate the bytes required to store the inclusive range of a-b */ +static inline int +bitmap_bytes(u32 a, u32 b) +{ + return 4 * ((((b - a + 8) / 8) + 3) / 4); +} + +#include +#include +#include +#include + + +#define IP_SET_INIT_KEXT(skb, opt, set) \ + { .bytes = (skb)->len, .packets = 1, \ + .timeout = ip_set_adt_opt_timeout(opt, set) } + +#define IP_SET_INIT_UEXT(set) \ + { .bytes = ULLONG_MAX, .packets = ULLONG_MAX, \ + .timeout = (set)->timeout } + +#define IPSET_CONCAT(a, b) a##b +#define IPSET_TOKEN(a, b) IPSET_CONCAT(a, b) + +#endif /*_IP_SET_H */ diff --git a/kernel/include/linux/netfilter/ipset/ip_set_bitmap.h b/kernel/include/linux/netfilter/ipset/ip_set_bitmap.h new file mode 100644 index 0000000..2dddbc6 --- /dev/null +++ b/kernel/include/linux/netfilter/ipset/ip_set_bitmap.h @@ -0,0 +1,29 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __IP_SET_BITMAP_H +#define __IP_SET_BITMAP_H + +#include + +#define IPSET_BITMAP_MAX_RANGE 0x0000FFFF + +enum { + IPSET_ADD_STORE_PLAIN_TIMEOUT = -1, + IPSET_ADD_FAILED = 1, + IPSET_ADD_START_STORED_TIMEOUT, +}; + +/* Common functions */ + +static inline u32 +range_to_mask(u32 from, u32 to, u8 *bits) +{ + u32 mask = 0xFFFFFFFE; + + *bits = 32; + while (--(*bits) > 0 && mask && (to & mask) != from) + mask <<= 1; + + return mask; +} + +#endif /* __IP_SET_BITMAP_H */ diff --git a/kernel/include/linux/netfilter/ipset/ip_set_comment.h b/kernel/include/linux/netfilter/ipset/ip_set_comment.h new file mode 100644 index 0000000..fc481b2 --- /dev/null +++ b/kernel/include/linux/netfilter/ipset/ip_set_comment.h @@ -0,0 +1,76 @@ +#ifndef _IP_SET_COMMENT_H +#define _IP_SET_COMMENT_H + +/* Copyright (C) 2013 Oliver Smith + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifdef __KERNEL__ + +static inline char* +ip_set_comment_uget(struct nlattr *tb) +{ + return nla_data(tb); +} + +/* Called from uadd only, protected by the set spinlock. + * The kadt functions don't use the comment extensions in any way. + */ +static inline void +ip_set_init_comment(struct ip_set *set, struct ip_set_comment *comment, + const struct ip_set_ext *ext) +{ + struct ip_set_comment_rcu *c = rcu_dereference_protected(comment->c, 1); + size_t len = ext->comment ? strlen(ext->comment) : 0; + + if (unlikely(c)) { + set->ext_size -= sizeof(*c) + strlen(c->str) + 1; + kfree_rcu(c, rcu); + rcu_assign_pointer(comment->c, NULL); + } + if (!len) + return; + if (unlikely(len > IPSET_MAX_COMMENT_SIZE)) + len = IPSET_MAX_COMMENT_SIZE; + c = kmalloc(sizeof(*c) + len + 1, GFP_ATOMIC); + if (unlikely(!c)) + return; + strlcpy(c->str, ext->comment, len + 1); + set->ext_size += sizeof(*c) + strlen(c->str) + 1; + rcu_assign_pointer(comment->c, c); +} + +/* Used only when dumping a set, protected by rcu_read_lock() */ +static inline int +ip_set_put_comment(struct sk_buff *skb, const struct ip_set_comment *comment) +{ + struct ip_set_comment_rcu *c = rcu_dereference(comment->c); + + if (!c) + return 0; + return nla_put_string(skb, IPSET_ATTR_COMMENT, c->str); +} + +/* Called from uadd/udel, flush or the garbage collectors protected + * by the set spinlock. + * Called when the set is destroyed and when there can't be any user + * of the set data anymore. + */ +static inline void +ip_set_comment_free(struct ip_set *set, struct ip_set_comment *comment) +{ + struct ip_set_comment_rcu *c; + + c = rcu_dereference_protected(comment->c, 1); + if (unlikely(!c)) + return; + set->ext_size -= sizeof(*c) + strlen(c->str) + 1; + kfree_rcu(c, rcu); + rcu_assign_pointer(comment->c, NULL); +} + +#endif /* __KERNEL__ */ +#endif /* _IP_SET_COMMENT_H */ diff --git a/kernel/include/linux/netfilter/ipset/ip_set_compat.h.in b/kernel/include/linux/netfilter/ipset/ip_set_compat.h.in new file mode 100644 index 0000000..c5da39c --- /dev/null +++ b/kernel/include/linux/netfilter/ipset/ip_set_compat.h.in @@ -0,0 +1,399 @@ +#ifndef __IP_SET_COMPAT_H +#define __IP_SET_COMPAT_H + +/* Not everything could be moved here. Compatibility stuffs can be found in + * xt_set.c, ip_set_core.c, ip_set_getport.c, pfxlen.c too. + */ + +#@HAVE_STRUCT_XT_ACTION_PARAM@ HAVE_STRUCT_XT_ACTION_PARAM +#@HAVE_VZALLOC@ HAVE_VZALLOC +#@HAVE_ETHER_ADDR_EQUAL@ HAVE_ETHER_ADDR_EQUAL +#@HAVE_IS_ZERO_ETHER_ADDR@ HAVE_IS_ZERO_ETHER_ADDR +#@HAVE_NLA_PUT_BE16@ HAVE_NLA_PUT_BE16 +#@HAVE_NLA_PUT_BE64@ HAVE_NLA_PUT_BE64 +#@HAVE_NLA_PUT_64BIT@ HAVE_NLA_PUT_64BIT +#@HAVE_NL_INFO_PORTID@ HAVE_NL_INFO_PORTID +#define HAVE_NETLINK_DUMP_START_ARGS @HAVE_NETLINK_DUMP_START_ARGS@ +#@HAVE_NS_CAPABLE@ HAVE_NS_CAPABLE +#@HAVE_NFNL_LOCK_SUBSYS@ HAVE_NFNL_LOCK_SUBSYS +#@HAVE_EXPORT_H@ HAVE_EXPORT_H +#define HAVE_IPV6_SKIP_EXTHDR_ARGS @HAVE_IPV6_SKIP_EXTHDR_ARGS@ +#@HAVE_CHECKENTRY_BOOL@ HAVE_CHECKENTRY_BOOL +#@HAVE_XT_TARGET_PARAM@ HAVE_XT_TARGET_PARAM +#@HAVE_NET_OPS_ID@ HAVE_NET_OPS_ID +#@HAVE_NET_OPS_ASYNC@ HAVE_NET_OPS_ASYNC +#@HAVE_USER_NS_IN_STRUCT_NET@ HAVE_USER_NS_IN_STRUCT_NET +#@HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE@ HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE +#@HAVE_KVCALLOC@ HAVE_KVCALLOC +#@HAVE_KVFREE@ HAVE_KVFREE +#@HAVE_XT_MTCHK_PARAM_STRUCT_NET@ HAVE_XT_MTCHK_PARAM_STRUCT_NET +#@HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET@ HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET +#@HAVE_TCF_EMATCH_STRUCT_NET@ HAVE_TCF_EMATCH_STRUCT_NET +#@HAVE_LIST_LAST_ENTRY@ HAVE_LIST_LAST_ENTRY +#@HAVE_LIST_NEXT_ENTRY@ HAVE_LIST_NEXT_ENTRY +#@HAVE_ETHER_ADDR_COPY@ HAVE_ETHER_ADDR_COPY +#@HAVE_NF_BRIDGE_GET_PHYSDEV@ HAVE_NF_BRIDGE_GET_PHYSDEV +#@HAVE_NLA_PUT_IN_ADDR@ HAVE_NLA_PUT_IN_ADDR +#@HAVE_NET_IN_NFNL_CALLBACK_FN@ HAVE_NET_IN_NFNL_CALLBACK_FN +#@HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H@ HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H +#@HAVE_TC_SKB_PROTOCOL@ HAVE_TC_SKB_PROTOCOL +#@HAVE_NET_IN_XT_ACTION_PARAM@ HAVE_NET_IN_XT_ACTION_PARAM +#@HAVE_STATE_IN_XT_ACTION_PARAM@ HAVE_STATE_IN_XT_ACTION_PARAM +#@HAVE_XT_FAMILY@ HAVE_XT_FAMILY +#@HAVE_XT_NET@ HAVE_XT_NET +#@HAVE_NFNL_MSG_TYPE@ HAVE_NFNL_MSG_TYPE +#@HAVE_NETLINK_EXTENDED_ACK@ HAVE_NETLINK_EXTENDED_ACK +#@HAVE_PASSING_EXTENDED_ACK_TO_PARSERS@ HAVE_PASSING_EXTENDED_ACK_TO_PARSERS +#@HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS@ HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS +#@HAVE_TYPEDEF_SCTP_SCTPHDR_T@ HAVE_TYPEDEF_SCTP_SCTPHDR_T +#@HAVE_TIMER_SETUP@ HAVE_TIMER_SETUP +#@HAVE_STRSCPY@ HAVE_STRSCPY +#@HAVE_LOCKDEP_NFNL_IS_HELD@ HAVE_LOCKDEP_NFNL_IS_HELD + +#ifdef HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H +#include +#endif + +#ifdef HAVE_EXPORT_H +#include +#endif + +#ifndef IP_SET_COMPAT_HEADERS + +#ifndef CONFIG_IP_SET_MAX +#ifdef IP_SET_MAX +#define CONFIG_IP_SET_MAX IP_SET_MAX +#else +#define CONFIG_IP_SET_MAX 256 +#endif +#endif + +#ifndef IS_ENABLED +#define __X_ARG_PLACEHOLDER_1 0, +#define x_config_enabled(cfg) _x_config_enabled(cfg) +#define _x_config_enabled(value) __x_config_enabled(__X_ARG_PLACEHOLDER_##value) +#define __x_config_enabled(arg1_or_junk) ___x_config_enabled(arg1_or_junk 1, 0) +#define ___x_config_enabled(__ignored, val, ...) val + +#define IS_ENABLED(option) \ + (x_config_enabled(option) || x_config_enabled(option##_MODULE)) +#endif + +#include +#include + +#ifndef rcu_dereference_bh +#define rcu_dereference_bh(p) rcu_dereference(p) +#endif + +#ifndef rcu_dereference_protected +#define rcu_dereference_protected(p, c) (p) +#endif + +#ifndef rcu_dereference_bh_check +#define rcu_dereference_bh_check(p, c) rcu_dereference_bh(p) +#endif + +#ifndef __rcu +#define __rcu +#ifndef RCU_INIT_POINTER +#define RCU_INIT_POINTER(p, v) \ + do { \ + p = v; \ + } while (0) +#endif +#else + +#ifndef RCU_INITIALIZER +#define RCU_INITIALIZER(v) (typeof(*(v)) __force __rcu *)(v) +#endif +#ifndef RCU_INIT_POINTER +#define RCU_INIT_POINTER(p, v) \ + do { \ + p = RCU_INITIALIZER(v); \ + } while (0) +#endif +#endif + +#ifndef kfree_rcu + +static inline void kfree_call_rcu(struct rcu_head *head, + void (*func)(struct rcu_head *rcu)) +{ + call_rcu(head, func); +} + +#define __is_kfree_rcu_offset(offset) ((offset) < 4096) + +#define __kfree_rcu(head, offset) \ +do { \ + BUILD_BUG_ON(!__is_kfree_rcu_offset(offset)); \ + kfree_call_rcu(head, (void (*)(struct rcu_head *))(unsigned long)(offset)); \ +} while (0) + +#define kfree_rcu(ptr, rcu_head) \ + __kfree_rcu(&((ptr)->rcu_head), offsetof(typeof(*(ptr)), rcu_head)) +#endif + +#if 0 +#ifdef CHECK_KCONFIG +#ifndef CONFIG_SPARSE_RCU_POINTER +#error "CONFIG_SPARSE_RCU_POINTER must be enabled" +#endif +#endif +#endif + +#if defined(CONFIG_NETFILTER_NETLINK) || defined(CONFIG_NETFILTER_NETLINK_MODULE) +#else +#error "NETFILTER_NETLINK must be enabled: select NFACCT/NFQUEUE/LOG over NFNETLINK" +#endif + +#ifndef HAVE_STRUCT_XT_ACTION_PARAM +#define xt_action_param xt_match_param +#endif + +#ifndef HAVE_VZALLOC +#define vzalloc(size) __vmalloc(size,\ + GFP_KERNEL|__GFP_ZERO|__GFP_HIGHMEM,\ + PAGE_KERNEL) +#endif + +#if !defined(HAVE_ETHER_ADDR_EQUAL) || !defined(HAVE_IS_ZERO_ETHER_ADDR) +#include + +#ifndef HAVE_ETHER_ADDR_EQUAL +static inline bool ether_addr_equal(const u8 *addr1, const u8 *addr2) +{ + return !compare_ether_addr(addr1, addr2); +} +#endif + +#ifndef HAVE_IS_ZERO_ETHER_ADDR +static inline bool is_zero_ether_addr(const u8 *addr) +{ + return (*(const u16 *)(addr + 0) | + *(const u16 *)(addr + 2) | + *(const u16 *)(addr + 4)) == 0; +} +#endif +#endif + +#ifndef HAVE_NLA_PUT_BE64 +static inline int nla_put_be64(struct sk_buff *skb, int attrtype, __be64 value) +{ + return nla_put(skb, attrtype, sizeof(__be64), &value); +} + +static inline int nla_put_net64(struct sk_buff *skb, int attrtype, __be64 value) +{ + return nla_put_be64(skb, attrtype | NLA_F_NET_BYTEORDER, value); +} +#endif + +#ifdef HAVE_NLA_PUT_64BIT +#define IPSET_NLA_PUT_NET64(skb, t, v, pa) nla_put_net64(skb, t, v, pa) +#else +#define IPSET_NLA_PUT_NET64(skb, t, v, pa) nla_put_net64(skb, t, v) +#endif + +#ifdef HAVE_NL_INFO_PORTID +#define NETLINK_PORTID(skb) NETLINK_CB(skb).portid +#else +#define NETLINK_PORTID(skb) NETLINK_CB(skb).pid +#endif + +#ifndef HAVE_USER_NS_IN_STRUCT_NET +#define ns_capable(ns, cap) capable(cap) +#endif + +#ifndef HAVE_NFNL_LOCK_SUBSYS +#define nfnl_lock(x) nfnl_lock() +#define nfnl_unlock(x) nfnl_unlock() +#endif + +#ifndef HAVE_LOCKDEP_NFNL_IS_HELD +#define lockdep_nfnl_is_held(x) 1 +#endif + +#if HAVE_IPV6_SKIP_EXTHDR_ARGS == 3 +#define ipv6_skip_exthdr(skbuff, start, nexthdrp, frag_offp) \ + ipv6_skip_exthdr(skbuff, start, nexthdrp) +#endif + +#ifndef HAVE_KVCALLOC +#define kvcalloc(n, size, flags) kcalloc(n, size, flags) +#endif + +#ifndef HAVE_KVFREE +#include +static inline void kvfree(const void *addr) +{ + if (is_vmalloc_addr(addr)) + vfree(addr); + else + kfree(addr); +} +#endif + +#ifndef HAVE_NLA_PUT_BE16 +static inline int nla_put_be16(struct sk_buff *skb, int attrtype, __be16 value) +{ + return nla_put(skb, attrtype, sizeof(__be16), &value); +} + +static inline int nla_put_net16(struct sk_buff *skb, int attrtype, __be16 value) +{ + return nla_put_be16(skb, attrtype | NLA_F_NET_BYTEORDER, value); +} + +static inline int nla_put_be32(struct sk_buff *skb, int attrtype, __be32 value) +{ + return nla_put(skb, attrtype, sizeof(__be32), &value); +} + +static inline int nla_put_net32(struct sk_buff *skb, int attrtype, __be32 value) +{ + return nla_put_be32(skb, attrtype | NLA_F_NET_BYTEORDER, value); +} +#endif + +#ifndef HAVE_LIST_LAST_ENTRY +#define list_last_entry(ptr, type, member) \ + list_entry((ptr)->prev, type, member) +#endif +#ifndef HAVE_LIST_NEXT_ENTRY +#define list_next_entry(pos, member) \ + list_entry((pos)->member.next, typeof(*(pos)), member) +#define list_prev_entry(pos, member) \ + list_entry((pos)->member.prev, typeof(*(pos)), member) +#endif + +#ifndef HAVE_ETHER_ADDR_COPY +#define ether_addr_copy(dst, src) memcpy(dst, src, ETH_ALEN) +#endif + +#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER) +#ifndef HAVE_NF_BRIDGE_GET_PHYSDEV +static inline struct net_device * +nf_bridge_get_physindev(const struct sk_buff *skb) +{ + return skb->nf_bridge ? skb->nf_bridge->physindev : NULL; +} + +static inline struct net_device * +nf_bridge_get_physoutdev(const struct sk_buff *skb) +{ + return skb->nf_bridge ? skb->nf_bridge->physoutdev : NULL; +} +#endif +#endif + +#ifndef HAVE_NLA_PUT_IN_ADDR +static inline int nla_put_in_addr(struct sk_buff *skb, int attrtype, + __be32 addr) +{ + return nla_put_be32(skb, attrtype, addr); +} + +static inline int nla_put_in6_addr(struct sk_buff *skb, int attrtype, + const struct in6_addr *addr) +{ + return nla_put(skb, attrtype, sizeof(*addr), addr); +} +#endif + +#ifdef HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS +#define IPSET_CBFN(fn, net, nl, skb, nlh, cda, e) fn(net, nl, skb, nlh, cda, e) +#define IPSET_SOCK_NET(net, ctnl) net +#elif defined(HAVE_NET_IN_NFNL_CALLBACK_FN) +#define IPSET_CBFN(fn, net, nl, skb, nlh, cda, e) fn(net, nl, skb, nlh, cda) +#define IPSET_SOCK_NET(net, ctnl) net +#else +#define IPSET_CBFN(fn, net, nl, skb, nlh, cda,e) fn(nl, skb, nlh, cda) +#define IPSET_SOCK_NET(net, ctnl) sock_net(ctnl) +#endif + +#ifndef HAVE_TC_SKB_PROTOCOL +#include +static inline __be16 tc_skb_protocol(const struct sk_buff *skb) +{ + if (vlan_tx_tag_present(skb)) + return skb->vlan_proto; + return skb->protocol; +} +#endif + +#ifdef HAVE_XT_NET +#define IPSET_DEV_NET(par) xt_net(par) +#elif defined(HAVE_NET_IN_XT_ACTION_PARAM) +#define IPSET_DEV_NET(par) (par)->net +#else +#define IPSET_DEV_NET(par) dev_net((par)->in ? (par)->in : (par)->out) +#endif + +#ifndef HAVE_NFNL_MSG_TYPE +static inline u16 nfnl_msg_type(u8 subsys, u8 msg_type) +{ + return subsys << 8 | msg_type; +} +#endif + +#ifdef HAVE_NETLINK_EXTENDED_ACK +#define NETLINK_ACK(in_skb, nlh, err, extack) netlink_ack(in_skb, nlh, err, extack) +#else +#define NETLINK_ACK(in_skb, nlh, err, extack) netlink_ack(in_skb, nlh, err) +#endif + +#ifdef HAVE_PASSING_EXTENDED_ACK_TO_PARSERS +#define NLA_PARSE(t, m, h, l, p, e) nla_parse(t, m, h, l, p, e) +#define NLA_PARSE_NESTED(t, m, n, p, e) nla_parse_nested(t, m, n, p, e) +#else +#define NLA_PARSE(t, m, h, l, p, e) nla_parse(t, m, h, l, p) +#define NLA_PARSE_NESTED(t, m, n, p, e) nla_parse_nested(t, m, n, p) +#endif + +#ifdef HAVE_STATE_IN_XT_ACTION_PARAM +#define XAP_STATE(par) (par->state) +#else +#define XAP_STATE(par) par +#endif + +#ifdef HAVE_XT_FAMILY +#define XT_FAMILY(par) xt_family(par) +#else +#define XT_FAMILY(par) (par)->family +#endif + +#ifdef HAVE_TIMER_SETUP +#define GC_ARG struct timer_list *t +#define TIMER_SETUP(a, b) timer_setup(a, b, 0) +#define INIT_GC_VARS(type, var) \ + struct type *var = from_timer(var, t, gc); \ + struct ip_set *set = var->set +#else +#define GC_ARG unsigned long ul_set +#define TIMER_SETUP(a, b) setup_timer(a, b, (unsigned long)set) +#define INIT_GC_VARS(type, var) \ + struct ip_set *set = (struct ip_set *)ul_set; \ + struct type *var = set->data +#endif + +#ifndef HAVE_STRSCPY +#define strscpy(dst, src, n) (strncpy(dst, src, n) == (dst)) +#endif + +#ifndef smp_mb__before_atomic +#define smp_mb__before_atomic() smp_mb() +#define smp_mb__after_atomic() smp_mb() +#endif + +#ifndef pr_warn +#define pr_warn pr_warning +#endif + +#ifndef SIZE_MAX +#define SIZE_MAX (~(size_t)0) +#endif + +#endif /* IP_SET_COMPAT_HEADERS */ +#endif /* __IP_SET_COMPAT_H */ diff --git a/kernel/include/linux/netfilter/ipset/ip_set_counter.h b/kernel/include/linux/netfilter/ipset/ip_set_counter.h new file mode 100644 index 0000000..a0d134a --- /dev/null +++ b/kernel/include/linux/netfilter/ipset/ip_set_counter.h @@ -0,0 +1,88 @@ +#ifndef _IP_SET_COUNTER_H +#define _IP_SET_COUNTER_H + +/* Copyright (C) 2015 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifdef __KERNEL__ + +static inline void +ip_set_add_bytes(u64 bytes, struct ip_set_counter *counter) +{ + atomic64_add((long long)bytes, &(counter)->bytes); +} + +static inline void +ip_set_add_packets(u64 packets, struct ip_set_counter *counter) +{ + atomic64_add((long long)packets, &(counter)->packets); +} + +static inline u64 +ip_set_get_bytes(const struct ip_set_counter *counter) +{ + return (u64)atomic64_read(&(counter)->bytes); +} + +static inline u64 +ip_set_get_packets(const struct ip_set_counter *counter) +{ + return (u64)atomic64_read(&(counter)->packets); +} + +static inline bool +ip_set_match_counter(u64 counter, u64 match, u8 op) +{ + switch (op) { + case IPSET_COUNTER_NONE: + return true; + case IPSET_COUNTER_EQ: + return counter == match; + case IPSET_COUNTER_NE: + return counter != match; + case IPSET_COUNTER_LT: + return counter < match; + case IPSET_COUNTER_GT: + return counter > match; + } + return false; +} + +static inline void +ip_set_update_counter(struct ip_set_counter *counter, + const struct ip_set_ext *ext, u32 flags) +{ + if (ext->packets != ULLONG_MAX && + !(flags & IPSET_FLAG_SKIP_COUNTER_UPDATE)) { + ip_set_add_bytes(ext->bytes, counter); + ip_set_add_packets(ext->packets, counter); + } +} + +static inline bool +ip_set_put_counter(struct sk_buff *skb, const struct ip_set_counter *counter) +{ + return IPSET_NLA_PUT_NET64(skb, IPSET_ATTR_BYTES, + cpu_to_be64(ip_set_get_bytes(counter)), + IPSET_ATTR_PAD) || + IPSET_NLA_PUT_NET64(skb, IPSET_ATTR_PACKETS, + cpu_to_be64(ip_set_get_packets(counter)), + IPSET_ATTR_PAD); +} + +static inline void +ip_set_init_counter(struct ip_set_counter *counter, + const struct ip_set_ext *ext) +{ + if (ext->bytes != ULLONG_MAX) + atomic64_set(&(counter)->bytes, (long long)(ext->bytes)); + if (ext->packets != ULLONG_MAX) + atomic64_set(&(counter)->packets, (long long)(ext->packets)); +} + +#endif /* __KERNEL__ */ +#endif /* _IP_SET_COUNTER_H */ diff --git a/kernel/include/linux/netfilter/ipset/ip_set_getport.h b/kernel/include/linux/netfilter/ipset/ip_set_getport.h new file mode 100644 index 0000000..ac6a11d --- /dev/null +++ b/kernel/include/linux/netfilter/ipset/ip_set_getport.h @@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _IP_SET_GETPORT_H +#define _IP_SET_GETPORT_H + +extern bool ip_set_get_ip4_port(const struct sk_buff *skb, bool src, + __be16 *port, u8 *proto); + +#if defined(CONFIG_IP6_NF_IPTABLES) || defined(CONFIG_IP6_NF_IPTABLES_MODULE) +extern bool ip_set_get_ip6_port(const struct sk_buff *skb, bool src, + __be16 *port, u8 *proto); +#else +static inline bool ip_set_get_ip6_port(const struct sk_buff *skb, bool src, + __be16 *port, u8 *proto) +{ + return false; +} +#endif + +extern bool ip_set_get_ip_port(const struct sk_buff *skb, u8 pf, bool src, + __be16 *port); + +static inline bool ip_set_proto_with_ports(u8 proto) +{ + switch (proto) { + case IPPROTO_TCP: + case IPPROTO_SCTP: + case IPPROTO_UDP: + case IPPROTO_UDPLITE: + return true; + } + return false; +} + +#endif /*_IP_SET_GETPORT_H*/ diff --git a/kernel/include/linux/netfilter/ipset/ip_set_hash.h b/kernel/include/linux/netfilter/ipset/ip_set_hash.h new file mode 100644 index 0000000..838abab --- /dev/null +++ b/kernel/include/linux/netfilter/ipset/ip_set_hash.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __IP_SET_HASH_H +#define __IP_SET_HASH_H + +#include + + +#define IPSET_DEFAULT_HASHSIZE 1024 +#define IPSET_MIMINAL_HASHSIZE 64 +#define IPSET_DEFAULT_MAXELEM 65536 +#define IPSET_DEFAULT_PROBES 4 +#define IPSET_DEFAULT_RESIZE 100 + +#endif /* __IP_SET_HASH_H */ diff --git a/kernel/include/linux/netfilter/ipset/ip_set_list.h b/kernel/include/linux/netfilter/ipset/ip_set_list.h new file mode 100644 index 0000000..a61fe2a --- /dev/null +++ b/kernel/include/linux/netfilter/ipset/ip_set_list.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __IP_SET_LIST_H +#define __IP_SET_LIST_H + +#include + + +#define IP_SET_LIST_DEFAULT_SIZE 8 +#define IP_SET_LIST_MIN_SIZE 4 +#define IP_SET_LIST_MAX_SIZE 65536 + +#endif /* __IP_SET_LIST_H */ diff --git a/kernel/include/linux/netfilter/ipset/ip_set_skbinfo.h b/kernel/include/linux/netfilter/ipset/ip_set_skbinfo.h new file mode 100644 index 0000000..51e4ccf --- /dev/null +++ b/kernel/include/linux/netfilter/ipset/ip_set_skbinfo.h @@ -0,0 +1,46 @@ +#ifndef _IP_SET_SKBINFO_H +#define _IP_SET_SKBINFO_H + +/* Copyright (C) 2015 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifdef __KERNEL__ + +static inline void +ip_set_get_skbinfo(struct ip_set_skbinfo *skbinfo, + const struct ip_set_ext *ext, + struct ip_set_ext *mext, u32 flags) +{ + mext->skbinfo = *skbinfo; +} + +static inline bool +ip_set_put_skbinfo(struct sk_buff *skb, const struct ip_set_skbinfo *skbinfo) +{ + /* Send nonzero parameters only */ + return ((skbinfo->skbmark || skbinfo->skbmarkmask) && + IPSET_NLA_PUT_NET64(skb, IPSET_ATTR_SKBMARK, + cpu_to_be64((u64)skbinfo->skbmark << 32 | + skbinfo->skbmarkmask), + IPSET_ATTR_PAD)) || + (skbinfo->skbprio && + nla_put_net32(skb, IPSET_ATTR_SKBPRIO, + cpu_to_be32(skbinfo->skbprio))) || + (skbinfo->skbqueue && + nla_put_net16(skb, IPSET_ATTR_SKBQUEUE, + cpu_to_be16(skbinfo->skbqueue))); +} + +static inline void +ip_set_init_skbinfo(struct ip_set_skbinfo *skbinfo, + const struct ip_set_ext *ext) +{ + *skbinfo = ext->skbinfo; +} + +#endif /* __KERNEL__ */ +#endif /* _IP_SET_SKBINFO_H */ diff --git a/kernel/include/linux/netfilter/ipset/ip_set_timeout.h b/kernel/include/linux/netfilter/ipset/ip_set_timeout.h new file mode 100644 index 0000000..8ce271e --- /dev/null +++ b/kernel/include/linux/netfilter/ipset/ip_set_timeout.h @@ -0,0 +1,81 @@ +#ifndef _IP_SET_TIMEOUT_H +#define _IP_SET_TIMEOUT_H + +/* Copyright (C) 2003-2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifdef __KERNEL__ + +/* How often should the gc be run by default */ +#define IPSET_GC_TIME (3 * 60) + +/* Timeout period depending on the timeout value of the given set */ +#define IPSET_GC_PERIOD(timeout) \ + ((timeout/3) ? min_t(u32, (timeout)/3, IPSET_GC_TIME) : 1) + +/* Entry is set with no timeout value */ +#define IPSET_ELEM_PERMANENT 0 + +/* Set is defined with timeout support: timeout value may be 0 */ +#define IPSET_NO_TIMEOUT UINT_MAX + +/* Max timeout value, see msecs_to_jiffies() in jiffies.h */ +#define IPSET_MAX_TIMEOUT (UINT_MAX >> 1)/MSEC_PER_SEC + +#define ip_set_adt_opt_timeout(opt, set) \ +((opt)->ext.timeout != IPSET_NO_TIMEOUT ? (opt)->ext.timeout : (set)->timeout) + +static inline unsigned int +ip_set_timeout_uget(struct nlattr *tb) +{ + unsigned int timeout = ip_set_get_h32(tb); + + /* Normalize to fit into jiffies */ + if (timeout > IPSET_MAX_TIMEOUT) + timeout = IPSET_MAX_TIMEOUT; + + return timeout; +} + +static inline bool +ip_set_timeout_expired(const unsigned long *t) +{ + return *t != IPSET_ELEM_PERMANENT && time_is_before_jiffies(*t); +} + +static inline void +ip_set_timeout_set(unsigned long *timeout, u32 value) +{ + unsigned long t; + + if (!value) { + *timeout = IPSET_ELEM_PERMANENT; + return; + } + + t = msecs_to_jiffies(value * MSEC_PER_SEC) + jiffies; + if (t == IPSET_ELEM_PERMANENT) + /* Bingo! :-) */ + t--; + *timeout = t; +} + +static inline u32 +ip_set_timeout_get(const unsigned long *timeout) +{ + u32 t; + + if (*timeout == IPSET_ELEM_PERMANENT) + return 0; + + t = jiffies_to_msecs(*timeout - jiffies)/MSEC_PER_SEC; + /* Zero value in userspace means no timeout */ + return t == 0 ? 1 : t; +} + +#endif /* __KERNEL__ */ +#endif /* _IP_SET_TIMEOUT_H */ diff --git a/kernel/include/linux/netfilter/ipset/pfxlen.h b/kernel/include/linux/netfilter/ipset/pfxlen.h new file mode 100644 index 0000000..f59094e --- /dev/null +++ b/kernel/include/linux/netfilter/ipset/pfxlen.h @@ -0,0 +1,54 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _PFXLEN_H +#define _PFXLEN_H + +#include +#include +#include + +/* Prefixlen maps, by Jan Engelhardt */ +extern const union nf_inet_addr ip_set_netmask_map[]; +extern const union nf_inet_addr ip_set_hostmask_map[]; + +static inline __be32 +ip_set_netmask(u8 pfxlen) +{ + return ip_set_netmask_map[pfxlen].ip; +} + +static inline const __be32 * +ip_set_netmask6(u8 pfxlen) +{ + return &ip_set_netmask_map[pfxlen].ip6[0]; +} + +static inline u32 +ip_set_hostmask(u8 pfxlen) +{ + return (__force u32) ip_set_hostmask_map[pfxlen].ip; +} + +static inline const __be32 * +ip_set_hostmask6(u8 pfxlen) +{ + return &ip_set_hostmask_map[pfxlen].ip6[0]; +} + +extern u32 ip_set_range_to_cidr(u32 from, u32 to, u8 *cidr); + +#define ip_set_mask_from_to(from, to, cidr) \ +do { \ + from &= ip_set_hostmask(cidr); \ + to = from | ~ip_set_hostmask(cidr); \ +} while (0) + +static inline void +ip6_netmask(union nf_inet_addr *ip, u8 prefix) +{ + ip->ip6[0] &= ip_set_netmask6(prefix)[0]; + ip->ip6[1] &= ip_set_netmask6(prefix)[1]; + ip->ip6[2] &= ip_set_netmask6(prefix)[2]; + ip->ip6[3] &= ip_set_netmask6(prefix)[3]; +} + +#endif /*_PFXLEN_H */ diff --git a/kernel/include/uapi/linux/netfilter/ipset/ip_set.h b/kernel/include/uapi/linux/netfilter/ipset/ip_set.h new file mode 100644 index 0000000..c83497f --- /dev/null +++ b/kernel/include/uapi/linux/netfilter/ipset/ip_set.h @@ -0,0 +1,309 @@ +/* Copyright (C) 2000-2002 Joakim Axelsson + * Patrick Schaaf + * Martin Josefsson + * Copyright (C) 2003-2011 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef _UAPI_IP_SET_H +#define _UAPI_IP_SET_H + +#include + +/* The protocol versions */ +#define IPSET_PROTOCOL 7 +#define IPSET_PROTOCOL_MIN 6 + +/* The max length of strings including NUL: set and type identifiers */ +#define IPSET_MAXNAMELEN 32 + +/* The maximum permissible comment length we will accept over netlink */ +#define IPSET_MAX_COMMENT_SIZE 255 + +/* Message types and commands */ +enum ipset_cmd { + IPSET_CMD_NONE, + IPSET_CMD_PROTOCOL, /* 1: Return protocol version */ + IPSET_CMD_CREATE, /* 2: Create a new (empty) set */ + IPSET_CMD_DESTROY, /* 3: Destroy a (empty) set */ + IPSET_CMD_FLUSH, /* 4: Remove all elements from a set */ + IPSET_CMD_RENAME, /* 5: Rename a set */ + IPSET_CMD_SWAP, /* 6: Swap two sets */ + IPSET_CMD_LIST, /* 7: List sets */ + IPSET_CMD_SAVE, /* 8: Save sets */ + IPSET_CMD_ADD, /* 9: Add an element to a set */ + IPSET_CMD_DEL, /* 10: Delete an element from a set */ + IPSET_CMD_TEST, /* 11: Test an element in a set */ + IPSET_CMD_HEADER, /* 12: Get set header data only */ + IPSET_CMD_TYPE, /* 13: Get set type */ + IPSET_CMD_GET_BYNAME, /* 14: Get set index by name */ + IPSET_CMD_GET_BYINDEX, /* 15: Get set name by index */ + IPSET_MSG_MAX, /* Netlink message commands */ + + /* Commands in userspace: */ + IPSET_CMD_RESTORE = IPSET_MSG_MAX, /* 16: Enter restore mode */ + IPSET_CMD_HELP, /* 17: Get help */ + IPSET_CMD_VERSION, /* 18: Get program version */ + IPSET_CMD_QUIT, /* 19: Quit from interactive mode */ + + IPSET_CMD_MAX, + + IPSET_CMD_COMMIT = IPSET_CMD_MAX, /* 20: Commit buffered commands */ +}; + +/* Attributes at command level */ +enum { + IPSET_ATTR_UNSPEC, + IPSET_ATTR_PROTOCOL, /* 1: Protocol version */ + IPSET_ATTR_SETNAME, /* 2: Name of the set */ + IPSET_ATTR_TYPENAME, /* 3: Typename */ + IPSET_ATTR_SETNAME2 = IPSET_ATTR_TYPENAME, /* Setname at rename/swap */ + IPSET_ATTR_REVISION, /* 4: Settype revision */ + IPSET_ATTR_FAMILY, /* 5: Settype family */ + IPSET_ATTR_FLAGS, /* 6: Flags at command level */ + IPSET_ATTR_DATA, /* 7: Nested attributes */ + IPSET_ATTR_ADT, /* 8: Multiple data containers */ + IPSET_ATTR_LINENO, /* 9: Restore lineno */ + IPSET_ATTR_PROTOCOL_MIN, /* 10: Minimal supported version number */ + IPSET_ATTR_REVISION_MIN = IPSET_ATTR_PROTOCOL_MIN, /* type rev min */ + IPSET_ATTR_INDEX, /* 11: Kernel index of set */ + __IPSET_ATTR_CMD_MAX, +}; +#define IPSET_ATTR_CMD_MAX (__IPSET_ATTR_CMD_MAX - 1) + +/* CADT specific attributes */ +enum { + IPSET_ATTR_IP = IPSET_ATTR_UNSPEC + 1, + IPSET_ATTR_IP_FROM = IPSET_ATTR_IP, + IPSET_ATTR_IP_TO, /* 2 */ + IPSET_ATTR_CIDR, /* 3 */ + IPSET_ATTR_PORT, /* 4 */ + IPSET_ATTR_PORT_FROM = IPSET_ATTR_PORT, + IPSET_ATTR_PORT_TO, /* 5 */ + IPSET_ATTR_TIMEOUT, /* 6 */ + IPSET_ATTR_PROTO, /* 7 */ + IPSET_ATTR_CADT_FLAGS, /* 8 */ + IPSET_ATTR_CADT_LINENO = IPSET_ATTR_LINENO, /* 9 */ + IPSET_ATTR_MARK, /* 10 */ + IPSET_ATTR_MARKMASK, /* 11 */ + /* Reserve empty slots */ + IPSET_ATTR_CADT_MAX = 16, + /* Create-only specific attributes */ + IPSET_ATTR_GC, + IPSET_ATTR_HASHSIZE, + IPSET_ATTR_MAXELEM, + IPSET_ATTR_NETMASK, + IPSET_ATTR_PROBES, + IPSET_ATTR_RESIZE, + IPSET_ATTR_SIZE, + /* Kernel-only */ + IPSET_ATTR_ELEMENTS, + IPSET_ATTR_REFERENCES, + IPSET_ATTR_MEMSIZE, + + __IPSET_ATTR_CREATE_MAX, +}; +#define IPSET_ATTR_CREATE_MAX (__IPSET_ATTR_CREATE_MAX - 1) + +/* ADT specific attributes */ +enum { + IPSET_ATTR_ETHER = IPSET_ATTR_CADT_MAX + 1, + IPSET_ATTR_NAME, + IPSET_ATTR_NAMEREF, + IPSET_ATTR_IP2, + IPSET_ATTR_CIDR2, + IPSET_ATTR_IP2_TO, + IPSET_ATTR_IFACE, + IPSET_ATTR_BYTES, + IPSET_ATTR_PACKETS, + IPSET_ATTR_COMMENT, + IPSET_ATTR_SKBMARK, + IPSET_ATTR_SKBPRIO, + IPSET_ATTR_SKBQUEUE, + IPSET_ATTR_PAD, + __IPSET_ATTR_ADT_MAX, +}; +#define IPSET_ATTR_ADT_MAX (__IPSET_ATTR_ADT_MAX - 1) + +/* IP specific attributes */ +enum { + IPSET_ATTR_IPADDR_IPV4 = IPSET_ATTR_UNSPEC + 1, + IPSET_ATTR_IPADDR_IPV6, + __IPSET_ATTR_IPADDR_MAX, +}; +#define IPSET_ATTR_IPADDR_MAX (__IPSET_ATTR_IPADDR_MAX - 1) + +/* Error codes */ +enum ipset_errno { + IPSET_ERR_PRIVATE = 4096, + IPSET_ERR_PROTOCOL, + IPSET_ERR_FIND_TYPE, + IPSET_ERR_MAX_SETS, + IPSET_ERR_BUSY, + IPSET_ERR_EXIST_SETNAME2, + IPSET_ERR_TYPE_MISMATCH, + IPSET_ERR_EXIST, + IPSET_ERR_INVALID_CIDR, + IPSET_ERR_INVALID_NETMASK, + IPSET_ERR_INVALID_FAMILY, + IPSET_ERR_TIMEOUT, + IPSET_ERR_REFERENCED, + IPSET_ERR_IPADDR_IPV4, + IPSET_ERR_IPADDR_IPV6, + IPSET_ERR_COUNTER, + IPSET_ERR_COMMENT, + IPSET_ERR_INVALID_MARKMASK, + IPSET_ERR_SKBINFO, + + /* Type specific error codes */ + IPSET_ERR_TYPE_SPECIFIC = 4352, +}; + +/* Flags at command level or match/target flags, lower half of cmdattrs*/ +enum ipset_cmd_flags { + IPSET_FLAG_BIT_EXIST = 0, + IPSET_FLAG_EXIST = (1 << IPSET_FLAG_BIT_EXIST), + IPSET_FLAG_BIT_LIST_SETNAME = 1, + IPSET_FLAG_LIST_SETNAME = (1 << IPSET_FLAG_BIT_LIST_SETNAME), + IPSET_FLAG_BIT_LIST_HEADER = 2, + IPSET_FLAG_LIST_HEADER = (1 << IPSET_FLAG_BIT_LIST_HEADER), + IPSET_FLAG_BIT_SKIP_COUNTER_UPDATE = 3, + IPSET_FLAG_SKIP_COUNTER_UPDATE = + (1 << IPSET_FLAG_BIT_SKIP_COUNTER_UPDATE), + IPSET_FLAG_BIT_SKIP_SUBCOUNTER_UPDATE = 4, + IPSET_FLAG_SKIP_SUBCOUNTER_UPDATE = + (1 << IPSET_FLAG_BIT_SKIP_SUBCOUNTER_UPDATE), + IPSET_FLAG_BIT_MATCH_COUNTERS = 5, + IPSET_FLAG_MATCH_COUNTERS = (1 << IPSET_FLAG_BIT_MATCH_COUNTERS), + IPSET_FLAG_BIT_RETURN_NOMATCH = 7, + IPSET_FLAG_RETURN_NOMATCH = (1 << IPSET_FLAG_BIT_RETURN_NOMATCH), + IPSET_FLAG_BIT_MAP_SKBMARK = 8, + IPSET_FLAG_MAP_SKBMARK = (1 << IPSET_FLAG_BIT_MAP_SKBMARK), + IPSET_FLAG_BIT_MAP_SKBPRIO = 9, + IPSET_FLAG_MAP_SKBPRIO = (1 << IPSET_FLAG_BIT_MAP_SKBPRIO), + IPSET_FLAG_BIT_MAP_SKBQUEUE = 10, + IPSET_FLAG_MAP_SKBQUEUE = (1 << IPSET_FLAG_BIT_MAP_SKBQUEUE), + IPSET_FLAG_CMD_MAX = 15, +}; + +/* Flags at CADT attribute level, upper half of cmdattrs */ +enum ipset_cadt_flags { + IPSET_FLAG_BIT_BEFORE = 0, + IPSET_FLAG_BEFORE = (1 << IPSET_FLAG_BIT_BEFORE), + IPSET_FLAG_BIT_PHYSDEV = 1, + IPSET_FLAG_PHYSDEV = (1 << IPSET_FLAG_BIT_PHYSDEV), + IPSET_FLAG_BIT_NOMATCH = 2, + IPSET_FLAG_NOMATCH = (1 << IPSET_FLAG_BIT_NOMATCH), + IPSET_FLAG_BIT_WITH_COUNTERS = 3, + IPSET_FLAG_WITH_COUNTERS = (1 << IPSET_FLAG_BIT_WITH_COUNTERS), + IPSET_FLAG_BIT_WITH_COMMENT = 4, + IPSET_FLAG_WITH_COMMENT = (1 << IPSET_FLAG_BIT_WITH_COMMENT), + IPSET_FLAG_BIT_WITH_FORCEADD = 5, + IPSET_FLAG_WITH_FORCEADD = (1 << IPSET_FLAG_BIT_WITH_FORCEADD), + IPSET_FLAG_BIT_WITH_SKBINFO = 6, + IPSET_FLAG_WITH_SKBINFO = (1 << IPSET_FLAG_BIT_WITH_SKBINFO), + IPSET_FLAG_CADT_MAX = 15, +}; + +/* The flag bits which correspond to the non-extension create flags */ +enum ipset_create_flags { + IPSET_CREATE_FLAG_BIT_FORCEADD = 0, + IPSET_CREATE_FLAG_FORCEADD = (1 << IPSET_CREATE_FLAG_BIT_FORCEADD), + IPSET_CREATE_FLAG_BIT_MAX = 7, +}; + +/* Commands with settype-specific attributes */ +enum ipset_adt { + IPSET_ADD, + IPSET_DEL, + IPSET_TEST, + IPSET_ADT_MAX, + IPSET_CREATE = IPSET_ADT_MAX, + IPSET_CADT_MAX, +}; + +/* Sets are identified by an index in kernel space. Tweak with ip_set_id_t + * and IPSET_INVALID_ID if you want to increase the max number of sets. + * Also, IPSET_ATTR_INDEX must be changed. + */ +typedef __u16 ip_set_id_t; + +#define IPSET_INVALID_ID 65535 + +enum ip_set_dim { + IPSET_DIM_ZERO = 0, + IPSET_DIM_ONE, + IPSET_DIM_TWO, + IPSET_DIM_THREE, + /* Max dimension in elements. + * If changed, new revision of iptables match/target is required. + */ + IPSET_DIM_MAX = 6, + /* Backward compatibility: set match revision 2 */ + IPSET_BIT_RETURN_NOMATCH = 7, +}; + +/* Option flags for kernel operations */ +enum ip_set_kopt { + IPSET_INV_MATCH = (1 << IPSET_DIM_ZERO), + IPSET_DIM_ONE_SRC = (1 << IPSET_DIM_ONE), + IPSET_DIM_TWO_SRC = (1 << IPSET_DIM_TWO), + IPSET_DIM_THREE_SRC = (1 << IPSET_DIM_THREE), + IPSET_RETURN_NOMATCH = (1 << IPSET_BIT_RETURN_NOMATCH), +}; + +enum { + IPSET_COUNTER_NONE = 0, + IPSET_COUNTER_EQ, + IPSET_COUNTER_NE, + IPSET_COUNTER_LT, + IPSET_COUNTER_GT, +}; + +/* Backward compatibility for set match v3 */ +struct ip_set_counter_match0 { + __u8 op; + __u64 value; +}; + +struct ip_set_counter_match { + __u64 __attribute__((aligned(8))) value; + __u8 op; +}; + +/* Interface to iptables/ip6tables */ + +#define SO_IP_SET 83 + +union ip_set_name_index { + char name[IPSET_MAXNAMELEN]; + ip_set_id_t index; +}; + +#define IP_SET_OP_GET_BYNAME 0x00000006 /* Get set index by name */ +struct ip_set_req_get_set { + unsigned int op; + unsigned int version; + union ip_set_name_index set; +}; + +#define IP_SET_OP_GET_BYINDEX 0x00000007 /* Get set name by index */ +/* Uses ip_set_req_get_set */ + +#define IP_SET_OP_GET_FNAME 0x00000008 /* Get set index and family */ +struct ip_set_req_get_set_family { + unsigned int op; + unsigned int version; + unsigned int family; + union ip_set_name_index set; +}; + +#define IP_SET_OP_VERSION 0x00000100 /* Ask kernel version */ +struct ip_set_req_version { + unsigned int op; + unsigned int version; +}; + +#endif /* _UAPI_IP_SET_H */ diff --git a/kernel/include/uapi/linux/netfilter/ipset/ip_set_bitmap.h b/kernel/include/uapi/linux/netfilter/ipset/ip_set_bitmap.h new file mode 100644 index 0000000..c6b146d --- /dev/null +++ b/kernel/include/uapi/linux/netfilter/ipset/ip_set_bitmap.h @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI__IP_SET_BITMAP_H +#define _UAPI__IP_SET_BITMAP_H + +#include + +/* Bitmap type specific error codes */ +enum { + /* The element is out of the range of the set */ + IPSET_ERR_BITMAP_RANGE = IPSET_ERR_TYPE_SPECIFIC, + /* The range exceeds the size limit of the set type */ + IPSET_ERR_BITMAP_RANGE_SIZE, +}; + + +#endif /* _UAPI__IP_SET_BITMAP_H */ diff --git a/kernel/include/uapi/linux/netfilter/ipset/ip_set_hash.h b/kernel/include/uapi/linux/netfilter/ipset/ip_set_hash.h new file mode 100644 index 0000000..880749a --- /dev/null +++ b/kernel/include/uapi/linux/netfilter/ipset/ip_set_hash.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI__IP_SET_HASH_H +#define _UAPI__IP_SET_HASH_H + +#include + +/* Hash type specific error codes */ +enum { + /* Hash is full */ + IPSET_ERR_HASH_FULL = IPSET_ERR_TYPE_SPECIFIC, + /* Null-valued element */ + IPSET_ERR_HASH_ELEM, + /* Invalid protocol */ + IPSET_ERR_INVALID_PROTO, + /* Protocol missing but must be specified */ + IPSET_ERR_MISSING_PROTO, + /* Range not supported */ + IPSET_ERR_HASH_RANGE_UNSUPPORTED, + /* Invalid range */ + IPSET_ERR_HASH_RANGE, +}; + + +#endif /* _UAPI__IP_SET_HASH_H */ diff --git a/kernel/include/uapi/linux/netfilter/ipset/ip_set_list.h b/kernel/include/uapi/linux/netfilter/ipset/ip_set_list.h new file mode 100644 index 0000000..e6d7feb --- /dev/null +++ b/kernel/include/uapi/linux/netfilter/ipset/ip_set_list.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI__IP_SET_LIST_H +#define _UAPI__IP_SET_LIST_H + +#include + +/* List type specific error codes */ +enum { + /* Set name to be added/deleted/tested does not exist. */ + IPSET_ERR_NAME = IPSET_ERR_TYPE_SPECIFIC, + /* list:set type is not permitted to add */ + IPSET_ERR_LOOP, + /* Missing reference set */ + IPSET_ERR_BEFORE, + /* Reference set does not exist */ + IPSET_ERR_NAMEREF, + /* Set is full */ + IPSET_ERR_LIST_FULL, + /* Reference set is not added to the set */ + IPSET_ERR_REF_EXIST, +}; + + +#endif /* _UAPI__IP_SET_LIST_H */ diff --git a/kernel/include/uapi/linux/netfilter/xt_set.h b/kernel/include/uapi/linux/netfilter/xt_set.h new file mode 100644 index 0000000..8c1ca66 --- /dev/null +++ b/kernel/include/uapi/linux/netfilter/xt_set.h @@ -0,0 +1,94 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _XT_SET_H +#define _XT_SET_H + +#include +#include + +/* Revision 0 interface: backward compatible with netfilter/iptables */ + +/* + * Option flags for kernel operations (xt_set_info_v0) + */ +#define IPSET_SRC 0x01 /* Source match/add */ +#define IPSET_DST 0x02 /* Destination match/add */ +#define IPSET_MATCH_INV 0x04 /* Inverse matching */ + +struct xt_set_info_v0 { + ip_set_id_t index; + union { + __u32 flags[IPSET_DIM_MAX + 1]; + struct { + __u32 __flags[IPSET_DIM_MAX]; + __u8 dim; + __u8 flags; + } compat; + } u; +}; + +/* match and target infos */ +struct xt_set_info_match_v0 { + struct xt_set_info_v0 match_set; +}; + +struct xt_set_info_target_v0 { + struct xt_set_info_v0 add_set; + struct xt_set_info_v0 del_set; +}; + +/* Revision 1 match and target */ + +struct xt_set_info { + ip_set_id_t index; + __u8 dim; + __u8 flags; +}; + +/* match and target infos */ +struct xt_set_info_match_v1 { + struct xt_set_info match_set; +}; + +struct xt_set_info_target_v1 { + struct xt_set_info add_set; + struct xt_set_info del_set; +}; + +/* Revision 2 target */ + +struct xt_set_info_target_v2 { + struct xt_set_info add_set; + struct xt_set_info del_set; + __u32 flags; + __u32 timeout; +}; + +/* Revision 3 match */ + +struct xt_set_info_match_v3 { + struct xt_set_info match_set; + struct ip_set_counter_match0 packets; + struct ip_set_counter_match0 bytes; + __u32 flags; +}; + +/* Revision 3 target */ + +struct xt_set_info_target_v3 { + struct xt_set_info add_set; + struct xt_set_info del_set; + struct xt_set_info map_set; + __u32 flags; + __u32 timeout; +}; + +/* Revision 4 match */ + +struct xt_set_info_match_v4 { + struct xt_set_info match_set; + struct ip_set_counter_match packets; + struct ip_set_counter_match bytes; + __u32 flags; +}; + +#endif /*_XT_SET_H*/ diff --git a/kernel/net/Kbuild b/kernel/net/Kbuild new file mode 100644 index 0000000..d126970 --- /dev/null +++ b/kernel/net/Kbuild @@ -0,0 +1,9 @@ +NOSTDINC_FLAGS += -I$(KDIR)/include +EXTRA_CFLAGS := -DCONFIG_IP_SET_MAX=$(IP_SET_MAX) + +obj-m += netfilter/ +obj-m += sched/ + +# It's for me... +incdirs := $(M) $(KDIR)/include/linux/netfilter $(KDIR)/include/linux/netfilter/ipset +clean-files := $(foreach dir,$(incdirs),$(wildcard $(dir)/*~)) diff --git a/kernel/net/netfilter/Kbuild b/kernel/net/netfilter/Kbuild new file mode 100644 index 0000000..54cbee4 --- /dev/null +++ b/kernel/net/netfilter/Kbuild @@ -0,0 +1,9 @@ +NOSTDINC_FLAGS += -I$(KDIR)/include +EXTRA_CFLAGS := -DCONFIG_IP_SET_MAX=$(IP_SET_MAX) + +obj-m += xt_set.o +obj-m += ipset/ + +# It's for me... +incdirs := $(M) $(KDIR)/include/linux/netfilter $(KDIR)/include/linux/netfilter/ipset +clean-files := $(foreach dir,$(incdirs),$(wildcard $(dir)/*~)) diff --git a/kernel/net/netfilter/Kconfig.ipset b/kernel/net/netfilter/Kconfig.ipset new file mode 100644 index 0000000..7116e98 --- /dev/null +++ b/kernel/net/netfilter/Kconfig.ipset @@ -0,0 +1,22 @@ +menu "Core Netfilter Configuration" + depends on NET && INET && NETFILTER + +if NETFILTER_XTABLES + +config NETFILTER_XT_SET + tristate 'set target and match support' + depends on IP_SET + depends on NETFILTER_ADVANCED + help + This option adds the "SET" target and "set" match. + + Using this target and match, you can add/delete and match + elements in the sets created by ipset(8). + + To compile it as a module, choose M here. If unsure, say N. + +endif # NETFILTER_XTABLES + +endmenu + +source "net/netfilter/ipset/Kconfig" diff --git a/kernel/net/netfilter/Makefile b/kernel/net/netfilter/Makefile new file mode 100644 index 0000000..cb00418 --- /dev/null +++ b/kernel/net/netfilter/Makefile @@ -0,0 +1,11 @@ +ifndef IP_SET_MAX +$(error "Use the toplevel Makefile, not the ones under the kernel/ subdirectory") +endif + +ifneq ($(KERNELRELEASE),) +include Kbuild +else +KERNELDIR := /lib/modules/`uname -r`/build +all:: + $(MAKE) -C $(KERNELDIR) M=`pwd` $@ +endif diff --git a/kernel/net/netfilter/ipset/Kbuild b/kernel/net/netfilter/ipset/Kbuild new file mode 100644 index 0000000..6a1ac92 --- /dev/null +++ b/kernel/net/netfilter/ipset/Kbuild @@ -0,0 +1,15 @@ +NOSTDINC_FLAGS += -I$(KDIR)/include +EXTRA_CFLAGS := -DIP_SET_MAX=$(IP_SET_MAX) + +ip_set-y := ip_set_core.o ip_set_getport.o pfxlen.o +obj-m += ip_set.o +obj-m += ip_set_bitmap_ip.o ip_set_bitmap_ipmac.o ip_set_bitmap_port.o +obj-m += ip_set_hash_ip.o ip_set_hash_ipport.o ip_set_hash_ipportip.o +obj-m += ip_set_hash_ipportnet.o ip_set_hash_ipmac.o ip_set_hash_ipmark.o +obj-m += ip_set_hash_net.o ip_set_hash_netport.o ip_set_hash_netiface.o +obj-m += ip_set_hash_netnet.o ip_set_hash_netportnet.o ip_set_hash_mac.o +obj-m += ip_set_list_set.o + +# It's for me... +incdirs := $(M) +clean-files := $(foreach dir,$(incdirs),$(wildcard $(dir)/*~)) diff --git a/kernel/net/netfilter/ipset/Kconfig b/kernel/net/netfilter/ipset/Kconfig new file mode 100644 index 0000000..861659f --- /dev/null +++ b/kernel/net/netfilter/ipset/Kconfig @@ -0,0 +1,177 @@ +menuconfig IP_SET + tristate "IP set support" + depends on INET && NETFILTER + select NETFILTER_NETLINK + help + This option adds IP set support to the kernel. + In order to define and use the sets, you need the userspace utility + ipset(8). You can use the sets in netfilter via the "set" match + and "SET" target. + + To compile it as a module, choose M here. If unsure, say N. + +if IP_SET + +config IP_SET_MAX + int "Maximum number of IP sets" + default 256 + range 2 65534 + depends on IP_SET + help + You can define here default value of the maximum number + of IP sets for the kernel. + + The value can be overriden by the 'max_sets' module + parameter of the 'ip_set' module. + +config IP_SET_BITMAP_IP + tristate "bitmap:ip set support" + depends on IP_SET + help + This option adds the bitmap:ip set type support, by which one + can store IPv4 addresses (or network addresse) from a range. + + To compile it as a module, choose M here. If unsure, say N. + +config IP_SET_BITMAP_IPMAC + tristate "bitmap:ip,mac set support" + depends on IP_SET + help + This option adds the bitmap:ip,mac set type support, by which one + can store IPv4 address and (source) MAC address pairs from a range. + + To compile it as a module, choose M here. If unsure, say N. + +config IP_SET_BITMAP_PORT + tristate "bitmap:port set support" + depends on IP_SET + help + This option adds the bitmap:port set type support, by which one + can store TCP/UDP port numbers from a range. + + To compile it as a module, choose M here. If unsure, say N. + +config IP_SET_HASH_IP + tristate "hash:ip set support" + depends on IP_SET + help + This option adds the hash:ip set type support, by which one + can store arbitrary IPv4 or IPv6 addresses (or network addresses) + in a set. + + To compile it as a module, choose M here. If unsure, say N. + +config IP_SET_HASH_IPMARK + tristate "hash:ip,mark set support" + depends on IP_SET + help + This option adds the hash:ip,mark set type support, by which one + can store IPv4/IPv6 address and mark pairs. + + To compile it as a module, choose M here. If unsure, say N. + +config IP_SET_HASH_IPPORT + tristate "hash:ip,port set support" + depends on IP_SET + help + This option adds the hash:ip,port set type support, by which one + can store IPv4/IPv6 address and protocol/port pairs. + + To compile it as a module, choose M here. If unsure, say N. + +config IP_SET_HASH_IPPORTIP + tristate "hash:ip,port,ip set support" + depends on IP_SET + help + This option adds the hash:ip,port,ip set type support, by which + one can store IPv4/IPv6 address, protocol/port, and IPv4/IPv6 + address triples in a set. + + To compile it as a module, choose M here. If unsure, say N. + +config IP_SET_HASH_IPPORTNET + tristate "hash:ip,port,net set support" + depends on IP_SET + help + This option adds the hash:ip,port,net set type support, by which + one can store IPv4/IPv6 address, protocol/port, and IPv4/IPv6 + network address/prefix triples in a set. + + To compile it as a module, choose M here. If unsure, say N. + +config IP_SET_HASH_IPMAC + tristate "hash:ip,mac set support" + depends on IP_SET + help + This option adds the hash:ip,mac set type support, by which + one can store IPv4/IPv6 address and MAC (ethernet address) pairs in a set. + + To compile it as a module, choose M here. If unsure, say N. + +config IP_SET_HASH_MAC + tristate "hash:mac set support" + depends on IP_SET + help + This option adds the hash:mac set type support, by which + one can store MAC (ethernet address) elements in a set. + + To compile it as a module, choose M here. If unsure, say N. + +config IP_SET_HASH_NETPORTNET + tristate "hash:net,port,net set support" + depends on IP_SET + help + This option adds the hash:net,port,net set type support, by which + one can store two IPv4/IPv6 subnets, and a protocol/port in a set. + + To compile it as a module, choose M here. If unsure, say N. + +config IP_SET_HASH_NET + tristate "hash:net set support" + depends on IP_SET + help + This option adds the hash:net set type support, by which + one can store IPv4/IPv6 network address/prefix elements in a set. + + To compile it as a module, choose M here. If unsure, say N. + +config IP_SET_HASH_NETNET + tristate "hash:net,net set support" + depends on IP_SET + help + This option adds the hash:net,net set type support, by which + one can store IPv4/IPv6 network address/prefix pairs in a set. + + To compile it as a module, choose M here. If unsure, say N. + +config IP_SET_HASH_NETPORT + tristate "hash:net,port set support" + depends on IP_SET + help + This option adds the hash:net,port set type support, by which + one can store IPv4/IPv6 network address/prefix and + protocol/port pairs as elements in a set. + + To compile it as a module, choose M here. If unsure, say N. + +config IP_SET_HASH_NETIFACE + tristate "hash:net,iface set support" + depends on IP_SET + help + This option adds the hash:net,iface set type support, by which + one can store IPv4/IPv6 network address/prefix and + interface name pairs as elements in a set. + + To compile it as a module, choose M here. If unsure, say N. + +config IP_SET_LIST_SET + tristate "list:set set support" + depends on IP_SET + help + This option adds the list:set set type support. In this + kind of set one can store the name of other sets and it forms + an ordered union of the member sets. + + To compile it as a module, choose M here. If unsure, say N. + +endif # IP_SET diff --git a/kernel/net/netfilter/ipset/Makefile b/kernel/net/netfilter/ipset/Makefile new file mode 100644 index 0000000..e983a60 --- /dev/null +++ b/kernel/net/netfilter/ipset/Makefile @@ -0,0 +1,11 @@ +ifndef IP_SET_MAX +$(error "Use the toplevel Makefile, not the ones in the kernel/ subdirectory") +endif + +ifneq ($(KERNELRELEASE),) +include Kbuild +else +KERNELDIR := /lib/modules/`uname -r`/build +all:: + $(MAKE) -C $(KERNELDIR) M=`pwd` $@ +endif diff --git a/kernel/net/netfilter/ipset/ip_set_bitmap_gen.h b/kernel/net/netfilter/ipset/ip_set_bitmap_gen.h new file mode 100644 index 0000000..4c42e92 --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_bitmap_gen.h @@ -0,0 +1,311 @@ +/* Copyright (C) 2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __IP_SET_BITMAP_IP_GEN_H +#define __IP_SET_BITMAP_IP_GEN_H + +#define mtype_do_test IPSET_TOKEN(MTYPE, _do_test) +#define mtype_gc_test IPSET_TOKEN(MTYPE, _gc_test) +#define mtype_is_filled IPSET_TOKEN(MTYPE, _is_filled) +#define mtype_do_add IPSET_TOKEN(MTYPE, _do_add) +#define mtype_ext_cleanup IPSET_TOKEN(MTYPE, _ext_cleanup) +#define mtype_do_del IPSET_TOKEN(MTYPE, _do_del) +#define mtype_do_list IPSET_TOKEN(MTYPE, _do_list) +#define mtype_do_head IPSET_TOKEN(MTYPE, _do_head) +#define mtype_adt_elem IPSET_TOKEN(MTYPE, _adt_elem) +#define mtype_add_timeout IPSET_TOKEN(MTYPE, _add_timeout) +#define mtype_gc_init IPSET_TOKEN(MTYPE, _gc_init) +#define mtype_kadt IPSET_TOKEN(MTYPE, _kadt) +#define mtype_uadt IPSET_TOKEN(MTYPE, _uadt) +#define mtype_destroy IPSET_TOKEN(MTYPE, _destroy) +#define mtype_memsize IPSET_TOKEN(MTYPE, _memsize) +#define mtype_flush IPSET_TOKEN(MTYPE, _flush) +#define mtype_head IPSET_TOKEN(MTYPE, _head) +#define mtype_same_set IPSET_TOKEN(MTYPE, _same_set) +#define mtype_elem IPSET_TOKEN(MTYPE, _elem) +#define mtype_test IPSET_TOKEN(MTYPE, _test) +#define mtype_add IPSET_TOKEN(MTYPE, _add) +#define mtype_del IPSET_TOKEN(MTYPE, _del) +#define mtype_list IPSET_TOKEN(MTYPE, _list) +#define mtype_gc IPSET_TOKEN(MTYPE, _gc) +#define mtype MTYPE + +#define get_ext(set, map, id) ((map)->extensions + ((set)->dsize * (id))) + +static void +mtype_gc_init(struct ip_set *set, void (*gc)(GC_ARG)) +{ + struct mtype *map = set->data; + + TIMER_SETUP(&map->gc, gc); + mod_timer(&map->gc, jiffies + IPSET_GC_PERIOD(set->timeout) * HZ); +} + +static void +mtype_ext_cleanup(struct ip_set *set) +{ + struct mtype *map = set->data; + u32 id; + + for (id = 0; id < map->elements; id++) + if (test_bit(id, map->members)) + ip_set_ext_destroy(set, get_ext(set, map, id)); +} + +static void +mtype_destroy(struct ip_set *set) +{ + struct mtype *map = set->data; + + if (SET_WITH_TIMEOUT(set)) + del_timer_sync(&map->gc); + + ip_set_free(map->members); + if (set->dsize && set->extensions & IPSET_EXT_DESTROY) + mtype_ext_cleanup(set); + ip_set_free(map); + + set->data = NULL; +} + +static void +mtype_flush(struct ip_set *set) +{ + struct mtype *map = set->data; + + if (set->extensions & IPSET_EXT_DESTROY) + mtype_ext_cleanup(set); + memset(map->members, 0, map->memsize); + set->elements = 0; + set->ext_size = 0; +} + +/* Calculate the actual memory size of the set data */ +static size_t +mtype_memsize(const struct mtype *map, size_t dsize) +{ + size_t memsize = sizeof(*map) + + map->memsize + + map->elements * dsize; + return memsize; +} + +static int +mtype_head(struct ip_set *set, struct sk_buff *skb) +{ + const struct mtype *map = set->data; + struct nlattr *nested; + size_t memsize = mtype_memsize(map, set->dsize) + set->ext_size; + + nested = ipset_nest_start(skb, IPSET_ATTR_DATA); + if (!nested) + goto nla_put_failure; + if (mtype_do_head(skb, map) || + nla_put_net32(skb, IPSET_ATTR_REFERENCES, htonl(set->ref)) || + nla_put_net32(skb, IPSET_ATTR_MEMSIZE, htonl(memsize)) || + nla_put_net32(skb, IPSET_ATTR_ELEMENTS, htonl(set->elements))) + goto nla_put_failure; + if (unlikely(ip_set_put_flags(skb, set))) + goto nla_put_failure; + ipset_nest_end(skb, nested); + + return 0; +nla_put_failure: + return -EMSGSIZE; +} + +static int +mtype_test(struct ip_set *set, void *value, const struct ip_set_ext *ext, + struct ip_set_ext *mext, u32 flags) +{ + struct mtype *map = set->data; + const struct mtype_adt_elem *e = value; + void *x = get_ext(set, map, e->id); + int ret = mtype_do_test(e, map, set->dsize); + + if (ret <= 0) + return ret; + return ip_set_match_extensions(set, ext, mext, flags, x); +} + +static int +mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext, + struct ip_set_ext *mext, u32 flags) +{ + struct mtype *map = set->data; + const struct mtype_adt_elem *e = value; + void *x = get_ext(set, map, e->id); + int ret = mtype_do_add(e, map, flags, set->dsize); + + if (ret == IPSET_ADD_FAILED) { + if (SET_WITH_TIMEOUT(set) && + ip_set_timeout_expired(ext_timeout(x, set))) { + set->elements--; + ret = 0; + } else if (!(flags & IPSET_FLAG_EXIST)) { + set_bit(e->id, map->members); + return -IPSET_ERR_EXIST; + } + /* Element is re-added, cleanup extensions */ + ip_set_ext_destroy(set, x); + } + if (ret > 0) + set->elements--; + + if (SET_WITH_TIMEOUT(set)) +#ifdef IP_SET_BITMAP_STORED_TIMEOUT + mtype_add_timeout(ext_timeout(x, set), e, ext, set, map, ret); +#else + ip_set_timeout_set(ext_timeout(x, set), ext->timeout); +#endif + + if (SET_WITH_COUNTER(set)) + ip_set_init_counter(ext_counter(x, set), ext); + if (SET_WITH_COMMENT(set)) + ip_set_init_comment(set, ext_comment(x, set), ext); + if (SET_WITH_SKBINFO(set)) + ip_set_init_skbinfo(ext_skbinfo(x, set), ext); + + /* Activate element */ + set_bit(e->id, map->members); + set->elements++; + + return 0; +} + +static int +mtype_del(struct ip_set *set, void *value, const struct ip_set_ext *ext, + struct ip_set_ext *mext, u32 flags) +{ + struct mtype *map = set->data; + const struct mtype_adt_elem *e = value; + void *x = get_ext(set, map, e->id); + + if (mtype_do_del(e, map)) + return -IPSET_ERR_EXIST; + + ip_set_ext_destroy(set, x); + set->elements--; + if (SET_WITH_TIMEOUT(set) && + ip_set_timeout_expired(ext_timeout(x, set))) + return -IPSET_ERR_EXIST; + + return 0; +} + +#ifndef IP_SET_BITMAP_STORED_TIMEOUT +static inline bool +mtype_is_filled(const struct mtype_elem *x) +{ + return true; +} +#endif + +static int +mtype_list(const struct ip_set *set, + struct sk_buff *skb, struct netlink_callback *cb) +{ + struct mtype *map = set->data; + struct nlattr *adt, *nested; + void *x; + u32 id, first = cb->args[IPSET_CB_ARG0]; + int ret = 0; + + adt = ipset_nest_start(skb, IPSET_ATTR_ADT); + if (!adt) + return -EMSGSIZE; + /* Extensions may be replaced */ + rcu_read_lock(); + for (; cb->args[IPSET_CB_ARG0] < map->elements; + cb->args[IPSET_CB_ARG0]++) { + cond_resched_rcu(); + id = cb->args[IPSET_CB_ARG0]; + x = get_ext(set, map, id); + if (!test_bit(id, map->members) || + (SET_WITH_TIMEOUT(set) && +#ifdef IP_SET_BITMAP_STORED_TIMEOUT + mtype_is_filled(x) && +#endif + ip_set_timeout_expired(ext_timeout(x, set)))) + continue; + nested = ipset_nest_start(skb, IPSET_ATTR_DATA); + if (!nested) { + if (id == first) { + nla_nest_cancel(skb, adt); + ret = -EMSGSIZE; + goto out; + } + + goto nla_put_failure; + } + if (mtype_do_list(skb, map, id, set->dsize)) + goto nla_put_failure; + if (ip_set_put_extensions(skb, set, x, mtype_is_filled(x))) + goto nla_put_failure; + ipset_nest_end(skb, nested); + } + ipset_nest_end(skb, adt); + + /* Set listing finished */ + cb->args[IPSET_CB_ARG0] = 0; + + goto out; + +nla_put_failure: + nla_nest_cancel(skb, nested); + if (unlikely(id == first)) { + cb->args[IPSET_CB_ARG0] = 0; + ret = -EMSGSIZE; + } + ipset_nest_end(skb, adt); +out: + rcu_read_unlock(); + return ret; +} + +static void +mtype_gc(GC_ARG) +{ + INIT_GC_VARS(mtype, map); + void *x; + u32 id; + + /* We run parallel with other readers (test element) + * but adding/deleting new entries is locked out + */ + spin_lock_bh(&set->lock); + for (id = 0; id < map->elements; id++) + if (mtype_gc_test(id, map, set->dsize)) { + x = get_ext(set, map, id); + if (ip_set_timeout_expired(ext_timeout(x, set))) { + clear_bit(id, map->members); + ip_set_ext_destroy(set, x); + set->elements--; + } + } + spin_unlock_bh(&set->lock); + + map->gc.expires = jiffies + IPSET_GC_PERIOD(set->timeout) * HZ; + add_timer(&map->gc); +} + +static const struct ip_set_type_variant mtype = { + .kadt = mtype_kadt, + .uadt = mtype_uadt, + .adt = { + [IPSET_ADD] = mtype_add, + [IPSET_DEL] = mtype_del, + [IPSET_TEST] = mtype_test, + }, + .destroy = mtype_destroy, + .flush = mtype_flush, + .head = mtype_head, + .list = mtype_list, + .same_set = mtype_same_set, +}; + +#endif /* __IP_SET_BITMAP_IP_GEN_H */ diff --git a/kernel/net/netfilter/ipset/ip_set_bitmap_ip.c b/kernel/net/netfilter/ipset/ip_set_bitmap_ip.c new file mode 100644 index 0000000..d3e0174 --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_bitmap_ip.c @@ -0,0 +1,382 @@ +/* Copyright (C) 2000-2002 Joakim Axelsson + * Patrick Schaaf + * Copyright (C) 2003-2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module implementing an IP set type: the bitmap:ip type */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define IPSET_TYPE_REV_MIN 0 +/* 1 Counter support added */ +/* 2 Comment support added */ +#define IPSET_TYPE_REV_MAX 3 /* skbinfo support added */ + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Jozsef Kadlecsik "); +IP_SET_MODULE_DESC("bitmap:ip", IPSET_TYPE_REV_MIN, IPSET_TYPE_REV_MAX); +MODULE_ALIAS("ip_set_bitmap:ip"); + +#define MTYPE bitmap_ip +#define HOST_MASK 32 + +/* Type structure */ +struct bitmap_ip { + void *members; /* the set members */ + u32 first_ip; /* host byte order, included in range */ + u32 last_ip; /* host byte order, included in range */ + u32 elements; /* number of max elements in the set */ + u32 hosts; /* number of hosts in a subnet */ + size_t memsize; /* members size */ + u8 netmask; /* subnet netmask */ + struct timer_list gc; /* garbage collection */ +#ifdef HAVE_TIMER_SETUP + struct ip_set *set; /* attached to this ip_set */ +#endif + unsigned char extensions[0] /* data extensions */ + __aligned(__alignof__(u64)); +}; + +/* ADT structure for generic function args */ +struct bitmap_ip_adt_elem { + u16 id; +}; + +static inline u32 +ip_to_id(const struct bitmap_ip *m, u32 ip) +{ + return ((ip & ip_set_hostmask(m->netmask)) - m->first_ip) / m->hosts; +} + +/* Common functions */ + +static inline int +bitmap_ip_do_test(const struct bitmap_ip_adt_elem *e, + struct bitmap_ip *map, size_t dsize) +{ + return !!test_bit(e->id, map->members); +} + +static inline int +bitmap_ip_gc_test(u16 id, const struct bitmap_ip *map, size_t dsize) +{ + return !!test_bit(id, map->members); +} + +static inline int +bitmap_ip_do_add(const struct bitmap_ip_adt_elem *e, struct bitmap_ip *map, + u32 flags, size_t dsize) +{ + return !!test_bit(e->id, map->members); +} + +static inline int +bitmap_ip_do_del(const struct bitmap_ip_adt_elem *e, struct bitmap_ip *map) +{ + return !test_and_clear_bit(e->id, map->members); +} + +static inline int +bitmap_ip_do_list(struct sk_buff *skb, const struct bitmap_ip *map, u32 id, + size_t dsize) +{ + return nla_put_ipaddr4(skb, IPSET_ATTR_IP, + htonl(map->first_ip + id * map->hosts)); +} + +static inline int +bitmap_ip_do_head(struct sk_buff *skb, const struct bitmap_ip *map) +{ + return nla_put_ipaddr4(skb, IPSET_ATTR_IP, htonl(map->first_ip)) || + nla_put_ipaddr4(skb, IPSET_ATTR_IP_TO, htonl(map->last_ip)) || + (map->netmask != 32 && + nla_put_u8(skb, IPSET_ATTR_NETMASK, map->netmask)); +} + +static int +bitmap_ip_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + struct bitmap_ip *map = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct bitmap_ip_adt_elem e = { .id = 0 }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + u32 ip; + + ip = ntohl(ip4addr(skb, opt->flags & IPSET_DIM_ONE_SRC)); + if (ip < map->first_ip || ip > map->last_ip) + return -IPSET_ERR_BITMAP_RANGE; + + e.id = ip_to_id(map, ip); + + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +bitmap_ip_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + struct bitmap_ip *map = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + u32 ip = 0, ip_to = 0; + struct bitmap_ip_adt_elem e = { .id = 0 }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + int ret = 0; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP])) + return -IPSET_ERR_PROTOCOL; + + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP], &ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + if (ip < map->first_ip || ip > map->last_ip) + return -IPSET_ERR_BITMAP_RANGE; + + if (adt == IPSET_TEST) { + e.id = ip_to_id(map, ip); + return adtfn(set, &e, &ext, &ext, flags); + } + + if (tb[IPSET_ATTR_IP_TO]) { + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); + if (ret) + return ret; + if (ip > ip_to) { + swap(ip, ip_to); + if (ip < map->first_ip) + return -IPSET_ERR_BITMAP_RANGE; + } + } else if (tb[IPSET_ATTR_CIDR]) { + u8 cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + + if (!cidr || cidr > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + ip_set_mask_from_to(ip, ip_to, cidr); + } else { + ip_to = ip; + } + + if (ip_to > map->last_ip) + return -IPSET_ERR_BITMAP_RANGE; + + for (; !before(ip_to, ip); ip += map->hosts) { + e.id = ip_to_id(map, ip); + ret = adtfn(set, &e, &ext, &ext, flags); + + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + ret = 0; + } + return ret; +} + +static bool +bitmap_ip_same_set(const struct ip_set *a, const struct ip_set *b) +{ + const struct bitmap_ip *x = a->data; + const struct bitmap_ip *y = b->data; + + return x->first_ip == y->first_ip && + x->last_ip == y->last_ip && + x->netmask == y->netmask && + a->timeout == b->timeout && + a->extensions == b->extensions; +} + +/* Plain variant */ + +struct bitmap_ip_elem { +}; + +#include "ip_set_bitmap_gen.h" + +/* Create bitmap:ip type of sets */ + +static bool +init_map_ip(struct ip_set *set, struct bitmap_ip *map, + u32 first_ip, u32 last_ip, + u32 elements, u32 hosts, u8 netmask) +{ + map->members = ip_set_alloc(map->memsize); + if (!map->members) + return false; + map->first_ip = first_ip; + map->last_ip = last_ip; + map->elements = elements; + map->hosts = hosts; + map->netmask = netmask; + set->timeout = IPSET_NO_TIMEOUT; + +#ifdef HAVE_TIMER_SETUP + map->set = set; +#endif + set->data = map; + set->family = NFPROTO_IPV4; + + return true; +} + +static int +bitmap_ip_create(struct net *net, struct ip_set *set, struct nlattr *tb[], + u32 flags) +{ + struct bitmap_ip *map; + u32 first_ip = 0, last_ip = 0, hosts; + u64 elements; + u8 netmask = 32; + int ret; + + if (unlikely(!tb[IPSET_ATTR_IP] || + !ip_set_optattr_netorder(tb, IPSET_ATTR_TIMEOUT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP], &first_ip); + if (ret) + return ret; + + if (tb[IPSET_ATTR_IP_TO]) { + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &last_ip); + if (ret) + return ret; + if (first_ip > last_ip) + swap(first_ip, last_ip); + } else if (tb[IPSET_ATTR_CIDR]) { + u8 cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + + if (cidr >= HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + ip_set_mask_from_to(first_ip, last_ip, cidr); + } else { + return -IPSET_ERR_PROTOCOL; + } + + if (tb[IPSET_ATTR_NETMASK]) { + netmask = nla_get_u8(tb[IPSET_ATTR_NETMASK]); + + if (netmask > HOST_MASK) + return -IPSET_ERR_INVALID_NETMASK; + + first_ip &= ip_set_hostmask(netmask); + last_ip |= ~ip_set_hostmask(netmask); + } + + if (netmask == 32) { + hosts = 1; + elements = (u64)last_ip - first_ip + 1; + } else { + u8 mask_bits; + u32 mask; + + mask = range_to_mask(first_ip, last_ip, &mask_bits); + + if ((!mask && (first_ip || last_ip != 0xFFFFFFFF)) || + netmask <= mask_bits) + return -IPSET_ERR_BITMAP_RANGE; + + pr_debug("mask_bits %u, netmask %u\n", mask_bits, netmask); + hosts = 2 << (32 - netmask - 1); + elements = 2 << (netmask - mask_bits - 1); + } + if (elements > IPSET_BITMAP_MAX_RANGE + 1) + return -IPSET_ERR_BITMAP_RANGE_SIZE; + + pr_debug("hosts %u, elements %llu\n", + hosts, (unsigned long long)elements); + + set->dsize = ip_set_elem_len(set, tb, 0, 0); + map = ip_set_alloc(sizeof(*map) + elements * set->dsize); + if (!map) + return -ENOMEM; + + map->memsize = bitmap_bytes(0, elements - 1); + set->variant = &bitmap_ip; + if (!init_map_ip(set, map, first_ip, last_ip, + elements, hosts, netmask)) { + kfree(map); + return -ENOMEM; + } + if (tb[IPSET_ATTR_TIMEOUT]) { + set->timeout = ip_set_timeout_uget(tb[IPSET_ATTR_TIMEOUT]); + bitmap_ip_gc_init(set, bitmap_ip_gc); + } + return 0; +} + +static struct ip_set_type bitmap_ip_type __read_mostly = { + .name = "bitmap:ip", + .protocol = IPSET_PROTOCOL, + .features = IPSET_TYPE_IP, + .dimension = IPSET_DIM_ONE, + .family = NFPROTO_IPV4, + .revision_min = IPSET_TYPE_REV_MIN, + .revision_max = IPSET_TYPE_REV_MAX, + .create = bitmap_ip_create, + .create_policy = { + [IPSET_ATTR_IP] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP_TO] = { .type = NLA_NESTED }, + [IPSET_ATTR_CIDR] = { .type = NLA_U8 }, + [IPSET_ATTR_NETMASK] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + }, + .adt_policy = { + [IPSET_ATTR_IP] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP_TO] = { .type = NLA_NESTED }, + [IPSET_ATTR_CIDR] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_LINENO] = { .type = NLA_U32 }, + [IPSET_ATTR_BYTES] = { .type = NLA_U64 }, + [IPSET_ATTR_PACKETS] = { .type = NLA_U64 }, + [IPSET_ATTR_COMMENT] = { .type = NLA_NUL_STRING, + .len = IPSET_MAX_COMMENT_SIZE }, + [IPSET_ATTR_SKBMARK] = { .type = NLA_U64 }, + [IPSET_ATTR_SKBPRIO] = { .type = NLA_U32 }, + [IPSET_ATTR_SKBQUEUE] = { .type = NLA_U16 }, + }, + .me = THIS_MODULE, +}; + +static int __init +bitmap_ip_init(void) +{ + return ip_set_type_register(&bitmap_ip_type); +} + +static void __exit +bitmap_ip_fini(void) +{ + rcu_barrier(); + ip_set_type_unregister(&bitmap_ip_type); +} + +module_init(bitmap_ip_init); +module_exit(bitmap_ip_fini); diff --git a/kernel/net/netfilter/ipset/ip_set_bitmap_ipmac.c b/kernel/net/netfilter/ipset/ip_set_bitmap_ipmac.c new file mode 100644 index 0000000..b034f9e --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_bitmap_ipmac.c @@ -0,0 +1,431 @@ +/* Copyright (C) 2000-2002 Joakim Axelsson + * Patrick Schaaf + * Martin Josefsson + * Copyright (C) 2003-2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module implementing an IP set type: the bitmap:ip,mac type */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define IPSET_TYPE_REV_MIN 0 +/* 1 Counter support added */ +/* 2 Comment support added */ +#define IPSET_TYPE_REV_MAX 3 /* skbinfo support added */ + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Jozsef Kadlecsik "); +IP_SET_MODULE_DESC("bitmap:ip,mac", IPSET_TYPE_REV_MIN, IPSET_TYPE_REV_MAX); +MODULE_ALIAS("ip_set_bitmap:ip,mac"); + +#define MTYPE bitmap_ipmac +#define HOST_MASK 32 +#define IP_SET_BITMAP_STORED_TIMEOUT + +enum { + MAC_UNSET, /* element is set, without MAC */ + MAC_FILLED, /* element is set with MAC */ +}; + +/* Type structure */ +struct bitmap_ipmac { + void *members; /* the set members */ + u32 first_ip; /* host byte order, included in range */ + u32 last_ip; /* host byte order, included in range */ + u32 elements; /* number of max elements in the set */ + size_t memsize; /* members size */ + struct timer_list gc; /* garbage collector */ +#ifdef HAVE_TIMER_SETUP + struct ip_set *set; /* attached to this ip_set */ +#endif + unsigned char extensions[0] /* MAC + data extensions */ + __aligned(__alignof__(u64)); +}; + +/* ADT structure for generic function args */ +struct bitmap_ipmac_adt_elem { + unsigned char ether[ETH_ALEN] __aligned(2); + u16 id; + u16 add_mac; +}; + +struct bitmap_ipmac_elem { + unsigned char ether[ETH_ALEN]; + unsigned char filled; +} __aligned(__alignof__(u64)); + +static inline u32 +ip_to_id(const struct bitmap_ipmac *m, u32 ip) +{ + return ip - m->first_ip; +} + +#define get_elem(extensions, id, dsize) \ + (struct bitmap_ipmac_elem *)(extensions + (id) * (dsize)) + +#define get_const_elem(extensions, id, dsize) \ + (const struct bitmap_ipmac_elem *)(extensions + (id) * (dsize)) + +/* Common functions */ + +static inline int +bitmap_ipmac_do_test(const struct bitmap_ipmac_adt_elem *e, + const struct bitmap_ipmac *map, size_t dsize) +{ + const struct bitmap_ipmac_elem *elem; + + if (!test_bit(e->id, map->members)) + return 0; + elem = get_const_elem(map->extensions, e->id, dsize); + if (e->add_mac && elem->filled == MAC_FILLED) + return ether_addr_equal(e->ether, elem->ether); + /* Trigger kernel to fill out the ethernet address */ + return -EAGAIN; +} + +static inline int +bitmap_ipmac_gc_test(u16 id, const struct bitmap_ipmac *map, size_t dsize) +{ + const struct bitmap_ipmac_elem *elem; + + if (!test_bit(id, map->members)) + return 0; + elem = get_const_elem(map->extensions, id, dsize); + /* Timer not started for the incomplete elements */ + return elem->filled == MAC_FILLED; +} + +static inline int +bitmap_ipmac_is_filled(const struct bitmap_ipmac_elem *elem) +{ + return elem->filled == MAC_FILLED; +} + +static inline int +bitmap_ipmac_add_timeout(unsigned long *timeout, + const struct bitmap_ipmac_adt_elem *e, + const struct ip_set_ext *ext, struct ip_set *set, + struct bitmap_ipmac *map, int mode) +{ + u32 t = ext->timeout; + + if (mode == IPSET_ADD_START_STORED_TIMEOUT) { + if (t == set->timeout) + /* Timeout was not specified, get stored one */ + t = *timeout; + ip_set_timeout_set(timeout, t); + } else { + /* If MAC is unset yet, we store plain timeout value + * because the timer is not activated yet + * and we can reuse it later when MAC is filled out, + * possibly by the kernel + */ + if (e->add_mac) + ip_set_timeout_set(timeout, t); + else + *timeout = t; + } + return 0; +} + +static inline int +bitmap_ipmac_do_add(const struct bitmap_ipmac_adt_elem *e, + struct bitmap_ipmac *map, u32 flags, size_t dsize) +{ + struct bitmap_ipmac_elem *elem; + + elem = get_elem(map->extensions, e->id, dsize); + if (test_bit(e->id, map->members)) { + if (elem->filled == MAC_FILLED) { + if (e->add_mac && + (flags & IPSET_FLAG_EXIST) && + !ether_addr_equal(e->ether, elem->ether)) { + /* memcpy isn't atomic */ + clear_bit(e->id, map->members); + smp_mb__after_atomic(); + ether_addr_copy(elem->ether, e->ether); + } + return IPSET_ADD_FAILED; + } else if (!e->add_mac) + /* Already added without ethernet address */ + return IPSET_ADD_FAILED; + /* Fill the MAC address and trigger the timer activation */ + clear_bit(e->id, map->members); + smp_mb__after_atomic(); + ether_addr_copy(elem->ether, e->ether); + elem->filled = MAC_FILLED; + return IPSET_ADD_START_STORED_TIMEOUT; + } else if (e->add_mac) { + /* We can store MAC too */ + ether_addr_copy(elem->ether, e->ether); + elem->filled = MAC_FILLED; + return 0; + } + elem->filled = MAC_UNSET; + /* MAC is not stored yet, don't start timer */ + return IPSET_ADD_STORE_PLAIN_TIMEOUT; +} + +static inline int +bitmap_ipmac_do_del(const struct bitmap_ipmac_adt_elem *e, + struct bitmap_ipmac *map) +{ + return !test_and_clear_bit(e->id, map->members); +} + +static inline int +bitmap_ipmac_do_list(struct sk_buff *skb, const struct bitmap_ipmac *map, + u32 id, size_t dsize) +{ + const struct bitmap_ipmac_elem *elem = + get_const_elem(map->extensions, id, dsize); + + return nla_put_ipaddr4(skb, IPSET_ATTR_IP, + htonl(map->first_ip + id)) || + (elem->filled == MAC_FILLED && + nla_put(skb, IPSET_ATTR_ETHER, ETH_ALEN, elem->ether)); +} + +static inline int +bitmap_ipmac_do_head(struct sk_buff *skb, const struct bitmap_ipmac *map) +{ + return nla_put_ipaddr4(skb, IPSET_ATTR_IP, htonl(map->first_ip)) || + nla_put_ipaddr4(skb, IPSET_ATTR_IP_TO, htonl(map->last_ip)); +} + +static int +bitmap_ipmac_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + struct bitmap_ipmac *map = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct bitmap_ipmac_adt_elem e = { .id = 0, .add_mac = 1 }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + u32 ip; + + ip = ntohl(ip4addr(skb, opt->flags & IPSET_DIM_ONE_SRC)); + if (ip < map->first_ip || ip > map->last_ip) + return -IPSET_ERR_BITMAP_RANGE; + + /* Backward compatibility: we don't check the second flag */ + if (skb_mac_header(skb) < skb->head || + (skb_mac_header(skb) + ETH_HLEN) > skb->data) + return -EINVAL; + + e.id = ip_to_id(map, ip); + + if (opt->flags & IPSET_DIM_ONE_SRC) + ether_addr_copy(e.ether, eth_hdr(skb)->h_source); + else + ether_addr_copy(e.ether, eth_hdr(skb)->h_dest); + + if (is_zero_ether_addr(e.ether)) + return -EINVAL; + + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +bitmap_ipmac_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + const struct bitmap_ipmac *map = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct bitmap_ipmac_adt_elem e = { .id = 0 }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + u32 ip = 0; + int ret = 0; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP])) + return -IPSET_ERR_PROTOCOL; + + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP], &ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + if (ip < map->first_ip || ip > map->last_ip) + return -IPSET_ERR_BITMAP_RANGE; + + e.id = ip_to_id(map, ip); + if (tb[IPSET_ATTR_ETHER]) { + if (nla_len(tb[IPSET_ATTR_ETHER]) != ETH_ALEN) + return -IPSET_ERR_PROTOCOL; + memcpy(e.ether, nla_data(tb[IPSET_ATTR_ETHER]), ETH_ALEN); + e.add_mac = 1; + } + ret = adtfn(set, &e, &ext, &ext, flags); + + return ip_set_eexist(ret, flags) ? 0 : ret; +} + +static bool +bitmap_ipmac_same_set(const struct ip_set *a, const struct ip_set *b) +{ + const struct bitmap_ipmac *x = a->data; + const struct bitmap_ipmac *y = b->data; + + return x->first_ip == y->first_ip && + x->last_ip == y->last_ip && + a->timeout == b->timeout && + a->extensions == b->extensions; +} + +/* Plain variant */ + +#include "ip_set_bitmap_gen.h" + +/* Create bitmap:ip,mac type of sets */ + +static bool +init_map_ipmac(struct ip_set *set, struct bitmap_ipmac *map, + u32 first_ip, u32 last_ip, u32 elements) +{ + map->members = ip_set_alloc(map->memsize); + if (!map->members) + return false; + map->first_ip = first_ip; + map->last_ip = last_ip; + map->elements = elements; + set->timeout = IPSET_NO_TIMEOUT; + +#ifdef HAVE_TIMER_SETUP + map->set = set; +#endif + set->data = map; + set->family = NFPROTO_IPV4; + + return true; +} + +static int +bitmap_ipmac_create(struct net *net, struct ip_set *set, struct nlattr *tb[], + u32 flags) +{ + u32 first_ip = 0, last_ip = 0; + u64 elements; + struct bitmap_ipmac *map; + int ret; + + if (unlikely(!tb[IPSET_ATTR_IP] || + !ip_set_optattr_netorder(tb, IPSET_ATTR_TIMEOUT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP], &first_ip); + if (ret) + return ret; + + if (tb[IPSET_ATTR_IP_TO]) { + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &last_ip); + if (ret) + return ret; + if (first_ip > last_ip) + swap(first_ip, last_ip); + } else if (tb[IPSET_ATTR_CIDR]) { + u8 cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + + if (cidr >= HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + ip_set_mask_from_to(first_ip, last_ip, cidr); + } else { + return -IPSET_ERR_PROTOCOL; + } + + elements = (u64)last_ip - first_ip + 1; + + if (elements > IPSET_BITMAP_MAX_RANGE + 1) + return -IPSET_ERR_BITMAP_RANGE_SIZE; + + set->dsize = ip_set_elem_len(set, tb, + sizeof(struct bitmap_ipmac_elem), + __alignof__(struct bitmap_ipmac_elem)); + map = ip_set_alloc(sizeof(*map) + elements * set->dsize); + if (!map) + return -ENOMEM; + + map->memsize = bitmap_bytes(0, elements - 1); + set->variant = &bitmap_ipmac; + if (!init_map_ipmac(set, map, first_ip, last_ip, elements)) { + kfree(map); + return -ENOMEM; + } + if (tb[IPSET_ATTR_TIMEOUT]) { + set->timeout = ip_set_timeout_uget(tb[IPSET_ATTR_TIMEOUT]); + bitmap_ipmac_gc_init(set, bitmap_ipmac_gc); + } + return 0; +} + +static struct ip_set_type bitmap_ipmac_type = { + .name = "bitmap:ip,mac", + .protocol = IPSET_PROTOCOL, + .features = IPSET_TYPE_IP | IPSET_TYPE_MAC, + .dimension = IPSET_DIM_TWO, + .family = NFPROTO_IPV4, + .revision_min = IPSET_TYPE_REV_MIN, + .revision_max = IPSET_TYPE_REV_MAX, + .create = bitmap_ipmac_create, + .create_policy = { + [IPSET_ATTR_IP] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP_TO] = { .type = NLA_NESTED }, + [IPSET_ATTR_CIDR] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + }, + .adt_policy = { + [IPSET_ATTR_IP] = { .type = NLA_NESTED }, + [IPSET_ATTR_ETHER] = { .type = NLA_BINARY, + .len = ETH_ALEN }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_LINENO] = { .type = NLA_U32 }, + [IPSET_ATTR_BYTES] = { .type = NLA_U64 }, + [IPSET_ATTR_PACKETS] = { .type = NLA_U64 }, + [IPSET_ATTR_COMMENT] = { .type = NLA_NUL_STRING, + .len = IPSET_MAX_COMMENT_SIZE }, + [IPSET_ATTR_SKBMARK] = { .type = NLA_U64 }, + [IPSET_ATTR_SKBPRIO] = { .type = NLA_U32 }, + [IPSET_ATTR_SKBQUEUE] = { .type = NLA_U16 }, + }, + .me = THIS_MODULE, +}; + +static int __init +bitmap_ipmac_init(void) +{ + return ip_set_type_register(&bitmap_ipmac_type); +} + +static void __exit +bitmap_ipmac_fini(void) +{ + rcu_barrier(); + ip_set_type_unregister(&bitmap_ipmac_type); +} + +module_init(bitmap_ipmac_init); +module_exit(bitmap_ipmac_fini); diff --git a/kernel/net/netfilter/ipset/ip_set_bitmap_port.c b/kernel/net/netfilter/ipset/ip_set_bitmap_port.c new file mode 100644 index 0000000..99edaac --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_bitmap_port.c @@ -0,0 +1,313 @@ +/* Copyright (C) 2003-2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module implementing an IP set type: the bitmap:port type */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define IPSET_TYPE_REV_MIN 0 +/* 1 Counter support added */ +/* 2 Comment support added */ +#define IPSET_TYPE_REV_MAX 3 /* skbinfo support added */ + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Jozsef Kadlecsik "); +IP_SET_MODULE_DESC("bitmap:port", IPSET_TYPE_REV_MIN, IPSET_TYPE_REV_MAX); +MODULE_ALIAS("ip_set_bitmap:port"); + +#define MTYPE bitmap_port + +/* Type structure */ +struct bitmap_port { + void *members; /* the set members */ + u16 first_port; /* host byte order, included in range */ + u16 last_port; /* host byte order, included in range */ + u32 elements; /* number of max elements in the set */ + size_t memsize; /* members size */ + struct timer_list gc; /* garbage collection */ +#ifdef HAVE_TIMER_SETUP + struct ip_set *set; /* attached to this ip_set */ +#endif + unsigned char extensions[0] /* data extensions */ + __aligned(__alignof__(u64)); +}; + +/* ADT structure for generic function args */ +struct bitmap_port_adt_elem { + u16 id; +}; + +static inline u16 +port_to_id(const struct bitmap_port *m, u16 port) +{ + return port - m->first_port; +} + +/* Common functions */ + +static inline int +bitmap_port_do_test(const struct bitmap_port_adt_elem *e, + const struct bitmap_port *map, size_t dsize) +{ + return !!test_bit(e->id, map->members); +} + +static inline int +bitmap_port_gc_test(u16 id, const struct bitmap_port *map, size_t dsize) +{ + return !!test_bit(id, map->members); +} + +static inline int +bitmap_port_do_add(const struct bitmap_port_adt_elem *e, + struct bitmap_port *map, u32 flags, size_t dsize) +{ + return !!test_bit(e->id, map->members); +} + +static inline int +bitmap_port_do_del(const struct bitmap_port_adt_elem *e, + struct bitmap_port *map) +{ + return !test_and_clear_bit(e->id, map->members); +} + +static inline int +bitmap_port_do_list(struct sk_buff *skb, const struct bitmap_port *map, u32 id, + size_t dsize) +{ + return nla_put_net16(skb, IPSET_ATTR_PORT, + htons(map->first_port + id)); +} + +static inline int +bitmap_port_do_head(struct sk_buff *skb, const struct bitmap_port *map) +{ + return nla_put_net16(skb, IPSET_ATTR_PORT, htons(map->first_port)) || + nla_put_net16(skb, IPSET_ATTR_PORT_TO, htons(map->last_port)); +} + +static int +bitmap_port_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + struct bitmap_port *map = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct bitmap_port_adt_elem e = { .id = 0 }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + __be16 __port; + u16 port = 0; + + if (!ip_set_get_ip_port(skb, opt->family, + opt->flags & IPSET_DIM_ONE_SRC, &__port)) + return -EINVAL; + + port = ntohs(__port); + + if (port < map->first_port || port > map->last_port) + return -IPSET_ERR_BITMAP_RANGE; + + e.id = port_to_id(map, port); + + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +bitmap_port_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + struct bitmap_port *map = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct bitmap_port_adt_elem e = { .id = 0 }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + u32 port; /* wraparound */ + u16 port_to; + int ret = 0; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!ip_set_attr_netorder(tb, IPSET_ATTR_PORT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_PORT_TO))) + return -IPSET_ERR_PROTOCOL; + + port = ip_set_get_h16(tb[IPSET_ATTR_PORT]); + if (port < map->first_port || port > map->last_port) + return -IPSET_ERR_BITMAP_RANGE; + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + if (adt == IPSET_TEST) { + e.id = port_to_id(map, port); + return adtfn(set, &e, &ext, &ext, flags); + } + + if (tb[IPSET_ATTR_PORT_TO]) { + port_to = ip_set_get_h16(tb[IPSET_ATTR_PORT_TO]); + if (port > port_to) { + swap(port, port_to); + if (port < map->first_port) + return -IPSET_ERR_BITMAP_RANGE; + } + } else { + port_to = port; + } + + if (port_to > map->last_port) + return -IPSET_ERR_BITMAP_RANGE; + + for (; port <= port_to; port++) { + e.id = port_to_id(map, port); + ret = adtfn(set, &e, &ext, &ext, flags); + + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + ret = 0; + } + return ret; +} + +static bool +bitmap_port_same_set(const struct ip_set *a, const struct ip_set *b) +{ + const struct bitmap_port *x = a->data; + const struct bitmap_port *y = b->data; + + return x->first_port == y->first_port && + x->last_port == y->last_port && + a->timeout == b->timeout && + a->extensions == b->extensions; +} + +/* Plain variant */ + +struct bitmap_port_elem { +}; + +#include "ip_set_bitmap_gen.h" + +/* Create bitmap:ip type of sets */ + +static bool +init_map_port(struct ip_set *set, struct bitmap_port *map, + u16 first_port, u16 last_port) +{ + map->members = ip_set_alloc(map->memsize); + if (!map->members) + return false; + map->first_port = first_port; + map->last_port = last_port; + set->timeout = IPSET_NO_TIMEOUT; + +#ifdef HAVE_TIMER_SETUP + map->set = set; +#endif + set->data = map; + set->family = NFPROTO_UNSPEC; + + return true; +} + +static int +bitmap_port_create(struct net *net, struct ip_set *set, struct nlattr *tb[], + u32 flags) +{ + struct bitmap_port *map; + u16 first_port, last_port; + u32 elements; + + if (unlikely(!ip_set_attr_netorder(tb, IPSET_ATTR_PORT) || + !ip_set_attr_netorder(tb, IPSET_ATTR_PORT_TO) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_TIMEOUT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + + first_port = ip_set_get_h16(tb[IPSET_ATTR_PORT]); + last_port = ip_set_get_h16(tb[IPSET_ATTR_PORT_TO]); + if (first_port > last_port) + swap(first_port, last_port); + + elements = last_port - first_port + 1; + set->dsize = ip_set_elem_len(set, tb, 0, 0); + map = ip_set_alloc(sizeof(*map) + elements * set->dsize); + if (!map) + return -ENOMEM; + + map->elements = elements; + map->memsize = bitmap_bytes(0, map->elements); + set->variant = &bitmap_port; + if (!init_map_port(set, map, first_port, last_port)) { + kfree(map); + return -ENOMEM; + } + if (tb[IPSET_ATTR_TIMEOUT]) { + set->timeout = ip_set_timeout_uget(tb[IPSET_ATTR_TIMEOUT]); + bitmap_port_gc_init(set, bitmap_port_gc); + } + return 0; +} + +static struct ip_set_type bitmap_port_type = { + .name = "bitmap:port", + .protocol = IPSET_PROTOCOL, + .features = IPSET_TYPE_PORT, + .dimension = IPSET_DIM_ONE, + .family = NFPROTO_UNSPEC, + .revision_min = IPSET_TYPE_REV_MIN, + .revision_max = IPSET_TYPE_REV_MAX, + .create = bitmap_port_create, + .create_policy = { + [IPSET_ATTR_PORT] = { .type = NLA_U16 }, + [IPSET_ATTR_PORT_TO] = { .type = NLA_U16 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + }, + .adt_policy = { + [IPSET_ATTR_PORT] = { .type = NLA_U16 }, + [IPSET_ATTR_PORT_TO] = { .type = NLA_U16 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_LINENO] = { .type = NLA_U32 }, + [IPSET_ATTR_BYTES] = { .type = NLA_U64 }, + [IPSET_ATTR_PACKETS] = { .type = NLA_U64 }, + [IPSET_ATTR_COMMENT] = { .type = NLA_NUL_STRING, + .len = IPSET_MAX_COMMENT_SIZE }, + [IPSET_ATTR_SKBMARK] = { .type = NLA_U64 }, + [IPSET_ATTR_SKBPRIO] = { .type = NLA_U32 }, + [IPSET_ATTR_SKBQUEUE] = { .type = NLA_U16 }, + }, + .me = THIS_MODULE, +}; + +static int __init +bitmap_port_init(void) +{ + return ip_set_type_register(&bitmap_port_type); +} + +static void __exit +bitmap_port_fini(void) +{ + rcu_barrier(); + ip_set_type_unregister(&bitmap_port_type); +} + +module_init(bitmap_port_init); +module_exit(bitmap_port_fini); diff --git a/kernel/net/netfilter/ipset/ip_set_core.c b/kernel/net/netfilter/ipset/ip_set_core.c new file mode 100644 index 0000000..b424c04 --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_core.c @@ -0,0 +1,2344 @@ +/* Copyright (C) 2000-2002 Joakim Axelsson + * Patrick Schaaf + * Copyright (C) 2003-2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module for IP set management */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +static LIST_HEAD(ip_set_type_list); /* all registered set types */ +static DEFINE_MUTEX(ip_set_type_mutex); /* protects ip_set_type_list */ +static DEFINE_RWLOCK(ip_set_ref_lock); /* protects the set refs */ + +struct ip_set_net { + struct ip_set * __rcu *ip_set_list; /* all individual sets */ + ip_set_id_t ip_set_max; /* max number of sets */ + bool is_deleted; /* deleted by ip_set_net_exit */ + bool is_destroyed; /* all sets are destroyed */ +}; + +static unsigned int ip_set_net_id __read_mostly; + +static inline struct ip_set_net *ip_set_pernet(struct net *net) +{ + return net_generic(net, ip_set_net_id); +} + +#define IP_SET_INC 64 +#define STRNCMP(a, b) (strncmp(a, b, IPSET_MAXNAMELEN) == 0) + +static unsigned int max_sets; + +module_param(max_sets, int, 0600); +MODULE_PARM_DESC(max_sets, "maximal number of sets"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Jozsef Kadlecsik "); +MODULE_DESCRIPTION("ip_set: protocol " __stringify(IPSET_PROTOCOL)); +MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_IPSET); + +/* When the nfnl mutex or ip_set_ref_lock is held: */ +#define ip_set_dereference(p) \ + rcu_dereference_protected(p, \ + lockdep_nfnl_is_held(NFNL_SUBSYS_IPSET) || \ + lockdep_is_held(&ip_set_ref_lock)) +#define ip_set(inst, id) \ + ip_set_dereference((inst)->ip_set_list)[id] +#define ip_set_ref_netlink(inst,id) \ + rcu_dereference_raw((inst)->ip_set_list)[id] + +/* The set types are implemented in modules and registered set types + * can be found in ip_set_type_list. Adding/deleting types is + * serialized by ip_set_type_mutex. + */ + +static inline void +ip_set_type_lock(void) +{ + mutex_lock(&ip_set_type_mutex); +} + +static inline void +ip_set_type_unlock(void) +{ + mutex_unlock(&ip_set_type_mutex); +} + +/* Register and deregister settype */ + +static struct ip_set_type * +find_set_type(const char *name, u8 family, u8 revision) +{ + struct ip_set_type *type; + + list_for_each_entry_rcu(type, &ip_set_type_list, list) + if (STRNCMP(type->name, name) && + (type->family == family || + type->family == NFPROTO_UNSPEC) && + revision >= type->revision_min && + revision <= type->revision_max) + return type; + return NULL; +} + +/* Unlock, try to load a set type module and lock again */ +static bool +load_settype(const char *name) +{ + nfnl_unlock(NFNL_SUBSYS_IPSET); + pr_debug("try to load ip_set_%s\n", name); + if (request_module("ip_set_%s", name) < 0) { + pr_warn("Can't find ip_set type %s\n", name); + nfnl_lock(NFNL_SUBSYS_IPSET); + return false; + } + nfnl_lock(NFNL_SUBSYS_IPSET); + return true; +} + +/* Find a set type and reference it */ +#define find_set_type_get(name, family, revision, found) \ + __find_set_type_get(name, family, revision, found, false) + +static int +__find_set_type_get(const char *name, u8 family, u8 revision, + struct ip_set_type **found, bool retry) +{ + struct ip_set_type *type; + int err; + + if (retry && !load_settype(name)) + return -IPSET_ERR_FIND_TYPE; + + rcu_read_lock(); + *found = find_set_type(name, family, revision); + if (*found) { + err = !try_module_get((*found)->me) ? -EFAULT : 0; + goto unlock; + } + /* Make sure the type is already loaded + * but we don't support the revision + */ + list_for_each_entry_rcu(type, &ip_set_type_list, list) + if (STRNCMP(type->name, name)) { + err = -IPSET_ERR_FIND_TYPE; + goto unlock; + } + rcu_read_unlock(); + + return retry ? -IPSET_ERR_FIND_TYPE : + __find_set_type_get(name, family, revision, found, true); + +unlock: + rcu_read_unlock(); + return err; +} + +/* Find a given set type by name and family. + * If we succeeded, the supported minimal and maximum revisions are + * filled out. + */ +#define find_set_type_minmax(name, family, min, max) \ + __find_set_type_minmax(name, family, min, max, false) + +static int +__find_set_type_minmax(const char *name, u8 family, u8 *min, u8 *max, + bool retry) +{ + struct ip_set_type *type; + bool found = false; + + if (retry && !load_settype(name)) + return -IPSET_ERR_FIND_TYPE; + + *min = 255; *max = 0; + rcu_read_lock(); + list_for_each_entry_rcu(type, &ip_set_type_list, list) + if (STRNCMP(type->name, name) && + (type->family == family || + type->family == NFPROTO_UNSPEC)) { + found = true; + if (type->revision_min < *min) + *min = type->revision_min; + if (type->revision_max > *max) + *max = type->revision_max; + } + rcu_read_unlock(); + if (found) + return 0; + + return retry ? -IPSET_ERR_FIND_TYPE : + __find_set_type_minmax(name, family, min, max, true); +} + +#define family_name(f) ((f) == NFPROTO_IPV4 ? "inet" : \ + (f) == NFPROTO_IPV6 ? "inet6" : "any") + +/* Register a set type structure. The type is identified by + * the unique triple of name, family and revision. + */ +int +ip_set_type_register(struct ip_set_type *type) +{ + int ret = 0; + + if (type->protocol != IPSET_PROTOCOL) { + pr_warn("ip_set type %s, family %s, revision %u:%u uses wrong protocol version %u (want %u)\n", + type->name, family_name(type->family), + type->revision_min, type->revision_max, + type->protocol, IPSET_PROTOCOL); + return -EINVAL; + } + + ip_set_type_lock(); + if (find_set_type(type->name, type->family, type->revision_min)) { + /* Duplicate! */ + pr_warn("ip_set type %s, family %s with revision min %u already registered!\n", + type->name, family_name(type->family), + type->revision_min); + ip_set_type_unlock(); + return -EINVAL; + } + list_add_rcu(&type->list, &ip_set_type_list); + pr_debug("type %s, family %s, revision %u:%u registered.\n", + type->name, family_name(type->family), + type->revision_min, type->revision_max); + ip_set_type_unlock(); + + return ret; +} +EXPORT_SYMBOL_GPL(ip_set_type_register); + +/* Unregister a set type. There's a small race with ip_set_create */ +void +ip_set_type_unregister(struct ip_set_type *type) +{ + ip_set_type_lock(); + if (!find_set_type(type->name, type->family, type->revision_min)) { + pr_warn("ip_set type %s, family %s with revision min %u not registered\n", + type->name, family_name(type->family), + type->revision_min); + ip_set_type_unlock(); + return; + } + list_del_rcu(&type->list); + pr_debug("type %s, family %s with revision min %u unregistered.\n", + type->name, family_name(type->family), type->revision_min); + ip_set_type_unlock(); + + synchronize_rcu(); +} +EXPORT_SYMBOL_GPL(ip_set_type_unregister); + +/* Utility functions */ +void * +ip_set_alloc(size_t size) +{ + void *members = NULL; + + if (size < KMALLOC_MAX_SIZE) + members = kzalloc(size, GFP_KERNEL | __GFP_NOWARN); + + if (members) { + pr_debug("%p: allocated with kmalloc\n", members); + return members; + } + + members = vzalloc(size); + if (!members) + return NULL; + pr_debug("%p: allocated with vmalloc\n", members); + + return members; +} +EXPORT_SYMBOL_GPL(ip_set_alloc); + +void +ip_set_free(void *members) +{ + pr_debug("%p: free with %s\n", members, + is_vmalloc_addr(members) ? "vfree" : "kfree"); + kvfree(members); +} +EXPORT_SYMBOL_GPL(ip_set_free); + +static inline bool +flag_nested(const struct nlattr *nla) +{ + return nla->nla_type & NLA_F_NESTED; +} + +static const struct nla_policy ipaddr_policy[IPSET_ATTR_IPADDR_MAX + 1] = { + [IPSET_ATTR_IPADDR_IPV4] = { .type = NLA_U32 }, + [IPSET_ATTR_IPADDR_IPV6] = { .type = NLA_BINARY, + .len = sizeof(struct in6_addr) }, +}; + +int +ip_set_get_ipaddr4(struct nlattr *nla, __be32 *ipaddr) +{ + struct nlattr *tb[IPSET_ATTR_IPADDR_MAX + 1]; + + if (unlikely(!flag_nested(nla))) + return -IPSET_ERR_PROTOCOL; + if (NLA_PARSE_NESTED(tb, IPSET_ATTR_IPADDR_MAX, nla, + ipaddr_policy, NULL)) + return -IPSET_ERR_PROTOCOL; + if (unlikely(!ip_set_attr_netorder(tb, IPSET_ATTR_IPADDR_IPV4))) + return -IPSET_ERR_PROTOCOL; + + *ipaddr = nla_get_be32(tb[IPSET_ATTR_IPADDR_IPV4]); + return 0; +} +EXPORT_SYMBOL_GPL(ip_set_get_ipaddr4); + +int +ip_set_get_ipaddr6(struct nlattr *nla, union nf_inet_addr *ipaddr) +{ + struct nlattr *tb[IPSET_ATTR_IPADDR_MAX + 1]; + + if (unlikely(!flag_nested(nla))) + return -IPSET_ERR_PROTOCOL; + + if (NLA_PARSE_NESTED(tb, IPSET_ATTR_IPADDR_MAX, nla, + ipaddr_policy, NULL)) + return -IPSET_ERR_PROTOCOL; + if (unlikely(!ip_set_attr_netorder(tb, IPSET_ATTR_IPADDR_IPV6))) + return -IPSET_ERR_PROTOCOL; + + memcpy(ipaddr, nla_data(tb[IPSET_ATTR_IPADDR_IPV6]), + sizeof(struct in6_addr)); + return 0; +} +EXPORT_SYMBOL_GPL(ip_set_get_ipaddr6); + +typedef void (*destroyer)(struct ip_set *, void *); +/* ipset data extension types, in size order */ + +const struct ip_set_ext_type ip_set_extensions[] = { + [IPSET_EXT_ID_COUNTER] = { + .type = IPSET_EXT_COUNTER, + .flag = IPSET_FLAG_WITH_COUNTERS, + .len = sizeof(struct ip_set_counter), + .align = __alignof__(struct ip_set_counter), + }, + [IPSET_EXT_ID_TIMEOUT] = { + .type = IPSET_EXT_TIMEOUT, + .len = sizeof(unsigned long), + .align = __alignof__(unsigned long), + }, + [IPSET_EXT_ID_SKBINFO] = { + .type = IPSET_EXT_SKBINFO, + .flag = IPSET_FLAG_WITH_SKBINFO, + .len = sizeof(struct ip_set_skbinfo), + .align = __alignof__(struct ip_set_skbinfo), + }, + [IPSET_EXT_ID_COMMENT] = { + .type = IPSET_EXT_COMMENT | IPSET_EXT_DESTROY, + .flag = IPSET_FLAG_WITH_COMMENT, + .len = sizeof(struct ip_set_comment), + .align = __alignof__(struct ip_set_comment), + .destroy = (destroyer) ip_set_comment_free, + }, +}; +EXPORT_SYMBOL_GPL(ip_set_extensions); + +static inline bool +add_extension(enum ip_set_ext_id id, u32 flags, struct nlattr *tb[]) +{ + return ip_set_extensions[id].flag ? + (flags & ip_set_extensions[id].flag) : + !!tb[IPSET_ATTR_TIMEOUT]; +} + +size_t +ip_set_elem_len(struct ip_set *set, struct nlattr *tb[], size_t len, + size_t align) +{ + enum ip_set_ext_id id; + u32 cadt_flags = 0; + + if (tb[IPSET_ATTR_CADT_FLAGS]) + cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]); + if (cadt_flags & IPSET_FLAG_WITH_FORCEADD) + set->flags |= IPSET_CREATE_FLAG_FORCEADD; + if (!align) + align = 1; + for (id = 0; id < IPSET_EXT_ID_MAX; id++) { + if (!add_extension(id, cadt_flags, tb)) + continue; + len = ALIGN(len, ip_set_extensions[id].align); + set->offset[id] = len; + set->extensions |= ip_set_extensions[id].type; + len += ip_set_extensions[id].len; + } + return ALIGN(len, align); +} +EXPORT_SYMBOL_GPL(ip_set_elem_len); + +int +ip_set_get_extensions(struct ip_set *set, struct nlattr *tb[], + struct ip_set_ext *ext) +{ + u64 fullmark; + + if (unlikely(!ip_set_optattr_netorder(tb, IPSET_ATTR_TIMEOUT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_PACKETS) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_BYTES) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_SKBMARK) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_SKBPRIO) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_SKBQUEUE))) + return -IPSET_ERR_PROTOCOL; + + if (tb[IPSET_ATTR_TIMEOUT]) { + if (!SET_WITH_TIMEOUT(set)) + return -IPSET_ERR_TIMEOUT; + ext->timeout = ip_set_timeout_uget(tb[IPSET_ATTR_TIMEOUT]); + } + if (tb[IPSET_ATTR_BYTES] || tb[IPSET_ATTR_PACKETS]) { + if (!SET_WITH_COUNTER(set)) + return -IPSET_ERR_COUNTER; + if (tb[IPSET_ATTR_BYTES]) + ext->bytes = be64_to_cpu(nla_get_be64( + tb[IPSET_ATTR_BYTES])); + if (tb[IPSET_ATTR_PACKETS]) + ext->packets = be64_to_cpu(nla_get_be64( + tb[IPSET_ATTR_PACKETS])); + } + if (tb[IPSET_ATTR_COMMENT]) { + if (!SET_WITH_COMMENT(set)) + return -IPSET_ERR_COMMENT; + ext->comment = ip_set_comment_uget(tb[IPSET_ATTR_COMMENT]); + } + if (tb[IPSET_ATTR_SKBMARK]) { + if (!SET_WITH_SKBINFO(set)) + return -IPSET_ERR_SKBINFO; + fullmark = be64_to_cpu(nla_get_be64(tb[IPSET_ATTR_SKBMARK])); + ext->skbinfo.skbmark = fullmark >> 32; + ext->skbinfo.skbmarkmask = fullmark & 0xffffffff; + } + if (tb[IPSET_ATTR_SKBPRIO]) { + if (!SET_WITH_SKBINFO(set)) + return -IPSET_ERR_SKBINFO; + ext->skbinfo.skbprio = + be32_to_cpu(nla_get_be32(tb[IPSET_ATTR_SKBPRIO])); + } + if (tb[IPSET_ATTR_SKBQUEUE]) { + if (!SET_WITH_SKBINFO(set)) + return -IPSET_ERR_SKBINFO; + ext->skbinfo.skbqueue = + be16_to_cpu(nla_get_be16(tb[IPSET_ATTR_SKBQUEUE])); + } + return 0; +} +EXPORT_SYMBOL_GPL(ip_set_get_extensions); + +int +ip_set_put_extensions(struct sk_buff *skb, const struct ip_set *set, + const void *e, bool active) +{ + if (SET_WITH_TIMEOUT(set)) { + unsigned long *timeout = ext_timeout(e, set); + + if (nla_put_net32(skb, IPSET_ATTR_TIMEOUT, + htonl(active ? ip_set_timeout_get(timeout) + : *timeout))) + return -EMSGSIZE; + } + if (SET_WITH_COUNTER(set) && + ip_set_put_counter(skb, ext_counter(e, set))) + return -EMSGSIZE; + if (SET_WITH_COMMENT(set) && + ip_set_put_comment(skb, ext_comment(e, set))) + return -EMSGSIZE; + if (SET_WITH_SKBINFO(set) && + ip_set_put_skbinfo(skb, ext_skbinfo(e, set))) + return -EMSGSIZE; + return 0; +} +EXPORT_SYMBOL_GPL(ip_set_put_extensions); + +bool +ip_set_match_extensions(struct ip_set *set, const struct ip_set_ext *ext, + struct ip_set_ext *mext, u32 flags, void *data) +{ + if (SET_WITH_TIMEOUT(set) && + ip_set_timeout_expired(ext_timeout(data, set))) + return false; + if (SET_WITH_COUNTER(set)) { + struct ip_set_counter *counter = ext_counter(data, set); + + if (flags & IPSET_FLAG_MATCH_COUNTERS && + !(ip_set_match_counter(ip_set_get_packets(counter), + mext->packets, mext->packets_op) && + ip_set_match_counter(ip_set_get_bytes(counter), + mext->bytes, mext->bytes_op))) + return false; + ip_set_update_counter(counter, ext, flags); + } + if (SET_WITH_SKBINFO(set)) + ip_set_get_skbinfo(ext_skbinfo(data, set), + ext, mext, flags); + return true; +} +EXPORT_SYMBOL_GPL(ip_set_match_extensions); + +/* Creating/destroying/renaming/swapping affect the existence and + * the properties of a set. All of these can be executed from userspace + * only and serialized by the nfnl mutex indirectly from nfnetlink. + * + * Sets are identified by their index in ip_set_list and the index + * is used by the external references (set/SET netfilter modules). + * + * The set behind an index may change by swapping only, from userspace. + */ + +static inline void +__ip_set_get(struct ip_set *set) +{ + write_lock_bh(&ip_set_ref_lock); + set->ref++; + write_unlock_bh(&ip_set_ref_lock); +} + +static inline void +__ip_set_put(struct ip_set *set) +{ + write_lock_bh(&ip_set_ref_lock); + BUG_ON(set->ref == 0); + set->ref--; + write_unlock_bh(&ip_set_ref_lock); +} + +/* set->ref can be swapped out by ip_set_swap, netlink events (like dump) need + * a separate reference counter + */ +static inline void +__ip_set_put_netlink(struct ip_set *set) +{ + write_lock_bh(&ip_set_ref_lock); + BUG_ON(set->ref_netlink == 0); + set->ref_netlink--; + write_unlock_bh(&ip_set_ref_lock); +} + +/* Add, del and test set entries from kernel. + * + * The set behind the index must exist and must be referenced + * so it can't be destroyed (or changed) under our foot. + */ + +static inline struct ip_set * +ip_set_rcu_get(struct net *net, ip_set_id_t index) +{ + struct ip_set *set; + struct ip_set_net *inst = ip_set_pernet(net); + + rcu_read_lock(); + /* ip_set_list itself needs to be protected */ + set = rcu_dereference(inst->ip_set_list)[index]; + rcu_read_unlock(); + + return set; +} + +int +ip_set_test(ip_set_id_t index, const struct sk_buff *skb, + const struct xt_action_param *par, struct ip_set_adt_opt *opt) +{ + struct ip_set *set = ip_set_rcu_get(IPSET_DEV_NET(par), index); + int ret = 0; + + BUG_ON(!set); + pr_debug("set %s, index %u\n", set->name, index); + + if (opt->dim < set->type->dimension || + !(opt->family == set->family || set->family == NFPROTO_UNSPEC)) + return 0; + + rcu_read_lock_bh(); + ret = set->variant->kadt(set, skb, par, IPSET_TEST, opt); + rcu_read_unlock_bh(); + + if (ret == -EAGAIN) { + /* Type requests element to be completed */ + pr_debug("element must be completed, ADD is triggered\n"); + spin_lock_bh(&set->lock); + set->variant->kadt(set, skb, par, IPSET_ADD, opt); + spin_unlock_bh(&set->lock); + ret = 1; + } else { + /* --return-nomatch: invert matched element */ + if ((opt->cmdflags & IPSET_FLAG_RETURN_NOMATCH) && + (set->type->features & IPSET_TYPE_NOMATCH) && + (ret > 0 || ret == -ENOTEMPTY)) + ret = -ret; + } + + /* Convert error codes to nomatch */ + return (ret < 0 ? 0 : ret); +} +EXPORT_SYMBOL_GPL(ip_set_test); + +int +ip_set_add(ip_set_id_t index, const struct sk_buff *skb, + const struct xt_action_param *par, struct ip_set_adt_opt *opt) +{ + struct ip_set *set = ip_set_rcu_get(IPSET_DEV_NET(par), index); + int ret; + + BUG_ON(!set); + pr_debug("set %s, index %u\n", set->name, index); + + if (opt->dim < set->type->dimension || + !(opt->family == set->family || set->family == NFPROTO_UNSPEC)) + return -IPSET_ERR_TYPE_MISMATCH; + + spin_lock_bh(&set->lock); + ret = set->variant->kadt(set, skb, par, IPSET_ADD, opt); + spin_unlock_bh(&set->lock); + + return ret; +} +EXPORT_SYMBOL_GPL(ip_set_add); + +int +ip_set_del(ip_set_id_t index, const struct sk_buff *skb, + const struct xt_action_param *par, struct ip_set_adt_opt *opt) +{ + struct ip_set *set = ip_set_rcu_get(IPSET_DEV_NET(par), index); + int ret = 0; + + BUG_ON(!set); + pr_debug("set %s, index %u\n", set->name, index); + + if (opt->dim < set->type->dimension || + !(opt->family == set->family || set->family == NFPROTO_UNSPEC)) + return -IPSET_ERR_TYPE_MISMATCH; + + spin_lock_bh(&set->lock); + ret = set->variant->kadt(set, skb, par, IPSET_DEL, opt); + spin_unlock_bh(&set->lock); + + return ret; +} +EXPORT_SYMBOL_GPL(ip_set_del); + +/* Find set by name, reference it once. The reference makes sure the + * thing pointed to, does not go away under our feet. + * + */ +ip_set_id_t +ip_set_get_byname(struct net *net, const char *name, struct ip_set **set) +{ + ip_set_id_t i, index = IPSET_INVALID_ID; + struct ip_set *s; + struct ip_set_net *inst = ip_set_pernet(net); + + rcu_read_lock(); + for (i = 0; i < inst->ip_set_max; i++) { + s = rcu_dereference(inst->ip_set_list)[i]; + if (s && STRNCMP(s->name, name)) { + __ip_set_get(s); + index = i; + *set = s; + break; + } + } + rcu_read_unlock(); + + return index; +} +EXPORT_SYMBOL_GPL(ip_set_get_byname); + +/* If the given set pointer points to a valid set, decrement + * reference count by 1. The caller shall not assume the index + * to be valid, after calling this function. + * + */ + +static inline void +__ip_set_put_byindex(struct ip_set_net *inst, ip_set_id_t index) +{ + struct ip_set *set; + + rcu_read_lock(); + set = rcu_dereference(inst->ip_set_list)[index]; + if (set) + __ip_set_put(set); + rcu_read_unlock(); +} + +void +ip_set_put_byindex(struct net *net, ip_set_id_t index) +{ + struct ip_set_net *inst = ip_set_pernet(net); + + __ip_set_put_byindex(inst, index); +} +EXPORT_SYMBOL_GPL(ip_set_put_byindex); + +/* Get the name of a set behind a set index. + * Set itself is protected by RCU, but its name isn't: to protect against + * renaming, grab ip_set_ref_lock as reader (see ip_set_rename()) and copy the + * name. + */ +void +ip_set_name_byindex(struct net *net, ip_set_id_t index, char *name) +{ + struct ip_set *set = ip_set_rcu_get(net, index); + + BUG_ON(!set); + + read_lock_bh(&ip_set_ref_lock); + strncpy(name, set->name, IPSET_MAXNAMELEN); + read_unlock_bh(&ip_set_ref_lock); +} +EXPORT_SYMBOL_GPL(ip_set_name_byindex); + +/* Routines to call by external subsystems, which do not + * call nfnl_lock for us. + */ + +/* Find set by index, reference it once. The reference makes sure the + * thing pointed to, does not go away under our feet. + * + * The nfnl mutex is used in the function. + */ +ip_set_id_t +ip_set_nfnl_get_byindex(struct net *net, ip_set_id_t index) +{ + struct ip_set *set; + struct ip_set_net *inst = ip_set_pernet(net); + + if (index >= inst->ip_set_max) + return IPSET_INVALID_ID; + + nfnl_lock(NFNL_SUBSYS_IPSET); + set = ip_set(inst, index); + if (set) + __ip_set_get(set); + else + index = IPSET_INVALID_ID; + nfnl_unlock(NFNL_SUBSYS_IPSET); + + return index; +} +EXPORT_SYMBOL_GPL(ip_set_nfnl_get_byindex); + +/* If the given set pointer points to a valid set, decrement + * reference count by 1. The caller shall not assume the index + * to be valid, after calling this function. + * + * The nfnl mutex is used in the function. + */ +void +ip_set_nfnl_put(struct net *net, ip_set_id_t index) +{ + struct ip_set *set; + struct ip_set_net *inst = ip_set_pernet(net); + + nfnl_lock(NFNL_SUBSYS_IPSET); + if (!inst->is_deleted) { /* already deleted from ip_set_net_exit() */ + set = ip_set(inst, index); + if (set) + __ip_set_put(set); + } + nfnl_unlock(NFNL_SUBSYS_IPSET); +} +EXPORT_SYMBOL_GPL(ip_set_nfnl_put); + +/* Communication protocol with userspace over netlink. + * + * The commands are serialized by the nfnl mutex. + */ + +static inline u8 protocol(const struct nlattr * const tb[]) +{ + return nla_get_u8(tb[IPSET_ATTR_PROTOCOL]); +} + +static inline bool +protocol_failed(const struct nlattr * const tb[]) +{ + return !tb[IPSET_ATTR_PROTOCOL] || protocol(tb) != IPSET_PROTOCOL; +} + +static inline bool +protocol_min_failed(const struct nlattr * const tb[]) +{ + return !tb[IPSET_ATTR_PROTOCOL] || protocol(tb) < IPSET_PROTOCOL_MIN; +} + +static inline u32 +flag_exist(const struct nlmsghdr *nlh) +{ + return nlh->nlmsg_flags & NLM_F_EXCL ? 0 : IPSET_FLAG_EXIST; +} + +static struct nlmsghdr * +start_msg(struct sk_buff *skb, u32 portid, u32 seq, unsigned int flags, + enum ipset_cmd cmd) +{ + struct nlmsghdr *nlh; + struct nfgenmsg *nfmsg; + + nlh = nlmsg_put(skb, portid, seq, nfnl_msg_type(NFNL_SUBSYS_IPSET, cmd), + sizeof(*nfmsg), flags); + if (!nlh) + return NULL; + + nfmsg = nlmsg_data(nlh); + nfmsg->nfgen_family = NFPROTO_IPV4; + nfmsg->version = NFNETLINK_V0; + nfmsg->res_id = 0; + + return nlh; +} + +/* Create a set */ + +static const struct nla_policy ip_set_create_policy[IPSET_ATTR_CMD_MAX + 1] = { + [IPSET_ATTR_PROTOCOL] = { .type = NLA_U8 }, + [IPSET_ATTR_SETNAME] = { .type = NLA_NUL_STRING, + .len = IPSET_MAXNAMELEN - 1 }, + [IPSET_ATTR_TYPENAME] = { .type = NLA_NUL_STRING, + .len = IPSET_MAXNAMELEN - 1}, + [IPSET_ATTR_REVISION] = { .type = NLA_U8 }, + [IPSET_ATTR_FAMILY] = { .type = NLA_U8 }, + [IPSET_ATTR_DATA] = { .type = NLA_NESTED }, +}; + +static struct ip_set * +find_set_and_id(struct ip_set_net *inst, const char *name, ip_set_id_t *id) +{ + struct ip_set *set = NULL; + ip_set_id_t i; + + *id = IPSET_INVALID_ID; + for (i = 0; i < inst->ip_set_max; i++) { + set = ip_set(inst, i); + if (set && STRNCMP(set->name, name)) { + *id = i; + break; + } + } + return (*id == IPSET_INVALID_ID ? NULL : set); +} + +static inline struct ip_set * +find_set(struct ip_set_net *inst, const char *name) +{ + ip_set_id_t id; + + return find_set_and_id(inst, name, &id); +} + +static int +find_free_id(struct ip_set_net *inst, const char *name, ip_set_id_t *index, + struct ip_set **set) +{ + struct ip_set *s; + ip_set_id_t i; + + *index = IPSET_INVALID_ID; + for (i = 0; i < inst->ip_set_max; i++) { + s = ip_set(inst, i); + if (!s) { + if (*index == IPSET_INVALID_ID) + *index = i; + } else if (STRNCMP(name, s->name)) { + /* Name clash */ + *set = s; + return -EEXIST; + } + } + if (*index == IPSET_INVALID_ID) + /* No free slot remained */ + return -IPSET_ERR_MAX_SETS; + return 0; +} + +static int +IPSET_CBFN(ip_set_none, struct net *net, struct sock *ctnl, + struct sk_buff *skb, const struct nlmsghdr *nlh, + const struct nlattr * const attr[], + struct netlink_ext_ack *extack) +{ + return -EOPNOTSUPP; +} + +static int +IPSET_CBFN(ip_set_create, struct net *n, struct sock *ctnl, + struct sk_buff *skb, const struct nlmsghdr *nlh, + const struct nlattr * const attr[], + struct netlink_ext_ack *extack) +{ + struct net *net = IPSET_SOCK_NET(n, ctnl); + struct ip_set_net *inst = ip_set_pernet(net); + struct ip_set *set, *clash = NULL; + ip_set_id_t index = IPSET_INVALID_ID; + struct nlattr *tb[IPSET_ATTR_CREATE_MAX + 1] = {}; + const char *name, *typename; + u8 family, revision; + u32 flags = flag_exist(nlh); + int ret = 0; + + if (unlikely(protocol_min_failed(attr) || + !attr[IPSET_ATTR_SETNAME] || + !attr[IPSET_ATTR_TYPENAME] || + !attr[IPSET_ATTR_REVISION] || + !attr[IPSET_ATTR_FAMILY] || + (attr[IPSET_ATTR_DATA] && + !flag_nested(attr[IPSET_ATTR_DATA])))) + return -IPSET_ERR_PROTOCOL; + + name = nla_data(attr[IPSET_ATTR_SETNAME]); + typename = nla_data(attr[IPSET_ATTR_TYPENAME]); + family = nla_get_u8(attr[IPSET_ATTR_FAMILY]); + revision = nla_get_u8(attr[IPSET_ATTR_REVISION]); + pr_debug("setname: %s, typename: %s, family: %s, revision: %u\n", + name, typename, family_name(family), revision); + + /* First, and without any locks, allocate and initialize + * a normal base set structure. + */ + set = kzalloc(sizeof(*set), GFP_KERNEL); + if (!set) + return -ENOMEM; + spin_lock_init(&set->lock); + strlcpy(set->name, name, IPSET_MAXNAMELEN); + set->family = family; + set->revision = revision; + + /* Next, check that we know the type, and take + * a reference on the type, to make sure it stays available + * while constructing our new set. + * + * After referencing the type, we try to create the type + * specific part of the set without holding any locks. + */ + ret = find_set_type_get(typename, family, revision, &set->type); + if (ret) + goto out; + + /* Without holding any locks, create private part. */ + if (attr[IPSET_ATTR_DATA] && + NLA_PARSE_NESTED(tb, IPSET_ATTR_CREATE_MAX, attr[IPSET_ATTR_DATA], + set->type->create_policy, NULL)) { + ret = -IPSET_ERR_PROTOCOL; + goto put_out; + } + + ret = set->type->create(net, set, tb, flags); + if (ret != 0) + goto put_out; + + /* BTW, ret==0 here. */ + + /* Here, we have a valid, constructed set and we are protected + * by the nfnl mutex. Find the first free index in ip_set_list + * and check clashing. + */ + ret = find_free_id(inst, set->name, &index, &clash); + if (ret == -EEXIST) { + /* If this is the same set and requested, ignore error */ + if ((flags & IPSET_FLAG_EXIST) && + STRNCMP(set->type->name, clash->type->name) && + set->type->family == clash->type->family && + set->type->revision_min == clash->type->revision_min && + set->type->revision_max == clash->type->revision_max && + set->variant->same_set(set, clash)) + ret = 0; + goto cleanup; + } else if (ret == -IPSET_ERR_MAX_SETS) { + struct ip_set **list, **tmp; + ip_set_id_t i = inst->ip_set_max + IP_SET_INC; + + if (i < inst->ip_set_max || i == IPSET_INVALID_ID) + /* Wraparound */ + goto cleanup; + + list = kvcalloc(i, sizeof(struct ip_set *), GFP_KERNEL); + if (!list) + goto cleanup; + /* nfnl mutex is held, both lists are valid */ + tmp = ip_set_dereference(inst->ip_set_list); + memcpy(list, tmp, sizeof(struct ip_set *) * inst->ip_set_max); + rcu_assign_pointer(inst->ip_set_list, list); + /* Make sure all current packets have passed through */ + synchronize_net(); + /* Use new list */ + index = inst->ip_set_max; + inst->ip_set_max = i; + kvfree(tmp); + ret = 0; + } else if (ret) { + goto cleanup; + } + + /* Finally! Add our shiny new set to the list, and be done. */ + pr_debug("create: '%s' created with index %u!\n", set->name, index); + ip_set(inst, index) = set; + + return ret; + +cleanup: + set->variant->destroy(set); +put_out: + module_put(set->type->me); +out: + kfree(set); + return ret; +} + +/* Destroy sets */ + +static const struct nla_policy +ip_set_setname_policy[IPSET_ATTR_CMD_MAX + 1] = { + [IPSET_ATTR_PROTOCOL] = { .type = NLA_U8 }, + [IPSET_ATTR_SETNAME] = { .type = NLA_NUL_STRING, + .len = IPSET_MAXNAMELEN - 1 }, +}; + +static void +ip_set_destroy_set(struct ip_set *set) +{ + pr_debug("set: %s\n", set->name); + + /* Must call it without holding any lock */ + set->variant->destroy(set); + module_put(set->type->me); + kfree(set); +} + +static int +IPSET_CBFN(ip_set_destroy, struct net *net, struct sock *ctnl, + struct sk_buff *skb, const struct nlmsghdr *nlh, + const struct nlattr * const attr[], + struct netlink_ext_ack *extack) +{ + struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl)); + struct ip_set *s; + ip_set_id_t i; + int ret = 0; + + if (unlikely(protocol_min_failed(attr))) + return -IPSET_ERR_PROTOCOL; + + /* Must wait for flush to be really finished in list:set */ + rcu_barrier(); + + /* Commands are serialized and references are + * protected by the ip_set_ref_lock. + * External systems (i.e. xt_set) must call + * ip_set_put|get_nfnl_* functions, that way we + * can safely check references here. + * + * list:set timer can only decrement the reference + * counter, so if it's already zero, we can proceed + * without holding the lock. + */ + read_lock_bh(&ip_set_ref_lock); + if (!attr[IPSET_ATTR_SETNAME]) { + for (i = 0; i < inst->ip_set_max; i++) { + s = ip_set(inst, i); + if (s && (s->ref || s->ref_netlink)) { + ret = -IPSET_ERR_BUSY; + goto out; + } + } + inst->is_destroyed = true; + read_unlock_bh(&ip_set_ref_lock); + for (i = 0; i < inst->ip_set_max; i++) { + s = ip_set(inst, i); + if (s) { + ip_set(inst, i) = NULL; + ip_set_destroy_set(s); + } + } + /* Modified by ip_set_destroy() only, which is serialized */ + inst->is_destroyed = false; + } else { + s = find_set_and_id(inst, nla_data(attr[IPSET_ATTR_SETNAME]), + &i); + if (!s) { + ret = -ENOENT; + goto out; + } else if (s->ref || s->ref_netlink) { + ret = -IPSET_ERR_BUSY; + goto out; + } + ip_set(inst, i) = NULL; + read_unlock_bh(&ip_set_ref_lock); + + ip_set_destroy_set(s); + } + return 0; +out: + read_unlock_bh(&ip_set_ref_lock); + return ret; +} + +/* Flush sets */ + +static void +ip_set_flush_set(struct ip_set *set) +{ + pr_debug("set: %s\n", set->name); + + spin_lock_bh(&set->lock); + set->variant->flush(set); + spin_unlock_bh(&set->lock); +} + +static int +IPSET_CBFN(ip_set_flush, struct net *net, struct sock *ctnl, + struct sk_buff *skb, const struct nlmsghdr *nlh, + const struct nlattr * const attr[], + struct netlink_ext_ack *extack) +{ + struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl)); + struct ip_set *s; + ip_set_id_t i; + + if (unlikely(protocol_min_failed(attr))) + return -IPSET_ERR_PROTOCOL; + + if (!attr[IPSET_ATTR_SETNAME]) { + for (i = 0; i < inst->ip_set_max; i++) { + s = ip_set(inst, i); + if (s) + ip_set_flush_set(s); + } + } else { + s = find_set(inst, nla_data(attr[IPSET_ATTR_SETNAME])); + if (!s) + return -ENOENT; + + ip_set_flush_set(s); + } + + return 0; +} + +/* Rename a set */ + +static const struct nla_policy +ip_set_setname2_policy[IPSET_ATTR_CMD_MAX + 1] = { + [IPSET_ATTR_PROTOCOL] = { .type = NLA_U8 }, + [IPSET_ATTR_SETNAME] = { .type = NLA_NUL_STRING, + .len = IPSET_MAXNAMELEN - 1 }, + [IPSET_ATTR_SETNAME2] = { .type = NLA_NUL_STRING, + .len = IPSET_MAXNAMELEN - 1 }, +}; + +static int +IPSET_CBFN(ip_set_rename, struct net *net, struct sock *ctnl, + struct sk_buff *skb, const struct nlmsghdr *nlh, + const struct nlattr * const attr[], + struct netlink_ext_ack *extack) +{ + struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl)); + struct ip_set *set, *s; + const char *name2; + ip_set_id_t i; + int ret = 0; + + if (unlikely(protocol_min_failed(attr) || + !attr[IPSET_ATTR_SETNAME] || + !attr[IPSET_ATTR_SETNAME2])) + return -IPSET_ERR_PROTOCOL; + + set = find_set(inst, nla_data(attr[IPSET_ATTR_SETNAME])); + if (!set) + return -ENOENT; + + write_lock_bh(&ip_set_ref_lock); + if (set->ref != 0) { + ret = -IPSET_ERR_REFERENCED; + goto out; + } + + name2 = nla_data(attr[IPSET_ATTR_SETNAME2]); + for (i = 0; i < inst->ip_set_max; i++) { + s = ip_set(inst, i); + if (s && STRNCMP(s->name, name2)) { + ret = -IPSET_ERR_EXIST_SETNAME2; + goto out; + } + } + strncpy(set->name, name2, IPSET_MAXNAMELEN); + +out: + write_unlock_bh(&ip_set_ref_lock); + return ret; +} + +/* Swap two sets so that name/index points to the other. + * References and set names are also swapped. + * + * The commands are serialized by the nfnl mutex and references are + * protected by the ip_set_ref_lock. The kernel interfaces + * do not hold the mutex but the pointer settings are atomic + * so the ip_set_list always contains valid pointers to the sets. + */ + +static int +IPSET_CBFN(ip_set_swap, struct net *net, struct sock *ctnl, + struct sk_buff *skb, const struct nlmsghdr *nlh, + const struct nlattr * const attr[], + struct netlink_ext_ack *extack) +{ + struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl)); + struct ip_set *from, *to; + ip_set_id_t from_id, to_id; + char from_name[IPSET_MAXNAMELEN]; + + if (unlikely(protocol_min_failed(attr) || + !attr[IPSET_ATTR_SETNAME] || + !attr[IPSET_ATTR_SETNAME2])) + return -IPSET_ERR_PROTOCOL; + + from = find_set_and_id(inst, nla_data(attr[IPSET_ATTR_SETNAME]), + &from_id); + if (!from) + return -ENOENT; + + to = find_set_and_id(inst, nla_data(attr[IPSET_ATTR_SETNAME2]), + &to_id); + if (!to) + return -IPSET_ERR_EXIST_SETNAME2; + + /* Features must not change. + * Not an artifical restriction anymore, as we must prevent + * possible loops created by swapping in setlist type of sets. + */ + if (!(from->type->features == to->type->features && + from->family == to->family)) + return -IPSET_ERR_TYPE_MISMATCH; + + write_lock_bh(&ip_set_ref_lock); + + if (from->ref_netlink || to->ref_netlink) { + write_unlock_bh(&ip_set_ref_lock); + return -EBUSY; + } + + strncpy(from_name, from->name, IPSET_MAXNAMELEN); + strncpy(from->name, to->name, IPSET_MAXNAMELEN); + strncpy(to->name, from_name, IPSET_MAXNAMELEN); + + swap(from->ref, to->ref); + ip_set(inst, from_id) = to; + ip_set(inst, to_id) = from; + write_unlock_bh(&ip_set_ref_lock); + + return 0; +} + +/* List/save set data */ + +#define DUMP_INIT 0 +#define DUMP_ALL 1 +#define DUMP_ONE 2 +#define DUMP_LAST 3 + +#define DUMP_TYPE(arg) (((u32)(arg)) & 0x0000FFFF) +#define DUMP_FLAGS(arg) (((u32)(arg)) >> 16) + +static int +ip_set_dump_done(struct netlink_callback *cb) +{ + if (cb->args[IPSET_CB_ARG0]) { + struct ip_set_net *inst = + (struct ip_set_net *)cb->args[IPSET_CB_NET]; + ip_set_id_t index = (ip_set_id_t)cb->args[IPSET_CB_INDEX]; + struct ip_set *set = ip_set_ref_netlink(inst, index); + + if (set->variant->uref) + set->variant->uref(set, cb, false); + pr_debug("release set %s\n", set->name); + __ip_set_put_netlink(set); + } + return 0; +} + +static inline void +dump_attrs(struct nlmsghdr *nlh) +{ + const struct nlattr *attr; + int rem; + + pr_debug("dump nlmsg\n"); + nlmsg_for_each_attr(attr, nlh, sizeof(struct nfgenmsg), rem) { + pr_debug("type: %u, len %u\n", nla_type(attr), attr->nla_len); + } +} + +static int +dump_init(struct netlink_callback *cb, struct ip_set_net *inst) +{ + struct nlmsghdr *nlh = nlmsg_hdr(cb->skb); + int min_len = nlmsg_total_size(sizeof(struct nfgenmsg)); + struct nlattr *cda[IPSET_ATTR_CMD_MAX + 1]; + struct nlattr *attr = (void *)nlh + min_len; + u32 dump_type; + ip_set_id_t index; + + /* Second pass, so parser can't fail */ + NLA_PARSE(cda, IPSET_ATTR_CMD_MAX, attr, nlh->nlmsg_len - min_len, + ip_set_setname_policy, NULL); + + cb->args[IPSET_CB_PROTO] = nla_get_u8(cda[IPSET_ATTR_PROTOCOL]); + if (cda[IPSET_ATTR_SETNAME]) { + struct ip_set *set; + + set = find_set_and_id(inst, nla_data(cda[IPSET_ATTR_SETNAME]), + &index); + if (!set) + return -ENOENT; + + dump_type = DUMP_ONE; + cb->args[IPSET_CB_INDEX] = index; + } else { + dump_type = DUMP_ALL; + } + + if (cda[IPSET_ATTR_FLAGS]) { + u32 f = ip_set_get_h32(cda[IPSET_ATTR_FLAGS]); + + dump_type |= (f << 16); + } + cb->args[IPSET_CB_NET] = (unsigned long)inst; + cb->args[IPSET_CB_DUMP] = dump_type; + + return 0; +} + +static int +ip_set_dump_start(struct sk_buff *skb, struct netlink_callback *cb) +{ + ip_set_id_t index = IPSET_INVALID_ID, max; + struct ip_set *set = NULL; + struct nlmsghdr *nlh = NULL; + unsigned int flags = NETLINK_PORTID(cb->skb) ? NLM_F_MULTI : 0; + struct ip_set_net *inst = ip_set_pernet(sock_net(skb->sk)); + u32 dump_type, dump_flags; + bool is_destroyed; + int ret = 0; + + if (!cb->args[IPSET_CB_DUMP]) { + ret = dump_init(cb, inst); + if (ret < 0) { + nlh = nlmsg_hdr(cb->skb); + /* We have to create and send the error message + * manually :-( + */ + if (nlh->nlmsg_flags & NLM_F_ACK) + NETLINK_ACK(cb->skb, nlh, ret, NULL); + return ret; + } + } + + if (cb->args[IPSET_CB_INDEX] >= inst->ip_set_max) + goto out; + + dump_type = DUMP_TYPE(cb->args[IPSET_CB_DUMP]); + dump_flags = DUMP_FLAGS(cb->args[IPSET_CB_DUMP]); + max = dump_type == DUMP_ONE ? cb->args[IPSET_CB_INDEX] + 1 + : inst->ip_set_max; +dump_last: + pr_debug("dump type, flag: %u %u index: %ld\n", + dump_type, dump_flags, cb->args[IPSET_CB_INDEX]); + for (; cb->args[IPSET_CB_INDEX] < max; cb->args[IPSET_CB_INDEX]++) { + index = (ip_set_id_t)cb->args[IPSET_CB_INDEX]; + write_lock_bh(&ip_set_ref_lock); + set = ip_set(inst, index); + is_destroyed = inst->is_destroyed; + if (!set || is_destroyed) { + write_unlock_bh(&ip_set_ref_lock); + if (dump_type == DUMP_ONE) { + ret = -ENOENT; + goto out; + } + if (is_destroyed) { + /* All sets are just being destroyed */ + ret = 0; + goto out; + } + continue; + } + /* When dumping all sets, we must dump "sorted" + * so that lists (unions of sets) are dumped last. + */ + if (dump_type != DUMP_ONE && + ((dump_type == DUMP_ALL) == + !!(set->type->features & IPSET_DUMP_LAST))) { + write_unlock_bh(&ip_set_ref_lock); + continue; + } + pr_debug("List set: %s\n", set->name); + if (!cb->args[IPSET_CB_ARG0]) { + /* Start listing: make sure set won't be destroyed */ + pr_debug("reference set\n"); + set->ref_netlink++; + } + write_unlock_bh(&ip_set_ref_lock); + nlh = start_msg(skb, NETLINK_PORTID(cb->skb), + cb->nlh->nlmsg_seq, flags, + IPSET_CMD_LIST); + if (!nlh) { + ret = -EMSGSIZE; + goto release_refcount; + } + if (nla_put_u8(skb, IPSET_ATTR_PROTOCOL, + cb->args[IPSET_CB_PROTO]) || + nla_put_string(skb, IPSET_ATTR_SETNAME, set->name)) + goto nla_put_failure; + if (dump_flags & IPSET_FLAG_LIST_SETNAME) + goto next_set; + switch (cb->args[IPSET_CB_ARG0]) { + case 0: + /* Core header data */ + if (nla_put_string(skb, IPSET_ATTR_TYPENAME, + set->type->name) || + nla_put_u8(skb, IPSET_ATTR_FAMILY, + set->family) || + nla_put_u8(skb, IPSET_ATTR_REVISION, + set->revision)) + goto nla_put_failure; + if (cb->args[IPSET_CB_PROTO] > IPSET_PROTOCOL_MIN && + nla_put_net16(skb, IPSET_ATTR_INDEX, htons(index))) + goto nla_put_failure; + ret = set->variant->head(set, skb); + if (ret < 0) + goto release_refcount; + if (dump_flags & IPSET_FLAG_LIST_HEADER) + goto next_set; + if (set->variant->uref) + set->variant->uref(set, cb, true); + /* fall through */ + default: + ret = set->variant->list(set, skb, cb); + if (!cb->args[IPSET_CB_ARG0]) + /* Set is done, proceed with next one */ + goto next_set; + goto release_refcount; + } + } + /* If we dump all sets, continue with dumping last ones */ + if (dump_type == DUMP_ALL) { + dump_type = DUMP_LAST; + cb->args[IPSET_CB_DUMP] = dump_type | (dump_flags << 16); + cb->args[IPSET_CB_INDEX] = 0; + if (set && set->variant->uref) + set->variant->uref(set, cb, false); + goto dump_last; + } + goto out; + +nla_put_failure: + ret = -EFAULT; +next_set: + if (dump_type == DUMP_ONE) + cb->args[IPSET_CB_INDEX] = IPSET_INVALID_ID; + else + cb->args[IPSET_CB_INDEX]++; +release_refcount: + /* If there was an error or set is done, release set */ + if (ret || !cb->args[IPSET_CB_ARG0]) { + set = ip_set_ref_netlink(inst, index); + if (set->variant->uref) + set->variant->uref(set, cb, false); + pr_debug("release set %s\n", set->name); + __ip_set_put_netlink(set); + cb->args[IPSET_CB_ARG0] = 0; + } +out: + if (nlh) { + nlmsg_end(skb, nlh); + pr_debug("nlmsg_len: %u\n", nlh->nlmsg_len); + dump_attrs(nlh); + } + + return ret < 0 ? ret : skb->len; +} + +static int +IPSET_CBFN(ip_set_dump, struct net *net, struct sock *ctnl, + struct sk_buff *skb, const struct nlmsghdr *nlh, + const struct nlattr * const attr[], + struct netlink_ext_ack *extack) +{ + if (unlikely(protocol_min_failed(attr))) + return -IPSET_ERR_PROTOCOL; + +#if HAVE_NETLINK_DUMP_START_ARGS == 5 + return netlink_dump_start(ctnl, skb, nlh, + ip_set_dump_start, + ip_set_dump_done); +#elif HAVE_NETLINK_DUMP_START_ARGS == 6 + return netlink_dump_start(ctnl, skb, nlh, + ip_set_dump_start, + ip_set_dump_done, 0); +#else + { + struct netlink_dump_control c = { + .dump = ip_set_dump_start, + .done = ip_set_dump_done, + }; + return netlink_dump_start(ctnl, skb, nlh, &c); + } +#endif +} + +/* Add, del and test */ + +static const struct nla_policy ip_set_adt_policy[IPSET_ATTR_CMD_MAX + 1] = { + [IPSET_ATTR_PROTOCOL] = { .type = NLA_U8 }, + [IPSET_ATTR_SETNAME] = { .type = NLA_NUL_STRING, + .len = IPSET_MAXNAMELEN - 1 }, + [IPSET_ATTR_LINENO] = { .type = NLA_U32 }, + [IPSET_ATTR_DATA] = { .type = NLA_NESTED }, + [IPSET_ATTR_ADT] = { .type = NLA_NESTED }, +}; + +static int +call_ad(struct sock *ctnl, struct sk_buff *skb, struct ip_set *set, + struct nlattr *tb[], enum ipset_adt adt, + u32 flags, bool use_lineno) +{ + int ret; + u32 lineno = 0; + bool eexist = flags & IPSET_FLAG_EXIST, retried = false; + + do { + spin_lock_bh(&set->lock); + ret = set->variant->uadt(set, tb, adt, &lineno, flags, retried); + spin_unlock_bh(&set->lock); + retried = true; + } while (ret == -EAGAIN && + set->variant->resize && + (ret = set->variant->resize(set, retried)) == 0); + + if (!ret || (ret == -IPSET_ERR_EXIST && eexist)) + return 0; + if (lineno && use_lineno) { + /* Error in restore/batch mode: send back lineno */ + struct nlmsghdr *rep, *nlh = nlmsg_hdr(skb); + struct sk_buff *skb2; + struct nlmsgerr *errmsg; + size_t payload = min(SIZE_MAX, + sizeof(*errmsg) + nlmsg_len(nlh)); + int min_len = nlmsg_total_size(sizeof(struct nfgenmsg)); + struct nlattr *cda[IPSET_ATTR_CMD_MAX + 1]; + struct nlattr *cmdattr; + u32 *errline; + + skb2 = nlmsg_new(payload, GFP_KERNEL); + if (!skb2) + return -ENOMEM; + rep = __nlmsg_put(skb2, NETLINK_PORTID(skb), + nlh->nlmsg_seq, NLMSG_ERROR, payload, 0); + errmsg = nlmsg_data(rep); + errmsg->error = ret; + memcpy(&errmsg->msg, nlh, nlh->nlmsg_len); + cmdattr = (void *)&errmsg->msg + min_len; + + NLA_PARSE(cda, IPSET_ATTR_CMD_MAX, cmdattr, + nlh->nlmsg_len - min_len, ip_set_adt_policy, NULL); + + errline = nla_data(cda[IPSET_ATTR_LINENO]); + + *errline = lineno; + + netlink_unicast(ctnl, skb2, NETLINK_PORTID(skb), + MSG_DONTWAIT); + /* Signal netlink not to send its ACK/errmsg. */ + return -EINTR; + } + + return ret; +} + +static int +IPSET_CBFN(ip_set_uadd, struct net *net, struct sock *ctnl, + struct sk_buff *skb, const struct nlmsghdr *nlh, + const struct nlattr * const attr[], + struct netlink_ext_ack *extack) +{ + struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl)); + struct ip_set *set; + struct nlattr *tb[IPSET_ATTR_ADT_MAX + 1] = {}; + const struct nlattr *nla; + u32 flags = flag_exist(nlh); + bool use_lineno; + int ret = 0; + + if (unlikely(protocol_min_failed(attr) || + !attr[IPSET_ATTR_SETNAME] || + !((attr[IPSET_ATTR_DATA] != NULL) ^ + (attr[IPSET_ATTR_ADT] != NULL)) || + (attr[IPSET_ATTR_DATA] && + !flag_nested(attr[IPSET_ATTR_DATA])) || + (attr[IPSET_ATTR_ADT] && + (!flag_nested(attr[IPSET_ATTR_ADT]) || + !attr[IPSET_ATTR_LINENO])))) + return -IPSET_ERR_PROTOCOL; + + set = find_set(inst, nla_data(attr[IPSET_ATTR_SETNAME])); + if (!set) + return -ENOENT; + + use_lineno = !!attr[IPSET_ATTR_LINENO]; + if (attr[IPSET_ATTR_DATA]) { + if (NLA_PARSE_NESTED(tb, IPSET_ATTR_ADT_MAX, + attr[IPSET_ATTR_DATA], + set->type->adt_policy, NULL)) + return -IPSET_ERR_PROTOCOL; + ret = call_ad(ctnl, skb, set, tb, IPSET_ADD, flags, + use_lineno); + } else { + int nla_rem; + + nla_for_each_nested(nla, attr[IPSET_ATTR_ADT], nla_rem) { + memset(tb, 0, sizeof(tb)); + if (nla_type(nla) != IPSET_ATTR_DATA || + !flag_nested(nla) || + NLA_PARSE_NESTED(tb, IPSET_ATTR_ADT_MAX, nla, + set->type->adt_policy, NULL)) + return -IPSET_ERR_PROTOCOL; + ret = call_ad(ctnl, skb, set, tb, IPSET_ADD, + flags, use_lineno); + if (ret < 0) + return ret; + } + } + return ret; +} + +static int +IPSET_CBFN(ip_set_udel, struct net *net, struct sock *ctnl, + struct sk_buff *skb, const struct nlmsghdr *nlh, + const struct nlattr * const attr[], + struct netlink_ext_ack *extack) +{ + struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl)); + struct ip_set *set; + struct nlattr *tb[IPSET_ATTR_ADT_MAX + 1] = {}; + const struct nlattr *nla; + u32 flags = flag_exist(nlh); + bool use_lineno; + int ret = 0; + + if (unlikely(protocol_min_failed(attr) || + !attr[IPSET_ATTR_SETNAME] || + !((attr[IPSET_ATTR_DATA] != NULL) ^ + (attr[IPSET_ATTR_ADT] != NULL)) || + (attr[IPSET_ATTR_DATA] && + !flag_nested(attr[IPSET_ATTR_DATA])) || + (attr[IPSET_ATTR_ADT] && + (!flag_nested(attr[IPSET_ATTR_ADT]) || + !attr[IPSET_ATTR_LINENO])))) + return -IPSET_ERR_PROTOCOL; + + set = find_set(inst, nla_data(attr[IPSET_ATTR_SETNAME])); + if (!set) + return -ENOENT; + + use_lineno = !!attr[IPSET_ATTR_LINENO]; + if (attr[IPSET_ATTR_DATA]) { + if (NLA_PARSE_NESTED(tb, IPSET_ATTR_ADT_MAX, + attr[IPSET_ATTR_DATA], + set->type->adt_policy, NULL)) + return -IPSET_ERR_PROTOCOL; + ret = call_ad(ctnl, skb, set, tb, IPSET_DEL, flags, + use_lineno); + } else { + int nla_rem; + + nla_for_each_nested(nla, attr[IPSET_ATTR_ADT], nla_rem) { + memset(tb, 0, sizeof(*tb)); + if (nla_type(nla) != IPSET_ATTR_DATA || + !flag_nested(nla) || + NLA_PARSE_NESTED(tb, IPSET_ATTR_ADT_MAX, nla, + set->type->adt_policy, NULL)) + return -IPSET_ERR_PROTOCOL; + ret = call_ad(ctnl, skb, set, tb, IPSET_DEL, + flags, use_lineno); + if (ret < 0) + return ret; + } + } + return ret; +} + +static int +IPSET_CBFN(ip_set_utest, struct net *net, struct sock *ctnl, + struct sk_buff *skb, + const struct nlmsghdr *nlh, + const struct nlattr * const attr[], + struct netlink_ext_ack *extack) +{ + struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl)); + struct ip_set *set; + struct nlattr *tb[IPSET_ATTR_ADT_MAX + 1] = {}; + int ret = 0; + + if (unlikely(protocol_min_failed(attr) || + !attr[IPSET_ATTR_SETNAME] || + !attr[IPSET_ATTR_DATA] || + !flag_nested(attr[IPSET_ATTR_DATA]))) + return -IPSET_ERR_PROTOCOL; + + set = find_set(inst, nla_data(attr[IPSET_ATTR_SETNAME])); + if (!set) + return -ENOENT; + + if (NLA_PARSE_NESTED(tb, IPSET_ATTR_ADT_MAX, attr[IPSET_ATTR_DATA], + set->type->adt_policy, NULL)) + return -IPSET_ERR_PROTOCOL; + + rcu_read_lock_bh(); + ret = set->variant->uadt(set, tb, IPSET_TEST, NULL, 0, 0); + rcu_read_unlock_bh(); + /* Userspace can't trigger element to be re-added */ + if (ret == -EAGAIN) + ret = 1; + + return ret > 0 ? 0 : -IPSET_ERR_EXIST; +} + +/* Get headed data of a set */ + +static int +IPSET_CBFN(ip_set_header, struct net *net, struct sock *ctnl, + struct sk_buff *skb, const struct nlmsghdr *nlh, + const struct nlattr * const attr[], + struct netlink_ext_ack *extack) +{ + struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl)); + const struct ip_set *set; + struct sk_buff *skb2; + struct nlmsghdr *nlh2; + int ret = 0; + + if (unlikely(protocol_min_failed(attr) || + !attr[IPSET_ATTR_SETNAME])) + return -IPSET_ERR_PROTOCOL; + + set = find_set(inst, nla_data(attr[IPSET_ATTR_SETNAME])); + if (!set) + return -ENOENT; + + skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); + if (!skb2) + return -ENOMEM; + + nlh2 = start_msg(skb2, NETLINK_PORTID(skb), nlh->nlmsg_seq, 0, + IPSET_CMD_HEADER); + if (!nlh2) + goto nlmsg_failure; + if (nla_put_u8(skb2, IPSET_ATTR_PROTOCOL, protocol(attr)) || + nla_put_string(skb2, IPSET_ATTR_SETNAME, set->name) || + nla_put_string(skb2, IPSET_ATTR_TYPENAME, set->type->name) || + nla_put_u8(skb2, IPSET_ATTR_FAMILY, set->family) || + nla_put_u8(skb2, IPSET_ATTR_REVISION, set->revision)) + goto nla_put_failure; + nlmsg_end(skb2, nlh2); + + ret = netlink_unicast(ctnl, skb2, NETLINK_PORTID(skb), MSG_DONTWAIT); + if (ret < 0) + return ret; + + return 0; + +nla_put_failure: + nlmsg_cancel(skb2, nlh2); +nlmsg_failure: + kfree_skb(skb2); + return -EMSGSIZE; +} + +/* Get type data */ + +static const struct nla_policy ip_set_type_policy[IPSET_ATTR_CMD_MAX + 1] = { + [IPSET_ATTR_PROTOCOL] = { .type = NLA_U8 }, + [IPSET_ATTR_TYPENAME] = { .type = NLA_NUL_STRING, + .len = IPSET_MAXNAMELEN - 1 }, + [IPSET_ATTR_FAMILY] = { .type = NLA_U8 }, +}; + +static int +IPSET_CBFN(ip_set_type, struct net *net, struct sock *ctnl, + struct sk_buff *skb, const struct nlmsghdr *nlh, + const struct nlattr * const attr[], + struct netlink_ext_ack *extack) +{ + struct sk_buff *skb2; + struct nlmsghdr *nlh2; + u8 family, min, max; + const char *typename; + int ret = 0; + + if (unlikely(protocol_min_failed(attr) || + !attr[IPSET_ATTR_TYPENAME] || + !attr[IPSET_ATTR_FAMILY])) + return -IPSET_ERR_PROTOCOL; + + family = nla_get_u8(attr[IPSET_ATTR_FAMILY]); + typename = nla_data(attr[IPSET_ATTR_TYPENAME]); + ret = find_set_type_minmax(typename, family, &min, &max); + if (ret) + return ret; + + skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); + if (!skb2) + return -ENOMEM; + + nlh2 = start_msg(skb2, NETLINK_PORTID(skb), nlh->nlmsg_seq, 0, + IPSET_CMD_TYPE); + if (!nlh2) + goto nlmsg_failure; + if (nla_put_u8(skb2, IPSET_ATTR_PROTOCOL, protocol(attr)) || + nla_put_string(skb2, IPSET_ATTR_TYPENAME, typename) || + nla_put_u8(skb2, IPSET_ATTR_FAMILY, family) || + nla_put_u8(skb2, IPSET_ATTR_REVISION, max) || + nla_put_u8(skb2, IPSET_ATTR_REVISION_MIN, min)) + goto nla_put_failure; + nlmsg_end(skb2, nlh2); + + pr_debug("Send TYPE, nlmsg_len: %u\n", nlh2->nlmsg_len); + ret = netlink_unicast(ctnl, skb2, NETLINK_PORTID(skb), MSG_DONTWAIT); + if (ret < 0) + return ret; + + return 0; + +nla_put_failure: + nlmsg_cancel(skb2, nlh2); +nlmsg_failure: + kfree_skb(skb2); + return -EMSGSIZE; +} + +/* Get protocol version */ + +static const struct nla_policy +ip_set_protocol_policy[IPSET_ATTR_CMD_MAX + 1] = { + [IPSET_ATTR_PROTOCOL] = { .type = NLA_U8 }, +}; + +static int +IPSET_CBFN(ip_set_protocol, struct net *net, struct sock *ctnl, + struct sk_buff *skb, const struct nlmsghdr *nlh, + const struct nlattr * const attr[], + struct netlink_ext_ack *extack) +{ + struct sk_buff *skb2; + struct nlmsghdr *nlh2; + int ret = 0; + + if (unlikely(!attr[IPSET_ATTR_PROTOCOL])) + return -IPSET_ERR_PROTOCOL; + + skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); + if (!skb2) + return -ENOMEM; + + nlh2 = start_msg(skb2, NETLINK_PORTID(skb), nlh->nlmsg_seq, 0, + IPSET_CMD_PROTOCOL); + if (!nlh2) + goto nlmsg_failure; + if (nla_put_u8(skb2, IPSET_ATTR_PROTOCOL, IPSET_PROTOCOL)) + goto nla_put_failure; + if (nla_put_u8(skb2, IPSET_ATTR_PROTOCOL_MIN, IPSET_PROTOCOL_MIN)) + goto nla_put_failure; + nlmsg_end(skb2, nlh2); + + ret = netlink_unicast(ctnl, skb2, NETLINK_PORTID(skb), MSG_DONTWAIT); + if (ret < 0) + return ret; + + return 0; + +nla_put_failure: + nlmsg_cancel(skb2, nlh2); +nlmsg_failure: + kfree_skb(skb2); + return -EMSGSIZE; +} + +/* Get set by name or index, from userspace */ + +static int +IPSET_CBFN(ip_set_byname, struct net *net, struct sock *ctnl, + struct sk_buff *skb, const struct nlmsghdr *nlh, + const struct nlattr * const attr[], + struct netlink_ext_ack *extack) +{ + struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl)); + struct sk_buff *skb2; + struct nlmsghdr *nlh2; + ip_set_id_t id = IPSET_INVALID_ID; + const struct ip_set *set; + int ret = 0; + + if (unlikely(protocol_failed(attr) || + !attr[IPSET_ATTR_SETNAME])) + return -IPSET_ERR_PROTOCOL; + + set = find_set_and_id(inst, nla_data(attr[IPSET_ATTR_SETNAME]), &id); + if (id == IPSET_INVALID_ID) + return -ENOENT; + + skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); + if (!skb2) + return -ENOMEM; + + nlh2 = start_msg(skb2, NETLINK_PORTID(skb), nlh->nlmsg_seq, 0, + IPSET_CMD_GET_BYNAME); + if (!nlh2) + goto nlmsg_failure; + if (nla_put_u8(skb2, IPSET_ATTR_PROTOCOL, protocol(attr)) || + nla_put_u8(skb2, IPSET_ATTR_FAMILY, set->family) || + nla_put_net16(skb2, IPSET_ATTR_INDEX, htons(id))) + goto nla_put_failure; + nlmsg_end(skb2, nlh2); + + ret = netlink_unicast(ctnl, skb2, NETLINK_PORTID(skb), MSG_DONTWAIT); + if (ret < 0) + return ret; + + return 0; + +nla_put_failure: + nlmsg_cancel(skb2, nlh2); +nlmsg_failure: + kfree_skb(skb2); + return -EMSGSIZE; +} + +static const struct nla_policy ip_set_index_policy[IPSET_ATTR_CMD_MAX + 1] = { + [IPSET_ATTR_PROTOCOL] = { .type = NLA_U8 }, + [IPSET_ATTR_INDEX] = { .type = NLA_U16 }, +}; + +static int +IPSET_CBFN(ip_set_byindex, struct net *net, struct sock *ctnl, + struct sk_buff *skb, const struct nlmsghdr *nlh, + const struct nlattr * const attr[], + struct netlink_ext_ack *extack) +{ + struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl)); + struct sk_buff *skb2; + struct nlmsghdr *nlh2; + ip_set_id_t id = IPSET_INVALID_ID; + const struct ip_set *set; + int ret = 0; + + if (unlikely(protocol_failed(attr) || + !attr[IPSET_ATTR_INDEX])) + return -IPSET_ERR_PROTOCOL; + + id = ip_set_get_h16(attr[IPSET_ATTR_INDEX]); + if (id >= inst->ip_set_max) + return -ENOENT; + set = ip_set(inst, id); + if (set == NULL) + return -ENOENT; + + skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); + if (!skb2) + return -ENOMEM; + + nlh2 = start_msg(skb2, NETLINK_PORTID(skb), nlh->nlmsg_seq, 0, + IPSET_CMD_GET_BYINDEX); + if (!nlh2) + goto nlmsg_failure; + if (nla_put_u8(skb2, IPSET_ATTR_PROTOCOL, protocol(attr)) || + nla_put_string(skb2, IPSET_ATTR_SETNAME, set->name)) + goto nla_put_failure; + nlmsg_end(skb2, nlh2); + + ret = netlink_unicast(ctnl, skb2, NETLINK_PORTID(skb), MSG_DONTWAIT); + if (ret < 0) + return ret; + + return 0; + +nla_put_failure: + nlmsg_cancel(skb2, nlh2); +nlmsg_failure: + kfree_skb(skb2); + return -EMSGSIZE; +} + +static const struct nfnl_callback ip_set_netlink_subsys_cb[IPSET_MSG_MAX] = { + [IPSET_CMD_NONE] = { + .call = ip_set_none, + .attr_count = IPSET_ATTR_CMD_MAX, + }, + [IPSET_CMD_CREATE] = { + .call = ip_set_create, + .attr_count = IPSET_ATTR_CMD_MAX, + .policy = ip_set_create_policy, + }, + [IPSET_CMD_DESTROY] = { + .call = ip_set_destroy, + .attr_count = IPSET_ATTR_CMD_MAX, + .policy = ip_set_setname_policy, + }, + [IPSET_CMD_FLUSH] = { + .call = ip_set_flush, + .attr_count = IPSET_ATTR_CMD_MAX, + .policy = ip_set_setname_policy, + }, + [IPSET_CMD_RENAME] = { + .call = ip_set_rename, + .attr_count = IPSET_ATTR_CMD_MAX, + .policy = ip_set_setname2_policy, + }, + [IPSET_CMD_SWAP] = { + .call = ip_set_swap, + .attr_count = IPSET_ATTR_CMD_MAX, + .policy = ip_set_setname2_policy, + }, + [IPSET_CMD_LIST] = { + .call = ip_set_dump, + .attr_count = IPSET_ATTR_CMD_MAX, + .policy = ip_set_setname_policy, + }, + [IPSET_CMD_SAVE] = { + .call = ip_set_dump, + .attr_count = IPSET_ATTR_CMD_MAX, + .policy = ip_set_setname_policy, + }, + [IPSET_CMD_ADD] = { + .call = ip_set_uadd, + .attr_count = IPSET_ATTR_CMD_MAX, + .policy = ip_set_adt_policy, + }, + [IPSET_CMD_DEL] = { + .call = ip_set_udel, + .attr_count = IPSET_ATTR_CMD_MAX, + .policy = ip_set_adt_policy, + }, + [IPSET_CMD_TEST] = { + .call = ip_set_utest, + .attr_count = IPSET_ATTR_CMD_MAX, + .policy = ip_set_adt_policy, + }, + [IPSET_CMD_HEADER] = { + .call = ip_set_header, + .attr_count = IPSET_ATTR_CMD_MAX, + .policy = ip_set_setname_policy, + }, + [IPSET_CMD_TYPE] = { + .call = ip_set_type, + .attr_count = IPSET_ATTR_CMD_MAX, + .policy = ip_set_type_policy, + }, + [IPSET_CMD_PROTOCOL] = { + .call = ip_set_protocol, + .attr_count = IPSET_ATTR_CMD_MAX, + .policy = ip_set_protocol_policy, + }, + [IPSET_CMD_GET_BYNAME] = { + .call = ip_set_byname, + .attr_count = IPSET_ATTR_CMD_MAX, + .policy = ip_set_setname_policy, + }, + [IPSET_CMD_GET_BYINDEX] = { + .call = ip_set_byindex, + .attr_count = IPSET_ATTR_CMD_MAX, + .policy = ip_set_index_policy, + }, +}; + +static struct nfnetlink_subsystem ip_set_netlink_subsys __read_mostly = { + .name = "ip_set", + .subsys_id = NFNL_SUBSYS_IPSET, + .cb_count = IPSET_MSG_MAX, + .cb = ip_set_netlink_subsys_cb, +}; + +/* Interface to iptables/ip6tables */ + +static int +ip_set_sockfn_get(struct sock *sk, int optval, void __user *user, int *len) +{ + unsigned int *op; + void *data; + int copylen = *len, ret = 0; + struct net *net = sock_net(sk); + struct ip_set_net *inst = ip_set_pernet(net); + + if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) + return -EPERM; + if (optval != SO_IP_SET) + return -EBADF; + if (*len < sizeof(unsigned int)) + return -EINVAL; + + data = vmalloc(*len); + if (!data) + return -ENOMEM; + if (copy_from_user(data, user, *len) != 0) { + ret = -EFAULT; + goto done; + } + op = data; + + if (*op < IP_SET_OP_VERSION) { + /* Check the version at the beginning of operations */ + struct ip_set_req_version *req_version = data; + + if (*len < sizeof(struct ip_set_req_version)) { + ret = -EINVAL; + goto done; + } + + if (req_version->version < IPSET_PROTOCOL_MIN) { + ret = -EPROTO; + goto done; + } + } + + switch (*op) { + case IP_SET_OP_VERSION: { + struct ip_set_req_version *req_version = data; + + if (*len != sizeof(struct ip_set_req_version)) { + ret = -EINVAL; + goto done; + } + + req_version->version = IPSET_PROTOCOL; + ret = copy_to_user(user, req_version, + sizeof(struct ip_set_req_version)); + goto done; + } + case IP_SET_OP_GET_BYNAME: { + struct ip_set_req_get_set *req_get = data; + ip_set_id_t id; + + if (*len != sizeof(struct ip_set_req_get_set)) { + ret = -EINVAL; + goto done; + } + req_get->set.name[IPSET_MAXNAMELEN - 1] = '\0'; + nfnl_lock(NFNL_SUBSYS_IPSET); + find_set_and_id(inst, req_get->set.name, &id); + req_get->set.index = id; + nfnl_unlock(NFNL_SUBSYS_IPSET); + goto copy; + } + case IP_SET_OP_GET_FNAME: { + struct ip_set_req_get_set_family *req_get = data; + ip_set_id_t id; + + if (*len != sizeof(struct ip_set_req_get_set_family)) { + ret = -EINVAL; + goto done; + } + req_get->set.name[IPSET_MAXNAMELEN - 1] = '\0'; + nfnl_lock(NFNL_SUBSYS_IPSET); + find_set_and_id(inst, req_get->set.name, &id); + req_get->set.index = id; + if (id != IPSET_INVALID_ID) + req_get->family = ip_set(inst, id)->family; + nfnl_unlock(NFNL_SUBSYS_IPSET); + goto copy; + } + case IP_SET_OP_GET_BYINDEX: { + struct ip_set_req_get_set *req_get = data; + struct ip_set *set; + + if (*len != sizeof(struct ip_set_req_get_set) || + req_get->set.index >= inst->ip_set_max) { + ret = -EINVAL; + goto done; + } + nfnl_lock(NFNL_SUBSYS_IPSET); + set = ip_set(inst, req_get->set.index); + ret = strscpy(req_get->set.name, set ? set->name : "", + IPSET_MAXNAMELEN); + nfnl_unlock(NFNL_SUBSYS_IPSET); + if (ret < 0) + goto done; + goto copy; + } + default: + ret = -EBADMSG; + goto done; + } /* end of switch(op) */ + +copy: + ret = copy_to_user(user, data, copylen); + +done: + vfree(data); + if (ret > 0) + ret = 0; + return ret; +} + +static struct nf_sockopt_ops so_set __read_mostly = { + .pf = PF_INET, + .get_optmin = SO_IP_SET, + .get_optmax = SO_IP_SET + 1, + .get = ip_set_sockfn_get, + .owner = THIS_MODULE, +}; + +static int __net_init +ip_set_net_init(struct net *net) +{ + struct ip_set_net *inst; + struct ip_set **list; + +#ifdef HAVE_NET_OPS_ID + inst = ip_set_pernet(net); +#else + int err; + + inst = kzalloc(sizeof(struct ip_set_net), GFP_KERNEL); + if (!inst) + return -ENOMEM; + err = net_assign_generic(net, ip_set_net_id, inst); + if (err < 0) + goto err_alloc; +#endif + inst->ip_set_max = max_sets ? max_sets : CONFIG_IP_SET_MAX; + if (inst->ip_set_max >= IPSET_INVALID_ID) + inst->ip_set_max = IPSET_INVALID_ID - 1; + + list = kvcalloc(inst->ip_set_max, sizeof(struct ip_set *), GFP_KERNEL); + if (!list) +#ifdef HAVE_NET_OPS_ID + return -ENOMEM; +#else + goto err_alloc; +#endif + inst->is_deleted = false; + inst->is_destroyed = false; + rcu_assign_pointer(inst->ip_set_list, list); + return 0; + +#ifndef HAVE_NET_OPS_ID +err_alloc: + kfree(inst); + return err; +#endif +} + +static void __net_exit +ip_set_net_exit(struct net *net) +{ + struct ip_set_net *inst = ip_set_pernet(net); + + struct ip_set *set = NULL; + ip_set_id_t i; + + inst->is_deleted = true; /* flag for ip_set_nfnl_put */ + + nfnl_lock(NFNL_SUBSYS_IPSET); + for (i = 0; i < inst->ip_set_max; i++) { + set = ip_set(inst, i); + if (set) { + ip_set(inst, i) = NULL; + ip_set_destroy_set(set); + } + } + nfnl_unlock(NFNL_SUBSYS_IPSET); + kvfree(rcu_dereference_protected(inst->ip_set_list, 1)); +#ifndef HAVE_NET_OPS_ID + kvfree(inst); +#endif +} + +static struct pernet_operations ip_set_net_ops = { + .init = ip_set_net_init, + .exit = ip_set_net_exit, +#ifdef HAVE_NET_OPS_ID + .id = &ip_set_net_id, + .size = sizeof(struct ip_set_net), +#ifdef HAVE_NET_OPS_ASYNC + .async = true, +#endif +#endif +}; + +#ifdef HAVE_NET_OPS_ID +#define REGISTER_PERNET_SUBSYS(s) \ + register_pernet_subsys(s) +#define UNREGISTER_PERNET_SUBSYS(s) \ + unregister_pernet_subsys(s); +#else +#define REGISTER_PERNET_SUBSYS(s) \ + register_pernet_gen_device(&ip_set_net_id, s) +#define UNREGISTER_PERNET_SUBSYS(s) \ + unregister_pernet_gen_device(ip_set_net_id, s); +#endif + + +static int __init +ip_set_init(void) +{ + int ret = REGISTER_PERNET_SUBSYS(&ip_set_net_ops); + + if (ret) { + pr_err("ip_set: cannot register pernet_subsys.\n"); + return ret; + } + + ret = nfnetlink_subsys_register(&ip_set_netlink_subsys); + if (ret != 0) { + pr_err("ip_set: cannot register with nfnetlink.\n"); + UNREGISTER_PERNET_SUBSYS(&ip_set_net_ops); + return ret; + } + + ret = nf_register_sockopt(&so_set); + if (ret != 0) { + pr_err("SO_SET registry failed: %d\n", ret); + nfnetlink_subsys_unregister(&ip_set_netlink_subsys); + UNREGISTER_PERNET_SUBSYS(&ip_set_net_ops); + return ret; + } + + return 0; +} + +static void __exit +ip_set_fini(void) +{ + nf_unregister_sockopt(&so_set); + nfnetlink_subsys_unregister(&ip_set_netlink_subsys); + + UNREGISTER_PERNET_SUBSYS(&ip_set_net_ops); + pr_debug("these are the famous last words\n"); +} + +module_init(ip_set_init); +module_exit(ip_set_fini); diff --git a/kernel/net/netfilter/ipset/ip_set_getport.c b/kernel/net/netfilter/ipset/ip_set_getport.c new file mode 100644 index 0000000..8614bcd --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_getport.c @@ -0,0 +1,183 @@ +/* Copyright (C) 2003-2011 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Get Layer-4 data from the packets */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/* We must handle non-linear skbs */ +static bool +get_port(const struct sk_buff *skb, int protocol, unsigned int protooff, + bool src, __be16 *port, u8 *proto) +{ + switch (protocol) { + case IPPROTO_TCP: { + struct tcphdr _tcph; + const struct tcphdr *th; + + th = skb_header_pointer(skb, protooff, sizeof(_tcph), &_tcph); + if (!th) + /* No choice either */ + return false; + + *port = src ? th->source : th->dest; + break; + } + case IPPROTO_SCTP: { +#ifdef HAVE_TYPEDEF_SCTP_SCTPHDR_T + sctp_sctphdr_t _sh; + const sctp_sctphdr_t *sh; +#else + struct sctphdr _sh; + const struct sctphdr *sh; +#endif + + sh = skb_header_pointer(skb, protooff, sizeof(_sh), &_sh); + if (!sh) + /* No choice either */ + return false; + + *port = src ? sh->source : sh->dest; + break; + } + case IPPROTO_UDP: + case IPPROTO_UDPLITE: { + struct udphdr _udph; + const struct udphdr *uh; + + uh = skb_header_pointer(skb, protooff, sizeof(_udph), &_udph); + if (!uh) + /* No choice either */ + return false; + + *port = src ? uh->source : uh->dest; + break; + } + case IPPROTO_ICMP: { + struct icmphdr _ich; + const struct icmphdr *ic; + + ic = skb_header_pointer(skb, protooff, sizeof(_ich), &_ich); + if (!ic) + return false; + + *port = (__force __be16)htons((ic->type << 8) | ic->code); + break; + } + case IPPROTO_ICMPV6: { + struct icmp6hdr _ich; + const struct icmp6hdr *ic; + + ic = skb_header_pointer(skb, protooff, sizeof(_ich), &_ich); + if (!ic) + return false; + + *port = (__force __be16) + htons((ic->icmp6_type << 8) | ic->icmp6_code); + break; + } + default: + break; + } + *proto = protocol; + + return true; +} + +bool +ip_set_get_ip4_port(const struct sk_buff *skb, bool src, + __be16 *port, u8 *proto) +{ + const struct iphdr *iph = ip_hdr(skb); + unsigned int protooff = skb_network_offset(skb) + ip_hdrlen(skb); + int protocol = iph->protocol; + + /* See comments at tcp_match in ip_tables.c */ + if (protocol <= 0) + return false; + + if (ntohs(iph->frag_off) & IP_OFFSET) + switch (protocol) { + case IPPROTO_TCP: + case IPPROTO_SCTP: + case IPPROTO_UDP: + case IPPROTO_UDPLITE: + case IPPROTO_ICMP: + /* Port info not available for fragment offset > 0 */ + return false; + default: + /* Other protocols doesn't have ports, + * so we can match fragments. + */ + *proto = protocol; + return true; + } + + return get_port(skb, protocol, protooff, src, port, proto); +} +EXPORT_SYMBOL_GPL(ip_set_get_ip4_port); + +#if IS_ENABLED(CONFIG_IP6_NF_IPTABLES) +bool +ip_set_get_ip6_port(const struct sk_buff *skb, bool src, + __be16 *port, u8 *proto) +{ + int protoff; + u8 nexthdr; + __be16 frag_off = 0; + + nexthdr = ipv6_hdr(skb)->nexthdr; + protoff = ipv6_skip_exthdr(skb, + skb_network_offset(skb) + + sizeof(struct ipv6hdr), &nexthdr, + &frag_off); + if (protoff < 0 || (frag_off & htons(~0x7)) != 0) + return false; + + return get_port(skb, nexthdr, protoff, src, port, proto); +} +EXPORT_SYMBOL_GPL(ip_set_get_ip6_port); +#endif + +bool +ip_set_get_ip_port(const struct sk_buff *skb, u8 pf, bool src, __be16 *port) +{ + bool ret; + u8 proto; + + switch (pf) { + case NFPROTO_IPV4: + ret = ip_set_get_ip4_port(skb, src, port, &proto); + break; + case NFPROTO_IPV6: + ret = ip_set_get_ip6_port(skb, src, port, &proto); + break; + default: + return false; + } + if (!ret) + return ret; + switch (proto) { + case IPPROTO_TCP: + case IPPROTO_UDP: + return true; + default: + return false; + } +} +EXPORT_SYMBOL_GPL(ip_set_get_ip_port); diff --git a/kernel/net/netfilter/ipset/ip_set_hash_gen.h b/kernel/net/netfilter/ipset/ip_set_hash_gen.h new file mode 100644 index 0000000..6c34e7c --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_hash_gen.h @@ -0,0 +1,1356 @@ +/* Copyright (C) 2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _IP_SET_HASH_GEN_H +#define _IP_SET_HASH_GEN_H + +#include +#include +#include +#include + +#define __ipset_dereference_protected(p, c) rcu_dereference_protected(p, c) +#define ipset_dereference_protected(p, set) \ + __ipset_dereference_protected(p, lockdep_is_held(&(set)->lock)) + +#define rcu_dereference_bh_nfnl(p) rcu_dereference_bh_check(p, 1) + +/* Hashing which uses arrays to resolve clashing. The hash table is resized + * (doubled) when searching becomes too long. + * Internally jhash is used with the assumption that the size of the + * stored data is a multiple of sizeof(u32). + * + * Readers and resizing + * + * Resizing can be triggered by userspace command only, and those + * are serialized by the nfnl mutex. During resizing the set is + * read-locked, so the only possible concurrent operations are + * the kernel side readers. Those must be protected by proper RCU locking. + */ + +/* Number of elements to store in an initial array block */ +#define AHASH_INIT_SIZE 4 +/* Max number of elements to store in an array block */ +#define AHASH_MAX_SIZE (3 * AHASH_INIT_SIZE) +/* Max muber of elements in the array block when tuned */ +#define AHASH_MAX_TUNED 64 + +/* Max number of elements can be tuned */ +#ifdef IP_SET_HASH_WITH_MULTI +#define AHASH_MAX(h) ((h)->ahash_max) + +static inline u8 +tune_ahash_max(u8 curr, u32 multi) +{ + u32 n; + + if (multi < curr) + return curr; + + n = curr + AHASH_INIT_SIZE; + /* Currently, at listing one hash bucket must fit into a message. + * Therefore we have a hard limit here. + */ + return n > curr && n <= AHASH_MAX_TUNED ? n : curr; +} + +#define TUNE_AHASH_MAX(h, multi) \ + ((h)->ahash_max = tune_ahash_max((h)->ahash_max, multi)) +#else +#define AHASH_MAX(h) AHASH_MAX_SIZE +#define TUNE_AHASH_MAX(h, multi) +#endif + +/* A hash bucket */ +struct hbucket { + struct rcu_head rcu; /* for call_rcu_bh */ + /* Which positions are used in the array */ + DECLARE_BITMAP(used, AHASH_MAX_TUNED); + u8 size; /* size of the array */ + u8 pos; /* position of the first free entry */ + unsigned char value[0] /* the array of the values */ + __aligned(__alignof__(u64)); +}; + +/* The hash table: the table size stored here in order to make resizing easy */ +struct htable { + atomic_t ref; /* References for resizing */ + atomic_t uref; /* References for dumping */ + u8 htable_bits; /* size of hash table == 2^htable_bits */ + struct hbucket __rcu *bucket[0]; /* hashtable buckets */ +}; + +#define hbucket(h, i) ((h)->bucket[i]) +#define ext_size(n, dsize) \ + (sizeof(struct hbucket) + (n) * (dsize)) + +#ifndef IPSET_NET_COUNT +#define IPSET_NET_COUNT 1 +#endif + +/* Book-keeping of the prefixes added to the set */ +struct net_prefixes { + u32 nets[IPSET_NET_COUNT]; /* number of elements for this cidr */ + u8 cidr[IPSET_NET_COUNT]; /* the cidr value */ +}; + +/* Compute the hash table size */ +static size_t +htable_size(u8 hbits) +{ + size_t hsize; + + /* We must fit both into u32 in jhash and size_t */ + if (hbits > 31) + return 0; + hsize = jhash_size(hbits); + if ((((size_t)-1) - sizeof(struct htable)) / sizeof(struct hbucket *) + < hsize) + return 0; + + return hsize * sizeof(struct hbucket *) + sizeof(struct htable); +} + +/* Compute htable_bits from the user input parameter hashsize */ +static u8 +htable_bits(u32 hashsize) +{ + /* Assume that hashsize == 2^htable_bits */ + u8 bits = fls(hashsize - 1); + + if (jhash_size(bits) != hashsize) + /* Round up to the first 2^n value */ + bits = fls(hashsize); + + return bits; +} + +#ifdef IP_SET_HASH_WITH_NETS +#if IPSET_NET_COUNT > 1 +#define __CIDR(cidr, i) (cidr[i]) +#else +#define __CIDR(cidr, i) (cidr) +#endif + +/* cidr + 1 is stored in net_prefixes to support /0 */ +#define NCIDR_PUT(cidr) ((cidr) + 1) +#define NCIDR_GET(cidr) ((cidr) - 1) + +#ifdef IP_SET_HASH_WITH_NETS_PACKED +/* When cidr is packed with nomatch, cidr - 1 is stored in the data entry */ +#define DCIDR_PUT(cidr) ((cidr) - 1) +#define DCIDR_GET(cidr, i) (__CIDR(cidr, i) + 1) +#else +#define DCIDR_PUT(cidr) (cidr) +#define DCIDR_GET(cidr, i) __CIDR(cidr, i) +#endif + +#define INIT_CIDR(cidr, host_mask) \ + DCIDR_PUT(((cidr) ? NCIDR_GET(cidr) : host_mask)) + +#ifdef IP_SET_HASH_WITH_NET0 +/* cidr from 0 to HOST_MASK value and c = cidr + 1 */ +#define NLEN (HOST_MASK + 1) +#define CIDR_POS(c) ((c) - 1) +#else +/* cidr from 1 to HOST_MASK value and c = cidr + 1 */ +#define NLEN HOST_MASK +#define CIDR_POS(c) ((c) - 2) +#endif + +#else +#define NLEN 0 +#endif /* IP_SET_HASH_WITH_NETS */ + +#endif /* _IP_SET_HASH_GEN_H */ + +#ifndef MTYPE +#error "MTYPE is not defined!" +#endif + +#ifndef HTYPE +#error "HTYPE is not defined!" +#endif + +#ifndef HOST_MASK +#error "HOST_MASK is not defined!" +#endif + +/* Family dependent templates */ + +#undef ahash_data +#undef mtype_data_equal +#undef mtype_do_data_match +#undef mtype_data_set_flags +#undef mtype_data_reset_elem +#undef mtype_data_reset_flags +#undef mtype_data_netmask +#undef mtype_data_list +#undef mtype_data_next +#undef mtype_elem + +#undef mtype_ahash_destroy +#undef mtype_ext_cleanup +#undef mtype_add_cidr +#undef mtype_del_cidr +#undef mtype_ahash_memsize +#undef mtype_flush +#undef mtype_destroy +#undef mtype_same_set +#undef mtype_kadt +#undef mtype_uadt + +#undef mtype_add +#undef mtype_del +#undef mtype_test_cidrs +#undef mtype_test +#undef mtype_uref +#undef mtype_expire +#undef mtype_resize +#undef mtype_head +#undef mtype_list +#undef mtype_gc +#undef mtype_gc_init +#undef mtype_variant +#undef mtype_data_match + +#undef htype +#undef HKEY + +#define mtype_data_equal IPSET_TOKEN(MTYPE, _data_equal) +#ifdef IP_SET_HASH_WITH_NETS +#define mtype_do_data_match IPSET_TOKEN(MTYPE, _do_data_match) +#else +#define mtype_do_data_match(d) 1 +#endif +#define mtype_data_set_flags IPSET_TOKEN(MTYPE, _data_set_flags) +#define mtype_data_reset_elem IPSET_TOKEN(MTYPE, _data_reset_elem) +#define mtype_data_reset_flags IPSET_TOKEN(MTYPE, _data_reset_flags) +#define mtype_data_netmask IPSET_TOKEN(MTYPE, _data_netmask) +#define mtype_data_list IPSET_TOKEN(MTYPE, _data_list) +#define mtype_data_next IPSET_TOKEN(MTYPE, _data_next) +#define mtype_elem IPSET_TOKEN(MTYPE, _elem) + +#define mtype_ahash_destroy IPSET_TOKEN(MTYPE, _ahash_destroy) +#define mtype_ext_cleanup IPSET_TOKEN(MTYPE, _ext_cleanup) +#define mtype_add_cidr IPSET_TOKEN(MTYPE, _add_cidr) +#define mtype_del_cidr IPSET_TOKEN(MTYPE, _del_cidr) +#define mtype_ahash_memsize IPSET_TOKEN(MTYPE, _ahash_memsize) +#define mtype_flush IPSET_TOKEN(MTYPE, _flush) +#define mtype_destroy IPSET_TOKEN(MTYPE, _destroy) +#define mtype_same_set IPSET_TOKEN(MTYPE, _same_set) +#define mtype_kadt IPSET_TOKEN(MTYPE, _kadt) +#define mtype_uadt IPSET_TOKEN(MTYPE, _uadt) + +#define mtype_add IPSET_TOKEN(MTYPE, _add) +#define mtype_del IPSET_TOKEN(MTYPE, _del) +#define mtype_test_cidrs IPSET_TOKEN(MTYPE, _test_cidrs) +#define mtype_test IPSET_TOKEN(MTYPE, _test) +#define mtype_uref IPSET_TOKEN(MTYPE, _uref) +#define mtype_expire IPSET_TOKEN(MTYPE, _expire) +#define mtype_resize IPSET_TOKEN(MTYPE, _resize) +#define mtype_head IPSET_TOKEN(MTYPE, _head) +#define mtype_list IPSET_TOKEN(MTYPE, _list) +#define mtype_gc IPSET_TOKEN(MTYPE, _gc) +#define mtype_gc_init IPSET_TOKEN(MTYPE, _gc_init) +#define mtype_variant IPSET_TOKEN(MTYPE, _variant) +#define mtype_data_match IPSET_TOKEN(MTYPE, _data_match) + +#ifndef HKEY_DATALEN +#define HKEY_DATALEN sizeof(struct mtype_elem) +#endif + +#define htype MTYPE + +#define HKEY(data, initval, htable_bits) \ +({ \ + const u32 *__k = (const u32 *)data; \ + u32 __l = HKEY_DATALEN / sizeof(u32); \ + \ + BUILD_BUG_ON(HKEY_DATALEN % sizeof(u32) != 0); \ + \ + jhash2(__k, __l, initval) & jhash_mask(htable_bits); \ +}) + +/* The generic hash structure */ +struct htype { + struct htable __rcu *table; /* the hash table */ + struct timer_list gc; /* garbage collection when timeout enabled */ +#ifdef HAVE_TIMER_SETUP + struct ip_set *set; /* attached to this ip_set */ +#endif + u32 maxelem; /* max elements in the hash */ + u32 initval; /* random jhash init value */ +#ifdef IP_SET_HASH_WITH_MARKMASK + u32 markmask; /* markmask value for mark mask to store */ +#endif +#ifdef IP_SET_HASH_WITH_MULTI + u8 ahash_max; /* max elements in an array block */ +#endif +#ifdef IP_SET_HASH_WITH_NETMASK + u8 netmask; /* netmask value for subnets to store */ +#endif + struct mtype_elem next; /* temporary storage for uadd */ +#ifdef IP_SET_HASH_WITH_NETS + struct net_prefixes nets[NLEN]; /* book-keeping of prefixes */ +#endif +}; + +#ifdef IP_SET_HASH_WITH_NETS +/* Network cidr size book keeping when the hash stores different + * sized networks. cidr == real cidr + 1 to support /0. + */ +static void +mtype_add_cidr(struct htype *h, u8 cidr, u8 n) +{ + int i, j; + + /* Add in increasing prefix order, so larger cidr first */ + for (i = 0, j = -1; i < NLEN && h->nets[i].cidr[n]; i++) { + if (j != -1) { + continue; + } else if (h->nets[i].cidr[n] < cidr) { + j = i; + } else if (h->nets[i].cidr[n] == cidr) { + h->nets[CIDR_POS(cidr)].nets[n]++; + return; + } + } + if (j != -1) { + for (; i > j; i--) + h->nets[i].cidr[n] = h->nets[i - 1].cidr[n]; + } + h->nets[i].cidr[n] = cidr; + h->nets[CIDR_POS(cidr)].nets[n] = 1; +} + +static void +mtype_del_cidr(struct htype *h, u8 cidr, u8 n) +{ + u8 i, j, net_end = NLEN - 1; + + for (i = 0; i < NLEN; i++) { + if (h->nets[i].cidr[n] != cidr) + continue; + h->nets[CIDR_POS(cidr)].nets[n]--; + if (h->nets[CIDR_POS(cidr)].nets[n] > 0) + return; + for (j = i; j < net_end && h->nets[j].cidr[n]; j++) + h->nets[j].cidr[n] = h->nets[j + 1].cidr[n]; + h->nets[j].cidr[n] = 0; + return; + } +} +#endif + +/* Calculate the actual memory size of the set data */ +static size_t +mtype_ahash_memsize(const struct htype *h, const struct htable *t) +{ + return sizeof(*h) + sizeof(*t); +} + +/* Get the ith element from the array block n */ +#define ahash_data(n, i, dsize) \ + ((struct mtype_elem *)((n)->value + ((i) * (dsize)))) + +static void +mtype_ext_cleanup(struct ip_set *set, struct hbucket *n) +{ + int i; + + for (i = 0; i < n->pos; i++) + if (test_bit(i, n->used)) + ip_set_ext_destroy(set, ahash_data(n, i, set->dsize)); +} + +/* Flush a hash type of set: destroy all elements */ +static void +mtype_flush(struct ip_set *set) +{ + struct htype *h = set->data; + struct htable *t; + struct hbucket *n; + u32 i; + + t = ipset_dereference_protected(h->table, set); + for (i = 0; i < jhash_size(t->htable_bits); i++) { + n = __ipset_dereference_protected(hbucket(t, i), 1); + if (!n) + continue; + if (set->extensions & IPSET_EXT_DESTROY) + mtype_ext_cleanup(set, n); + /* FIXME: use slab cache */ + rcu_assign_pointer(hbucket(t, i), NULL); + kfree_rcu(n, rcu); + } +#ifdef IP_SET_HASH_WITH_NETS + memset(h->nets, 0, sizeof(h->nets)); +#endif + set->elements = 0; + set->ext_size = 0; +} + +/* Destroy the hashtable part of the set */ +static void +mtype_ahash_destroy(struct ip_set *set, struct htable *t, bool ext_destroy) +{ + struct hbucket *n; + u32 i; + + for (i = 0; i < jhash_size(t->htable_bits); i++) { + n = __ipset_dereference_protected(hbucket(t, i), 1); + if (!n) + continue; + if (set->extensions & IPSET_EXT_DESTROY && ext_destroy) + mtype_ext_cleanup(set, n); + /* FIXME: use slab cache */ + kfree(n); + } + + ip_set_free(t); +} + +/* Destroy a hash type of set */ +static void +mtype_destroy(struct ip_set *set) +{ + struct htype *h = set->data; + + if (SET_WITH_TIMEOUT(set)) + del_timer_sync(&h->gc); + + mtype_ahash_destroy(set, + __ipset_dereference_protected(h->table, 1), true); + kfree(h); + + set->data = NULL; +} + +static void +mtype_gc_init(struct ip_set *set, void (*gc)(GC_ARG)) +{ + struct htype *h = set->data; + + TIMER_SETUP(&h->gc, gc); + mod_timer(&h->gc, jiffies + IPSET_GC_PERIOD(set->timeout) * HZ); + pr_debug("gc initialized, run in every %u\n", + IPSET_GC_PERIOD(set->timeout)); +} + +static bool +mtype_same_set(const struct ip_set *a, const struct ip_set *b) +{ + const struct htype *x = a->data; + const struct htype *y = b->data; + + /* Resizing changes htable_bits, so we ignore it */ + return x->maxelem == y->maxelem && + a->timeout == b->timeout && +#ifdef IP_SET_HASH_WITH_NETMASK + x->netmask == y->netmask && +#endif +#ifdef IP_SET_HASH_WITH_MARKMASK + x->markmask == y->markmask && +#endif + a->extensions == b->extensions; +} + +/* Delete expired elements from the hashtable */ +static void +mtype_expire(struct ip_set *set, struct htype *h) +{ + struct htable *t; + struct hbucket *n, *tmp; + struct mtype_elem *data; + u32 i, j, d; + size_t dsize = set->dsize; +#ifdef IP_SET_HASH_WITH_NETS + u8 k; +#endif + + t = ipset_dereference_protected(h->table, set); + for (i = 0; i < jhash_size(t->htable_bits); i++) { + n = __ipset_dereference_protected(hbucket(t, i), 1); + if (!n) + continue; + for (j = 0, d = 0; j < n->pos; j++) { + if (!test_bit(j, n->used)) { + d++; + continue; + } + data = ahash_data(n, j, dsize); + if (!ip_set_timeout_expired(ext_timeout(data, set))) + continue; + pr_debug("expired %u/%u\n", i, j); + clear_bit(j, n->used); + smp_mb__after_atomic(); +#ifdef IP_SET_HASH_WITH_NETS + for (k = 0; k < IPSET_NET_COUNT; k++) + mtype_del_cidr(h, + NCIDR_PUT(DCIDR_GET(data->cidr, k)), + k); +#endif + ip_set_ext_destroy(set, data); + set->elements--; + d++; + } + if (d >= AHASH_INIT_SIZE) { + if (d >= n->size) { + set->ext_size -= ext_size(n->size, dsize); + rcu_assign_pointer(hbucket(t, i), NULL); + kfree_rcu(n, rcu); + continue; + } + tmp = kzalloc(sizeof(*tmp) + + (n->size - AHASH_INIT_SIZE) * dsize, + GFP_ATOMIC); + if (!tmp) + /* Still try to delete expired elements */ + continue; + tmp->size = n->size - AHASH_INIT_SIZE; + for (j = 0, d = 0; j < n->pos; j++) { + if (!test_bit(j, n->used)) + continue; + data = ahash_data(n, j, dsize); + memcpy(tmp->value + d * dsize, data, dsize); + set_bit(d, tmp->used); + d++; + } + tmp->pos = d; + set->ext_size -= ext_size(AHASH_INIT_SIZE, dsize); + rcu_assign_pointer(hbucket(t, i), tmp); + kfree_rcu(n, rcu); + } + } +} + +static void +mtype_gc(GC_ARG) +{ + INIT_GC_VARS(htype, h); + + pr_debug("called\n"); + spin_lock_bh(&set->lock); + mtype_expire(set, h); + spin_unlock_bh(&set->lock); + + h->gc.expires = jiffies + IPSET_GC_PERIOD(set->timeout) * HZ; + add_timer(&h->gc); +} + +/* Resize a hash: create a new hash table with doubling the hashsize + * and inserting the elements to it. Repeat until we succeed or + * fail due to memory pressures. + */ +static int +mtype_resize(struct ip_set *set, bool retried) +{ + struct htype *h = set->data; + struct htable *t, *orig; + u8 htable_bits; + size_t extsize, dsize = set->dsize; +#ifdef IP_SET_HASH_WITH_NETS + u8 flags; + struct mtype_elem *tmp; +#endif + struct mtype_elem *data; + struct mtype_elem *d; + struct hbucket *n, *m; + u32 i, j, key; + int ret; + +#ifdef IP_SET_HASH_WITH_NETS + tmp = kmalloc(dsize, GFP_KERNEL); + if (!tmp) + return -ENOMEM; +#endif + rcu_read_lock_bh(); + orig = rcu_dereference_bh_nfnl(h->table); + htable_bits = orig->htable_bits; + rcu_read_unlock_bh(); + +retry: + ret = 0; + htable_bits++; + if (!htable_bits) { + /* In case we have plenty of memory :-) */ + pr_warn("Cannot increase the hashsize of set %s further\n", + set->name); + ret = -IPSET_ERR_HASH_FULL; + goto out; + } + t = ip_set_alloc(htable_size(htable_bits)); + if (!t) { + ret = -ENOMEM; + goto out; + } + t->htable_bits = htable_bits; + + spin_lock_bh(&set->lock); + orig = __ipset_dereference_protected(h->table, 1); + /* There can't be another parallel resizing, but dumping is possible */ + atomic_set(&orig->ref, 1); + atomic_inc(&orig->uref); + extsize = 0; + pr_debug("attempt to resize set %s from %u to %u, t %p\n", + set->name, orig->htable_bits, htable_bits, orig); + for (i = 0; i < jhash_size(orig->htable_bits); i++) { + n = __ipset_dereference_protected(hbucket(orig, i), 1); + if (!n) + continue; + for (j = 0; j < n->pos; j++) { + if (!test_bit(j, n->used)) + continue; + data = ahash_data(n, j, dsize); +#ifdef IP_SET_HASH_WITH_NETS + /* We have readers running parallel with us, + * so the live data cannot be modified. + */ + flags = 0; + memcpy(tmp, data, dsize); + data = tmp; + mtype_data_reset_flags(data, &flags); +#endif + key = HKEY(data, h->initval, htable_bits); + m = __ipset_dereference_protected(hbucket(t, key), 1); + if (!m) { + m = kzalloc(sizeof(*m) + + AHASH_INIT_SIZE * dsize, + GFP_ATOMIC); + if (!m) { + ret = -ENOMEM; + goto cleanup; + } + m->size = AHASH_INIT_SIZE; + extsize = ext_size(AHASH_INIT_SIZE, dsize); + RCU_INIT_POINTER(hbucket(t, key), m); + } else if (m->pos >= m->size) { + struct hbucket *ht; + + if (m->size >= AHASH_MAX(h)) { + ret = -EAGAIN; + } else { + ht = kzalloc(sizeof(*ht) + + (m->size + AHASH_INIT_SIZE) + * dsize, + GFP_ATOMIC); + if (!ht) + ret = -ENOMEM; + } + if (ret < 0) + goto cleanup; + memcpy(ht, m, sizeof(struct hbucket) + + m->size * dsize); + ht->size = m->size + AHASH_INIT_SIZE; + extsize += ext_size(AHASH_INIT_SIZE, dsize); + kfree(m); + m = ht; + RCU_INIT_POINTER(hbucket(t, key), ht); + } + d = ahash_data(m, m->pos, dsize); + memcpy(d, data, dsize); + set_bit(m->pos++, m->used); +#ifdef IP_SET_HASH_WITH_NETS + mtype_data_reset_flags(d, &flags); +#endif + } + } + rcu_assign_pointer(h->table, t); + set->ext_size = extsize; + + spin_unlock_bh(&set->lock); + + /* Give time to other readers of the set */ + synchronize_rcu_bh(); + + pr_debug("set %s resized from %u (%p) to %u (%p)\n", set->name, + orig->htable_bits, orig, t->htable_bits, t); + /* If there's nobody else dumping the table, destroy it */ + if (atomic_dec_and_test(&orig->uref)) { + pr_debug("Table destroy by resize %p\n", orig); + mtype_ahash_destroy(set, orig, false); + } + +out: +#ifdef IP_SET_HASH_WITH_NETS + kfree(tmp); +#endif + return ret; + +cleanup: + atomic_set(&orig->ref, 0); + atomic_dec(&orig->uref); + spin_unlock_bh(&set->lock); + mtype_ahash_destroy(set, t, false); + if (ret == -EAGAIN) + goto retry; + goto out; +} + +/* Add an element to a hash and update the internal counters when succeeded, + * otherwise report the proper error code. + */ +static int +mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext, + struct ip_set_ext *mext, u32 flags) +{ + struct htype *h = set->data; + struct htable *t; + const struct mtype_elem *d = value; + struct mtype_elem *data; + struct hbucket *n, *old = ERR_PTR(-ENOENT); + int i, j = -1; + bool flag_exist = flags & IPSET_FLAG_EXIST; + bool deleted = false, forceadd = false, reuse = false; + u32 key, multi = 0; + + if (set->elements >= h->maxelem) { + if (SET_WITH_TIMEOUT(set)) + /* FIXME: when set is full, we slow down here */ + mtype_expire(set, h); + if (set->elements >= h->maxelem && SET_WITH_FORCEADD(set)) + forceadd = true; + } + + t = ipset_dereference_protected(h->table, set); + key = HKEY(value, h->initval, t->htable_bits); + n = __ipset_dereference_protected(hbucket(t, key), 1); + if (!n) { + if (forceadd || set->elements >= h->maxelem) + goto set_full; + old = NULL; + n = kzalloc(sizeof(*n) + AHASH_INIT_SIZE * set->dsize, + GFP_ATOMIC); + if (!n) + return -ENOMEM; + n->size = AHASH_INIT_SIZE; + set->ext_size += ext_size(AHASH_INIT_SIZE, set->dsize); + goto copy_elem; + } + for (i = 0; i < n->pos; i++) { + if (!test_bit(i, n->used)) { + /* Reuse first deleted entry */ + if (j == -1) { + deleted = reuse = true; + j = i; + } + continue; + } + data = ahash_data(n, i, set->dsize); + if (mtype_data_equal(data, d, &multi)) { + if (flag_exist || + (SET_WITH_TIMEOUT(set) && + ip_set_timeout_expired(ext_timeout(data, set)))) { + /* Just the extensions could be overwritten */ + j = i; + goto overwrite_extensions; + } + return -IPSET_ERR_EXIST; + } + /* Reuse first timed out entry */ + if (SET_WITH_TIMEOUT(set) && + ip_set_timeout_expired(ext_timeout(data, set)) && + j == -1) { + j = i; + reuse = true; + } + } + if (reuse || forceadd) { + data = ahash_data(n, j, set->dsize); + if (!deleted) { +#ifdef IP_SET_HASH_WITH_NETS + for (i = 0; i < IPSET_NET_COUNT; i++) + mtype_del_cidr(h, + NCIDR_PUT(DCIDR_GET(data->cidr, i)), + i); +#endif + ip_set_ext_destroy(set, data); + set->elements--; + } + goto copy_data; + } + if (set->elements >= h->maxelem) + goto set_full; + /* Create a new slot */ + if (n->pos >= n->size) { + TUNE_AHASH_MAX(h, multi); + if (n->size >= AHASH_MAX(h)) { + /* Trigger rehashing */ + mtype_data_next(&h->next, d); + return -EAGAIN; + } + old = n; + n = kzalloc(sizeof(*n) + + (old->size + AHASH_INIT_SIZE) * set->dsize, + GFP_ATOMIC); + if (!n) + return -ENOMEM; + memcpy(n, old, sizeof(struct hbucket) + + old->size * set->dsize); + n->size = old->size + AHASH_INIT_SIZE; + set->ext_size += ext_size(AHASH_INIT_SIZE, set->dsize); + } + +copy_elem: + j = n->pos++; + data = ahash_data(n, j, set->dsize); +copy_data: + set->elements++; +#ifdef IP_SET_HASH_WITH_NETS + for (i = 0; i < IPSET_NET_COUNT; i++) + mtype_add_cidr(h, NCIDR_PUT(DCIDR_GET(d->cidr, i)), i); +#endif + memcpy(data, d, sizeof(struct mtype_elem)); +overwrite_extensions: +#ifdef IP_SET_HASH_WITH_NETS + mtype_data_set_flags(data, flags); +#endif + if (SET_WITH_COUNTER(set)) + ip_set_init_counter(ext_counter(data, set), ext); + if (SET_WITH_COMMENT(set)) + ip_set_init_comment(set, ext_comment(data, set), ext); + if (SET_WITH_SKBINFO(set)) + ip_set_init_skbinfo(ext_skbinfo(data, set), ext); + /* Must come last for the case when timed out entry is reused */ + if (SET_WITH_TIMEOUT(set)) + ip_set_timeout_set(ext_timeout(data, set), ext->timeout); + smp_mb__before_atomic(); + set_bit(j, n->used); + if (old != ERR_PTR(-ENOENT)) { + rcu_assign_pointer(hbucket(t, key), n); + if (old) + kfree_rcu(old, rcu); + } + + return 0; +set_full: + if (net_ratelimit()) + pr_warn("Set %s is full, maxelem %u reached\n", + set->name, h->maxelem); + return -IPSET_ERR_HASH_FULL; +} + +/* Delete an element from the hash and free up space if possible. + */ +static int +mtype_del(struct ip_set *set, void *value, const struct ip_set_ext *ext, + struct ip_set_ext *mext, u32 flags) +{ + struct htype *h = set->data; + struct htable *t; + const struct mtype_elem *d = value; + struct mtype_elem *data; + struct hbucket *n; + int i, j, k, ret = -IPSET_ERR_EXIST; + u32 key, multi = 0; + size_t dsize = set->dsize; + + t = ipset_dereference_protected(h->table, set); + key = HKEY(value, h->initval, t->htable_bits); + n = __ipset_dereference_protected(hbucket(t, key), 1); + if (!n) + goto out; + for (i = 0, k = 0; i < n->pos; i++) { + if (!test_bit(i, n->used)) { + k++; + continue; + } + data = ahash_data(n, i, dsize); + if (!mtype_data_equal(data, d, &multi)) + continue; + if (SET_WITH_TIMEOUT(set) && + ip_set_timeout_expired(ext_timeout(data, set))) + goto out; + + ret = 0; + clear_bit(i, n->used); + smp_mb__after_atomic(); + if (i + 1 == n->pos) + n->pos--; + set->elements--; +#ifdef IP_SET_HASH_WITH_NETS + for (j = 0; j < IPSET_NET_COUNT; j++) + mtype_del_cidr(h, NCIDR_PUT(DCIDR_GET(d->cidr, j)), + j); +#endif + ip_set_ext_destroy(set, data); + + for (; i < n->pos; i++) { + if (!test_bit(i, n->used)) + k++; + } + if (n->pos == 0 && k == 0) { + set->ext_size -= ext_size(n->size, dsize); + rcu_assign_pointer(hbucket(t, key), NULL); + kfree_rcu(n, rcu); + } else if (k >= AHASH_INIT_SIZE) { + struct hbucket *tmp = kzalloc(sizeof(*tmp) + + (n->size - AHASH_INIT_SIZE) * dsize, + GFP_ATOMIC); + if (!tmp) + goto out; + tmp->size = n->size - AHASH_INIT_SIZE; + for (j = 0, k = 0; j < n->pos; j++) { + if (!test_bit(j, n->used)) + continue; + data = ahash_data(n, j, dsize); + memcpy(tmp->value + k * dsize, data, dsize); + set_bit(k, tmp->used); + k++; + } + tmp->pos = k; + set->ext_size -= ext_size(AHASH_INIT_SIZE, dsize); + rcu_assign_pointer(hbucket(t, key), tmp); + kfree_rcu(n, rcu); + } + goto out; + } + +out: + return ret; +} + +static inline int +mtype_data_match(struct mtype_elem *data, const struct ip_set_ext *ext, + struct ip_set_ext *mext, struct ip_set *set, u32 flags) +{ + if (!ip_set_match_extensions(set, ext, mext, flags, data)) + return 0; + /* nomatch entries return -ENOTEMPTY */ + return mtype_do_data_match(data); +} + +#ifdef IP_SET_HASH_WITH_NETS +/* Special test function which takes into account the different network + * sizes added to the set + */ +static int +mtype_test_cidrs(struct ip_set *set, struct mtype_elem *d, + const struct ip_set_ext *ext, + struct ip_set_ext *mext, u32 flags) +{ + struct htype *h = set->data; + struct htable *t = rcu_dereference_bh(h->table); + struct hbucket *n; + struct mtype_elem *data; +#if IPSET_NET_COUNT == 2 + struct mtype_elem orig = *d; + int ret, i, j = 0, k; +#else + int ret, i, j = 0; +#endif + u32 key, multi = 0; + + pr_debug("test by nets\n"); + for (; j < NLEN && h->nets[j].cidr[0] && !multi; j++) { +#if IPSET_NET_COUNT == 2 + mtype_data_reset_elem(d, &orig); + mtype_data_netmask(d, NCIDR_GET(h->nets[j].cidr[0]), false); + for (k = 0; k < NLEN && h->nets[k].cidr[1] && !multi; + k++) { + mtype_data_netmask(d, NCIDR_GET(h->nets[k].cidr[1]), + true); +#else + mtype_data_netmask(d, NCIDR_GET(h->nets[j].cidr[0])); +#endif + key = HKEY(d, h->initval, t->htable_bits); + n = rcu_dereference_bh(hbucket(t, key)); + if (!n) + continue; + for (i = 0; i < n->pos; i++) { + if (!test_bit(i, n->used)) + continue; + data = ahash_data(n, i, set->dsize); + if (!mtype_data_equal(data, d, &multi)) + continue; + ret = mtype_data_match(data, ext, mext, set, flags); + if (ret != 0) + return ret; +#ifdef IP_SET_HASH_WITH_MULTI + /* No match, reset multiple match flag */ + multi = 0; +#endif + } +#if IPSET_NET_COUNT == 2 + } +#endif + } + return 0; +} +#endif + +/* Test whether the element is added to the set */ +static int +mtype_test(struct ip_set *set, void *value, const struct ip_set_ext *ext, + struct ip_set_ext *mext, u32 flags) +{ + struct htype *h = set->data; + struct htable *t; + struct mtype_elem *d = value; + struct hbucket *n; + struct mtype_elem *data; + int i, ret = 0; + u32 key, multi = 0; + + t = rcu_dereference_bh(h->table); +#ifdef IP_SET_HASH_WITH_NETS + /* If we test an IP address and not a network address, + * try all possible network sizes + */ + for (i = 0; i < IPSET_NET_COUNT; i++) + if (DCIDR_GET(d->cidr, i) != HOST_MASK) + break; + if (i == IPSET_NET_COUNT) { + ret = mtype_test_cidrs(set, d, ext, mext, flags); + goto out; + } +#endif + + key = HKEY(d, h->initval, t->htable_bits); + n = rcu_dereference_bh(hbucket(t, key)); + if (!n) { + ret = 0; + goto out; + } + for (i = 0; i < n->pos; i++) { + if (!test_bit(i, n->used)) + continue; + data = ahash_data(n, i, set->dsize); + if (!mtype_data_equal(data, d, &multi)) + continue; + ret = mtype_data_match(data, ext, mext, set, flags); + if (ret != 0) + goto out; + } +out: + return ret; +} + +/* Reply a HEADER request: fill out the header part of the set */ +static int +mtype_head(struct ip_set *set, struct sk_buff *skb) +{ + struct htype *h = set->data; + const struct htable *t; + struct nlattr *nested; + size_t memsize; + u8 htable_bits; + + /* If any members have expired, set->elements will be wrong + * mytype_expire function will update it with the right count. + * we do not hold set->lock here, so grab it first. + * set->elements can still be incorrect in the case of a huge set, + * because elements might time out during the listing. + */ + if (SET_WITH_TIMEOUT(set)) { + spin_lock_bh(&set->lock); + mtype_expire(set, h); + spin_unlock_bh(&set->lock); + } + + rcu_read_lock_bh(); + t = rcu_dereference_bh_nfnl(h->table); + memsize = mtype_ahash_memsize(h, t) + set->ext_size; + htable_bits = t->htable_bits; + rcu_read_unlock_bh(); + + nested = ipset_nest_start(skb, IPSET_ATTR_DATA); + if (!nested) + goto nla_put_failure; + if (nla_put_net32(skb, IPSET_ATTR_HASHSIZE, + htonl(jhash_size(htable_bits))) || + nla_put_net32(skb, IPSET_ATTR_MAXELEM, htonl(h->maxelem))) + goto nla_put_failure; +#ifdef IP_SET_HASH_WITH_NETMASK + if (h->netmask != HOST_MASK && + nla_put_u8(skb, IPSET_ATTR_NETMASK, h->netmask)) + goto nla_put_failure; +#endif +#ifdef IP_SET_HASH_WITH_MARKMASK + if (nla_put_u32(skb, IPSET_ATTR_MARKMASK, h->markmask)) + goto nla_put_failure; +#endif + if (nla_put_net32(skb, IPSET_ATTR_REFERENCES, htonl(set->ref)) || + nla_put_net32(skb, IPSET_ATTR_MEMSIZE, htonl(memsize)) || + nla_put_net32(skb, IPSET_ATTR_ELEMENTS, htonl(set->elements))) + goto nla_put_failure; + if (unlikely(ip_set_put_flags(skb, set))) + goto nla_put_failure; + ipset_nest_end(skb, nested); + + return 0; +nla_put_failure: + return -EMSGSIZE; +} + +/* Make possible to run dumping parallel with resizing */ +static void +mtype_uref(struct ip_set *set, struct netlink_callback *cb, bool start) +{ + struct htype *h = set->data; + struct htable *t; + + if (start) { + rcu_read_lock_bh(); + t = rcu_dereference_bh_nfnl(h->table); + atomic_inc(&t->uref); + cb->args[IPSET_CB_PRIVATE] = (unsigned long)t; + rcu_read_unlock_bh(); + } else if (cb->args[IPSET_CB_PRIVATE]) { + t = (struct htable *)cb->args[IPSET_CB_PRIVATE]; + if (atomic_dec_and_test(&t->uref) && atomic_read(&t->ref)) { + /* Resizing didn't destroy the hash table */ + pr_debug("Table destroy by dump: %p\n", t); + mtype_ahash_destroy(set, t, false); + } + cb->args[IPSET_CB_PRIVATE] = 0; + } +} + +/* Reply a LIST/SAVE request: dump the elements of the specified set */ +static int +mtype_list(const struct ip_set *set, + struct sk_buff *skb, struct netlink_callback *cb) +{ + const struct htable *t; + struct nlattr *atd, *nested; + const struct hbucket *n; + const struct mtype_elem *e; + u32 first = cb->args[IPSET_CB_ARG0]; + /* We assume that one hash bucket fills into one page */ + void *incomplete; + int i, ret = 0; + + atd = ipset_nest_start(skb, IPSET_ATTR_ADT); + if (!atd) + return -EMSGSIZE; + + pr_debug("list hash set %s\n", set->name); + t = (const struct htable *)cb->args[IPSET_CB_PRIVATE]; + /* Expire may replace a hbucket with another one */ + rcu_read_lock(); + for (; cb->args[IPSET_CB_ARG0] < jhash_size(t->htable_bits); + cb->args[IPSET_CB_ARG0]++) { + cond_resched_rcu(); + incomplete = skb_tail_pointer(skb); + n = rcu_dereference(hbucket(t, cb->args[IPSET_CB_ARG0])); + pr_debug("cb->arg bucket: %lu, t %p n %p\n", + cb->args[IPSET_CB_ARG0], t, n); + if (!n) + continue; + for (i = 0; i < n->pos; i++) { + if (!test_bit(i, n->used)) + continue; + e = ahash_data(n, i, set->dsize); + if (SET_WITH_TIMEOUT(set) && + ip_set_timeout_expired(ext_timeout(e, set))) + continue; + pr_debug("list hash %lu hbucket %p i %u, data %p\n", + cb->args[IPSET_CB_ARG0], n, i, e); + nested = ipset_nest_start(skb, IPSET_ATTR_DATA); + if (!nested) { + if (cb->args[IPSET_CB_ARG0] == first) { + nla_nest_cancel(skb, atd); + ret = -EMSGSIZE; + goto out; + } + goto nla_put_failure; + } + if (mtype_data_list(skb, e)) + goto nla_put_failure; + if (ip_set_put_extensions(skb, set, e, true)) + goto nla_put_failure; + ipset_nest_end(skb, nested); + } + } + ipset_nest_end(skb, atd); + /* Set listing finished */ + cb->args[IPSET_CB_ARG0] = 0; + + goto out; + +nla_put_failure: + nlmsg_trim(skb, incomplete); + if (unlikely(first == cb->args[IPSET_CB_ARG0])) { + pr_warn("Can't list set %s: one bucket does not fit into a message. Please report it!\n", + set->name); + cb->args[IPSET_CB_ARG0] = 0; + ret = -EMSGSIZE; + } else { + ipset_nest_end(skb, atd); + } +out: + rcu_read_unlock(); + return ret; +} + +static int +IPSET_TOKEN(MTYPE, _kadt)(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt); + +static int +IPSET_TOKEN(MTYPE, _uadt)(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, + bool retried); + +static const struct ip_set_type_variant mtype_variant = { + .kadt = mtype_kadt, + .uadt = mtype_uadt, + .adt = { + [IPSET_ADD] = mtype_add, + [IPSET_DEL] = mtype_del, + [IPSET_TEST] = mtype_test, + }, + .destroy = mtype_destroy, + .flush = mtype_flush, + .head = mtype_head, + .list = mtype_list, + .uref = mtype_uref, + .resize = mtype_resize, + .same_set = mtype_same_set, +}; + +#ifdef IP_SET_EMIT_CREATE +static int +IPSET_TOKEN(HTYPE, _create)(struct net *net, struct ip_set *set, + struct nlattr *tb[], u32 flags) +{ + u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM; +#ifdef IP_SET_HASH_WITH_MARKMASK + u32 markmask; +#endif + u8 hbits; +#ifdef IP_SET_HASH_WITH_NETMASK + u8 netmask; +#endif + size_t hsize; + struct htype *h; + struct htable *t; + + pr_debug("Create set %s with family %s\n", + set->name, set->family == NFPROTO_IPV4 ? "inet" : "inet6"); + +#ifdef IP_SET_PROTO_UNDEF + if (set->family != NFPROTO_UNSPEC) + return -IPSET_ERR_INVALID_FAMILY; +#else + if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6)) + return -IPSET_ERR_INVALID_FAMILY; +#endif + + if (unlikely(!ip_set_optattr_netorder(tb, IPSET_ATTR_HASHSIZE) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_MAXELEM) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_TIMEOUT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + +#ifdef IP_SET_HASH_WITH_MARKMASK + /* Separated condition in order to avoid directive in argument list */ + if (unlikely(!ip_set_optattr_netorder(tb, IPSET_ATTR_MARKMASK))) + return -IPSET_ERR_PROTOCOL; + + markmask = 0xffffffff; + if (tb[IPSET_ATTR_MARKMASK]) { + markmask = ntohl(nla_get_be32(tb[IPSET_ATTR_MARKMASK])); + if (markmask == 0) + return -IPSET_ERR_INVALID_MARKMASK; + } +#endif + +#ifdef IP_SET_HASH_WITH_NETMASK + netmask = set->family == NFPROTO_IPV4 ? 32 : 128; + if (tb[IPSET_ATTR_NETMASK]) { + netmask = nla_get_u8(tb[IPSET_ATTR_NETMASK]); + + if ((set->family == NFPROTO_IPV4 && netmask > 32) || + (set->family == NFPROTO_IPV6 && netmask > 128) || + netmask == 0) + return -IPSET_ERR_INVALID_NETMASK; + } +#endif + + if (tb[IPSET_ATTR_HASHSIZE]) { + hashsize = ip_set_get_h32(tb[IPSET_ATTR_HASHSIZE]); + if (hashsize < IPSET_MIMINAL_HASHSIZE) + hashsize = IPSET_MIMINAL_HASHSIZE; + } + + if (tb[IPSET_ATTR_MAXELEM]) + maxelem = ip_set_get_h32(tb[IPSET_ATTR_MAXELEM]); + + hsize = sizeof(*h); + h = kzalloc(hsize, GFP_KERNEL); + if (!h) + return -ENOMEM; + + hbits = htable_bits(hashsize); + hsize = htable_size(hbits); + if (hsize == 0) { + kfree(h); + return -ENOMEM; + } + t = ip_set_alloc(hsize); + if (!t) { + kfree(h); + return -ENOMEM; + } + h->maxelem = maxelem; +#ifdef IP_SET_HASH_WITH_NETMASK + h->netmask = netmask; +#endif +#ifdef IP_SET_HASH_WITH_MARKMASK + h->markmask = markmask; +#endif + get_random_bytes(&h->initval, sizeof(h->initval)); + + t->htable_bits = hbits; + RCU_INIT_POINTER(h->table, t); + +#ifdef HAVE_TIMER_SETUP + h->set = set; +#endif + set->data = h; +#ifndef IP_SET_PROTO_UNDEF + if (set->family == NFPROTO_IPV4) { +#endif + set->variant = &IPSET_TOKEN(HTYPE, 4_variant); + set->dsize = ip_set_elem_len(set, tb, + sizeof(struct IPSET_TOKEN(HTYPE, 4_elem)), + __alignof__(struct IPSET_TOKEN(HTYPE, 4_elem))); +#ifndef IP_SET_PROTO_UNDEF + } else { + set->variant = &IPSET_TOKEN(HTYPE, 6_variant); + set->dsize = ip_set_elem_len(set, tb, + sizeof(struct IPSET_TOKEN(HTYPE, 6_elem)), + __alignof__(struct IPSET_TOKEN(HTYPE, 6_elem))); + } +#endif + set->timeout = IPSET_NO_TIMEOUT; + if (tb[IPSET_ATTR_TIMEOUT]) { + set->timeout = ip_set_timeout_uget(tb[IPSET_ATTR_TIMEOUT]); +#ifndef IP_SET_PROTO_UNDEF + if (set->family == NFPROTO_IPV4) +#endif + IPSET_TOKEN(HTYPE, 4_gc_init)(set, + IPSET_TOKEN(HTYPE, 4_gc)); +#ifndef IP_SET_PROTO_UNDEF + else + IPSET_TOKEN(HTYPE, 6_gc_init)(set, + IPSET_TOKEN(HTYPE, 6_gc)); +#endif + } + pr_debug("create %s hashsize %u (%u) maxelem %u: %p(%p)\n", + set->name, jhash_size(t->htable_bits), + t->htable_bits, h->maxelem, set->data, t); + + return 0; +} +#endif /* IP_SET_EMIT_CREATE */ + +#undef HKEY_DATALEN diff --git a/kernel/net/netfilter/ipset/ip_set_hash_ip.c b/kernel/net/netfilter/ipset/ip_set_hash_ip.c new file mode 100644 index 0000000..613eb21 --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_hash_ip.c @@ -0,0 +1,325 @@ +/* Copyright (C) 2003-2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module implementing an IP set type: the hash:ip type */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define IPSET_TYPE_REV_MIN 0 +/* 1 Counters support */ +/* 2 Comments support */ +/* 3 Forceadd support */ +#define IPSET_TYPE_REV_MAX 4 /* skbinfo support */ + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Jozsef Kadlecsik "); +IP_SET_MODULE_DESC("hash:ip", IPSET_TYPE_REV_MIN, IPSET_TYPE_REV_MAX); +MODULE_ALIAS("ip_set_hash:ip"); + +/* Type specific function prefix */ +#define HTYPE hash_ip +#define IP_SET_HASH_WITH_NETMASK + +/* IPv4 variant */ + +/* Member elements */ +struct hash_ip4_elem { + /* Zero valued IP addresses cannot be stored */ + __be32 ip; +}; + +/* Common functions */ + +static inline bool +hash_ip4_data_equal(const struct hash_ip4_elem *e1, + const struct hash_ip4_elem *e2, + u32 *multi) +{ + return e1->ip == e2->ip; +} + +static bool +hash_ip4_data_list(struct sk_buff *skb, const struct hash_ip4_elem *e) +{ + if (nla_put_ipaddr4(skb, IPSET_ATTR_IP, e->ip)) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_ip4_data_next(struct hash_ip4_elem *next, const struct hash_ip4_elem *e) +{ + next->ip = e->ip; +} + +#define MTYPE hash_ip4 +#define HOST_MASK 32 +#include "ip_set_hash_gen.h" + +static int +hash_ip4_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + const struct hash_ip4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ip4_elem e = { 0 }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + __be32 ip; + + ip4addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &ip); + ip &= ip_set_netmask(h->netmask); + if (ip == 0) + return -EINVAL; + + e.ip = ip; + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_ip4_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + const struct hash_ip4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ip4_elem e = { 0 }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + u32 ip = 0, ip_to = 0, hosts; + int ret = 0; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP])) + return -IPSET_ERR_PROTOCOL; + + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP], &ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + ip &= ip_set_hostmask(h->netmask); + e.ip = htonl(ip); + if (e.ip == 0) + return -IPSET_ERR_HASH_ELEM; + + if (adt == IPSET_TEST) + return adtfn(set, &e, &ext, &ext, flags); + + ip_to = ip; + if (tb[IPSET_ATTR_IP_TO]) { + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); + if (ret) + return ret; + if (ip > ip_to) + swap(ip, ip_to); + } else if (tb[IPSET_ATTR_CIDR]) { + u8 cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + + if (!cidr || cidr > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + ip_set_mask_from_to(ip, ip_to, cidr); + } + + hosts = h->netmask == 32 ? 1 : 2 << (32 - h->netmask - 1); + + if (retried) { + ip = ntohl(h->next.ip); + e.ip = htonl(ip); + } + for (; ip <= ip_to;) { + ret = adtfn(set, &e, &ext, &ext, flags); + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + ip += hosts; + e.ip = htonl(ip); + if (e.ip == 0) + return 0; + + ret = 0; + } + return ret; +} + +/* IPv6 variant */ + +/* Member elements */ +struct hash_ip6_elem { + union nf_inet_addr ip; +}; + +/* Common functions */ + +static inline bool +hash_ip6_data_equal(const struct hash_ip6_elem *ip1, + const struct hash_ip6_elem *ip2, + u32 *multi) +{ + return ipv6_addr_equal(&ip1->ip.in6, &ip2->ip.in6); +} + +static inline void +hash_ip6_netmask(union nf_inet_addr *ip, u8 prefix) +{ + ip6_netmask(ip, prefix); +} + +static bool +hash_ip6_data_list(struct sk_buff *skb, const struct hash_ip6_elem *e) +{ + if (nla_put_ipaddr6(skb, IPSET_ATTR_IP, &e->ip.in6)) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_ip6_data_next(struct hash_ip6_elem *next, const struct hash_ip6_elem *e) +{ +} + +#undef MTYPE +#undef HOST_MASK + +#define MTYPE hash_ip6 +#define HOST_MASK 128 + +#define IP_SET_EMIT_CREATE +#include "ip_set_hash_gen.h" + +static int +hash_ip6_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + const struct hash_ip6 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ip6_elem e = { { .all = { 0 } } }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + ip6addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip.in6); + hash_ip6_netmask(&e.ip, h->netmask); + if (ipv6_addr_any(&e.ip.in6)) + return -EINVAL; + + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_ip6_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + const struct hash_ip6 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ip6_elem e = { { .all = { 0 } } }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP])) + return -IPSET_ERR_PROTOCOL; + if (unlikely(tb[IPSET_ATTR_IP_TO])) + return -IPSET_ERR_HASH_RANGE_UNSUPPORTED; + if (unlikely(tb[IPSET_ATTR_CIDR])) { + u8 cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + + if (cidr != HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + } + + ret = ip_set_get_ipaddr6(tb[IPSET_ATTR_IP], &e.ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + hash_ip6_netmask(&e.ip, h->netmask); + if (ipv6_addr_any(&e.ip.in6)) + return -IPSET_ERR_HASH_ELEM; + + ret = adtfn(set, &e, &ext, &ext, flags); + + return ip_set_eexist(ret, flags) ? 0 : ret; +} + +static struct ip_set_type hash_ip_type __read_mostly = { + .name = "hash:ip", + .protocol = IPSET_PROTOCOL, + .features = IPSET_TYPE_IP, + .dimension = IPSET_DIM_ONE, + .family = NFPROTO_UNSPEC, + .revision_min = IPSET_TYPE_REV_MIN, + .revision_max = IPSET_TYPE_REV_MAX, + .create = hash_ip_create, + .create_policy = { + [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, + [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, + [IPSET_ATTR_PROBES] = { .type = NLA_U8 }, + [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_NETMASK] = { .type = NLA_U8 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + }, + .adt_policy = { + [IPSET_ATTR_IP] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP_TO] = { .type = NLA_NESTED }, + [IPSET_ATTR_CIDR] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_LINENO] = { .type = NLA_U32 }, + [IPSET_ATTR_BYTES] = { .type = NLA_U64 }, + [IPSET_ATTR_PACKETS] = { .type = NLA_U64 }, + [IPSET_ATTR_COMMENT] = { .type = NLA_NUL_STRING, + .len = IPSET_MAX_COMMENT_SIZE }, + [IPSET_ATTR_SKBMARK] = { .type = NLA_U64 }, + [IPSET_ATTR_SKBPRIO] = { .type = NLA_U32 }, + [IPSET_ATTR_SKBQUEUE] = { .type = NLA_U16 }, + }, + .me = THIS_MODULE, +}; + +static int __init +hash_ip_init(void) +{ + return ip_set_type_register(&hash_ip_type); +} + +static void __exit +hash_ip_fini(void) +{ + rcu_barrier(); + ip_set_type_unregister(&hash_ip_type); +} + +module_init(hash_ip_init); +module_exit(hash_ip_fini); diff --git a/kernel/net/netfilter/ipset/ip_set_hash_ipmac.c b/kernel/net/netfilter/ipset/ip_set_hash_ipmac.c new file mode 100644 index 0000000..c830c68 --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_hash_ipmac.c @@ -0,0 +1,316 @@ +/* Copyright (C) 2016 Tomasz Chilinski + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module implementing an IP set type: the hash:ip,mac type */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define IPSET_TYPE_REV_MIN 0 +#define IPSET_TYPE_REV_MAX 0 + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Tomasz Chilinski "); +IP_SET_MODULE_DESC("hash:ip,mac", IPSET_TYPE_REV_MIN, IPSET_TYPE_REV_MAX); +MODULE_ALIAS("ip_set_hash:ip,mac"); + +/* Type specific function prefix */ +#define HTYPE hash_ipmac + +/* IPv4 variant */ + +/* Member elements */ +struct hash_ipmac4_elem { + /* Zero valued IP addresses cannot be stored */ + __be32 ip; + union { + unsigned char ether[ETH_ALEN]; + __be32 foo[2]; + }; +}; + +/* Common functions */ + +static inline bool +hash_ipmac4_data_equal(const struct hash_ipmac4_elem *e1, + const struct hash_ipmac4_elem *e2, + u32 *multi) +{ + return e1->ip == e2->ip && ether_addr_equal(e1->ether, e2->ether); +} + +static bool +hash_ipmac4_data_list(struct sk_buff *skb, const struct hash_ipmac4_elem *e) +{ + if (nla_put_ipaddr4(skb, IPSET_ATTR_IP, e->ip) || + nla_put(skb, IPSET_ATTR_ETHER, ETH_ALEN, e->ether)) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_ipmac4_data_next(struct hash_ipmac4_elem *next, + const struct hash_ipmac4_elem *e) +{ + next->ip = e->ip; +} + +#define MTYPE hash_ipmac4 +#define PF 4 +#define HOST_MASK 32 +#define HKEY_DATALEN sizeof(struct hash_ipmac4_elem) +#include "ip_set_hash_gen.h" + +static int +hash_ipmac4_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipmac4_elem e = { .ip = 0, { .foo[0] = 0, .foo[1] = 0 } }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + /* MAC can be src only */ + if (!(opt->flags & IPSET_DIM_TWO_SRC)) + return 0; + + if (skb_mac_header(skb) < skb->head || + (skb_mac_header(skb) + ETH_HLEN) > skb->data) + return -EINVAL; + + if (opt->flags & IPSET_DIM_ONE_SRC) + ether_addr_copy(e.ether, eth_hdr(skb)->h_source); + else + ether_addr_copy(e.ether, eth_hdr(skb)->h_dest); + + if (is_zero_ether_addr(e.ether)) + return -EINVAL; + + ip4addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip); + + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_ipmac4_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipmac4_elem e = { .ip = 0, { .foo[0] = 0, .foo[1] = 0 } }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + int ret; + + if (unlikely(!tb[IPSET_ATTR_IP] || + !tb[IPSET_ATTR_ETHER] || + nla_len(tb[IPSET_ATTR_ETHER]) != ETH_ALEN || + !ip_set_optattr_netorder(tb, IPSET_ATTR_TIMEOUT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_PACKETS) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_BYTES) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_SKBMARK) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_SKBPRIO) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_SKBQUEUE))) + return -IPSET_ERR_PROTOCOL; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + ret = ip_set_get_ipaddr4(tb[IPSET_ATTR_IP], &e.ip) || + ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + memcpy(e.ether, nla_data(tb[IPSET_ATTR_ETHER]), ETH_ALEN); + if (is_zero_ether_addr(e.ether)) + return -IPSET_ERR_HASH_ELEM; + + return adtfn(set, &e, &ext, &ext, flags); +} + +/* IPv6 variant */ + +/* Member elements */ +struct hash_ipmac6_elem { + /* Zero valued IP addresses cannot be stored */ + union nf_inet_addr ip; + union { + unsigned char ether[ETH_ALEN]; + __be32 foo[2]; + }; +}; + +/* Common functions */ + +static inline bool +hash_ipmac6_data_equal(const struct hash_ipmac6_elem *e1, + const struct hash_ipmac6_elem *e2, + u32 *multi) +{ + return ipv6_addr_equal(&e1->ip.in6, &e2->ip.in6) && + ether_addr_equal(e1->ether, e2->ether); +} + +static bool +hash_ipmac6_data_list(struct sk_buff *skb, const struct hash_ipmac6_elem *e) +{ + if (nla_put_ipaddr6(skb, IPSET_ATTR_IP, &e->ip.in6) || + nla_put(skb, IPSET_ATTR_ETHER, ETH_ALEN, e->ether)) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_ipmac6_data_next(struct hash_ipmac6_elem *next, + const struct hash_ipmac6_elem *e) +{ +} + +#undef MTYPE +#undef PF +#undef HOST_MASK +#undef HKEY_DATALEN + +#define MTYPE hash_ipmac6 +#define PF 6 +#define HOST_MASK 128 +#define HKEY_DATALEN sizeof(struct hash_ipmac6_elem) +#define IP_SET_EMIT_CREATE +#include "ip_set_hash_gen.h" + +static int +hash_ipmac6_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipmac6_elem e = { + { .all = { 0 } }, + { .foo[0] = 0, .foo[1] = 0 } + }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + if (skb_mac_header(skb) < skb->head || + (skb_mac_header(skb) + ETH_HLEN) > skb->data) + return -EINVAL; + + if (opt->flags & IPSET_DIM_ONE_SRC) + ether_addr_copy(e.ether, eth_hdr(skb)->h_source); + else + ether_addr_copy(e.ether, eth_hdr(skb)->h_dest); + + if (is_zero_ether_addr(e.ether)) + return -EINVAL; + + ip6addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip.in6); + + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_ipmac6_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipmac6_elem e = { + { .all = { 0 } }, + { .foo[0] = 0, .foo[1] = 0 } + }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + int ret; + + if (unlikely(!tb[IPSET_ATTR_IP] || + !tb[IPSET_ATTR_ETHER] || + nla_len(tb[IPSET_ATTR_ETHER]) != ETH_ALEN || + !ip_set_optattr_netorder(tb, IPSET_ATTR_TIMEOUT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_PACKETS) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_BYTES) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_SKBMARK) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_SKBPRIO) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_SKBQUEUE))) + return -IPSET_ERR_PROTOCOL; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + ret = ip_set_get_ipaddr6(tb[IPSET_ATTR_IP], &e.ip) || + ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + memcpy(e.ether, nla_data(tb[IPSET_ATTR_ETHER]), ETH_ALEN); + if (is_zero_ether_addr(e.ether)) + return -IPSET_ERR_HASH_ELEM; + + return adtfn(set, &e, &ext, &ext, flags); +} + +static struct ip_set_type hash_ipmac_type __read_mostly = { + .name = "hash:ip,mac", + .protocol = IPSET_PROTOCOL, + .features = IPSET_TYPE_IP | IPSET_TYPE_MAC, + .dimension = IPSET_DIM_TWO, + .family = NFPROTO_UNSPEC, + .revision_min = IPSET_TYPE_REV_MIN, + .revision_max = IPSET_TYPE_REV_MAX, + .create = hash_ipmac_create, + .create_policy = { + [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, + [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, + [IPSET_ATTR_PROBES] = { .type = NLA_U8 }, + [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + }, + .adt_policy = { + [IPSET_ATTR_IP] = { .type = NLA_NESTED }, + [IPSET_ATTR_ETHER] = { .type = NLA_BINARY, + .len = ETH_ALEN }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_LINENO] = { .type = NLA_U32 }, + [IPSET_ATTR_BYTES] = { .type = NLA_U64 }, + [IPSET_ATTR_PACKETS] = { .type = NLA_U64 }, + [IPSET_ATTR_COMMENT] = { .type = NLA_NUL_STRING }, + [IPSET_ATTR_SKBMARK] = { .type = NLA_U64 }, + [IPSET_ATTR_SKBPRIO] = { .type = NLA_U32 }, + [IPSET_ATTR_SKBQUEUE] = { .type = NLA_U16 }, + }, + .me = THIS_MODULE, +}; + +static int __init +hash_ipmac_init(void) +{ + return ip_set_type_register(&hash_ipmac_type); +} + +static void __exit +hash_ipmac_fini(void) +{ + ip_set_type_unregister(&hash_ipmac_type); +} + +module_init(hash_ipmac_init); +module_exit(hash_ipmac_fini); diff --git a/kernel/net/netfilter/ipset/ip_set_hash_ipmark.c b/kernel/net/netfilter/ipset/ip_set_hash_ipmark.c new file mode 100644 index 0000000..f3ba834 --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_hash_ipmark.c @@ -0,0 +1,324 @@ +/* Copyright (C) 2003-2013 Jozsef Kadlecsik + * Copyright (C) 2013 Smoothwall Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module implementing an IP set type: the hash:ip,mark type */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define IPSET_TYPE_REV_MIN 0 +/* 1 Forceadd support */ +#define IPSET_TYPE_REV_MAX 2 /* skbinfo support */ + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Vytas Dauksa "); +IP_SET_MODULE_DESC("hash:ip,mark", IPSET_TYPE_REV_MIN, IPSET_TYPE_REV_MAX); +MODULE_ALIAS("ip_set_hash:ip,mark"); + +/* Type specific function prefix */ +#define HTYPE hash_ipmark +#define IP_SET_HASH_WITH_MARKMASK + +/* IPv4 variant */ + +/* Member elements */ +struct hash_ipmark4_elem { + __be32 ip; + __u32 mark; +}; + +/* Common functions */ + +static inline bool +hash_ipmark4_data_equal(const struct hash_ipmark4_elem *ip1, + const struct hash_ipmark4_elem *ip2, + u32 *multi) +{ + return ip1->ip == ip2->ip && + ip1->mark == ip2->mark; +} + +static bool +hash_ipmark4_data_list(struct sk_buff *skb, + const struct hash_ipmark4_elem *data) +{ + if (nla_put_ipaddr4(skb, IPSET_ATTR_IP, data->ip) || + nla_put_net32(skb, IPSET_ATTR_MARK, htonl(data->mark))) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_ipmark4_data_next(struct hash_ipmark4_elem *next, + const struct hash_ipmark4_elem *d) +{ + next->ip = d->ip; +} + +#define MTYPE hash_ipmark4 +#define HOST_MASK 32 +#include "ip_set_hash_gen.h" + +static int +hash_ipmark4_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + const struct hash_ipmark4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipmark4_elem e = { }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + e.mark = skb->mark; + e.mark &= h->markmask; + + ip4addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip); + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_ipmark4_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + const struct hash_ipmark4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipmark4_elem e = { }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + u32 ip, ip_to = 0; + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP] || + !ip_set_attr_netorder(tb, IPSET_ATTR_MARK))) + return -IPSET_ERR_PROTOCOL; + + ret = ip_set_get_ipaddr4(tb[IPSET_ATTR_IP], &e.ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + e.mark = ntohl(nla_get_be32(tb[IPSET_ATTR_MARK])); + e.mark &= h->markmask; + + if (adt == IPSET_TEST || + !(tb[IPSET_ATTR_IP_TO] || tb[IPSET_ATTR_CIDR])) { + ret = adtfn(set, &e, &ext, &ext, flags); + return ip_set_eexist(ret, flags) ? 0 : ret; + } + + ip_to = ip = ntohl(e.ip); + if (tb[IPSET_ATTR_IP_TO]) { + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); + if (ret) + return ret; + if (ip > ip_to) + swap(ip, ip_to); + } else if (tb[IPSET_ATTR_CIDR]) { + u8 cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + + if (!cidr || cidr > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + ip_set_mask_from_to(ip, ip_to, cidr); + } + + if (retried) + ip = ntohl(h->next.ip); + for (; ip <= ip_to; ip++) { + e.ip = htonl(ip); + ret = adtfn(set, &e, &ext, &ext, flags); + + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + ret = 0; + } + return ret; +} + +/* IPv6 variant */ + +struct hash_ipmark6_elem { + union nf_inet_addr ip; + __u32 mark; +}; + +/* Common functions */ + +static inline bool +hash_ipmark6_data_equal(const struct hash_ipmark6_elem *ip1, + const struct hash_ipmark6_elem *ip2, + u32 *multi) +{ + return ipv6_addr_equal(&ip1->ip.in6, &ip2->ip.in6) && + ip1->mark == ip2->mark; +} + +static bool +hash_ipmark6_data_list(struct sk_buff *skb, + const struct hash_ipmark6_elem *data) +{ + if (nla_put_ipaddr6(skb, IPSET_ATTR_IP, &data->ip.in6) || + nla_put_net32(skb, IPSET_ATTR_MARK, htonl(data->mark))) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_ipmark6_data_next(struct hash_ipmark6_elem *next, + const struct hash_ipmark6_elem *d) +{ +} + +#undef MTYPE +#undef HOST_MASK + +#define MTYPE hash_ipmark6 +#define HOST_MASK 128 +#define IP_SET_EMIT_CREATE +#include "ip_set_hash_gen.h" + +static int +hash_ipmark6_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + const struct hash_ipmark6 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipmark6_elem e = { }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + e.mark = skb->mark; + e.mark &= h->markmask; + + ip6addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip.in6); + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_ipmark6_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + const struct hash_ipmark6 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipmark6_elem e = { }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP] || + !ip_set_attr_netorder(tb, IPSET_ATTR_MARK))) + return -IPSET_ERR_PROTOCOL; + if (unlikely(tb[IPSET_ATTR_IP_TO])) + return -IPSET_ERR_HASH_RANGE_UNSUPPORTED; + if (unlikely(tb[IPSET_ATTR_CIDR])) { + u8 cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + + if (cidr != HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + } + + ret = ip_set_get_ipaddr6(tb[IPSET_ATTR_IP], &e.ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + e.mark = ntohl(nla_get_be32(tb[IPSET_ATTR_MARK])); + e.mark &= h->markmask; + + if (adt == IPSET_TEST) { + ret = adtfn(set, &e, &ext, &ext, flags); + return ip_set_eexist(ret, flags) ? 0 : ret; + } + + ret = adtfn(set, &e, &ext, &ext, flags); + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + return 0; +} + +static struct ip_set_type hash_ipmark_type __read_mostly = { + .name = "hash:ip,mark", + .protocol = IPSET_PROTOCOL, + .features = IPSET_TYPE_IP | IPSET_TYPE_MARK, + .dimension = IPSET_DIM_TWO, + .family = NFPROTO_UNSPEC, + .revision_min = IPSET_TYPE_REV_MIN, + .revision_max = IPSET_TYPE_REV_MAX, + .create = hash_ipmark_create, + .create_policy = { + [IPSET_ATTR_MARKMASK] = { .type = NLA_U32 }, + [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, + [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, + [IPSET_ATTR_PROBES] = { .type = NLA_U8 }, + [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + }, + .adt_policy = { + [IPSET_ATTR_IP] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP_TO] = { .type = NLA_NESTED }, + [IPSET_ATTR_MARK] = { .type = NLA_U32 }, + [IPSET_ATTR_CIDR] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_LINENO] = { .type = NLA_U32 }, + [IPSET_ATTR_BYTES] = { .type = NLA_U64 }, + [IPSET_ATTR_PACKETS] = { .type = NLA_U64 }, + [IPSET_ATTR_COMMENT] = { .type = NLA_NUL_STRING, + .len = IPSET_MAX_COMMENT_SIZE }, + [IPSET_ATTR_SKBMARK] = { .type = NLA_U64 }, + [IPSET_ATTR_SKBPRIO] = { .type = NLA_U32 }, + [IPSET_ATTR_SKBQUEUE] = { .type = NLA_U16 }, + }, + .me = THIS_MODULE, +}; + +static int __init +hash_ipmark_init(void) +{ + return ip_set_type_register(&hash_ipmark_type); +} + +static void __exit +hash_ipmark_fini(void) +{ + rcu_barrier(); + ip_set_type_unregister(&hash_ipmark_type); +} + +module_init(hash_ipmark_init); +module_exit(hash_ipmark_fini); diff --git a/kernel/net/netfilter/ipset/ip_set_hash_ipport.c b/kernel/net/netfilter/ipset/ip_set_hash_ipport.c new file mode 100644 index 0000000..ddb8039 --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_hash_ipport.c @@ -0,0 +1,392 @@ +/* Copyright (C) 2003-2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module implementing an IP set type: the hash:ip,port type */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define IPSET_TYPE_REV_MIN 0 +/* 1 SCTP and UDPLITE support added */ +/* 2 Counters support added */ +/* 3 Comments support added */ +/* 4 Forceadd support added */ +#define IPSET_TYPE_REV_MAX 5 /* skbinfo support added */ + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Jozsef Kadlecsik "); +IP_SET_MODULE_DESC("hash:ip,port", IPSET_TYPE_REV_MIN, IPSET_TYPE_REV_MAX); +MODULE_ALIAS("ip_set_hash:ip,port"); + +/* Type specific function prefix */ +#define HTYPE hash_ipport + +/* IPv4 variant */ + +/* Member elements */ +struct hash_ipport4_elem { + __be32 ip; + __be16 port; + u8 proto; + u8 padding; +}; + +/* Common functions */ + +static inline bool +hash_ipport4_data_equal(const struct hash_ipport4_elem *ip1, + const struct hash_ipport4_elem *ip2, + u32 *multi) +{ + return ip1->ip == ip2->ip && + ip1->port == ip2->port && + ip1->proto == ip2->proto; +} + +static bool +hash_ipport4_data_list(struct sk_buff *skb, + const struct hash_ipport4_elem *data) +{ + if (nla_put_ipaddr4(skb, IPSET_ATTR_IP, data->ip) || + nla_put_net16(skb, IPSET_ATTR_PORT, data->port) || + nla_put_u8(skb, IPSET_ATTR_PROTO, data->proto)) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_ipport4_data_next(struct hash_ipport4_elem *next, + const struct hash_ipport4_elem *d) +{ + next->ip = d->ip; + next->port = d->port; +} + +#define MTYPE hash_ipport4 +#define HOST_MASK 32 +#include "ip_set_hash_gen.h" + +static int +hash_ipport4_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipport4_elem e = { .ip = 0 }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + if (!ip_set_get_ip4_port(skb, opt->flags & IPSET_DIM_TWO_SRC, + &e.port, &e.proto)) + return -EINVAL; + + ip4addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip); + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_ipport4_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + const struct hash_ipport4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipport4_elem e = { .ip = 0 }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + u32 ip, ip_to = 0, p = 0, port, port_to; + bool with_ports = false; + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP] || + !ip_set_attr_netorder(tb, IPSET_ATTR_PORT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_PORT_TO))) + return -IPSET_ERR_PROTOCOL; + + ret = ip_set_get_ipaddr4(tb[IPSET_ATTR_IP], &e.ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + e.port = nla_get_be16(tb[IPSET_ATTR_PORT]); + + if (tb[IPSET_ATTR_PROTO]) { + e.proto = nla_get_u8(tb[IPSET_ATTR_PROTO]); + with_ports = ip_set_proto_with_ports(e.proto); + + if (e.proto == 0) + return -IPSET_ERR_INVALID_PROTO; + } else { + return -IPSET_ERR_MISSING_PROTO; + } + + if (!(with_ports || e.proto == IPPROTO_ICMP)) + e.port = 0; + + if (adt == IPSET_TEST || + !(tb[IPSET_ATTR_IP_TO] || tb[IPSET_ATTR_CIDR] || + tb[IPSET_ATTR_PORT_TO])) { + ret = adtfn(set, &e, &ext, &ext, flags); + return ip_set_eexist(ret, flags) ? 0 : ret; + } + + ip_to = ip = ntohl(e.ip); + if (tb[IPSET_ATTR_IP_TO]) { + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); + if (ret) + return ret; + if (ip > ip_to) + swap(ip, ip_to); + } else if (tb[IPSET_ATTR_CIDR]) { + u8 cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + + if (!cidr || cidr > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + ip_set_mask_from_to(ip, ip_to, cidr); + } + + port_to = port = ntohs(e.port); + if (with_ports && tb[IPSET_ATTR_PORT_TO]) { + port_to = ip_set_get_h16(tb[IPSET_ATTR_PORT_TO]); + if (port > port_to) + swap(port, port_to); + } + + if (retried) + ip = ntohl(h->next.ip); + for (; ip <= ip_to; ip++) { + p = retried && ip == ntohl(h->next.ip) ? ntohs(h->next.port) + : port; + for (; p <= port_to; p++) { + e.ip = htonl(ip); + e.port = htons(p); + ret = adtfn(set, &e, &ext, &ext, flags); + + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + ret = 0; + } + } + return ret; +} + +/* IPv6 variant */ + +struct hash_ipport6_elem { + union nf_inet_addr ip; + __be16 port; + u8 proto; + u8 padding; +}; + +/* Common functions */ + +static inline bool +hash_ipport6_data_equal(const struct hash_ipport6_elem *ip1, + const struct hash_ipport6_elem *ip2, + u32 *multi) +{ + return ipv6_addr_equal(&ip1->ip.in6, &ip2->ip.in6) && + ip1->port == ip2->port && + ip1->proto == ip2->proto; +} + +static bool +hash_ipport6_data_list(struct sk_buff *skb, + const struct hash_ipport6_elem *data) +{ + if (nla_put_ipaddr6(skb, IPSET_ATTR_IP, &data->ip.in6) || + nla_put_net16(skb, IPSET_ATTR_PORT, data->port) || + nla_put_u8(skb, IPSET_ATTR_PROTO, data->proto)) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_ipport6_data_next(struct hash_ipport6_elem *next, + const struct hash_ipport6_elem *d) +{ + next->port = d->port; +} + +#undef MTYPE +#undef HOST_MASK + +#define MTYPE hash_ipport6 +#define HOST_MASK 128 +#define IP_SET_EMIT_CREATE +#include "ip_set_hash_gen.h" + +static int +hash_ipport6_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipport6_elem e = { .ip = { .all = { 0 } } }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + if (!ip_set_get_ip6_port(skb, opt->flags & IPSET_DIM_TWO_SRC, + &e.port, &e.proto)) + return -EINVAL; + + ip6addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip.in6); + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_ipport6_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + const struct hash_ipport6 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipport6_elem e = { .ip = { .all = { 0 } } }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + u32 port, port_to; + bool with_ports = false; + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP] || + !ip_set_attr_netorder(tb, IPSET_ATTR_PORT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_PORT_TO))) + return -IPSET_ERR_PROTOCOL; + if (unlikely(tb[IPSET_ATTR_IP_TO])) + return -IPSET_ERR_HASH_RANGE_UNSUPPORTED; + if (unlikely(tb[IPSET_ATTR_CIDR])) { + u8 cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + + if (cidr != HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + } + + ret = ip_set_get_ipaddr6(tb[IPSET_ATTR_IP], &e.ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + e.port = nla_get_be16(tb[IPSET_ATTR_PORT]); + + if (tb[IPSET_ATTR_PROTO]) { + e.proto = nla_get_u8(tb[IPSET_ATTR_PROTO]); + with_ports = ip_set_proto_with_ports(e.proto); + + if (e.proto == 0) + return -IPSET_ERR_INVALID_PROTO; + } else { + return -IPSET_ERR_MISSING_PROTO; + } + + if (!(with_ports || e.proto == IPPROTO_ICMPV6)) + e.port = 0; + + if (adt == IPSET_TEST || !with_ports || !tb[IPSET_ATTR_PORT_TO]) { + ret = adtfn(set, &e, &ext, &ext, flags); + return ip_set_eexist(ret, flags) ? 0 : ret; + } + + port = ntohs(e.port); + port_to = ip_set_get_h16(tb[IPSET_ATTR_PORT_TO]); + if (port > port_to) + swap(port, port_to); + + if (retried) + port = ntohs(h->next.port); + for (; port <= port_to; port++) { + e.port = htons(port); + ret = adtfn(set, &e, &ext, &ext, flags); + + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + ret = 0; + } + return ret; +} + +static struct ip_set_type hash_ipport_type __read_mostly = { + .name = "hash:ip,port", + .protocol = IPSET_PROTOCOL, + .features = IPSET_TYPE_IP | IPSET_TYPE_PORT, + .dimension = IPSET_DIM_TWO, + .family = NFPROTO_UNSPEC, + .revision_min = IPSET_TYPE_REV_MIN, + .revision_max = IPSET_TYPE_REV_MAX, + .create = hash_ipport_create, + .create_policy = { + [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, + [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, + [IPSET_ATTR_PROBES] = { .type = NLA_U8 }, + [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, + [IPSET_ATTR_PROTO] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + }, + .adt_policy = { + [IPSET_ATTR_IP] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP_TO] = { .type = NLA_NESTED }, + [IPSET_ATTR_PORT] = { .type = NLA_U16 }, + [IPSET_ATTR_PORT_TO] = { .type = NLA_U16 }, + [IPSET_ATTR_CIDR] = { .type = NLA_U8 }, + [IPSET_ATTR_PROTO] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_LINENO] = { .type = NLA_U32 }, + [IPSET_ATTR_BYTES] = { .type = NLA_U64 }, + [IPSET_ATTR_PACKETS] = { .type = NLA_U64 }, + [IPSET_ATTR_COMMENT] = { .type = NLA_NUL_STRING, + .len = IPSET_MAX_COMMENT_SIZE }, + [IPSET_ATTR_SKBMARK] = { .type = NLA_U64 }, + [IPSET_ATTR_SKBPRIO] = { .type = NLA_U32 }, + [IPSET_ATTR_SKBQUEUE] = { .type = NLA_U16 }, + }, + .me = THIS_MODULE, +}; + +static int __init +hash_ipport_init(void) +{ + return ip_set_type_register(&hash_ipport_type); +} + +static void __exit +hash_ipport_fini(void) +{ + rcu_barrier(); + ip_set_type_unregister(&hash_ipport_type); +} + +module_init(hash_ipport_init); +module_exit(hash_ipport_fini); diff --git a/kernel/net/netfilter/ipset/ip_set_hash_ipportip.c b/kernel/net/netfilter/ipset/ip_set_hash_ipportip.c new file mode 100644 index 0000000..a7f4d7a --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_hash_ipportip.c @@ -0,0 +1,407 @@ +/* Copyright (C) 2003-2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module implementing an IP set type: the hash:ip,port,ip type */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define IPSET_TYPE_REV_MIN 0 +/* 1 SCTP and UDPLITE support added */ +/* 2 Counters support added */ +/* 3 Comments support added */ +/* 4 Forceadd support added */ +#define IPSET_TYPE_REV_MAX 5 /* skbinfo support added */ + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Jozsef Kadlecsik "); +IP_SET_MODULE_DESC("hash:ip,port,ip", IPSET_TYPE_REV_MIN, IPSET_TYPE_REV_MAX); +MODULE_ALIAS("ip_set_hash:ip,port,ip"); + +/* Type specific function prefix */ +#define HTYPE hash_ipportip + +/* IPv4 variant */ + +/* Member elements */ +struct hash_ipportip4_elem { + __be32 ip; + __be32 ip2; + __be16 port; + u8 proto; + u8 padding; +}; + +static inline bool +hash_ipportip4_data_equal(const struct hash_ipportip4_elem *ip1, + const struct hash_ipportip4_elem *ip2, + u32 *multi) +{ + return ip1->ip == ip2->ip && + ip1->ip2 == ip2->ip2 && + ip1->port == ip2->port && + ip1->proto == ip2->proto; +} + +static bool +hash_ipportip4_data_list(struct sk_buff *skb, + const struct hash_ipportip4_elem *data) +{ + if (nla_put_ipaddr4(skb, IPSET_ATTR_IP, data->ip) || + nla_put_ipaddr4(skb, IPSET_ATTR_IP2, data->ip2) || + nla_put_net16(skb, IPSET_ATTR_PORT, data->port) || + nla_put_u8(skb, IPSET_ATTR_PROTO, data->proto)) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_ipportip4_data_next(struct hash_ipportip4_elem *next, + const struct hash_ipportip4_elem *d) +{ + next->ip = d->ip; + next->port = d->port; +} + +/* Common functions */ +#define MTYPE hash_ipportip4 +#define HOST_MASK 32 +#include "ip_set_hash_gen.h" + +static int +hash_ipportip4_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipportip4_elem e = { .ip = 0 }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + if (!ip_set_get_ip4_port(skb, opt->flags & IPSET_DIM_TWO_SRC, + &e.port, &e.proto)) + return -EINVAL; + + ip4addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip); + ip4addrptr(skb, opt->flags & IPSET_DIM_THREE_SRC, &e.ip2); + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_ipportip4_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + const struct hash_ipportip4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipportip4_elem e = { .ip = 0 }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + u32 ip, ip_to = 0, p = 0, port, port_to; + bool with_ports = false; + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP] || !tb[IPSET_ATTR_IP2] || + !ip_set_attr_netorder(tb, IPSET_ATTR_PORT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_PORT_TO))) + return -IPSET_ERR_PROTOCOL; + + ret = ip_set_get_ipaddr4(tb[IPSET_ATTR_IP], &e.ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + ret = ip_set_get_ipaddr4(tb[IPSET_ATTR_IP2], &e.ip2); + if (ret) + return ret; + + e.port = nla_get_be16(tb[IPSET_ATTR_PORT]); + + if (tb[IPSET_ATTR_PROTO]) { + e.proto = nla_get_u8(tb[IPSET_ATTR_PROTO]); + with_ports = ip_set_proto_with_ports(e.proto); + + if (e.proto == 0) + return -IPSET_ERR_INVALID_PROTO; + } else { + return -IPSET_ERR_MISSING_PROTO; + } + + if (!(with_ports || e.proto == IPPROTO_ICMP)) + e.port = 0; + + if (adt == IPSET_TEST || + !(tb[IPSET_ATTR_IP_TO] || tb[IPSET_ATTR_CIDR] || + tb[IPSET_ATTR_PORT_TO])) { + ret = adtfn(set, &e, &ext, &ext, flags); + return ip_set_eexist(ret, flags) ? 0 : ret; + } + + ip_to = ip = ntohl(e.ip); + if (tb[IPSET_ATTR_IP_TO]) { + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); + if (ret) + return ret; + if (ip > ip_to) + swap(ip, ip_to); + } else if (tb[IPSET_ATTR_CIDR]) { + u8 cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + + if (!cidr || cidr > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + ip_set_mask_from_to(ip, ip_to, cidr); + } + + port_to = port = ntohs(e.port); + if (with_ports && tb[IPSET_ATTR_PORT_TO]) { + port_to = ip_set_get_h16(tb[IPSET_ATTR_PORT_TO]); + if (port > port_to) + swap(port, port_to); + } + + if (retried) + ip = ntohl(h->next.ip); + for (; ip <= ip_to; ip++) { + p = retried && ip == ntohl(h->next.ip) ? ntohs(h->next.port) + : port; + for (; p <= port_to; p++) { + e.ip = htonl(ip); + e.port = htons(p); + ret = adtfn(set, &e, &ext, &ext, flags); + + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + ret = 0; + } + } + return ret; +} + +/* IPv6 variant */ + +struct hash_ipportip6_elem { + union nf_inet_addr ip; + union nf_inet_addr ip2; + __be16 port; + u8 proto; + u8 padding; +}; + +/* Common functions */ + +static inline bool +hash_ipportip6_data_equal(const struct hash_ipportip6_elem *ip1, + const struct hash_ipportip6_elem *ip2, + u32 *multi) +{ + return ipv6_addr_equal(&ip1->ip.in6, &ip2->ip.in6) && + ipv6_addr_equal(&ip1->ip2.in6, &ip2->ip2.in6) && + ip1->port == ip2->port && + ip1->proto == ip2->proto; +} + +static bool +hash_ipportip6_data_list(struct sk_buff *skb, + const struct hash_ipportip6_elem *data) +{ + if (nla_put_ipaddr6(skb, IPSET_ATTR_IP, &data->ip.in6) || + nla_put_ipaddr6(skb, IPSET_ATTR_IP2, &data->ip2.in6) || + nla_put_net16(skb, IPSET_ATTR_PORT, data->port) || + nla_put_u8(skb, IPSET_ATTR_PROTO, data->proto)) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_ipportip6_data_next(struct hash_ipportip6_elem *next, + const struct hash_ipportip6_elem *d) +{ + next->port = d->port; +} + +#undef MTYPE +#undef HOST_MASK + +#define MTYPE hash_ipportip6 +#define HOST_MASK 128 +#define IP_SET_EMIT_CREATE +#include "ip_set_hash_gen.h" + +static int +hash_ipportip6_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipportip6_elem e = { .ip = { .all = { 0 } } }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + if (!ip_set_get_ip6_port(skb, opt->flags & IPSET_DIM_TWO_SRC, + &e.port, &e.proto)) + return -EINVAL; + + ip6addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip.in6); + ip6addrptr(skb, opt->flags & IPSET_DIM_THREE_SRC, &e.ip2.in6); + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_ipportip6_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + const struct hash_ipportip6 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipportip6_elem e = { .ip = { .all = { 0 } } }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + u32 port, port_to; + bool with_ports = false; + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP] || !tb[IPSET_ATTR_IP2] || + !ip_set_attr_netorder(tb, IPSET_ATTR_PORT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_PORT_TO))) + return -IPSET_ERR_PROTOCOL; + if (unlikely(tb[IPSET_ATTR_IP_TO])) + return -IPSET_ERR_HASH_RANGE_UNSUPPORTED; + if (unlikely(tb[IPSET_ATTR_CIDR])) { + u8 cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + + if (cidr != HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + } + + ret = ip_set_get_ipaddr6(tb[IPSET_ATTR_IP], &e.ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + ret = ip_set_get_ipaddr6(tb[IPSET_ATTR_IP2], &e.ip2); + if (ret) + return ret; + + e.port = nla_get_be16(tb[IPSET_ATTR_PORT]); + + if (tb[IPSET_ATTR_PROTO]) { + e.proto = nla_get_u8(tb[IPSET_ATTR_PROTO]); + with_ports = ip_set_proto_with_ports(e.proto); + + if (e.proto == 0) + return -IPSET_ERR_INVALID_PROTO; + } else { + return -IPSET_ERR_MISSING_PROTO; + } + + if (!(with_ports || e.proto == IPPROTO_ICMPV6)) + e.port = 0; + + if (adt == IPSET_TEST || !with_ports || !tb[IPSET_ATTR_PORT_TO]) { + ret = adtfn(set, &e, &ext, &ext, flags); + return ip_set_eexist(ret, flags) ? 0 : ret; + } + + port = ntohs(e.port); + port_to = ip_set_get_h16(tb[IPSET_ATTR_PORT_TO]); + if (port > port_to) + swap(port, port_to); + + if (retried) + port = ntohs(h->next.port); + for (; port <= port_to; port++) { + e.port = htons(port); + ret = adtfn(set, &e, &ext, &ext, flags); + + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + ret = 0; + } + return ret; +} + +static struct ip_set_type hash_ipportip_type __read_mostly = { + .name = "hash:ip,port,ip", + .protocol = IPSET_PROTOCOL, + .features = IPSET_TYPE_IP | IPSET_TYPE_PORT | IPSET_TYPE_IP2, + .dimension = IPSET_DIM_THREE, + .family = NFPROTO_UNSPEC, + .revision_min = IPSET_TYPE_REV_MIN, + .revision_max = IPSET_TYPE_REV_MAX, + .create = hash_ipportip_create, + .create_policy = { + [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, + [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, + [IPSET_ATTR_PROBES] = { .type = NLA_U8 }, + [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + }, + .adt_policy = { + [IPSET_ATTR_IP] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP_TO] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP2] = { .type = NLA_NESTED }, + [IPSET_ATTR_PORT] = { .type = NLA_U16 }, + [IPSET_ATTR_PORT_TO] = { .type = NLA_U16 }, + [IPSET_ATTR_CIDR] = { .type = NLA_U8 }, + [IPSET_ATTR_PROTO] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_LINENO] = { .type = NLA_U32 }, + [IPSET_ATTR_BYTES] = { .type = NLA_U64 }, + [IPSET_ATTR_PACKETS] = { .type = NLA_U64 }, + [IPSET_ATTR_COMMENT] = { .type = NLA_NUL_STRING, + .len = IPSET_MAX_COMMENT_SIZE }, + [IPSET_ATTR_SKBMARK] = { .type = NLA_U64 }, + [IPSET_ATTR_SKBPRIO] = { .type = NLA_U32 }, + [IPSET_ATTR_SKBQUEUE] = { .type = NLA_U16 }, + }, + .me = THIS_MODULE, +}; + +static int __init +hash_ipportip_init(void) +{ + return ip_set_type_register(&hash_ipportip_type); +} + +static void __exit +hash_ipportip_fini(void) +{ + rcu_barrier(); + ip_set_type_unregister(&hash_ipportip_type); +} + +module_init(hash_ipportip_init); +module_exit(hash_ipportip_fini); diff --git a/kernel/net/netfilter/ipset/ip_set_hash_ipportnet.c b/kernel/net/netfilter/ipset/ip_set_hash_ipportnet.c new file mode 100644 index 0000000..88b83d6 --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_hash_ipportnet.c @@ -0,0 +1,567 @@ +/* Copyright (C) 2003-2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module implementing an IP set type: the hash:ip,port,net type */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define IPSET_TYPE_REV_MIN 0 +/* 1 SCTP and UDPLITE support added */ +/* 2 Range as input support for IPv4 added */ +/* 3 nomatch flag support added */ +/* 4 Counters support added */ +/* 5 Comments support added */ +/* 6 Forceadd support added */ +#define IPSET_TYPE_REV_MAX 7 /* skbinfo support added */ + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Jozsef Kadlecsik "); +IP_SET_MODULE_DESC("hash:ip,port,net", IPSET_TYPE_REV_MIN, IPSET_TYPE_REV_MAX); +MODULE_ALIAS("ip_set_hash:ip,port,net"); + +/* Type specific function prefix */ +#define HTYPE hash_ipportnet + +/* We squeeze the "nomatch" flag into cidr: we don't support cidr == 0 + * However this way we have to store internally cidr - 1, + * dancing back and forth. + */ +#define IP_SET_HASH_WITH_NETS_PACKED +#define IP_SET_HASH_WITH_PROTO +#define IP_SET_HASH_WITH_NETS + +/* IPv4 variant */ + +/* Member elements */ +struct hash_ipportnet4_elem { + __be32 ip; + __be32 ip2; + __be16 port; + u8 cidr:7; + u8 nomatch:1; + u8 proto; +}; + +/* Common functions */ + +static inline bool +hash_ipportnet4_data_equal(const struct hash_ipportnet4_elem *ip1, + const struct hash_ipportnet4_elem *ip2, + u32 *multi) +{ + return ip1->ip == ip2->ip && + ip1->ip2 == ip2->ip2 && + ip1->cidr == ip2->cidr && + ip1->port == ip2->port && + ip1->proto == ip2->proto; +} + +static inline int +hash_ipportnet4_do_data_match(const struct hash_ipportnet4_elem *elem) +{ + return elem->nomatch ? -ENOTEMPTY : 1; +} + +static inline void +hash_ipportnet4_data_set_flags(struct hash_ipportnet4_elem *elem, u32 flags) +{ + elem->nomatch = !!((flags >> 16) & IPSET_FLAG_NOMATCH); +} + +static inline void +hash_ipportnet4_data_reset_flags(struct hash_ipportnet4_elem *elem, u8 *flags) +{ + swap(*flags, elem->nomatch); +} + +static inline void +hash_ipportnet4_data_netmask(struct hash_ipportnet4_elem *elem, u8 cidr) +{ + elem->ip2 &= ip_set_netmask(cidr); + elem->cidr = cidr - 1; +} + +static bool +hash_ipportnet4_data_list(struct sk_buff *skb, + const struct hash_ipportnet4_elem *data) +{ + u32 flags = data->nomatch ? IPSET_FLAG_NOMATCH : 0; + + if (nla_put_ipaddr4(skb, IPSET_ATTR_IP, data->ip) || + nla_put_ipaddr4(skb, IPSET_ATTR_IP2, data->ip2) || + nla_put_net16(skb, IPSET_ATTR_PORT, data->port) || + nla_put_u8(skb, IPSET_ATTR_CIDR2, data->cidr + 1) || + nla_put_u8(skb, IPSET_ATTR_PROTO, data->proto) || + (flags && + nla_put_net32(skb, IPSET_ATTR_CADT_FLAGS, htonl(flags)))) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_ipportnet4_data_next(struct hash_ipportnet4_elem *next, + const struct hash_ipportnet4_elem *d) +{ + next->ip = d->ip; + next->port = d->port; + next->ip2 = d->ip2; +} + +#define MTYPE hash_ipportnet4 +#define HOST_MASK 32 +#include "ip_set_hash_gen.h" + +static int +hash_ipportnet4_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + const struct hash_ipportnet4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipportnet4_elem e = { + .cidr = INIT_CIDR(h->nets[0].cidr[0], HOST_MASK), + }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + if (adt == IPSET_TEST) + e.cidr = HOST_MASK - 1; + + if (!ip_set_get_ip4_port(skb, opt->flags & IPSET_DIM_TWO_SRC, + &e.port, &e.proto)) + return -EINVAL; + + ip4addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip); + ip4addrptr(skb, opt->flags & IPSET_DIM_THREE_SRC, &e.ip2); + e.ip2 &= ip_set_netmask(e.cidr + 1); + + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_ipportnet4_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + const struct hash_ipportnet4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipportnet4_elem e = { .cidr = HOST_MASK - 1 }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + u32 ip = 0, ip_to = 0, p = 0, port, port_to; + u32 ip2_from = 0, ip2_to = 0, ip2; + bool with_ports = false; + u8 cidr; + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP] || !tb[IPSET_ATTR_IP2] || + !ip_set_attr_netorder(tb, IPSET_ATTR_PORT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_PORT_TO) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP], &ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP2], &ip2_from); + if (ret) + return ret; + + if (tb[IPSET_ATTR_CIDR2]) { + cidr = nla_get_u8(tb[IPSET_ATTR_CIDR2]); + if (!cidr || cidr > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + e.cidr = cidr - 1; + } + + e.port = nla_get_be16(tb[IPSET_ATTR_PORT]); + + if (tb[IPSET_ATTR_PROTO]) { + e.proto = nla_get_u8(tb[IPSET_ATTR_PROTO]); + with_ports = ip_set_proto_with_ports(e.proto); + + if (e.proto == 0) + return -IPSET_ERR_INVALID_PROTO; + } else { + return -IPSET_ERR_MISSING_PROTO; + } + + if (!(with_ports || e.proto == IPPROTO_ICMP)) + e.port = 0; + + if (tb[IPSET_ATTR_CADT_FLAGS]) { + u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]); + + if (cadt_flags & IPSET_FLAG_NOMATCH) + flags |= (IPSET_FLAG_NOMATCH << 16); + } + + with_ports = with_ports && tb[IPSET_ATTR_PORT_TO]; + if (adt == IPSET_TEST || + !(tb[IPSET_ATTR_CIDR] || tb[IPSET_ATTR_IP_TO] || with_ports || + tb[IPSET_ATTR_IP2_TO])) { + e.ip = htonl(ip); + e.ip2 = htonl(ip2_from & ip_set_hostmask(e.cidr + 1)); + ret = adtfn(set, &e, &ext, &ext, flags); + return ip_set_enomatch(ret, flags, adt, set) ? -ret : + ip_set_eexist(ret, flags) ? 0 : ret; + } + + ip_to = ip; + if (tb[IPSET_ATTR_IP_TO]) { + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); + if (ret) + return ret; + if (ip > ip_to) + swap(ip, ip_to); + } else if (tb[IPSET_ATTR_CIDR]) { + cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + + if (!cidr || cidr > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + ip_set_mask_from_to(ip, ip_to, cidr); + } + + port_to = port = ntohs(e.port); + if (tb[IPSET_ATTR_PORT_TO]) { + port_to = ip_set_get_h16(tb[IPSET_ATTR_PORT_TO]); + if (port > port_to) + swap(port, port_to); + } + + ip2_to = ip2_from; + if (tb[IPSET_ATTR_IP2_TO]) { + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP2_TO], &ip2_to); + if (ret) + return ret; + if (ip2_from > ip2_to) + swap(ip2_from, ip2_to); + if (ip2_from + UINT_MAX == ip2_to) + return -IPSET_ERR_HASH_RANGE; + } else { + ip_set_mask_from_to(ip2_from, ip2_to, e.cidr + 1); + } + + if (retried) { + ip = ntohl(h->next.ip); + p = ntohs(h->next.port); + ip2 = ntohl(h->next.ip2); + } else { + p = port; + ip2 = ip2_from; + } + for (; ip <= ip_to; ip++) { + e.ip = htonl(ip); + for (; p <= port_to; p++) { + e.port = htons(p); + do { + e.ip2 = htonl(ip2); + ip2 = ip_set_range_to_cidr(ip2, ip2_to, &cidr); + e.cidr = cidr - 1; + ret = adtfn(set, &e, &ext, &ext, flags); + + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + ret = 0; + } while (ip2++ < ip2_to); + ip2 = ip2_from; + } + p = port; + } + return ret; +} + +/* IPv6 variant */ + +struct hash_ipportnet6_elem { + union nf_inet_addr ip; + union nf_inet_addr ip2; + __be16 port; + u8 cidr:7; + u8 nomatch:1; + u8 proto; +}; + +/* Common functions */ + +static inline bool +hash_ipportnet6_data_equal(const struct hash_ipportnet6_elem *ip1, + const struct hash_ipportnet6_elem *ip2, + u32 *multi) +{ + return ipv6_addr_equal(&ip1->ip.in6, &ip2->ip.in6) && + ipv6_addr_equal(&ip1->ip2.in6, &ip2->ip2.in6) && + ip1->cidr == ip2->cidr && + ip1->port == ip2->port && + ip1->proto == ip2->proto; +} + +static inline int +hash_ipportnet6_do_data_match(const struct hash_ipportnet6_elem *elem) +{ + return elem->nomatch ? -ENOTEMPTY : 1; +} + +static inline void +hash_ipportnet6_data_set_flags(struct hash_ipportnet6_elem *elem, u32 flags) +{ + elem->nomatch = !!((flags >> 16) & IPSET_FLAG_NOMATCH); +} + +static inline void +hash_ipportnet6_data_reset_flags(struct hash_ipportnet6_elem *elem, u8 *flags) +{ + swap(*flags, elem->nomatch); +} + +static inline void +hash_ipportnet6_data_netmask(struct hash_ipportnet6_elem *elem, u8 cidr) +{ + ip6_netmask(&elem->ip2, cidr); + elem->cidr = cidr - 1; +} + +static bool +hash_ipportnet6_data_list(struct sk_buff *skb, + const struct hash_ipportnet6_elem *data) +{ + u32 flags = data->nomatch ? IPSET_FLAG_NOMATCH : 0; + + if (nla_put_ipaddr6(skb, IPSET_ATTR_IP, &data->ip.in6) || + nla_put_ipaddr6(skb, IPSET_ATTR_IP2, &data->ip2.in6) || + nla_put_net16(skb, IPSET_ATTR_PORT, data->port) || + nla_put_u8(skb, IPSET_ATTR_CIDR2, data->cidr + 1) || + nla_put_u8(skb, IPSET_ATTR_PROTO, data->proto) || + (flags && + nla_put_net32(skb, IPSET_ATTR_CADT_FLAGS, htonl(flags)))) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_ipportnet6_data_next(struct hash_ipportnet6_elem *next, + const struct hash_ipportnet6_elem *d) +{ + next->port = d->port; +} + +#undef MTYPE +#undef HOST_MASK + +#define MTYPE hash_ipportnet6 +#define HOST_MASK 128 +#define IP_SET_EMIT_CREATE +#include "ip_set_hash_gen.h" + +static int +hash_ipportnet6_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + const struct hash_ipportnet6 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipportnet6_elem e = { + .cidr = INIT_CIDR(h->nets[0].cidr[0], HOST_MASK), + }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + if (adt == IPSET_TEST) + e.cidr = HOST_MASK - 1; + + if (!ip_set_get_ip6_port(skb, opt->flags & IPSET_DIM_TWO_SRC, + &e.port, &e.proto)) + return -EINVAL; + + ip6addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip.in6); + ip6addrptr(skb, opt->flags & IPSET_DIM_THREE_SRC, &e.ip2.in6); + ip6_netmask(&e.ip2, e.cidr + 1); + + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_ipportnet6_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + const struct hash_ipportnet6 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_ipportnet6_elem e = { .cidr = HOST_MASK - 1 }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + u32 port, port_to; + bool with_ports = false; + u8 cidr; + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP] || !tb[IPSET_ATTR_IP2] || + !ip_set_attr_netorder(tb, IPSET_ATTR_PORT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_PORT_TO) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + if (unlikely(tb[IPSET_ATTR_IP_TO])) + return -IPSET_ERR_HASH_RANGE_UNSUPPORTED; + if (unlikely(tb[IPSET_ATTR_CIDR])) { + cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + + if (cidr != HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + } + + ret = ip_set_get_ipaddr6(tb[IPSET_ATTR_IP], &e.ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + ret = ip_set_get_ipaddr6(tb[IPSET_ATTR_IP2], &e.ip2); + if (ret) + return ret; + + if (tb[IPSET_ATTR_CIDR2]) { + cidr = nla_get_u8(tb[IPSET_ATTR_CIDR2]); + if (!cidr || cidr > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + e.cidr = cidr - 1; + } + + ip6_netmask(&e.ip2, e.cidr + 1); + + e.port = nla_get_be16(tb[IPSET_ATTR_PORT]); + + if (tb[IPSET_ATTR_PROTO]) { + e.proto = nla_get_u8(tb[IPSET_ATTR_PROTO]); + with_ports = ip_set_proto_with_ports(e.proto); + + if (e.proto == 0) + return -IPSET_ERR_INVALID_PROTO; + } else { + return -IPSET_ERR_MISSING_PROTO; + } + + if (!(with_ports || e.proto == IPPROTO_ICMPV6)) + e.port = 0; + + if (tb[IPSET_ATTR_CADT_FLAGS]) { + u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]); + + if (cadt_flags & IPSET_FLAG_NOMATCH) + flags |= (IPSET_FLAG_NOMATCH << 16); + } + + if (adt == IPSET_TEST || !with_ports || !tb[IPSET_ATTR_PORT_TO]) { + ret = adtfn(set, &e, &ext, &ext, flags); + return ip_set_enomatch(ret, flags, adt, set) ? -ret : + ip_set_eexist(ret, flags) ? 0 : ret; + } + + port = ntohs(e.port); + port_to = ip_set_get_h16(tb[IPSET_ATTR_PORT_TO]); + if (port > port_to) + swap(port, port_to); + + if (retried) + port = ntohs(h->next.port); + for (; port <= port_to; port++) { + e.port = htons(port); + ret = adtfn(set, &e, &ext, &ext, flags); + + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + ret = 0; + } + return ret; +} + +static struct ip_set_type hash_ipportnet_type __read_mostly = { + .name = "hash:ip,port,net", + .protocol = IPSET_PROTOCOL, + .features = IPSET_TYPE_IP | IPSET_TYPE_PORT | IPSET_TYPE_IP2 | + IPSET_TYPE_NOMATCH, + .dimension = IPSET_DIM_THREE, + .family = NFPROTO_UNSPEC, + .revision_min = IPSET_TYPE_REV_MIN, + .revision_max = IPSET_TYPE_REV_MAX, + .create = hash_ipportnet_create, + .create_policy = { + [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, + [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, + [IPSET_ATTR_PROBES] = { .type = NLA_U8 }, + [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + }, + .adt_policy = { + [IPSET_ATTR_IP] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP_TO] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP2] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP2_TO] = { .type = NLA_NESTED }, + [IPSET_ATTR_PORT] = { .type = NLA_U16 }, + [IPSET_ATTR_PORT_TO] = { .type = NLA_U16 }, + [IPSET_ATTR_CIDR] = { .type = NLA_U8 }, + [IPSET_ATTR_CIDR2] = { .type = NLA_U8 }, + [IPSET_ATTR_PROTO] = { .type = NLA_U8 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_LINENO] = { .type = NLA_U32 }, + [IPSET_ATTR_BYTES] = { .type = NLA_U64 }, + [IPSET_ATTR_PACKETS] = { .type = NLA_U64 }, + [IPSET_ATTR_COMMENT] = { .type = NLA_NUL_STRING, + .len = IPSET_MAX_COMMENT_SIZE }, + [IPSET_ATTR_SKBMARK] = { .type = NLA_U64 }, + [IPSET_ATTR_SKBPRIO] = { .type = NLA_U32 }, + [IPSET_ATTR_SKBQUEUE] = { .type = NLA_U16 }, + }, + .me = THIS_MODULE, +}; + +static int __init +hash_ipportnet_init(void) +{ + return ip_set_type_register(&hash_ipportnet_type); +} + +static void __exit +hash_ipportnet_fini(void) +{ + rcu_barrier(); + ip_set_type_unregister(&hash_ipportnet_type); +} + +module_init(hash_ipportnet_init); +module_exit(hash_ipportnet_fini); diff --git a/kernel/net/netfilter/ipset/ip_set_hash_mac.c b/kernel/net/netfilter/ipset/ip_set_hash_mac.c new file mode 100644 index 0000000..4fe5f24 --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_hash_mac.c @@ -0,0 +1,171 @@ +/* Copyright (C) 2014 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module implementing an IP set type: the hash:mac type */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define IPSET_TYPE_REV_MIN 0 +#define IPSET_TYPE_REV_MAX 0 + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Jozsef Kadlecsik "); +IP_SET_MODULE_DESC("hash:mac", IPSET_TYPE_REV_MIN, IPSET_TYPE_REV_MAX); +MODULE_ALIAS("ip_set_hash:mac"); + +/* Type specific function prefix */ +#define HTYPE hash_mac + +/* Member elements */ +struct hash_mac4_elem { + /* Zero valued IP addresses cannot be stored */ + union { + unsigned char ether[ETH_ALEN]; + __be32 foo[2]; + }; +}; + +/* Common functions */ + +static inline bool +hash_mac4_data_equal(const struct hash_mac4_elem *e1, + const struct hash_mac4_elem *e2, + u32 *multi) +{ + return ether_addr_equal(e1->ether, e2->ether); +} + +static inline bool +hash_mac4_data_list(struct sk_buff *skb, const struct hash_mac4_elem *e) +{ + if (nla_put(skb, IPSET_ATTR_ETHER, ETH_ALEN, e->ether)) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_mac4_data_next(struct hash_mac4_elem *next, + const struct hash_mac4_elem *e) +{ +} + +#define MTYPE hash_mac4 +#define HOST_MASK 32 +#define IP_SET_EMIT_CREATE +#define IP_SET_PROTO_UNDEF +#include "ip_set_hash_gen.h" + +static int +hash_mac4_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_mac4_elem e = { { .foo[0] = 0, .foo[1] = 0 } }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + if (skb_mac_header(skb) < skb->head || + (skb_mac_header(skb) + ETH_HLEN) > skb->data) + return -EINVAL; + + if (opt->flags & IPSET_DIM_ONE_SRC) + ether_addr_copy(e.ether, eth_hdr(skb)->h_source); + else + ether_addr_copy(e.ether, eth_hdr(skb)->h_dest); + + if (is_zero_ether_addr(e.ether)) + return -EINVAL; + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_mac4_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_mac4_elem e = { { .foo[0] = 0, .foo[1] = 0 } }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_ETHER] || + nla_len(tb[IPSET_ATTR_ETHER]) != ETH_ALEN)) + return -IPSET_ERR_PROTOCOL; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + ether_addr_copy(e.ether, nla_data(tb[IPSET_ATTR_ETHER])); + if (is_zero_ether_addr(e.ether)) + return -IPSET_ERR_HASH_ELEM; + + return adtfn(set, &e, &ext, &ext, flags); +} + +static struct ip_set_type hash_mac_type __read_mostly = { + .name = "hash:mac", + .protocol = IPSET_PROTOCOL, + .features = IPSET_TYPE_MAC, + .dimension = IPSET_DIM_ONE, + .family = NFPROTO_UNSPEC, + .revision_min = IPSET_TYPE_REV_MIN, + .revision_max = IPSET_TYPE_REV_MAX, + .create = hash_mac_create, + .create_policy = { + [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, + [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, + [IPSET_ATTR_PROBES] = { .type = NLA_U8 }, + [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + }, + .adt_policy = { + [IPSET_ATTR_ETHER] = { .type = NLA_BINARY, + .len = ETH_ALEN }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_LINENO] = { .type = NLA_U32 }, + [IPSET_ATTR_BYTES] = { .type = NLA_U64 }, + [IPSET_ATTR_PACKETS] = { .type = NLA_U64 }, + [IPSET_ATTR_COMMENT] = { .type = NLA_NUL_STRING, + .len = IPSET_MAX_COMMENT_SIZE }, + [IPSET_ATTR_SKBMARK] = { .type = NLA_U64 }, + [IPSET_ATTR_SKBPRIO] = { .type = NLA_U32 }, + [IPSET_ATTR_SKBQUEUE] = { .type = NLA_U16 }, + }, + .me = THIS_MODULE, +}; + +static int __init +hash_mac_init(void) +{ + return ip_set_type_register(&hash_mac_type); +} + +static void __exit +hash_mac_fini(void) +{ + rcu_barrier(); + ip_set_type_unregister(&hash_mac_type); +} + +module_init(hash_mac_init); +module_exit(hash_mac_fini); diff --git a/kernel/net/netfilter/ipset/ip_set_hash_net.c b/kernel/net/netfilter/ipset/ip_set_hash_net.c new file mode 100644 index 0000000..5449e23 --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_hash_net.c @@ -0,0 +1,401 @@ +/* Copyright (C) 2003-2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module implementing an IP set type: the hash:net type */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define IPSET_TYPE_REV_MIN 0 +/* 1 Range as input support for IPv4 added */ +/* 2 nomatch flag support added */ +/* 3 Counters support added */ +/* 4 Comments support added */ +/* 5 Forceadd support added */ +#define IPSET_TYPE_REV_MAX 6 /* skbinfo mapping support added */ + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Jozsef Kadlecsik "); +IP_SET_MODULE_DESC("hash:net", IPSET_TYPE_REV_MIN, IPSET_TYPE_REV_MAX); +MODULE_ALIAS("ip_set_hash:net"); + +/* Type specific function prefix */ +#define HTYPE hash_net +#define IP_SET_HASH_WITH_NETS + +/* IPv4 variant */ + +/* Member elements */ +struct hash_net4_elem { + __be32 ip; + u16 padding0; + u8 nomatch; + u8 cidr; +}; + +/* Common functions */ + +static inline bool +hash_net4_data_equal(const struct hash_net4_elem *ip1, + const struct hash_net4_elem *ip2, + u32 *multi) +{ + return ip1->ip == ip2->ip && + ip1->cidr == ip2->cidr; +} + +static inline int +hash_net4_do_data_match(const struct hash_net4_elem *elem) +{ + return elem->nomatch ? -ENOTEMPTY : 1; +} + +static inline void +hash_net4_data_set_flags(struct hash_net4_elem *elem, u32 flags) +{ + elem->nomatch = (flags >> 16) & IPSET_FLAG_NOMATCH; +} + +static inline void +hash_net4_data_reset_flags(struct hash_net4_elem *elem, u8 *flags) +{ + swap(*flags, elem->nomatch); +} + +static inline void +hash_net4_data_netmask(struct hash_net4_elem *elem, u8 cidr) +{ + elem->ip &= ip_set_netmask(cidr); + elem->cidr = cidr; +} + +static bool +hash_net4_data_list(struct sk_buff *skb, const struct hash_net4_elem *data) +{ + u32 flags = data->nomatch ? IPSET_FLAG_NOMATCH : 0; + + if (nla_put_ipaddr4(skb, IPSET_ATTR_IP, data->ip) || + nla_put_u8(skb, IPSET_ATTR_CIDR, data->cidr) || + (flags && + nla_put_net32(skb, IPSET_ATTR_CADT_FLAGS, htonl(flags)))) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_net4_data_next(struct hash_net4_elem *next, + const struct hash_net4_elem *d) +{ + next->ip = d->ip; +} + +#define MTYPE hash_net4 +#define HOST_MASK 32 +#include "ip_set_hash_gen.h" + +static int +hash_net4_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + const struct hash_net4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_net4_elem e = { + .cidr = INIT_CIDR(h->nets[0].cidr[0], HOST_MASK), + }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + if (e.cidr == 0) + return -EINVAL; + if (adt == IPSET_TEST) + e.cidr = HOST_MASK; + + ip4addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip); + e.ip &= ip_set_netmask(e.cidr); + + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_net4_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + const struct hash_net4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_net4_elem e = { .cidr = HOST_MASK }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + u32 ip = 0, ip_to = 0; + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP] || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP], &ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + if (tb[IPSET_ATTR_CIDR]) { + e.cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + if (!e.cidr || e.cidr > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + } + + if (tb[IPSET_ATTR_CADT_FLAGS]) { + u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]); + + if (cadt_flags & IPSET_FLAG_NOMATCH) + flags |= (IPSET_FLAG_NOMATCH << 16); + } + + if (adt == IPSET_TEST || !tb[IPSET_ATTR_IP_TO]) { + e.ip = htonl(ip & ip_set_hostmask(e.cidr)); + ret = adtfn(set, &e, &ext, &ext, flags); + return ip_set_enomatch(ret, flags, adt, set) ? -ret : + ip_set_eexist(ret, flags) ? 0 : ret; + } + + ip_to = ip; + if (tb[IPSET_ATTR_IP_TO]) { + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); + if (ret) + return ret; + if (ip_to < ip) + swap(ip, ip_to); + if (ip + UINT_MAX == ip_to) + return -IPSET_ERR_HASH_RANGE; + } + if (retried) + ip = ntohl(h->next.ip); + do { + e.ip = htonl(ip); + ip = ip_set_range_to_cidr(ip, ip_to, &e.cidr); + ret = adtfn(set, &e, &ext, &ext, flags); + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + ret = 0; + } while (ip++ < ip_to); + return ret; +} + +/* IPv6 variant */ + +struct hash_net6_elem { + union nf_inet_addr ip; + u16 padding0; + u8 nomatch; + u8 cidr; +}; + +/* Common functions */ + +static inline bool +hash_net6_data_equal(const struct hash_net6_elem *ip1, + const struct hash_net6_elem *ip2, + u32 *multi) +{ + return ipv6_addr_equal(&ip1->ip.in6, &ip2->ip.in6) && + ip1->cidr == ip2->cidr; +} + +static inline int +hash_net6_do_data_match(const struct hash_net6_elem *elem) +{ + return elem->nomatch ? -ENOTEMPTY : 1; +} + +static inline void +hash_net6_data_set_flags(struct hash_net6_elem *elem, u32 flags) +{ + elem->nomatch = (flags >> 16) & IPSET_FLAG_NOMATCH; +} + +static inline void +hash_net6_data_reset_flags(struct hash_net6_elem *elem, u8 *flags) +{ + swap(*flags, elem->nomatch); +} + +static inline void +hash_net6_data_netmask(struct hash_net6_elem *elem, u8 cidr) +{ + ip6_netmask(&elem->ip, cidr); + elem->cidr = cidr; +} + +static bool +hash_net6_data_list(struct sk_buff *skb, const struct hash_net6_elem *data) +{ + u32 flags = data->nomatch ? IPSET_FLAG_NOMATCH : 0; + + if (nla_put_ipaddr6(skb, IPSET_ATTR_IP, &data->ip.in6) || + nla_put_u8(skb, IPSET_ATTR_CIDR, data->cidr) || + (flags && + nla_put_net32(skb, IPSET_ATTR_CADT_FLAGS, htonl(flags)))) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_net6_data_next(struct hash_net6_elem *next, + const struct hash_net6_elem *d) +{ +} + +#undef MTYPE +#undef HOST_MASK + +#define MTYPE hash_net6 +#define HOST_MASK 128 +#define IP_SET_EMIT_CREATE +#include "ip_set_hash_gen.h" + +static int +hash_net6_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + const struct hash_net6 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_net6_elem e = { + .cidr = INIT_CIDR(h->nets[0].cidr[0], HOST_MASK), + }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + if (e.cidr == 0) + return -EINVAL; + if (adt == IPSET_TEST) + e.cidr = HOST_MASK; + + ip6addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip.in6); + ip6_netmask(&e.ip, e.cidr); + + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_net6_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_net6_elem e = { .cidr = HOST_MASK }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP] || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + if (unlikely(tb[IPSET_ATTR_IP_TO])) + return -IPSET_ERR_HASH_RANGE_UNSUPPORTED; + + ret = ip_set_get_ipaddr6(tb[IPSET_ATTR_IP], &e.ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + if (tb[IPSET_ATTR_CIDR]) { + e.cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + if (!e.cidr || e.cidr > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + } + + ip6_netmask(&e.ip, e.cidr); + + if (tb[IPSET_ATTR_CADT_FLAGS]) { + u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]); + + if (cadt_flags & IPSET_FLAG_NOMATCH) + flags |= (IPSET_FLAG_NOMATCH << 16); + } + + ret = adtfn(set, &e, &ext, &ext, flags); + + return ip_set_enomatch(ret, flags, adt, set) ? -ret : + ip_set_eexist(ret, flags) ? 0 : ret; +} + +static struct ip_set_type hash_net_type __read_mostly = { + .name = "hash:net", + .protocol = IPSET_PROTOCOL, + .features = IPSET_TYPE_IP | IPSET_TYPE_NOMATCH, + .dimension = IPSET_DIM_ONE, + .family = NFPROTO_UNSPEC, + .revision_min = IPSET_TYPE_REV_MIN, + .revision_max = IPSET_TYPE_REV_MAX, + .create = hash_net_create, + .create_policy = { + [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, + [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, + [IPSET_ATTR_PROBES] = { .type = NLA_U8 }, + [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + }, + .adt_policy = { + [IPSET_ATTR_IP] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP_TO] = { .type = NLA_NESTED }, + [IPSET_ATTR_CIDR] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + [IPSET_ATTR_BYTES] = { .type = NLA_U64 }, + [IPSET_ATTR_PACKETS] = { .type = NLA_U64 }, + [IPSET_ATTR_COMMENT] = { .type = NLA_NUL_STRING, + .len = IPSET_MAX_COMMENT_SIZE }, + [IPSET_ATTR_SKBMARK] = { .type = NLA_U64 }, + [IPSET_ATTR_SKBPRIO] = { .type = NLA_U32 }, + [IPSET_ATTR_SKBQUEUE] = { .type = NLA_U16 }, + }, + .me = THIS_MODULE, +}; + +static int __init +hash_net_init(void) +{ + return ip_set_type_register(&hash_net_type); +} + +static void __exit +hash_net_fini(void) +{ + rcu_barrier(); + ip_set_type_unregister(&hash_net_type); +} + +module_init(hash_net_init); +module_exit(hash_net_fini); diff --git a/kernel/net/netfilter/ipset/ip_set_hash_netiface.c b/kernel/net/netfilter/ipset/ip_set_hash_netiface.c new file mode 100644 index 0000000..641c8af --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_hash_netiface.c @@ -0,0 +1,508 @@ +/* Copyright (C) 2011-2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module implementing an IP set type: the hash:net,iface type */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define IPSET_TYPE_REV_MIN 0 +/* 1 nomatch flag support added */ +/* 2 /0 support added */ +/* 3 Counters support added */ +/* 4 Comments support added */ +/* 5 Forceadd support added */ +#define IPSET_TYPE_REV_MAX 6 /* skbinfo support added */ + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Jozsef Kadlecsik "); +IP_SET_MODULE_DESC("hash:net,iface", IPSET_TYPE_REV_MIN, IPSET_TYPE_REV_MAX); +MODULE_ALIAS("ip_set_hash:net,iface"); + +/* Type specific function prefix */ +#define HTYPE hash_netiface +#define IP_SET_HASH_WITH_NETS +#define IP_SET_HASH_WITH_MULTI +#define IP_SET_HASH_WITH_NET0 + +#define STRLCPY(a, b) strlcpy(a, b, IFNAMSIZ) + +/* IPv4 variant */ + +struct hash_netiface4_elem_hashed { + __be32 ip; + u8 physdev; + u8 cidr; + u8 nomatch; + u8 elem; +}; + +/* Member elements */ +struct hash_netiface4_elem { + __be32 ip; + u8 physdev; + u8 cidr; + u8 nomatch; + u8 elem; + char iface[IFNAMSIZ]; +}; + +/* Common functions */ + +static inline bool +hash_netiface4_data_equal(const struct hash_netiface4_elem *ip1, + const struct hash_netiface4_elem *ip2, + u32 *multi) +{ + return ip1->ip == ip2->ip && + ip1->cidr == ip2->cidr && + (++*multi) && + ip1->physdev == ip2->physdev && + strcmp(ip1->iface, ip2->iface) == 0; +} + +static inline int +hash_netiface4_do_data_match(const struct hash_netiface4_elem *elem) +{ + return elem->nomatch ? -ENOTEMPTY : 1; +} + +static inline void +hash_netiface4_data_set_flags(struct hash_netiface4_elem *elem, u32 flags) +{ + elem->nomatch = (flags >> 16) & IPSET_FLAG_NOMATCH; +} + +static inline void +hash_netiface4_data_reset_flags(struct hash_netiface4_elem *elem, u8 *flags) +{ + swap(*flags, elem->nomatch); +} + +static inline void +hash_netiface4_data_netmask(struct hash_netiface4_elem *elem, u8 cidr) +{ + elem->ip &= ip_set_netmask(cidr); + elem->cidr = cidr; +} + +static bool +hash_netiface4_data_list(struct sk_buff *skb, + const struct hash_netiface4_elem *data) +{ + u32 flags = data->physdev ? IPSET_FLAG_PHYSDEV : 0; + + if (data->nomatch) + flags |= IPSET_FLAG_NOMATCH; + if (nla_put_ipaddr4(skb, IPSET_ATTR_IP, data->ip) || + nla_put_u8(skb, IPSET_ATTR_CIDR, data->cidr) || + nla_put_string(skb, IPSET_ATTR_IFACE, data->iface) || + (flags && + nla_put_net32(skb, IPSET_ATTR_CADT_FLAGS, htonl(flags)))) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_netiface4_data_next(struct hash_netiface4_elem *next, + const struct hash_netiface4_elem *d) +{ + next->ip = d->ip; +} + +#define MTYPE hash_netiface4 +#define HOST_MASK 32 +#define HKEY_DATALEN sizeof(struct hash_netiface4_elem_hashed) +#include "ip_set_hash_gen.h" + +#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER) +static const char *get_physindev_name(const struct sk_buff *skb) +{ + struct net_device *dev = nf_bridge_get_physindev(skb); + + return dev ? dev->name : NULL; +} + +static const char *get_physoutdev_name(const struct sk_buff *skb) +{ + struct net_device *dev = nf_bridge_get_physoutdev(skb); + + return dev ? dev->name : NULL; +} +#endif + +static int +hash_netiface4_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + struct hash_netiface4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_netiface4_elem e = { + .cidr = INIT_CIDR(h->nets[0].cidr[0], HOST_MASK), + .elem = 1, + }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + if (adt == IPSET_TEST) + e.cidr = HOST_MASK; + + ip4addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip); + e.ip &= ip_set_netmask(e.cidr); + +#define IFACE(dir) (XAP_STATE(par)->dir ? XAP_STATE(par)->dir->name : "") +#define SRCDIR (opt->flags & IPSET_DIM_TWO_SRC) + + if (opt->cmdflags & IPSET_FLAG_PHYSDEV) { +#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER) + const char *eiface = SRCDIR ? get_physindev_name(skb) : + get_physoutdev_name(skb); + + if (!eiface) + return -EINVAL; + STRLCPY(e.iface, eiface); + e.physdev = 1; +#endif + } else { + STRLCPY(e.iface, SRCDIR ? IFACE(in) : IFACE(out)); + } + + if (strlen(e.iface) == 0) + return -EINVAL; + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_netiface4_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + struct hash_netiface4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_netiface4_elem e = { .cidr = HOST_MASK, .elem = 1 }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + u32 ip = 0, ip_to = 0; + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP] || + !tb[IPSET_ATTR_IFACE] || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP], &ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + if (tb[IPSET_ATTR_CIDR]) { + e.cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + if (e.cidr > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + } + nla_strlcpy(e.iface, tb[IPSET_ATTR_IFACE], IFNAMSIZ); + + if (tb[IPSET_ATTR_CADT_FLAGS]) { + u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]); + + if (cadt_flags & IPSET_FLAG_PHYSDEV) + e.physdev = 1; + if (cadt_flags & IPSET_FLAG_NOMATCH) + flags |= (IPSET_FLAG_NOMATCH << 16); + } + if (adt == IPSET_TEST || !tb[IPSET_ATTR_IP_TO]) { + e.ip = htonl(ip & ip_set_hostmask(e.cidr)); + ret = adtfn(set, &e, &ext, &ext, flags); + return ip_set_enomatch(ret, flags, adt, set) ? -ret : + ip_set_eexist(ret, flags) ? 0 : ret; + } + + if (tb[IPSET_ATTR_IP_TO]) { + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); + if (ret) + return ret; + if (ip_to < ip) + swap(ip, ip_to); + if (ip + UINT_MAX == ip_to) + return -IPSET_ERR_HASH_RANGE; + } else { + ip_set_mask_from_to(ip, ip_to, e.cidr); + } + + if (retried) + ip = ntohl(h->next.ip); + do { + e.ip = htonl(ip); + ip = ip_set_range_to_cidr(ip, ip_to, &e.cidr); + ret = adtfn(set, &e, &ext, &ext, flags); + + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + ret = 0; + } while (ip++ < ip_to); + return ret; +} + +/* IPv6 variant */ + +struct hash_netiface6_elem_hashed { + union nf_inet_addr ip; + u8 physdev; + u8 cidr; + u8 nomatch; + u8 elem; +}; + +struct hash_netiface6_elem { + union nf_inet_addr ip; + u8 physdev; + u8 cidr; + u8 nomatch; + u8 elem; + char iface[IFNAMSIZ]; +}; + +/* Common functions */ + +static inline bool +hash_netiface6_data_equal(const struct hash_netiface6_elem *ip1, + const struct hash_netiface6_elem *ip2, + u32 *multi) +{ + return ipv6_addr_equal(&ip1->ip.in6, &ip2->ip.in6) && + ip1->cidr == ip2->cidr && + (++*multi) && + ip1->physdev == ip2->physdev && + strcmp(ip1->iface, ip2->iface) == 0; +} + +static inline int +hash_netiface6_do_data_match(const struct hash_netiface6_elem *elem) +{ + return elem->nomatch ? -ENOTEMPTY : 1; +} + +static inline void +hash_netiface6_data_set_flags(struct hash_netiface6_elem *elem, u32 flags) +{ + elem->nomatch = (flags >> 16) & IPSET_FLAG_NOMATCH; +} + +static inline void +hash_netiface6_data_reset_flags(struct hash_netiface6_elem *elem, u8 *flags) +{ + swap(*flags, elem->nomatch); +} + +static inline void +hash_netiface6_data_netmask(struct hash_netiface6_elem *elem, u8 cidr) +{ + ip6_netmask(&elem->ip, cidr); + elem->cidr = cidr; +} + +static bool +hash_netiface6_data_list(struct sk_buff *skb, + const struct hash_netiface6_elem *data) +{ + u32 flags = data->physdev ? IPSET_FLAG_PHYSDEV : 0; + + if (data->nomatch) + flags |= IPSET_FLAG_NOMATCH; + if (nla_put_ipaddr6(skb, IPSET_ATTR_IP, &data->ip.in6) || + nla_put_u8(skb, IPSET_ATTR_CIDR, data->cidr) || + nla_put_string(skb, IPSET_ATTR_IFACE, data->iface) || + (flags && + nla_put_net32(skb, IPSET_ATTR_CADT_FLAGS, htonl(flags)))) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_netiface6_data_next(struct hash_netiface6_elem *next, + const struct hash_netiface6_elem *d) +{ +} + +#undef MTYPE +#undef HOST_MASK + +#define MTYPE hash_netiface6 +#define HOST_MASK 128 +#define HKEY_DATALEN sizeof(struct hash_netiface6_elem_hashed) +#define IP_SET_EMIT_CREATE +#include "ip_set_hash_gen.h" + +static int +hash_netiface6_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + struct hash_netiface6 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_netiface6_elem e = { + .cidr = INIT_CIDR(h->nets[0].cidr[0], HOST_MASK), + .elem = 1, + }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + if (adt == IPSET_TEST) + e.cidr = HOST_MASK; + + ip6addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip.in6); + ip6_netmask(&e.ip, e.cidr); + + if (opt->cmdflags & IPSET_FLAG_PHYSDEV) { +#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER) + const char *eiface = SRCDIR ? get_physindev_name(skb) : + get_physoutdev_name(skb); + + if (!eiface) + return -EINVAL; + STRLCPY(e.iface, eiface); + e.physdev = 1; +#endif + } else { + STRLCPY(e.iface, SRCDIR ? IFACE(in) : IFACE(out)); + } + + if (strlen(e.iface) == 0) + return -EINVAL; + + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_netiface6_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_netiface6_elem e = { .cidr = HOST_MASK, .elem = 1 }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP] || + !tb[IPSET_ATTR_IFACE] || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + if (unlikely(tb[IPSET_ATTR_IP_TO])) + return -IPSET_ERR_HASH_RANGE_UNSUPPORTED; + + ret = ip_set_get_ipaddr6(tb[IPSET_ATTR_IP], &e.ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + if (tb[IPSET_ATTR_CIDR]) { + e.cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + if (e.cidr > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + } + + ip6_netmask(&e.ip, e.cidr); + + nla_strlcpy(e.iface, tb[IPSET_ATTR_IFACE], IFNAMSIZ); + + if (tb[IPSET_ATTR_CADT_FLAGS]) { + u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]); + + if (cadt_flags & IPSET_FLAG_PHYSDEV) + e.physdev = 1; + if (cadt_flags & IPSET_FLAG_NOMATCH) + flags |= (IPSET_FLAG_NOMATCH << 16); + } + + ret = adtfn(set, &e, &ext, &ext, flags); + + return ip_set_enomatch(ret, flags, adt, set) ? -ret : + ip_set_eexist(ret, flags) ? 0 : ret; +} + +static struct ip_set_type hash_netiface_type __read_mostly = { + .name = "hash:net,iface", + .protocol = IPSET_PROTOCOL, + .features = IPSET_TYPE_IP | IPSET_TYPE_IFACE | + IPSET_TYPE_NOMATCH, + .dimension = IPSET_DIM_TWO, + .family = NFPROTO_UNSPEC, + .revision_min = IPSET_TYPE_REV_MIN, + .revision_max = IPSET_TYPE_REV_MAX, + .create = hash_netiface_create, + .create_policy = { + [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, + [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, + [IPSET_ATTR_PROBES] = { .type = NLA_U8 }, + [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, + [IPSET_ATTR_PROTO] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + }, + .adt_policy = { + [IPSET_ATTR_IP] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP_TO] = { .type = NLA_NESTED }, + [IPSET_ATTR_IFACE] = { .type = NLA_NUL_STRING, + .len = IFNAMSIZ - 1 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + [IPSET_ATTR_CIDR] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_LINENO] = { .type = NLA_U32 }, + [IPSET_ATTR_BYTES] = { .type = NLA_U64 }, + [IPSET_ATTR_PACKETS] = { .type = NLA_U64 }, + [IPSET_ATTR_COMMENT] = { .type = NLA_NUL_STRING, + .len = IPSET_MAX_COMMENT_SIZE }, + [IPSET_ATTR_SKBMARK] = { .type = NLA_U64 }, + [IPSET_ATTR_SKBPRIO] = { .type = NLA_U32 }, + [IPSET_ATTR_SKBQUEUE] = { .type = NLA_U16 }, + }, + .me = THIS_MODULE, +}; + +static int __init +hash_netiface_init(void) +{ + return ip_set_type_register(&hash_netiface_type); +} + +static void __exit +hash_netiface_fini(void) +{ + rcu_barrier(); + ip_set_type_unregister(&hash_netiface_type); +} + +module_init(hash_netiface_init); +module_exit(hash_netiface_fini); diff --git a/kernel/net/netfilter/ipset/ip_set_hash_netnet.c b/kernel/net/netfilter/ipset/ip_set_hash_netnet.c new file mode 100644 index 0000000..5a2b923 --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_hash_netnet.c @@ -0,0 +1,508 @@ +/* Copyright (C) 2003-2013 Jozsef Kadlecsik + * Copyright (C) 2013 Oliver Smith + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module implementing an IP set type: the hash:net type */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define IPSET_TYPE_REV_MIN 0 +/* 1 Forceadd support added */ +#define IPSET_TYPE_REV_MAX 2 /* skbinfo support added */ + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Oliver Smith "); +IP_SET_MODULE_DESC("hash:net,net", IPSET_TYPE_REV_MIN, IPSET_TYPE_REV_MAX); +MODULE_ALIAS("ip_set_hash:net,net"); + +/* Type specific function prefix */ +#define HTYPE hash_netnet +#define IP_SET_HASH_WITH_NETS +#define IPSET_NET_COUNT 2 + +/* IPv4 variants */ + +/* Member elements */ +struct hash_netnet4_elem { + union { + __be32 ip[2]; + __be64 ipcmp; + }; + u8 nomatch; + u8 padding; + union { + u8 cidr[2]; + u16 ccmp; + }; +}; + +/* Common functions */ + +static inline bool +hash_netnet4_data_equal(const struct hash_netnet4_elem *ip1, + const struct hash_netnet4_elem *ip2, + u32 *multi) +{ + return ip1->ipcmp == ip2->ipcmp && + ip1->ccmp == ip2->ccmp; +} + +static inline int +hash_netnet4_do_data_match(const struct hash_netnet4_elem *elem) +{ + return elem->nomatch ? -ENOTEMPTY : 1; +} + +static inline void +hash_netnet4_data_set_flags(struct hash_netnet4_elem *elem, u32 flags) +{ + elem->nomatch = (flags >> 16) & IPSET_FLAG_NOMATCH; +} + +static inline void +hash_netnet4_data_reset_flags(struct hash_netnet4_elem *elem, u8 *flags) +{ + swap(*flags, elem->nomatch); +} + +static inline void +hash_netnet4_data_reset_elem(struct hash_netnet4_elem *elem, + struct hash_netnet4_elem *orig) +{ + elem->ip[1] = orig->ip[1]; +} + +static inline void +hash_netnet4_data_netmask(struct hash_netnet4_elem *elem, u8 cidr, bool inner) +{ + if (inner) { + elem->ip[1] &= ip_set_netmask(cidr); + elem->cidr[1] = cidr; + } else { + elem->ip[0] &= ip_set_netmask(cidr); + elem->cidr[0] = cidr; + } +} + +static bool +hash_netnet4_data_list(struct sk_buff *skb, + const struct hash_netnet4_elem *data) +{ + u32 flags = data->nomatch ? IPSET_FLAG_NOMATCH : 0; + + if (nla_put_ipaddr4(skb, IPSET_ATTR_IP, data->ip[0]) || + nla_put_ipaddr4(skb, IPSET_ATTR_IP2, data->ip[1]) || + nla_put_u8(skb, IPSET_ATTR_CIDR, data->cidr[0]) || + nla_put_u8(skb, IPSET_ATTR_CIDR2, data->cidr[1]) || + (flags && + nla_put_net32(skb, IPSET_ATTR_CADT_FLAGS, htonl(flags)))) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_netnet4_data_next(struct hash_netnet4_elem *next, + const struct hash_netnet4_elem *d) +{ + next->ipcmp = d->ipcmp; +} + +#define MTYPE hash_netnet4 +#define HOST_MASK 32 +#include "ip_set_hash_gen.h" + +static void +hash_netnet4_init(struct hash_netnet4_elem *e) +{ + e->cidr[0] = HOST_MASK; + e->cidr[1] = HOST_MASK; +} + +static int +hash_netnet4_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + const struct hash_netnet4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_netnet4_elem e = { }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + e.cidr[0] = INIT_CIDR(h->nets[0].cidr[0], HOST_MASK); + e.cidr[1] = INIT_CIDR(h->nets[0].cidr[1], HOST_MASK); + if (adt == IPSET_TEST) + e.ccmp = (HOST_MASK << (sizeof(e.cidr[0]) * 8)) | HOST_MASK; + + ip4addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip[0]); + ip4addrptr(skb, opt->flags & IPSET_DIM_TWO_SRC, &e.ip[1]); + e.ip[0] &= ip_set_netmask(e.cidr[0]); + e.ip[1] &= ip_set_netmask(e.cidr[1]); + + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_netnet4_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + const struct hash_netnet4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_netnet4_elem e = { }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + u32 ip = 0, ip_to = 0; + u32 ip2 = 0, ip2_from = 0, ip2_to = 0; + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + hash_netnet4_init(&e); + if (unlikely(!tb[IPSET_ATTR_IP] || !tb[IPSET_ATTR_IP2] || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP], &ip); + if (ret) + return ret; + + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP2], &ip2_from); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + if (tb[IPSET_ATTR_CIDR]) { + e.cidr[0] = nla_get_u8(tb[IPSET_ATTR_CIDR]); + if (!e.cidr[0] || e.cidr[0] > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + } + + if (tb[IPSET_ATTR_CIDR2]) { + e.cidr[1] = nla_get_u8(tb[IPSET_ATTR_CIDR2]); + if (!e.cidr[1] || e.cidr[1] > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + } + + if (tb[IPSET_ATTR_CADT_FLAGS]) { + u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]); + + if (cadt_flags & IPSET_FLAG_NOMATCH) + flags |= (IPSET_FLAG_NOMATCH << 16); + } + + if (adt == IPSET_TEST || !(tb[IPSET_ATTR_IP_TO] || + tb[IPSET_ATTR_IP2_TO])) { + e.ip[0] = htonl(ip & ip_set_hostmask(e.cidr[0])); + e.ip[1] = htonl(ip2_from & ip_set_hostmask(e.cidr[1])); + ret = adtfn(set, &e, &ext, &ext, flags); + return ip_set_enomatch(ret, flags, adt, set) ? -ret : + ip_set_eexist(ret, flags) ? 0 : ret; + } + + ip_to = ip; + if (tb[IPSET_ATTR_IP_TO]) { + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); + if (ret) + return ret; + if (ip_to < ip) + swap(ip, ip_to); + if (unlikely(ip + UINT_MAX == ip_to)) + return -IPSET_ERR_HASH_RANGE; + } else { + ip_set_mask_from_to(ip, ip_to, e.cidr[0]); + } + + ip2_to = ip2_from; + if (tb[IPSET_ATTR_IP2_TO]) { + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP2_TO], &ip2_to); + if (ret) + return ret; + if (ip2_to < ip2_from) + swap(ip2_from, ip2_to); + if (unlikely(ip2_from + UINT_MAX == ip2_to)) + return -IPSET_ERR_HASH_RANGE; + } else { + ip_set_mask_from_to(ip2_from, ip2_to, e.cidr[1]); + } + + if (retried) { + ip = ntohl(h->next.ip[0]); + ip2 = ntohl(h->next.ip[1]); + } else { + ip2 = ip2_from; + } + + do { + e.ip[0] = htonl(ip); + ip = ip_set_range_to_cidr(ip, ip_to, &e.cidr[0]); + do { + e.ip[1] = htonl(ip2); + ip2 = ip_set_range_to_cidr(ip2, ip2_to, &e.cidr[1]); + ret = adtfn(set, &e, &ext, &ext, flags); + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + ret = 0; + } while (ip2++ < ip2_to); + ip2 = ip2_from; + } while (ip++ < ip_to); + return ret; +} + +/* IPv6 variants */ + +struct hash_netnet6_elem { + union nf_inet_addr ip[2]; + u8 nomatch; + u8 padding; + union { + u8 cidr[2]; + u16 ccmp; + }; +}; + +/* Common functions */ + +static inline bool +hash_netnet6_data_equal(const struct hash_netnet6_elem *ip1, + const struct hash_netnet6_elem *ip2, + u32 *multi) +{ + return ipv6_addr_equal(&ip1->ip[0].in6, &ip2->ip[0].in6) && + ipv6_addr_equal(&ip1->ip[1].in6, &ip2->ip[1].in6) && + ip1->ccmp == ip2->ccmp; +} + +static inline int +hash_netnet6_do_data_match(const struct hash_netnet6_elem *elem) +{ + return elem->nomatch ? -ENOTEMPTY : 1; +} + +static inline void +hash_netnet6_data_set_flags(struct hash_netnet6_elem *elem, u32 flags) +{ + elem->nomatch = (flags >> 16) & IPSET_FLAG_NOMATCH; +} + +static inline void +hash_netnet6_data_reset_flags(struct hash_netnet6_elem *elem, u8 *flags) +{ + swap(*flags, elem->nomatch); +} + +static inline void +hash_netnet6_data_reset_elem(struct hash_netnet6_elem *elem, + struct hash_netnet6_elem *orig) +{ + elem->ip[1] = orig->ip[1]; +} + +static inline void +hash_netnet6_data_netmask(struct hash_netnet6_elem *elem, u8 cidr, bool inner) +{ + if (inner) { + ip6_netmask(&elem->ip[1], cidr); + elem->cidr[1] = cidr; + } else { + ip6_netmask(&elem->ip[0], cidr); + elem->cidr[0] = cidr; + } +} + +static bool +hash_netnet6_data_list(struct sk_buff *skb, + const struct hash_netnet6_elem *data) +{ + u32 flags = data->nomatch ? IPSET_FLAG_NOMATCH : 0; + + if (nla_put_ipaddr6(skb, IPSET_ATTR_IP, &data->ip[0].in6) || + nla_put_ipaddr6(skb, IPSET_ATTR_IP2, &data->ip[1].in6) || + nla_put_u8(skb, IPSET_ATTR_CIDR, data->cidr[0]) || + nla_put_u8(skb, IPSET_ATTR_CIDR2, data->cidr[1]) || + (flags && + nla_put_net32(skb, IPSET_ATTR_CADT_FLAGS, htonl(flags)))) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_netnet6_data_next(struct hash_netnet6_elem *next, + const struct hash_netnet6_elem *d) +{ +} + +#undef MTYPE +#undef HOST_MASK + +#define MTYPE hash_netnet6 +#define HOST_MASK 128 +#define IP_SET_EMIT_CREATE +#include "ip_set_hash_gen.h" + +static void +hash_netnet6_init(struct hash_netnet6_elem *e) +{ + e->cidr[0] = HOST_MASK; + e->cidr[1] = HOST_MASK; +} + +static int +hash_netnet6_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + const struct hash_netnet6 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_netnet6_elem e = { }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + e.cidr[0] = INIT_CIDR(h->nets[0].cidr[0], HOST_MASK); + e.cidr[1] = INIT_CIDR(h->nets[0].cidr[1], HOST_MASK); + if (adt == IPSET_TEST) + e.ccmp = (HOST_MASK << (sizeof(u8) * 8)) | HOST_MASK; + + ip6addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip[0].in6); + ip6addrptr(skb, opt->flags & IPSET_DIM_TWO_SRC, &e.ip[1].in6); + ip6_netmask(&e.ip[0], e.cidr[0]); + ip6_netmask(&e.ip[1], e.cidr[1]); + + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_netnet6_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_netnet6_elem e = { }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + hash_netnet6_init(&e); + if (unlikely(!tb[IPSET_ATTR_IP] || !tb[IPSET_ATTR_IP2] || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + if (unlikely(tb[IPSET_ATTR_IP_TO] || tb[IPSET_ATTR_IP2_TO])) + return -IPSET_ERR_HASH_RANGE_UNSUPPORTED; + + ret = ip_set_get_ipaddr6(tb[IPSET_ATTR_IP], &e.ip[0]); + if (ret) + return ret; + + ret = ip_set_get_ipaddr6(tb[IPSET_ATTR_IP2], &e.ip[1]); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + if (tb[IPSET_ATTR_CIDR]) { + e.cidr[0] = nla_get_u8(tb[IPSET_ATTR_CIDR]); + if (!e.cidr[0] || e.cidr[0] > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + } + + if (tb[IPSET_ATTR_CIDR2]) { + e.cidr[1] = nla_get_u8(tb[IPSET_ATTR_CIDR2]); + if (!e.cidr[1] || e.cidr[1] > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + } + + ip6_netmask(&e.ip[0], e.cidr[0]); + ip6_netmask(&e.ip[1], e.cidr[1]); + + if (tb[IPSET_ATTR_CADT_FLAGS]) { + u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]); + + if (cadt_flags & IPSET_FLAG_NOMATCH) + flags |= (IPSET_FLAG_NOMATCH << 16); + } + + ret = adtfn(set, &e, &ext, &ext, flags); + + return ip_set_enomatch(ret, flags, adt, set) ? -ret : + ip_set_eexist(ret, flags) ? 0 : ret; +} + +static struct ip_set_type hash_netnet_type __read_mostly = { + .name = "hash:net,net", + .protocol = IPSET_PROTOCOL, + .features = IPSET_TYPE_IP | IPSET_TYPE_IP2 | IPSET_TYPE_NOMATCH, + .dimension = IPSET_DIM_TWO, + .family = NFPROTO_UNSPEC, + .revision_min = IPSET_TYPE_REV_MIN, + .revision_max = IPSET_TYPE_REV_MAX, + .create = hash_netnet_create, + .create_policy = { + [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, + [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, + [IPSET_ATTR_PROBES] = { .type = NLA_U8 }, + [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + }, + .adt_policy = { + [IPSET_ATTR_IP] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP_TO] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP2] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP2_TO] = { .type = NLA_NESTED }, + [IPSET_ATTR_CIDR] = { .type = NLA_U8 }, + [IPSET_ATTR_CIDR2] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + [IPSET_ATTR_BYTES] = { .type = NLA_U64 }, + [IPSET_ATTR_PACKETS] = { .type = NLA_U64 }, + [IPSET_ATTR_COMMENT] = { .type = NLA_NUL_STRING, + .len = IPSET_MAX_COMMENT_SIZE }, + [IPSET_ATTR_SKBMARK] = { .type = NLA_U64 }, + [IPSET_ATTR_SKBPRIO] = { .type = NLA_U32 }, + [IPSET_ATTR_SKBQUEUE] = { .type = NLA_U16 }, + }, + .me = THIS_MODULE, +}; + +static int __init +hash_netnet_init(void) +{ + return ip_set_type_register(&hash_netnet_type); +} + +static void __exit +hash_netnet_fini(void) +{ + rcu_barrier(); + ip_set_type_unregister(&hash_netnet_type); +} + +module_init(hash_netnet_init); +module_exit(hash_netnet_fini); diff --git a/kernel/net/netfilter/ipset/ip_set_hash_netport.c b/kernel/net/netfilter/ipset/ip_set_hash_netport.c new file mode 100644 index 0000000..1a187be --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_hash_netport.c @@ -0,0 +1,512 @@ +/* Copyright (C) 2003-2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module implementing an IP set type: the hash:net,port type */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define IPSET_TYPE_REV_MIN 0 +/* 1 SCTP and UDPLITE support added */ +/* 2 Range as input support for IPv4 added */ +/* 3 nomatch flag support added */ +/* 4 Counters support added */ +/* 5 Comments support added */ +/* 6 Forceadd support added */ +#define IPSET_TYPE_REV_MAX 7 /* skbinfo support added */ + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Jozsef Kadlecsik "); +IP_SET_MODULE_DESC("hash:net,port", IPSET_TYPE_REV_MIN, IPSET_TYPE_REV_MAX); +MODULE_ALIAS("ip_set_hash:net,port"); + +/* Type specific function prefix */ +#define HTYPE hash_netport +#define IP_SET_HASH_WITH_PROTO +#define IP_SET_HASH_WITH_NETS + +/* We squeeze the "nomatch" flag into cidr: we don't support cidr == 0 + * However this way we have to store internally cidr - 1, + * dancing back and forth. + */ +#define IP_SET_HASH_WITH_NETS_PACKED + +/* IPv4 variant */ + +/* Member elements */ +struct hash_netport4_elem { + __be32 ip; + __be16 port; + u8 proto; + u8 cidr:7; + u8 nomatch:1; +}; + +/* Common functions */ + +static inline bool +hash_netport4_data_equal(const struct hash_netport4_elem *ip1, + const struct hash_netport4_elem *ip2, + u32 *multi) +{ + return ip1->ip == ip2->ip && + ip1->port == ip2->port && + ip1->proto == ip2->proto && + ip1->cidr == ip2->cidr; +} + +static inline int +hash_netport4_do_data_match(const struct hash_netport4_elem *elem) +{ + return elem->nomatch ? -ENOTEMPTY : 1; +} + +static inline void +hash_netport4_data_set_flags(struct hash_netport4_elem *elem, u32 flags) +{ + elem->nomatch = !!((flags >> 16) & IPSET_FLAG_NOMATCH); +} + +static inline void +hash_netport4_data_reset_flags(struct hash_netport4_elem *elem, u8 *flags) +{ + swap(*flags, elem->nomatch); +} + +static inline void +hash_netport4_data_netmask(struct hash_netport4_elem *elem, u8 cidr) +{ + elem->ip &= ip_set_netmask(cidr); + elem->cidr = cidr - 1; +} + +static bool +hash_netport4_data_list(struct sk_buff *skb, + const struct hash_netport4_elem *data) +{ + u32 flags = data->nomatch ? IPSET_FLAG_NOMATCH : 0; + + if (nla_put_ipaddr4(skb, IPSET_ATTR_IP, data->ip) || + nla_put_net16(skb, IPSET_ATTR_PORT, data->port) || + nla_put_u8(skb, IPSET_ATTR_CIDR, data->cidr + 1) || + nla_put_u8(skb, IPSET_ATTR_PROTO, data->proto) || + (flags && + nla_put_net32(skb, IPSET_ATTR_CADT_FLAGS, htonl(flags)))) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_netport4_data_next(struct hash_netport4_elem *next, + const struct hash_netport4_elem *d) +{ + next->ip = d->ip; + next->port = d->port; +} + +#define MTYPE hash_netport4 +#define HOST_MASK 32 +#include "ip_set_hash_gen.h" + +static int +hash_netport4_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + const struct hash_netport4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_netport4_elem e = { + .cidr = INIT_CIDR(h->nets[0].cidr[0], HOST_MASK), + }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + if (adt == IPSET_TEST) + e.cidr = HOST_MASK - 1; + + if (!ip_set_get_ip4_port(skb, opt->flags & IPSET_DIM_TWO_SRC, + &e.port, &e.proto)) + return -EINVAL; + + ip4addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip); + e.ip &= ip_set_netmask(e.cidr + 1); + + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_netport4_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + const struct hash_netport4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_netport4_elem e = { .cidr = HOST_MASK - 1 }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + u32 port, port_to, p = 0, ip = 0, ip_to = 0; + bool with_ports = false; + u8 cidr; + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP] || + !ip_set_attr_netorder(tb, IPSET_ATTR_PORT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_PORT_TO) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP], &ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + if (tb[IPSET_ATTR_CIDR]) { + cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + if (!cidr || cidr > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + e.cidr = cidr - 1; + } + + e.port = nla_get_be16(tb[IPSET_ATTR_PORT]); + + if (tb[IPSET_ATTR_PROTO]) { + e.proto = nla_get_u8(tb[IPSET_ATTR_PROTO]); + with_ports = ip_set_proto_with_ports(e.proto); + + if (e.proto == 0) + return -IPSET_ERR_INVALID_PROTO; + } else { + return -IPSET_ERR_MISSING_PROTO; + } + + if (!(with_ports || e.proto == IPPROTO_ICMP)) + e.port = 0; + + with_ports = with_ports && tb[IPSET_ATTR_PORT_TO]; + + if (tb[IPSET_ATTR_CADT_FLAGS]) { + u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]); + + if (cadt_flags & IPSET_FLAG_NOMATCH) + flags |= (IPSET_FLAG_NOMATCH << 16); + } + + if (adt == IPSET_TEST || !(with_ports || tb[IPSET_ATTR_IP_TO])) { + e.ip = htonl(ip & ip_set_hostmask(e.cidr + 1)); + ret = adtfn(set, &e, &ext, &ext, flags); + return ip_set_enomatch(ret, flags, adt, set) ? -ret : + ip_set_eexist(ret, flags) ? 0 : ret; + } + + port = port_to = ntohs(e.port); + if (tb[IPSET_ATTR_PORT_TO]) { + port_to = ip_set_get_h16(tb[IPSET_ATTR_PORT_TO]); + if (port_to < port) + swap(port, port_to); + } + if (tb[IPSET_ATTR_IP_TO]) { + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); + if (ret) + return ret; + if (ip_to < ip) + swap(ip, ip_to); + if (ip + UINT_MAX == ip_to) + return -IPSET_ERR_HASH_RANGE; + } else { + ip_set_mask_from_to(ip, ip_to, e.cidr + 1); + } + + if (retried) { + ip = ntohl(h->next.ip); + p = ntohs(h->next.port); + } else { + p = port; + } + do { + e.ip = htonl(ip); + ip = ip_set_range_to_cidr(ip, ip_to, &cidr); + e.cidr = cidr - 1; + for (; p <= port_to; p++) { + e.port = htons(p); + ret = adtfn(set, &e, &ext, &ext, flags); + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + ret = 0; + } + p = port; + } while (ip++ < ip_to); + return ret; +} + +/* IPv6 variant */ + +struct hash_netport6_elem { + union nf_inet_addr ip; + __be16 port; + u8 proto; + u8 cidr:7; + u8 nomatch:1; +}; + +/* Common functions */ + +static inline bool +hash_netport6_data_equal(const struct hash_netport6_elem *ip1, + const struct hash_netport6_elem *ip2, + u32 *multi) +{ + return ipv6_addr_equal(&ip1->ip.in6, &ip2->ip.in6) && + ip1->port == ip2->port && + ip1->proto == ip2->proto && + ip1->cidr == ip2->cidr; +} + +static inline int +hash_netport6_do_data_match(const struct hash_netport6_elem *elem) +{ + return elem->nomatch ? -ENOTEMPTY : 1; +} + +static inline void +hash_netport6_data_set_flags(struct hash_netport6_elem *elem, u32 flags) +{ + elem->nomatch = !!((flags >> 16) & IPSET_FLAG_NOMATCH); +} + +static inline void +hash_netport6_data_reset_flags(struct hash_netport6_elem *elem, u8 *flags) +{ + swap(*flags, elem->nomatch); +} + +static inline void +hash_netport6_data_netmask(struct hash_netport6_elem *elem, u8 cidr) +{ + ip6_netmask(&elem->ip, cidr); + elem->cidr = cidr - 1; +} + +static bool +hash_netport6_data_list(struct sk_buff *skb, + const struct hash_netport6_elem *data) +{ + u32 flags = data->nomatch ? IPSET_FLAG_NOMATCH : 0; + + if (nla_put_ipaddr6(skb, IPSET_ATTR_IP, &data->ip.in6) || + nla_put_net16(skb, IPSET_ATTR_PORT, data->port) || + nla_put_u8(skb, IPSET_ATTR_CIDR, data->cidr + 1) || + nla_put_u8(skb, IPSET_ATTR_PROTO, data->proto) || + (flags && + nla_put_net32(skb, IPSET_ATTR_CADT_FLAGS, htonl(flags)))) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_netport6_data_next(struct hash_netport6_elem *next, + const struct hash_netport6_elem *d) +{ + next->port = d->port; +} + +#undef MTYPE +#undef HOST_MASK + +#define MTYPE hash_netport6 +#define HOST_MASK 128 +#define IP_SET_EMIT_CREATE +#include "ip_set_hash_gen.h" + +static int +hash_netport6_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + const struct hash_netport6 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_netport6_elem e = { + .cidr = INIT_CIDR(h->nets[0].cidr[0], HOST_MASK), + }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + if (adt == IPSET_TEST) + e.cidr = HOST_MASK - 1; + + if (!ip_set_get_ip6_port(skb, opt->flags & IPSET_DIM_TWO_SRC, + &e.port, &e.proto)) + return -EINVAL; + + ip6addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip.in6); + ip6_netmask(&e.ip, e.cidr + 1); + + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_netport6_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + const struct hash_netport6 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_netport6_elem e = { .cidr = HOST_MASK - 1 }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + u32 port, port_to; + bool with_ports = false; + u8 cidr; + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_IP] || + !ip_set_attr_netorder(tb, IPSET_ATTR_PORT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_PORT_TO) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + if (unlikely(tb[IPSET_ATTR_IP_TO])) + return -IPSET_ERR_HASH_RANGE_UNSUPPORTED; + + ret = ip_set_get_ipaddr6(tb[IPSET_ATTR_IP], &e.ip); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + if (tb[IPSET_ATTR_CIDR]) { + cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]); + if (!cidr || cidr > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + e.cidr = cidr - 1; + } + ip6_netmask(&e.ip, e.cidr + 1); + + e.port = nla_get_be16(tb[IPSET_ATTR_PORT]); + + if (tb[IPSET_ATTR_PROTO]) { + e.proto = nla_get_u8(tb[IPSET_ATTR_PROTO]); + with_ports = ip_set_proto_with_ports(e.proto); + + if (e.proto == 0) + return -IPSET_ERR_INVALID_PROTO; + } else { + return -IPSET_ERR_MISSING_PROTO; + } + + if (!(with_ports || e.proto == IPPROTO_ICMPV6)) + e.port = 0; + + if (tb[IPSET_ATTR_CADT_FLAGS]) { + u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]); + + if (cadt_flags & IPSET_FLAG_NOMATCH) + flags |= (IPSET_FLAG_NOMATCH << 16); + } + + if (adt == IPSET_TEST || !with_ports || !tb[IPSET_ATTR_PORT_TO]) { + ret = adtfn(set, &e, &ext, &ext, flags); + return ip_set_enomatch(ret, flags, adt, set) ? -ret : + ip_set_eexist(ret, flags) ? 0 : ret; + } + + port = ntohs(e.port); + port_to = ip_set_get_h16(tb[IPSET_ATTR_PORT_TO]); + if (port > port_to) + swap(port, port_to); + + if (retried) + port = ntohs(h->next.port); + for (; port <= port_to; port++) { + e.port = htons(port); + ret = adtfn(set, &e, &ext, &ext, flags); + + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + ret = 0; + } + return ret; +} + +static struct ip_set_type hash_netport_type __read_mostly = { + .name = "hash:net,port", + .protocol = IPSET_PROTOCOL, + .features = IPSET_TYPE_IP | IPSET_TYPE_PORT | IPSET_TYPE_NOMATCH, + .dimension = IPSET_DIM_TWO, + .family = NFPROTO_UNSPEC, + .revision_min = IPSET_TYPE_REV_MIN, + .revision_max = IPSET_TYPE_REV_MAX, + .create = hash_netport_create, + .create_policy = { + [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, + [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, + [IPSET_ATTR_PROBES] = { .type = NLA_U8 }, + [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, + [IPSET_ATTR_PROTO] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + }, + .adt_policy = { + [IPSET_ATTR_IP] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP_TO] = { .type = NLA_NESTED }, + [IPSET_ATTR_PORT] = { .type = NLA_U16 }, + [IPSET_ATTR_PORT_TO] = { .type = NLA_U16 }, + [IPSET_ATTR_PROTO] = { .type = NLA_U8 }, + [IPSET_ATTR_CIDR] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_LINENO] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + [IPSET_ATTR_BYTES] = { .type = NLA_U64 }, + [IPSET_ATTR_PACKETS] = { .type = NLA_U64 }, + [IPSET_ATTR_COMMENT] = { .type = NLA_NUL_STRING, + .len = IPSET_MAX_COMMENT_SIZE }, + [IPSET_ATTR_SKBMARK] = { .type = NLA_U64 }, + [IPSET_ATTR_SKBPRIO] = { .type = NLA_U32 }, + [IPSET_ATTR_SKBQUEUE] = { .type = NLA_U16 }, + }, + .me = THIS_MODULE, +}; + +static int __init +hash_netport_init(void) +{ + return ip_set_type_register(&hash_netport_type); +} + +static void __exit +hash_netport_fini(void) +{ + rcu_barrier(); + ip_set_type_unregister(&hash_netport_type); +} + +module_init(hash_netport_init); +module_exit(hash_netport_fini); diff --git a/kernel/net/netfilter/ipset/ip_set_hash_netportnet.c b/kernel/net/netfilter/ipset/ip_set_hash_netportnet.c new file mode 100644 index 0000000..613e18e --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_hash_netportnet.c @@ -0,0 +1,612 @@ +/* Copyright (C) 2003-2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module implementing an IP set type: the hash:ip,port,net type */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define IPSET_TYPE_REV_MIN 0 +/* 0 Comments support added */ +/* 1 Forceadd support added */ +#define IPSET_TYPE_REV_MAX 2 /* skbinfo support added */ + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Oliver Smith "); +IP_SET_MODULE_DESC("hash:net,port,net", IPSET_TYPE_REV_MIN, IPSET_TYPE_REV_MAX); +MODULE_ALIAS("ip_set_hash:net,port,net"); + +/* Type specific function prefix */ +#define HTYPE hash_netportnet +#define IP_SET_HASH_WITH_PROTO +#define IP_SET_HASH_WITH_NETS +#define IPSET_NET_COUNT 2 + +/* IPv4 variant */ + +/* Member elements */ +struct hash_netportnet4_elem { + union { + __be32 ip[2]; + __be64 ipcmp; + }; + __be16 port; + union { + u8 cidr[2]; + u16 ccmp; + }; + u16 padding; + u8 nomatch; + u8 proto; +}; + +/* Common functions */ + +static inline bool +hash_netportnet4_data_equal(const struct hash_netportnet4_elem *ip1, + const struct hash_netportnet4_elem *ip2, + u32 *multi) +{ + return ip1->ipcmp == ip2->ipcmp && + ip1->ccmp == ip2->ccmp && + ip1->port == ip2->port && + ip1->proto == ip2->proto; +} + +static inline int +hash_netportnet4_do_data_match(const struct hash_netportnet4_elem *elem) +{ + return elem->nomatch ? -ENOTEMPTY : 1; +} + +static inline void +hash_netportnet4_data_set_flags(struct hash_netportnet4_elem *elem, u32 flags) +{ + elem->nomatch = !!((flags >> 16) & IPSET_FLAG_NOMATCH); +} + +static inline void +hash_netportnet4_data_reset_flags(struct hash_netportnet4_elem *elem, u8 *flags) +{ + swap(*flags, elem->nomatch); +} + +static inline void +hash_netportnet4_data_reset_elem(struct hash_netportnet4_elem *elem, + struct hash_netportnet4_elem *orig) +{ + elem->ip[1] = orig->ip[1]; +} + +static inline void +hash_netportnet4_data_netmask(struct hash_netportnet4_elem *elem, + u8 cidr, bool inner) +{ + if (inner) { + elem->ip[1] &= ip_set_netmask(cidr); + elem->cidr[1] = cidr; + } else { + elem->ip[0] &= ip_set_netmask(cidr); + elem->cidr[0] = cidr; + } +} + +static bool +hash_netportnet4_data_list(struct sk_buff *skb, + const struct hash_netportnet4_elem *data) +{ + u32 flags = data->nomatch ? IPSET_FLAG_NOMATCH : 0; + + if (nla_put_ipaddr4(skb, IPSET_ATTR_IP, data->ip[0]) || + nla_put_ipaddr4(skb, IPSET_ATTR_IP2, data->ip[1]) || + nla_put_net16(skb, IPSET_ATTR_PORT, data->port) || + nla_put_u8(skb, IPSET_ATTR_CIDR, data->cidr[0]) || + nla_put_u8(skb, IPSET_ATTR_CIDR2, data->cidr[1]) || + nla_put_u8(skb, IPSET_ATTR_PROTO, data->proto) || + (flags && + nla_put_net32(skb, IPSET_ATTR_CADT_FLAGS, htonl(flags)))) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_netportnet4_data_next(struct hash_netportnet4_elem *next, + const struct hash_netportnet4_elem *d) +{ + next->ipcmp = d->ipcmp; + next->port = d->port; +} + +#define MTYPE hash_netportnet4 +#define HOST_MASK 32 +#include "ip_set_hash_gen.h" + +static void +hash_netportnet4_init(struct hash_netportnet4_elem *e) +{ + e->cidr[0] = HOST_MASK; + e->cidr[1] = HOST_MASK; +} + +static int +hash_netportnet4_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + const struct hash_netportnet4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_netportnet4_elem e = { }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + e.cidr[0] = INIT_CIDR(h->nets[0].cidr[0], HOST_MASK); + e.cidr[1] = INIT_CIDR(h->nets[0].cidr[1], HOST_MASK); + if (adt == IPSET_TEST) + e.ccmp = (HOST_MASK << (sizeof(e.cidr[0]) * 8)) | HOST_MASK; + + if (!ip_set_get_ip4_port(skb, opt->flags & IPSET_DIM_TWO_SRC, + &e.port, &e.proto)) + return -EINVAL; + + ip4addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip[0]); + ip4addrptr(skb, opt->flags & IPSET_DIM_THREE_SRC, &e.ip[1]); + e.ip[0] &= ip_set_netmask(e.cidr[0]); + e.ip[1] &= ip_set_netmask(e.cidr[1]); + + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_netportnet4_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + const struct hash_netportnet4 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_netportnet4_elem e = { }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + u32 ip = 0, ip_to = 0, p = 0, port, port_to; + u32 ip2_from = 0, ip2_to = 0, ip2; + bool with_ports = false; + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + hash_netportnet4_init(&e); + if (unlikely(!tb[IPSET_ATTR_IP] || !tb[IPSET_ATTR_IP2] || + !ip_set_attr_netorder(tb, IPSET_ATTR_PORT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_PORT_TO) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP], &ip); + if (ret) + return ret; + + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP2], &ip2_from); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + if (tb[IPSET_ATTR_CIDR]) { + e.cidr[0] = nla_get_u8(tb[IPSET_ATTR_CIDR]); + if (e.cidr[0] > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + } + + if (tb[IPSET_ATTR_CIDR2]) { + e.cidr[1] = nla_get_u8(tb[IPSET_ATTR_CIDR2]); + if (e.cidr[1] > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + } + + e.port = nla_get_be16(tb[IPSET_ATTR_PORT]); + + if (tb[IPSET_ATTR_PROTO]) { + e.proto = nla_get_u8(tb[IPSET_ATTR_PROTO]); + with_ports = ip_set_proto_with_ports(e.proto); + + if (e.proto == 0) + return -IPSET_ERR_INVALID_PROTO; + } else { + return -IPSET_ERR_MISSING_PROTO; + } + + if (!(with_ports || e.proto == IPPROTO_ICMP)) + e.port = 0; + + if (tb[IPSET_ATTR_CADT_FLAGS]) { + u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]); + + if (cadt_flags & IPSET_FLAG_NOMATCH) + flags |= (IPSET_FLAG_NOMATCH << 16); + } + + with_ports = with_ports && tb[IPSET_ATTR_PORT_TO]; + if (adt == IPSET_TEST || + !(tb[IPSET_ATTR_IP_TO] || with_ports || tb[IPSET_ATTR_IP2_TO])) { + e.ip[0] = htonl(ip & ip_set_hostmask(e.cidr[0])); + e.ip[1] = htonl(ip2_from & ip_set_hostmask(e.cidr[1])); + ret = adtfn(set, &e, &ext, &ext, flags); + return ip_set_enomatch(ret, flags, adt, set) ? -ret : + ip_set_eexist(ret, flags) ? 0 : ret; + } + + ip_to = ip; + if (tb[IPSET_ATTR_IP_TO]) { + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); + if (ret) + return ret; + if (ip > ip_to) + swap(ip, ip_to); + if (unlikely(ip + UINT_MAX == ip_to)) + return -IPSET_ERR_HASH_RANGE; + } else { + ip_set_mask_from_to(ip, ip_to, e.cidr[0]); + } + + port_to = port = ntohs(e.port); + if (tb[IPSET_ATTR_PORT_TO]) { + port_to = ip_set_get_h16(tb[IPSET_ATTR_PORT_TO]); + if (port > port_to) + swap(port, port_to); + } + + ip2_to = ip2_from; + if (tb[IPSET_ATTR_IP2_TO]) { + ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP2_TO], &ip2_to); + if (ret) + return ret; + if (ip2_from > ip2_to) + swap(ip2_from, ip2_to); + if (unlikely(ip2_from + UINT_MAX == ip2_to)) + return -IPSET_ERR_HASH_RANGE; + } else { + ip_set_mask_from_to(ip2_from, ip2_to, e.cidr[1]); + } + + if (retried) { + ip = ntohl(h->next.ip[0]); + p = ntohs(h->next.port); + ip2 = ntohl(h->next.ip[1]); + } else { + p = port; + ip2 = ip2_from; + } + + do { + e.ip[0] = htonl(ip); + ip = ip_set_range_to_cidr(ip, ip_to, &e.cidr[0]); + for (; p <= port_to; p++) { + e.port = htons(p); + do { + e.ip[1] = htonl(ip2); + ip2 = ip_set_range_to_cidr(ip2, ip2_to, + &e.cidr[1]); + ret = adtfn(set, &e, &ext, &ext, flags); + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + ret = 0; + } while (ip2++ < ip2_to); + ip2 = ip2_from; + } + p = port; + } while (ip++ < ip_to); + return ret; +} + +/* IPv6 variant */ + +struct hash_netportnet6_elem { + union nf_inet_addr ip[2]; + __be16 port; + union { + u8 cidr[2]; + u16 ccmp; + }; + u16 padding; + u8 nomatch; + u8 proto; +}; + +/* Common functions */ + +static inline bool +hash_netportnet6_data_equal(const struct hash_netportnet6_elem *ip1, + const struct hash_netportnet6_elem *ip2, + u32 *multi) +{ + return ipv6_addr_equal(&ip1->ip[0].in6, &ip2->ip[0].in6) && + ipv6_addr_equal(&ip1->ip[1].in6, &ip2->ip[1].in6) && + ip1->ccmp == ip2->ccmp && + ip1->port == ip2->port && + ip1->proto == ip2->proto; +} + +static inline int +hash_netportnet6_do_data_match(const struct hash_netportnet6_elem *elem) +{ + return elem->nomatch ? -ENOTEMPTY : 1; +} + +static inline void +hash_netportnet6_data_set_flags(struct hash_netportnet6_elem *elem, u32 flags) +{ + elem->nomatch = !!((flags >> 16) & IPSET_FLAG_NOMATCH); +} + +static inline void +hash_netportnet6_data_reset_flags(struct hash_netportnet6_elem *elem, u8 *flags) +{ + swap(*flags, elem->nomatch); +} + +static inline void +hash_netportnet6_data_reset_elem(struct hash_netportnet6_elem *elem, + struct hash_netportnet6_elem *orig) +{ + elem->ip[1] = orig->ip[1]; +} + +static inline void +hash_netportnet6_data_netmask(struct hash_netportnet6_elem *elem, + u8 cidr, bool inner) +{ + if (inner) { + ip6_netmask(&elem->ip[1], cidr); + elem->cidr[1] = cidr; + } else { + ip6_netmask(&elem->ip[0], cidr); + elem->cidr[0] = cidr; + } +} + +static bool +hash_netportnet6_data_list(struct sk_buff *skb, + const struct hash_netportnet6_elem *data) +{ + u32 flags = data->nomatch ? IPSET_FLAG_NOMATCH : 0; + + if (nla_put_ipaddr6(skb, IPSET_ATTR_IP, &data->ip[0].in6) || + nla_put_ipaddr6(skb, IPSET_ATTR_IP2, &data->ip[1].in6) || + nla_put_net16(skb, IPSET_ATTR_PORT, data->port) || + nla_put_u8(skb, IPSET_ATTR_CIDR, data->cidr[0]) || + nla_put_u8(skb, IPSET_ATTR_CIDR2, data->cidr[1]) || + nla_put_u8(skb, IPSET_ATTR_PROTO, data->proto) || + (flags && + nla_put_net32(skb, IPSET_ATTR_CADT_FLAGS, htonl(flags)))) + goto nla_put_failure; + return false; + +nla_put_failure: + return true; +} + +static inline void +hash_netportnet6_data_next(struct hash_netportnet6_elem *next, + const struct hash_netportnet6_elem *d) +{ + next->port = d->port; +} + +#undef MTYPE +#undef HOST_MASK + +#define MTYPE hash_netportnet6 +#define HOST_MASK 128 +#define IP_SET_EMIT_CREATE +#include "ip_set_hash_gen.h" + +static void +hash_netportnet6_init(struct hash_netportnet6_elem *e) +{ + e->cidr[0] = HOST_MASK; + e->cidr[1] = HOST_MASK; +} + +static int +hash_netportnet6_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + const struct hash_netportnet6 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_netportnet6_elem e = { }; + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + + e.cidr[0] = INIT_CIDR(h->nets[0].cidr[0], HOST_MASK); + e.cidr[1] = INIT_CIDR(h->nets[0].cidr[1], HOST_MASK); + if (adt == IPSET_TEST) + e.ccmp = (HOST_MASK << (sizeof(u8) * 8)) | HOST_MASK; + + if (!ip_set_get_ip6_port(skb, opt->flags & IPSET_DIM_TWO_SRC, + &e.port, &e.proto)) + return -EINVAL; + + ip6addrptr(skb, opt->flags & IPSET_DIM_ONE_SRC, &e.ip[0].in6); + ip6addrptr(skb, opt->flags & IPSET_DIM_THREE_SRC, &e.ip[1].in6); + ip6_netmask(&e.ip[0], e.cidr[0]); + ip6_netmask(&e.ip[1], e.cidr[1]); + + return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags); +} + +static int +hash_netportnet6_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + const struct hash_netportnet6 *h = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct hash_netportnet6_elem e = { }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + u32 port, port_to; + bool with_ports = false; + int ret; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + hash_netportnet6_init(&e); + if (unlikely(!tb[IPSET_ATTR_IP] || !tb[IPSET_ATTR_IP2] || + !ip_set_attr_netorder(tb, IPSET_ATTR_PORT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_PORT_TO) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + if (unlikely(tb[IPSET_ATTR_IP_TO] || tb[IPSET_ATTR_IP2_TO])) + return -IPSET_ERR_HASH_RANGE_UNSUPPORTED; + + ret = ip_set_get_ipaddr6(tb[IPSET_ATTR_IP], &e.ip[0]); + if (ret) + return ret; + + ret = ip_set_get_ipaddr6(tb[IPSET_ATTR_IP2], &e.ip[1]); + if (ret) + return ret; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + + if (tb[IPSET_ATTR_CIDR]) { + e.cidr[0] = nla_get_u8(tb[IPSET_ATTR_CIDR]); + if (e.cidr[0] > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + } + + if (tb[IPSET_ATTR_CIDR2]) { + e.cidr[1] = nla_get_u8(tb[IPSET_ATTR_CIDR2]); + if (e.cidr[1] > HOST_MASK) + return -IPSET_ERR_INVALID_CIDR; + } + + ip6_netmask(&e.ip[0], e.cidr[0]); + ip6_netmask(&e.ip[1], e.cidr[1]); + + e.port = nla_get_be16(tb[IPSET_ATTR_PORT]); + + if (tb[IPSET_ATTR_PROTO]) { + e.proto = nla_get_u8(tb[IPSET_ATTR_PROTO]); + with_ports = ip_set_proto_with_ports(e.proto); + + if (e.proto == 0) + return -IPSET_ERR_INVALID_PROTO; + } else { + return -IPSET_ERR_MISSING_PROTO; + } + + if (!(with_ports || e.proto == IPPROTO_ICMPV6)) + e.port = 0; + + if (tb[IPSET_ATTR_CADT_FLAGS]) { + u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]); + + if (cadt_flags & IPSET_FLAG_NOMATCH) + flags |= (IPSET_FLAG_NOMATCH << 16); + } + + if (adt == IPSET_TEST || !with_ports || !tb[IPSET_ATTR_PORT_TO]) { + ret = adtfn(set, &e, &ext, &ext, flags); + return ip_set_enomatch(ret, flags, adt, set) ? -ret : + ip_set_eexist(ret, flags) ? 0 : ret; + } + + port = ntohs(e.port); + port_to = ip_set_get_h16(tb[IPSET_ATTR_PORT_TO]); + if (port > port_to) + swap(port, port_to); + + if (retried) + port = ntohs(h->next.port); + for (; port <= port_to; port++) { + e.port = htons(port); + ret = adtfn(set, &e, &ext, &ext, flags); + + if (ret && !ip_set_eexist(ret, flags)) + return ret; + + ret = 0; + } + return ret; +} + +static struct ip_set_type hash_netportnet_type __read_mostly = { + .name = "hash:net,port,net", + .protocol = IPSET_PROTOCOL, + .features = IPSET_TYPE_IP | IPSET_TYPE_PORT | IPSET_TYPE_IP2 | + IPSET_TYPE_NOMATCH, + .dimension = IPSET_DIM_THREE, + .family = NFPROTO_UNSPEC, + .revision_min = IPSET_TYPE_REV_MIN, + .revision_max = IPSET_TYPE_REV_MAX, + .create = hash_netportnet_create, + .create_policy = { + [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, + [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, + [IPSET_ATTR_PROBES] = { .type = NLA_U8 }, + [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + }, + .adt_policy = { + [IPSET_ATTR_IP] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP_TO] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP2] = { .type = NLA_NESTED }, + [IPSET_ATTR_IP2_TO] = { .type = NLA_NESTED }, + [IPSET_ATTR_PORT] = { .type = NLA_U16 }, + [IPSET_ATTR_PORT_TO] = { .type = NLA_U16 }, + [IPSET_ATTR_CIDR] = { .type = NLA_U8 }, + [IPSET_ATTR_CIDR2] = { .type = NLA_U8 }, + [IPSET_ATTR_PROTO] = { .type = NLA_U8 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_LINENO] = { .type = NLA_U32 }, + [IPSET_ATTR_BYTES] = { .type = NLA_U64 }, + [IPSET_ATTR_PACKETS] = { .type = NLA_U64 }, + [IPSET_ATTR_COMMENT] = { .type = NLA_NUL_STRING, + .len = IPSET_MAX_COMMENT_SIZE }, + [IPSET_ATTR_SKBMARK] = { .type = NLA_U64 }, + [IPSET_ATTR_SKBPRIO] = { .type = NLA_U32 }, + [IPSET_ATTR_SKBQUEUE] = { .type = NLA_U16 }, + }, + .me = THIS_MODULE, +}; + +static int __init +hash_netportnet_init(void) +{ + return ip_set_type_register(&hash_netportnet_type); +} + +static void __exit +hash_netportnet_fini(void) +{ + rcu_barrier(); + ip_set_type_unregister(&hash_netportnet_type); +} + +module_init(hash_netportnet_init); +module_exit(hash_netportnet_fini); diff --git a/kernel/net/netfilter/ipset/ip_set_list_set.c b/kernel/net/netfilter/ipset/ip_set_list_set.c new file mode 100644 index 0000000..60925f7 --- /dev/null +++ b/kernel/net/netfilter/ipset/ip_set_list_set.c @@ -0,0 +1,688 @@ +/* Copyright (C) 2008-2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module implementing an IP set type: the list:set type */ + +#include +#include +#include +#include +#include + +#include +#include + +#define IPSET_TYPE_REV_MIN 0 +/* 1 Counters support added */ +/* 2 Comments support added */ +#define IPSET_TYPE_REV_MAX 3 /* skbinfo support added */ + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Jozsef Kadlecsik "); +IP_SET_MODULE_DESC("list:set", IPSET_TYPE_REV_MIN, IPSET_TYPE_REV_MAX); +MODULE_ALIAS("ip_set_list:set"); + +/* Member elements */ +struct set_elem { + struct rcu_head rcu; + struct list_head list; + struct ip_set *set; /* Sigh, in order to cleanup reference */ + ip_set_id_t id; +} __aligned(__alignof__(u64)); + +struct set_adt_elem { + ip_set_id_t id; + ip_set_id_t refid; + int before; +}; + +/* Type structure */ +struct list_set { + u32 size; /* size of set list array */ + struct timer_list gc; /* garbage collection */ +#ifdef HAVE_TIMER_SETUP + struct ip_set *set; /* attached to this ip_set */ +#endif + struct net *net; /* namespace */ + struct list_head members; /* the set members */ +}; + +static int +list_set_ktest(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + struct ip_set_adt_opt *opt, const struct ip_set_ext *ext) +{ + struct list_set *map = set->data; + struct ip_set_ext *mext = &opt->ext; + struct set_elem *e; + u32 flags = opt->cmdflags; + int ret; + + /* Don't lookup sub-counters at all */ + opt->cmdflags &= ~IPSET_FLAG_MATCH_COUNTERS; + if (opt->cmdflags & IPSET_FLAG_SKIP_SUBCOUNTER_UPDATE) + opt->cmdflags &= ~IPSET_FLAG_SKIP_COUNTER_UPDATE; + list_for_each_entry_rcu(e, &map->members, list) { + ret = ip_set_test(e->id, skb, par, opt); + if (ret <= 0) + continue; + if (ip_set_match_extensions(set, ext, mext, flags, e)) + return 1; + } + return 0; +} + +static int +list_set_kadd(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + struct ip_set_adt_opt *opt, const struct ip_set_ext *ext) +{ + struct list_set *map = set->data; + struct set_elem *e; + int ret; + + list_for_each_entry(e, &map->members, list) { + if (SET_WITH_TIMEOUT(set) && + ip_set_timeout_expired(ext_timeout(e, set))) + continue; + ret = ip_set_add(e->id, skb, par, opt); + if (ret == 0) + return ret; + } + return 0; +} + +static int +list_set_kdel(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + struct ip_set_adt_opt *opt, const struct ip_set_ext *ext) +{ + struct list_set *map = set->data; + struct set_elem *e; + int ret; + + list_for_each_entry(e, &map->members, list) { + if (SET_WITH_TIMEOUT(set) && + ip_set_timeout_expired(ext_timeout(e, set))) + continue; + ret = ip_set_del(e->id, skb, par, opt); + if (ret == 0) + return ret; + } + return 0; +} + +static int +list_set_kadt(struct ip_set *set, const struct sk_buff *skb, + const struct xt_action_param *par, + enum ipset_adt adt, struct ip_set_adt_opt *opt) +{ + struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); + int ret = -EINVAL; + + rcu_read_lock(); + switch (adt) { + case IPSET_TEST: + ret = list_set_ktest(set, skb, par, opt, &ext); + break; + case IPSET_ADD: + ret = list_set_kadd(set, skb, par, opt, &ext); + break; + case IPSET_DEL: + ret = list_set_kdel(set, skb, par, opt, &ext); + break; + default: + break; + } + rcu_read_unlock(); + + return ret; +} + +/* Userspace interfaces: we are protected by the nfnl mutex */ + +static void +__list_set_del_rcu(struct rcu_head * rcu) +{ + struct set_elem *e = container_of(rcu, struct set_elem, rcu); + struct ip_set *set = e->set; + + ip_set_ext_destroy(set, e); + kfree(e); +} + +static inline void +list_set_del(struct ip_set *set, struct set_elem *e) +{ + struct list_set *map = set->data; + + set->elements--; + list_del_rcu(&e->list); + ip_set_put_byindex(map->net, e->id); + call_rcu(&e->rcu, __list_set_del_rcu); +} + +static inline void +list_set_replace(struct ip_set *set, struct set_elem *e, struct set_elem *old) +{ + struct list_set *map = set->data; + + list_replace_rcu(&old->list, &e->list); + ip_set_put_byindex(map->net, old->id); + call_rcu(&old->rcu, __list_set_del_rcu); +} + +static void +set_cleanup_entries(struct ip_set *set) +{ + struct list_set *map = set->data; + struct set_elem *e, *n; + + list_for_each_entry_safe(e, n, &map->members, list) + if (ip_set_timeout_expired(ext_timeout(e, set))) + list_set_del(set, e); +} + +static int +list_set_utest(struct ip_set *set, void *value, const struct ip_set_ext *ext, + struct ip_set_ext *mext, u32 flags) +{ + struct list_set *map = set->data; + struct set_adt_elem *d = value; + struct set_elem *e, *next, *prev = NULL; + int ret; + + list_for_each_entry(e, &map->members, list) { + if (SET_WITH_TIMEOUT(set) && + ip_set_timeout_expired(ext_timeout(e, set))) + continue; + else if (e->id != d->id) { + prev = e; + continue; + } + + if (d->before == 0) { + ret = 1; + } else if (d->before > 0) { + next = list_next_entry(e, list); + ret = !list_is_last(&e->list, &map->members) && + next->id == d->refid; + } else { + ret = prev && prev->id == d->refid; + } + return ret; + } + return 0; +} + +static void +list_set_init_extensions(struct ip_set *set, const struct ip_set_ext *ext, + struct set_elem *e) +{ + if (SET_WITH_COUNTER(set)) + ip_set_init_counter(ext_counter(e, set), ext); + if (SET_WITH_COMMENT(set)) + ip_set_init_comment(set, ext_comment(e, set), ext); + if (SET_WITH_SKBINFO(set)) + ip_set_init_skbinfo(ext_skbinfo(e, set), ext); + /* Update timeout last */ + if (SET_WITH_TIMEOUT(set)) + ip_set_timeout_set(ext_timeout(e, set), ext->timeout); +} + +static int +list_set_uadd(struct ip_set *set, void *value, const struct ip_set_ext *ext, + struct ip_set_ext *mext, u32 flags) +{ + struct list_set *map = set->data; + struct set_adt_elem *d = value; + struct set_elem *e, *n, *prev, *next; + bool flag_exist = flags & IPSET_FLAG_EXIST; + + /* Find where to add the new entry */ + n = prev = next = NULL; + list_for_each_entry(e, &map->members, list) { + if (SET_WITH_TIMEOUT(set) && + ip_set_timeout_expired(ext_timeout(e, set))) + continue; + else if (d->id == e->id) + n = e; + else if (d->before == 0 || e->id != d->refid) + continue; + else if (d->before > 0) + next = e; + else + prev = e; + } + + /* If before/after is used on an empty set */ + if ((d->before > 0 && !next) || + (d->before < 0 && !prev)) + return -IPSET_ERR_REF_EXIST; + + /* Re-add already existing element */ + if (n) { + if (!flag_exist) + return -IPSET_ERR_EXIST; + /* Update extensions */ + ip_set_ext_destroy(set, n); + list_set_init_extensions(set, ext, n); + + /* Set is already added to the list */ + ip_set_put_byindex(map->net, d->id); + return 0; + } + /* Add new entry */ + if (d->before == 0) { + /* Append */ + n = list_empty(&map->members) ? NULL : + list_last_entry(&map->members, struct set_elem, list); + } else if (d->before > 0) { + /* Insert after next element */ + if (!list_is_last(&next->list, &map->members)) + n = list_next_entry(next, list); + } else { + /* Insert before prev element */ + if (prev->list.prev != &map->members) + n = list_prev_entry(prev, list); + } + /* Can we replace a timed out entry? */ + if (n && + !(SET_WITH_TIMEOUT(set) && + ip_set_timeout_expired(ext_timeout(n, set)))) + n = NULL; + + e = kzalloc(set->dsize, GFP_ATOMIC); + if (!e) + return -ENOMEM; + e->id = d->id; + e->set = set; + INIT_LIST_HEAD(&e->list); + list_set_init_extensions(set, ext, e); + if (n) + list_set_replace(set, e, n); + else if (next) + list_add_tail_rcu(&e->list, &next->list); + else if (prev) + list_add_rcu(&e->list, &prev->list); + else + list_add_tail_rcu(&e->list, &map->members); + set->elements++; + + return 0; +} + +static int +list_set_udel(struct ip_set *set, void *value, const struct ip_set_ext *ext, + struct ip_set_ext *mext, u32 flags) +{ + struct list_set *map = set->data; + struct set_adt_elem *d = value; + struct set_elem *e, *next, *prev = NULL; + + list_for_each_entry(e, &map->members, list) { + if (SET_WITH_TIMEOUT(set) && + ip_set_timeout_expired(ext_timeout(e, set))) + continue; + else if (e->id != d->id) { + prev = e; + continue; + } + + if (d->before > 0) { + next = list_next_entry(e, list); + if (list_is_last(&e->list, &map->members) || + next->id != d->refid) + return -IPSET_ERR_REF_EXIST; + } else if (d->before < 0) { + if (!prev || prev->id != d->refid) + return -IPSET_ERR_REF_EXIST; + } + list_set_del(set, e); + return 0; + } + return d->before != 0 ? -IPSET_ERR_REF_EXIST : -IPSET_ERR_EXIST; +} + +static int +list_set_uadt(struct ip_set *set, struct nlattr *tb[], + enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) +{ + struct list_set *map = set->data; + ipset_adtfn adtfn = set->variant->adt[adt]; + struct set_adt_elem e = { .refid = IPSET_INVALID_ID }; + struct ip_set_ext ext = IP_SET_INIT_UEXT(set); + struct ip_set *s; + int ret = 0; + + if (tb[IPSET_ATTR_LINENO]) + *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]); + + if (unlikely(!tb[IPSET_ATTR_NAME] || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + + ret = ip_set_get_extensions(set, tb, &ext); + if (ret) + return ret; + e.id = ip_set_get_byname(map->net, nla_data(tb[IPSET_ATTR_NAME]), &s); + if (e.id == IPSET_INVALID_ID) + return -IPSET_ERR_NAME; + /* "Loop detection" */ + if (s->type->features & IPSET_TYPE_NAME) { + ret = -IPSET_ERR_LOOP; + goto finish; + } + + if (tb[IPSET_ATTR_CADT_FLAGS]) { + u32 f = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]); + + e.before = f & IPSET_FLAG_BEFORE; + } + + if (e.before && !tb[IPSET_ATTR_NAMEREF]) { + ret = -IPSET_ERR_BEFORE; + goto finish; + } + + if (tb[IPSET_ATTR_NAMEREF]) { + e.refid = ip_set_get_byname(map->net, + nla_data(tb[IPSET_ATTR_NAMEREF]), + &s); + if (e.refid == IPSET_INVALID_ID) { + ret = -IPSET_ERR_NAMEREF; + goto finish; + } + if (!e.before) + e.before = -1; + } + if (adt != IPSET_TEST && SET_WITH_TIMEOUT(set)) + set_cleanup_entries(set); + + ret = adtfn(set, &e, &ext, &ext, flags); + +finish: + if (e.refid != IPSET_INVALID_ID) + ip_set_put_byindex(map->net, e.refid); + if (adt != IPSET_ADD || ret) + ip_set_put_byindex(map->net, e.id); + + return ip_set_eexist(ret, flags) ? 0 : ret; +} + +static void +list_set_flush(struct ip_set *set) +{ + struct list_set *map = set->data; + struct set_elem *e, *n; + + list_for_each_entry_safe(e, n, &map->members, list) + list_set_del(set, e); + set->elements = 0; + set->ext_size = 0; +} + +static void +list_set_destroy(struct ip_set *set) +{ + struct list_set *map = set->data; + struct set_elem *e, *n; + + if (SET_WITH_TIMEOUT(set)) + del_timer_sync(&map->gc); + + list_for_each_entry_safe(e, n, &map->members, list) { + list_del(&e->list); + ip_set_put_byindex(map->net, e->id); + ip_set_ext_destroy(set, e); + kfree(e); + } + kfree(map); + + set->data = NULL; +} + +/* Calculate the actual memory size of the set data */ +static size_t +list_set_memsize(const struct list_set *map, size_t dsize) +{ + struct set_elem *e; + u32 n = 0; + + rcu_read_lock(); + list_for_each_entry_rcu(e, &map->members, list) + n++; + rcu_read_unlock(); + + return (sizeof(*map) + n * dsize); +} + +static int +list_set_head(struct ip_set *set, struct sk_buff *skb) +{ + const struct list_set *map = set->data; + struct nlattr *nested; + size_t memsize = list_set_memsize(map, set->dsize) + set->ext_size; + + nested = ipset_nest_start(skb, IPSET_ATTR_DATA); + if (!nested) + goto nla_put_failure; + if (nla_put_net32(skb, IPSET_ATTR_SIZE, htonl(map->size)) || + nla_put_net32(skb, IPSET_ATTR_REFERENCES, htonl(set->ref)) || + nla_put_net32(skb, IPSET_ATTR_MEMSIZE, htonl(memsize)) || + nla_put_net32(skb, IPSET_ATTR_ELEMENTS, htonl(set->elements))) + goto nla_put_failure; + if (unlikely(ip_set_put_flags(skb, set))) + goto nla_put_failure; + ipset_nest_end(skb, nested); + + return 0; +nla_put_failure: + return -EMSGSIZE; +} + +static int +list_set_list(const struct ip_set *set, + struct sk_buff *skb, struct netlink_callback *cb) +{ + const struct list_set *map = set->data; + struct nlattr *atd, *nested; + u32 i = 0, first = cb->args[IPSET_CB_ARG0]; + char name[IPSET_MAXNAMELEN]; + struct set_elem *e; + int ret = 0; + + atd = ipset_nest_start(skb, IPSET_ATTR_ADT); + if (!atd) + return -EMSGSIZE; + + rcu_read_lock(); + list_for_each_entry_rcu(e, &map->members, list) { + if (i < first || + (SET_WITH_TIMEOUT(set) && + ip_set_timeout_expired(ext_timeout(e, set)))) { + i++; + continue; + } + nested = ipset_nest_start(skb, IPSET_ATTR_DATA); + if (!nested) + goto nla_put_failure; + ip_set_name_byindex(map->net, e->id, name); + if (nla_put_string(skb, IPSET_ATTR_NAME, name)) + goto nla_put_failure; + if (ip_set_put_extensions(skb, set, e, true)) + goto nla_put_failure; + ipset_nest_end(skb, nested); + i++; + } + + ipset_nest_end(skb, atd); + /* Set listing finished */ + cb->args[IPSET_CB_ARG0] = 0; + goto out; + +nla_put_failure: + nla_nest_cancel(skb, nested); + if (unlikely(i == first)) { + nla_nest_cancel(skb, atd); + cb->args[IPSET_CB_ARG0] = 0; + ret = -EMSGSIZE; + } else { + cb->args[IPSET_CB_ARG0] = i; + ipset_nest_end(skb, atd); + } +out: + rcu_read_unlock(); + return ret; +} + +static bool +list_set_same_set(const struct ip_set *a, const struct ip_set *b) +{ + const struct list_set *x = a->data; + const struct list_set *y = b->data; + + return x->size == y->size && + a->timeout == b->timeout && + a->extensions == b->extensions; +} + +static const struct ip_set_type_variant set_variant = { + .kadt = list_set_kadt, + .uadt = list_set_uadt, + .adt = { + [IPSET_ADD] = list_set_uadd, + [IPSET_DEL] = list_set_udel, + [IPSET_TEST] = list_set_utest, + }, + .destroy = list_set_destroy, + .flush = list_set_flush, + .head = list_set_head, + .list = list_set_list, + .same_set = list_set_same_set, +}; + +static void +list_set_gc(GC_ARG) +{ + INIT_GC_VARS(list_set, map); + + spin_lock_bh(&set->lock); + set_cleanup_entries(set); + spin_unlock_bh(&set->lock); + + map->gc.expires = jiffies + IPSET_GC_PERIOD(set->timeout) * HZ; + add_timer(&map->gc); +} + +static void +list_set_gc_init(struct ip_set *set, void (*gc)(GC_ARG)) +{ + struct list_set *map = set->data; + + TIMER_SETUP(&map->gc, gc); + mod_timer(&map->gc, jiffies + IPSET_GC_PERIOD(set->timeout) * HZ); +} + +/* Create list:set type of sets */ + +static bool +init_list_set(struct net *net, struct ip_set *set, u32 size) +{ + struct list_set *map; + + map = kzalloc(sizeof(*map), GFP_KERNEL); + if (!map) + return false; + + map->size = size; + map->net = net; +#ifdef HAVE_TIMER_SETUP + map->set = set; +#endif + INIT_LIST_HEAD(&map->members); + set->data = map; + + return true; +} + +static int +list_set_create(struct net *net, struct ip_set *set, struct nlattr *tb[], + u32 flags) +{ + u32 size = IP_SET_LIST_DEFAULT_SIZE; + + if (unlikely(!ip_set_optattr_netorder(tb, IPSET_ATTR_SIZE) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_TIMEOUT) || + !ip_set_optattr_netorder(tb, IPSET_ATTR_CADT_FLAGS))) + return -IPSET_ERR_PROTOCOL; + + if (tb[IPSET_ATTR_SIZE]) + size = ip_set_get_h32(tb[IPSET_ATTR_SIZE]); + if (size < IP_SET_LIST_MIN_SIZE) + size = IP_SET_LIST_MIN_SIZE; + + set->variant = &set_variant; + set->dsize = ip_set_elem_len(set, tb, sizeof(struct set_elem), + __alignof__(struct set_elem)); + if (!init_list_set(net, set, size)) + return -ENOMEM; + if (tb[IPSET_ATTR_TIMEOUT]) { + set->timeout = ip_set_timeout_uget(tb[IPSET_ATTR_TIMEOUT]); + list_set_gc_init(set, list_set_gc); + } + return 0; +} + +static struct ip_set_type list_set_type __read_mostly = { + .name = "list:set", + .protocol = IPSET_PROTOCOL, + .features = IPSET_TYPE_NAME | IPSET_DUMP_LAST, + .dimension = IPSET_DIM_ONE, + .family = NFPROTO_UNSPEC, + .revision_min = IPSET_TYPE_REV_MIN, + .revision_max = IPSET_TYPE_REV_MAX, + .create = list_set_create, + .create_policy = { + [IPSET_ATTR_SIZE] = { .type = NLA_U32 }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + }, + .adt_policy = { + [IPSET_ATTR_NAME] = { .type = NLA_STRING, + .len = IPSET_MAXNAMELEN }, + [IPSET_ATTR_NAMEREF] = { .type = NLA_STRING, + .len = IPSET_MAXNAMELEN }, + [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, + [IPSET_ATTR_LINENO] = { .type = NLA_U32 }, + [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, + [IPSET_ATTR_BYTES] = { .type = NLA_U64 }, + [IPSET_ATTR_PACKETS] = { .type = NLA_U64 }, + [IPSET_ATTR_COMMENT] = { .type = NLA_NUL_STRING, + .len = IPSET_MAX_COMMENT_SIZE }, + [IPSET_ATTR_SKBMARK] = { .type = NLA_U64 }, + [IPSET_ATTR_SKBPRIO] = { .type = NLA_U32 }, + [IPSET_ATTR_SKBQUEUE] = { .type = NLA_U16 }, + }, + .me = THIS_MODULE, +}; + +static int __init +list_set_init(void) +{ + return ip_set_type_register(&list_set_type); +} + +static void __exit +list_set_fini(void) +{ + rcu_barrier(); + ip_set_type_unregister(&list_set_type); +} + +module_init(list_set_init); +module_exit(list_set_fini); diff --git a/kernel/net/netfilter/ipset/pfxlen.c b/kernel/net/netfilter/ipset/pfxlen.c new file mode 100644 index 0000000..59f6e72 --- /dev/null +++ b/kernel/net/netfilter/ipset/pfxlen.c @@ -0,0 +1,190 @@ +#include +#define IP_SET_COMPAT_HEADERS +#include +#include + +/* Prefixlen maps for fast conversions, by Jan Engelhardt. */ + +#ifdef E +#undef E +#endif + +#define PREFIXES_MAP \ + E(0x00000000, 0x00000000, 0x00000000, 0x00000000), \ + E(0x80000000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xC0000000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xE0000000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xF0000000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xF8000000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFC000000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFE000000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFF000000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFF800000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFC00000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFE00000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFF00000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFF80000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFC0000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFE0000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFF0000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFF8000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFFC000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFFE000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFFF000, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFFF800, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFFFC00, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFFFE00, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFFFF00, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFFFF80, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFFFFC0, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFFFFE0, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFFFFF0, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFFFFF8, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFC, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFE, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0x80000000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xC0000000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xE0000000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xF0000000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xF8000000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFC000000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFE000000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFF000000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFF800000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFC00000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFE00000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFF00000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFF80000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFC0000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFE0000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFF0000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFF8000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFC000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFE000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFF000, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFF800, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFC00, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFE00, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFF00, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFF80, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFC0, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFE0, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFF0, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFF8, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFC, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFE, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0x80000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xC0000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xE0000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xF0000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xF8000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFC000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFE000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFF800000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFC00000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFE00000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFF00000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFF80000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFC0000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFE0000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF8000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFC000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFF000, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFF800, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFC00, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFE00, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFF00, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFF80, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFC0, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFE0, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFF0, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFF8, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFC, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x80000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xC0000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xE0000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF0000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF8000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFC000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFE000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF800000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFC00000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFE00000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFF00000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFF80000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFC0000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFE0000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF8000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFC000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFF000), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFF800), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFC00), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFE00), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFF00), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFF80), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFC0), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFE0), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFF0), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFF8), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFC), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE), \ + E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF), + +#define E(a, b, c, d) \ + {.ip6 = { \ + htonl(a), htonl(b), \ + htonl(c), htonl(d), \ + } } + +/* This table works for both IPv4 and IPv6; + * just use prefixlen_netmask_map[prefixlength].ip. + */ +const union nf_inet_addr ip_set_netmask_map[] = { + PREFIXES_MAP +}; +EXPORT_SYMBOL_GPL(ip_set_netmask_map); + +#undef E +#define E(a, b, c, d) \ + {.ip6 = { (__force __be32)a, (__force __be32)b, \ + (__force __be32)c, (__force __be32)d, \ + } } + +/* This table works for both IPv4 and IPv6; + * just use prefixlen_hostmask_map[prefixlength].ip. + */ +const union nf_inet_addr ip_set_hostmask_map[] = { + PREFIXES_MAP +}; +EXPORT_SYMBOL_GPL(ip_set_hostmask_map); + +/* Find the largest network which matches the range from left, in host order. */ +u32 +ip_set_range_to_cidr(u32 from, u32 to, u8 *cidr) +{ + u32 last; + u8 i; + + for (i = 1; i < 32; i++) { + if ((from & ip_set_hostmask(i)) != from) + continue; + last = from | ~ip_set_hostmask(i); + if (!after(last, to)) { + *cidr = i; + return last; + } + } + *cidr = 32; + return from; +} +EXPORT_SYMBOL_GPL(ip_set_range_to_cidr); diff --git a/kernel/net/netfilter/xt_set.c b/kernel/net/netfilter/xt_set.c new file mode 100644 index 0000000..43e54ef --- /dev/null +++ b/kernel/net/netfilter/xt_set.c @@ -0,0 +1,755 @@ +/* Copyright (C) 2000-2002 Joakim Axelsson + * Patrick Schaaf + * Martin Josefsson + * Copyright (C) 2003-2013 Jozsef Kadlecsik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* Kernel module which implements the set match and SET target + * for netfilter/iptables. + */ + +#include +#include + +#include +#include +#include +#include + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Jozsef Kadlecsik "); +MODULE_DESCRIPTION("Xtables: IP set match and target module"); +MODULE_ALIAS("xt_SET"); +MODULE_ALIAS("ipt_set"); +MODULE_ALIAS("ip6t_set"); +MODULE_ALIAS("ipt_SET"); +MODULE_ALIAS("ip6t_SET"); + +#ifdef HAVE_CHECKENTRY_BOOL +#define CHECK_OK 1 +#define CHECK_FAIL(err) 0 +#define CONST const +#define FTYPE bool +#else /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35) */ +#define CHECK_OK 0 +#define CHECK_FAIL(err) (err) +#define CONST +#define FTYPE int +#endif +#ifdef HAVE_XT_MTCHK_PARAM_STRUCT_NET +#define XT_PAR_NET(par) ((par)->net) +#else +#define XT_PAR_NET(par) NULL +#endif + +static inline int +match_set(ip_set_id_t index, const struct sk_buff *skb, + const struct xt_action_param *par, + struct ip_set_adt_opt *opt, int inv) +{ + if (ip_set_test(index, skb, par, opt)) + inv = !inv; + return inv; +} + +#define ADT_OPT(n, f, d, fs, cfs, t, p, b, po, bo) \ +struct ip_set_adt_opt n = { \ + .family = f, \ + .dim = d, \ + .flags = fs, \ + .cmdflags = cfs, \ + .ext.timeout = t, \ + .ext.packets = p, \ + .ext.bytes = b, \ + .ext.packets_op = po, \ + .ext.bytes_op = bo, \ +} + +/* Revision 0 interface: backward compatible with netfilter/iptables */ + +static bool +set_match_v0(const struct sk_buff *skb, CONST struct xt_action_param *par) +{ + const struct xt_set_info_match_v0 *info = par->matchinfo; + + ADT_OPT(opt, XT_FAMILY(par), info->match_set.u.compat.dim, + info->match_set.u.compat.flags, 0, UINT_MAX, + 0, 0, 0, 0); + + return match_set(info->match_set.index, skb, par, &opt, + info->match_set.u.compat.flags & IPSET_INV_MATCH); +} + +static void +compat_flags(struct xt_set_info_v0 *info) +{ + u_int8_t i; + + /* Fill out compatibility data according to enum ip_set_kopt */ + info->u.compat.dim = IPSET_DIM_ZERO; + if (info->u.flags[0] & IPSET_MATCH_INV) + info->u.compat.flags |= IPSET_INV_MATCH; + for (i = 0; i < IPSET_DIM_MAX - 1 && info->u.flags[i]; i++) { + info->u.compat.dim++; + if (info->u.flags[i] & IPSET_SRC) + info->u.compat.flags |= (1 << info->u.compat.dim); + } +} + +static FTYPE +set_match_v0_checkentry(const struct xt_mtchk_param *par) +{ + struct xt_set_info_match_v0 *info = par->matchinfo; + ip_set_id_t index; + + index = ip_set_nfnl_get_byindex(XT_PAR_NET(par), info->match_set.index); + + if (index == IPSET_INVALID_ID) { + pr_warn("Cannot find set identified by id %u to match\n", + info->match_set.index); + return CHECK_FAIL(-ENOENT); + } + if (info->match_set.u.flags[IPSET_DIM_MAX - 1] != 0) { + pr_warn("Protocol error: set match dimension is over the limit!\n"); + ip_set_nfnl_put(XT_PAR_NET(par), info->match_set.index); + return CHECK_FAIL(-ERANGE); + } + + /* Fill out compatibility data */ + compat_flags(&info->match_set); + + return CHECK_OK; +} + +static void +set_match_v0_destroy(const struct xt_mtdtor_param *par) +{ + struct xt_set_info_match_v0 *info = par->matchinfo; + + ip_set_nfnl_put(XT_PAR_NET(par), info->match_set.index); +} + +/* Revision 1 */ + +static bool +set_match_v1(const struct sk_buff *skb, CONST struct xt_action_param *par) +{ + const struct xt_set_info_match_v1 *info = par->matchinfo; + + ADT_OPT(opt, XT_FAMILY(par), info->match_set.dim, + info->match_set.flags, 0, UINT_MAX, + 0, 0, 0, 0); + + if (opt.flags & IPSET_RETURN_NOMATCH) + opt.cmdflags |= IPSET_FLAG_RETURN_NOMATCH; + + return match_set(info->match_set.index, skb, par, &opt, + info->match_set.flags & IPSET_INV_MATCH); +} + +static FTYPE +set_match_v1_checkentry(const struct xt_mtchk_param *par) +{ + struct xt_set_info_match_v1 *info = par->matchinfo; + ip_set_id_t index; + + index = ip_set_nfnl_get_byindex(XT_PAR_NET(par), info->match_set.index); + + if (index == IPSET_INVALID_ID) { + pr_warn("Cannot find set identified by id %u to match\n", + info->match_set.index); + return CHECK_FAIL(-ENOENT); + } + if (info->match_set.dim > IPSET_DIM_MAX) { + pr_warn("Protocol error: set match dimension is over the limit!\n"); + ip_set_nfnl_put(XT_PAR_NET(par), info->match_set.index); + return CHECK_FAIL(-ERANGE); + } + + return CHECK_OK; +} + +static void +set_match_v1_destroy(const struct xt_mtdtor_param *par) +{ + struct xt_set_info_match_v1 *info = par->matchinfo; + + ip_set_nfnl_put(XT_PAR_NET(par), info->match_set.index); +} + +/* Revision 3 match */ + +static bool +set_match_v3(const struct sk_buff *skb, CONST struct xt_action_param *par) +{ + const struct xt_set_info_match_v3 *info = par->matchinfo; + + ADT_OPT(opt, XT_FAMILY(par), info->match_set.dim, + info->match_set.flags, info->flags, UINT_MAX, + info->packets.value, info->bytes.value, + info->packets.op, info->bytes.op); + + if (info->packets.op != IPSET_COUNTER_NONE || + info->bytes.op != IPSET_COUNTER_NONE) + opt.cmdflags |= IPSET_FLAG_MATCH_COUNTERS; + + return match_set(info->match_set.index, skb, par, &opt, + info->match_set.flags & IPSET_INV_MATCH); +} + +#define set_match_v3_checkentry set_match_v1_checkentry +#define set_match_v3_destroy set_match_v1_destroy + +/* Revision 4 match */ + +static bool +set_match_v4(const struct sk_buff *skb, CONST struct xt_action_param *par) +{ + const struct xt_set_info_match_v4 *info = par->matchinfo; + + ADT_OPT(opt, XT_FAMILY(par), info->match_set.dim, + info->match_set.flags, info->flags, UINT_MAX, + info->packets.value, info->bytes.value, + info->packets.op, info->bytes.op); + + if (info->packets.op != IPSET_COUNTER_NONE || + info->bytes.op != IPSET_COUNTER_NONE) + opt.cmdflags |= IPSET_FLAG_MATCH_COUNTERS; + + return match_set(info->match_set.index, skb, par, &opt, + info->match_set.flags & IPSET_INV_MATCH); +} + +#define set_match_v4_checkentry set_match_v1_checkentry +#define set_match_v4_destroy set_match_v1_destroy + +/* Revision 0 interface: backward compatible with netfilter/iptables */ + +#ifdef HAVE_XT_TARGET_PARAM +#undef xt_action_param +#define xt_action_param xt_target_param +#define CAST_TO_MATCH (const struct xt_match_param *) +#else +#define CAST_TO_MATCH +#endif + +static unsigned int +set_target_v0(struct sk_buff *skb, const struct xt_action_param *par) +{ + const struct xt_set_info_target_v0 *info = par->targinfo; + + ADT_OPT(add_opt, XT_FAMILY(par), info->add_set.u.compat.dim, + info->add_set.u.compat.flags, 0, UINT_MAX, + 0, 0, 0, 0); + ADT_OPT(del_opt, XT_FAMILY(par), info->del_set.u.compat.dim, + info->del_set.u.compat.flags, 0, UINT_MAX, + 0, 0, 0, 0); + + if (info->add_set.index != IPSET_INVALID_ID) + ip_set_add(info->add_set.index, skb, CAST_TO_MATCH par, + &add_opt); + if (info->del_set.index != IPSET_INVALID_ID) + ip_set_del(info->del_set.index, skb, CAST_TO_MATCH par, + &del_opt); + + return XT_CONTINUE; +} + +static FTYPE +set_target_v0_checkentry(const struct xt_tgchk_param *par) +{ + struct xt_set_info_target_v0 *info = par->targinfo; + ip_set_id_t index; + + if (info->add_set.index != IPSET_INVALID_ID) { + index = ip_set_nfnl_get_byindex(XT_PAR_NET(par), + info->add_set.index); + if (index == IPSET_INVALID_ID) { + pr_warn("Cannot find add_set index %u as target\n", + info->add_set.index); + return CHECK_FAIL(-ENOENT); + } + } + + if (info->del_set.index != IPSET_INVALID_ID) { + index = ip_set_nfnl_get_byindex(XT_PAR_NET(par), + info->del_set.index); + if (index == IPSET_INVALID_ID) { + pr_warn("Cannot find del_set index %u as target\n", + info->del_set.index); + if (info->add_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), + info->add_set.index); + return CHECK_FAIL(-ENOENT); + } + } + if (info->add_set.u.flags[IPSET_DIM_MAX - 1] != 0 || + info->del_set.u.flags[IPSET_DIM_MAX - 1] != 0) { + pr_warn("Protocol error: SET target dimension is over the limit!\n"); + if (info->add_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), info->add_set.index); + if (info->del_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), info->del_set.index); + return CHECK_FAIL(-ERANGE); + } + + /* Fill out compatibility data */ + compat_flags(&info->add_set); + compat_flags(&info->del_set); + + return CHECK_OK; +} + +static void +set_target_v0_destroy(const struct xt_tgdtor_param *par) +{ + const struct xt_set_info_target_v0 *info = par->targinfo; + + if (info->add_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), info->add_set.index); + if (info->del_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), info->del_set.index); +} + +/* Revision 1 target */ + +static unsigned int +set_target_v1(struct sk_buff *skb, const struct xt_action_param *par) +{ + const struct xt_set_info_target_v1 *info = par->targinfo; + + ADT_OPT(add_opt, XT_FAMILY(par), info->add_set.dim, + info->add_set.flags, 0, UINT_MAX, + 0, 0, 0, 0); + ADT_OPT(del_opt, XT_FAMILY(par), info->del_set.dim, + info->del_set.flags, 0, UINT_MAX, + 0, 0, 0, 0); + + if (info->add_set.index != IPSET_INVALID_ID) + ip_set_add(info->add_set.index, skb, CAST_TO_MATCH par, + &add_opt); + if (info->del_set.index != IPSET_INVALID_ID) + ip_set_del(info->del_set.index, skb, CAST_TO_MATCH par, + &del_opt); + + return XT_CONTINUE; +} + +static FTYPE +set_target_v1_checkentry(const struct xt_tgchk_param *par) +{ + const struct xt_set_info_target_v1 *info = par->targinfo; + ip_set_id_t index; + + if (info->add_set.index != IPSET_INVALID_ID) { + index = ip_set_nfnl_get_byindex(XT_PAR_NET(par), + info->add_set.index); + if (index == IPSET_INVALID_ID) { + pr_warn("Cannot find add_set index %u as target\n", + info->add_set.index); + return CHECK_FAIL(-ENOENT); + } + } + + if (info->del_set.index != IPSET_INVALID_ID) { + index = ip_set_nfnl_get_byindex(XT_PAR_NET(par), + info->del_set.index); + if (index == IPSET_INVALID_ID) { + pr_warn("Cannot find del_set index %u as target\n", + info->del_set.index); + if (info->add_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), + info->add_set.index); + return CHECK_FAIL(-ENOENT); + } + } + if (info->add_set.dim > IPSET_DIM_MAX || + info->del_set.dim > IPSET_DIM_MAX) { + pr_warn("Protocol error: SET target dimension is over the limit!\n"); + if (info->add_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), info->add_set.index); + if (info->del_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), info->del_set.index); + return CHECK_FAIL(-ERANGE); + } + + return CHECK_OK; +} + +static void +set_target_v1_destroy(const struct xt_tgdtor_param *par) +{ + const struct xt_set_info_target_v1 *info = par->targinfo; + + if (info->add_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), info->add_set.index); + if (info->del_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), info->del_set.index); +} + +/* Revision 2 target */ + +static unsigned int +set_target_v2(struct sk_buff *skb, const struct xt_action_param *par) +{ + const struct xt_set_info_target_v2 *info = par->targinfo; + + ADT_OPT(add_opt, XT_FAMILY(par), info->add_set.dim, + info->add_set.flags, info->flags, info->timeout, + 0, 0, 0, 0); + ADT_OPT(del_opt, XT_FAMILY(par), info->del_set.dim, + info->del_set.flags, 0, UINT_MAX, + 0, 0, 0, 0); + + /* Normalize to fit into jiffies */ + if (add_opt.ext.timeout != IPSET_NO_TIMEOUT && + add_opt.ext.timeout > IPSET_MAX_TIMEOUT) + add_opt.ext.timeout = IPSET_MAX_TIMEOUT; + if (info->add_set.index != IPSET_INVALID_ID) + ip_set_add(info->add_set.index, skb, CAST_TO_MATCH par, + &add_opt); + if (info->del_set.index != IPSET_INVALID_ID) + ip_set_del(info->del_set.index, skb, CAST_TO_MATCH par, + &del_opt); + + return XT_CONTINUE; +} + +#define set_target_v2_checkentry set_target_v1_checkentry +#define set_target_v2_destroy set_target_v1_destroy + +/* Revision 3 target */ + +#define MOPT(opt, member) ((opt).ext.skbinfo.member) + +static unsigned int +set_target_v3(struct sk_buff *skb, const struct xt_action_param *par) +{ + const struct xt_set_info_target_v3 *info = par->targinfo; + int ret; + + ADT_OPT(add_opt, XT_FAMILY(par), info->add_set.dim, + info->add_set.flags, info->flags, info->timeout, + 0, 0, 0, 0); + ADT_OPT(del_opt, XT_FAMILY(par), info->del_set.dim, + info->del_set.flags, 0, UINT_MAX, + 0, 0, 0, 0); + ADT_OPT(map_opt, XT_FAMILY(par), info->map_set.dim, + info->map_set.flags, 0, UINT_MAX, + 0, 0, 0, 0); + + /* Normalize to fit into jiffies */ + if (add_opt.ext.timeout != IPSET_NO_TIMEOUT && + add_opt.ext.timeout > IPSET_MAX_TIMEOUT) + add_opt.ext.timeout = IPSET_MAX_TIMEOUT; + if (info->add_set.index != IPSET_INVALID_ID) + ip_set_add(info->add_set.index, skb, CAST_TO_MATCH par, + &add_opt); + if (info->del_set.index != IPSET_INVALID_ID) + ip_set_del(info->del_set.index, skb, CAST_TO_MATCH par, + &del_opt); + if (info->map_set.index != IPSET_INVALID_ID) { + map_opt.cmdflags |= info->flags & (IPSET_FLAG_MAP_SKBMARK | + IPSET_FLAG_MAP_SKBPRIO | + IPSET_FLAG_MAP_SKBQUEUE); + ret = match_set(info->map_set.index, skb, CAST_TO_MATCH par, + &map_opt, + info->map_set.flags & IPSET_INV_MATCH); + if (!ret) + return XT_CONTINUE; + if (map_opt.cmdflags & IPSET_FLAG_MAP_SKBMARK) + skb->mark = (skb->mark & ~MOPT(map_opt,skbmarkmask)) + ^ MOPT(map_opt, skbmark); + if (map_opt.cmdflags & IPSET_FLAG_MAP_SKBPRIO) + skb->priority = MOPT(map_opt, skbprio); + if ((map_opt.cmdflags & IPSET_FLAG_MAP_SKBQUEUE) && + skb->dev && + skb->dev->real_num_tx_queues > MOPT(map_opt, skbqueue)) + skb_set_queue_mapping(skb, MOPT(map_opt, skbqueue)); + } + return XT_CONTINUE; +} + +static FTYPE +set_target_v3_checkentry(const struct xt_tgchk_param *par) +{ + const struct xt_set_info_target_v3 *info = par->targinfo; + ip_set_id_t index; + + if (info->add_set.index != IPSET_INVALID_ID) { + index = ip_set_nfnl_get_byindex(XT_PAR_NET(par), + info->add_set.index); + if (index == IPSET_INVALID_ID) { + pr_warn("Cannot find add_set index %u as target\n", + info->add_set.index); + return CHECK_FAIL(-ENOENT); + } + } + + if (info->del_set.index != IPSET_INVALID_ID) { + index = ip_set_nfnl_get_byindex(XT_PAR_NET(par), + info->del_set.index); + if (index == IPSET_INVALID_ID) { + pr_warn("Cannot find del_set index %u as target\n", + info->del_set.index); + if (info->add_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), + info->add_set.index); + return CHECK_FAIL(-ENOENT); + } + } + + if (info->map_set.index != IPSET_INVALID_ID) { + if (strncmp(par->table, "mangle", 7)) { + pr_warn("--map-set only usable from mangle table\n"); + return CHECK_FAIL(-EINVAL); + } + if (((info->flags & IPSET_FLAG_MAP_SKBPRIO) | + (info->flags & IPSET_FLAG_MAP_SKBQUEUE)) && + (par->hook_mask & ~(1 << NF_INET_FORWARD | + 1 << NF_INET_LOCAL_OUT | + 1 << NF_INET_POST_ROUTING))) { + pr_warn("mapping of prio or/and queue is allowed only from OUTPUT/FORWARD/POSTROUTING chains\n"); + return CHECK_FAIL(-EINVAL); + } + index = ip_set_nfnl_get_byindex(XT_PAR_NET(par), + info->map_set.index); + if (index == IPSET_INVALID_ID) { + pr_warn("Cannot find map_set index %u as target\n", + info->map_set.index); + if (info->add_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), + info->add_set.index); + if (info->del_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), + info->del_set.index); + return CHECK_FAIL(-ENOENT); + } + } + + if (info->add_set.dim > IPSET_DIM_MAX || + info->del_set.dim > IPSET_DIM_MAX || + info->map_set.dim > IPSET_DIM_MAX) { + pr_warn("Protocol error: SET target dimension is over the limit!\n"); + if (info->add_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), info->add_set.index); + if (info->del_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), info->del_set.index); + if (info->map_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), info->map_set.index); + return CHECK_FAIL(-ERANGE); + } + + return CHECK_OK; +} + +static void +set_target_v3_destroy(const struct xt_tgdtor_param *par) +{ + const struct xt_set_info_target_v3 *info = par->targinfo; + + if (info->add_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), info->add_set.index); + if (info->del_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), info->del_set.index); + if (info->map_set.index != IPSET_INVALID_ID) + ip_set_nfnl_put(XT_PAR_NET(par), info->map_set.index); +} + +static struct xt_match set_matches[] __read_mostly = { + { + .name = "set", + .family = NFPROTO_IPV4, + .revision = 0, + .match = set_match_v0, + .matchsize = sizeof(struct xt_set_info_match_v0), + .checkentry = set_match_v0_checkentry, + .destroy = set_match_v0_destroy, + .me = THIS_MODULE + }, + { + .name = "set", + .family = NFPROTO_IPV4, + .revision = 1, + .match = set_match_v1, + .matchsize = sizeof(struct xt_set_info_match_v1), + .checkentry = set_match_v1_checkentry, + .destroy = set_match_v1_destroy, + .me = THIS_MODULE + }, + { + .name = "set", + .family = NFPROTO_IPV6, + .revision = 1, + .match = set_match_v1, + .matchsize = sizeof(struct xt_set_info_match_v1), + .checkentry = set_match_v1_checkentry, + .destroy = set_match_v1_destroy, + .me = THIS_MODULE + }, + /* --return-nomatch flag support */ + { + .name = "set", + .family = NFPROTO_IPV4, + .revision = 2, + .match = set_match_v1, + .matchsize = sizeof(struct xt_set_info_match_v1), + .checkentry = set_match_v1_checkentry, + .destroy = set_match_v1_destroy, + .me = THIS_MODULE + }, + { + .name = "set", + .family = NFPROTO_IPV6, + .revision = 2, + .match = set_match_v1, + .matchsize = sizeof(struct xt_set_info_match_v1), + .checkentry = set_match_v1_checkentry, + .destroy = set_match_v1_destroy, + .me = THIS_MODULE + }, + /* counters support: update, match */ + { + .name = "set", + .family = NFPROTO_IPV4, + .revision = 3, + .match = set_match_v3, + .matchsize = sizeof(struct xt_set_info_match_v3), + .checkentry = set_match_v3_checkentry, + .destroy = set_match_v3_destroy, + .me = THIS_MODULE + }, + { + .name = "set", + .family = NFPROTO_IPV6, + .revision = 3, + .match = set_match_v3, + .matchsize = sizeof(struct xt_set_info_match_v3), + .checkentry = set_match_v3_checkentry, + .destroy = set_match_v3_destroy, + .me = THIS_MODULE + }, + /* new revision for counters support: update, match */ + { + .name = "set", + .family = NFPROTO_IPV4, + .revision = 4, + .match = set_match_v4, + .matchsize = sizeof(struct xt_set_info_match_v4), + .checkentry = set_match_v4_checkentry, + .destroy = set_match_v4_destroy, + .me = THIS_MODULE + }, + { + .name = "set", + .family = NFPROTO_IPV6, + .revision = 4, + .match = set_match_v4, + .matchsize = sizeof(struct xt_set_info_match_v4), + .checkentry = set_match_v4_checkentry, + .destroy = set_match_v4_destroy, + .me = THIS_MODULE + }, +}; + +static struct xt_target set_targets[] __read_mostly = { + { + .name = "SET", + .revision = 0, + .family = NFPROTO_IPV4, + .target = set_target_v0, + .targetsize = sizeof(struct xt_set_info_target_v0), + .checkentry = set_target_v0_checkentry, + .destroy = set_target_v0_destroy, + .me = THIS_MODULE + }, + { + .name = "SET", + .revision = 1, + .family = NFPROTO_IPV4, + .target = set_target_v1, + .targetsize = sizeof(struct xt_set_info_target_v1), + .checkentry = set_target_v1_checkentry, + .destroy = set_target_v1_destroy, + .me = THIS_MODULE + }, + { + .name = "SET", + .revision = 1, + .family = NFPROTO_IPV6, + .target = set_target_v1, + .targetsize = sizeof(struct xt_set_info_target_v1), + .checkentry = set_target_v1_checkentry, + .destroy = set_target_v1_destroy, + .me = THIS_MODULE + }, + /* --timeout and --exist flags support */ + { + .name = "SET", + .revision = 2, + .family = NFPROTO_IPV4, + .target = set_target_v2, + .targetsize = sizeof(struct xt_set_info_target_v2), + .checkentry = set_target_v2_checkentry, + .destroy = set_target_v2_destroy, + .me = THIS_MODULE + }, + { + .name = "SET", + .revision = 2, + .family = NFPROTO_IPV6, + .target = set_target_v2, + .targetsize = sizeof(struct xt_set_info_target_v2), + .checkentry = set_target_v2_checkentry, + .destroy = set_target_v2_destroy, + .me = THIS_MODULE + }, + /* --map-set support */ + { + .name = "SET", + .revision = 3, + .family = NFPROTO_IPV4, + .target = set_target_v3, + .targetsize = sizeof(struct xt_set_info_target_v3), + .checkentry = set_target_v3_checkentry, + .destroy = set_target_v3_destroy, + .me = THIS_MODULE + }, + { + .name = "SET", + .revision = 3, + .family = NFPROTO_IPV6, + .target = set_target_v3, + .targetsize = sizeof(struct xt_set_info_target_v3), + .checkentry = set_target_v3_checkentry, + .destroy = set_target_v3_destroy, + .me = THIS_MODULE + }, +}; + +static int __init xt_set_init(void) +{ + int ret = xt_register_matches(set_matches, ARRAY_SIZE(set_matches)); + + if (!ret) { + ret = xt_register_targets(set_targets, + ARRAY_SIZE(set_targets)); + if (ret) + xt_unregister_matches(set_matches, + ARRAY_SIZE(set_matches)); + } + return ret; +} + +static void __exit xt_set_fini(void) +{ + xt_unregister_matches(set_matches, ARRAY_SIZE(set_matches)); + xt_unregister_targets(set_targets, ARRAY_SIZE(set_targets)); +} + +module_init(xt_set_init); +module_exit(xt_set_fini); diff --git a/kernel/net/sched/Kbuild b/kernel/net/sched/Kbuild new file mode 100644 index 0000000..6d8e8d6 --- /dev/null +++ b/kernel/net/sched/Kbuild @@ -0,0 +1,4 @@ +NOSTDINC_FLAGS += -I$(KDIR)/include +EXTRA_CFLAGS := -DCONFIG_IP_SET_MAX=$(IP_SET_MAX) + +obj-$(CONFIG_NET_EMATCH_IPSET) += em_ipset.o diff --git a/kernel/net/sched/em_ipset.c b/kernel/net/sched/em_ipset.c new file mode 100644 index 0000000..bd9566f --- /dev/null +++ b/kernel/net/sched/em_ipset.c @@ -0,0 +1,182 @@ +/* + * net/sched/em_ipset.c ipset ematch + * + * Copyright (c) 2012 Florian Westphal + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET +static int em_ipset_change(struct net *net, void *data, int data_len, + struct tcf_ematch *em) +#else +static int em_ipset_change(struct tcf_proto *tp, void *data, int data_len, + struct tcf_ematch *em) +#endif +{ + struct xt_set_info *set = data; + ip_set_id_t index; +#ifndef HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET + struct net *net = dev_net(qdisc_dev(tp->q)); +#endif + + if (data_len != sizeof(*set)) + return -EINVAL; + + index = ip_set_nfnl_get_byindex(net, set->index); + if (index == IPSET_INVALID_ID) + return -ENOENT; + + em->datalen = sizeof(*set); + em->data = (unsigned long)kmemdup(data, em->datalen, GFP_KERNEL); + if (em->data) + return 0; + + ip_set_nfnl_put(net, index); + return -ENOMEM; +} + +#ifdef HAVE_TCF_EMATCH_STRUCT_NET +static void em_ipset_destroy(struct tcf_ematch *em) +#else +static void em_ipset_destroy(struct tcf_proto *p, struct tcf_ematch *em) +#endif +{ + const struct xt_set_info *set = (const void *) em->data; + + if (set) { +#ifdef HAVE_TCF_EMATCH_STRUCT_NET + ip_set_nfnl_put(em->net, set->index); +#else + ip_set_nfnl_put(dev_net(qdisc_dev(p->q)), set->index); +#endif + kfree((void *) em->data); + } +} + +static int em_ipset_match(struct sk_buff *skb, struct tcf_ematch *em, + struct tcf_pkt_info *info) +{ + struct ip_set_adt_opt opt; + struct xt_action_param acpar; + const struct xt_set_info *set = (const void *) em->data; + struct net_device *dev, *indev = NULL; +#ifdef HAVE_STATE_IN_XT_ACTION_PARAM + struct nf_hook_state state = { + .net = em->net, + }; +#endif + int ret, network_offset; + +#ifdef HAVE_STATE_IN_XT_ACTION_PARAM +#define ACPAR_FAMILY(f) state.pf = f +#else +#define ACPAR_FAMILY(f) acpar.family = f +#endif + switch (tc_skb_protocol(skb)) { + case htons(ETH_P_IP): + ACPAR_FAMILY(NFPROTO_IPV4); + if (!pskb_network_may_pull(skb, sizeof(struct iphdr))) + return 0; + acpar.thoff = ip_hdrlen(skb); + break; + case htons(ETH_P_IPV6): + ACPAR_FAMILY(NFPROTO_IPV6); + if (!pskb_network_may_pull(skb, sizeof(struct ipv6hdr))) + return 0; + /* doesn't call ipv6_find_hdr() because ipset doesn't use + * thoff, yet + */ + acpar.thoff = sizeof(struct ipv6hdr); + break; + default: + return 0; + } + +#ifdef HAVE_STATE_IN_XT_ACTION_PARAM + opt.family = state.pf; +#else + acpar.hooknum = 0; + + opt.family = acpar.family; +#endif + opt.dim = set->dim; + opt.flags = set->flags; + opt.cmdflags = 0; + opt.ext.timeout = ~0u; + + network_offset = skb_network_offset(skb); + skb_pull(skb, network_offset); + + dev = skb->dev; + + rcu_read_lock(); + + if (skb->skb_iif) +#ifdef HAVE_TCF_EMATCH_STRUCT_NET + indev = dev_get_by_index_rcu(em->net, skb->skb_iif); +#else + indev = dev_get_by_index_rcu(dev_net(dev), skb->skb_iif); +#endif + +#ifdef HAVE_STATE_IN_XT_ACTION_PARAM + state.in = indev ? indev : dev; + state.out = dev; + acpar.state = &state; +#else +#ifdef HAVE_NET_IN_XT_ACTION_PARAM + acpar.net = em->net; +#endif + acpar.in = indev ? indev : dev; + acpar.out = dev; +#endif /* HAVE_STATE_IN_XT_ACTION_PARAM */ + + ret = ip_set_test(set->index, skb, &acpar, &opt); + + rcu_read_unlock(); + + skb_push(skb, network_offset); + return ret; +} + +static struct tcf_ematch_ops em_ipset_ops = { + .kind = TCF_EM_IPSET, + .change = em_ipset_change, + .destroy = em_ipset_destroy, + .match = em_ipset_match, + .owner = THIS_MODULE, + .link = LIST_HEAD_INIT(em_ipset_ops.link) +}; + +static int __init init_em_ipset(void) +{ + return tcf_em_register(&em_ipset_ops); +} + +static void __exit exit_em_ipset(void) +{ + tcf_em_unregister(&em_ipset_ops); +} + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Florian Westphal "); +MODULE_DESCRIPTION("TC extended match for IP sets"); + +module_init(init_em_ipset); +module_exit(exit_em_ipset); + +MODULE_ALIAS_TCF_EMATCH(TCF_EM_IPSET); diff --git a/lib/.gitignore b/lib/.gitignore new file mode 100644 index 0000000..ae3539d --- /dev/null +++ b/lib/.gitignore @@ -0,0 +1,2 @@ +/ipset_settype_check +/types_init.c diff --git a/lib/Make_extra.am b/lib/Make_extra.am new file mode 100644 index 0000000..cd0eb99 --- /dev/null +++ b/lib/Make_extra.am @@ -0,0 +1,101 @@ +IPSET_MODSDIR=${libdir}/ipset + +if ENABLE_SETTYPE_MODULES +AM_CFLAGS += -DENABLE_SETTYPE_MODULES \ + -DIPSET_MODSDIR="\"$(IPSET_MODSDIR)\"" +IPSET_SETTYPE_MODULES = yes +IPSET_SETTYPE_DYN = $(if $(findstring all,$(SETTYPE_MODLIST)), \ + $(IPSET_SETTYPE_LIST), $(SETTYPE_MODLIST)) +else +IPSET_SETTYPE_DYN = +endif + +IPSET_SETTYPE_STATIC = $(filter-out $(IPSET_SETTYPE_DYN), \ + $(IPSET_SETTYPE_LIST)) +IPSET_SETTYPE_DYNAMIC = $(filter $(IPSET_SETTYPE_LIST), \ + $(IPSET_SETTYPE_DYN)) +IPSET_SETTYPE_STATIC_OBJECTS = $(patsubst %.c, %.lo, $(IPSET_SETTYPE_STATIC)) + +IPSET_SETTYPE_DYNAMIC_OBJECTS = $(patsubst %.c, %.lo, $(IPSET_SETTYPE_DYNAMIC)) +IPSET_SETTYPE_DYNAMIC_MODULES = $(patsubst %.c, %.la, $(IPSET_SETTYPE_DYNAMIC)) +IPSET_SETTYPE_DYNAMIC_LTFLAGS = -shared -module -avoid-version +IPSET_SETTYPE_ALL_MODULES = $(patsubst %.c, %.la, $(IPSET_SETTYPE_STATIC)) \ + $(IPSET_SETTYPE_DYNAMIC_MODULES) + +BUILT_SOURCES = ipset_settype_check types_init.c ipset_settype_modules +CLEANFILES = ipset_settype_check types_init.c $(IPSET_SETTYPE_ALL_MODULES) + +ipset_%.lo: ipset_%.c +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`; \ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -D_INIT=ipset_$*_init \ + $(if $(findstring ipset_$*.c,$(IPSET_SETTYPE_STATIC)), -DTYPE_INCLUSIVE,)\ + -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< && \ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -D_INIT=ipset_$*_init \ + $(if $(findstring ipset_$*.c,$(IPSET_SETTYPE_STATIC)), -DTYPE_INCLUSIVE,)\ + -c -o $@ $< + +ipset_%.la: $(lib_LTLIBRARIES) ipset_%.lo + $(AM_V_CCLD)lobj="$(patsubst %.la, %.lo, $@)"; \ + $(LIBTOOL) --silent --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(CFLAGS) $(IPSET_SETTYPE_DYNAMIC_LTFLAGS) $(LDFLAGS) -o $@ \ + -rpath $(IPSET_MODSDIR) $$lobj $(LIBS) $(top_builddir)/lib/libipset.la + +types_init.c: $(IPSET_SETTYPE_STATIC_OBJECTS) + $(AM_V_GEN)static_list=`echo $(patsubst %.c,%,$(IPSET_SETTYPE_STATIC))`; \ + echo -n "" > $@; \ + for i in $$static_list; do \ + echo "extern void $${i}_init(void);" >> $@; \ + done; \ + echo "void ipset_types_init(void);" >> $@; \ + echo "void ipset_types_init(void)" >> $@; \ + echo "{" >> $@; \ + for i in $$static_list; do \ + echo " ""$${i}_init();" >> $@; \ + done; \ + echo "}" >> $@; + +ipset_settype_check: + @list="$(IPSET_SETTYPE_MODULES) $(IPSET_SETTYPE_STATIC_OBJECTS)"; \ + test -f $@ || echo "$$list" > $@; \ + if test "$$list" != "`cat $@`"; then \ + $(MAKE) clean; \ + echo "$$list" > $@; \ + fi + +ipset_settype_modules: $(lib_LTLIBRARIES) $(IPSET_SETTYPE_DYNAMIC_OBJECTS) \ + $(IPSET_SETTYPE_DYNAMIC_MODULES) + +install-data-local: install-settype-modules +uninstall-local: uninstall-settype-modules + +install-settype-modules: ipset_settype_modules + @$(NORMAL_INSTALL) + @list='$(IPSET_SETTYPE_DYNAMIC_MODULES)'; \ + test -n "$(IPSET_MODSDIR)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(IPSET_MODSDIR)'"; \ + $(MKDIR_P) "$(DESTDIR)$(IPSET_MODSDIR)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(IPSET_MODSDIR)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(IPSET_MODSDIR)"; \ + } + +uninstall-settype-modules: + @$(NORMAL_UNINSTALL) + @list='$(IPSET_SETTYPE_DYNAMIC_MODULES)'; \ + test -n "$(IPSET_MODSDIR)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(IPSET_MODSDIR)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(IPSET_MODSDIR)/$$f"; \ + done + +.PHONY: ipset_settype_check ipset_settype_modules ipset_settype_modules-stamp \ + install-settype-modules uninstall-settype-modules diff --git a/lib/Makefile.am b/lib/Makefile.am new file mode 100644 index 0000000..3a82417 --- /dev/null +++ b/lib/Makefile.am @@ -0,0 +1,58 @@ +include $(top_srcdir)/Make_global.am + +IPSET_SETTYPE_LIST = \ + ipset_bitmap_ip.c \ + ipset_bitmap_ipmac.c \ + ipset_bitmap_port.c \ + ipset_hash_ip.c \ + ipset_hash_ipport.c \ + ipset_hash_ipmark.c \ + ipset_hash_ipportip.c \ + ipset_hash_ipportnet.c \ + ipset_hash_net.c \ + ipset_hash_netnet.c \ + ipset_hash_netportnet.c \ + ipset_hash_netport.c \ + ipset_hash_netiface.c \ + ipset_hash_ipmac.c \ + ipset_hash_mac.c \ + ipset_list_set.c + +AM_CFLAGS += ${libmnl_CFLAGS} + +lib_LTLIBRARIES = libipset.la + +include $(top_srcdir)/lib/Make_extra.am + +libipset_la_LDFLAGS = -Wl,--version-script=$(top_srcdir)/lib/libipset.map -version-info $(LIBVERSION) +libipset_la_LIBADD = ${libmnl_LIBS} $(IPSET_SETTYPE_STATIC_OBJECTS) $(LIBADD_DLOPEN) +libipset_la_SOURCES = \ + args.c \ + data.c \ + errcode.c \ + icmp.c \ + icmpv6.c \ + list_sort.c \ + mnl.c \ + parse.c \ + print.c \ + session.c \ + types.c \ + ipset.c \ + types_init.c + +EXTRA_libipset_la_SOURCES = \ + debug.c + +EXTRA_DIST = $(IPSET_SETTYPE_LIST) libipset.map + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libipset.pc + +dist_man_MANS = libipset.3 + +sparse-check: $(libipset_la_SOURCES:.c=.d) + +%.d: %.c + $(IPSET_AM_V_CHECK)\ + $(SPARSE) $(SPARSE_FLAGS) $(AM_CFLAGS) $(AM_CPPFLAGS) $< || : diff --git a/lib/Makefile.in b/lib/Makefile.in new file mode 100644 index 0000000..663e211 --- /dev/null +++ b/lib/Makefile.in @@ -0,0 +1,1047 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 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@ + +# This is _NOT_ the library release version, it's an API version. +# Please read Chapter 6 "Library interface versions" of the libtool +# documentation before making any modification +# +# http://sources.redhat.com/autobook/autobook/autobook_91.html +# +# The version scheme used by Libtool tracks interfaces, where an interface +# is the set of exported entry points into the library. All Libtool libraries +# start with `-version-info' set to `0:0:0' -- this will be the default +# version number if you don't explicitly set it on the Libtool link command +# line. The meaning of these numbers (from left to right) is as follows: +# +# current +# The number of the current interface exported by the library. A current +# value of `0', means that you are calling the interface exported by this +# library interface 0. +# +# revision +# The implementation number of the most recent interface exported by this +# library. In this case, a revision value of `0' means that this is the +# first implementation of the interface. +# +# If the next release of this library exports the same interface, but has +# a different implementation (perhaps some bugs have been fixed), the +# revision number will be higher, but current number will be the same. +# In that case, when given a choice, the library with the highest revision +# will always be used by the runtime loader. +# +# age +# The number of previous additional interfaces supported by this library. +# If age were `2', then this library can be linked into executables which +# were built with a release of this library that exported the current +# interface number, current, or any of the previous two interfaces. +# +# By definition age must be less than or equal to current. At the outset, +# only the first ever interface is implemented, so age can only be `0'. +# +# 1. If you have changed any of the sources for this library, the revision +# number must be incremented. +# This is a new revision of the current interface. +# +# 2. If the interface has changed, then current must be incremented, and +# revision reset to `0'. +# This is the first revision of a new interface. +# +# 3. If the new interface is a superset of the previous interface (that is, +# if the previous interface has not been broken by the changes in this +# new release), then age must be incremented. +# This release is backwards compatible with the previous release. +# +# 4. If the new interface has removed elements with respect to the previous +# interface, then you have broken backward compatibility and age must be +# reset to `0'. +# This release has a new, but backwards incompatible interface. +# +# For example, if the next release of the library included some new commands +# for an existing socket protocol, you would use -version-info 1:0:1. +# This is the first revision of a new interface. This release is backwards +# compatible with the previous release. +# +# Later, you implement a faster way of handling part of the algorithm at the +# core of the library, and release it with -version-info 1:1:1. This is a new +# revision of the current interface. +# +# Unfortunately the speed of your new implementation can only be fully +# exploited by changing the API to access the structures at a lower level, +# which breaks compatibility with the previous interface, so you release it +# as -version-info 2:0:0. This release has a new, but backwards incompatible +# interface. + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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@ +@ENABLE_DEBUG_TRUE@am__append_1 = -g -g3 -ggdb -gdwarf-2 -DIPSET_DEBUG -Wall -Werror +@ENABLE_DEBUG_FALSE@am__append_2 = -O2 -DNDEBUG +@ENABLE_SETTYPE_MODULES_TRUE@am__append_3 = -DENABLE_SETTYPE_MODULES \ +@ENABLE_SETTYPE_MODULES_TRUE@ -DIPSET_MODSDIR="\"$(IPSET_MODSDIR)\"" + +subdir = lib +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltargz.m4 \ + $(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = libipset.pc +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__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man3dir)" \ + "$(DESTDIR)$(pkgconfigdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +libipset_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(IPSET_SETTYPE_STATIC_OBJECTS) $(am__DEPENDENCIES_1) +am_libipset_la_OBJECTS = args.lo data.lo errcode.lo icmp.lo icmpv6.lo \ + list_sort.lo mnl.lo parse.lo print.lo session.lo types.lo \ + ipset.lo types_init.lo +libipset_la_OBJECTS = $(am_libipset_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libipset_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libipset_la_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libipset_la_SOURCES) $(EXTRA_libipset_la_SOURCES) +DIST_SOURCES = $(libipset_la_SOURCES) $(EXTRA_libipset_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +man3dir = $(mandir)/man3 +NROFF = nroff +MANS = $(dist_man_MANS) +DATA = $(pkgconfig_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \ + $(srcdir)/libipset.pc.in $(top_srcdir)/Make_global.am \ + $(top_srcdir)/build-aux/depcomp \ + $(top_srcdir)/lib/Make_extra.am +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +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@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +HAVE_CHECKENTRY_BOOL = @HAVE_CHECKENTRY_BOOL@ +HAVE_ETHER_ADDR_COPY = @HAVE_ETHER_ADDR_COPY@ +HAVE_ETHER_ADDR_EQUAL = @HAVE_ETHER_ADDR_EQUAL@ +HAVE_EXPORT_H = @HAVE_EXPORT_H@ +HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H = @HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H@ +HAVE_IPV6_SKIP_EXTHDR_ARGS = @HAVE_IPV6_SKIP_EXTHDR_ARGS@ +HAVE_IS_ZERO_ETHER_ADDR = @HAVE_IS_ZERO_ETHER_ADDR@ +HAVE_KVCALLOC = @HAVE_KVCALLOC@ +HAVE_KVFREE = @HAVE_KVFREE@ +HAVE_LIST_LAST_ENTRY = @HAVE_LIST_LAST_ENTRY@ +HAVE_LIST_NEXT_ENTRY = @HAVE_LIST_NEXT_ENTRY@ +HAVE_LOCKDEP_NFNL_IS_HELD = @HAVE_LOCKDEP_NFNL_IS_HELD@ +HAVE_NETLINK_DUMP_START_ARGS = @HAVE_NETLINK_DUMP_START_ARGS@ +HAVE_NETLINK_EXTENDED_ACK = @HAVE_NETLINK_EXTENDED_ACK@ +HAVE_NET_IN_NFNL_CALLBACK_FN = @HAVE_NET_IN_NFNL_CALLBACK_FN@ +HAVE_NET_IN_XT_ACTION_PARAM = @HAVE_NET_IN_XT_ACTION_PARAM@ +HAVE_NET_OPS_ASYNC = @HAVE_NET_OPS_ASYNC@ +HAVE_NET_OPS_ID = @HAVE_NET_OPS_ID@ +HAVE_NFNL_LOCK_SUBSYS = @HAVE_NFNL_LOCK_SUBSYS@ +HAVE_NFNL_MSG_TYPE = @HAVE_NFNL_MSG_TYPE@ +HAVE_NF_BRIDGE_GET_PHYSDEV = @HAVE_NF_BRIDGE_GET_PHYSDEV@ +HAVE_NLA_PUT_64BIT = @HAVE_NLA_PUT_64BIT@ +HAVE_NLA_PUT_BE16 = @HAVE_NLA_PUT_BE16@ +HAVE_NLA_PUT_BE64 = @HAVE_NLA_PUT_BE64@ +HAVE_NLA_PUT_IN_ADDR = @HAVE_NLA_PUT_IN_ADDR@ +HAVE_NL_INFO_PORTID = @HAVE_NL_INFO_PORTID@ +HAVE_NS_CAPABLE = @HAVE_NS_CAPABLE@ +HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS = @HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS@ +HAVE_PASSING_EXTENDED_ACK_TO_PARSERS = @HAVE_PASSING_EXTENDED_ACK_TO_PARSERS@ +HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE = @HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE@ +HAVE_STATE_IN_XT_ACTION_PARAM = @HAVE_STATE_IN_XT_ACTION_PARAM@ +HAVE_STRSCPY = @HAVE_STRSCPY@ +HAVE_STRUCT_XT_ACTION_PARAM = @HAVE_STRUCT_XT_ACTION_PARAM@ +HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET = @HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET@ +HAVE_TCF_EMATCH_STRUCT_NET = @HAVE_TCF_EMATCH_STRUCT_NET@ +HAVE_TC_SKB_PROTOCOL = @HAVE_TC_SKB_PROTOCOL@ +HAVE_TIMER_SETUP = @HAVE_TIMER_SETUP@ +HAVE_TYPEDEF_SCTP_SCTPHDR_T = @HAVE_TYPEDEF_SCTP_SCTPHDR_T@ +HAVE_USER_NS_IN_STRUCT_NET = @HAVE_USER_NS_IN_STRUCT_NET@ +HAVE_VZALLOC = @HAVE_VZALLOC@ +HAVE_XT_FAMILY = @HAVE_XT_FAMILY@ +HAVE_XT_MTCHK_PARAM_STRUCT_NET = @HAVE_XT_MTCHK_PARAM_STRUCT_NET@ +HAVE_XT_NET = @HAVE_XT_NET@ +HAVE_XT_TARGET_PARAM = @HAVE_XT_TARGET_PARAM@ +INCLTDL = @INCLTDL@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KBUILDDIR = @KBUILDDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBADD_DL = @LIBADD_DL@ +LIBADD_DLD_LINK = @LIBADD_DLD_LINK@ +LIBADD_DLOPEN = @LIBADD_DLOPEN@ +LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@ +LIBLTDL = @LIBLTDL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTDLDEPS = @LTDLDEPS@ +LTDLINCL = @LTDLINCL@ +LTDLOPEN = @LTDLOPEN@ +LTLIBOBJS = @LTLIBOBJS@ +LT_ARGZ_H = @LT_ARGZ_H@ +LT_CONFIG_H = @LT_CONFIG_H@ +LT_DLLOADERS = @LT_DLLOADERS@ +LT_DLPREOPEN = @LT_DLPREOPEN@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAXSETS = @MAXSETS@ +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@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SETTYPE_MODLIST = @SETTYPE_MODLIST@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +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_AR = @ac_ct_AR@ +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@ +bashcompdir = @bashcompdir@ +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@ +libmnl_CFLAGS = @libmnl_CFLAGS@ +libmnl_LIBS = @libmnl_LIBS@ +localedir = @localedir@ +localstatedir = @localstatedir@ +ltdl_LIBOBJS = @ltdl_LIBOBJS@ +ltdl_LTLIBOBJS = @ltdl_LTLIBOBJS@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sys_symbol_underscore = @sys_symbol_underscore@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# curr:rev:age +LIBVERSION = 14:0:1 +AM_CPPFLAGS = $(kinclude_CFLAGS) $(all_includes) -I$(top_srcdir)/include +AM_CFLAGS = -std=gnu99 $(am__append_1) $(am__append_2) \ + ${libmnl_CFLAGS} $(am__append_3) +SPARSE = sparse +SPARSE_FLAGS = -Wsparse-all -I../include $(SPARSE_EXT_FLAGS) +IPSET_AM_V_CHECK = $(ipset_am__v_CHECK_$(V)) +ipset_am__v_CHECK_ = $(ipset_am__v_CHECK_$(AM_DEFAULT_VERBOSITY)) +ipset_am__v_CHECK_0 = @echo " CHECK " $<; +IPSET_SETTYPE_LIST = \ + ipset_bitmap_ip.c \ + ipset_bitmap_ipmac.c \ + ipset_bitmap_port.c \ + ipset_hash_ip.c \ + ipset_hash_ipport.c \ + ipset_hash_ipmark.c \ + ipset_hash_ipportip.c \ + ipset_hash_ipportnet.c \ + ipset_hash_net.c \ + ipset_hash_netnet.c \ + ipset_hash_netportnet.c \ + ipset_hash_netport.c \ + ipset_hash_netiface.c \ + ipset_hash_ipmac.c \ + ipset_hash_mac.c \ + ipset_list_set.c + +lib_LTLIBRARIES = libipset.la +IPSET_MODSDIR = ${libdir}/ipset +@ENABLE_SETTYPE_MODULES_TRUE@IPSET_SETTYPE_MODULES = yes +@ENABLE_SETTYPE_MODULES_FALSE@IPSET_SETTYPE_DYN = +@ENABLE_SETTYPE_MODULES_TRUE@IPSET_SETTYPE_DYN = $(if $(findstring all,$(SETTYPE_MODLIST)), \ +@ENABLE_SETTYPE_MODULES_TRUE@ $(IPSET_SETTYPE_LIST), $(SETTYPE_MODLIST)) + +IPSET_SETTYPE_STATIC = $(filter-out $(IPSET_SETTYPE_DYN), \ + $(IPSET_SETTYPE_LIST)) + +IPSET_SETTYPE_DYNAMIC = $(filter $(IPSET_SETTYPE_LIST), \ + $(IPSET_SETTYPE_DYN)) + +IPSET_SETTYPE_STATIC_OBJECTS = $(patsubst %.c, %.lo, $(IPSET_SETTYPE_STATIC)) +IPSET_SETTYPE_DYNAMIC_OBJECTS = $(patsubst %.c, %.lo, $(IPSET_SETTYPE_DYNAMIC)) +IPSET_SETTYPE_DYNAMIC_MODULES = $(patsubst %.c, %.la, $(IPSET_SETTYPE_DYNAMIC)) +IPSET_SETTYPE_DYNAMIC_LTFLAGS = -shared -module -avoid-version +IPSET_SETTYPE_ALL_MODULES = $(patsubst %.c, %.la, $(IPSET_SETTYPE_STATIC)) \ + $(IPSET_SETTYPE_DYNAMIC_MODULES) + +BUILT_SOURCES = ipset_settype_check types_init.c ipset_settype_modules +CLEANFILES = ipset_settype_check types_init.c $(IPSET_SETTYPE_ALL_MODULES) +libipset_la_LDFLAGS = -Wl,--version-script=$(top_srcdir)/lib/libipset.map -version-info $(LIBVERSION) +libipset_la_LIBADD = ${libmnl_LIBS} $(IPSET_SETTYPE_STATIC_OBJECTS) $(LIBADD_DLOPEN) +libipset_la_SOURCES = \ + args.c \ + data.c \ + errcode.c \ + icmp.c \ + icmpv6.c \ + list_sort.c \ + mnl.c \ + parse.c \ + print.c \ + session.c \ + types.c \ + ipset.c \ + types_init.c + +EXTRA_libipset_la_SOURCES = \ + debug.c + +EXTRA_DIST = $(IPSET_SETTYPE_LIST) libipset.map +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libipset.pc +dist_man_MANS = libipset.3 +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/Make_global.am $(top_srcdir)/lib/Make_extra.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) --foreign lib/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign lib/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_srcdir)/Make_global.am $(top_srcdir)/lib/Make_extra.am $(am__empty): + +$(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): +libipset.pc: $(top_builddir)/config.status $(srcdir)/libipset.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @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 " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + 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)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libipset.la: $(libipset_la_OBJECTS) $(libipset_la_DEPENDENCIES) $(EXTRA_libipset_la_DEPENDENCIES) + $(AM_V_CCLD)$(libipset_la_LINK) -rpath $(libdir) $(libipset_la_OBJECTS) $(libipset_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/args.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/errcode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icmp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icmpv6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipset.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list_sort.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mnl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/session.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/types.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/types_init.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man3: $(dist_man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(dist_man_MANS)'; \ + test -n "$(man3dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.3[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ + done; } + +uninstall-man3: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man3dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.3[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + 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|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + 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-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(MANS) $(DATA) +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(pkgconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) 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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +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." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +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-data-local install-man install-pkgconfigDATA + +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-man3 + +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 uninstall-local uninstall-man \ + uninstall-pkgconfigDATA + +uninstall-man: uninstall-man3 + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ + ctags-am 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-data-local 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-man3 install-pdf install-pdf-am \ + install-pkgconfigDATA 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 tags-am uninstall uninstall-am uninstall-libLTLIBRARIES \ + uninstall-local uninstall-man uninstall-man3 \ + uninstall-pkgconfigDATA + +.PRECIOUS: Makefile + + +ipset_%.lo: ipset_%.c +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`; \ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -D_INIT=ipset_$*_init \ + $(if $(findstring ipset_$*.c,$(IPSET_SETTYPE_STATIC)), -DTYPE_INCLUSIVE,)\ + -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< && \ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -D_INIT=ipset_$*_init \ + $(if $(findstring ipset_$*.c,$(IPSET_SETTYPE_STATIC)), -DTYPE_INCLUSIVE,)\ + -c -o $@ $< + +ipset_%.la: $(lib_LTLIBRARIES) ipset_%.lo + $(AM_V_CCLD)lobj="$(patsubst %.la, %.lo, $@)"; \ + $(LIBTOOL) --silent --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(CFLAGS) $(IPSET_SETTYPE_DYNAMIC_LTFLAGS) $(LDFLAGS) -o $@ \ + -rpath $(IPSET_MODSDIR) $$lobj $(LIBS) $(top_builddir)/lib/libipset.la + +types_init.c: $(IPSET_SETTYPE_STATIC_OBJECTS) + $(AM_V_GEN)static_list=`echo $(patsubst %.c,%,$(IPSET_SETTYPE_STATIC))`; \ + echo -n "" > $@; \ + for i in $$static_list; do \ + echo "extern void $${i}_init(void);" >> $@; \ + done; \ + echo "void ipset_types_init(void);" >> $@; \ + echo "void ipset_types_init(void)" >> $@; \ + echo "{" >> $@; \ + for i in $$static_list; do \ + echo " ""$${i}_init();" >> $@; \ + done; \ + echo "}" >> $@; + +ipset_settype_check: + @list="$(IPSET_SETTYPE_MODULES) $(IPSET_SETTYPE_STATIC_OBJECTS)"; \ + test -f $@ || echo "$$list" > $@; \ + if test "$$list" != "`cat $@`"; then \ + $(MAKE) clean; \ + echo "$$list" > $@; \ + fi + +ipset_settype_modules: $(lib_LTLIBRARIES) $(IPSET_SETTYPE_DYNAMIC_OBJECTS) \ + $(IPSET_SETTYPE_DYNAMIC_MODULES) + +install-data-local: install-settype-modules +uninstall-local: uninstall-settype-modules + +install-settype-modules: ipset_settype_modules + @$(NORMAL_INSTALL) + @list='$(IPSET_SETTYPE_DYNAMIC_MODULES)'; \ + test -n "$(IPSET_MODSDIR)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(IPSET_MODSDIR)'"; \ + $(MKDIR_P) "$(DESTDIR)$(IPSET_MODSDIR)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(IPSET_MODSDIR)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(IPSET_MODSDIR)"; \ + } + +uninstall-settype-modules: + @$(NORMAL_UNINSTALL) + @list='$(IPSET_SETTYPE_DYNAMIC_MODULES)'; \ + test -n "$(IPSET_MODSDIR)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(IPSET_MODSDIR)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(IPSET_MODSDIR)/$$f"; \ + done + +.PHONY: ipset_settype_check ipset_settype_modules ipset_settype_modules-stamp \ + install-settype-modules uninstall-settype-modules + +sparse-check: $(libipset_la_SOURCES:.c=.d) + +%.d: %.c + $(IPSET_AM_V_CHECK)\ + $(SPARSE) $(SPARSE_FLAGS) $(AM_CFLAGS) $(AM_CPPFLAGS) $< || : + +# 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/lib/PROTOCOL b/lib/PROTOCOL new file mode 100644 index 0000000..97a6b7c --- /dev/null +++ b/lib/PROTOCOL @@ -0,0 +1,107 @@ +PROTOCOL 6: + +req: msg: IPSET_CMD_PROTOCOL + attr: IPSET_ATTR_PROTOCOL + +resp: attr: IPSET_ATTR_PROTOCOL (protocol max) + IPSET_ATTR_PROTOCOL_MIN (protocol min, optional) + +req: msg: IPSET_CMD_CREATE + attr: IPSET_ATTR_PROTOCOL + IPSET_ATTR_SETNAME + IPSET_ATTR_TYPENAME + IPSET_ATTR_REVISION + IPSET_ATTR_FAMILY + IPSET_ATTR_FLAGS + IPSET_ATTR_DATA + create-specific-data + +resp: success/error + +req: msg: IPSET_CMD_DESTROY|IPSET_CMD_FLUSH + attr: IPSET_ATTR_PROTOCOL + IPSET_ATTR_SETNAME (optional) + +resp: success/error + +req: msg: IPSET_CMD_SWAP|IPSET_CMD_RENAME + attr: IPSET_ATTR_PROTOCOL + IPSET_ATTR_SETNAME + IPSET_ATTR_SETNAME2 + +resp: success/error + +req: msg: IPSET_CMD_LIST|SAVE + attr: IPSET_ATTR_PROTOCOL + IPSET_ATTR_SETNAME (optional) + +resp: attr: IPSET_ATTR_SETNAME + IPSET_ATTR_TYPENAME + IPSET_ATTR_REVISION + IPSET_ATTR_FAMILY + IPSET_ATTR_DATA + create-specific-data + IPSET_ATTR_ADT + IPSET_ATTR_DATA + adt-specific-data + ... + +req: msg: IPSET_CMD_ADD|DEL + attr: IPSET_ATTR_PROTOCOL + IPSET_ATTR_SETNAME + IPSET_ATTR_FLAGS + IPSET_ATTR_LINENO (for reporting error line back too) + IPSET_ATTR_DATA + adt-specific-data + + or + + IPSET_ATTR_ADT + IPSET_ATTR_DATA + adt-specific-data + ... + +resp: success/error + +req: msg: IPSET_CMD_TEST + attr: IPSET_ATTR_PROTOCOL + IPSET_ATTR_SETNAME + IPSET_ATTR_FLAGS + IPSET_ATTR_DATA + adt-specific-data + +resp: success/error + +req: msg: IPSET_CMD_HEADER + attr: IPSET_ATTR_PROTOCOL + IPSET_ATTR_SETNAME + +resp: attr: IPSET_ATTR_SETNAME + IPSET_ATTR_TYPENAME + IPSET_ATTR_REVISION + IPSET_ATTR_FAMILY + +req: msg: IPSET_CMD_TYPE + attr: IPSET_ATTR_PROTOCOL + IPSET_ATTR_TYPENAME + IPSET_ATTR_FAMILY + +resp: attr: IPSET_ATTR_TYPENAME + IPSET_ATTR_FAMILY + IPSET_ATTR_REVISION (version max) + IPSET_ATTR_REVISION_MIN (version min, optional) + +PROTOCOL 7: PROTOCOL 6 + + +req: msg: IPSET_CMD_GET_BYNAME + attr: IPSET_ATTR_PROTOCOL + IPSET_ATTR_SETNAME + +resp: attr: IPSET_ATTR_INDEX + IPSET_ATTR_FAMILY + +req: msg: IPSET_CMD_GET_BYINDEX + attr: IPSET_ATTR_PROTOCOL + IPSET_ATTR_INDEX + +resp: attr: IPSET_ATTR_SETNAME diff --git a/lib/args.c b/lib/args.c new file mode 100644 index 0000000..a0cea4f --- /dev/null +++ b/lib/args.c @@ -0,0 +1,297 @@ +/* Copyright 2017 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include /* ipset_args[] */ + +static const struct ipset_arg ipset_args[] = { + [IPSET_ARG_FAMILY] = { + .name = { "family", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_FAMILY, + .parse = ipset_parse_family, + .print = ipset_print_family, + .help = "[family inet|inet6]|[-4|-6]", + }, + /* Alias: family inet */ + [IPSET_ARG_INET] = { + .name = { "-4", NULL }, + .has_arg = IPSET_NO_ARG, + .opt = IPSET_OPT_FAMILY, + .parse = ipset_parse_family, + .help = "", + }, + /* Alias: family inet6 */ + [IPSET_ARG_INET6] = { + .name = { "-6", NULL }, + .has_arg = IPSET_NO_ARG, + .opt = IPSET_OPT_FAMILY, + .parse = ipset_parse_family, + .help = "", + }, + /* Hash types */ + [IPSET_ARG_HASHSIZE] = { + .name = { "hashsize", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_HASHSIZE, + .parse = ipset_parse_uint32, + .print = ipset_print_number, + .help = "[hashsize VALUE]", + }, + [IPSET_ARG_MAXELEM] = { + .name = { "maxelem", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_MAXELEM, + .parse = ipset_parse_uint32, + .print = ipset_print_number, + .help = "[maxelem VALUE]", + }, + /* Ignored options: backward compatibilty */ + [IPSET_ARG_PROBES] = { + .name = { "probes", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_PROBES, + .parse = ipset_parse_ignored, + .print = ipset_print_number, + }, + [IPSET_ARG_RESIZE] = { + .name = { "resize", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_RESIZE, + .parse = ipset_parse_ignored, + .print = ipset_print_number, + }, + [IPSET_ARG_GC] = { + .name = { "gc", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_GC, + .parse = ipset_parse_ignored, + .print = ipset_print_number, + }, + [IPSET_ARG_IGNORED_FROM] = { + .name = { "from", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_IP, + .parse = ipset_parse_ignored, + .print = ipset_print_number, + }, + [IPSET_ARG_IGNORED_TO] = { + .name = { "to", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_IP_TO, + .parse = ipset_parse_ignored, + .print = ipset_print_number, + }, + [IPSET_ARG_IGNORED_NETWORK] = { + .name = { "network", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_IP, + .parse = ipset_parse_ignored, + .print = ipset_print_number, + }, + /* List type */ + [IPSET_ARG_SIZE] = { + .name = { "size", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_SIZE, + .parse = ipset_parse_uint32, + .print = ipset_print_number, + .help = "[size VALUE]", + }, + /* IP-type elements */ + [IPSET_ARG_IPRANGE] = { + .name = { "range", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_IP, + .parse = ipset_parse_netrange, + .print = ipset_print_ip, + }, + [IPSET_ARG_NETMASK] = { + .name = { "netmask", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_NETMASK, + .parse = ipset_parse_netmask, + .print = ipset_print_number, + .help = "[netmask CIDR]", + }, + /* Port-type elements */ + [IPSET_ARG_PORTRANGE] = { + .name = { "range", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_PORT, + .parse = ipset_parse_tcp_udp_port, + .print = ipset_print_port, + }, + /* Setname type elements */ + [IPSET_ARG_BEFORE] = { + .name = { "before", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_NAMEREF, + .parse = ipset_parse_before, + .help = "[before|after NAME]", + }, + [IPSET_ARG_AFTER] = { + .name = { "after", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_NAMEREF, + .parse = ipset_parse_after, + }, + /* Backward compatibility */ + [IPSET_ARG_FROM_IP] = { + .name = { "from", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_IP, + .parse = ipset_parse_single_ip, + }, + [IPSET_ARG_TO_IP] = { + .name = { "to", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_IP_TO, + .parse = ipset_parse_single_ip, + }, + [IPSET_ARG_NETWORK] = { + .name = { "network", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_IP, + .parse = ipset_parse_net, + }, + [IPSET_ARG_FROM_PORT] = { + .name = { "from", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_PORT, + .parse = ipset_parse_single_tcp_port, + }, + [IPSET_ARG_TO_PORT] = { + .name = { "to", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_PORT_TO, + .parse = ipset_parse_single_tcp_port, + }, + /* Extra flags, options */ + [IPSET_ARG_FORCEADD] = { + .name = { "forceadd", NULL }, + .has_arg = IPSET_NO_ARG, + .opt = IPSET_OPT_FORCEADD, + .parse = ipset_parse_flag, + .print = ipset_print_flag, + .help = "[forceadd]", + }, + [IPSET_ARG_MARKMASK] = { + .name = { "markmask", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_MARKMASK, + .parse = ipset_parse_uint32, + .print = ipset_print_mark, + .help = "markmask VALUE", + }, + [IPSET_ARG_NOMATCH] = { + .name = { "nomatch", NULL }, + .has_arg = IPSET_NO_ARG, + .opt = IPSET_OPT_NOMATCH, + .parse = ipset_parse_flag, + .print = ipset_print_flag, + .help = "[nomatch]", + }, + /* Extensions */ + [IPSET_ARG_TIMEOUT] = { + .name = { "timeout", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_TIMEOUT, + .parse = ipset_parse_timeout, + .print = ipset_print_number, + .help = "[timeout VALUE]", + }, + [IPSET_ARG_COUNTERS] = { + .name = { "counters", NULL }, + .has_arg = IPSET_NO_ARG, + .opt = IPSET_OPT_COUNTERS, + .parse = ipset_parse_flag, + .print = ipset_print_flag, + .help = "[counters]", + }, + [IPSET_ARG_PACKETS] = { + .name = { "packets", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_PACKETS, + .parse = ipset_parse_uint64, + .print = ipset_print_number, + .help = "[packets VALUE]", + }, + [IPSET_ARG_BYTES] = { + .name = { "bytes", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_BYTES, + .parse = ipset_parse_uint64, + .print = ipset_print_number, + .help = "[bytes VALUE]", + }, + [IPSET_ARG_COMMENT] = { + .name = { "comment", NULL }, + .has_arg = IPSET_NO_ARG, + .opt = IPSET_OPT_CREATE_COMMENT, + .parse = ipset_parse_flag, + .print = ipset_print_flag, + .help = "[comment]", + }, + [IPSET_ARG_ADT_COMMENT] = { + .name = { "comment", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_ADT_COMMENT, + .parse = ipset_parse_comment, + .print = ipset_print_comment, + .help = "[comment \"string\"]", + }, + [IPSET_ARG_SKBINFO] = { + .name = { "skbinfo", NULL }, + .has_arg = IPSET_NO_ARG, + .opt = IPSET_OPT_SKBINFO, + .parse = ipset_parse_flag, + .print = ipset_print_flag, + .help = "[skbinfo]", + }, + [IPSET_ARG_SKBMARK] = { + .name = { "skbmark", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_SKBMARK, + .parse = ipset_parse_skbmark, + .print = ipset_print_skbmark, + .help = "[skbmark VALUE]", + }, + [IPSET_ARG_SKBPRIO] = { + .name = { "skbprio", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_SKBPRIO, + .parse = ipset_parse_skbprio, + .print = ipset_print_skbprio, + .help = "[skbprio VALUE]", + }, + [IPSET_ARG_SKBQUEUE] = { + .name = { "skbqueue", NULL }, + .has_arg = IPSET_MANDATORY_ARG, + .opt = IPSET_OPT_SKBQUEUE, + .parse = ipset_parse_uint16, + .print = ipset_print_number, + .help = "[skbqueue VALUE]", + }, +}; + +const struct ipset_arg * +ipset_keyword(enum ipset_keywords i) +{ + return (i > IPSET_ARG_NONE && i < IPSET_ARG_MAX) + ? &ipset_args[i] : NULL; +} + +const char * +ipset_ignored_optname(unsigned int opt) +{ + enum ipset_keywords i; + + for (i = IPSET_ARG_NONE + 1 ; i < IPSET_ARG_MAX; i++) + if (ipset_args[i].opt == opt) + return ipset_args[i].name[0]; + return ""; +} diff --git a/lib/data.c b/lib/data.c new file mode 100644 index 0000000..9a7c861 --- /dev/null +++ b/lib/data.c @@ -0,0 +1,735 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* assert */ +#include /* ntoh* */ +#include /* ETH_ALEN */ +#include /* IFNAMSIZ */ +#include /* malloc, free */ +#include /* memset */ + +#include /* IPSET_MAXNAMELEN */ +#include /* D() */ +#include /* struct ipset_type */ +#include /* inXcpy */ +#include /* prototypes */ + +/* Internal data structure to hold + * a) input data entered by the user or + * b) data received from kernel + * + * We always store the data in host order, *except* IP addresses. + */ + +struct ipset_data { + /* Option bits: which fields are set */ + uint64_t bits; + /* Option bits: which options are ignored */ + uint64_t ignored; + /* Setname */ + char setname[IPSET_MAXNAMELEN]; + /* Set type */ + const struct ipset_type *type; + /* Common CADT options */ + uint8_t cidr; + uint8_t family; + uint32_t flags; /* command level flags */ + uint32_t cadt_flags; /* data level flags */ + uint32_t timeout; + union nf_inet_addr ip; + union nf_inet_addr ip_to; + uint32_t mark; + uint16_t port; + uint16_t port_to; + uint16_t index; + union { + /* RENAME/SWAP */ + char setname2[IPSET_MAXNAMELEN]; + /* CREATE/LIST/SAVE */ + struct { + uint8_t probes; + uint8_t resize; + uint8_t netmask; + uint32_t hashsize; + uint32_t maxelem; + uint32_t markmask; + uint32_t gc; + uint32_t size; + /* Filled out by kernel */ + uint32_t references; + uint32_t elements; + uint32_t memsize; + char typename[IPSET_MAXNAMELEN]; + uint8_t revision_min; + uint8_t revision; + } create; + /* ADT/LIST/SAVE */ + struct { + union nf_inet_addr ip2; + union nf_inet_addr ip2_to; + uint8_t cidr2; + uint8_t proto; + char ether[ETH_ALEN]; + char name[IPSET_MAXNAMELEN]; + char nameref[IPSET_MAXNAMELEN]; + char iface[IFNAMSIZ]; + uint64_t packets; + uint64_t bytes; + char comment[IPSET_MAX_COMMENT_SIZE+1]; + uint64_t skbmark; + uint32_t skbprio; + uint16_t skbqueue; + } adt; + }; +}; + +static void +copy_addr(uint8_t family, union nf_inet_addr *ip, const void *value) +{ + if (family == NFPROTO_IPV4) + in4cpy(&ip->in, value); + else + in6cpy(&ip->in6, value); +} + +/** + * ipset_strlcpy - copy the string from src to dst + * @dst: the target string buffer + * @src: the source string buffer + * @len: the length of bytes to copy, including the terminating null byte. + * + * Copy the string from src to destination, but at most len bytes are + * copied. The target is unconditionally terminated by the null byte. + */ +void +ipset_strlcpy(char *dst, const char *src, size_t len) +{ + assert(dst); + assert(src); + + strncpy(dst, src, len); + dst[len - 1] = '\0'; +} + +/** + * ipset_strlcat - concatenate the string from src to the end of dst + * @dst: the target string buffer + * @src: the source string buffer + * @len: the length of bytes to concat, including the terminating null byte. + * + * Cooncatenate the string in src to destination, but at most len bytes are + * copied. The target is unconditionally terminated by the null byte. + */ +void +ipset_strlcat(char *dst, const char *src, size_t len) +{ + assert(dst); + assert(src); + + strncat(dst, src, len); + dst[len - 1] = '\0'; +} + +/** + * ipset_data_flags_test - test option bits in the data blob + * @data: data blob + * @flags: the option flags to test + * + * Returns true if the options are already set in the data blob. + */ +bool +ipset_data_flags_test(const struct ipset_data *data, uint64_t flags) +{ + assert(data); + return !!(data->bits & flags); +} + +/** + * ipset_data_flags_set - set option bits in the data blob + * @data: data blob + * @flags: the option flags to set + * + * The function sets the flags in the data blob so that + * the corresponding fields are regarded as if filled with proper data. + */ +void +ipset_data_flags_set(struct ipset_data *data, uint64_t flags) +{ + assert(data); + data->bits |= flags; +} + +/** + * ipset_data_flags_unset - unset option bits in the data blob + * @data: data blob + * @flags: the option flags to unset + * + * The function unsets the flags in the data blob. + * This is the quick way to clear specific fields. + */ +void +ipset_data_flags_unset(struct ipset_data *data, uint64_t flags) +{ + assert(data); + data->bits &= ~flags; +} + +#define flag_type_attr(data, opt, flag) \ +do { \ + data->flags |= flag; \ + opt = IPSET_OPT_FLAGS; \ +} while (0) + +#define cadt_flag_type_attr(data, opt, flag) \ +do { \ + data->cadt_flags |= flag; \ + opt = IPSET_OPT_CADT_FLAGS; \ +} while (0) + +/** + * ipset_data_ignored - test and set ignored bits in the data blob + * @data: data blob + * @flags: the option flag to be ignored + * + * Returns true if the option was already ignored. + */ +bool +ipset_data_ignored(struct ipset_data *data, enum ipset_opt opt) +{ + bool ignored; + assert(data); + + ignored = data->ignored & IPSET_FLAG(opt); + data->ignored |= IPSET_FLAG(opt); + + return ignored; +} + +/** + * ipset_data_test_ignored - test ignored bits in the data blob + * @data: data blob + * @flags: the option flag to be tested + * + * Returns true if the option is ignored. + */ +bool +ipset_data_test_ignored(struct ipset_data *data, enum ipset_opt opt) +{ + assert(data); + + return data->ignored & IPSET_FLAG(opt); +} + +/** + * ipset_data_set - put data into the data blob + * @data: data blob + * @opt: the option kind of the data + * @value: the value of the data + * + * Put a given kind of data into the data blob and mark the + * option kind as already set in the blob. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_data_set(struct ipset_data *data, enum ipset_opt opt, const void *value) +{ + assert(data); + assert(opt != IPSET_OPT_NONE); + assert(value); + + switch (opt) { + /* Common ones */ + case IPSET_SETNAME: + ipset_strlcpy(data->setname, value, IPSET_MAXNAMELEN); + break; + case IPSET_OPT_TYPE: + data->type = value; + break; + case IPSET_OPT_FAMILY: + data->family = *(const uint8_t *) value; + data->ignored &= ~IPSET_FLAG(IPSET_OPT_FAMILY); + D("family set to %u", data->family); + break; + /* CADT options */ + case IPSET_OPT_IP: + if (!(data->family == NFPROTO_IPV4 || + data->family == NFPROTO_IPV6)) + return -1; + copy_addr(data->family, &data->ip, value); + break; + case IPSET_OPT_IP_TO: + if (!(data->family == NFPROTO_IPV4 || + data->family == NFPROTO_IPV6)) + return -1; + copy_addr(data->family, &data->ip_to, value); + break; + case IPSET_OPT_CIDR: + data->cidr = *(const uint8_t *) value; + break; + case IPSET_OPT_MARK: + data->mark = *(const uint32_t *) value; + break; + case IPSET_OPT_PORT: + data->port = *(const uint16_t *) value; + break; + case IPSET_OPT_PORT_TO: + data->port_to = *(const uint16_t *) value; + break; + case IPSET_OPT_TIMEOUT: + data->timeout = *(const uint32_t *) value; + break; + case IPSET_OPT_INDEX: + data->index = *(const uint16_t *) value; + break; + /* Create-specific options */ + case IPSET_OPT_GC: + data->create.gc = *(const uint32_t *) value; + break; + case IPSET_OPT_HASHSIZE: + data->create.hashsize = *(const uint32_t *) value; + break; + case IPSET_OPT_MAXELEM: + data->create.maxelem = *(const uint32_t *) value; + break; + case IPSET_OPT_MARKMASK: + data->create.markmask = *(const uint32_t *) value; + break; + case IPSET_OPT_NETMASK: + data->create.netmask = *(const uint8_t *) value; + break; + case IPSET_OPT_PROBES: + data->create.probes = *(const uint8_t *) value; + break; + case IPSET_OPT_RESIZE: + data->create.resize = *(const uint8_t *) value; + break; + case IPSET_OPT_SIZE: + data->create.size = *(const uint32_t *) value; + break; + case IPSET_OPT_COUNTERS: + cadt_flag_type_attr(data, opt, IPSET_FLAG_WITH_COUNTERS); + break; + case IPSET_OPT_CREATE_COMMENT: + cadt_flag_type_attr(data, opt, IPSET_FLAG_WITH_COMMENT); + break; + case IPSET_OPT_FORCEADD: + cadt_flag_type_attr(data, opt, IPSET_FLAG_WITH_FORCEADD); + break; + case IPSET_OPT_SKBINFO: + cadt_flag_type_attr(data, opt, IPSET_FLAG_WITH_SKBINFO); + break; + /* Create-specific options, filled out by the kernel */ + case IPSET_OPT_ELEMENTS: + data->create.elements = *(const uint32_t *) value; + break; + case IPSET_OPT_REFERENCES: + data->create.references = *(const uint32_t *) value; + break; + case IPSET_OPT_MEMSIZE: + data->create.memsize = *(const uint32_t *) value; + break; + /* Create-specific options, type */ + case IPSET_OPT_TYPENAME: + ipset_strlcpy(data->create.typename, value, + IPSET_MAXNAMELEN); + break; + case IPSET_OPT_REVISION: + data->create.revision = *(const uint8_t *) value; + break; + case IPSET_OPT_REVISION_MIN: + data->create.revision_min = *(const uint8_t *) value; + break; + /* ADT-specific options */ + case IPSET_OPT_ETHER: + memcpy(data->adt.ether, value, ETH_ALEN); + break; + case IPSET_OPT_NAME: + ipset_strlcpy(data->adt.name, value, IPSET_MAXNAMELEN); + break; + case IPSET_OPT_NAMEREF: + ipset_strlcpy(data->adt.nameref, value, IPSET_MAXNAMELEN); + break; + case IPSET_OPT_IP2: + if (!(data->family == NFPROTO_IPV4 || + data->family == NFPROTO_IPV6)) + return -1; + copy_addr(data->family, &data->adt.ip2, value); + break; + case IPSET_OPT_IP2_TO: + if (!(data->family == NFPROTO_IPV4 || + data->family == NFPROTO_IPV6)) + return -1; + copy_addr(data->family, &data->adt.ip2_to, value); + break; + case IPSET_OPT_CIDR2: + data->adt.cidr2 = *(const uint8_t *) value; + break; + case IPSET_OPT_PROTO: + data->adt.proto = *(const uint8_t *) value; + break; + case IPSET_OPT_IFACE: + ipset_strlcpy(data->adt.iface, value, IFNAMSIZ); + break; + case IPSET_OPT_PACKETS: + data->adt.packets = *(const uint64_t *) value; + break; + case IPSET_OPT_BYTES: + data->adt.bytes = *(const uint64_t *) value; + break; + case IPSET_OPT_ADT_COMMENT: + ipset_strlcpy(data->adt.comment, value, + IPSET_MAX_COMMENT_SIZE + 1); + break; + case IPSET_OPT_SKBMARK: + data->adt.skbmark = *(const uint64_t *) value; + break; + case IPSET_OPT_SKBPRIO: + data->adt.skbprio = *(const uint32_t *) value; + break; + case IPSET_OPT_SKBQUEUE: + data->adt.skbqueue = *(const uint16_t *) value; + break; + /* Swap/rename */ + case IPSET_OPT_SETNAME2: + ipset_strlcpy(data->setname2, value, IPSET_MAXNAMELEN); + break; + /* flags */ + case IPSET_OPT_EXIST: + flag_type_attr(data, opt, IPSET_FLAG_EXIST); + break; + case IPSET_OPT_BEFORE: + cadt_flag_type_attr(data, opt, IPSET_FLAG_BEFORE); + break; + case IPSET_OPT_PHYSDEV: + cadt_flag_type_attr(data, opt, IPSET_FLAG_PHYSDEV); + break; + case IPSET_OPT_NOMATCH: + cadt_flag_type_attr(data, opt, IPSET_FLAG_NOMATCH); + break; + case IPSET_OPT_FLAGS: + data->flags = *(const uint32_t *)value; + break; + case IPSET_OPT_CADT_FLAGS: + data->cadt_flags = *(const uint32_t *)value; + if (data->cadt_flags & IPSET_FLAG_BEFORE) + ipset_data_flags_set(data, + IPSET_FLAG(IPSET_OPT_BEFORE)); + if (data->cadt_flags & IPSET_FLAG_PHYSDEV) + ipset_data_flags_set(data, + IPSET_FLAG(IPSET_OPT_PHYSDEV)); + if (data->cadt_flags & IPSET_FLAG_NOMATCH) + ipset_data_flags_set(data, + IPSET_FLAG(IPSET_OPT_NOMATCH)); + if (data->cadt_flags & IPSET_FLAG_WITH_COUNTERS) + ipset_data_flags_set(data, + IPSET_FLAG(IPSET_OPT_COUNTERS)); + if (data->cadt_flags & IPSET_FLAG_WITH_COMMENT) + ipset_data_flags_set(data, + IPSET_FLAG(IPSET_OPT_CREATE_COMMENT)); + if (data->cadt_flags & IPSET_FLAG_WITH_SKBINFO) + ipset_data_flags_set(data, + IPSET_FLAG(IPSET_OPT_SKBINFO)); + break; + default: + return -1; + }; + + ipset_data_flags_set(data, IPSET_FLAG(opt)); + return 0; +} + +/** + * ipset_data_get - get data from the data blob + * @data: data blob + * @opt: option kind of the requested data + * + * Returns the pointer to the requested kind of data from the data blob + * if it is set. If the option kind is not set or is an unknown type, + * NULL is returned. + */ +const void * +ipset_data_get(const struct ipset_data *data, enum ipset_opt opt) +{ + assert(data); + assert(opt != IPSET_OPT_NONE); + + if (!(opt == IPSET_OPT_TYPENAME || ipset_data_test(data, opt))) + return NULL; + + switch (opt) { + /* Common ones */ + case IPSET_SETNAME: + return data->setname; + case IPSET_OPT_TYPE: + return data->type; + case IPSET_OPT_TYPENAME: + if (ipset_data_test(data, IPSET_OPT_TYPE)) + return data->type->name; + else if (ipset_data_test(data, IPSET_OPT_TYPENAME)) + return data->create.typename; + return NULL; + case IPSET_OPT_FAMILY: + return &data->family; + /* CADT options */ + case IPSET_OPT_IP: + return &data->ip; + case IPSET_OPT_IP_TO: + return &data->ip_to; + case IPSET_OPT_CIDR: + return &data->cidr; + case IPSET_OPT_MARK: + return &data->mark; + case IPSET_OPT_PORT: + return &data->port; + case IPSET_OPT_PORT_TO: + return &data->port_to; + case IPSET_OPT_TIMEOUT: + return &data->timeout; + case IPSET_OPT_INDEX: + return &data->index; + /* Create-specific options */ + case IPSET_OPT_GC: + return &data->create.gc; + case IPSET_OPT_HASHSIZE: + return &data->create.hashsize; + case IPSET_OPT_MAXELEM: + return &data->create.maxelem; + case IPSET_OPT_MARKMASK: + return &data->create.markmask; + case IPSET_OPT_NETMASK: + return &data->create.netmask; + case IPSET_OPT_PROBES: + return &data->create.probes; + case IPSET_OPT_RESIZE: + return &data->create.resize; + case IPSET_OPT_SIZE: + return &data->create.size; + /* Create-specific options, filled out by the kernel */ + case IPSET_OPT_ELEMENTS: + return &data->create.elements; + case IPSET_OPT_REFERENCES: + return &data->create.references; + case IPSET_OPT_MEMSIZE: + return &data->create.memsize; + /* Create-specific options, TYPE */ + case IPSET_OPT_REVISION: + return &data->create.revision; + case IPSET_OPT_REVISION_MIN: + return &data->create.revision_min; + /* ADT-specific options */ + case IPSET_OPT_ETHER: + return data->adt.ether; + case IPSET_OPT_NAME: + return data->adt.name; + case IPSET_OPT_NAMEREF: + return data->adt.nameref; + case IPSET_OPT_IP2: + return &data->adt.ip2; + case IPSET_OPT_IP2_TO: + return &data->adt.ip2_to; + case IPSET_OPT_CIDR2: + return &data->adt.cidr2; + case IPSET_OPT_PROTO: + return &data->adt.proto; + case IPSET_OPT_IFACE: + return &data->adt.iface; + case IPSET_OPT_PACKETS: + return &data->adt.packets; + case IPSET_OPT_BYTES: + return &data->adt.bytes; + case IPSET_OPT_ADT_COMMENT: + return &data->adt.comment; + case IPSET_OPT_SKBMARK: + return &data->adt.skbmark; + case IPSET_OPT_SKBPRIO: + return &data->adt.skbprio; + case IPSET_OPT_SKBQUEUE: + return &data->adt.skbqueue; + /* Swap/rename */ + case IPSET_OPT_SETNAME2: + return data->setname2; + /* flags */ + case IPSET_OPT_FLAGS: + case IPSET_OPT_EXIST: + return &data->flags; + case IPSET_OPT_CADT_FLAGS: + case IPSET_OPT_BEFORE: + case IPSET_OPT_PHYSDEV: + case IPSET_OPT_NOMATCH: + case IPSET_OPT_COUNTERS: + case IPSET_OPT_CREATE_COMMENT: + case IPSET_OPT_FORCEADD: + case IPSET_OPT_SKBINFO: + return &data->cadt_flags; + default: + return NULL; + } +} + +/** + * ipset_data_sizeof - calculates the size of the data type + * @opt: option kind of the data + * @family: INET family + * + * Returns the size required to store the given data type. + */ +size_t +ipset_data_sizeof(enum ipset_opt opt, uint8_t family) +{ + assert(opt != IPSET_OPT_NONE); + + switch (opt) { + case IPSET_OPT_IP: + case IPSET_OPT_IP_TO: + case IPSET_OPT_IP2: + case IPSET_OPT_IP2_TO: + return family == NFPROTO_IPV4 ? sizeof(uint32_t) + : sizeof(struct in6_addr); + case IPSET_OPT_MARK: + return sizeof(uint32_t); + case IPSET_OPT_PORT: + case IPSET_OPT_PORT_TO: + case IPSET_OPT_SKBQUEUE: + case IPSET_OPT_INDEX: + return sizeof(uint16_t); + case IPSET_SETNAME: + case IPSET_OPT_NAME: + case IPSET_OPT_NAMEREF: + return IPSET_MAXNAMELEN; + case IPSET_OPT_TIMEOUT: + case IPSET_OPT_GC: + case IPSET_OPT_HASHSIZE: + case IPSET_OPT_MAXELEM: + case IPSET_OPT_MARKMASK: + case IPSET_OPT_SIZE: + case IPSET_OPT_ELEMENTS: + case IPSET_OPT_REFERENCES: + case IPSET_OPT_MEMSIZE: + case IPSET_OPT_SKBPRIO: + return sizeof(uint32_t); + case IPSET_OPT_PACKETS: + case IPSET_OPT_BYTES: + case IPSET_OPT_SKBMARK: + return sizeof(uint64_t); + case IPSET_OPT_CIDR: + case IPSET_OPT_CIDR2: + case IPSET_OPT_NETMASK: + case IPSET_OPT_PROBES: + case IPSET_OPT_RESIZE: + case IPSET_OPT_PROTO: + return sizeof(uint8_t); + case IPSET_OPT_ETHER: + return ETH_ALEN; + /* Flags doesn't counted once :-( */ + case IPSET_OPT_BEFORE: + case IPSET_OPT_PHYSDEV: + case IPSET_OPT_NOMATCH: + case IPSET_OPT_COUNTERS: + case IPSET_OPT_FORCEADD: + return sizeof(uint32_t); + case IPSET_OPT_ADT_COMMENT: + return IPSET_MAX_COMMENT_SIZE + 1; + default: + return 0; + }; +} + +/** + * ipset_setname - return the name of the set from the data blob + * @data: data blob + * + * Return the name of the set from the data blob or NULL if the + * name not set yet. + */ +const char * +ipset_data_setname(const struct ipset_data *data) +{ + assert(data); + return ipset_data_test(data, IPSET_SETNAME) ? data->setname : NULL; +} + +/** + * ipset_family - return the INET family of the set from the data blob + * @data: data blob + * + * Return the INET family supported by the set from the data blob. + * If the family is not set yet, NFPROTO_UNSPEC is returned. + */ +uint8_t +ipset_data_family(const struct ipset_data *data) +{ + assert(data); + return ipset_data_test(data, IPSET_OPT_FAMILY) + ? data->family : NFPROTO_UNSPEC; +} + +/** + * ipset_data_cidr - return the value of IPSET_OPT_CIDR + * @data: data blob + * + * Return the value of IPSET_OPT_CIDR stored in the data blob. + * If it is not set, then the returned value corresponds to + * the default one according to the family type or zero. + */ +uint8_t +ipset_data_cidr(const struct ipset_data *data) +{ + assert(data); + return ipset_data_test(data, IPSET_OPT_CIDR) ? data->cidr : + data->family == NFPROTO_IPV4 ? 32 : + data->family == NFPROTO_IPV6 ? 128 : 0; +} + +/** + * ipset_flags - return which fields are set in the data blob + * @data: data blob + * + * Returns the value of the bit field which elements are set. + */ +uint64_t +ipset_data_flags(const struct ipset_data *data) +{ + assert(data); + return data->bits; +} + +/** + * ipset_data_reset - reset the data blob to unset + * @data: data blob + * + * Resets the data blob to the unset state for every field. + */ +void +ipset_data_reset(struct ipset_data *data) +{ + assert(data); + memset(data, 0, sizeof(*data)); +} + +/** + * ipset_data_init - create a new data blob + * + * Return the new data blob initialized to empty. In case of + * an error, NULL is retured. + */ +struct ipset_data * +ipset_data_init(void) +{ + return calloc(1, sizeof(struct ipset_data)); +} + +/** + * ipset_data_fini - release a data blob created by ipset_data_init + * + * Release the data blob created by ipset_data_init previously. + */ +void +ipset_data_fini(struct ipset_data *data) +{ + assert(data); + free(data); +} diff --git a/lib/debug.c b/lib/debug.c new file mode 100644 index 0000000..44d0f04 --- /dev/null +++ b/lib/debug.c @@ -0,0 +1,319 @@ +/* Copyright 2011 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include /* inet_ntop */ +#include /* libmnl backend */ + +struct ipset_attrname { + const char *name; +}; + +static const struct ipset_attrname cmdattr2name[] = { + [IPSET_ATTR_PROTOCOL] = { .name = "PROTOCOL" }, + [IPSET_ATTR_SETNAME] = { .name = "SETNAME" }, + [IPSET_ATTR_TYPENAME] = { .name = "TYPENAME" }, + [IPSET_ATTR_REVISION] = { .name = "REVISION" }, + [IPSET_ATTR_FAMILY] = { .name = "FAMILY" }, + [IPSET_ATTR_FLAGS] = { .name = "FLAGS" }, + [IPSET_ATTR_DATA] = { .name = "DATA" }, + [IPSET_ATTR_ADT] = { .name = "ADT" }, + [IPSET_ATTR_LINENO] = { .name = "LINENO" }, + [IPSET_ATTR_PROTOCOL_MIN] = { .name = "PROTO_MIN" }, +}; + +static const struct ipset_attrname createattr2name[] = { + [IPSET_ATTR_IP] = { .name = "IP" }, + [IPSET_ATTR_IP_TO] = { .name = "IP_TO" }, + [IPSET_ATTR_CIDR] = { .name = "CIDR" }, + [IPSET_ATTR_PORT] = { .name = "PORT" }, + [IPSET_ATTR_PORT_TO] = { .name = "PORT_TO" }, + [IPSET_ATTR_TIMEOUT] = { .name = "TIMEOUT" }, + [IPSET_ATTR_PROTO] = { .name = "PROTO" }, + [IPSET_ATTR_CADT_FLAGS] = { .name = "CADT_FLAGS" }, + [IPSET_ATTR_CADT_LINENO] = { .name = "CADT_LINENO" }, + [IPSET_ATTR_GC] = { .name = "GC" }, + [IPSET_ATTR_HASHSIZE] = { .name = "HASHSIZE" }, + [IPSET_ATTR_MAXELEM] = { .name = "MAXELEM" }, + [IPSET_ATTR_MARKMASK] = { .name = "MARKMASK" }, + [IPSET_ATTR_NETMASK] = { .name = "NETMASK" }, + [IPSET_ATTR_PROBES] = { .name = "PROBES" }, + [IPSET_ATTR_RESIZE] = { .name = "RESIZE" }, + [IPSET_ATTR_SIZE] = { .name = "SIZE" }, + [IPSET_ATTR_ELEMENTS] = { .name = "ELEMENTS" }, + [IPSET_ATTR_REFERENCES] = { .name = "REFERENCES" }, + [IPSET_ATTR_MEMSIZE] = { .name = "MEMSIZE" }, +}; + +static const struct ipset_attrname adtattr2name[] = { + [IPSET_ATTR_IP] = { .name = "IP" }, + [IPSET_ATTR_IP_TO] = { .name = "IP_TO" }, + [IPSET_ATTR_CIDR] = { .name = "CIDR" }, + [IPSET_ATTR_MARK] = { .name = "MARK" }, + [IPSET_ATTR_PORT] = { .name = "PORT" }, + [IPSET_ATTR_PORT_TO] = { .name = "PORT_TO" }, + [IPSET_ATTR_TIMEOUT] = { .name = "TIMEOUT" }, + [IPSET_ATTR_PROTO] = { .name = "PROTO" }, + [IPSET_ATTR_CADT_FLAGS] = { .name = "CADT_FLAGS" }, + [IPSET_ATTR_CADT_LINENO] = { .name = "CADT_LINENO" }, + [IPSET_ATTR_ETHER] = { .name = "ETHER" }, + [IPSET_ATTR_NAME] = { .name = "NAME" }, + [IPSET_ATTR_NAMEREF] = { .name = "NAMEREF" }, + [IPSET_ATTR_IP2] = { .name = "IP2" }, + [IPSET_ATTR_CIDR2] = { .name = "CIDR2" }, + [IPSET_ATTR_IP2_TO] = { .name = "IP2_TO" }, + [IPSET_ATTR_IFACE] = { .name = "IFACE" }, + [IPSET_ATTR_COMMENT] = { .name = "COMMENT" }, + [IPSET_ATTR_SKBMARK] = { .name = "SKBMARK" }, + [IPSET_ATTR_SKBPRIO] = { .name = "SKBPRIO" }, + [IPSET_ATTR_SKBQUEUE] = { .name = "SKBQUEUE" }, +}; + +static void +debug_cadt_attrs(int max, const struct ipset_attr_policy *policy, + const struct ipset_attrname attr2name[], + struct nlattr *nla[]) +{ + uint64_t tmp; + uint32_t v; + int i; + + fprintf(stderr, "\t\t%s attributes:\n", + policy == create_attrs ? "CREATE" : "ADT"); + for (i = IPSET_ATTR_UNSPEC + 1; i <= max; i++) { + if (!nla[i]) + continue; + switch (policy[i].type) { + case MNL_TYPE_UNSPEC: + fprintf(stderr,"\t\tpadding\n"); + break; + case MNL_TYPE_U8: + v = *(uint8_t *) mnl_attr_get_payload(nla[i]); + fprintf(stderr, "\t\t%s: %u\n", + attr2name[i].name, v); + break; + case MNL_TYPE_U16: + v = *(uint16_t *) mnl_attr_get_payload(nla[i]); + fprintf(stderr, "\t\t%s: %u\n", + attr2name[i].name, ntohs(v)); + break; + case MNL_TYPE_U32: + v = *(uint32_t *) mnl_attr_get_payload(nla[i]); + fprintf(stderr, "\t\t%s: %u\n", + attr2name[i].name, ntohl(v)); + break; + case MNL_TYPE_U64: + memcpy(&tmp, mnl_attr_get_payload(nla[i]), sizeof(tmp)); + fprintf(stderr, "\t\t%s: 0x%llx\n", + attr2name[i].name, (long long int) + be64toh(tmp)); + break; + case MNL_TYPE_NUL_STRING: + fprintf(stderr, "\t\t%s: %s\n", + attr2name[i].name, + (const char *) mnl_attr_get_payload(nla[i])); + break; + case MNL_TYPE_NESTED: { + struct nlattr *ipattr[IPSET_ATTR_IPADDR_MAX+1] = {}; + char addr[INET6_ADDRSTRLEN]; + void *d; + + if (mnl_attr_parse_nested(nla[i], ipaddr_attr_cb, + ipattr) < 0) { + fprintf(stderr, + "\t\tIPADDR: cannot validate " + "and parse attributes\n"); + continue; + } + if (ipattr[IPSET_ATTR_IPADDR_IPV4]) { + d = mnl_attr_get_payload( + ipattr[IPSET_ATTR_IPADDR_IPV4]); + + inet_ntop(NFPROTO_IPV4, d, addr, + INET6_ADDRSTRLEN); + fprintf(stderr, "\t\t%s: %s\n", + attr2name[i].name, addr); + } else if (ipattr[IPSET_ATTR_IPADDR_IPV6]) { + d = mnl_attr_get_payload( + ipattr[IPSET_ATTR_IPADDR_IPV6]); + + inet_ntop(NFPROTO_IPV6, d, addr, + INET6_ADDRSTRLEN); + fprintf(stderr, "\t\t%s: %s\n", + attr2name[i].name, addr); + } + break; + } + default: + fprintf(stderr, "\t\t%s: unresolved!\n", + attr2name[i].name); + } + } +} + +static void +debug_cmd_attrs(int cmd, struct nlattr *nla[]) +{ + struct nlattr *adt[IPSET_ATTR_ADT_MAX+1] = {}; + struct nlattr *cattr[IPSET_ATTR_CREATE_MAX+1] = {}; + uint32_t v; + int i; + + fprintf(stderr, "\tCommand attributes:\n"); + for (i = IPSET_ATTR_UNSPEC + 1; i <= IPSET_ATTR_CMD_MAX; i++) { + if (!nla[i]) + continue; + switch (cmd_attrs[i].type) { + case MNL_TYPE_U8: + v = *(uint8_t *) mnl_attr_get_payload(nla[i]); + fprintf(stderr, "\t%s: %u\n", + cmdattr2name[i].name, v); + break; + case MNL_TYPE_U16: + v = *(uint16_t *) mnl_attr_get_payload(nla[i]); + fprintf(stderr, "\t%s: %u\n", + cmdattr2name[i].name, ntohs(v)); + break; + case MNL_TYPE_U32: + v = *(uint32_t *) mnl_attr_get_payload(nla[i]); + fprintf(stderr, "\t%s: %u\n", + cmdattr2name[i].name, ntohl(v)); + break; + case MNL_TYPE_NUL_STRING: + fprintf(stderr, "\t%s: %s\n", + cmdattr2name[i].name, + (const char *) mnl_attr_get_payload(nla[i])); + break; + case MNL_TYPE_NESTED: + if (i == IPSET_ATTR_DATA) { + switch (cmd) { + case IPSET_CMD_ADD: + case IPSET_CMD_DEL: + case IPSET_CMD_TEST: + if (mnl_attr_parse_nested(nla[i], + adt_attr_cb, adt) < 0) { + fprintf(stderr, + "\tADT: cannot validate " + "and parse attributes\n"); + continue; + } + debug_cadt_attrs(IPSET_ATTR_ADT_MAX, + adt_attrs, + adtattr2name, + adt); + break; + default: + if (mnl_attr_parse_nested(nla[i], + create_attr_cb, + cattr) < 0) { + fprintf(stderr, + "\tCREATE: cannot validate " + "and parse attributes\n"); + continue; + } + debug_cadt_attrs(IPSET_ATTR_CREATE_MAX, + create_attrs, + createattr2name, + cattr); + } + } else { + struct nlattr *tb; + mnl_attr_for_each_nested(tb, nla[i]) { + memset(adt, 0, sizeof(adt)); + if (mnl_attr_parse_nested(tb, + adt_attr_cb, adt) < 0) { + fprintf(stderr, + "\tADT: cannot validate " + "and parse attributes\n"); + continue; + } + debug_cadt_attrs(IPSET_ATTR_ADT_MAX, + adt_attrs, + adtattr2name, + adt); + } + } + break; + default: + fprintf(stderr, "\t%s: unresolved!\n", + cmdattr2name[i].name); + } + } +} + +void +ipset_debug_msg(const char *dir, void *buffer, int len) +{ + const struct nlmsghdr *nlh = buffer; + struct nlattr *nla[IPSET_ATTR_CMD_MAX+1] = {}; + int cmd, nfmsglen = MNL_ALIGN(sizeof(struct nfgenmsg)); + + debug = 0; + if (!mnl_nlmsg_ok(nlh, len)) { + fprintf(stderr, "Broken message received!\n"); + if (len < (int)sizeof(struct nlmsghdr)) { + fprintf(stderr, "len (%d) < sizeof(struct nlmsghdr) (%d)\n", + len, (int)sizeof(struct nlmsghdr)); + } else if (nlh->nlmsg_len < sizeof(struct nlmsghdr)) { + fprintf(stderr, "nlmsg_len (%u) < sizeof(struct nlmsghdr) (%d)\n", + nlh->nlmsg_len, (int)sizeof(struct nlmsghdr)); + } else if ((int)nlh->nlmsg_len > len) { + fprintf(stderr, "nlmsg_len (%u) > len (%d)\n", + nlh->nlmsg_len, len); + } + } + while (mnl_nlmsg_ok(nlh, len)) { + switch (nlh->nlmsg_type) { + case NLMSG_NOOP: + case NLMSG_DONE: + case NLMSG_OVERRUN: + fprintf(stderr, "Message header: %s msg %s\n" + "\tlen %d\n" + "\tseq %u\n", + dir, + nlh->nlmsg_type == NLMSG_NOOP ? "NOOP" : + nlh->nlmsg_type == NLMSG_DONE ? "DONE" : + "OVERRUN", + len, nlh->nlmsg_seq); + goto next_msg; + case NLMSG_ERROR: { + const struct nlmsgerr *err = mnl_nlmsg_get_payload(nlh); + fprintf(stderr, "Message header: %s msg ERROR\n" + "\tlen %d\n" + "\terrcode %d\n" + "\tseq %u\n", + dir, len, err->error, nlh->nlmsg_seq); + goto next_msg; + } + default: + ; + } + cmd = ipset_get_nlmsg_type(nlh); + fprintf(stderr, "Message header: %s cmd %s (%d)\n" + "\tlen %d\n" + "\tflag %s\n" + "\tseq %u\n", + dir, + cmd <= IPSET_CMD_NONE ? "NONE!" : + cmd >= IPSET_CMD_MAX ? "MAX!" : cmd2name[cmd], cmd, + len, + !(nlh->nlmsg_flags & NLM_F_EXCL) ? "EXIST" : "none", + nlh->nlmsg_seq); + if (cmd <= IPSET_CMD_NONE || cmd >= IPSET_CMD_MAX) + goto next_msg; + memset(nla, 0, sizeof(nla)); + if (mnl_attr_parse(nlh, nfmsglen, + cmd_attr_cb, nla) < MNL_CB_STOP) { + fprintf(stderr, "\tcannot validate " + "and parse attributes\n"); + goto next_msg; + } + debug_cmd_attrs(cmd, nla); +next_msg: + nlh = mnl_nlmsg_next(nlh, &len); + } + debug = 1; +} diff --git a/lib/errcode.c b/lib/errcode.c new file mode 100644 index 0000000..d356264 --- /dev/null +++ b/lib/errcode.c @@ -0,0 +1,209 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* assert */ +#include /* errno */ +#include /* strerror */ + +#include /* D() */ +#include /* ipset_data_get */ +#include /* ipset_err */ +#include /* struct ipset_type */ +#include /* STRNEQ */ +#include /* prototypes */ +#include /* bitmap specific errcodes */ +#include /* hash specific errcodes */ +#include /* list specific errcodes */ + +/* Core kernel error codes */ +static const struct ipset_errcode_table core_errcode_table[] = { + /* Generic error codes */ + { ENOENT, 0, + "The set with the given name does not exist" }, + { EMSGSIZE, 0, + "Kernel error received: message could not be created" }, + { IPSET_ERR_PROTOCOL, 0, + "Kernel error received: ipset protocol error" }, + + /* CREATE specific error codes */ + { EEXIST, IPSET_CMD_CREATE, + "Set cannot be created: set with the same name already exists" }, + { IPSET_ERR_FIND_TYPE, 0, + "Kernel error received: set type not supported" }, + { IPSET_ERR_MAX_SETS, 0, + "Kernel error received: maximal number of sets reached, " + "cannot create more." }, + { IPSET_ERR_INVALID_NETMASK, 0, + "The value of the netmask parameter is invalid" }, + { IPSET_ERR_INVALID_MARKMASK, 0, + "The value of the markmask parameter is invalid" }, + { IPSET_ERR_INVALID_FAMILY, 0, + "Protocol family not supported by the set type" }, + + /* DESTROY specific error codes */ + { IPSET_ERR_BUSY, IPSET_CMD_DESTROY, + "Set cannot be destroyed: it is in use by a kernel component" }, + + /* FLUSH specific error codes */ + + /* RENAME specific error codes */ + { IPSET_ERR_EXIST_SETNAME2, IPSET_CMD_RENAME, + "Set cannot be renamed: a set with the new name already exists" }, + { IPSET_ERR_REFERENCED, IPSET_CMD_RENAME, + "Set cannot be renamed: it is in use by another system" }, + + /* SWAP specific error codes */ + { IPSET_ERR_EXIST_SETNAME2, IPSET_CMD_SWAP, + "Sets cannot be swapped: the second set does not exist" }, + { IPSET_ERR_TYPE_MISMATCH, IPSET_CMD_SWAP, + "The sets cannot be swapped: their type does not match" }, + + /* LIST/SAVE specific error codes */ + + /* Generic (CADT) error codes */ + { IPSET_ERR_INVALID_CIDR, 0, + "The value of the CIDR parameter of the IP address is invalid" }, + { IPSET_ERR_TIMEOUT, 0, + "Timeout cannot be used: set was created without timeout support" }, + { IPSET_ERR_IPADDR_IPV4, 0, + "An IPv4 address is expected, but not received" }, + { IPSET_ERR_IPADDR_IPV6, 0, + "An IPv6 address is expected, but not received" }, + { IPSET_ERR_COUNTER, 0, + "Packet/byte counters cannot be used: set was created without counter support" }, + { IPSET_ERR_COMMENT, 0, + "Comment cannot be used: set was created without comment support" }, + { IPSET_ERR_SKBINFO, 0, + "Skbinfo mapping cannot be used: set was created without skbinfo support" }, + + /* ADD specific error codes */ + { IPSET_ERR_EXIST, IPSET_CMD_ADD, + "Element cannot be added to the set: it's already added" }, + + /* DEL specific error codes */ + { IPSET_ERR_EXIST, IPSET_CMD_DEL, + "Element cannot be deleted from the set: it's not added" }, + + /* TEST specific error codes */ + + /* HEADER specific error codes */ + + /* TYPE specific error codes */ + { EEXIST, IPSET_CMD_TYPE, + "Kernel error received: set type does not supported" }, + + /* PROTOCOL specific error codes */ + + { }, +}; + +/* Bitmap type-specific error codes */ +static const struct ipset_errcode_table bitmap_errcode_table[] = { + /* Generic (CADT) error codes */ + { IPSET_ERR_BITMAP_RANGE, 0, + "Element is out of the range of the set" }, + { IPSET_ERR_BITMAP_RANGE_SIZE, IPSET_CMD_CREATE, + "The range you specified exceeds the size limit of the set type" }, + { }, +}; + +/* Hash type-specific error codes */ +static const struct ipset_errcode_table hash_errcode_table[] = { + /* Generic (CADT) error codes */ + { IPSET_ERR_HASH_FULL, 0, + "Hash is full, cannot add more elements" }, + { IPSET_ERR_HASH_ELEM, 0, + "Null-valued element, cannot be stored in a hash type of set" }, + { IPSET_ERR_INVALID_PROTO, 0, + "Invalid protocol specified" }, + { IPSET_ERR_MISSING_PROTO, 0, + "Protocol missing, but must be specified" }, + { IPSET_ERR_HASH_RANGE_UNSUPPORTED, 0, + "Range is not supported in the \"net\" component of the element" }, + { IPSET_ERR_HASH_RANGE, 0, + "Invalid range, covers the whole address space" }, + { }, +}; + +/* List type-specific error codes */ +static const struct ipset_errcode_table list_errcode_table[] = { + /* Generic (CADT) error codes */ + { IPSET_ERR_NAME, 0, + "Set to be added/deleted/tested as element does not exist." }, + { IPSET_ERR_LOOP, 0, + "Sets with list:set type cannot be added to the set." }, + { IPSET_ERR_BEFORE, 0, + "No reference set specified." }, + { IPSET_ERR_NAMEREF, 0, + "The set to which you referred with 'before' or 'after' " + "does not exist." }, + { IPSET_ERR_LIST_FULL, 0, + "The set is full, more elements cannot be added." }, + { IPSET_ERR_REF_EXIST, 0, + "The set to which you referred with 'before' or 'after' " + "is not added to the set." }, + { }, +}; + +/* Match set type names */ +#define MATCH_TYPENAME(a, b) STRNEQ(a, b, strlen(b)) + +/** + * ipset_errcode - interpret a kernel error code + * @session: session structure + * @errcode: errcode + * + * Find the error code and print the appropriate + * error message into the error buffer. + * + * Returns -1. + */ +int +ipset_errcode(struct ipset_session *session, enum ipset_cmd cmd, int errcode) +{ + const struct ipset_errcode_table *table = core_errcode_table; + int i, generic; + + if (errcode >= IPSET_ERR_TYPE_SPECIFIC) { + const struct ipset_type *type; + + type = ipset_saved_type(session); + if (type) { + if (MATCH_TYPENAME(type->name, "bitmap:")) + table = bitmap_errcode_table; + else if (MATCH_TYPENAME(type->name, "hash:")) + table = hash_errcode_table; + else if (MATCH_TYPENAME(type->name, "list:")) + table = list_errcode_table; + } + } + +retry: + for (i = 0, generic = -1; table[i].errcode; i++) { + if (table[i].errcode == errcode && + (table[i].cmd == cmd || table[i].cmd == 0)) { + if (table[i].cmd == 0) { + generic = i; + continue; + } + return ipset_err(session, table[i].message); + } + } + if (generic != -1) + return ipset_err(session, table[generic].message); + /* Fall back to the core table */ + if (table != core_errcode_table) { + table = core_errcode_table; + goto retry; + } + if (errcode < IPSET_ERR_PRIVATE) + return ipset_err(session, "Kernel error received: %s", + strerror(errcode)); + else + return ipset_err(session, + "Undecoded error %u received from kernel", + errcode); +} diff --git a/lib/icmp.c b/lib/icmp.c new file mode 100644 index 0000000..c50be7e --- /dev/null +++ b/lib/icmp.c @@ -0,0 +1,81 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* STRNEQ */ +#include /* prototypes */ + +struct icmp_names { + const char *name; + uint8_t type, code; +}; + +static const struct icmp_names icmp_typecodes[] = { + { "echo-reply", 0, 0 }, + { "pong", 0, 0 }, + { "network-unreachable", 3, 0 }, + { "host-unreachable", 3, 1 }, + { "protocol-unreachable", 3, 2 }, + { "port-unreachable", 3, 3 }, + { "fragmentation-needed", 3, 4 }, + { "source-route-failed", 3, 5 }, + { "network-unknown", 3, 6 }, + { "host-unknown", 3, 7 }, + { "network-prohibited", 3, 9 }, + { "host-prohibited", 3, 10 }, + { "TOS-network-unreachable", 3, 11 }, + { "TOS-host-unreachable", 3, 12 }, + { "communication-prohibited", 3, 13 }, + { "host-precedence-violation", 3, 14 }, + { "precedence-cutoff", 3, 15 }, + { "source-quench", 4, 0 }, + { "network-redirect", 5, 0 }, + { "host-redirect", 5, 1 }, + { "TOS-network-redirect", 5, 2 }, + { "TOS-host-redirect", 5, 3 }, + { "echo-request", 8, 0 }, + { "ping", 8, 0 }, + { "router-advertisement", 9, 0 }, + { "router-solicitation", 10, 0 }, + { "ttl-zero-during-transit", 11, 0 }, + { "ttl-zero-during-reassembly", 11, 1 }, + { "ip-header-bad", 12, 0 }, + { "required-option-missing", 12, 1 }, + { "timestamp-request", 13, 0 }, + { "timestamp-reply", 14, 0 }, + { "address-mask-request", 17, 0 }, + { "address-mask-reply", 18, 0 }, +}; + +const char *id_to_icmp(uint8_t id) +{ + return id < ARRAY_SIZE(icmp_typecodes) ? icmp_typecodes[id].name : NULL; +} + +const char *icmp_to_name(uint8_t type, uint8_t code) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(icmp_typecodes); i++) + if (icmp_typecodes[i].type == type && + icmp_typecodes[i].code == code) + return icmp_typecodes[i].name; + + return NULL; +} + +int name_to_icmp(const char *str, uint16_t *typecode) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(icmp_typecodes); i++) + if (STRNCASEQ(icmp_typecodes[i].name, str, strlen(str))) { + *typecode = (icmp_typecodes[i].type << 8) | + icmp_typecodes[i].code; + return 0; + } + + return -1; +} diff --git a/lib/icmpv6.c b/lib/icmpv6.c new file mode 100644 index 0000000..82234da --- /dev/null +++ b/lib/icmpv6.c @@ -0,0 +1,69 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* STRNEQ */ +#include /* prototypes */ + +struct icmpv6_names { + const char *name; + uint8_t type, code; +}; + +static const struct icmpv6_names icmpv6_typecodes[] = { + { "no-route", 1, 0 }, + { "communication-prohibited", 1, 1 }, + { "address-unreachable", 1, 3 }, + { "port-unreachable", 1, 4 }, + { "packet-too-big", 2, 0 }, + { "ttl-zero-during-transit", 3, 0 }, + { "ttl-zero-during-reassembly", 3, 1 }, + { "bad-header", 4, 0 }, + { "unknown-header-type", 4, 1 }, + { "unknown-option", 4, 2 }, + { "echo-request", 128, 0 }, + { "ping", 128, 0 }, + { "echo-reply", 129, 0 }, + { "pong", 129, 0 }, + { "router-solicitation", 133, 0 }, + { "router-advertisement", 134, 0 }, + { "neighbour-solicitation", 135, 0 }, + { "neigbour-solicitation", 135, 0 }, + { "neighbour-advertisement", 136, 0 }, + { "neigbour-advertisement", 136, 0 }, + { "redirect", 137, 0 }, +}; + +const char *id_to_icmpv6(uint8_t id) +{ + return id < ARRAY_SIZE(icmpv6_typecodes) ? + icmpv6_typecodes[id].name : NULL; +} + +const char *icmpv6_to_name(uint8_t type, uint8_t code) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(icmpv6_typecodes); i++) + if (icmpv6_typecodes[i].type == type && + icmpv6_typecodes[i].code == code) + return icmpv6_typecodes[i].name; + + return NULL; +} + +int name_to_icmpv6(const char *str, uint16_t *typecode) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(icmpv6_typecodes); i++) + if (STRNCASEQ(icmpv6_typecodes[i].name, str, strlen(str))) { + *typecode = (icmpv6_typecodes[i].type << 8) | + icmpv6_typecodes[i].code; + return 0; + } + + return -1; +} diff --git a/lib/ipset.c b/lib/ipset.c new file mode 100644 index 0000000..4366e60 --- /dev/null +++ b/lib/ipset.c @@ -0,0 +1,1475 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include /* assert */ +#include /* isspace */ +#include /* errno */ +#include /* va_* */ +#include /* bool */ +#include /* printf */ +#include /* exit */ +#include /* str* */ + +#include + +#include /* D() */ +#include /* IPSET_CMD_* */ +#include /* id_to_icmp */ +#include /* id_to_icmpv6 */ +#include /* enum ipset_data */ +#include /* IPSET_*_ARG */ +#include /* ipset_envopt_parse */ +#include /* ipset_parse_family */ +#include /* ipset_print_family */ +#include /* STREQ */ +#include /* prototypes */ + +static char program_name[] = PACKAGE; +static char program_version[] = PACKAGE_VERSION; + +#define MAX_CMDLINE_CHARS 1024 +#define MAX_ARGS 32 + +/* The ipset structure */ +struct ipset { + ipset_custom_errorfn custom_error; + /* Custom error message function */ + ipset_standard_errorfn standard_error; + /* Standard error message function */ + struct ipset_session *session; /* Session */ + uint32_t restore_line; /* Restore lineno */ + bool interactive; /* "Interactive" CLI */ + bool full_io; /* Use session ios */ + bool no_vhi; /* No version/help/interactive */ + char cmdline[MAX_CMDLINE_CHARS]; /* For restore mode */ + char *newargv[MAX_ARGS]; + int newargc; + const char *filename; /* Input/output filename */ +}; + +/* Commands and environment options */ + +const struct ipset_commands ipset_commands[] = { + /* Order is important */ + + { /* c[reate], --create, n[ew], -N */ + .cmd = IPSET_CMD_CREATE, + .name = { "create", "new", "-N" }, + .has_arg = IPSET_MANDATORY_ARG2, + .help = "SETNAME TYPENAME [type-specific-options]\n" + " Create a new set", + }, + { /* a[dd], --add, -A */ + .cmd = IPSET_CMD_ADD, + .name = { "add", "-A", NULL }, + .has_arg = IPSET_MANDATORY_ARG2, + .help = "SETNAME ENTRY\n" + " Add entry to the named set", + }, + { /* d[el], --del, -D */ + .cmd = IPSET_CMD_DEL, + .name = { "del", "-D", NULL }, + .has_arg = IPSET_MANDATORY_ARG2, + .help = "SETNAME ENTRY\n" + " Delete entry from the named set", + }, + { /* t[est], --test, -T */ + .cmd = IPSET_CMD_TEST, + .name = { "test", "-T", NULL }, + .has_arg = IPSET_MANDATORY_ARG2, + .help = "SETNAME ENTRY\n" + " Test entry in the named set", + }, + { /* des[troy], --destroy, x, -X */ + .cmd = IPSET_CMD_DESTROY, + .name = { "destroy", "x", "-X" }, + .has_arg = IPSET_OPTIONAL_ARG, + .help = "[SETNAME]\n" + " Destroy a named set or all sets", + }, + { /* l[ist], --list, -L */ + .cmd = IPSET_CMD_LIST, + .name = { "list", "-L", NULL }, + .has_arg = IPSET_OPTIONAL_ARG, + .help = "[SETNAME]\n" + " List the entries of a named set or all sets", + }, + { /* s[save], --save, -S */ + .cmd = IPSET_CMD_SAVE, + .name = { "save", "-S", NULL }, + .has_arg = IPSET_OPTIONAL_ARG, + .help = "[SETNAME]\n" + " Save the named set or all sets to stdout", + }, + { /* r[estore], --restore, -R */ + .cmd = IPSET_CMD_RESTORE, + .name = { "restore", "-R", NULL }, + .has_arg = IPSET_NO_ARG, + .help = "\n" + " Restore a saved state", + }, + { /* f[lush], --flush, -F */ + .cmd = IPSET_CMD_FLUSH, + .name = { "flush", "-F", NULL }, + .has_arg = IPSET_OPTIONAL_ARG, + .help = "[SETNAME]\n" + " Flush a named set or all sets", + }, + { /* ren[ame], --rename, e, -E */ + .cmd = IPSET_CMD_RENAME, + .name = { "rename", "e", "-E" }, + .has_arg = IPSET_MANDATORY_ARG2, + .help = "FROM-SETNAME TO-SETNAME\n" + " Rename two sets", + }, + { /* sw[ap], --swap, w, -W */ + .cmd = IPSET_CMD_SWAP, + .name = { "swap", "w", "-W" }, + .has_arg = IPSET_MANDATORY_ARG2, + .help = "FROM-SETNAME TO-SETNAME\n" + " Swap the contect of two existing sets", + }, + { /* h[elp, --help, -H */ + .cmd = IPSET_CMD_HELP, + .name = { "help", "-h", "-H" }, + .has_arg = IPSET_OPTIONAL_ARG, + .help = "[TYPENAME]\n" + " Print help, and settype specific help", + }, + { /* v[ersion], --version, -V */ + .cmd = IPSET_CMD_VERSION, + .name = { "version", "-v", "-V" }, + .has_arg = IPSET_NO_ARG, + .help = "\n" + " Print version information", + }, + { /* q[uit] */ + .cmd = IPSET_CMD_QUIT, + .name = { "quit", NULL }, + .has_arg = IPSET_NO_ARG, + .help = "\n" + " Quit interactive mode", + }, + { }, +}; + +/** + * ipset_match_cmd - try to match as a prefix or letter-command + * @arg: possible command string + * @name: command and it's aliases + * + * Returns true if @arg is a known command. + */ +bool +ipset_match_cmd(const char *arg, const char * const name[]) +{ + size_t len, skip = 0; + int i; + + assert(arg); + assert(name && name[0]); + + /* Ignore two leading dashes */ + if (arg[0] == '-' && arg[1] == '-') + skip = 2; + + len = strlen(arg); + if (len <= skip || (len == 1 && arg[0] == '-')) + return false; + + for (i = 0; i < IPSET_CMD_ALIASES && name[i] != NULL; i++) { + /* New command name options */ + if (STRNEQ(arg + skip, name[i], len - skip)) + return true; + } + return false; +} + +/* Used up so far + * + * -A add + * -D del + * -E rename + * -f -file + * -F flush + * -h help + * -H help + * -L list + * -n -name + * -N create + * -o -output + * -r -resolve + * -R restore + * -s -sorted + * -S save + * -t -terse + * -T test + * -q -quiet + * -X destroy + * -v version + * -V version + * -W swap + * -! -exist + */ + +const struct ipset_envopts ipset_envopts[] = { + { .name = { "-o", "-output" }, + .has_arg = IPSET_MANDATORY_ARG, .flag = IPSET_OPT_MAX, + .parse = ipset_parse_output, + .help = "plain|save|xml\n" + " Specify output mode for listing sets.\n" + " Default value for \"list\" command is mode \"plain\"\n" + " and for \"save\" command is mode \"save\".", + }, + { .name = { "-s", "-sorted" }, + .parse = ipset_envopt_parse, + .has_arg = IPSET_NO_ARG, .flag = IPSET_ENV_SORTED, + .help = "\n" + " Print elements sorted (if supported by the set type).", + }, + { .name = { "-q", "-quiet" }, + .parse = ipset_envopt_parse, + .has_arg = IPSET_NO_ARG, .flag = IPSET_ENV_QUIET, + .help = "\n" + " Suppress any notice or warning message.", + }, + { .name = { "-r", "-resolve" }, + .parse = ipset_envopt_parse, + .has_arg = IPSET_NO_ARG, .flag = IPSET_ENV_RESOLVE, + .help = "\n" + " Try to resolve IP addresses in the output (slow!)", + }, + { .name = { "-!", "-exist" }, + .parse = ipset_envopt_parse, + .has_arg = IPSET_NO_ARG, .flag = IPSET_ENV_EXIST, + .help = "\n" + " Ignore errors when creating or adding sets or\n" + " elements that do exist or when deleting elements\n" + " that don't exist.", + }, + { .name = { "-n", "-name" }, + .parse = ipset_envopt_parse, + .has_arg = IPSET_NO_ARG, .flag = IPSET_ENV_LIST_SETNAME, + .help = "\n" + " When listing, just list setnames from the kernel.\n", + }, + { .name = { "-t", "-terse" }, + .parse = ipset_envopt_parse, + .has_arg = IPSET_NO_ARG, .flag = IPSET_ENV_LIST_HEADER, + .help = "\n" + " When listing, list setnames and set headers\n" + " from kernel only.", + }, + { .name = { "-f", "-file" }, + .parse = ipset_parse_filename, + .has_arg = IPSET_MANDATORY_ARG, .flag = IPSET_OPT_MAX, + .help = "\n" + " Read from the given file instead of standard\n" + " input (restore) or write to given file instead\n" + " of standard output (list/save).", + }, + { }, +}; + +/** + * ipset_match_option - strict option matching + * @arg: possible option string + * @name: known option and it's alias + * + * Two leading dashes are ignored. + * + * Returns true if @arg is a known option. + */ +bool +ipset_match_option(const char *arg, const char * const name[]) +{ + assert(arg); + assert(name && name[0]); + + /* Skip two leading dashes */ + if (arg[0] == '-' && arg[1] == '-') + arg++, arg++; + + return STREQ(arg, name[0]) || + (name[1] != NULL && STREQ(arg, name[1])); +} + +/** + * ipset_match_envopt - strict envopt matching + * @arg: possible envopt string + * @name: known envopt and it's alias + * + * One leading dash is ignored. + * + * Returns true if @arg is a known envopt. + */ +bool +ipset_match_envopt(const char *arg, const char * const name[]) +{ + assert(arg); + assert(name && name[0]); + + /* Skip one leading dash */ + if (arg[0] == '-' && arg[1] == '-') + arg++; + + return STREQ(arg, name[0]) || + (name[1] != NULL && STREQ(arg, name[1])); +} + +static void +ipset_shift_argv(int *argc, char *argv[], int from) +{ + int i; + + assert(*argc >= from + 1); + + for (i = from + 1; i <= *argc; i++) + argv[i-1] = argv[i]; + (*argc)--; + return; +} + +/** + * ipset_port_usage - prints the usage for the port parameter + * + * Print the usage for the port parameter to stdout. + */ +void +ipset_port_usage(void) +{ + int i; + const char *name; + + printf(" [PROTO:]PORT is a valid pattern of the following:\n" + " PORTNAME TCP port name from /etc/services\n" + " PORTNUMBER TCP port number identifier\n" + " tcp|sctp|udp|udplite:PORTNAME|PORTNUMBER\n" + " icmp:CODENAME supported ICMP codename\n" + " icmp:TYPE/CODE ICMP type/code value\n" + " icmpv6:CODENAME supported ICMPv6 codename\n" + " icmpv6:TYPE/CODE ICMPv6 type/code value\n" + " PROTO:0 all other protocols\n\n"); + + printf(" Supported ICMP codenames:\n"); + i = 0; + while ((name = id_to_icmp(i++)) != NULL) + printf(" %s\n", name); + printf(" Supported ICMPv6 codenames:\n"); + i = 0; + while ((name = id_to_icmpv6(i++)) != NULL) + printf(" %s\n", name); +} + +/** + * ipset_parse_filename - parse filename + * @ipset: ipset structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse filename of "-file" option, which can be used once only. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_filename(struct ipset *ipset, + int opt UNUSED, const char *str) +{ + void *p = ipset_session_printf_private(ipset->session); + + if (ipset->filename) + return ipset->custom_error(ipset, p, IPSET_PARAMETER_PROBLEM, + "-file option cannot be used when full io is activated"); + ipset->filename = str; + + return 0; +} + +/** + * ipset_parse_output - parse output format name + * @ipset: ipset structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse output format names and set session mode. + * The value is stored in the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_output(struct ipset *ipset, + int opt UNUSED, const char *str) +{ + struct ipset_session *session; + + assert(ipset); + assert(str); + + session = ipset_session(ipset); + if (STREQ(str, "plain")) + return ipset_session_output(session, IPSET_LIST_PLAIN); + else if (STREQ(str, "xml")) + return ipset_session_output(session, IPSET_LIST_XML); + else if (STREQ(str, "save")) + return ipset_session_output(session, IPSET_LIST_SAVE); + + return ipset_err(session, + "Syntax error: unknown output mode '%s'", str); +} + +/** + * ipset_envopt_parse - parse/set environment option + * @ipset: ipset structure + * @opt: environment option + * @arg: option argument (unused) + * + * Parse and set an environment option. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_envopt_parse(struct ipset *ipset, int opt, + const char *arg UNUSED) +{ + struct ipset_session *session; + assert(ipset); + + session = ipset_session(ipset); + switch (opt) { + case IPSET_ENV_SORTED: + case IPSET_ENV_QUIET: + case IPSET_ENV_RESOLVE: + case IPSET_ENV_EXIST: + case IPSET_ENV_LIST_SETNAME: + case IPSET_ENV_LIST_HEADER: + ipset_envopt_set(session, opt); + return 0; + default: + break; + } + return -1; +} + +static int __attribute__((format(printf, 4, 5))) +default_custom_error(struct ipset *ipset, void *p UNUSED, + int status, const char *msg, ...) +{ + struct ipset_session *session = ipset_session(ipset); + bool is_interactive = ipset_is_interactive(ipset); + bool quiet = !is_interactive && + session && + ipset_envopt_test(session, IPSET_ENV_QUIET); + + if (status && msg && !quiet) { + va_list args; + + fprintf(stderr, "%s v%s: ", program_name, program_version); + va_start(args, msg); + vfprintf(stderr, msg, args); + va_end(args); + if (status != IPSET_SESSION_PROBLEM) + fprintf(stderr, "\n"); + + if (status == IPSET_PARAMETER_PROBLEM) + fprintf(stderr, + "Try `%s help' for more information.\n", + program_name); + } + /* Ignore errors in interactive mode */ + if (status && is_interactive) { + if (session) + ipset_session_report_reset(session); + return -1; + } + + D("status: %u", status); + ipset_fini(ipset); + exit(status > IPSET_VERSION_PROBLEM ? IPSET_OTHER_PROBLEM : status); + /* Unreached */ + return -1; +} + +static int +default_standard_error(struct ipset *ipset, void *p) +{ + struct ipset_session *session = ipset_session(ipset); + bool is_interactive = ipset_is_interactive(ipset); + enum ipset_err_type err_type = ipset_session_report_type(session); + + if ((err_type == IPSET_WARNING || err_type == IPSET_NOTICE) && + !ipset_envopt_test(session, IPSET_ENV_QUIET)) + fprintf(stderr, "%s%s", + err_type == IPSET_WARNING ? "Warning: " : "", + ipset_session_report_msg(session)); + if (err_type == IPSET_ERROR) + return ipset->custom_error(ipset, p, + IPSET_SESSION_PROBLEM, "%s", + ipset_session_report_msg(session)); + + if (!is_interactive) { + ipset_fini(ipset); + /* Warnings are not errors */ + exit(err_type <= IPSET_WARNING ? 0 : IPSET_OTHER_PROBLEM); + } + + ipset_session_report_reset(session); + return -1; +} + +static void +default_help(void) +{ + const struct ipset_commands *c; + const struct ipset_envopts *opt = ipset_envopts; + + printf("%s v%s\n\n" + "Usage: %s [options] COMMAND\n\nCommands:\n", + program_name, program_version, program_name); + + for (c = ipset_commands; c->cmd; c++) + printf("%s %s\n", c->name[0], c->help); + printf("\nOptions:\n"); + + while (opt->flag) { + if (opt->help) + printf("%s %s\n", opt->name[0], opt->help); + opt++; + } +} + +static void +reset_argv(struct ipset *ipset) +{ + int i; + + /* Reset */ + for (i = 1; i < ipset->newargc; i++) { + if (ipset->newargv[i]) + free(ipset->newargv[i]); + ipset->newargv[i] = NULL; + } + ipset->newargc = 1; +} + +/* Build fake argv from parsed line */ +static int +build_argv(struct ipset *ipset, char *buffer) +{ + void *p = ipset_session_printf_private(ipset->session); + char *tmp, *arg; + int i; + bool quoted = false; + + reset_argv(ipset); + arg = calloc(strlen(buffer) + 1, sizeof(*buffer)); + if (!arg) + return ipset->custom_error(ipset, p, IPSET_OTHER_PROBLEM, + "Cannot allocate memory."); + for (tmp = buffer, i = 0; *tmp; tmp++) { + if ((ipset->newargc + 1) == + (int)(sizeof(ipset->newargv)/sizeof(char *))) { + free(arg); + return ipset->custom_error(ipset, + p, IPSET_PARAMETER_PROBLEM, + "Line is too long to parse."); + } + switch (*tmp) { + case '"': + quoted = !quoted; + if (*(tmp+1)) + continue; + break; + case ' ': + case '\r': + case '\n': + case '\t': + if (!quoted) + break; + arg[i++] = *tmp; + continue; + default: + arg[i++] = *tmp; + if (*(tmp+1)) + continue; + break; + } + if (!*(tmp+1) && quoted) { + free(arg); + return ipset->custom_error(ipset, + p, IPSET_PARAMETER_PROBLEM, + "Missing close quote!"); + } + if (!*arg) + continue; + ipset->newargv[ipset->newargc] = + calloc(strlen(arg) + 1, sizeof(*arg)); + if (!ipset->newargv[ipset->newargc]) { + free(arg); + return ipset->custom_error(ipset, + p, IPSET_OTHER_PROBLEM, + "Cannot allocate memory."); + } + ipset_strlcpy(ipset->newargv[ipset->newargc++], + arg, strlen(arg) + 1); + memset(arg, 0, strlen(arg) + 1); + i = 0; + } + + free(arg); + return 0; +} + +static int +restore(struct ipset *ipset) +{ + struct ipset_session *session = ipset_session(ipset); + int ret = 0; + FILE *f = stdin; /* Default from stdin */ + + if (ipset->filename) { + ret = ipset_session_io_normal(session, ipset->filename, + IPSET_IO_INPUT); + if (ret < 0) + return ret; + f = ipset_session_io_stream(session, IPSET_IO_INPUT); + } + return ipset_parse_stream(ipset, f); +} + +static bool do_parse(const struct ipset_arg *arg, bool family) +{ + return !((family == true) ^ (arg->opt == IPSET_OPT_FAMILY)); +} + +static int +call_parser(struct ipset *ipset, int *argc, char *argv[], + const struct ipset_type *type, enum ipset_adt cmd, bool family) +{ + void *p = ipset_session_printf_private(ipset->session); + const struct ipset_arg *arg; + const char *optstr; + const struct ipset_type *t = type; + uint8_t revision = type->revision; + int ret = 0, i = 1, j; + + /* Currently CREATE and ADT may have got additional arguments */ + if (type->cmd[cmd].args[0] == IPSET_ARG_NONE && *argc > 1) + return ipset->custom_error(ipset, + p, IPSET_PARAMETER_PROBLEM, + "Unknown argument: `%s'", argv[i]); + + while (*argc > i) { + ret = -1; + for (j = 0; type->cmd[cmd].args[j] != IPSET_ARG_NONE; j++) { + arg = ipset_keyword(type->cmd[cmd].args[j]); + D("argc: %u, %s vs %s", i, argv[i], arg->name[0]); + if (!(ipset_match_option(argv[i], arg->name))) + continue; + + optstr = argv[i]; + /* Matched option */ + D("match %s, argc %u, i %u, %s", + arg->name[0], *argc, i + 1, + do_parse(arg, family) ? "parse" : "skip"); + i++; + ret = 0; + switch (arg->has_arg) { + case IPSET_MANDATORY_ARG: + if (*argc - i < 1) + return ipset->custom_error(ipset, p, + IPSET_PARAMETER_PROBLEM, + "Missing mandatory argument " + "of option `%s'", + arg->name[0]); + /* Fall through */ + case IPSET_OPTIONAL_ARG: + if (*argc - i >= 1) { + if (do_parse(arg, family)) { + ret = ipset_call_parser( + ipset->session, + arg, argv[i]); + if (ret < 0) + return ret; + } + i++; + break; + } + /* Fall through */ + default: + if (do_parse(arg, family)) { + ret = ipset_call_parser( + ipset->session, arg, optstr); + if (ret < 0) + return ret; + } + } + break; + } + if (ret < 0) + goto err_unknown; + } + if (!family) + *argc = 0; + return ret; + +err_unknown: + while ((type = ipset_type_higher_rev(t)) != t) { + for (j = 0; type->cmd[cmd].args[j] != IPSET_ARG_NONE; j++) { + arg = ipset_keyword(type->cmd[cmd].args[j]); + D("argc: %u, %s vs %s", i, argv[i], arg->name[0]); + if (ipset_match_option(argv[i], arg->name)) + return ipset->custom_error(ipset, p, + IPSET_PARAMETER_PROBLEM, + "Argument `%s' is supported in the kernel module " + "of the set type %s starting from the revision %u " + "and you have installed revision %u only. " + "Your kernel is behind your ipset utility.", + argv[i], type->name, + type->revision, revision); + } + t = type; + } + return ipset->custom_error(ipset, p, IPSET_PARAMETER_PROBLEM, + "Unknown argument: `%s'", argv[i]); +} + +static enum ipset_adt +cmd2cmd(int cmd) +{ + switch (cmd) { + case IPSET_CMD_ADD: + return IPSET_ADD; + case IPSET_CMD_DEL: + return IPSET_DEL; + case IPSET_CMD_TEST: + return IPSET_TEST; + case IPSET_CMD_CREATE: + return IPSET_CREATE; + default: + return 0; + } +} + +static void +check_mandatory(struct ipset *ipset, + const struct ipset_type *type, enum ipset_cmd command) +{ + enum ipset_adt cmd = cmd2cmd(command); + struct ipset_session *session = ipset->session; + void *p = ipset_session_printf_private(session); + uint64_t flags = ipset_data_flags(ipset_session_data(session)); + uint64_t mandatory = type->cmd[cmd].need; + const struct ipset_arg *arg; + int i; + + /* Range can be expressed by ip/cidr */ + if (flags & IPSET_FLAG(IPSET_OPT_CIDR)) + flags |= IPSET_FLAG(IPSET_OPT_IP_TO); + + mandatory &= ~flags; + if (!mandatory) + return; + if (type->cmd[cmd].args[0] == IPSET_ARG_NONE) { + ipset->custom_error(ipset, p, IPSET_OTHER_PROBLEM, + "There are missing mandatory flags " + "but can't check them. " + "It's a bug, please report the problem."); + return; + } + + for (i = 0; type->cmd[cmd].args[i] != IPSET_ARG_NONE; i++) { + arg = ipset_keyword(type->cmd[cmd].args[i]); + if (mandatory & IPSET_FLAG(arg->opt)) { + ipset->custom_error(ipset, p, IPSET_PARAMETER_PROBLEM, + "Mandatory option `%s' is missing", + arg->name[0]); + return; + } + } +} + +static const char * +cmd2name(enum ipset_cmd cmd) +{ + const struct ipset_commands *c; + + for (c = ipset_commands; c->cmd; c++) + if (cmd == c->cmd) + return c->name[0]; + return "unknown command"; +} + +static const char * +session_family(struct ipset_session *session) +{ + switch (ipset_data_family(ipset_session_data(session))) { + case NFPROTO_IPV4: + return "inet"; + case NFPROTO_IPV6: + return "inet6"; + default: + return "unspec"; + } +} + +static void +check_allowed(struct ipset *ipset, + const struct ipset_type *type, enum ipset_cmd command) +{ + struct ipset_session *session = ipset->session; + void *p = ipset_session_printf_private(session); + uint64_t flags = ipset_data_flags(ipset_session_data(session)); + enum ipset_adt cmd = cmd2cmd(command); + uint64_t allowed = type->cmd[cmd].full; + uint64_t cmdflags = command == IPSET_CMD_CREATE + ? IPSET_CREATE_FLAGS : IPSET_ADT_FLAGS; + const struct ipset_arg *arg; + enum ipset_opt i; + int j; + + /* Range can be expressed by ip/cidr or from-to */ + if (allowed & IPSET_FLAG(IPSET_OPT_IP_TO)) + allowed |= IPSET_FLAG(IPSET_OPT_CIDR); + + for (i = IPSET_OPT_IP; i < IPSET_OPT_FLAGS; i++) { + if (!(cmdflags & IPSET_FLAG(i)) || + (allowed & IPSET_FLAG(i)) || + !(flags & IPSET_FLAG(i))) + continue; + /* Not allowed element-expressions */ + switch (i) { + case IPSET_OPT_CIDR: + ipset->custom_error(ipset, p, IPSET_OTHER_PROBLEM, + "IP/CIDR range is not allowed in command %s " + "with set type %s and family %s", + cmd2name(command), type->name, + session_family(ipset->session)); + return; + case IPSET_OPT_IP_TO: + ipset->custom_error(ipset, p, IPSET_OTHER_PROBLEM, + "FROM-TO IP range is not allowed in command %s " + "with set type %s and family %s", + cmd2name(command), type->name, + session_family(ipset->session)); + return; + case IPSET_OPT_PORT_TO: + ipset->custom_error(ipset, p, IPSET_OTHER_PROBLEM, + "FROM-TO port range is not allowed in command %s " + "with set type %s and family %s", + cmd2name(command), type->name, + session_family(ipset->session)); + return; + default: + break; + } + /* Other options */ + if (type->cmd[cmd].args[0] == IPSET_ARG_NONE) { + ipset->custom_error(ipset, p, IPSET_OTHER_PROBLEM, + "There are not allowed options (%u) " + "but option list is empty. " + "It's a bug, please report the problem.", i); + return; + } + for (j = 0; type->cmd[cmd].args[j] != IPSET_ARG_NONE; j++) { + arg = ipset_keyword(type->cmd[cmd].args[j]); + if (arg->opt != i) + continue; + ipset->custom_error(ipset, p, IPSET_OTHER_PROBLEM, + "%s parameter is not allowed in command %s " + "with set type %s and family %s", + arg->name[0], + cmd2name(command), type->name, + session_family(ipset->session)); + return; + } + ipset->custom_error(ipset, p, IPSET_OTHER_PROBLEM, + "There are not allowed options (%u) " + "but can't resolve them. " + "It's a bug, please report the problem.", i); + return; + } +} + +static const struct ipset_type * +type_find(const char *name) +{ + const struct ipset_type *t = ipset_types(); + + while (t) { + if (ipset_match_typename(name, t)) + return t; + t = t->next; + } + return NULL; +} + +static enum ipset_adt cmd_help_order[] = { + IPSET_CREATE, + IPSET_ADD, + IPSET_DEL, + IPSET_TEST, + IPSET_CADT_MAX, +}; + +static const char *cmd_prefix[] = { + [IPSET_CREATE] = "create SETNAME", + [IPSET_ADD] = "add SETNAME", + [IPSET_DEL] = "del SETNAME", + [IPSET_TEST] = "test SETNAME", +}; + +/* Workhorses */ + +/** + * ipset_parse_argv - parse and argv array and execute the command + * @ipset: ipset structure + * @argc: length of the array + * @argv: array of strings + * + * Parse an array of strings and execute the ipset command. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_argv(struct ipset *ipset, int oargc, char *oargv[]) +{ + int ret = 0; + enum ipset_cmd cmd = IPSET_CMD_NONE; + int i; + char *arg0 = NULL, *arg1 = NULL; + const struct ipset_envopts *opt; + const struct ipset_commands *command; + const struct ipset_type *type; + struct ipset_session *session = ipset->session; + void *p = ipset_session_printf_private(session); + int argc = oargc; + char *argv[MAX_ARGS] = {}; + + /* We need a local copy because of ipset_shift_argv */ + memcpy(argv, oargv, sizeof(char *) * argc); + + /* Set session lineno to report parser errors correctly */ + ipset_session_lineno(session, ipset->restore_line); + + /* Commandline parsing, somewhat similar to that of 'ip' */ + + /* First: parse core options */ + for (opt = ipset_envopts; opt->flag; opt++) { + for (i = 1; i < argc; ) { + if (!ipset_match_envopt(argv[i], opt->name)) { + i++; + continue; + } + /* Shift off matched option */ + ipset_shift_argv(&argc, argv, i); + switch (opt->has_arg) { + case IPSET_MANDATORY_ARG: + if (i + 1 > argc) + return ipset->custom_error(ipset, p, + IPSET_PARAMETER_PROBLEM, + "Missing mandatory argument " + "to option %s", + opt->name[0]); + /* Fall through */ + case IPSET_OPTIONAL_ARG: + if (i + 1 <= argc) { + ret = opt->parse(ipset, opt->flag, + argv[i]); + if (ret < 0) + return ipset->standard_error(ipset, p); + ipset_shift_argv(&argc, argv, i); + } + break; + case IPSET_NO_ARG: + ret = opt->parse(ipset, opt->flag, + opt->name[0]); + if (ret < 0) + return ipset->standard_error(ipset, p); + break; + default: + break; + } + } + } + + /* Second: parse command */ + for (command = ipset_commands; + argc > 1 && command->cmd && cmd == IPSET_CMD_NONE; + command++) { + if (!ipset_match_cmd(argv[1], command->name)) + continue; + + if (ipset->restore_line != 0 && + (command->cmd == IPSET_CMD_RESTORE || + command->cmd == IPSET_CMD_VERSION || + command->cmd == IPSET_CMD_HELP)) + return ipset->custom_error(ipset, p, + IPSET_PARAMETER_PROBLEM, + "Command `%s' is invalid " + "in restore mode.", + command->name[0]); + if (ipset->interactive && command->cmd == IPSET_CMD_RESTORE) { + printf("Restore command is not supported " + "in interactive mode\n"); + return 0; + } + + /* Shift off matched command arg */ + ipset_shift_argv(&argc, argv, 1); + cmd = command->cmd; + switch (command->has_arg) { + case IPSET_MANDATORY_ARG: + case IPSET_MANDATORY_ARG2: + if (argc < 2) + return ipset->custom_error(ipset, p, + IPSET_PARAMETER_PROBLEM, + "Missing mandatory argument " + "to command %s", + command->name[0]); + /* Fall through */ + case IPSET_OPTIONAL_ARG: + arg0 = argv[1]; + if (argc >= 2) + /* Shift off first arg */ + ipset_shift_argv(&argc, argv, 1); + break; + default: + break; + } + if (command->has_arg == IPSET_MANDATORY_ARG2) { + if (argc < 2) + return ipset->custom_error(ipset, p, + IPSET_PARAMETER_PROBLEM, + "Missing second mandatory " + "argument to command %s", + command->name[0]); + arg1 = argv[1]; + /* Shift off second arg */ + ipset_shift_argv(&argc, argv, 1); + } + break; + } + + /* Third: catch interactive mode, handle help, version */ + switch (cmd) { + case IPSET_CMD_NONE: + if (ipset->interactive) { + printf("No command specified\n"); + if (session) + ipset_envopt_parse(ipset, 0, "reset"); + return 0; + } + if (argc > 1 && STREQ(argv[1], "-")) { + if (ipset->no_vhi) + return 0; + ipset->interactive = true; + printf("%s> ", program_name); + while (fgets(ipset->cmdline, + sizeof(ipset->cmdline), stdin)) { + /* Execute line: ignore soft errors */ + if (ipset_parse_line(ipset, ipset->cmdline) < 0) + ipset->standard_error(ipset, p); + printf("%s> ", program_name); + } + return ipset->custom_error(ipset, p, + IPSET_NO_PROBLEM, NULL); + } + if (argc > 1) + return ipset->custom_error(ipset, + p, IPSET_PARAMETER_PROBLEM, + "No command specified: unknown argument %s", + argv[1]); + return ipset->custom_error(ipset, p, IPSET_PARAMETER_PROBLEM, + "No command specified."); + case IPSET_CMD_VERSION: + if (ipset->no_vhi) + return 0; + printf("%s v%s, protocol version: %u\n", + program_name, program_version, IPSET_PROTOCOL); + /* Check kernel protocol version */ + ipset_cmd(session, IPSET_CMD_NONE, 0); + if (ipset_session_report_type(session) != IPSET_NO_ERROR) + ipset->standard_error(ipset, p); + if (ipset->interactive) + return 0; + return ipset->custom_error(ipset, p, IPSET_NO_PROBLEM, NULL); + case IPSET_CMD_HELP: + if (ipset->no_vhi) + return 0; + default_help(); + + if (ipset->interactive || + !ipset_envopt_test(session, IPSET_ENV_QUIET)) { + if (arg0) { + const struct ipset_arg *arg; + int k; + + /* Type-specific help, without kernel checking */ + type = type_find(arg0); + if (!type) + return ipset->custom_error(ipset, p, + IPSET_PARAMETER_PROBLEM, + "Unknown settype: `%s'", arg0); + printf("\n%s type specific options:\n\n", type->name); + for (i = 0; cmd_help_order[i] != IPSET_CADT_MAX; i++) { + cmd = cmd_help_order[i]; + printf("%s %s %s\n", + cmd_prefix[cmd], type->name, type->cmd[cmd].help); + for (k = 0; type->cmd[cmd].args[k] != IPSET_ARG_NONE; k++) { + arg = ipset_keyword(type->cmd[cmd].args[k]); + if (!arg->help || arg->help[0] == '\0') + continue; + printf(" %s\n", arg->help); + } + } + printf("\n%s\n", type->usage); + if (type->usagefn) + type->usagefn(); + if (type->family == NFPROTO_UNSPEC) + printf("\nType %s is family neutral.\n", + type->name); + else if (type->family == NFPROTO_IPSET_IPV46) + printf("\nType %s supports inet " + "and inet6.\n", + type->name); + else + printf("\nType %s supports family " + "%s only.\n", + type->name, + type->family == NFPROTO_IPV4 + ? "inet" : "inet6"); + } else { + printf("\nSupported set types:\n"); + type = ipset_types(); + while (type) { + printf(" %s\t%s%u\t%s\n", + type->name, + strlen(type->name) < 12 ? "\t" : "", + type->revision, + type->description); + type = type->next; + } + } + } + if (ipset->interactive) + return 0; + return ipset->custom_error(ipset, p, IPSET_NO_PROBLEM, NULL); + case IPSET_CMD_QUIT: + return ipset->custom_error(ipset, p, IPSET_NO_PROBLEM, NULL); + default: + break; + } + + /* Forth: parse command args and issue the command */ + switch (cmd) { + case IPSET_CMD_CREATE: + /* Args: setname typename [type specific options] */ + ret = ipset_parse_setname(session, IPSET_SETNAME, arg0); + if (ret < 0) + return ipset->standard_error(ipset, p); + + ret = ipset_parse_typename(session, IPSET_OPT_TYPENAME, arg1); + if (ret < 0) + return ipset->standard_error(ipset, p); + + type = ipset_type_get(session, cmd); + if (type == NULL) + return ipset->standard_error(ipset, p); + + /* Parse create options: first check INET family */ + ret = call_parser(ipset, &argc, argv, type, IPSET_CREATE, true); + if (ret < 0) + return ipset->standard_error(ipset, p); + else if (ret) + return ret; + + /* Parse create options: then check all options */ + ret = call_parser(ipset, &argc, argv, type, IPSET_CREATE, false); + if (ret < 0) + return ipset->standard_error(ipset, p); + else if (ret) + return ret; + + /* Check mandatory, then allowed options */ + check_mandatory(ipset, type, cmd); + check_allowed(ipset, type, cmd); + + break; + case IPSET_CMD_LIST: + case IPSET_CMD_SAVE: + if (ipset->filename != NULL) { + ret = ipset_session_io_normal(session, + ipset->filename, IPSET_IO_OUTPUT); + if (ret < 0) + return ret; + } + /* Fall through to parse optional setname */ + case IPSET_CMD_DESTROY: + case IPSET_CMD_FLUSH: + /* Args: [setname] */ + if (arg0) { + ret = ipset_parse_setname(session, + IPSET_SETNAME, arg0); + if (ret < 0) + return ipset->standard_error(ipset, p); + } + break; + + case IPSET_CMD_RENAME: + case IPSET_CMD_SWAP: + /* Args: from-setname to-setname */ + ret = ipset_parse_setname(session, IPSET_SETNAME, arg0); + if (ret < 0) + return ipset->standard_error(ipset, p); + ret = ipset_parse_setname(session, IPSET_OPT_SETNAME2, arg1); + if (ret < 0) + return ipset->standard_error(ipset, p); + break; + + case IPSET_CMD_RESTORE: + /* Restore mode */ + if (argc > 1) + return ipset->custom_error(ipset, + p, IPSET_PARAMETER_PROBLEM, + "Unknown argument %s", argv[1]); + return restore(ipset); + case IPSET_CMD_ADD: + case IPSET_CMD_DEL: + case IPSET_CMD_TEST: + D("ADT: setname %s", arg0); + /* Args: setname ip [options] */ + ret = ipset_parse_setname(session, IPSET_SETNAME, arg0); + if (ret < 0) + return ipset->standard_error(ipset, p); + + type = ipset_type_get(session, cmd); + if (type == NULL) + return ipset->standard_error(ipset, p); + + ret = ipset_parse_elem(session, type->last_elem_optional, arg1); + if (ret < 0) + return ipset->standard_error(ipset, p); + + /* Parse additional ADT options */ + ret = call_parser(ipset, &argc, argv, type, cmd2cmd(cmd), false); + if (ret < 0) + return ipset->standard_error(ipset, p); + else if (ret) + return ret; + + /* Check mandatory, then allowed options */ + check_mandatory(ipset, type, cmd); + check_allowed(ipset, type, cmd); + + break; + default: + break; + } + + if (argc > 1) + return ipset->custom_error(ipset, p, IPSET_PARAMETER_PROBLEM, + "Unknown argument %s", argv[1]); + ret = ipset_cmd(session, cmd, ipset->restore_line); + D("ret %d", ret); + /* In the case of warning, the return code is success */ + if (ret < 0 || ipset_session_report_type(session) > IPSET_NO_ERROR) + ipset->standard_error(ipset, p); + + return ret; +} + +/** + * ipset_parse_line - parse a string as a command line and execute it + * @ipset: ipset structure + * @line: string of line + * + * Parse a string as a command line and execute the ipset command. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_line(struct ipset *ipset, char *line) +{ + char *c = line; + int ret; + + reset_argv(ipset); + + while (isspace(c[0])) + c++; + if (c[0] == '\0' || c[0] == '#') { + if (ipset->interactive) + printf("%s> ", program_name); + return 0; + } + /* Build fake argv, argc */ + ret = build_argv(ipset, c); + if (ret < 0) + return ret; + /* Parse and execute line */ + return ipset_parse_argv(ipset, ipset->newargc, ipset->newargv); +} + +/** + * ipset_parse_stream - parse an stream and execute the commands + * @ipset: ipset structure + * @f: stream + * + * Parse an already opened file as stream and execute the commands. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_stream(struct ipset *ipset, FILE *f) +{ + struct ipset_session *session = ipset_session(ipset); + void *p = ipset_session_printf_private(session); + int ret = 0; + char *c; + + while (fgets(ipset->cmdline, sizeof(ipset->cmdline), f)) { + ipset->restore_line++; + c = ipset->cmdline; + while (isspace(c[0])) + c++; + if (c[0] == '\0' || c[0] == '#') + continue; + else if (STREQ(c, "COMMIT\n") || STREQ(c, "COMMIT\r\n")) { + ret = ipset_commit(ipset->session); + if (ret < 0) + ipset->standard_error(ipset, p); + continue; + } + /* Build faked argv, argc */ + ret = build_argv(ipset, c); + if (ret < 0) + return ret; + + /* Execute line */ + ret = ipset_parse_argv(ipset, ipset->newargc, ipset->newargv); + if (ret < 0) + ipset->standard_error(ipset, p); + } + /* implicit "COMMIT" at EOF */ + ret = ipset_commit(ipset->session); + if (ret < 0) + ipset->standard_error(ipset, p); + + return ret; +} + +/** + * ipset_session - returns the session pointer of an ipset structure + * @ipset: ipset structure + * + * Returns the session pointer of an ipset structure. + */ +struct ipset_session * +ipset_session(struct ipset *ipset) +{ + return ipset->session; +} + +/** + * ipset_is_interactive - is the interactive mode enabled? + * @ipset: ipset structure + * + * Returns true if the interactive mode is enabled. + */ +bool +ipset_is_interactive(struct ipset *ipset) +{ + return ipset->interactive; +} + +/** + * ipset_custom_printf - set custom print functions + * @ipset: ipset structure + * @custom_error: custom error function + * @standard_error: standard error function + * @print_outfn: output/printing function + * @p: pointer to private data area + * + * The function makes possible to set custom error and + * output functions for the library. The private data + * pointer can be used to pass arbitrary data to these functions. + * If a function argument is NULL, the default printing function is set. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_custom_printf(struct ipset *ipset, + ipset_custom_errorfn custom_error, + ipset_standard_errorfn standard_error, + ipset_print_outfn print_outfn, + void *p) +{ + ipset->no_vhi = !!(custom_error || standard_error || print_outfn); + ipset->custom_error = + custom_error ? custom_error : default_custom_error; + ipset->standard_error = + standard_error ? standard_error : default_standard_error; + + return ipset_session_print_outfn(ipset->session, print_outfn, p); +} + +/** + * ipset_init - initialize ipset library interface + * + * Initialize the ipset library interface. + * + * Returns the created ipset structure for success or NULL for failure. + */ +struct ipset * +ipset_init(void) +{ + struct ipset *ipset; + + ipset = calloc(1, sizeof(struct ipset)); + if (ipset == NULL) + return NULL; + ipset->newargv[0] = + calloc(strlen(program_name) + 1, sizeof(*program_name)); + if (!ipset->newargv[0]) { + free(ipset); + return NULL; + } + ipset_strlcpy(ipset->newargv[0], program_name, + strlen(program_name) + 1); + ipset->newargc = 1; + ipset->session = ipset_session_init(NULL, NULL); + if (ipset->session == NULL) { + free(ipset->newargv[0]); + free(ipset); + return NULL; + } + ipset_custom_printf(ipset, NULL, NULL, NULL, NULL); + return ipset; +} + +/** + * ipset_fini - destroy an ipset library interface + * @ipset: ipset structure + * + * Destroys an ipset library interface + * + * Returns 0 on success or a negative error code. + */ +int +ipset_fini(struct ipset *ipset) +{ + assert(ipset); + + if (ipset->session) + ipset_session_fini(ipset->session); + reset_argv(ipset); + if (ipset->newargv[0]) + free(ipset->newargv[0]); + + free(ipset); + return 0; +} diff --git a/lib/ipset_bitmap_ip.c b/lib/ipset_bitmap_ip.c new file mode 100644 index 0000000..10dc3ae --- /dev/null +++ b/lib/ipset_bitmap_ip.c @@ -0,0 +1,296 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* IPSET_OPT_* */ +#include /* parser functions */ +#include /* printing functions */ +#include /* prototypes */ + +/* Initial release */ +static struct ipset_type ipset_bitmap_ip0 = { + .name = "bitmap:ip", + .alias = { "ipmap", NULL }, + .revision = 0, + .family = NFPROTO_IPV4, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_IPRANGE, + IPSET_ARG_NETMASK, + IPSET_ARG_TIMEOUT, + /* Backward compatibility */ + IPSET_ARG_FROM_IP, + IPSET_ARG_TO_IP, + IPSET_ARG_NETWORK, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "range IP/CIDR|FROM-TO", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP|IP/CIDR|FROM-TO", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP|IP/CIDR|FROM-TO", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP), + .help = "IP", + }, + }, + .usage = "where IP, FROM and TO are IPv4 addresses (or hostnames),\n" + " CIDR is a valid IPv4 CIDR prefix.", + .description = "Initial revision", +}; + +/* Counters support */ +static struct ipset_type ipset_bitmap_ip1 = { + .name = "bitmap:ip", + .alias = { "ipmap", NULL }, + .revision = 1, + .family = NFPROTO_IPV4, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_IPRANGE, + IPSET_ARG_NETMASK, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + /* Backward compatibility */ + IPSET_ARG_FROM_IP, + IPSET_ARG_TO_IP, + IPSET_ARG_NETWORK, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "range IP/CIDR|FROM-TO", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP|IP/CIDR|FROM-TO", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP|IP/CIDR|FROM-TO", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP), + .help = "IP", + }, + }, + .usage = "where IP, FROM and TO are IPv4 addresses (or hostnames),\n" + " CIDR is a valid IPv4 CIDR prefix.", + .description = "counters support", +}; + +/* Comment support */ +static struct ipset_type ipset_bitmap_ip2 = { + .name = "bitmap:ip", + .alias = { "ipmap", NULL }, + .revision = 2, + .family = NFPROTO_IPV4, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_IPRANGE, + IPSET_ARG_NETMASK, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + /* Backward compatibility */ + IPSET_ARG_FROM_IP, + IPSET_ARG_TO_IP, + IPSET_ARG_NETWORK, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "range IP/CIDR|FROM-TO", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP|IP/CIDR|FROM-TO", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP|IP/CIDR|FROM-TO", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP), + .help = "IP", + }, + }, + .usage = "where IP, FROM and TO are IPv4 addresses (or hostnames),\n" + " CIDR is a valid IPv4 CIDR prefix.", + .description = "comment support", +}; + +/* skbinfo support */ +static struct ipset_type ipset_bitmap_ip3 = { + .name = "bitmap:ip", + .alias = { "ipmap", NULL }, + .revision = 3, + .family = NFPROTO_IPV4, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_IPRANGE, + IPSET_ARG_NETMASK, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_SKBINFO, + /* Backward compatibility */ + IPSET_ARG_FROM_IP, + IPSET_ARG_TO_IP, + IPSET_ARG_NETWORK, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "range IP/CIDR|FROM-TO", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_SKBMARK, + IPSET_ARG_SKBPRIO, + IPSET_ARG_SKBQUEUE, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP|IP/CIDR|FROM-TO", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP|IP/CIDR|FROM-TO", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP), + .help = "IP", + }, + }, + .usage = "where IP, FROM and TO are IPv4 addresses (or hostnames),\n" + " CIDR is a valid IPv4 CIDR prefix.", + .description = "skbinfo support", +}; + +void _init(void); +void _init(void) +{ + ipset_type_add(&ipset_bitmap_ip0); + ipset_type_add(&ipset_bitmap_ip1); + ipset_type_add(&ipset_bitmap_ip2); + ipset_type_add(&ipset_bitmap_ip3); +} diff --git a/lib/ipset_bitmap_ipmac.c b/lib/ipset_bitmap_ipmac.c new file mode 100644 index 0000000..e26cc69 --- /dev/null +++ b/lib/ipset_bitmap_ipmac.c @@ -0,0 +1,324 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* IPSET_OPT_* */ +#include /* parser functions */ +#include /* printing functions */ +#include /* prototypes */ + +/* Initial release */ +static struct ipset_type ipset_bitmap_ipmac0 = { + .name = "bitmap:ip,mac", + .alias = { "macipmap", NULL }, + .revision = 0, + .family = NFPROTO_IPV4, + .dimension = IPSET_DIM_TWO, + .last_elem_optional = true, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_single_ip, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_ether, + .print = ipset_print_ether, + .opt = IPSET_OPT_ETHER + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_IPRANGE, + IPSET_ARG_TIMEOUT, + /* Backward compatibility */ + IPSET_ARG_FROM_IP, + IPSET_ARG_TO_IP, + IPSET_ARG_NETWORK, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "range IP/CIDR|FROM-TO", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .help = "IP[,MAC]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .help = "IP[,MAC]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .help = "IP[,MAC]", + }, + }, + .usage = "where IP, FROM and TO are IPv4 addresses (or hostnames),\n" + " CIDR is a valid IPv4 CIDR prefix.\n" + " MAC is a valid MAC address.", + .description = "Initial revision", +}; + +/* Counters support */ +static struct ipset_type ipset_bitmap_ipmac1 = { + .name = "bitmap:ip,mac", + .alias = { "macipmap", NULL }, + .revision = 1, + .family = NFPROTO_IPV4, + .dimension = IPSET_DIM_TWO, + .last_elem_optional = true, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_single_ip, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_ether, + .print = ipset_print_ether, + .opt = IPSET_OPT_ETHER + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_IPRANGE, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + /* Backward compatibility */ + IPSET_ARG_FROM_IP, + IPSET_ARG_TO_IP, + IPSET_ARG_NETWORK, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "range IP/CIDR|FROM-TO", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .help = "IP[,MAC]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .help = "IP[,MAC]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .help = "IP[,MAC]", + }, + }, + .usage = "where IP, FROM and TO are IPv4 addresses (or hostnames),\n" + " CIDR is a valid IPv4 CIDR prefix.\n" + " MAC is a valid MAC address.", + .description = "counters support", +}; + +/* Comment support */ +static struct ipset_type ipset_bitmap_ipmac2 = { + .name = "bitmap:ip,mac", + .alias = { "macipmap", NULL }, + .revision = 2, + .family = NFPROTO_IPV4, + .dimension = IPSET_DIM_TWO, + .last_elem_optional = true, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_single_ip, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_ether, + .print = ipset_print_ether, + .opt = IPSET_OPT_ETHER + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_IPRANGE, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + /* Backward compatibility */ + IPSET_ARG_FROM_IP, + IPSET_ARG_TO_IP, + IPSET_ARG_NETWORK, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "range IP/CIDR|FROM-TO", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .help = "IP[,MAC]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .help = "IP[,MAC]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .help = "IP[,MAC]", + }, + }, + .usage = "where IP, FROM and TO are IPv4 addresses (or hostnames),\n" + " CIDR is a valid IPv4 CIDR prefix.\n" + " MAC is a valid MAC address.", + .description = "comment support", +}; + +/* skbinfo support */ +static struct ipset_type ipset_bitmap_ipmac3 = { + .name = "bitmap:ip,mac", + .alias = { "macipmap", NULL }, + .revision = 3, + .family = NFPROTO_IPV4, + .dimension = IPSET_DIM_TWO, + .last_elem_optional = true, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_single_ip, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_ether, + .print = ipset_print_ether, + .opt = IPSET_OPT_ETHER + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_IPRANGE, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_SKBINFO, + /* Backward compatibility */ + IPSET_ARG_FROM_IP, + IPSET_ARG_TO_IP, + IPSET_ARG_NETWORK, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "range IP/CIDR|FROM-TO", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_SKBMARK, + IPSET_ARG_SKBPRIO, + IPSET_ARG_SKBQUEUE, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .help = "IP[,MAC]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .help = "IP[,MAC]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .help = "IP[,MAC]", + }, + }, + .usage = "where IP, FROM and TO are IPv4 addresses (or hostnames),\n" + " CIDR is a valid IPv4 CIDR prefix.\n" + " MAC is a valid MAC address.", + .description = "skbinfo support", +}; + +void _init(void); +void _init(void) +{ + ipset_type_add(&ipset_bitmap_ipmac0); + ipset_type_add(&ipset_bitmap_ipmac1); + ipset_type_add(&ipset_bitmap_ipmac2); + ipset_type_add(&ipset_bitmap_ipmac3); +} diff --git a/lib/ipset_bitmap_port.c b/lib/ipset_bitmap_port.c new file mode 100644 index 0000000..cbffdd1 --- /dev/null +++ b/lib/ipset_bitmap_port.c @@ -0,0 +1,292 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* IPSET_OPT_* */ +#include /* parser functions */ +#include /* printing functions */ +#include /* prototypes */ + +/* Initial release */ +static struct ipset_type ipset_bitmap_port0 = { + .name = "bitmap:port", + .alias = { "portmap", NULL }, + .revision = 0, + .family = NFPROTO_UNSPEC, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_tcp_udp_port, + .print = ipset_print_port, + .opt = IPSET_OPT_PORT + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_PORTRANGE, + IPSET_ARG_TIMEOUT, + /* Backward compatibility */ + IPSET_ARG_FROM_PORT, + IPSET_ARG_TO_PORT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .full = IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "range [PROTO:]FROM-TO", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "[PROTO:]PORT|FROM-TO", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "[PROTO:]PORT|FROM-TO", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_PORT), + .help = "[PROTO:]PORT", + }, + }, + .usage = "where PORT, FROM and TO are port numbers or port names from /etc/services.\n" + " PROTO is only needed if a service name is used and it does not exist\n" + " as a TCP service; it isn't used otherwise with the bitmap.", + .description = "Initial revision", +}; + +/* Counters support */ +static struct ipset_type ipset_bitmap_port1 = { + .name = "bitmap:port", + .alias = { "portmap", NULL }, + .revision = 1, + .family = NFPROTO_UNSPEC, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_tcp_udp_port, + .print = ipset_print_port, + .opt = IPSET_OPT_PORT + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_PORTRANGE, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + /* Backward compatibility */ + IPSET_ARG_FROM_PORT, + IPSET_ARG_TO_PORT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .full = IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "range [PROTO:]FROM-TO", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "[PROTO:]PORT|FROM-TO", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "[PROTO:]PORT|FROM-TO", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_PORT), + .help = "[PROTO:]PORT", + }, + }, + .usage = "where PORT, FROM and TO are port numbers or port names from /etc/services.\n" + " PROTO is only needed if a service name is used and it does not exist\n" + " as a TCP service; it isn't used otherwise with the bitmap.", + .description = "counters support", +}; + +/* Comment support */ +static struct ipset_type ipset_bitmap_port2 = { + .name = "bitmap:port", + .alias = { "portmap", NULL }, + .revision = 2, + .family = NFPROTO_UNSPEC, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_tcp_udp_port, + .print = ipset_print_port, + .opt = IPSET_OPT_PORT + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_PORTRANGE, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + /* Backward compatibility */ + IPSET_ARG_FROM_PORT, + IPSET_ARG_TO_PORT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .full = IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "range [PROTO:]FROM-TO", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "[PROTO:]PORT|FROM-TO", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "[PROTO:]PORT|FROM-TO", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_PORT), + .help = "[PROTO:]PORT", + }, + }, + .usage = "where PORT, FROM and TO are port numbers or port names from /etc/services.\n" + " PROTO is only needed if a service name is used and it does not exist\n" + " as a TCP service; it isn't used otherwise with the bitmap.", + .description = "comment support", +}; + +/* skbinfo support */ +static struct ipset_type ipset_bitmap_port3 = { + .name = "bitmap:port", + .alias = { "portmap", NULL }, + .revision = 3, + .family = NFPROTO_UNSPEC, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_tcp_udp_port, + .print = ipset_print_port, + .opt = IPSET_OPT_PORT + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_PORTRANGE, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_SKBINFO, + /* Backward compatibility */ + IPSET_ARG_FROM_PORT, + IPSET_ARG_TO_PORT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .full = IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "range [PROTO:]FROM-TO", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_SKBMARK, + IPSET_ARG_SKBPRIO, + IPSET_ARG_SKBQUEUE, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "[PROTO:]PORT|FROM-TO", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "[PROTO:]PORT|FROM-TO", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_PORT), + .help = "[PROTO:]PORT", + }, + }, + .usage = "where PORT, FROM and TO are port numbers or port names from /etc/services.\n" + " PROTO is only needed if a service name is used and it does not exist\n" + " as a TCP service; it isn't used otherwise with the bitmap.", + .description = "skbinfo support", +}; + +void _init(void); +void _init(void) +{ + ipset_type_add(&ipset_bitmap_port0); + ipset_type_add(&ipset_bitmap_port1); + ipset_type_add(&ipset_bitmap_port2); + ipset_type_add(&ipset_bitmap_port3); +} diff --git a/lib/ipset_hash_ip.c b/lib/ipset_hash_ip.c new file mode 100644 index 0000000..a125eff --- /dev/null +++ b/lib/ipset_hash_ip.c @@ -0,0 +1,404 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* IPSET_OPT_* */ +#include /* parser functions */ +#include /* printing functions */ +#include /* prototypes */ + +/* Initial release */ +static struct ipset_type ipset_hash_ip0 = { + .name = "hash:ip", + .alias = { "iphash", NULL }, + .revision = 0, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_NETMASK, + IPSET_ARG_TIMEOUT, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_GC, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " is supported for IPv4.", + .description = "Initial revision", +}; + +/* Counters support */ +static struct ipset_type ipset_hash_ip1 = { + .name = "hash:ip", + .alias = { "iphash", NULL }, + .revision = 1, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_NETMASK, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_GC, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " is supported for IPv4.", + .description = "counters support", +}; + +/* Comment support */ +static struct ipset_type ipset_hash_ip2 = { + .name = "hash:ip", + .alias = { "iphash", NULL }, + .revision = 2, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_NETMASK, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_GC, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " is supported for IPv4.", + .description = "comment support", +}; + +/* Forceadd support */ +static struct ipset_type ipset_hash_ip3 = { + .name = "hash:ip", + .alias = { "iphash", NULL }, + .revision = 3, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_NETMASK, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_GC, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " is supported for IPv4.", + .description = "forceadd support", +}; + +/* skbinfo support */ +static struct ipset_type ipset_hash_ip4 = { + .name = "hash:ip", + .alias = { "iphash", NULL }, + .revision = 4, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_NETMASK, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + IPSET_ARG_SKBINFO, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_GC, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_SKBMARK, + IPSET_ARG_SKBPRIO, + IPSET_ARG_SKBQUEUE, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " is supported for IPv4.", + .description = "skbinfo support", +}; + +void _init(void); +void _init(void) +{ + ipset_type_add(&ipset_hash_ip0); + ipset_type_add(&ipset_hash_ip1); + ipset_type_add(&ipset_hash_ip2); + ipset_type_add(&ipset_hash_ip3); + ipset_type_add(&ipset_hash_ip4); +} diff --git a/lib/ipset_hash_ipmac.c b/lib/ipset_hash_ipmac.c new file mode 100644 index 0000000..c64e1be --- /dev/null +++ b/lib/ipset_hash_ipmac.c @@ -0,0 +1,98 @@ +/* Copyright 2016 Tomasz Chilinski (tomasz.chilinski@chilan.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* IPSET_OPT_* */ +#include /* parser functions */ +#include /* printing functions */ +#include /* prototypes */ + +/* Initial revision */ +static struct ipset_type ipset_hash_ipmac0 = { + .name = "hash:ip,mac", + .alias = { "ipmachash", NULL }, + .revision = 0, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_ether, + .print = ipset_print_ether, + .opt = IPSET_OPT_ETHER + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + IPSET_ARG_SKBINFO, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_SKBMARK, + IPSET_ARG_SKBPRIO, + IPSET_ARG_SKBQUEUE, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .help = "IP,MAC", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .help = "IP,MAC", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_ETHER), + .help = "IP,MAC", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " MAC is a MAC address.", + .description = "Initial revision", +}; + +void _init(void); +void _init(void) +{ + ipset_type_add(&ipset_hash_ipmac0); +} diff --git a/lib/ipset_hash_ipmark.c b/lib/ipset_hash_ipmark.c new file mode 100644 index 0000000..33009f5 --- /dev/null +++ b/lib/ipset_hash_ipmark.c @@ -0,0 +1,298 @@ +/* Copyright 2007-2013 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * Copyright 2013 Smoothwall Ltd. (vytas.dauksa@smoothwall.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* IPSET_OPT_* */ +#include /* parser functions */ +#include /* printing functions */ +#include /* prototypes */ + +/* Initial release */ +static struct ipset_type ipset_hash_ipmark0 = { + .name = "hash:ip,mark", + .alias = { "ipmarkhash", NULL }, + .revision = 0, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_mark, + .print = ipset_print_mark, + .opt = IPSET_OPT_MARK + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_MARKMASK, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_MARK), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_MARK), + .help = "IP,MARK", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_MARK), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_MARK), + .help = "IP,MARK", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_MARK), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_MARK), + .help = "IP,MARK", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname).\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " is supported for IPv4.\n" + " Adding/deleting single mark element\n" + " is supported both for IPv4 and IPv6.", + .description = "initial revision", +}; + +/* Forceadd support */ +static struct ipset_type ipset_hash_ipmark1 = { + .name = "hash:ip,mark", + .alias = { "ipmarkhash", NULL }, + .revision = 1, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_mark, + .print = ipset_print_mark, + .opt = IPSET_OPT_MARK + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_MARKMASK, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_MARK), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_MARK), + .help = "IP,MARK", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_MARK), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_MARK), + .help = "IP,MARK", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_MARK), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_MARK), + .help = "IP,MARK", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname).\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " is supported for IPv4.\n" + " Adding/deleting single mark element\n" + " is supported both for IPv4 and IPv6.", + .description = "forceadd support", +}; + +/* skbinfo support */ +static struct ipset_type ipset_hash_ipmark2 = { + .name = "hash:ip,mark", + .alias = { "ipmarkhash", NULL }, + .revision = 2, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_mark, + .print = ipset_print_mark, + .opt = IPSET_OPT_MARK + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_MARKMASK, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + IPSET_ARG_SKBINFO, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_SKBMARK, + IPSET_ARG_SKBPRIO, + IPSET_ARG_SKBQUEUE, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_MARK), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_MARK), + .help = "IP,MARK", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_MARK), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_MARK), + .help = "IP,MARK", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_MARK), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_MARK), + .help = "IP,MARK", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname).\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " is supported for IPv4.\n" + " Adding/deleting single mark element\n" + " is supported both for IPv4 and IPv6.", + .description = "skbinfo support", +}; + +void _init(void); +void _init(void) +{ + ipset_type_add(&ipset_hash_ipmark0); + ipset_type_add(&ipset_hash_ipmark1); + ipset_type_add(&ipset_hash_ipmark2); +} diff --git a/lib/ipset_hash_ipport.c b/lib/ipset_hash_ipport.c new file mode 100644 index 0000000..c505412 --- /dev/null +++ b/lib/ipset_hash_ipport.c @@ -0,0 +1,510 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* IPSET_OPT_* */ +#include /* parser functions */ +#include /* printing functions */ +#include /* ipset_port_usage */ +#include /* prototypes */ + +/* SCTP and UDPLITE support */ +static struct ipset_type ipset_hash_ipport1 = { + .name = "hash:ip,port", + .alias = { "ipporthash", NULL }, + .revision = 1, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "IP,[PROTO:]PORT", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "IP,[PROTO:]PORT", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .help = "IP,[PROTO:]PORT", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname).\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " is supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "SCTP and UDPLITE support", +}; + +/* counters support */ +static struct ipset_type ipset_hash_ipport2 = { + .name = "hash:ip,port", + .alias = { "ipporthash", NULL }, + .revision = 2, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "IP,[PROTO:]PORT", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "IP,[PROTO:]PORT", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .help = "IP,[PROTO:]PORT", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname).\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " is supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "counters support", +}; + +/* comment support */ +static struct ipset_type ipset_hash_ipport3 = { + .name = "hash:ip,port", + .alias = { "ipporthash", NULL }, + .revision = 3, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "IP,[PROTO:]PORT", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "IP,[PROTO:]PORT", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .help = "IP,[PROTO:]PORT", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname).\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " is supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "comment support", +}; + +/* forceadd support */ +static struct ipset_type ipset_hash_ipport4 = { + .name = "hash:ip,port", + .alias = { "ipporthash", NULL }, + .revision = 4, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "IP,[PROTO:]PORT", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "IP,[PROTO:]PORT", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .help = "IP,[PROTO:]PORT", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname).\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " is supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "forceadd support", +}; + +/* skbinfo support */ +static struct ipset_type ipset_hash_ipport5 = { + .name = "hash:ip,port", + .alias = { "ipporthash", NULL }, + .revision = 5, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + IPSET_ARG_SKBINFO, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_SKBMARK, + IPSET_ARG_SKBPRIO, + IPSET_ARG_SKBQUEUE, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "IP,[PROTO:]PORT", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO), + .help = "IP,[PROTO:]PORT", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .help = "IP,[PROTO:]PORT", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname).\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " is supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "skbinfo support", +}; + +void _init(void); +void _init(void) +{ + ipset_type_add(&ipset_hash_ipport1); + ipset_type_add(&ipset_hash_ipport2); + ipset_type_add(&ipset_hash_ipport3); + ipset_type_add(&ipset_hash_ipport4); + ipset_type_add(&ipset_hash_ipport5); +} diff --git a/lib/ipset_hash_ipportip.c b/lib/ipset_hash_ipportip.c new file mode 100644 index 0000000..b8e14a8 --- /dev/null +++ b/lib/ipset_hash_ipportip.c @@ -0,0 +1,565 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* IPSET_OPT_* */ +#include /* parser functions */ +#include /* printing functions */ +#include /* ipset_port_usage */ +#include /* prototypes */ + +/* SCTP and UDPLITE support */ +static struct ipset_type ipset_hash_ipportip1 = { + .name = "hash:ip,port,ip", + .alias = { "ipportiphash", NULL }, + .revision = 1, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_THREE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + [IPSET_DIM_THREE - 1] = { + .parse = ipset_parse_single_ip, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2), + .help = "IP,[PROTO:]PORT,IP", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2), + .help = "IP,[PROTO:]PORT,IP", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .help = "IP,[PROTO:]PORT,IP", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname).\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " in the first IP component is supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "SCTP and UDPLITE support", +}; + +/* counters support */ +static struct ipset_type ipset_hash_ipportip2 = { + .name = "hash:ip,port,ip", + .alias = { "ipportiphash", NULL }, + .revision = 2, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_THREE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + [IPSET_DIM_THREE - 1] = { + .parse = ipset_parse_single_ip, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2), + .help = "IP,[PROTO:]PORT,IP", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2), + .help = "IP,[PROTO:]PORT,IP", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .help = "IP,[PROTO:]PORT,IP", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname).\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " in the first IP component is supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "counters support", +}; + +/* comment support */ +static struct ipset_type ipset_hash_ipportip3 = { + .name = "hash:ip,port,ip", + .alias = { "ipportiphash", NULL }, + .revision = 3, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_THREE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + [IPSET_DIM_THREE - 1] = { + .parse = ipset_parse_single_ip, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2), + .help = "IP,[PROTO:]PORT,IP", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2), + .help = "IP,[PROTO:]PORT,IP", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .help = "IP,[PROTO:]PORT,IP", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname).\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " in the first IP component is supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "comment support", +}; + +/* forceadd support */ +static struct ipset_type ipset_hash_ipportip4 = { + .name = "hash:ip,port,ip", + .alias = { "ipportiphash", NULL }, + .revision = 4, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_THREE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + [IPSET_DIM_THREE - 1] = { + .parse = ipset_parse_single_ip, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2), + .help = "IP,[PROTO:]PORT,IP", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2), + .help = "IP,[PROTO:]PORT,IP", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .help = "IP,[PROTO:]PORT,IP", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname).\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " in the first IP component is supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "forceadd support", +}; + +/* skbinfo support */ +static struct ipset_type ipset_hash_ipportip5 = { + .name = "hash:ip,port,ip", + .alias = { "ipportiphash", NULL }, + .revision = 5, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_THREE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + [IPSET_DIM_THREE - 1] = { + .parse = ipset_parse_single_ip, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + IPSET_ARG_SKBINFO, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_SKBMARK, + IPSET_ARG_SKBPRIO, + IPSET_ARG_SKBQUEUE, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2), + .help = "IP,[PROTO:]PORT,IP", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2), + .help = "IP,[PROTO:]PORT,IP", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .help = "IP,[PROTO:]PORT,IP", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname).\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " in the first IP component is supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "skbinfo support", +}; + +void _init(void); +void _init(void) +{ + ipset_type_add(&ipset_hash_ipportip1); + ipset_type_add(&ipset_hash_ipportip2); + ipset_type_add(&ipset_hash_ipportip3); + ipset_type_add(&ipset_hash_ipportip4); + ipset_type_add(&ipset_hash_ipportip5); +} diff --git a/lib/ipset_hash_ipportnet.c b/lib/ipset_hash_ipportnet.c new file mode 100644 index 0000000..bcc3c7b --- /dev/null +++ b/lib/ipset_hash_ipportnet.c @@ -0,0 +1,825 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* IPSET_OPT_* */ +#include /* parser functions */ +#include /* printing functions */ +#include /* ipset_port_usage */ +#include /* prototypes */ + +/* SCTP and UDPLITE support */ +static struct ipset_type ipset_hash_ipportnet1 = { + .name = "hash:ip,port,net", + .alias = { "ipportnethash", NULL }, + .revision = 1, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_THREE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + [IPSET_DIM_THREE - 1] = { + .parse = ipset_parse_ipnet, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP are valid IPv4 or IPv6 addresses (or hostnames),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " in the first IP component is supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "SCTP and UDPLITE support", +}; + +/* Add/del range support */ +static struct ipset_type ipset_hash_ipportnet2 = { + .name = "hash:ip,port,net", + .alias = { "ipportnethash", NULL }, + .revision = 2, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_THREE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + [IPSET_DIM_THREE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP are valid IPv4 or IPv6 addresses (or hostnames),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " in the first IP component is supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "Add/del range support", +}; + +/* nomatch flag support */ +static struct ipset_type ipset_hash_ipportnet3 = { + .name = "hash:ip,port,net", + .alias = { "ipportnethash", NULL }, + .revision = 3, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_THREE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + [IPSET_DIM_THREE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP are valid IPv4 or IPv6 addresses (or hostnames),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " in the first IP component is supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "nomatch flag support", +}; + +/* counters support */ +static struct ipset_type ipset_hash_ipportnet4 = { + .name = "hash:ip,port,net", + .alias = { "ipportnethash", NULL }, + .revision = 4, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_THREE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + [IPSET_DIM_THREE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP are valid IPv4 or IPv6 addresses (or hostnames),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " in the first IP component is supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "counters support", +}; + +/* comment support */ +static struct ipset_type ipset_hash_ipportnet5 = { + .name = "hash:ip,port,net", + .alias = { "ipportnethash", NULL }, + .revision = 5, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_THREE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + [IPSET_DIM_THREE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP are valid IPv4 or IPv6 addresses (or hostnames),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " in the first IP component is supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "comment support", +}; + +/* forceadd support */ +static struct ipset_type ipset_hash_ipportnet6 = { + .name = "hash:ip,port,net", + .alias = { "ipportnethash", NULL }, + .revision = 6, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_THREE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + [IPSET_DIM_THREE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP are valid IPv4 or IPv6 addresses (or hostnames),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " in the first IP component is supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "forceadd support", +}; + +/* skbinfo support */ +static struct ipset_type ipset_hash_ipportnet7 = { + .name = "hash:ip,port,net", + .alias = { "ipportnethash", NULL }, + .revision = 7, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_THREE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_single6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + [IPSET_DIM_THREE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + IPSET_ARG_SKBINFO, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_IGNORED_FROM, + IPSET_ARG_IGNORED_TO, + IPSET_ARG_IGNORED_NETWORK, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_SKBMARK, + IPSET_ARG_SKBPRIO, + IPSET_ARG_SKBQUEUE, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2), + .help = "IP,[PROTO:]PORT,IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP are valid IPv4 or IPv6 addresses (or hostnames),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " in the first IP component is supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "skbinfo support", +}; + +void _init(void); +void _init(void) +{ + ipset_type_add(&ipset_hash_ipportnet1); + ipset_type_add(&ipset_hash_ipportnet2); + ipset_type_add(&ipset_hash_ipportnet3); + ipset_type_add(&ipset_hash_ipportnet4); + ipset_type_add(&ipset_hash_ipportnet5); + ipset_type_add(&ipset_hash_ipportnet6); + ipset_type_add(&ipset_hash_ipportnet7); +} diff --git a/lib/ipset_hash_mac.c b/lib/ipset_hash_mac.c new file mode 100644 index 0000000..b80ce88 --- /dev/null +++ b/lib/ipset_hash_mac.c @@ -0,0 +1,82 @@ +/* Copyright 2014 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* IPSET_OPT_* */ +#include /* parser functions */ +#include /* printing functions */ +#include /* prototypes */ + +/* Initial revision */ +static struct ipset_type ipset_hash_mac0 = { + .name = "hash:mac", + .alias = { "machash", NULL }, + .revision = 0, + .family = NFPROTO_UNSPEC, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ether, + .print = ipset_print_ether, + .opt = IPSET_OPT_ETHER + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + IPSET_ARG_SKBINFO, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_SKBMARK, + IPSET_ARG_SKBPRIO, + IPSET_ARG_SKBQUEUE, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_ETHER), + .full = IPSET_FLAG(IPSET_OPT_ETHER), + .help = "MAC", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_ETHER), + .full = IPSET_FLAG(IPSET_OPT_ETHER), + .help = "MAC", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_ETHER), + .full = IPSET_FLAG(IPSET_OPT_ETHER), + .help = "MAC", + }, + }, + .usage = "", + .description = "Initial revision", +}; + +void _init(void); +void _init(void) +{ + ipset_type_add(&ipset_hash_mac0); +} diff --git a/lib/ipset_hash_net.c b/lib/ipset_hash_net.c new file mode 100644 index 0000000..01371db --- /dev/null +++ b/lib/ipset_hash_net.c @@ -0,0 +1,544 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* IPSET_OPT_* */ +#include /* parser functions */ +#include /* printing functions */ +#include /* prototypes */ + +/* Initial revision */ +static struct ipset_type ipset_hash_net0 = { + .name = "hash:net", + .alias = { "nethash", NULL }, + .revision = 0, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ipnet, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP is an IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.", + .description = "Initial revision", +}; + +/* Add/del range support */ +static struct ipset_type ipset_hash_net1 = { + .name = "hash:net", + .alias = { "nethash", NULL }, + .revision = 1, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP is an IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.", + .description = "Add/del range support", +}; + +/* nomatch flag support */ +static struct ipset_type ipset_hash_net2 = { + .name = "hash:net", + .alias = { "nethash", NULL }, + .revision = 2, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP is an IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.", + .description = "nomatch flag support", +}; + +/* counters support */ +static struct ipset_type ipset_hash_net3 = { + .name = "hash:net", + .alias = { "nethash", NULL }, + .revision = 3, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP is an IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.", + .description = "counters support", +}; + +/* comment support */ +static struct ipset_type ipset_hash_net4 = { + .name = "hash:net", + .alias = { "nethash", NULL }, + .revision = 4, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP is an IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.", + .description = "comment support", +}; + +/* forceadd support */ +static struct ipset_type ipset_hash_net5 = { + .name = "hash:net", + .alias = { "nethash", NULL }, + .revision = 5, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP is an IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.", + .description = "forceadd support", +}; + +/* skbinfo support */ +static struct ipset_type ipset_hash_net6 = { + .name = "hash:net", + .alias = { "nethash", NULL }, + .revision = 6, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + IPSET_ARG_SKBINFO, + /* Ignored options: backward compatibilty */ + IPSET_ARG_PROBES, + IPSET_ARG_RESIZE, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_SKBMARK, + IPSET_ARG_SKBPRIO, + IPSET_ARG_SKBQUEUE, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP is an IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.", + .description = "skbinfo support", +}; + +void _init(void); +void _init(void) +{ + ipset_type_add(&ipset_hash_net0); + ipset_type_add(&ipset_hash_net1); + ipset_type_add(&ipset_hash_net2); + ipset_type_add(&ipset_hash_net3); + ipset_type_add(&ipset_hash_net4); + ipset_type_add(&ipset_hash_net5); + ipset_type_add(&ipset_hash_net6); +} diff --git a/lib/ipset_hash_netiface.c b/lib/ipset_hash_netiface.c new file mode 100644 index 0000000..1d829a3 --- /dev/null +++ b/lib/ipset_hash_netiface.c @@ -0,0 +1,633 @@ +/* Copyright 2011 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* IPSET_OPT_* */ +#include /* parser functions */ +#include /* printing functions */ +#include /* ipset_port_usage */ +#include /* prototypes */ + +/* Initial revision */ +static struct ipset_type ipset_hash_netiface0 = { + .name = "hash:net,iface", + .alias = { "netifacehash", NULL }, + .revision = 0, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_iface, + .print = ipset_print_iface, + .opt = IPSET_OPT_IFACE + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR]|FROM-TO,[physdev:]IFACE", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR]|FROM-TO,[physdev:]IFACE", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR],[physdev:]IFACE", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements with IPv4 is supported.", + .description = "Initial revision", +}; + +/* nomatch flag support */ +static struct ipset_type ipset_hash_netiface1 = { + .name = "hash:net,iface", + .alias = { "netifacehash", NULL }, + .revision = 1, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_iface, + .print = ipset_print_iface, + .opt = IPSET_OPT_IFACE + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR]|FROM-TO,[physdev:]IFACE", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR]|FROM-TO,[physdev:]IFACE", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR],[physdev:]IFACE", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements with IPv4 is supported.", + .description = "nomatch flag support", +}; + +/* /0 network support */ +static struct ipset_type ipset_hash_netiface2 = { + .name = "hash:net,iface", + .alias = { "netifacehash", NULL }, + .revision = 2, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_iface, + .print = ipset_print_iface, + .opt = IPSET_OPT_IFACE + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR]|FROM-TO,[physdev:]IFACE", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR]|FROM-TO,[physdev:]IFACE", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR],[physdev:]IFACE", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements with IPv4 is supported.", + .description = "/0 network support", +}; + +/* counters support */ +static struct ipset_type ipset_hash_netiface3 = { + .name = "hash:net,iface", + .alias = { "netifacehash", NULL }, + .revision = 3, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_iface, + .print = ipset_print_iface, + .opt = IPSET_OPT_IFACE + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR]|FROM-TO,[physdev:]IFACE", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR]|FROM-TO,[physdev:]IFACE", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR],[physdev:]IFACE", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements with IPv4 is supported.", + .description = "counters support", +}; + +/* comment support */ +static struct ipset_type ipset_hash_netiface4 = { + .name = "hash:net,iface", + .alias = { "netifacehash", NULL }, + .revision = 4, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_iface, + .print = ipset_print_iface, + .opt = IPSET_OPT_IFACE + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR]|FROM-TO,[physdev:]IFACE", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR]|FROM-TO,[physdev:]IFACE", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR],[physdev:]IFACE", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements with IPv4 is supported.", + .description = "comment support", +}; + +/* forceadd support */ +static struct ipset_type ipset_hash_netiface5 = { + .name = "hash:net,iface", + .alias = { "netifacehash", NULL }, + .revision = 5, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_iface, + .print = ipset_print_iface, + .opt = IPSET_OPT_IFACE + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR]|FROM-TO,[physdev:]IFACE", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR]|FROM-TO,[physdev:]IFACE", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR],[physdev:]IFACE", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements with IPv4 is supported.", + .description = "forceadd support", +}; + +/* skbinfo support */ +static struct ipset_type ipset_hash_netiface6 = { + .name = "hash:net,iface", + .alias = { "netifacehash", NULL }, + .revision = 6, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_iface, + .print = ipset_print_iface, + .opt = IPSET_OPT_IFACE + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + IPSET_ARG_SKBINFO, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_SKBMARK, + IPSET_ARG_SKBPRIO, + IPSET_ARG_SKBQUEUE, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR]|FROM-TO,[physdev:]IFACE", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR]|FROM-TO,[physdev:]IFACE", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IFACE), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IFACE) + | IPSET_FLAG(IPSET_OPT_PHYSDEV), + .help = "IP[/CIDR],[physdev:]IFACE", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements with IPv4 is supported.", + .description = "skbinfo support", +}; + +void _init(void); +void _init(void) +{ + ipset_type_add(&ipset_hash_netiface0); + ipset_type_add(&ipset_hash_netiface1); + ipset_type_add(&ipset_hash_netiface2); + ipset_type_add(&ipset_hash_netiface3); + ipset_type_add(&ipset_hash_netiface4); + ipset_type_add(&ipset_hash_netiface5); + ipset_type_add(&ipset_hash_netiface6); +} diff --git a/lib/ipset_hash_netnet.c b/lib/ipset_hash_netnet.c new file mode 100644 index 0000000..64ff0df --- /dev/null +++ b/lib/ipset_hash_netnet.c @@ -0,0 +1,298 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * Copyright 2013 Oliver Smith (oliver@8.c.9.b.0.7.4.0.1.0.0.2.ip6.arpa) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* IPSET_OPT_* */ +#include /* parser functions */ +#include /* printing functions */ +#include /* prototypes */ + +/* Initial revision */ +static struct ipset_type ipset_hash_netnet0 = { + .name = "hash:net,net", + .alias = { "netnethash", NULL }, + .revision = 0, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP[/CIDR]|FROM-TO,IP[/CIDR]|FROM-TO", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP[/CIDR]|FROM-TO,IP[/CIDR]|FROM-TO", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2), + .help = "IP[/CIDR],IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP is an IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " IP range is not supported with IPv6.", + .description = "initial revision", +}; + +/* forceadd support */ +static struct ipset_type ipset_hash_netnet1 = { + .name = "hash:net,net", + .alias = { "netnethash", NULL }, + .revision = 1, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP[/CIDR]|FROM-TO,IP[/CIDR]|FROM-TO", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP[/CIDR]|FROM-TO,IP[/CIDR]|FROM-TO", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2), + .help = "IP[/CIDR],IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP is an IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " IP range is not supported with IPv6.", + .description = "forceadd support", +}; + +/* skbinfo support */ +static struct ipset_type ipset_hash_netnet2 = { + .name = "hash:net,net", + .alias = { "netnethash", NULL }, + .revision = 2, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + IPSET_ARG_SKBINFO, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_SKBMARK, + IPSET_ARG_SKBPRIO, + IPSET_ARG_SKBQUEUE, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP[/CIDR]|FROM-TO,IP[/CIDR]|FROM-TO", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP[/CIDR]|FROM-TO,IP[/CIDR]|FROM-TO", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2), + .help = "IP[/CIDR],IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP is an IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " IP range is not supported with IPv6.", + .description = "skbinfo support", +}; + +void _init(void); +void _init(void) +{ + ipset_type_add(&ipset_hash_netnet0); + ipset_type_add(&ipset_hash_netnet1); + ipset_type_add(&ipset_hash_netnet2); +} diff --git a/lib/ipset_hash_netport.c b/lib/ipset_hash_netport.c new file mode 100644 index 0000000..f6409e2 --- /dev/null +++ b/lib/ipset_hash_netport.c @@ -0,0 +1,678 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* IPSET_OPT_* */ +#include /* parser functions */ +#include /* printing functions */ +#include /* ipset_port_usage */ +#include /* prototypes */ + +/* SCTP and UDPLITE support */ +static struct ipset_type ipset_hash_netport1 = { + .name = "hash:net,port", + .alias = { "netporthash", NULL }, + .revision = 1, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ipnet, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR],[PROTO:]PORT", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR],[PROTO:]PORT", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR],[PROTO:]PORT", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "SCTP and UDPLITE support", +}; + +/* Add/del range support */ +static struct ipset_type ipset_hash_netport2 = { + .name = "hash:net,port", + .alias = { "netporthash", NULL }, + .revision = 2, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]|FROM-TO,[PROTO:]PORT", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]|FROM-TO,[PROTO:]PORT", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR],[PROTO:]PORT", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "Add/del range support", +}; + +/* nomatch flag support */ +static struct ipset_type ipset_hash_netport3 = { + .name = "hash:net,port", + .alias = { "netporthash", NULL }, + .revision = 3, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]|FROM-TO,[PROTO:]PORT", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]|FROM-TO,[PROTO:]PORT", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR],[PROTO:]PORT", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "nomatch flag support", +}; + +/* counters support */ +static struct ipset_type ipset_hash_netport4 = { + .name = "hash:net,port", + .alias = { "netporthash", NULL }, + .revision = 4, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]|FROM-TO,[PROTO:]PORT", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]|FROM-TO,[PROTO:]PORT", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR],[PROTO:]PORT", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "counters support", +}; + +/* comment support */ +static struct ipset_type ipset_hash_netport5 = { + .name = "hash:net,port", + .alias = { "netporthash", NULL }, + .revision = 5, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]|FROM-TO,[PROTO:]PORT", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]|FROM-TO,[PROTO:]PORT", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR],[PROTO:]PORT", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "comment support", +}; + +/* forceadd support */ +static struct ipset_type ipset_hash_netport6 = { + .name = "hash:net,port", + .alias = { "netporthash", NULL }, + .revision = 6, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]|FROM-TO,[PROTO:]PORT", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]|FROM-TO,[PROTO:]PORT", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR],[PROTO:]PORT", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "forceadd support", +}; + +/* skbinfo support */ +static struct ipset_type ipset_hash_netport7 = { + .name = "hash:net,port", + .alias = { "netporthash", NULL }, + .revision = 7, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_TWO, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + IPSET_ARG_SKBINFO, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_SKBMARK, + IPSET_ARG_SKBPRIO, + IPSET_ARG_SKBQUEUE, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]|FROM-TO,[PROTO:]PORT", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO), + .help = "IP[/CIDR]|FROM-TO,[PROTO:]PORT", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_CIDR), + .help = "IP[/CIDR],[PROTO:]PORT", + }, + }, + .usage = "where depending on the INET family\n" + " IP is a valid IPv4 or IPv6 address (or hostname),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "skbinfo support", +}; + +void _init(void); +void _init(void) +{ + ipset_type_add(&ipset_hash_netport1); + ipset_type_add(&ipset_hash_netport2); + ipset_type_add(&ipset_hash_netport3); + ipset_type_add(&ipset_hash_netport4); + ipset_type_add(&ipset_hash_netport5); + ipset_type_add(&ipset_hash_netport6); + ipset_type_add(&ipset_hash_netport7); +} diff --git a/lib/ipset_hash_netportnet.c b/lib/ipset_hash_netportnet.c new file mode 100644 index 0000000..4d04dd8 --- /dev/null +++ b/lib/ipset_hash_netportnet.c @@ -0,0 +1,367 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* IPSET_OPT_* */ +#include /* parser functions */ +#include /* printing functions */ +#include /* ipset_port_usage */ +#include /* prototypes */ + +/* initial revision */ +static struct ipset_type ipset_hash_netportnet0 = { + .name = "hash:net,port,net", + .alias = { "netportnethash", NULL }, + .revision = 0, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_THREE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + [IPSET_DIM_THREE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP[/CIDR],[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP[/CIDR],[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2), + .help = "IP[/CIDR],[PROTO:]PORT,IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP are valid IPv4 or IPv6 addresses (or hostnames),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " in both IP components are supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "initial revision", +}; + +/* forceadd support */ +static struct ipset_type ipset_hash_netportnet1 = { + .name = "hash:net,port,net", + .alias = { "netportnethash", NULL }, + .revision = 1, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_THREE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + [IPSET_DIM_THREE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP[/CIDR],[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP[/CIDR],[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2), + .help = "IP[/CIDR],[PROTO:]PORT,IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP are valid IPv4 or IPv6 addresses (or hostnames),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " in both IP components are supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "forceadd support", +}; + +/* skbinfo support */ +static struct ipset_type ipset_hash_netportnet2 = { + .name = "hash:net,port,net", + .alias = { "netportnethash", NULL }, + .revision = 2, + .family = NFPROTO_IPSET_IPV46, + .dimension = IPSET_DIM_THREE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP + }, + [IPSET_DIM_TWO - 1] = { + .parse = ipset_parse_proto_port, + .print = ipset_print_proto_port, + .opt = IPSET_OPT_PORT + }, + [IPSET_DIM_THREE - 1] = { + .parse = ipset_parse_ip4_net6, + .print = ipset_print_ip, + .opt = IPSET_OPT_IP2 + }, + }, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_FAMILY, + /* Aliases */ + IPSET_ARG_INET, + IPSET_ARG_INET6, + IPSET_ARG_HASHSIZE, + IPSET_ARG_MAXELEM, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_FORCEADD, + IPSET_ARG_SKBINFO, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_NOMATCH, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_SKBMARK, + IPSET_ARG_SKBPRIO, + IPSET_ARG_SKBQUEUE, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP[/CIDR],[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_PORT_TO) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP_TO) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2) + | IPSET_FLAG(IPSET_OPT_IP2_TO), + .help = "IP[/CIDR],[PROTO:]PORT,IP[/CIDR]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_NOMATCH, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_IP2), + .full = IPSET_FLAG(IPSET_OPT_IP) + | IPSET_FLAG(IPSET_OPT_PROTO) + | IPSET_FLAG(IPSET_OPT_PORT) + | IPSET_FLAG(IPSET_OPT_CIDR) + | IPSET_FLAG(IPSET_OPT_IP2) + | IPSET_FLAG(IPSET_OPT_CIDR2), + .help = "IP[/CIDR],[PROTO:]PORT,IP[/CIDR]", + }, + }, + .usage = "where depending on the INET family\n" + " IP are valid IPv4 or IPv6 addresses (or hostnames),\n" + " CIDR is a valid IPv4 or IPv6 CIDR prefix.\n" + " Adding/deleting multiple elements in IP/CIDR or FROM-TO form\n" + " in both IP components are supported for IPv4.\n" + " Adding/deleting multiple elements with TCP/SCTP/UDP/UDPLITE\n" + " port range is supported both for IPv4 and IPv6.", + .usagefn = ipset_port_usage, + .description = "skbinfo support", +}; + +void _init(void); +void _init(void) +{ + ipset_type_add(&ipset_hash_netportnet0); + ipset_type_add(&ipset_hash_netportnet1); + ipset_type_add(&ipset_hash_netportnet2); +} diff --git a/lib/ipset_list_set.c b/lib/ipset_list_set.c new file mode 100644 index 0000000..973243f --- /dev/null +++ b/lib/ipset_list_set.c @@ -0,0 +1,296 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* IPSET_OPT_* */ +#include /* parser functions */ +#include /* printing functions */ +#include /* prototypes */ + +/* Initial revision */ +static struct ipset_type ipset_list_set0 = { + .name = "list:set", + .alias = { "setlist", NULL }, + .revision = 0, + .family = NFPROTO_UNSPEC, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_setname, + .print = ipset_print_name, + .opt = IPSET_OPT_NAME + }, + }, + .compat_parse_elem = ipset_parse_name_compat, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_SIZE, + IPSET_ARG_TIMEOUT, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_BEFORE, + IPSET_ARG_AFTER, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_NAME), + .full = IPSET_FLAG(IPSET_OPT_NAME) + | IPSET_FLAG(IPSET_OPT_BEFORE), + .help = "NAME [before|after NAME]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_BEFORE, + IPSET_ARG_AFTER, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_NAME), + .full = IPSET_FLAG(IPSET_OPT_NAME) + | IPSET_FLAG(IPSET_OPT_BEFORE), + .help = "NAME [before|after NAME]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_BEFORE, + IPSET_ARG_AFTER, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_NAME), + .full = IPSET_FLAG(IPSET_OPT_NAME) + | IPSET_FLAG(IPSET_OPT_BEFORE), + .help = "NAME [before|after NAME]", + }, + }, + .usage = "where NAME are existing set names.", + .description = "Initial revision", +}; + +/* counters support */ +static struct ipset_type ipset_list_set1 = { + .name = "list:set", + .alias = { "setlist", NULL }, + .revision = 1, + .family = NFPROTO_UNSPEC, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_setname, + .print = ipset_print_name, + .opt = IPSET_OPT_NAME + }, + }, + .compat_parse_elem = ipset_parse_name_compat, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_SIZE, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_BEFORE, + IPSET_ARG_AFTER, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_NAME), + .full = IPSET_FLAG(IPSET_OPT_NAME) + | IPSET_FLAG(IPSET_OPT_BEFORE), + .help = "NAME [before|after NAME]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_BEFORE, + IPSET_ARG_AFTER, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_NAME), + .full = IPSET_FLAG(IPSET_OPT_NAME) + | IPSET_FLAG(IPSET_OPT_BEFORE), + .help = "NAME [before|after NAME]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_BEFORE, + IPSET_ARG_AFTER, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_NAME), + .full = IPSET_FLAG(IPSET_OPT_NAME) + | IPSET_FLAG(IPSET_OPT_BEFORE), + .help = "NAME [before|after NAME]", + }, + }, + .usage = "where NAME are existing set names.", + .description = "counters support", +}; + +/* comment support */ +static struct ipset_type ipset_list_set2 = { + .name = "list:set", + .alias = { "setlist", NULL }, + .revision = 2, + .family = NFPROTO_UNSPEC, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_setname, + .print = ipset_print_name, + .opt = IPSET_OPT_NAME + }, + }, + .compat_parse_elem = ipset_parse_name_compat, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_SIZE, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_BEFORE, + IPSET_ARG_AFTER, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_NAME), + .full = IPSET_FLAG(IPSET_OPT_NAME) + | IPSET_FLAG(IPSET_OPT_BEFORE), + .help = "NAME [before|after NAME]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_BEFORE, + IPSET_ARG_AFTER, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_NAME), + .full = IPSET_FLAG(IPSET_OPT_NAME) + | IPSET_FLAG(IPSET_OPT_BEFORE), + .help = "NAME [before|after NAME]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_BEFORE, + IPSET_ARG_AFTER, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_NAME), + .full = IPSET_FLAG(IPSET_OPT_NAME) + | IPSET_FLAG(IPSET_OPT_BEFORE), + .help = "NAME [before|after NAME]", + }, + }, + .usage = "where NAME are existing set names.", + .description = "comment support", +}; + +/* skbinfo support */ +static struct ipset_type ipset_list_set3 = { + .name = "list:set", + .alias = { "setlist", NULL }, + .revision = 3, + .family = NFPROTO_UNSPEC, + .dimension = IPSET_DIM_ONE, + .elem = { + [IPSET_DIM_ONE - 1] = { + .parse = ipset_parse_setname, + .print = ipset_print_name, + .opt = IPSET_OPT_NAME + }, + }, + .compat_parse_elem = ipset_parse_name_compat, + .cmd = { + [IPSET_CREATE] = { + .args = { + IPSET_ARG_SIZE, + IPSET_ARG_TIMEOUT, + IPSET_ARG_COUNTERS, + IPSET_ARG_COMMENT, + IPSET_ARG_SKBINFO, + IPSET_ARG_NONE, + }, + .need = 0, + .full = 0, + .help = "", + }, + [IPSET_ADD] = { + .args = { + IPSET_ARG_TIMEOUT, + IPSET_ARG_BEFORE, + IPSET_ARG_AFTER, + IPSET_ARG_PACKETS, + IPSET_ARG_BYTES, + IPSET_ARG_ADT_COMMENT, + IPSET_ARG_SKBMARK, + IPSET_ARG_SKBPRIO, + IPSET_ARG_SKBQUEUE, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_NAME), + .full = IPSET_FLAG(IPSET_OPT_NAME) + | IPSET_FLAG(IPSET_OPT_BEFORE), + .help = "NAME [before|after NAME]", + }, + [IPSET_DEL] = { + .args = { + IPSET_ARG_BEFORE, + IPSET_ARG_AFTER, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_NAME), + .full = IPSET_FLAG(IPSET_OPT_NAME) + | IPSET_FLAG(IPSET_OPT_BEFORE), + .help = "NAME [before|after NAME]", + }, + [IPSET_TEST] = { + .args = { + IPSET_ARG_BEFORE, + IPSET_ARG_AFTER, + IPSET_ARG_NONE, + }, + .need = IPSET_FLAG(IPSET_OPT_NAME), + .full = IPSET_FLAG(IPSET_OPT_NAME) + | IPSET_FLAG(IPSET_OPT_BEFORE), + .help = "NAME [before|after NAME]", + }, + }, + .usage = "where NAME are existing set names.", + .description = "skbinfo support", +}; + +void _init(void); +void _init(void) +{ + ipset_type_add(&ipset_list_set0); + ipset_type_add(&ipset_list_set1); + ipset_type_add(&ipset_list_set2); + ipset_type_add(&ipset_list_set3); +} diff --git a/lib/libipset.3 b/lib/libipset.3 new file mode 100644 index 0000000..840db06 --- /dev/null +++ b/lib/libipset.3 @@ -0,0 +1,242 @@ +.\" Man page written by Jozsef Kadlecsik +.\" +.\" 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 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., 675 Mass Ave, Cambridge, MA 02139, USA. +.TH libipset 3 "Oct 16, 2018" "Jozsef Kadlecsik" "" +.SH NAME +libipset \- A library for using ipset +.SH SYNOPSIS +.nf +#include +.sp +void ipset_load_types(void) +.sp +struct ipset * ipset_init(void) +int ipset_parse_argv(struct ipset *ipset, int argc, char *argv[]) +.sp +int ipset_parse_line(struct ipset *ipset, char *line) +.sp +int ipset_parse_stream(struct ipset *ipset, FILE *f) +.sp +int ipset_fini(struct ipset *ipset) +.sp +int ipset_custom_printf(struct ipset *ipset, + ipset_custom_errorfn custom_error, + ipset_standard_errorfn standard_error, + ipset_print_outfn outfn, + void *p) +.sp +struct ipset_session * ipset_session(struct ipset *ipset) +.sp +int ipset_session_full_io(struct ipset_session *session, + const char *filename, + enum ipset_io_type what) +.sp +int ipset_session_normal_io(struct ipset_session *session, + const char *filename, + enum ipset_io_type what) +.sp +FILE * ipset_session_io_stream(struct ipset_session *session, + enum ipset_io_type what) +.sp +int ipset_session_io_close(struct ipset_session *session, + enum ipset_io_type what) +.SH DESCRIPTION +libipset provides a library interface to +.BR ipset(8). +The integer return valued functions return 0 on success and a negative +value on failure. +.TP +ipset_load_types +Loads in the supported ipset types in the library and make them +available for the ipset interface. + +.TP +ipset_init +Initializes the ipset interface: allocates and initializes the required +internal structures, opens up the netlink channel. The function returns +the library interface structure of type +.B +struct ipset * +or +.B NULL +on failure. + +.TP +ipset_parse_argv +Parses the +.B argc +lenght of array of strings +.B argv +with the already initialized +.B +ipset +library structure. +If the command is successfully parsed, it is then submitted to the kernel +to execute. In the case of error, the textual error message is printed +and a negative number is returned. + +.TP +ipset_parse_line +Parses the string +.B line +with the already initialized +.B +ipset +library structure. The line is supposed to contain +a single ipset command in restore format. If the command is successfully +parsed, it is then submitted to the kernel to execute. In the case of +error, the textual error message is printed and a negative number is +returned. + +.TP +ipset_parse_stream +Parses the stream +.B f +with the already initialized +.B +ipset +library structure. The stream may contain multiple newline +separated ipset commands in restore format. The commands are parsed +and then submitted to the kernel in batches for efficiecy. In the case of +error, the textual error message is printed and a negative number is +returned. + +.TP +ipset_fini +Closes the netlink channel, closes opened streams and releases allocated +structures holding by the +.B ipset +library structure. + +.PP +The following functions makes possible to customize the interface. +.TP +ipset_custom_printf +Sets or resets the print functions for the +.B +ipset +library structure, where +.B +custom_error +is the custom error print function for the internal library errors, +.B +standard_error +is the print function for the netlink/kernel related errors and +.B +outfn +is the output function to print the result of list/save commands. +The +.B +p +pointer makes possible to pass arbitrary structure to the custom +print functions. If +.B +NULL +is passed instead of a function pointer, the default print function +is set for the given task. If any of the print functions is non-default, +then the +.I +version, +.I +help, +.I +interactive +ipset commands are ignored. + +.TP +ipset_session +The function returns the session structure +of the +.B +ipset +library structure, in order to manipulate the IO parameters. + +.TP +ipset_session_full_io +You can controll the full IO, i.e. input (restore) and output (save) +separatedly by the function. The +.B +session +parameter is the session structure of the library interface, +.B +filename +is the filename you want to use for input or output +and +.B +what +tells the function you want to set input or output file. +If there's an already opened file for the given IO mode, it is closed. +The function returns an error if normal mode is in use. If +.B +NULL +is passed instead of a filename, already opened file is closed +and the normal stream is set for the given IO mode (stdin for input, +stdout for output). Input/output files can be set separatedly. + +.TP +ipset_session_normal_io +You can controll the normal IO, which corresponds to the interface +provided by +.B +ipset(8) +itself. +.B +session +parameter is the session structure of the library interface, +.B +filename +is the filename you want to use for input or output +and +.B +what +tells the function you want to set input or output file. +If there's an already opened file for input/output, it is closed. +The function returns an error if full mode is in use. If +.B +NULL +is passed instead of a filename, already opened file is closed +and the normal stream is set for the given IO mode (stdin for input, +stdout for output). Input/output files cannot be set separatedly. + +.TP +ipset_session_io_stream +The function returns the stream set for the +.B +session +where +.B +what +tells the funtion you want to get the input or the output stream. + +.TP +ipset_session_io_close +The function closes the stream for the +.B +session +where +.B +what +tells the funtion you want to close the input or the output +stream. After closing, the standard streams are set: stdin for input, +stdout for output. + +.SH AUTHORS +ipset/libipset was designed and written by Jozsef Kadlecsik. + +.SH SEE ALSO +.BR ipset(8), +.br +/usr/include/libipset/ipset.h +/usr/include/libipset/session.h diff --git a/lib/libipset.map b/lib/libipset.map new file mode 100644 index 0000000..7a4a33c --- /dev/null +++ b/lib/libipset.map @@ -0,0 +1,204 @@ +/* + * These are library version numbers in here - not to be confused + * with the API numbers used with libtool's -version-info string. + */ +LIBIPSET_1.0 { +global: + ipset_strlcpy; + ipset_data_flags_test; + ipset_data_flags_set; + ipset_data_flags_unset; + ipset_data_ignored; + ipset_data_set; + ipset_data_get; + ipset_data_setname; + ipset_data_family; + ipset_data_cidr; + ipset_data_flags; + ipset_data_reset; + ipset_data_init; + ipset_data_fini; + ipset_data_sizeof; + ipset_errcode; + id_to_icmp; + icmp_to_name; + name_to_icmp; + id_to_icmpv6; + icmpv6_to_name; + name_to_icmpv6; + ipset_get_nlmsg_type; + ipset_parse_ether; + ipset_parse_port; + ipset_parse_tcpudp_port; + ipset_parse_tcp_port; + ipset_parse_single_tcp_port; + ipset_parse_proto; + ipset_parse_icmp; + ipset_parse_icmpv6; + ipset_parse_proto_port; + ipset_parse_family; + ipset_parse_ip; + ipset_parse_single_ip; + ipset_parse_net; + ipset_parse_range; + ipset_parse_netrange; + ipset_parse_iprange; + ipset_parse_ipnet; + ipset_parse_ip4_single6; + ipset_parse_ip4_net6; + ipset_parse_name; + ipset_parse_before; + ipset_parse_after; + ipset_parse_setname; + ipset_parse_uint32; + ipset_parse_uint8; + ipset_parse_netmask; + ipset_parse_flag; + ipset_parse_typename; + ipset_parse_iface; + ipset_parse_output; + ipset_parse_ignored; + ipset_parse_elem; + ipset_call_parser; + ipset_parse_iptimeout; + ipset_parse_name_compat; + ipset_print_ether; + ipset_print_family; + ipset_print_type; + ipset_print_ip; + ipset_print_ipaddr; + ipset_print_number; + ipset_print_name; + ipset_print_port; + ipset_print_iface; + ipset_print_proto; + ipset_print_icmp; + ipset_print_icmpv6; + ipset_print_proto_port; + ipset_print_flag; + ipset_print_elem; + ipset_print_data; + ipset_session_data; + ipset_session_handle; + ipset_saved_type; + ipset_session_lineno; + ipset_session_report; + ipset_session_report_reset; + ipset_session_error; + ipset_session_warning; + ipset_envopt_parse; + ipset_envopt_test; + ipset_session_output; + ipset_commit; + ipset_cmd; + ipset_session_init; + ipset_session_fini; + ipset_debug_msg; + ipset_cache_add; + ipset_cache_del; + ipset_cache_rename; + ipset_cache_swap; + ipset_cache_init; + ipset_cache_fini; + ipset_type_get; + ipset_type_check; + ipset_type_add; + ipset_types; + ipset_typename_resolve; + ipset_match_typename; + ipset_match_cmd; + ipset_match_option; + ipset_match_envopt; + ipset_shift_argv; + +local: *; +}; + +LIBIPSET_2.0 { +global: + ipset_load_types; + ipset_port_usage; + ipset_parse_timeout; + ipset_data_test_ignored; +} LIBIPSET_1.0; + +LIBIPSET_3.0 { +global: + ipset_session_outfn; +} LIBIPSET_2.0; + +LIBIPSET_4.0 { +global: + ipset_parse_uint64; +} LIBIPSET_3.0; + +LIBIPSET_4.1 { +global: + ipset_parse_comment; + ipset_print_comment; + ipset_strlcat; +} LIBIPSET_4.0; + +LIBIPSET_4.2 { +global: + ipset_parse_mark; + ipset_print_mark; +} LIBIPSET_4.1; + +LIBIPSET_4.3 { +global: + ipset_parse_skbmark; + ipset_parse_skbprio; + ipset_print_skbmark; + ipset_print_skbprio; +} LIBIPSET_4.2; + +LIBIPSET_4.4 { +global: + ipset_parse_tcp_udp_port; + ipset_parse_uint16; +} LIBIPSET_4.3; + +LIBIPSET_4.5 { +global: + ipset_type_higher_rev; +} LIBIPSET_4.4; + +LIBIPSET_4.6 { +global: + ipset_keyword; +} LIBIPSET_4.5; + +LIBIPSET_4.7 { +global: + ipset_session_warning_as_error; +} LIBIPSET_4.6; + +LIBIPSET_4.8 { +global: + ipset_parse_filename; + ipset_session; + ipset_is_interactive; + ipset_custom_printf; + ipset_parse_argv; + ipset_parse_line; + ipset_parse_stream; + ipset_init; + ipset_fini; + ipset_session_printf_private; + ipset_envopt_set; + ipset_envopt_unset; + ipset_session_print_outfn; + ipset_session_io_full; + ipset_session_io_normal; + ipset_session_io_stream; + ipset_session_io_close; +} LIBIPSET_4.7; + +LIBIPSET_4.9 { +global: + ipset_ignored_optname; + list_sort; + ipset_session_report_msg; + ipset_session_report_type; +} LIBIPSET_4.8; diff --git a/lib/libipset.pc.in b/lib/libipset.pc.in new file mode 100644 index 0000000..1878c97 --- /dev/null +++ b/lib/libipset.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libipset +Description: Userspace library for the ipset extensions and the kernel interface +Version: @VERSION@ +Cflags: -I${includedir} +Libs: -L${libdir} -lipset +Requires.private: libmnl >= 1 diff --git a/lib/list_sort.c b/lib/list_sort.c new file mode 100644 index 0000000..56c43f5 --- /dev/null +++ b/lib/list_sort.c @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copied from the Linux kernel lib/list_sort.c file */ +#include +#include /* memset */ +#include + +#define MAX_LIST_LENGTH_BITS 20 + +/* + * Returns a list organized in an intermediate format suited + * to chaining of merge() calls: null-terminated, no reserved or + * sentinel head node, "prev" links not maintained. + */ +static struct list_head *merge(void *priv, + int (*cmp)(void *priv, struct list_head *a, + struct list_head *b), + struct list_head *a, struct list_head *b) +{ + struct list_head head, *tail = &head; + + while (a && b) { + /* if equal, take 'a' -- important for sort stability */ + if ((*cmp)(priv, a, b) <= 0) { + tail->next = a; + a = a->next; + } else { + tail->next = b; + b = b->next; + } + tail = tail->next; + } + tail->next = a?:b; + return head.next; +} + +/* + * Combine final list merge with restoration of standard doubly-linked + * list structure. This approach duplicates code from merge(), but + * runs faster than the tidier alternatives of either a separate final + * prev-link restoration pass, or maintaining the prev links + * throughout. + */ +static void merge_and_restore_back_links(void *priv, + int (*cmp)(void *priv, struct list_head *a, + struct list_head *b), + struct list_head *head, + struct list_head *a, struct list_head *b) +{ + struct list_head *tail = head; + int count = 0; + + while (a && b) { + /* if equal, take 'a' -- important for sort stability */ + if ((*cmp)(priv, a, b) <= 0) { + tail->next = a; + a->prev = tail; + a = a->next; + } else { + tail->next = b; + b->prev = tail; + b = b->next; + } + tail = tail->next; + } + tail->next = a ? : b; + + do { + /* + * In worst cases this loop may run many iterations. + * Continue callbacks to the client even though no + * element comparison is needed, so the client's cmp() + * routine can invoke cond_resched() periodically. + */ + if (unlikely(!(++count))) + (*cmp)(priv, tail->next, tail->next); + + tail->next->prev = tail; + tail = tail->next; + } while (tail->next); + + tail->next = head; + head->prev = tail; +} + +/** + * list_sort - sort a list + * @priv: private data, opaque to list_sort(), passed to @cmp + * @head: the list to sort + * @cmp: the elements comparison function + * + * This function implements "merge sort", which has O(nlog(n)) + * complexity. + * + * The comparison function @cmp must return a negative value if @a + * should sort before @b, and a positive value if @a should sort after + * @b. If @a and @b are equivalent, and their original relative + * ordering is to be preserved, @cmp must return 0. + */ +void list_sort(void *priv, struct list_head *head, + int (*cmp)(void *priv, struct list_head *a, + struct list_head *b)) +{ + struct list_head *part[MAX_LIST_LENGTH_BITS+1]; /* sorted partial lists + -- last slot is a sentinel */ + int lev; /* index into part[] */ + int max_lev = 0; + struct list_head *list; + + if (list_empty(head)) + return; + + memset(part, 0, sizeof(part)); + + head->prev->next = NULL; + list = head->next; + + while (list) { + struct list_head *cur = list; + list = list->next; + cur->next = NULL; + + for (lev = 0; part[lev]; lev++) { + cur = merge(priv, cmp, part[lev], cur); + part[lev] = NULL; + } + if (lev > max_lev) { + if (unlikely(lev >= MAX_LIST_LENGTH_BITS)) { + // printk_once(KERN_DEBUG "list too long for efficiency\n"); + lev--; + } + max_lev = lev; + } + part[lev] = cur; + } + + for (lev = 0; lev < max_lev; lev++) + if (part[lev]) + list = merge(priv, cmp, part[lev], list); + + merge_and_restore_back_links(priv, cmp, head, part[max_lev], list); +} diff --git a/lib/mnl.c b/lib/mnl.c new file mode 100644 index 0000000..4ce90b4 --- /dev/null +++ b/lib/mnl.c @@ -0,0 +1,172 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* assert */ +#include /* errno */ +#include /* calloc, free */ +#include /* time */ +#include /* hto* */ + +#include /* enum ipset_cmd */ +#include /* D() */ +#include /* ipset_session_handle */ +#include /* IPSET_ENV_EXIST */ +#include /* UNUSED */ +#include /* prototypes */ + +#ifndef NFNL_SUBSYS_IPSET +#define NFNL_SUBSYS_IPSET 6 +#endif + +/* Internal data structure for the kernel-userspace communication parameters */ +struct ipset_handle { + struct mnl_socket *h; /* the mnl socket */ + unsigned int seq; /* netlink message sequence number */ + unsigned int portid; /* the socket port identifier */ + mnl_cb_t *cb_ctl; /* control block callbacks */ + void *data; /* data pointer */ +}; + +/* Netlink flags of the commands */ +static const uint16_t cmdflags[] = { + [IPSET_CMD_CREATE-1] = NLM_F_REQUEST|NLM_F_ACK| + NLM_F_CREATE|NLM_F_EXCL, + [IPSET_CMD_DESTROY-1] = NLM_F_REQUEST|NLM_F_ACK, + [IPSET_CMD_FLUSH-1] = NLM_F_REQUEST|NLM_F_ACK, + [IPSET_CMD_RENAME-1] = NLM_F_REQUEST|NLM_F_ACK, + [IPSET_CMD_SWAP-1] = NLM_F_REQUEST|NLM_F_ACK, + [IPSET_CMD_LIST-1] = NLM_F_REQUEST|NLM_F_ACK|NLM_F_DUMP, + [IPSET_CMD_SAVE-1] = NLM_F_REQUEST|NLM_F_ACK|NLM_F_DUMP, + [IPSET_CMD_ADD-1] = NLM_F_REQUEST|NLM_F_ACK|NLM_F_EXCL, + [IPSET_CMD_DEL-1] = NLM_F_REQUEST|NLM_F_ACK|NLM_F_EXCL, + [IPSET_CMD_TEST-1] = NLM_F_REQUEST|NLM_F_ACK, + [IPSET_CMD_HEADER-1] = NLM_F_REQUEST, + [IPSET_CMD_TYPE-1] = NLM_F_REQUEST, + [IPSET_CMD_PROTOCOL-1] = NLM_F_REQUEST, +}; + +/** + * ipset_get_nlmsg_type - get ipset netlink message type + * @nlh: pointer to the netlink message header + * + * Returns the ipset netlink message type, i.e. the ipset command. + */ +int +ipset_get_nlmsg_type(const struct nlmsghdr *nlh) +{ + return nlh->nlmsg_type & ~(NFNL_SUBSYS_IPSET << 8); +} + +static void +ipset_mnl_fill_hdr(struct ipset_handle *handle, enum ipset_cmd cmd, + void *buffer, size_t len UNUSED, uint8_t envflags) +{ + struct nlmsghdr *nlh; + struct nfgenmsg *nfg; + + assert(handle); + assert(buffer); + assert(cmd > IPSET_CMD_NONE && cmd < IPSET_MSG_MAX); + + nlh = mnl_nlmsg_put_header(buffer); + nlh->nlmsg_type = cmd | (NFNL_SUBSYS_IPSET << 8); + nlh->nlmsg_flags = cmdflags[cmd - 1]; + if (envflags & IPSET_ENV_EXIST) + nlh->nlmsg_flags &= ~NLM_F_EXCL; + + nfg = mnl_nlmsg_put_extra_header(nlh, sizeof(struct nfgenmsg)); + nfg->nfgen_family = AF_INET; + nfg->version = NFNETLINK_V0; + nfg->res_id = htons(0); +} + +static int +ipset_mnl_query(struct ipset_handle *handle, void *buffer, size_t len) +{ + struct nlmsghdr *nlh = buffer; + int ret; + + assert(handle); + assert(buffer); + + nlh->nlmsg_seq = ++handle->seq; +#ifdef IPSET_DEBUG + ipset_debug_msg("sent", nlh, nlh->nlmsg_len); +#endif + if (mnl_socket_sendto(handle->h, nlh, nlh->nlmsg_len) < 0) + return -ECOMM; + + ret = mnl_socket_recvfrom(handle->h, buffer, len); +#ifdef IPSET_DEBUG + ipset_debug_msg("received", buffer, ret); +#endif + while (ret > 0) { + ret = mnl_cb_run2(buffer, ret, + handle->seq, handle->portid, + handle->cb_ctl[NLMSG_MIN_TYPE], + handle->data, + handle->cb_ctl, NLMSG_MIN_TYPE); + D("nfln_cb_run2, ret: %d, errno %d", ret, errno); + if (ret <= 0) + break; + ret = mnl_socket_recvfrom(handle->h, buffer, len); + D("message received, ret: %d", ret); + } + return ret; +} + +static struct ipset_handle * +ipset_mnl_init(mnl_cb_t *cb_ctl, void *data) +{ + struct ipset_handle *handle; + + assert(cb_ctl); + assert(data); + + handle = calloc(1, sizeof(*handle)); + if (!handle) + return NULL; + + handle->h = mnl_socket_open(NETLINK_NETFILTER); + if (!handle->h) + goto free_handle; + + if (mnl_socket_bind(handle->h, 0, MNL_SOCKET_AUTOPID) < 0) + goto close_nl; + + handle->portid = mnl_socket_get_portid(handle->h); + handle->cb_ctl = cb_ctl; + handle->data = data; + handle->seq = time(NULL); + + return handle; + +close_nl: + mnl_socket_close(handle->h); +free_handle: + free(handle); + + return NULL; +} + +static int +ipset_mnl_fini(struct ipset_handle *handle) +{ + assert(handle); + + if (handle->h) + mnl_socket_close(handle->h); + + free(handle); + return 0; +} + +const struct ipset_transport ipset_mnl_transport = { + .init = ipset_mnl_init, + .fini = ipset_mnl_fini, + .fill_hdr = ipset_mnl_fill_hdr, + .query = ipset_mnl_query, +}; diff --git a/lib/parse.c b/lib/parse.c new file mode 100644 index 0000000..5943f05 --- /dev/null +++ b/lib/parse.c @@ -0,0 +1,2039 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* assert */ +#include /* errno */ +#include /* ULLONG_MAX */ +#include /* getservbyname, getaddrinfo */ +#include /* strtoull, etc. */ +#include /* getaddrinfo */ +#include /* getaddrinfo, AF_ */ +#include /* ETH_ALEN */ +#include /* IFNAMSIZ */ +#include /* IPPROTO_ */ + +#include /* D() */ +#include /* IPSET_OPT_* */ +#include /* name_to_icmp */ +#include /* name_to_icmpv6 */ +#include /* prefixlen_netmask_map */ +#include /* ipset_err */ +#include /* ipset_type_get */ +#include /* string utilities */ +#include /* prototypes */ +#include "../config.h" + +#ifndef ULLONG_MAX +#define ULLONG_MAX 18446744073709551615ULL +#endif + +/* Parse input data */ + +#define cidr_separator(str) ipset_strchr(str, IPSET_CIDR_SEPARATOR) +#define range_separator(str) ipset_strchr(str, IPSET_RANGE_SEPARATOR) +#define elem_separator(str) ipset_strchr(str, IPSET_ELEM_SEPARATOR) +#define name_separator(str) ipset_strchr(str, IPSET_NAME_SEPARATOR) +#define proto_separator(str) ipset_strchr(str, IPSET_PROTO_SEPARATOR) + +#define syntax_err(fmt, args...) \ + ipset_err(session, "Syntax error: " fmt , ## args) + +static char * +ipset_strchr(const char *str, const char *sep) +{ + char *match; + + assert(str); + assert(sep); + + for (; *sep != '\0'; sep++) { + match = strchr(str, sep[0]); + if (match != NULL && + str[0] != sep[0] && + str[strlen(str)-1] != sep[0]) + return match; + } + + return NULL; +} + +static char * +escape_range_separator(const char *str) +{ + const char *tmp = NULL; + + if (STRNEQ(str, IPSET_ESCAPE_START, 1)) { + tmp = strstr(str, IPSET_ESCAPE_END); + if (tmp == NULL) + return NULL; + } + + return range_separator(tmp == NULL ? str : tmp); +} + +/* + * Parser functions, shamelessly taken from iptables.c, ip6tables.c + * and parser.c from libnetfilter_conntrack. + */ + +/* + * Parse numbers + */ +static int +string_to_number_ll(struct ipset_session *session, + const char *str, + unsigned long long min, + unsigned long long max, + unsigned long long *ret) +{ + unsigned long long number = 0; + char *end; + + /* Handle hex, octal, etc. */ + errno = 0; + number = strtoull(str, &end, 0); + if (*end == '\0' && end != str && errno != ERANGE) { + /* we parsed a number, let's see if we want this */ + if (min <= number && (!max || number <= max)) { + *ret = number; + return 0; + } else + errno = ERANGE; + } + if (errno == ERANGE && max) + return syntax_err("'%s' is out of range %llu-%llu", + str, min, max); + else if (errno == ERANGE) + return syntax_err("'%s' is out of range %llu-%llu", + str, min, ULLONG_MAX); + else + return syntax_err("'%s' is invalid as number", str); +} + +static int +string_to_u8(struct ipset_session *session, + const char *str, uint8_t *ret) +{ + int err; + unsigned long long num = 0; + + err = string_to_number_ll(session, str, 0, 255, &num); + *ret = num; + + return err; +} + +static int +string_to_cidr(struct ipset_session *session, + const char *str, uint8_t min, uint8_t max, uint8_t *ret) +{ + int err = string_to_u8(session, str, ret); + + if (!err && (*ret < min || *ret > max)) + return syntax_err("'%s' is out of range %u-%u", + str, min, max); + + return err; +} + +static int +string_to_u16(struct ipset_session *session, + const char *str, uint16_t *ret) +{ + int err; + unsigned long long num = 0; + + err = string_to_number_ll(session, str, 0, USHRT_MAX, &num); + *ret = num; + + return err; +} + +static int +string_to_u32(struct ipset_session *session, + const char *str, uint32_t *ret) +{ + int err; + unsigned long long num = 0; + + err = string_to_number_ll(session, str, 0, UINT_MAX, &num); + *ret = num; + + return err; +} + +/** + * ipset_parse_ether - parse ethernet address + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an ethernet address. The parsed ethernet + * address is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_ether(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + size_t len, p = 0, i = 0; + unsigned char ether[ETH_ALEN]; + + assert(session); + assert(opt == IPSET_OPT_ETHER); + assert(str); + + len = strlen(str); + + if (len > ETH_ALEN * 3 - 1) + goto error; + + for (i = 0; i < ETH_ALEN; i++) { + long number; + char *end; + + number = strtol(str + p, &end, 16); + p = end - str + 1; + + if (((*end == ':' && i < ETH_ALEN - 1) || + (*end == '\0' && i == ETH_ALEN - 1)) && + number >= 0 && number <= 255) + ether[i] = number; + else + goto error; + } + return ipset_session_data_set(session, opt, ether); + +error: + return syntax_err("cannot parse '%s' as ethernet address", str); +} + +static char * +ipset_strdup(struct ipset_session *session, const char *str) +{ + char *tmp = strdup(str); + + if (tmp == NULL) + ipset_err(session, + "Cannot allocate memory to duplicate %s.", + str); + return tmp; +} + +static char * +find_range_separator(struct ipset_session *session, char *str) +{ + char *esc; + + if (STRNEQ(str, IPSET_ESCAPE_START, 1)) { + esc = strstr(str, IPSET_ESCAPE_END); + if (esc == NULL) { + syntax_err("cannot find closing escape character " + "'%s' in %s", IPSET_ESCAPE_END, str); + return str; + } + if (esc[1] == '\0') + /* No range separator, just a single escaped elem */ + return NULL; + esc++; + if (!STRNEQ(esc, IPSET_RANGE_SEPARATOR, 1)) { + *esc = '\0'; + syntax_err("range separator expected after " + "'%s'", str); + return str; + } + return esc; + } + return range_separator(str); +} + +static char * +strip_escape(struct ipset_session *session, char *str) +{ + if (STRNEQ(str, IPSET_ESCAPE_START, 1)) { + if (!STREQ(str + strlen(str) - 1, IPSET_ESCAPE_END)) { + syntax_err("cannot find closing escape character " + "'%s' in %s", IPSET_ESCAPE_END, str); + return NULL; + } + str++; + str[strlen(str) - 1] = '\0'; + } + return str; +} + +/* + * Parse TCP service names or port numbers + */ +static int +parse_portname(struct ipset_session *session, const char *str, + uint16_t *port, const char *proto) +{ + char *saved, *tmp; + struct servent *service; + + saved = tmp = ipset_strdup(session, str); + if (tmp == NULL) + return -1; + tmp = strip_escape(session, tmp); + if (tmp == NULL) + goto error; + + service = getservbyname(tmp, proto); + if (service != NULL) { + *port = ntohs((uint16_t) service->s_port); + free(saved); + return 0; + } + +error: + free(saved); + return ipset_warn(session, "cannot parse '%s' as a %s port", + str, proto); +} + +/** + * ipset_parse_single_port - parse a single port number or name + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * @proto: protocol + * + * Parse string as a single port number or name. The parsed port + * number is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_port(struct ipset_session *session, + enum ipset_opt opt, const char *str, + const char *proto) +{ + uint16_t port; + + assert(session); + assert(opt == IPSET_OPT_PORT || opt == IPSET_OPT_PORT_TO); + assert(str); + + if (parse_portname(session, str, &port, proto) == 0) { + return ipset_session_data_set(session, opt, &port); + } + /* Error is stored as warning in session report */ + if (string_to_u16(session, str, &port) == 0) { + /* No error, so reset false error messages */ + ipset_session_report_reset(session); + return ipset_session_data_set(session, opt, &port); + } + /* Restore warning as error */ + return ipset_session_warning_as_error(session); +} + +/** + * ipset_parse_mark - parse a mark + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as a mark. The parsed mark number is + * stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_mark(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + uint32_t mark; + int err; + + assert(session); + assert(str); + + if ((err = string_to_u32(session, str, &mark)) == 0) + err = ipset_session_data_set(session, opt, &mark); + + if (!err) + /* No error, so reset false error messages! */ + ipset_session_report_reset(session); + return err; +} + +/** + * ipset_parse_tcpudp_port - parse TCP/UDP port name, number, or range of them + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * @proto: TCP|UDP + * + * Parse string as a TCP/UDP port name or number or range of them + * separated by a dash. The parsed port numbers are stored + * in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_tcpudp_port(struct ipset_session *session, + enum ipset_opt opt, const char *str, const char *proto) +{ + char *a, *saved, *tmp; + int err = 0; + + assert(session); + assert(opt == IPSET_OPT_PORT); + assert(str); + + saved = tmp = ipset_strdup(session, str); + if (tmp == NULL) + return -1; + + a = find_range_separator(session, tmp); + if (a == tmp) { + err = -1; + goto error; + } + + if (a != NULL) { + /* port-port */ + *a++ = '\0'; + err = ipset_parse_port(session, IPSET_OPT_PORT_TO, a, proto); + if (err) + goto error; + } + err = ipset_parse_port(session, opt, tmp, proto); + +error: + free(saved); + return err; +} + +/** + * ipset_parse_tcp_port - parse TCP port name, number, or range of them + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as a TCP port name or number or range of them + * separated by a dash. The parsed port numbers are stored + * in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_tcp_port(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + return ipset_parse_tcpudp_port(session, opt, str, "tcp"); +} + +/** + * ipset_parse_single_tcp_port - parse TCP port name or number + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as a single TCP port name or number. + * The parsed port number is stored + * in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_single_tcp_port(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + assert(session); + assert(opt == IPSET_OPT_PORT || opt == IPSET_OPT_PORT_TO); + assert(str); + + return ipset_parse_port(session, opt, str, "tcp"); +} + +/** + * ipset_parse_proto - parse protocol name + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as a protocol name. + * The parsed protocol is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_proto(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + const struct protoent *protoent; + uint8_t proto = 0; + + assert(session); + assert(opt == IPSET_OPT_PROTO); + assert(str); + + protoent = getprotobyname(strcasecmp(str, "icmpv6") == 0 + ? "ipv6-icmp" : str); + if (protoent == NULL) { + uint8_t protonum = 0; + + if (string_to_u8(session, str, &protonum) || + (protoent = getprotobynumber(protonum)) == NULL) + return syntax_err("cannot parse '%s' " + "as a protocol", str); + } + proto = protoent->p_proto; + if (!proto) + return syntax_err("Unsupported protocol '%s'", str); + + return ipset_session_data_set(session, opt, &proto); +} + +/* Parse ICMP and ICMPv6 type/code */ +static int +parse_icmp_typecode(struct ipset_session *session, + enum ipset_opt opt, const char *str, + const char *family) +{ + uint16_t typecode; + uint8_t type, code; + char *a, *saved, *tmp; + int err; + + saved = tmp = ipset_strdup(session, str); + if (tmp == NULL) + return -1; + a = cidr_separator(tmp); + if (a == NULL) { + free(saved); + return ipset_err(session, + "Cannot parse %s as an %s type/code.", + str, family); + } + *a++ = '\0'; + if ((err = string_to_u8(session, tmp, &type)) != 0 || + (err = string_to_u8(session, a, &code)) != 0) + goto error; + + typecode = (type << 8) | code; + err = ipset_session_data_set(session, opt, &typecode); + +error: + free(saved); + return err; +} + +/** + * ipset_parse_icmp - parse an ICMP name or type/code + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an ICMP name or type/code numbers. + * The parsed ICMP type/code is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_icmp(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + uint16_t typecode; + + assert(session); + assert(opt == IPSET_OPT_PORT); + assert(str); + + if (name_to_icmp(str, &typecode) < 0) + return parse_icmp_typecode(session, opt, str, "ICMP"); + + return ipset_session_data_set(session, opt, &typecode); +} + +/** + * ipset_parse_icmpv6 - parse an ICMPv6 name or type/code + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an ICMPv6 name or type/code numbers. + * The parsed ICMPv6 type/code is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_icmpv6(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + uint16_t typecode; + + assert(session); + assert(opt == IPSET_OPT_PORT); + assert(str); + + if (name_to_icmpv6(str, &typecode) < 0) + return parse_icmp_typecode(session, opt, str, "ICMPv6"); + + return ipset_session_data_set(session, opt, &typecode); +} + +/** + * ipset_parse_proto_port - parse (optional) protocol and a single port + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as a protocol and port, separated by a colon. + * The protocol part is optional. + * The parsed protocol and port numbers are stored in the data + * blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_proto_port(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + struct ipset_data *data; + char *a, *saved, *tmp; + const char *proto; + uint8_t p = IPPROTO_TCP; + int err = 0; + + assert(session); + assert(opt == IPSET_OPT_PORT); + assert(str); + + data = ipset_session_data(session); + saved = tmp = ipset_strdup(session, str); + if (tmp == NULL) + return -1; + + a = proto_separator(tmp); + if (a != NULL) { + uint8_t family = ipset_data_family(data); + + /* proto:port */ + *a++ = '\0'; + err = ipset_parse_proto(session, IPSET_OPT_PROTO, tmp); + if (err) + goto error; + + p = *(const uint8_t *) ipset_data_get(data, IPSET_OPT_PROTO); + switch (p) { + case IPPROTO_TCP: + case IPPROTO_SCTP: + case IPPROTO_UDP: + case IPPROTO_UDPLITE: + proto = tmp; + tmp = a; + goto parse_port; + case IPPROTO_ICMP: + if (family != NFPROTO_IPV4) { + syntax_err("Protocol ICMP can be used " + "with family inet only"); + goto error; + } + err = ipset_parse_icmp(session, opt, a); + break; + case IPPROTO_ICMPV6: + if (family != NFPROTO_IPV6) { + syntax_err("Protocol ICMPv6 can be used " + "with family inet6 only"); + goto error; + } + err = ipset_parse_icmpv6(session, opt, a); + break; + default: + if (!STREQ(a, "0")) { + syntax_err("Protocol %s can be used " + "with pseudo port value 0 only.", + tmp); + err = -1; + goto error; + } + ipset_data_flags_set(data, IPSET_FLAG(opt)); + } + goto error; + } else { + proto = "tcp"; + err = ipset_data_set(data, IPSET_OPT_PROTO, &p); + if (err) + goto error; + } +parse_port: + err = ipset_parse_tcpudp_port(session, opt, tmp, proto); + +error: + free(saved); + return err; +} + +/** + * ipset_parse_tcp_udp_port - parse (optional) protocol and a single port + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as a protocol and port, separated by a colon. + * The protocol part is optional, but may only be "tcp" or "udp". + * The parsed port numbers are stored in the data + * blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_tcp_udp_port(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + struct ipset_data *data; + int err = 0; + uint8_t p = 0; + + err = ipset_parse_proto_port(session, opt, str); + + if (!err) { + data = ipset_session_data(session); + + p = *(const uint8_t *) ipset_data_get(data, IPSET_OPT_PROTO); + if (p != IPPROTO_TCP && p != IPPROTO_UDP) { + syntax_err("Only protocols TCP and UDP are valid"); + err = -1 ; + } else { + /* Reset the protocol to none */ + ipset_data_flags_unset(data, IPSET_FLAG(IPSET_OPT_PROTO)); + } + } + return err; +} + +/** + * ipset_parse_family - parse INET|INET6 family names + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an INET|INET6 family name. + * The value is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_family(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + struct ipset_data *data; + uint8_t family; + + assert(session); + assert(opt == IPSET_OPT_FAMILY); + assert(str); + + data = ipset_session_data(session); + if (ipset_data_flags_test(data, IPSET_FLAG(IPSET_OPT_FAMILY)) + && !ipset_data_test_ignored(data, IPSET_OPT_FAMILY)) + syntax_err("protocol family may not be specified " + "multiple times"); + + if (STREQ(str, "inet") || STREQ(str, "ipv4") || STREQ(str, "-4")) + family = NFPROTO_IPV4; + else if (STREQ(str, "inet6") || STREQ(str, "ipv6") || STREQ(str, "-6")) + family = NFPROTO_IPV6; + else if (STREQ(str, "any") || STREQ(str, "unspec")) + family = NFPROTO_UNSPEC; + else + return syntax_err("unknown inet family %s", str); + + return ipset_data_set(data, opt, &family); +} + +/* + * Parse IPv4/IPv6 addresses, networks and ranges. + * We resolve hostnames but just the first IP address is used. + */ + +static void +print_warn(struct ipset_session *session) +{ + if (!ipset_envopt_test(session, IPSET_ENV_QUIET)) + fprintf(stderr, "Warning: %s", + ipset_session_report_msg(session)); + ipset_session_report_reset(session); +} + +#ifdef HAVE_GETHOSTBYNAME2 +static int +get_hostbyname2(struct ipset_session *session, + enum ipset_opt opt, + const char *str, + int af) +{ + struct hostent *h = gethostbyname2(str, af); + + if (h == NULL) { + syntax_err("cannot parse %s: resolving to %s address failed", + str, af == AF_INET ? "IPv4" : "IPv6"); + return -1; + } + if (h->h_addr_list[1] != NULL) { + ipset_warn(session, + "%s resolves to multiple addresses: " + "using only the first one returned " + "by the resolver.", + str); + print_warn(session); + } + + return ipset_session_data_set(session, opt, h->h_addr_list[0]); +} + +static int +parse_ipaddr(struct ipset_session *session, + enum ipset_opt opt, const char *str, + uint8_t family) +{ + uint8_t m = family == NFPROTO_IPV4 ? 32 : 128; + int af = family == NFPROTO_IPV4 ? AF_INET : AF_INET6; + int err = 0, range = 0; + char *saved = ipset_strdup(session, str); + char *a, *tmp = saved; + enum ipset_opt copt, opt2; + + if (opt == IPSET_OPT_IP) { + copt = IPSET_OPT_CIDR; + opt2 = IPSET_OPT_IP_TO; + } else { + copt = IPSET_OPT_CIDR2; + opt2 = IPSET_OPT_IP2_TO; + } + + if (tmp == NULL) + return -1; + if ((a = cidr_separator(tmp)) != NULL) { + /* IP/mask */ + *a++ = '\0'; + + if ((err = string_to_cidr(session, a, 0, m, &m)) != 0 || + (err = ipset_session_data_set(session, copt, &m)) != 0) + goto out; + } else { + a = find_range_separator(session, tmp); + if (a == tmp) { + err = -1; + goto out; + } + if (a != NULL) { + /* IP-IP */ + *a++ = '\0'; + D("range %s", a); + range++; + } + } + tmp = strip_escape(session, tmp); + if (tmp == NULL) { + err = -1; + goto out; + } + if ((err = get_hostbyname2(session, opt, tmp, af)) != 0 || + !range) + goto out; + a = strip_escape(session, a); + if (a == NULL) { + err = -1; + goto out; + } + err = get_hostbyname2(session, opt2, a, af); + +out: + free(saved); + return err; +} +#else +static struct addrinfo * +call_getaddrinfo(struct ipset_session *session, const char *str, + uint8_t family) +{ + struct addrinfo hints; + struct addrinfo *res; + int err; + + memset(&hints, 0, sizeof(hints)); + hints.ai_flags = AI_CANONNAME; + hints.ai_family = family; + hints.ai_socktype = SOCK_RAW; + hints.ai_protocol = 0; + hints.ai_next = NULL; + + if ((err = getaddrinfo(str, NULL, &hints, &res)) != 0) { + syntax_err("cannot resolve '%s' to an %s address: %s", + str, family == NFPROTO_IPV6 ? "IPv6" : "IPv4", + gai_strerror(err)); + return NULL; + } else + return res; +} + +static int +get_addrinfo(struct ipset_session *session, + enum ipset_opt opt, + const char *str, + struct addrinfo **info, + uint8_t family) +{ + struct addrinfo *i; + size_t addrlen = family == NFPROTO_IPV4 ? sizeof(struct sockaddr_in) + : sizeof(struct sockaddr_in6); + int found, err = 0; + + if ((*info = call_getaddrinfo(session, str, family)) == NULL) { + syntax_err("cannot parse %s: resolving to %s address failed", + str, family == NFPROTO_IPV4 ? "IPv4" : "IPv6"); + return EINVAL; + } + + for (i = *info, found = 0; i != NULL; i = i->ai_next) { + if (i->ai_family != family || i->ai_addrlen != addrlen) + continue; + if (found == 0) { + if (family == NFPROTO_IPV4) { + /* Workaround: direct cast increases + * required alignment on Sparc + */ + const struct sockaddr_in *saddr = + (void *)i->ai_addr; + err = ipset_session_data_set(session, + opt, &saddr->sin_addr); + } else { + /* Workaround: direct cast increases + * required alignment on Sparc + */ + const struct sockaddr_in6 *saddr = + (void *)i->ai_addr; + err = ipset_session_data_set(session, + opt, &saddr->sin6_addr); + } + } else if (found == 1) { + ipset_warn(session, + "%s resolves to multiple addresses: " + "using only the first one returned " + "by the resolver.", + str); + print_warn(session); + } + found++; + } + if (found == 0) + return syntax_err("cannot parse %s: " + "%s address could not be resolved", + str, + family == NFPROTO_IPV4 ? "IPv4" : "IPv6"); + return err; +} + +static int +parse_ipaddr(struct ipset_session *session, + enum ipset_opt opt, const char *str, + uint8_t family) +{ + uint8_t m = family == NFPROTO_IPV4 ? 32 : 128; + int aerr = EINVAL, err = 0, range = 0; + char *saved = ipset_strdup(session, str); + char *a, *tmp = saved; + struct addrinfo *info; + enum ipset_opt copt, opt2; + + if (opt == IPSET_OPT_IP) { + copt = IPSET_OPT_CIDR; + opt2 = IPSET_OPT_IP_TO; + } else { + copt = IPSET_OPT_CIDR2; + opt2 = IPSET_OPT_IP2_TO; + } + + if (tmp == NULL) + return -1; + if ((a = cidr_separator(tmp)) != NULL) { + /* IP/mask */ + *a++ = '\0'; + + if ((err = string_to_cidr(session, a, 0, m, &m)) != 0 || + (err = ipset_session_data_set(session, copt, &m)) != 0) + goto out; + } else { + a = find_range_separator(session, tmp); + if (a == tmp) { + err = -1; + goto out; + } + if (a != NULL) { + /* IP-IP */ + *a++ = '\0'; + D("range %s", a); + range++; + } + } + tmp = strip_escape(session, tmp); + if (tmp == NULL) { + err = -1; + goto out; + } + if ((aerr = get_addrinfo(session, opt, tmp, &info, family)) != 0 || + !range) + goto out; + freeaddrinfo(info); + a = strip_escape(session, a); + if (a == NULL) { + err = -1; + goto out; + } + aerr = get_addrinfo(session, opt2, a, &info, family); + +out: + if (aerr != EINVAL) + /* getaddrinfo not failed */ + freeaddrinfo(info); + else if (aerr) + err = -1; + free(saved); + return err; +} +#endif + +enum ipaddr_type { + IPADDR_ANY, + IPADDR_PLAIN, + IPADDR_NET, + IPADDR_RANGE, +}; + +static inline bool +cidr_hostaddr(const char *str, uint8_t family) +{ + char *a = cidr_separator(str); + + return family == NFPROTO_IPV4 ? STREQ(a, "/32") : STREQ(a, "/128"); +} + +static int +parse_ip(struct ipset_session *session, + enum ipset_opt opt, const char *str, enum ipaddr_type addrtype) +{ + struct ipset_data *data = ipset_session_data(session); + uint8_t family = ipset_data_family(data); + + if (family == NFPROTO_UNSPEC) { + family = NFPROTO_IPV4; + ipset_data_set(data, IPSET_OPT_FAMILY, &family); + } + + switch (addrtype) { + case IPADDR_PLAIN: + if (escape_range_separator(str) || + (cidr_separator(str) && !cidr_hostaddr(str, family))) + return syntax_err("plain IP address must be supplied: " + "%s", str); + break; + case IPADDR_NET: + if (!cidr_separator(str) || escape_range_separator(str)) + return syntax_err("IP/netblock must be supplied: %s", + str); + break; + case IPADDR_RANGE: + if (!escape_range_separator(str) || cidr_separator(str)) + return syntax_err("IP-IP range must supplied: %s", + str); + break; + case IPADDR_ANY: + default: + break; + } + + return parse_ipaddr(session, opt, str, family); +} + +/** + * ipset_parse_ip - parse IPv4|IPv6 address, range or netblock + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an IPv4|IPv6 address or address range + * or netblock. Hostnames are resolved. If family is not set + * yet in the data blob, INET is assumed. + * The values are stored in the data blob of the session. + * + * FIXME: if the hostname resolves to multiple addresses, + * the first one is used only. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_ip(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + assert(session); + assert(opt == IPSET_OPT_IP || opt == IPSET_OPT_IP2); + assert(str); + + return parse_ip(session, opt, str, IPADDR_ANY); +} + +/** + * ipset_parse_single_ip - parse a single IPv4|IPv6 address + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an IPv4|IPv6 address or hostname. If family + * is not set yet in the data blob, INET is assumed. + * The value is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_single_ip(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + assert(session); + assert(opt == IPSET_OPT_IP || + opt == IPSET_OPT_IP_TO || + opt == IPSET_OPT_IP2); + assert(str); + + return parse_ip(session, opt, str, IPADDR_PLAIN); +} + +/** + * ipset_parse_net - parse IPv4|IPv6 address/cidr + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an IPv4|IPv6 address/cidr pattern. If family + * is not set yet in the data blob, INET is assumed. + * The value is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_net(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + assert(session); + assert(opt == IPSET_OPT_IP || opt == IPSET_OPT_IP2); + assert(str); + + return parse_ip(session, opt, str, IPADDR_NET); +} + +/** + * ipset_parse_range - parse IPv4|IPv6 ranges + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an IPv4|IPv6 range separated by a dash. If family + * is not set yet in the data blob, INET is assumed. + * The values are stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_range(struct ipset_session *session, + enum ipset_opt opt ASSERT_UNUSED, const char *str) +{ + assert(session); + assert(opt == IPSET_OPT_IP || opt == IPSET_OPT_IP2); + assert(str); + + return parse_ip(session, IPSET_OPT_IP, str, IPADDR_RANGE); +} + +/** + * ipset_parse_netrange - parse IPv4|IPv6 address/cidr or range + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an IPv4|IPv6 address/cidr pattern or a range + * of addresses separated by a dash. If family is not set yet in + * the data blob, INET is assumed. + * The value is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_netrange(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + assert(session); + assert(opt == IPSET_OPT_IP || opt == IPSET_OPT_IP2); + assert(str); + + if (!(escape_range_separator(str) || cidr_separator(str))) + return syntax_err("IP/cidr or IP-IP range must be specified: " + "%s", str); + return parse_ip(session, opt, str, IPADDR_ANY); +} + +/** + * ipset_parse_iprange - parse IPv4|IPv6 address or range + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an IPv4|IPv6 address pattern or a range + * of addresses separated by a dash. If family is not set yet in + * the data blob, INET is assumed. + * The value is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_iprange(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + assert(session); + assert(opt == IPSET_OPT_IP || opt == IPSET_OPT_IP2); + assert(str); + + if (cidr_separator(str)) + return syntax_err("IP address or IP-IP range must be " + "specified: %s", str); + return parse_ip(session, opt, str, IPADDR_ANY); +} + +/** + * ipset_parse_ipnet - parse IPv4|IPv6 address or address/cidr pattern + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an IPv4|IPv6 address or address/cidr pattern. + * If family is not set yet in the data blob, INET is assumed. + * The value is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_ipnet(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + assert(session); + assert(opt == IPSET_OPT_IP || opt == IPSET_OPT_IP2); + assert(str); + + if (escape_range_separator(str)) + return syntax_err("IP address or IP/cidr must be specified: %s", + str); + return parse_ip(session, opt, str, IPADDR_ANY); +} + +/** + * ipset_parse_ip4_single6 - parse IPv4 address, range or netblock or IPv6 address + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an IPv4 address or address range + * or netblock or and IPv6 address. Hostnames are resolved. If family + * is not set yet in the data blob, INET is assumed. + * The values are stored in the data blob of the session. + * + * FIXME: if the hostname resolves to multiple addresses, + * the first one is used only. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_ip4_single6(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + struct ipset_data *data; + uint8_t family; + + assert(session); + assert(opt == IPSET_OPT_IP || opt == IPSET_OPT_IP2); + assert(str); + + data = ipset_session_data(session); + family = ipset_data_family(data); + + if (family == NFPROTO_UNSPEC) { + family = NFPROTO_IPV4; + ipset_data_set(data, IPSET_OPT_FAMILY, &family); + } + + return family == NFPROTO_IPV4 ? ipset_parse_ip(session, opt, str) + : ipset_parse_single_ip(session, opt, str); + +} + +/** + * ipset_parse_ip4_net6 - parse IPv4|IPv6 address or address/cidr pattern + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an IPv4|IPv6 address or address/cidr pattern. For IPv4, + * address range is valid too. + * If family is not set yet in the data blob, INET is assumed. + * The values are stored in the data blob of the session. + * + * FIXME: if the hostname resolves to multiple addresses, + * the first one is used only. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_ip4_net6(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + struct ipset_data *data; + uint8_t family; + + assert(session); + assert(opt == IPSET_OPT_IP || opt == IPSET_OPT_IP2); + assert(str); + + data = ipset_session_data(session); + family = ipset_data_family(data); + + if (family == NFPROTO_UNSPEC) { + family = NFPROTO_IPV4; + ipset_data_set(data, IPSET_OPT_FAMILY, &family); + } + + return family == NFPROTO_IPV4 ? + parse_ip(session, opt, str, IPADDR_ANY) : + ipset_parse_ipnet(session, opt, str); + +} + +/** + * ipset_parse_timeout - parse timeout parameter + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as a timeout parameter. We have to take into account + * the jiffies storage in kernel. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_timeout(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + int err; + unsigned long long llnum = 0; + uint32_t num = 0; + + assert(session); + assert(opt == IPSET_OPT_TIMEOUT); + assert(str); + + err = string_to_number_ll(session, str, 0, (UINT_MAX>>1)/1000, &llnum); + if (err == 0) { + /* Timeout is expected to be 32bits wide, so we have + to convert it here */ + num = llnum; + return ipset_session_data_set(session, opt, &num); + } + + return err; +} + +/** + * ipset_parse_iptimeout - parse IPv4|IPv6 address and timeout + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an IPv4|IPv6 address and timeout parameter. + * If family is not set yet in the data blob, INET is assumed. + * The value is stored in the data blob of the session. + * + * Compatibility parser. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_iptimeout(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + char *tmp, *saved, *a; + int err; + + assert(session); + assert(opt == IPSET_OPT_IP); + assert(str); + + /* IP,timeout */ + if (ipset_data_flags_test(ipset_session_data(session), + IPSET_FLAG(IPSET_OPT_TIMEOUT))) + return syntax_err("mixed syntax, timeout already specified"); + + tmp = saved = ipset_strdup(session, str); + if (saved == NULL) + return 1; + + a = elem_separator(tmp); + if (a == NULL) { + free(saved); + return syntax_err("Missing separator from %s", str); + } + *a++ = '\0'; + err = parse_ip(session, opt, tmp, IPADDR_ANY); + if (!err) + err = ipset_parse_timeout(session, IPSET_OPT_TIMEOUT, a); + + free(saved); + return err; +} + +#define check_setname(str, saved) \ +do { \ + if (strlen(str) > IPSET_MAXNAMELEN - 1) { \ + int __err; \ + __err = syntax_err("setname '%s' is longer than %u characters",\ + str, IPSET_MAXNAMELEN - 1); \ + free(saved); \ + return __err; \ + } \ +} while (0) + + +/** + * ipset_parse_name_compat - parse setname as element + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as a setname or a setname element to add to a set. + * The pattern "setname,before|after,setname" is recognized and + * parsed. + * The value is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_name_compat(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + char *saved; + char *a = NULL, *b = NULL, *tmp; + int err, before = 0; + const char *sep = IPSET_ELEM_SEPARATOR; + struct ipset_data *data; + + assert(session); + assert(opt == IPSET_OPT_NAME); + assert(str); + + data = ipset_session_data(session); + if (ipset_data_flags_test(data, IPSET_FLAG(IPSET_OPT_NAMEREF))) + syntax_err("mixed syntax, before|after option already used"); + + tmp = saved = ipset_strdup(session, str); + if (saved == NULL) + return -1; + if ((a = elem_separator(tmp)) != NULL) { + /* setname,[before|after,setname */ + *a++ = '\0'; + if ((b = elem_separator(a)) != NULL) + *b++ = '\0'; + if (b == NULL || + !(STREQ(a, "before") || STREQ(a, "after"))) { + err = ipset_err(session, "you must specify elements " + "as setname%s[before|after]%ssetname", + sep, sep); + goto out; + } + before = STREQ(a, "before"); + } + check_setname(tmp, saved); + if ((err = ipset_data_set(data, opt, tmp)) != 0 || b == NULL) + goto out; + + check_setname(b, saved); + if ((err = ipset_data_set(data, + IPSET_OPT_NAMEREF, b)) != 0) + goto out; + + if (before) + err = ipset_data_set(data, IPSET_OPT_BEFORE, &before); + +out: + free(saved); + return err; +} + +/** + * ipset_parse_setname - parse string as a setname + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as a setname. + * The value is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_setname(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + assert(session); + assert(opt == IPSET_SETNAME || + opt == IPSET_OPT_NAME || + opt == IPSET_OPT_SETNAME2); + assert(str); + + check_setname(str, NULL); + + return ipset_session_data_set(session, opt, str); +} + +/** + * ipset_parse_before - parse string as "before" reference setname + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as a "before" reference setname for list:set + * type of sets. The value is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_before(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + struct ipset_data *data; + + assert(session); + assert(opt == IPSET_OPT_NAMEREF); + assert(str); + + data = ipset_session_data(session); + if (ipset_data_flags_test(data, IPSET_FLAG(IPSET_OPT_NAMEREF))) + syntax_err("mixed syntax, before|after option already used"); + + check_setname(str, NULL); + ipset_data_set(data, IPSET_OPT_BEFORE, str); + + return ipset_data_set(data, opt, str); +} + +/** + * ipset_parse_after - parse string as "after" reference setname + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as a "after" reference setname for list:set + * type of sets. The value is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_after(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + struct ipset_data *data; + + assert(session); + assert(opt == IPSET_OPT_NAMEREF); + assert(str); + + data = ipset_session_data(session); + if (ipset_data_flags_test(data, IPSET_FLAG(IPSET_OPT_NAMEREF))) + syntax_err("mixed syntax, before|after option already used"); + + check_setname(str, NULL); + + return ipset_data_set(data, opt, str); +} + +/** + * ipset_parse_uint64 - parse string as an unsigned long integer + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an unsigned long integer number. + * The value is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_uint64(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + unsigned long long value = 0; + int err; + + assert(session); + assert(str); + + err = string_to_number_ll(session, str, 0, ULLONG_MAX - 1, &value); + if (err) + return err; + + return ipset_session_data_set(session, opt, &value); +} + +/** + * ipset_parse_uint32 - parse string as an unsigned integer + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an unsigned integer number. + * The value is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_uint32(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + uint32_t value; + int err; + + assert(session); + assert(str); + + if ((err = string_to_u32(session, str, &value)) == 0) + return ipset_session_data_set(session, opt, &value); + + return err; +} + +int +ipset_parse_uint16(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + uint16_t value; + int err; + + assert(session); + assert(str); + + err = string_to_u16(session, str, &value); + if (err == 0) + return ipset_session_data_set(session, opt, &value); + + return err; +} + +/** + * ipset_parse_uint8 - parse string as an unsigned short integer + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an unsigned short integer number. + * The value is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_uint8(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + uint8_t value; + int err; + + assert(session); + assert(str); + + if ((err = string_to_u8(session, str, &value)) == 0) + return ipset_session_data_set(session, opt, &value); + + return err; +} + +/** + * ipset_parse_netmask - parse string as a CIDR netmask value + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as a CIDR netmask value, depending on family type. + * If family is not set yet, INET is assumed. + * The value is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_netmask(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + uint8_t family, cidr; + struct ipset_data *data; + int err = 0; + + assert(session); + assert(opt == IPSET_OPT_NETMASK); + assert(str); + + data = ipset_session_data(session); + family = ipset_data_family(data); + if (family == NFPROTO_UNSPEC) { + family = NFPROTO_IPV4; + ipset_data_set(data, IPSET_OPT_FAMILY, &family); + } + + err = string_to_cidr(session, str, 1, + family == NFPROTO_IPV4 ? 32 : 128, + &cidr); + + if (err) + return syntax_err("netmask is out of the inclusive range " + "of 1-%u", + family == NFPROTO_IPV4 ? 32 : 128); + + return ipset_data_set(data, opt, &cidr); +} + +/** + * ipset_parse_flag - "parse" option flags + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse option flags :-) + * The value is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_flag(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + assert(session); + + return ipset_session_data_set(session, opt, str); +} + +/** + * ipset_parse_type - parse ipset type name + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse ipset module type: supports both old and new formats. + * The type name is looked up and the type found is stored + * in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_typename(struct ipset_session *session, + enum ipset_opt opt ASSERT_UNUSED, const char *str) +{ + const struct ipset_type *type; + const char *typename; + + assert(session); + assert(opt == IPSET_OPT_TYPENAME); + assert(str); + + if (strlen(str) > IPSET_MAXNAMELEN - 1) + return syntax_err("typename '%s' is longer than %u characters", + str, IPSET_MAXNAMELEN - 1); + + /* Find the corresponding type */ + typename = ipset_typename_resolve(str); + if (typename == NULL) + return syntax_err("typename '%s' is unknown", str); + ipset_session_data_set(session, IPSET_OPT_TYPENAME, typename); + type = ipset_type_get(session, IPSET_CMD_CREATE); + + if (type == NULL) + return -1; + + return ipset_session_data_set(session, IPSET_OPT_TYPE, type); +} + +/** + * ipset_parse_iface - parse string as an interface name + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as an interface name, optionally with 'physdev:' prefix. + * The value is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_iface(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + struct ipset_data *data; + int offset = 0, err = 0; + static const char pdev_prefix[]="physdev:"; + + assert(session); + assert(opt == IPSET_OPT_IFACE); + assert(str); + + data = ipset_session_data(session); + if (STRNEQ(str, pdev_prefix, strlen(pdev_prefix))) { + offset = strlen(pdev_prefix); + err = ipset_data_set(data, IPSET_OPT_PHYSDEV, str); + if (err < 0) + return err; + } + if (strlen(str + offset) > IFNAMSIZ - 1) + return syntax_err("interface name '%s' is longer " + "than %u characters", + str + offset, IFNAMSIZ - 1); + + return ipset_data_set(data, opt, str + offset); +} + +/** + * ipset_parse_comment - parse string as a comment + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string for use as a comment on an ipset entry. + * Gets stored in the data blob as usual. + * + * Returns 0 on success or a negative error code. + */ +int ipset_parse_comment(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + struct ipset_data *data; + + assert(session); + assert(opt == IPSET_OPT_ADT_COMMENT); + assert(str); + + data = ipset_session_data(session); + if (strchr(str, '"')) + return syntax_err("\" character is not permitted in comments"); + if (strlen(str) > IPSET_MAX_COMMENT_SIZE) + return syntax_err("Comment is longer than the maximum allowed " + "%d characters", IPSET_MAX_COMMENT_SIZE); + return ipset_data_set(data, opt, str); +} + +int +ipset_parse_skbmark(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + struct ipset_data *data; + uint64_t result = 0; + unsigned long mark, mask; + int ret = 0; + + assert(session); + assert(opt == IPSET_OPT_SKBMARK); + assert(str); + + data = ipset_session_data(session); + ret = sscanf(str, "0x%lx/0x%lx", &mark, &mask); + if (ret != 2) { + mask = 0xffffffff; + ret = sscanf(str, "0x%lx", &mark); + if (ret != 1) + return syntax_err("Invalid skbmark format, " + "it should be: " + " MARK/MASK or MARK (see manpage)"); + } + result = ((uint64_t)(mark) << 32) | (mask & 0xffffffff); + return ipset_data_set(data, opt, &result); +} + +int +ipset_parse_skbprio(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + struct ipset_data *data; + unsigned maj, min; + uint32_t major; + int err; + + assert(session); + assert(opt == IPSET_OPT_SKBPRIO); + assert(str); + + data = ipset_session_data(session); + err = sscanf(str, "%x:%x", &maj, &min); + if (err != 2) + return syntax_err("Invalid skbprio format, it should be:"\ + "MAJOR:MINOR (see manpage)"); + major = ((uint32_t)maj << 16) | (min & 0xffff); + return ipset_data_set(data, opt, &major); +} + +/** + * ipset_parse_ignored - "parse" ignored option + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Ignore deprecated options. A single warning is generated + * for every ignored opton. + * + * Returns 0. + */ +int +ipset_parse_ignored(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + assert(session); + assert(str); + + if (!ipset_data_ignored(ipset_session_data(session), opt)) + ipset_warn(session, + "Option '--%s %s' is ignored. " + "Please upgrade your syntax.", + ipset_ignored_optname(opt), str); + + return 0; +} + +/** + * ipset_call_parser - call a parser function + * @session: session structure + * @parsefn: parser function + * @optstr: option name + * @opt: option kind of the data + * @str: string to parse + * + * Wrapper to call the parser functions so that ignored options + * are handled properly. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_call_parser(struct ipset_session *session, + const struct ipset_arg *arg, + const char *str) +{ + struct ipset_data *data = ipset_session_data(session); + + if (ipset_data_flags_test(data, IPSET_FLAG(arg->opt)) + && !(arg->opt == IPSET_OPT_FAMILY + && ipset_data_test_ignored(data, IPSET_OPT_FAMILY))) + return syntax_err("%s already specified", arg->name[0]); + + return arg->parse(session, arg->opt, str); +} + +#define parse_elem(s, t, d, str) \ +do { \ + if (!(t)->elem[d - 1].parse) \ + goto internal; \ + ret = (t)->elem[d - 1].parse(s, (t)->elem[d - 1].opt, str); \ + if (ret) \ + goto out; \ +} while (0) + +#define elem_syntax_err(fmt, args...) \ +do { \ + free(saved); \ + return syntax_err(fmt , ## args);\ +} while (0) + +/** + * ipset_parse_elem - parse ADT elem, depending on settype + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as a (multipart) element according to the settype. + * The value is stored in the data blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_elem(struct ipset_session *session, + bool optional, const char *str) +{ + const struct ipset_type *type; + char *a = NULL, *b = NULL, *tmp, *saved; + int ret; + + assert(session); + assert(str); + + type = ipset_session_data_get(session, IPSET_OPT_TYPE); + if (!type) + return ipset_err(session, + "Internal error: set type is unknown!"); + + saved = tmp = ipset_strdup(session, str); + if (tmp == NULL) + return -1; + + a = elem_separator(tmp); + if (type->dimension > IPSET_DIM_ONE) { + if (a != NULL) { + /* elem,elem */ + *a++ = '\0'; + } else if (!optional) + elem_syntax_err("Second element is missing from %s.", + str); + } else if (a != NULL) { + if (type->compat_parse_elem) { + ret = type->compat_parse_elem(session, + type->elem[IPSET_DIM_ONE - 1].opt, + saved); + goto out; + } + elem_syntax_err("Elem separator in %s, " + "but settype %s supports none.", + str, type->name); + } + + if (a) + b = elem_separator(a); + if (type->dimension > IPSET_DIM_TWO) { + if (b != NULL) { + /* elem,elem,elem */ + *b++ = '\0'; + } else if (!optional) + elem_syntax_err("Third element is missing from %s.", + str); + } else if (b != NULL) + elem_syntax_err("Two elem separators in %s, " + "but settype %s supports one.", + str, type->name); + if (b != NULL && elem_separator(b)) + elem_syntax_err("Three elem separators in %s, " + "but settype %s supports two.", + str, type->name); + + D("parse elem part one: %s", tmp); + parse_elem(session, type, IPSET_DIM_ONE, tmp); + + if (type->dimension > IPSET_DIM_ONE && a != NULL) { + D("parse elem part two: %s", a); + parse_elem(session, type, IPSET_DIM_TWO, a); + } + if (type->dimension > IPSET_DIM_TWO && b != NULL) { + D("parse elem part three: %s", b); + parse_elem(session, type, IPSET_DIM_THREE, b); + } + + goto out; + +internal: + ret = ipset_err(session, + "Internal error: missing parser function for %s", + type->name); +out: + free(saved); + return ret; +} diff --git a/lib/print.c b/lib/print.c new file mode 100644 index 0000000..02ffe41 --- /dev/null +++ b/lib/print.c @@ -0,0 +1,962 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* assert */ +#include /* errno */ +#include /* snprintf */ +#include /* getservbyport */ +#include /* inet_ntop */ +#include /* inet_ntop */ +#include /* inet_ntop */ +#include /* ETH_ALEN */ +#include /* IFNAMSIZ */ +#include /* PRIx macro */ + +#include /* D() */ +#include /* ipset_data_* */ +#include /* icmp_to_name */ +#include /* icmpv6_to_name */ +#include /* IPSET_*_SEPARATOR */ +#include /* ipset set types */ +#include /* IPSET_FLAG_ */ +#include /* UNUSED */ +#include /* IPSET_ENV_* */ +#include /* prototypes */ + +/* Print data (to output buffer). All function must follow snprintf. */ + +#define SNPRINTF_FAILURE(size, len, offset) \ +do { \ + if (size < 0 || (unsigned int) size >= len) \ + return offset + size; \ + offset += size; \ + len -= size; \ +} while (0) + +/** + * ipset_print_ether - print ethernet address to string + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Print Ethernet address to output buffer. + * + * Return lenght of printed string or error size. + */ +int +ipset_print_ether(char *buf, unsigned int len, + const struct ipset_data *data, enum ipset_opt opt, + uint8_t env UNUSED) +{ + const unsigned char *ether; + int i, size, offset = 0; + + assert(buf); + assert(len > 0); + assert(data); + assert(opt == IPSET_OPT_ETHER); + + if (len < ETH_ALEN*3) + return -1; + + ether = ipset_data_get(data, opt); + assert(ether); + + size = snprintf(buf, len, "%02X", ether[0]); + SNPRINTF_FAILURE(size, len, offset); + for (i = 1; i < ETH_ALEN; i++) { + size = snprintf(buf + offset, len, ":%02X", ether[i]); + SNPRINTF_FAILURE(size, len, offset); + } + + return offset; +} + +/** + * ipset_print_family - print INET family + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Print INET family string to output buffer. + * + * Return lenght of printed string or error size. + */ +int +ipset_print_family(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt ASSERT_UNUSED, + uint8_t env UNUSED) +{ + uint8_t family; + + assert(buf); + assert(len > 0); + assert(data); + assert(opt == IPSET_OPT_FAMILY); + + if (len < strlen("inet6") + 1) + return -1; + + family = ipset_data_family(data); + + return snprintf(buf, len, "%s", + family == AF_INET ? "inet" : + family == AF_INET6 ? "inet6" : "any"); +} + +/** + * ipset_print_type - print ipset type string + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Print ipset module string identifier to output buffer. + * + * Return lenght of printed string or error size. + */ +int +ipset_print_type(char *buf, unsigned int len, + const struct ipset_data *data, enum ipset_opt opt, + uint8_t env UNUSED) +{ + const struct ipset_type *type; + + assert(buf); + assert(len > 0); + assert(data); + assert(opt == IPSET_OPT_TYPE); + + type = ipset_data_get(data, opt); + assert(type); + if (len < strlen(type->name) + 1) + return -1; + + return snprintf(buf, len, "%s", type->name); +} + +static inline int +__getnameinfo4(char *buf, unsigned int len, + int flags, const union nf_inet_addr *addr) +{ + struct sockaddr_in saddr; + int err; + + memset(&saddr, 0, sizeof(saddr)); + in4cpy(&saddr.sin_addr, &addr->in); + saddr.sin_family = NFPROTO_IPV4; + + err = getnameinfo((const struct sockaddr *)&saddr, + sizeof(saddr), + buf, len, NULL, 0, flags); + + if (!(flags & NI_NUMERICHOST) && (err == EAI_AGAIN)) + err = getnameinfo((const struct sockaddr *)&saddr, + sizeof(saddr), + buf, len, NULL, 0, + flags | NI_NUMERICHOST); + D("getnameinfo err: %i, errno %i", err, errno); + if (err == 0 && strstr(buf, IPSET_RANGE_SEPARATOR) != NULL) { + const char escape[] = IPSET_ESCAPE_START; + /* Escape hostname */ + if (strlen(buf) + 2 > len) { + err = EAI_OVERFLOW; + return -1; + } + memmove(buf + 1, buf, strlen(buf) + 1); + buf[0] = escape[0]; + strcat(buf, IPSET_ESCAPE_END); + } + return (err == 0 ? (int)strlen(buf) : + (err == EAI_OVERFLOW || err == EAI_SYSTEM) ? (int)len : -1); +} + +static inline int +__getnameinfo6(char *buf, unsigned int len, + int flags, const union nf_inet_addr *addr) +{ + struct sockaddr_in6 saddr; + int err; + + memset(&saddr, 0, sizeof(saddr)); + in6cpy(&saddr.sin6_addr, &addr->in6); + saddr.sin6_family = NFPROTO_IPV6; + + err = getnameinfo((const struct sockaddr *)&saddr, + sizeof(saddr), + buf, len, NULL, 0, flags); + + if (!(flags & NI_NUMERICHOST) && (err == EAI_AGAIN)) + err = getnameinfo((const struct sockaddr *)&saddr, + sizeof(saddr), + buf, len, NULL, 0, + flags | NI_NUMERICHOST); + D("getnameinfo err: %i, errno %i", err, errno); + if (err == 0 && strstr(buf, IPSET_RANGE_SEPARATOR) != NULL) { + const char escape[] = IPSET_ESCAPE_START; + /* Escape hostname */ + if (strlen(buf) + 2 > len) { + err = EAI_OVERFLOW; + return -1; + } + memmove(buf + 1, buf, strlen(buf) + 1); + buf[0] = escape[0]; + strcat(buf, IPSET_ESCAPE_END); + } + return (err == 0 ? (int)strlen(buf) : + (err == EAI_OVERFLOW || err == EAI_SYSTEM) ? (int)len : -1); +} + +#define SNPRINTF_IP(mask, f) \ +static int \ +snprintf_ipv##f(char *buf, unsigned int len, int flags, \ + const union nf_inet_addr *ip, uint8_t cidr) \ +{ \ + int size, offset = 0; \ + \ + size = __getnameinfo##f(buf, len, flags, ip); \ + SNPRINTF_FAILURE(size, len, offset); \ + \ + D("cidr %u mask %u", cidr, mask); \ + if (cidr == mask) \ + return offset; \ + D("print cidr"); \ + size = snprintf(buf + offset, len, \ + "%s%u", IPSET_CIDR_SEPARATOR, cidr); \ + SNPRINTF_FAILURE(size, len, offset); \ + return offset; \ +} + +SNPRINTF_IP(32, 4) + +SNPRINTF_IP(128, 6) + +/** + * ipset_print_ip - print IPv4|IPv6 address to string + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Print IPv4|IPv6 address, address/cidr or address range to output buffer. + * + * Return lenght of printed string or error size. + */ +int +ipset_print_ip(char *buf, unsigned int len, + const struct ipset_data *data, enum ipset_opt opt, + uint8_t env) +{ + const union nf_inet_addr *ip; + uint8_t family, cidr; + int flags, size, offset = 0; + enum ipset_opt cidropt; + + assert(buf); + assert(len > 0); + assert(data); + assert(opt == IPSET_OPT_IP || opt == IPSET_OPT_IP2); + + D("len: %u", len); + family = ipset_data_family(data); + cidropt = opt == IPSET_OPT_IP ? IPSET_OPT_CIDR : IPSET_OPT_CIDR2; + if (ipset_data_test(data, cidropt)) { + cidr = *(const uint8_t *) ipset_data_get(data, cidropt); + D("CIDR: %u", cidr); + } else + cidr = family == NFPROTO_IPV6 ? 128 : 32; + flags = (env & IPSET_ENV_RESOLVE) ? 0 : NI_NUMERICHOST; + + ip = ipset_data_get(data, opt); + assert(ip); + if (family == NFPROTO_IPV4) + size = snprintf_ipv4(buf, len, flags, ip, cidr); + else if (family == NFPROTO_IPV6) + size = snprintf_ipv6(buf, len, flags, ip, cidr); + else + return -1; + D("size %i, len %u", size, len); + SNPRINTF_FAILURE(size, len, offset); + + D("len: %u, offset %u", len, offset); + if (!ipset_data_test(data, IPSET_OPT_IP_TO)) + return offset; + + size = snprintf(buf + offset, len, "%s", IPSET_RANGE_SEPARATOR); + SNPRINTF_FAILURE(size, len, offset); + + ip = ipset_data_get(data, IPSET_OPT_IP_TO); + if (family == NFPROTO_IPV4) + size = snprintf_ipv4(buf + offset, len, flags, ip, cidr); + else if (family == NFPROTO_IPV6) + size = snprintf_ipv6(buf + offset, len, flags, ip, cidr); + else + return -1; + + SNPRINTF_FAILURE(size, len, offset); + return offset; +} + +/** + * ipset_print_ipaddr - print IPv4|IPv6 address to string + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Print IPv4|IPv6 address or address/cidr to output buffer. + * + * Return lenght of printed string or error size. + */ +int +ipset_print_ipaddr(char *buf, unsigned int len, + const struct ipset_data *data, enum ipset_opt opt, + uint8_t env) +{ + const union nf_inet_addr *ip; + uint8_t family, cidr; + enum ipset_opt cidropt; + int flags; + + assert(buf); + assert(len > 0); + assert(data); + assert(opt == IPSET_OPT_IP || + opt == IPSET_OPT_IP_TO || + opt == IPSET_OPT_IP2); + + family = ipset_data_family(data); + cidropt = opt == IPSET_OPT_IP ? IPSET_OPT_CIDR : IPSET_OPT_CIDR2; + if (ipset_data_test(data, cidropt)) + cidr = *(const uint8_t *) ipset_data_get(data, cidropt); + else + cidr = family == NFPROTO_IPV6 ? 128 : 32; + flags = (env & IPSET_ENV_RESOLVE) ? 0 : NI_NUMERICHOST; + + ip = ipset_data_get(data, opt); + assert(ip); + if (family == NFPROTO_IPV4) + return snprintf_ipv4(buf, len, flags, ip, cidr); + else if (family == NFPROTO_IPV6) + return snprintf_ipv6(buf, len, flags, ip, cidr); + + return -1; +} + +/** + * ipset_print_number - print number to string + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Print number to output buffer. + * + * Return lenght of printed string or error size. + */ +int +ipset_print_number(char *buf, unsigned int len, + const struct ipset_data *data, enum ipset_opt opt, + uint8_t env UNUSED) +{ + size_t maxsize; + const void *number; + + assert(buf); + assert(len > 0); + assert(data); + + number = ipset_data_get(data, opt); + maxsize = ipset_data_sizeof(opt, AF_INET); + D("opt: %u, maxsize %zu", opt, maxsize); + if (maxsize == sizeof(uint8_t)) + return snprintf(buf, len, "%u", *(const uint8_t *) number); + else if (maxsize == sizeof(uint16_t)) + return snprintf(buf, len, "%u", *(const uint16_t *) number); + else if (maxsize == sizeof(uint32_t)) + return snprintf(buf, len, "%lu", + (long unsigned) *(const uint32_t *) number); + else if (maxsize == sizeof(uint64_t)) + return snprintf(buf, len, "%llu", + (long long unsigned) *(const uint64_t *) number); + else + assert(0); + return 0; +} + +/** + * ipset_print_name - print setname element string + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Print setname element string to output buffer. + * + * Return lenght of printed string or error size. + */ +int +ipset_print_name(char *buf, unsigned int len, + const struct ipset_data *data, enum ipset_opt opt, + uint8_t env UNUSED) +{ + const char *name; + int size, offset = 0; + + assert(buf); + assert(len > 0); + assert(data); + assert(opt == IPSET_OPT_NAME); + + if (len < 2*IPSET_MAXNAMELEN + 2 + strlen("before")) + return -1; + + name = ipset_data_get(data, opt); + assert(name); + size = snprintf(buf, len, "%s", name); + SNPRINTF_FAILURE(size, len, offset); + + if (ipset_data_test(data, IPSET_OPT_NAMEREF)) { + bool before = false; + if (ipset_data_flags_test(data, IPSET_FLAG(IPSET_OPT_FLAGS))) { + const uint32_t *flags = + ipset_data_get(data, IPSET_OPT_FLAGS); + before = (*flags) & IPSET_FLAG_BEFORE; + } + size = snprintf(buf + offset, len, + " %s %s", before ? "before" : "after", + (const char *) ipset_data_get(data, + IPSET_OPT_NAMEREF)); + SNPRINTF_FAILURE(size, len, offset); + } + + return offset; +} + +/** + * ipset_print_port - print port or port range + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Print port or port range to output buffer. + * + * Return lenght of printed string or error size. + */ +int +ipset_print_port(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt ASSERT_UNUSED, + uint8_t env UNUSED) +{ + const uint16_t *port; + int size, offset = 0; + + assert(buf); + assert(len > 0); + assert(data); + assert(opt == IPSET_OPT_PORT); + + if (len < 2*strlen("65535") + 2) + return -1; + + port = ipset_data_get(data, IPSET_OPT_PORT); + assert(port); + size = snprintf(buf, len, "%u", *port); + SNPRINTF_FAILURE(size, len, offset); + + if (ipset_data_test(data, IPSET_OPT_PORT_TO)) { + port = ipset_data_get(data, IPSET_OPT_PORT_TO); + size = snprintf(buf + offset, len, + "%s%u", + IPSET_RANGE_SEPARATOR, *port); + SNPRINTF_FAILURE(size, len, offset); + } + + return offset; +} + +/** + * ipset_print_mark - print mark to string + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Print mark to output buffer. + * + * Return lenght of printed string or error size. + */ +int +ipset_print_mark(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt ASSERT_UNUSED, + uint8_t env UNUSED) +{ + const uint32_t *mark; + int size, offset = 0; + + assert(buf); + assert(len > 0); + assert(data); + assert(opt == IPSET_OPT_MARK || opt == IPSET_OPT_MARKMASK); + + mark = ipset_data_get(data, opt); + assert(mark); + + size = snprintf(buf, len, "0x%08"PRIx32, *mark); + SNPRINTF_FAILURE(size, len, offset); + + return offset; +} + +/** + * ipset_print_iface - print interface element string + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Print interface element string to output buffer. + * + * Return lenght of printed string or error size. + */ +int +ipset_print_iface(char *buf, unsigned int len, + const struct ipset_data *data, enum ipset_opt opt, + uint8_t env UNUSED) +{ + const char *name; + int size, offset = 0; + + assert(buf); + assert(len > 0); + assert(data); + assert(opt == IPSET_OPT_IFACE); + + if (len < IFNAMSIZ + strlen("physdev:")) + return -1; + + if (ipset_data_test(data, IPSET_OPT_PHYSDEV)) { + size = snprintf(buf, len, "physdev:"); + SNPRINTF_FAILURE(size, len, offset); + } + name = ipset_data_get(data, opt); + assert(name); + size = snprintf(buf + offset, len, "%s", name); + SNPRINTF_FAILURE(size, len, offset); + return offset; +} + +/** + * ipset_print_comment - print arbitrary parameter string + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Print arbitrary string to output buffer. + * + * Return length of printed string or error size. + */ +int ipset_print_comment(char *buf, unsigned int len, + const struct ipset_data *data, enum ipset_opt opt, + uint8_t env UNUSED) +{ + const char *comment; + int size, offset = 0; + + assert(buf); + assert(len > 0); + assert(data); + assert(opt == IPSET_OPT_ADT_COMMENT); + + comment = ipset_data_get(data, opt); + assert(comment); + size = snprintf(buf + offset, len, "\"%s\"", comment); + SNPRINTF_FAILURE(size, len, offset); + return offset; +} + +int +ipset_print_skbmark(char *buf, unsigned int len, + const struct ipset_data *data, enum ipset_opt opt, + uint8_t env UNUSED) +{ + int size, offset = 0; + const uint64_t *skbmark; + uint32_t mark, mask; + + assert(buf); + assert(len > 0); + assert(data); + assert(opt == IPSET_OPT_SKBMARK); + + skbmark = ipset_data_get(data, IPSET_OPT_SKBMARK); + assert(skbmark); + mark = *skbmark >> 32; + mask = *skbmark & 0xffffffff; + if (mask == 0xffffffff) + size = snprintf(buf + offset, len, "0x%"PRIx32, mark); + else + size = snprintf(buf + offset, len, + "0x%"PRIx32"/0x%"PRIx32, mark, mask); + SNPRINTF_FAILURE(size, len, offset); + return offset; +} + +int +ipset_print_skbprio(char *buf, unsigned int len, + const struct ipset_data *data, enum ipset_opt opt, + uint8_t env UNUSED) +{ + int size, offset = 0; + const uint32_t *skbprio; + + assert(buf); + assert(len > 0); + assert(data); + assert(opt == IPSET_OPT_SKBPRIO); + + skbprio = ipset_data_get(data, opt); + assert(skbprio); + size = snprintf(buf + offset, len, "%x:%x", + *skbprio >> 16, *skbprio & 0xffff); + SNPRINTF_FAILURE(size, len, offset); + return offset; +} + + +/** + * ipset_print_proto - print protocol name + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Print protocol name to output buffer. + * + * Return lenght of printed string or error size. + */ +int +ipset_print_proto(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt ASSERT_UNUSED, + uint8_t env UNUSED) +{ + const struct protoent *protoent; + uint8_t proto; + + assert(buf); + assert(len > 0); + assert(data); + assert(opt == IPSET_OPT_PROTO); + + proto = *(const uint8_t *) ipset_data_get(data, IPSET_OPT_PROTO); + assert(proto); + + protoent = getprotobynumber(proto); + if (protoent) + return snprintf(buf, len, "%s", protoent->p_name); + + /* Should not happen */ + return snprintf(buf, len, "%u", proto); +} + +/** + * ipset_print_icmp - print ICMP code name or type/code + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Print ICMP code name or type/code name to output buffer. + * + * Return lenght of printed string or error size. + */ +int +ipset_print_icmp(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt ASSERT_UNUSED, + uint8_t env UNUSED) +{ + const char *name; + uint16_t typecode; + + assert(buf); + assert(len > 0); + assert(data); + assert(opt == IPSET_OPT_PORT); + + typecode = *(const uint16_t *) ipset_data_get(data, IPSET_OPT_PORT); + name = icmp_to_name(typecode >> 8, typecode & 0xFF); + if (name != NULL) + return snprintf(buf, len, "%s", name); + else + return snprintf(buf, len, "%u/%u", + typecode >> 8, typecode & 0xFF); +} + +/** + * ipset_print_icmpv6 - print ICMPv6 code name or type/code + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Print ICMPv6 code name or type/code name to output buffer. + * + * Return lenght of printed string or error size. + */ +int +ipset_print_icmpv6(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt ASSERT_UNUSED, + uint8_t env UNUSED) +{ + const char *name; + uint16_t typecode; + + assert(buf); + assert(len > 0); + assert(data); + assert(opt == IPSET_OPT_PORT); + + typecode = *(const uint16_t *) ipset_data_get(data, IPSET_OPT_PORT); + name = icmpv6_to_name(typecode >> 8, typecode & 0xFF); + if (name != NULL) + return snprintf(buf, len, "%s", name); + else + return snprintf(buf, len, "%u/%u", + typecode >> 8, typecode & 0xFF); +} + +/** + * ipset_print_proto_port - print proto:port + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Print protocol and port to output buffer. + * + * Return lenght of printed string or error size. + */ +int +ipset_print_proto_port(char *buf, unsigned int len, + const struct ipset_data *data, + enum ipset_opt opt ASSERT_UNUSED, + uint8_t env UNUSED) +{ + int size, offset = 0; + + assert(buf); + assert(len > 0); + assert(data); + assert(opt == IPSET_OPT_PORT); + + if (ipset_data_flags_test(data, IPSET_FLAG(IPSET_OPT_PROTO))) { + uint8_t proto = *(const uint8_t *) ipset_data_get(data, + IPSET_OPT_PROTO); + size = ipset_print_proto(buf, len, data, IPSET_OPT_PROTO, env); + SNPRINTF_FAILURE(size, len, offset); + if (len < 2) + return -ENOSPC; + size = snprintf(buf + offset, len, IPSET_PROTO_SEPARATOR); + SNPRINTF_FAILURE(size, len, offset); + + switch (proto) { + case IPPROTO_TCP: + case IPPROTO_SCTP: + case IPPROTO_UDP: + case IPPROTO_UDPLITE: + break; + case IPPROTO_ICMP: + size = ipset_print_icmp(buf + offset, len, data, + IPSET_OPT_PORT, env); + goto out; + case IPPROTO_ICMPV6: + size = ipset_print_icmpv6(buf + offset, len, data, + IPSET_OPT_PORT, env); + goto out; + default: + break; + } + } + size = ipset_print_port(buf + offset, len, data, IPSET_OPT_PORT, env); +out: + SNPRINTF_FAILURE(size, len, offset); + return offset; +} + +#define print_second(data) \ +ipset_data_flags_test(data, \ + IPSET_FLAG(IPSET_OPT_PORT)|IPSET_FLAG(IPSET_OPT_ETHER)) + +#define print_third(data) \ +ipset_data_flags_test(data, IPSET_FLAG(IPSET_OPT_IP2)) + +/** + * ipset_print_elem - print ADT elem according to settype + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Print (multipart) element according to settype + * + * Return lenght of printed string or error size. + */ +int +ipset_print_elem(char *buf, unsigned int len, + const struct ipset_data *data, enum ipset_opt opt UNUSED, + uint8_t env) +{ + const struct ipset_type *type; + int size, offset = 0; + + assert(buf); + assert(len > 0); + assert(data); + + type = ipset_data_get(data, IPSET_OPT_TYPE); + if (!type) + return -1; + + size = type->elem[IPSET_DIM_ONE - 1].print(buf, len, data, + type->elem[IPSET_DIM_ONE - 1].opt, env); + SNPRINTF_FAILURE(size, len, offset); + IF_D(ipset_data_test(data, type->elem[IPSET_DIM_TWO - 1].opt), + "print second elem"); + if (type->dimension == IPSET_DIM_ONE || + (type->last_elem_optional && + !ipset_data_test(data, type->elem[IPSET_DIM_TWO - 1].opt))) + return offset; + + size = snprintf(buf + offset, len, IPSET_ELEM_SEPARATOR); + SNPRINTF_FAILURE(size, len, offset); + size = type->elem[IPSET_DIM_TWO - 1].print(buf + offset, len, data, + type->elem[IPSET_DIM_TWO - 1].opt, env); + SNPRINTF_FAILURE(size, len, offset); + if (type->dimension == IPSET_DIM_TWO || + (type->last_elem_optional && + !ipset_data_test(data, type->elem[IPSET_DIM_THREE - 1].opt))) + return offset; + + size = snprintf(buf + offset, len, IPSET_ELEM_SEPARATOR); + SNPRINTF_FAILURE(size, len, offset); + size = type->elem[IPSET_DIM_THREE - 1].print(buf + offset, len, data, + type->elem[IPSET_DIM_THREE - 1].opt, env); + SNPRINTF_FAILURE(size, len, offset); + + return offset; +} + +/** + * ipset_print_flag - print a flag + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Print a flag, i.e. option without value + * + * Return lenght of printed string or error size. + */ +int +ipset_print_flag(char *buf UNUSED, unsigned int len UNUSED, + const struct ipset_data *data UNUSED, + enum ipset_opt opt UNUSED, uint8_t env UNUSED) +{ + return 0; +} + +/** + * ipset_print_data - print data, generic fuction + * @buf: printing buffer + * @len: length of available buffer space + * @data: data blob + * @opt: the option kind + * @env: environment flags + * + * Generic wrapper of the printing functions. + * + * Return lenght of printed string or error size. + */ +int +ipset_print_data(char *buf, unsigned int len, + const struct ipset_data *data, enum ipset_opt opt, + uint8_t env) +{ + int size = 0, offset = 0; + + assert(buf); + assert(len > 0); + assert(data); + + switch (opt) { + case IPSET_OPT_FAMILY: + size = ipset_print_family(buf, len, data, opt, env); + break; + case IPSET_OPT_TYPE: + size = ipset_print_type(buf, len, data, opt, env); + break; + case IPSET_SETNAME: + size = snprintf(buf, len, "%s", ipset_data_setname(data)); + break; + case IPSET_OPT_ELEM: + size = ipset_print_elem(buf, len, data, opt, env); + break; + case IPSET_OPT_IP: + size = ipset_print_ip(buf, len, data, opt, env); + break; + case IPSET_OPT_PORT: + size = ipset_print_port(buf, len, data, opt, env); + break; + case IPSET_OPT_IFACE: + size = ipset_print_iface(buf, len, data, opt, env); + break; + case IPSET_OPT_GC: + case IPSET_OPT_HASHSIZE: + case IPSET_OPT_MAXELEM: + case IPSET_OPT_MARKMASK: + case IPSET_OPT_NETMASK: + case IPSET_OPT_PROBES: + case IPSET_OPT_RESIZE: + case IPSET_OPT_TIMEOUT: + case IPSET_OPT_REFERENCES: + case IPSET_OPT_ELEMENTS: + case IPSET_OPT_SIZE: + size = ipset_print_number(buf, len, data, opt, env); + break; + default: + return -1; + } + SNPRINTF_FAILURE(size, len, offset); + + return offset; +} diff --git a/lib/session.c b/lib/session.c new file mode 100644 index 0000000..9e1d7dd --- /dev/null +++ b/lib/session.c @@ -0,0 +1,2487 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* assert */ +#include /* htobe64 */ +#include /* errno */ +#include /* setjmp, longjmp */ +#include /* snprintf */ +#include /* va_* */ +#include /* bool */ +#include /* free */ +#include /* str* */ +#include /* getpagesize */ +#include /* ETH_ALEN */ +#include /* IFNAMSIZ */ + +#include /* be64toh() */ +#include /* D() */ +#include /* IPSET_OPT_* */ +#include /* ipset_errcode */ +#include /* ipset_print_* */ +#include /* struct ipset_type */ +#include /* transport */ +#include /* default backend */ +#include /* STREQ */ +#include /* IPSET_ENV_* */ +#include /* list_sort */ +#include /* prototypes */ + +#define IPSET_NEST_MAX 4 + +/* When we want to sort the entries */ +struct ipset_sorted { + struct list_head list; + size_t offset; /* Offset in outbuf */ +}; + + +/* The session structure */ +struct ipset_session { + const struct ipset_transport *transport;/* Transport protocol */ + struct ipset_handle *handle; /* Transport handler */ + struct ipset_data *data; /* Input/output data */ + /* Command state */ + enum ipset_cmd cmd; /* Current command */ + uint32_t lineno; /* Current lineno in restore mode */ + uint32_t printed_set; /* Printed sets so far */ + char saved_setname[IPSET_MAXNAMELEN]; /* Saved setname */ + const struct ipset_type *saved_type; /* Saved type */ + struct nlattr *nested[IPSET_NEST_MAX]; /* Pointer to nest levels */ + uint8_t nestid; /* Current nest level */ + uint8_t protocol; /* The protocol used */ + bool version_checked; /* Version checked */ + /* Output buffer */ + char *outbuf; /* Output buffer */ + size_t outbuflen; /* Output buffer size */ + size_t pos; /* Printing position in outbuf */ + struct list_head sorted; /* Sorted entries */ + struct list_head pool; /* Pool to reuse */ + enum ipset_output_mode mode; /* Output mode */ + ipset_print_outfn print_outfn; /* Output function to file */ + void *p; /* Private data for print_outfn */ + bool sort; /* Print sorted hash:* types */ + /* Session IO */ + bool normal_io, full_io; /* Default/normal/full IO */ + FILE *istream, *ostream; /* Session input/output stream */ + /* Error/warning reporting */ + char report[IPSET_ERRORBUFLEN]; /* Error/report buffer */ + enum ipset_err_type err_type; /* ERROR/WARNING/NOTICE */ + uint8_t envopts; /* Session env opts */ + /* Kernel message buffer */ + size_t bufsize; + void *buffer; +}; + +/* + * Glue functions + */ + +/** + * ipset_session_data - return pointer to the data + * @session: session structure + * + * Returns the pointer to the data structure of the session. + */ +struct ipset_data * +ipset_session_data(const struct ipset_session *session) +{ + assert(session); + return session->data; +} + +/** + * ipset_session_handle - return pointer to the handle + * @session: session structure + * + * Returns the pointer to the transport handle structure of the session. + */ +struct ipset_handle * +ipset_session_handle(const struct ipset_session *session) +{ + assert(session); + return session->handle; +} + +/** + * ipset_saved_type - return pointer to the saved type + * @session: session structure + * + * Returns the pointer to the saved type from the last ipset_cmd + * It is required to decode type-specific error codes in restore mode. + */ +const struct ipset_type * +ipset_saved_type(const struct ipset_session *session) +{ + assert(session); + return session->saved_type; +} + +/** + * ipset_session_lineno - set session lineno + * @session: session structure + * + * Set session lineno to report parser errors correctly. + */ +void +ipset_session_lineno(struct ipset_session *session, uint32_t lineno) +{ + assert(session); + session->lineno = lineno; +} + +/** + * ipset_session_printf_private - returns the session private pointer + * @session: session structure + * + * Returns the private pointer in the session structure, + * for private/custom print fuctions. + */ +void * +ipset_session_printf_private(struct ipset_session *session) +{ + assert(session); + return session->p; +} + +/* + * Environment options + */ + +/** + * ipset_envopt_test - test environment option + * @session: session structure + * @opt: environment option + * + * Test whether the environment option is set in the session. + * + * Returns true or false. + */ +bool +ipset_envopt_test(struct ipset_session *session, enum ipset_envopt opt) +{ + assert(session); + return session->envopts & opt; +} + +/** + * ipset_envopt_set - set environment option + * @session: session structure + * @opt: environment option + * + * Set an environment option of the session. + */ +void +ipset_envopt_set(struct ipset_session *session, enum ipset_envopt opt) +{ + assert(session); + session->envopts |= opt; +} + +/** + * ipset_envopt_unset - unset environment option + * @session: session structure + * @opt: environment option + * + * Unset an environment option of the session. + */ +void +ipset_envopt_unset(struct ipset_session *session, enum ipset_envopt opt) +{ + assert(session); + session->envopts &= ~opt; +} + +/** + * ipset_session_output - set the session output mode + * @session: session structure + * @mode: output mode + * + * Set the output mode for the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_session_output(struct ipset_session *session, + enum ipset_output_mode mode) +{ + assert(session); + session->mode = mode; + return 0; +} + +/* + * Error and warning reporting + */ + +/** + * ipset_session_report - fill the report buffer + * @session: session structure + * @type: report type + * @fmt: message format + * + * Fill the report buffer with an error or warning message. + * Depending on the report type, set the error or warning + * message pointer. + * + * Returns -1. + */ +int __attribute__((format(printf, 3, 4))) +ipset_session_report(struct ipset_session *session, + enum ipset_err_type type, + const char *fmt, ...) +{ + int len, offset = 0; + va_list args; + + assert(session); + assert(fmt); + + /* Suppress warning/notice when more important message is required */ + if (session->err_type > IPSET_NO_ERROR && session->err_type < type) + session->report[0] = '\0'; + + if (session->lineno != 0 && type == IPSET_ERROR) { + sprintf(session->report, "Error in line %u: ", + session->lineno); + } + offset = strlen(session->report); + + va_start(args, fmt); + len = vsnprintf(session->report + offset, + IPSET_ERRORBUFLEN - 1 - offset, + fmt, args); + va_end(args); + + if (len >= IPSET_ERRORBUFLEN - 1 - offset) + session->report[IPSET_ERRORBUFLEN - 1] = '\0'; + if (strlen(session->report) < IPSET_ERRORBUFLEN - 1) + strcat(session->report, "\n"); + + session->err_type = type; + if (type == IPSET_ERROR) + ipset_data_reset(ipset_session_data(session)); + + return -1; +} + +/** + * ipset_session_warning_as_error - set warning as error + * @session: session structrure + * + * Returns -1. + */ +int +ipset_session_warning_as_error(struct ipset_session *session) +{ + session->err_type = IPSET_ERROR; + ipset_data_reset(ipset_session_data(session)); + return -1; +} + +/** + * ipset_session_reset - reset the report buffer + * @session: session structure + * + * Reset the report buffer, the error and warning pointers. + */ +void +ipset_session_report_reset(struct ipset_session *session) +{ + assert(session); + session->report[0] = '\0'; + session->err_type = IPSET_NO_ERROR; +} + +/** + * ipset_session_report_msg - return the report buffer + * @session: session structure + * + * Return the pointer to the report buffer. + * If there is no error message, the buffer is empty. + */ +const char * +ipset_session_report_msg(const struct ipset_session *session) +{ + assert(session); + + return session->report; +} + +/** + * ipset_session_report_type - return the type of the report + * @session: session structure + * + * Return the type of the message in the report buffer. + */ +enum ipset_err_type +ipset_session_report_type(const struct ipset_session *session) +{ + assert(session); + + return session->err_type; +} + +/* + * Receive data from the kernel + */ + +struct ipset_attr_policy { + uint16_t type; + uint16_t len; + enum ipset_opt opt; +}; + +/* Attribute policies and mapping to options */ +static const struct ipset_attr_policy cmd_attrs[] = { + [IPSET_ATTR_PROTOCOL] = { + .type = MNL_TYPE_U8, + }, + [IPSET_ATTR_SETNAME] = { + .type = MNL_TYPE_NUL_STRING, + .opt = IPSET_SETNAME, + .len = IPSET_MAXNAMELEN, + }, + [IPSET_ATTR_TYPENAME] = { + .type = MNL_TYPE_NUL_STRING, + .opt = IPSET_OPT_TYPENAME, + .len = IPSET_MAXNAMELEN, + }, + /* IPSET_ATTR_SETNAME2 is an alias for IPSET_ATTR_TYPENAME */ + [IPSET_ATTR_REVISION] = { + .type = MNL_TYPE_U8, + .opt = IPSET_OPT_REVISION, + }, + [IPSET_ATTR_FAMILY] = { + .type = MNL_TYPE_U8, + .opt = IPSET_OPT_FAMILY, + }, + [IPSET_ATTR_FLAGS] = { + .type = MNL_TYPE_U32, + .opt = IPSET_OPT_FLAGS, + }, + [IPSET_ATTR_DATA] = { + .type = MNL_TYPE_NESTED, + }, + [IPSET_ATTR_ADT] = { + .type = MNL_TYPE_NESTED, + }, + [IPSET_ATTR_REVISION_MIN] = { + .type = MNL_TYPE_U8, + .opt = IPSET_OPT_REVISION_MIN, + }, + /* IPSET_ATTR_PROTOCOL_MIN is an alias for IPSET_ATTR_REVISION_MIN */ + [IPSET_ATTR_LINENO] = { + .type = MNL_TYPE_U32, + .opt = IPSET_OPT_LINENO, + }, + [IPSET_ATTR_INDEX] = { + .type = MNL_TYPE_U16, + .opt = IPSET_OPT_INDEX, + }, +}; + +static const struct ipset_attr_policy create_attrs[] = { + [IPSET_ATTR_IP] = { + .type = MNL_TYPE_NESTED, + .opt = IPSET_OPT_IP, + }, + [IPSET_ATTR_IP_TO] = { + .type = MNL_TYPE_NESTED, + .opt = IPSET_OPT_IP_TO, + }, + [IPSET_ATTR_CIDR] = { + .type = MNL_TYPE_U8, + .opt = IPSET_OPT_CIDR, + }, + [IPSET_ATTR_PORT] = { + .type = MNL_TYPE_U16, + .opt = IPSET_OPT_PORT, + }, + [IPSET_ATTR_PORT_TO] = { + .type = MNL_TYPE_U16, + .opt = IPSET_OPT_PORT_TO, + }, + [IPSET_ATTR_TIMEOUT] = { + .type = MNL_TYPE_U32, + .opt = IPSET_OPT_TIMEOUT, + }, + [IPSET_ATTR_PROTO] = { + .type = MNL_TYPE_U8, + .opt = IPSET_OPT_PROTO, + }, + [IPSET_ATTR_CADT_FLAGS] = { + .type = MNL_TYPE_U32, + .opt = IPSET_OPT_CADT_FLAGS, + }, + [IPSET_ATTR_GC] = { + .type = MNL_TYPE_U32, + .opt = IPSET_OPT_GC, + }, + [IPSET_ATTR_HASHSIZE] = { + .type = MNL_TYPE_U32, + .opt = IPSET_OPT_HASHSIZE, + }, + [IPSET_ATTR_MAXELEM] = { + .type = MNL_TYPE_U32, + .opt = IPSET_OPT_MAXELEM, + }, + [IPSET_ATTR_MARKMASK] = { + .type = MNL_TYPE_U32, + .opt = IPSET_OPT_MARKMASK, + }, + [IPSET_ATTR_NETMASK] = { + .type = MNL_TYPE_U8, + .opt = IPSET_OPT_NETMASK, + }, + [IPSET_ATTR_PROBES] = { + .type = MNL_TYPE_U8, + .opt = IPSET_OPT_PROBES, + }, + [IPSET_ATTR_RESIZE] = { + .type = MNL_TYPE_U8, + .opt = IPSET_OPT_RESIZE, + }, + [IPSET_ATTR_SIZE] = { + .type = MNL_TYPE_U32, + .opt = IPSET_OPT_SIZE, + }, + [IPSET_ATTR_ELEMENTS] = { + .type = MNL_TYPE_U32, + .opt = IPSET_OPT_ELEMENTS, + }, + [IPSET_ATTR_REFERENCES] = { + .type = MNL_TYPE_U32, + .opt = IPSET_OPT_REFERENCES, + }, + [IPSET_ATTR_MEMSIZE] = { + .type = MNL_TYPE_U32, + .opt = IPSET_OPT_MEMSIZE, + }, +}; + +static const struct ipset_attr_policy adt_attrs[] = { + [IPSET_ATTR_IP] = { + .type = MNL_TYPE_NESTED, + .opt = IPSET_OPT_IP, + }, + [IPSET_ATTR_IP_TO] = { + .type = MNL_TYPE_NESTED, + .opt = IPSET_OPT_IP_TO, + }, + [IPSET_ATTR_CIDR] = { + .type = MNL_TYPE_U8, + .opt = IPSET_OPT_CIDR, + }, + [IPSET_ATTR_MARK] = { + .type = MNL_TYPE_U32, + .opt = IPSET_OPT_MARK, + }, + [IPSET_ATTR_PORT] = { + .type = MNL_TYPE_U16, + .opt = IPSET_OPT_PORT, + }, + [IPSET_ATTR_PORT_TO] = { + .type = MNL_TYPE_U16, + .opt = IPSET_OPT_PORT_TO, + }, + [IPSET_ATTR_PROTO] = { + .type = MNL_TYPE_U8, + .opt = IPSET_OPT_PROTO, + }, + [IPSET_ATTR_TIMEOUT] = { + .type = MNL_TYPE_U32, + .opt = IPSET_OPT_TIMEOUT, + }, + [IPSET_ATTR_CADT_FLAGS] = { + .type = MNL_TYPE_U32, + .opt = IPSET_OPT_CADT_FLAGS, + }, + [IPSET_ATTR_LINENO] = { + .type = MNL_TYPE_U32, + .opt = IPSET_OPT_LINENO, + }, + [IPSET_ATTR_ETHER] = { + .type = MNL_TYPE_BINARY, + .opt = IPSET_OPT_ETHER, + .len = ETH_ALEN, + }, + [IPSET_ATTR_NAME] = { + .type = MNL_TYPE_NUL_STRING, + .opt = IPSET_OPT_NAME, + .len = IPSET_MAXNAMELEN, + }, + [IPSET_ATTR_NAMEREF] = { + .type = MNL_TYPE_NUL_STRING, + .opt = IPSET_OPT_NAMEREF, + .len = IPSET_MAXNAMELEN, + }, + [IPSET_ATTR_IP2] = { + .type = MNL_TYPE_NESTED, + .opt = IPSET_OPT_IP2, + }, + [IPSET_ATTR_CIDR2] = { + .type = MNL_TYPE_U8, + .opt = IPSET_OPT_CIDR2, + }, + [IPSET_ATTR_IP2_TO] = { + .type = MNL_TYPE_NESTED, + .opt = IPSET_OPT_IP2_TO, + }, + [IPSET_ATTR_IFACE] = { + .type = MNL_TYPE_NUL_STRING, + .opt = IPSET_OPT_IFACE, + .len = IFNAMSIZ, + }, + [IPSET_ATTR_PACKETS] = { + .type = MNL_TYPE_U64, + .opt = IPSET_OPT_PACKETS, + }, + [IPSET_ATTR_BYTES] = { + .type = MNL_TYPE_U64, + .opt = IPSET_OPT_BYTES, + }, + [IPSET_ATTR_COMMENT] = { + .type = MNL_TYPE_NUL_STRING, + .opt = IPSET_OPT_ADT_COMMENT, + .len = IPSET_MAX_COMMENT_SIZE + 1, + }, + [IPSET_ATTR_SKBMARK] = { + .type = MNL_TYPE_U64, + .opt = IPSET_OPT_SKBMARK, + }, + [IPSET_ATTR_SKBPRIO] = { + .type = MNL_TYPE_U32, + .opt = IPSET_OPT_SKBPRIO, + }, + [IPSET_ATTR_SKBQUEUE] = { + .type = MNL_TYPE_U16, + .opt = IPSET_OPT_SKBQUEUE, + }, + [IPSET_ATTR_PAD] = { + .type = MNL_TYPE_UNSPEC, + .len = 0, + }, +}; + +static const struct ipset_attr_policy ipaddr_attrs[] = { + [IPSET_ATTR_IPADDR_IPV4] = { + .type = MNL_TYPE_U32, + }, + [IPSET_ATTR_IPADDR_IPV6] = { + .type = MNL_TYPE_BINARY, + .len = sizeof(union nf_inet_addr), + }, +}; + +#ifdef IPSET_DEBUG +static int debug = 1; +#endif + +static int +generic_data_attr_cb(const struct nlattr *attr, void *data, + int attr_max, const struct ipset_attr_policy *policy) +{ + const struct nlattr **tb = data; + int type = mnl_attr_get_type(attr); + + IF_D(debug, "attr type: %u, len %u", type, attr->nla_len); + if (mnl_attr_type_valid(attr, attr_max) < 0) { + IF_D(debug, "attr type: %u INVALID", type); + return MNL_CB_ERROR; + } + if (mnl_attr_validate(attr, policy[type].type) < 0) { + IF_D(debug, "attr type: %u POLICY, attrlen %u", type, + mnl_attr_get_payload_len(attr)); + return MNL_CB_ERROR; + } + if (policy[type].type == MNL_TYPE_NUL_STRING && + mnl_attr_get_payload_len(attr) > policy[type].len) + return MNL_CB_ERROR; + tb[type] = attr; + return MNL_CB_OK; +} + +static int +create_attr_cb(const struct nlattr *attr, void *data) +{ + return generic_data_attr_cb(attr, data, + IPSET_ATTR_CREATE_MAX, create_attrs); +} + +static int +adt_attr_cb(const struct nlattr *attr, void *data) +{ + return generic_data_attr_cb(attr, data, + IPSET_ATTR_ADT_MAX, adt_attrs); +} + +static int +ipaddr_attr_cb(const struct nlattr *attr, void *data) +{ + return generic_data_attr_cb(attr, data, + IPSET_ATTR_IPADDR_MAX, ipaddr_attrs); +} + +#define FAILURE(format, args...) \ + { ipset_err(session, format , ## args); return MNL_CB_ERROR; } + +static int +attr2data(struct ipset_session *session, struct nlattr *nla[], + int type, const struct ipset_attr_policy attrs[]) +{ + struct ipset_data *data = session->data; + const struct ipset_attr_policy *attr; + const void *d; + uint64_t v64; + uint32_t v32; + uint16_t v16; + int ret; + + attr = &attrs[type]; + d = mnl_attr_get_payload(nla[type]); + + if (attr->type == MNL_TYPE_UNSPEC) + return 0; + if (attr->type == MNL_TYPE_NESTED && attr->opt) { + /* IP addresses */ + struct nlattr *ipattr[IPSET_ATTR_IPADDR_MAX+1] = {}; + uint8_t family = ipset_data_family(data); + int atype; + D("IP attr type %u", type); + if (mnl_attr_parse_nested(nla[type], + ipaddr_attr_cb, ipattr) < 0) + FAILURE("Broken kernel message, cannot validate " + "IP address attribute!"); + + /* Validate by hand */ + switch (family) { + case NFPROTO_IPV4: + atype = IPSET_ATTR_IPADDR_IPV4; + if (!ipattr[atype]) + FAILURE("Broken kernel message: IPv4 address " + "expected but not received!"); + if (ipattr[atype]->nla_len < sizeof(uint32_t)) + FAILURE("Broken kernel message: " + "cannot validate IPv4 " + "address attribute!"); + break; + case NFPROTO_IPV6: + atype = IPSET_ATTR_IPADDR_IPV6; + if (!ipattr[atype]) + FAILURE("Broken kernel message: IPv6 address " + "expected but not received!"); + if (ipattr[atype]->nla_len < sizeof(struct in6_addr)) + FAILURE("Broken kernel message: " + "cannot validate IPv6 " + "address attribute!"); + break; + default: + FAILURE("Broken kernel message: " + "IP address attribute but " + "family is unspecified!"); + } + d = mnl_attr_get_payload(ipattr[atype]); + } else if (nla[type]->nla_type & NLA_F_NET_BYTEORDER) { + D("netorder attr type %u", type); + switch (attr->type) { + case MNL_TYPE_U64: { + uint64_t tmp; + /* Ensure data alignment */ + memcpy(&tmp, d, sizeof(tmp)); + v64 = be64toh(tmp); + d = &v64; + break; + } + case MNL_TYPE_U32: { + v32 = ntohl(*(const uint32_t *)d); + d = &v32; + break; + } + case MNL_TYPE_U16: { + v16 = ntohs(*(const uint16_t *)d); + d = &v16; + break; + } + default: + break; + } + } else if (attr->type == MNL_TYPE_NUL_STRING) { + if (!d || strlen(d) >= attr->len) + FAILURE("Broken kernel message: " + "string type attribute missing or too long!"); + } +#ifdef IPSET_DEBUG + else + D("hostorder attr type %u", type); + if (type == IPSET_ATTR_TYPENAME) + D("nla typename %s", (const char *) d); +#endif + ret = ipset_data_set(data, attr->opt, d); +#ifdef IPSET_DEBUG + if (type == IPSET_ATTR_TYPENAME) + D("nla typename %s", + (const char *) ipset_data_get(data, IPSET_OPT_TYPENAME)); +#endif + return ret; +} + +#define ATTR2DATA(session, nla, type, attrs) \ + if (attr2data(session, nla, type, attrs) < 0) \ + return MNL_CB_ERROR + +static const char cmd2name[][9] = { + [IPSET_CMD_NONE] = "NONE", + [IPSET_CMD_CREATE] = "CREATE", + [IPSET_CMD_DESTROY] = "DESTROY", + [IPSET_CMD_FLUSH] = "FLUSH", + [IPSET_CMD_RENAME] = "RENAME", + [IPSET_CMD_SWAP] = "SWAP", + [IPSET_CMD_LIST] = "LIST", + [IPSET_CMD_SAVE] = "SAVE", + [IPSET_CMD_ADD] = "ADD", + [IPSET_CMD_DEL] = "DEL", + [IPSET_CMD_TEST] = "TEST", + [IPSET_CMD_HEADER] = "HEADER", + [IPSET_CMD_TYPE] = "TYPE", + [IPSET_CMD_PROTOCOL] = "PROTOCOL", +}; + +static inline int +call_outfn(struct ipset_session *session) +{ + int ret = session->print_outfn(session, session->p, + "%s", session->outbuf); + + session->outbuf[0] = '\0'; + session->pos = 0; + + return ret < 0 ? ret : 0; +} + +/* Handle printing failures */ +static jmp_buf printf_failure; + +static void +realloc_outbuf(struct ipset_session *session) +{ + char *buf = realloc(session->outbuf, + session->outbuflen + IPSET_OUTBUFLEN); + if (!buf) { + ipset_err(session, + "Could not allocate memory to print sorted!"); + longjmp(printf_failure, 1); + } + session->outbuf = buf; + session->outbuflen += IPSET_OUTBUFLEN; +} + +static int +handle_snprintf_error(struct ipset_session *session, + int ret, int loop) +{ + if (ret < 0 || ret + session->pos >= session->outbuflen) { + if (session->sort && !loop) { + realloc_outbuf(session); + return 1; + } + /* Buffer was too small, push it out and retry */ + D("print buffer and try again: outbuflen: %lu, pos %lu, ret: %d", + session->outbuflen, session->pos, ret); + if (loop) { + ipset_err(session, + "Internal error at printing, loop detected!"); + longjmp(printf_failure, 1); + } + + session->outbuf[session->pos] = '\0'; + if (call_outfn(session)) { + ipset_err(session, + "Internal error, could not print output buffer!"); + longjmp(printf_failure, 1); + } + return 1; + } + session->pos += ret; + return 0; +} + +static int __attribute__((format(printf, 2, 3))) +safe_snprintf(struct ipset_session *session, const char *fmt, ...) +{ + va_list args; + int ret, loop = 0; + + do { + D("outbuflen: %lu, pos: %lu, retry %u", + session->outbuflen, session->pos, loop); + va_start(args, fmt); + ret = vsnprintf(session->outbuf + session->pos, + session->outbuflen - session->pos, + fmt, args); + va_end(args); + loop = handle_snprintf_error(session, ret, loop); + } while (loop); + + return ret; +} + +static int +safe_dprintf(struct ipset_session *session, ipset_printfn fn, + enum ipset_opt opt) +{ + int ret, loop = 0; + + do { + D("outbuflen: %lu, len: %lu, retry %u", + session->outbuflen, session->pos, loop); + ret = fn(session->outbuf + session->pos, + session->outbuflen - session->pos, + session->data, opt, session->envopts); + loop = handle_snprintf_error(session, ret, loop); + } while (loop); + + return ret; +} + +static int +list_adt(struct ipset_session *session, struct nlattr *nla[]) +{ + const struct ipset_data *data = session->data; + const struct ipset_type *type; + const struct ipset_arg *arg; + size_t offset = 0; + int i, found = 0; + + D("enter"); + /* Check and load type, family */ + if (!ipset_data_test(data, IPSET_OPT_TYPE)) + type = ipset_type_get(session, IPSET_CMD_ADD); + else + type = ipset_data_get(data, IPSET_OPT_TYPE); + + if (type == NULL) + return MNL_CB_ERROR; + + for (i = IPSET_ATTR_UNSPEC + 1; i <= IPSET_ATTR_ADT_MAX; i++) + if (nla[i]) { + found++; + ATTR2DATA(session, nla, i, adt_attrs); + } + D("attr found %u", found); + if (!found) + return MNL_CB_OK; + + if (session->sort) { + if (session->outbuflen <= session->pos + 1) + realloc_outbuf(session); + session->pos++; /* \0 */ + offset = session->pos; + } + + switch (session->mode) { + case IPSET_LIST_SAVE: + safe_snprintf(session, "add %s ", ipset_data_setname(data)); + break; + case IPSET_LIST_XML: + safe_snprintf(session, ""); + break; + case IPSET_LIST_PLAIN: + default: + break; + } + + safe_dprintf(session, ipset_print_elem, IPSET_OPT_ELEM); + if (session->mode == IPSET_LIST_XML) + safe_snprintf(session, ""); + + for (i = 0; type->cmd[IPSET_ADD].args[i] != IPSET_ARG_NONE; i++) { + arg = ipset_keyword(type->cmd[IPSET_ADD].args[i]); + D("print arg opt %u (%s) %s", arg->opt, arg->name[0], + ipset_data_test(data, arg->opt) ? "(yes)" : "(missing)"); + if (!(arg->print && ipset_data_test(data, arg->opt))) + continue; + switch (session->mode) { + case IPSET_LIST_SAVE: + case IPSET_LIST_PLAIN: + if (arg->has_arg == IPSET_NO_ARG) { + safe_snprintf(session, " %s", arg->name[0]); + break; + } + safe_snprintf(session, " %s ", arg->name[0]); + safe_dprintf(session, arg->print, arg->opt); + break; + case IPSET_LIST_XML: + if (arg->has_arg == IPSET_NO_ARG) { + safe_snprintf(session, + "<%s/>", arg->name[0]); + break; + } + safe_snprintf(session, "<%s>", arg->name[0]); + safe_dprintf(session, arg->print, arg->opt); + safe_snprintf(session, "", arg->name[0]); + break; + default: + break; + } + } + + if (session->mode == IPSET_LIST_XML) + safe_snprintf(session, "\n"); + else + safe_snprintf(session, "\n"); + + if (session->sort) { + struct ipset_sorted *sorted; + + if (!list_empty(&session->pool)) { + sorted = list_first_entry(&session->pool, + struct ipset_sorted, list); + list_del(&sorted->list); + } else { + sorted = calloc(1, sizeof(struct ipset_sorted)); + if (!sorted) { + ipset_err(session, + "Could not allocate memory to print sorted!"); + longjmp(printf_failure, 1); + } + } + sorted->offset = offset; + list_add_tail(&sorted->list, &session->sorted); + } + return MNL_CB_OK; +} + +#define FAMILY_TO_STR(f) \ + ((f) == NFPROTO_IPV4 ? "inet" : \ + (f) == NFPROTO_IPV6 ? "inet6" : "any") + +static int +list_create(struct ipset_session *session, struct nlattr *nla[]) +{ + const struct ipset_data *data = session->data; + const struct ipset_type *type; + const struct ipset_arg *arg; + uint8_t family; + int i; + + for (i = IPSET_ATTR_UNSPEC + 1; i <= IPSET_ATTR_CREATE_MAX; i++) + if (nla[i]) { + D("add attr %u, opt %u", i, create_attrs[i].opt); + ATTR2DATA(session, nla, i, create_attrs); + } + + type = ipset_type_check(session); + if (type == NULL) + return MNL_CB_ERROR; + family = ipset_data_family(data); + + switch (session->mode) { + case IPSET_LIST_SAVE: + safe_snprintf(session, "create %s %s", + ipset_data_setname(data), + type->name); + break; + case IPSET_LIST_PLAIN: + safe_snprintf(session, "%sName: %s\n" + "Type: %s\nRevision: %u\nHeader:", + session->printed_set ? "\n" : "", + ipset_data_setname(data), + type->name, type->revision); + break; + case IPSET_LIST_XML: + safe_snprintf(session, + "\n" + "%s\n" + "%u\n" + "
", + ipset_data_setname(data), + type->name, type->revision); + break; + default: + break; + } + + D("type %s, rev %u", type->name, type->revision); + for (i = 0; type->cmd[IPSET_CREATE].args[i] != IPSET_ARG_NONE; i++) { + arg = ipset_keyword(type->cmd[IPSET_CREATE].args[i]); + D("create print arg opt %u (%s) %s", arg->opt, + arg->name[0] ? arg->name[0] : "", + ipset_data_test(data, arg->opt) ? "(yes)" : "(missing)"); + if (!arg->print || + !ipset_data_test(data, arg->opt) || + (arg->opt == IPSET_OPT_FAMILY && + family == type->family)) + continue; + switch (session->mode) { + case IPSET_LIST_SAVE: + case IPSET_LIST_PLAIN: + if (arg->has_arg == IPSET_NO_ARG) { + safe_snprintf(session, " %s", arg->name[0]); + break; + } + safe_snprintf(session, " %s ", arg->name[0]); + safe_dprintf(session, arg->print, arg->opt); + break; + case IPSET_LIST_XML: + if (arg->has_arg == IPSET_NO_ARG) { + safe_snprintf(session, + "<%s/>", arg->name[0]); + break; + } + safe_snprintf(session, "<%s>", arg->name[0]); + safe_dprintf(session, arg->print, arg->opt); + safe_snprintf(session, "", arg->name[0]); + break; + default: + break; + } + } + switch (session->mode) { + case IPSET_LIST_SAVE: + safe_snprintf(session, "\n"); + break; + case IPSET_LIST_PLAIN: + safe_snprintf(session, "\nSize in memory: "); + safe_dprintf(session, ipset_print_number, IPSET_OPT_MEMSIZE); + safe_snprintf(session, "\nReferences: "); + safe_dprintf(session, ipset_print_number, IPSET_OPT_REFERENCES); + if (ipset_data_test(data, IPSET_OPT_ELEMENTS)) { + safe_snprintf(session, "\nNumber of entries: "); + safe_dprintf(session, ipset_print_number, IPSET_OPT_ELEMENTS); + } + safe_snprintf(session, + session->envopts & IPSET_ENV_LIST_HEADER ? + "\n" : "\nMembers:\n"); + break; + case IPSET_LIST_XML: + safe_snprintf(session, "\n"); + safe_dprintf(session, ipset_print_number, IPSET_OPT_MEMSIZE); + safe_snprintf(session, "\n"); + safe_dprintf(session, ipset_print_number, IPSET_OPT_REFERENCES); + safe_snprintf(session, "\n"); + if (ipset_data_test(data, IPSET_OPT_ELEMENTS)) { + safe_snprintf(session, ""); + safe_dprintf(session, ipset_print_number, IPSET_OPT_ELEMENTS); + safe_snprintf(session, "\n"); + } + safe_snprintf(session, + session->envopts & IPSET_ENV_LIST_HEADER ? + "
\n" : + "\n\n"); + break; + default: + break; + } + session->printed_set++; + + session->sort = strncmp(type->name, "hash:", 5) == 0 && + ipset_envopt_test(session, IPSET_ENV_SORTED); + + return MNL_CB_OK; +} + +static int +bystrcmp(void *priv, struct list_head *a, struct list_head *b) +{ + struct ipset_session *session = priv; + struct ipset_sorted *x = list_entry(a, struct ipset_sorted, list); + struct ipset_sorted *y = list_entry(b, struct ipset_sorted, list); + + return strcmp(session->outbuf + x->offset, + session->outbuf + y->offset); +} + +static int +print_set_done(struct ipset_session *session, bool callback_done) +{ + D("called for %s", session->saved_setname[0] == '\0' + ? "NONE" : session->saved_setname); + if (session->sort) { + struct ipset_sorted *pos; + int ret; + + /* Print set header */ + ret = call_outfn(session); + + if (ret) + return MNL_CB_ERROR; + + list_sort(session, &session->sorted, bystrcmp); + + list_for_each_entry(pos, &session->sorted, list) { + ret = session->print_outfn(session, session->p, + "%s", + session->outbuf + pos->offset); + if (ret < 0) + return MNL_CB_ERROR; + } + list_splice(&session->sorted, &session->pool); + INIT_LIST_HEAD(&session->sorted); + } + switch (session->mode) { + case IPSET_LIST_XML: + if (session->envopts & IPSET_ENV_LIST_SETNAME) + break; + if (session->envopts & IPSET_ENV_LIST_HEADER) { + if (session->saved_setname[0] != '\0') + safe_snprintf(session, "
\n"); + break; + } + if (session->saved_setname[0] != '\0') + safe_snprintf(session, "\n\n"); + break; + default: + break; + } + if (callback_done && session->mode == IPSET_LIST_XML) + safe_snprintf(session, "\n"); + return call_outfn(session) ? MNL_CB_ERROR : MNL_CB_STOP; +} + +static int +callback_list(struct ipset_session *session, struct nlattr *nla[], + enum ipset_cmd cmd) +{ + struct ipset_data *data = session->data; + + if (setjmp(printf_failure)) { + session->saved_setname[0] = '\0'; + session->printed_set = 0; + return MNL_CB_ERROR; + } + + if (!nla[IPSET_ATTR_SETNAME]) + FAILURE("Broken %s kernel message: missing setname!", + cmd2name[cmd]); + + ATTR2DATA(session, nla, IPSET_ATTR_SETNAME, cmd_attrs); + D("setname %s", ipset_data_setname(data)); + if (session->envopts & IPSET_ENV_LIST_SETNAME && + session->mode != IPSET_LIST_SAVE) { + if (session->mode == IPSET_LIST_XML) + safe_snprintf(session, "\n", + ipset_data_setname(data)); + else + safe_snprintf(session, "%s\n", + ipset_data_setname(data)); + return call_outfn(session) ? MNL_CB_ERROR : MNL_CB_OK; + } + + if (STREQ(ipset_data_setname(data), session->saved_setname)) { + /* Header part already seen */ + if (ipset_data_test(data, IPSET_OPT_TYPE) && + nla[IPSET_ATTR_DATA] != NULL) + FAILURE("Broken %s kernel message: " + "extra DATA received!", cmd2name[cmd]); + } else { + if (nla[IPSET_ATTR_DATA] == NULL) + FAILURE("Broken %s kernel message: " + "missing DATA part!", cmd2name[cmd]); + + /* Close previous set printing */ + if (session->saved_setname[0] != '\0') + print_set_done(session, false); + } + + if (nla[IPSET_ATTR_DATA] != NULL) { + struct nlattr *cattr[IPSET_ATTR_CREATE_MAX+1] = {}; + + if (!(nla[IPSET_ATTR_TYPENAME] && + nla[IPSET_ATTR_FAMILY] && + nla[IPSET_ATTR_REVISION])) + FAILURE("Broken %s kernel message: missing %s!", + cmd2name[cmd], + !nla[IPSET_ATTR_TYPENAME] ? "typename" : + !nla[IPSET_ATTR_FAMILY] ? "family" : + "revision"); + + /* Reset CREATE specific flags */ + ipset_data_flags_unset(data, IPSET_CREATE_FLAGS); + D("nla typename %s", + (char *) mnl_attr_get_payload(nla[IPSET_ATTR_TYPENAME])); + + ATTR2DATA(session, nla, IPSET_ATTR_FAMILY, cmd_attrs); + ATTR2DATA(session, nla, IPSET_ATTR_TYPENAME, cmd_attrs); + ATTR2DATA(session, nla, IPSET_ATTR_REVISION, cmd_attrs); + D("head: family %u, typename %s", + ipset_data_family(data), + (const char *) ipset_data_get(data, IPSET_OPT_TYPENAME)); + if (mnl_attr_parse_nested(nla[IPSET_ATTR_DATA], + create_attr_cb, cattr) < 0) + FAILURE("Broken %s kernel message: " + "cannot validate DATA attributes!", + cmd2name[cmd]); + if (list_create(session, cattr) != MNL_CB_OK) + return MNL_CB_ERROR; + strcpy(session->saved_setname, ipset_data_setname(data)); + } + + if (nla[IPSET_ATTR_ADT] != NULL) { + struct nlattr *tb, *adt[IPSET_ATTR_ADT_MAX+1]; + + mnl_attr_for_each_nested(tb, nla[IPSET_ATTR_ADT]) { + D("ADT attributes for %s", ipset_data_setname(data)); + memset(adt, 0, sizeof(adt)); + /* Reset ADT specific flags */ + ipset_data_flags_unset(data, IPSET_ADT_FLAGS); + if (mnl_attr_parse_nested(tb, adt_attr_cb, adt) < 0) + FAILURE("Broken %s kernel message: " + "cannot validate ADT attributes!", + cmd2name[cmd]); + if (list_adt(session, adt) != MNL_CB_OK) + return MNL_CB_ERROR; + } + if (session->sort) + return MNL_CB_OK; + } + return call_outfn(session) ? MNL_CB_ERROR : MNL_CB_OK; +} + +#ifndef IPSET_PROTOCOL_MIN +#define IPSET_PROTOCOL_MIN IPSET_PROTOCOL +#endif + +#ifndef IPSET_PROTOCOL_MAX +#define IPSET_PROTOCOL_MAX IPSET_PROTOCOL +#endif + +static int +callback_version(struct ipset_session *session, struct nlattr *nla[]) +{ + uint8_t min, max; + + min = max = mnl_attr_get_u8(nla[IPSET_ATTR_PROTOCOL]); + + if (nla[IPSET_ATTR_PROTOCOL_MIN]) { + min = mnl_attr_get_u8(nla[IPSET_ATTR_PROTOCOL_MIN]); + D("min: %u", min); + } + + if (min > IPSET_PROTOCOL_MAX || max < IPSET_PROTOCOL_MIN) + FAILURE("Cannot communicate with kernel: " + "Kernel support protocol versions %u-%u " + "while userspace supports protocol versions %u-%u", + min, max, IPSET_PROTOCOL_MIN, IPSET_PROTOCOL_MAX); + + if (!(session->envopts & IPSET_ENV_QUIET) && + max != IPSET_PROTOCOL_MAX) + ipset_warn(session, + "Kernel support protocol versions %u-%u " + "while userspace supports protocol versions %u-%u", + min, max, IPSET_PROTOCOL_MIN, IPSET_PROTOCOL_MAX); + + session->protocol = MIN(max, IPSET_PROTOCOL_MAX); + session->version_checked = true; + + return MNL_CB_STOP; +} + +static int +callback_header(struct ipset_session *session, struct nlattr *nla[]) +{ + const char *setname; + const struct ipset_data *data = session->data; + + if (!nla[IPSET_ATTR_SETNAME]) + FAILURE("Broken HEADER kernel message: missing setname!"); + + setname = mnl_attr_get_str(nla[IPSET_ATTR_SETNAME]); + if (!STREQ(setname, ipset_data_setname(data))) + FAILURE("Broken HEADER kernel message: sent setname `%s' " + "does not match with received one `%s'!", + ipset_data_setname(data), setname); + + if (!(nla[IPSET_ATTR_TYPENAME] && + nla[IPSET_ATTR_REVISION] && + nla[IPSET_ATTR_FAMILY])) + FAILURE("Broken HEADER kernel message: " + "missing attribute '%s'!", + !nla[IPSET_ATTR_TYPENAME] ? "typename" : + !nla[IPSET_ATTR_REVISION] ? "revision" : + "family"); + + ATTR2DATA(session, nla, IPSET_ATTR_TYPENAME, cmd_attrs); + ATTR2DATA(session, nla, IPSET_ATTR_REVISION, cmd_attrs); + ATTR2DATA(session, nla, IPSET_ATTR_FAMILY, cmd_attrs); + D("got family: %u", ipset_data_family(session->data)); + + return MNL_CB_STOP; +} + +static int +callback_type(struct ipset_session *session, struct nlattr *nla[]) +{ + const struct ipset_data *data = session->data; + const char *typename, *orig; + + if (!(nla[IPSET_ATTR_TYPENAME] && + nla[IPSET_ATTR_REVISION] && + nla[IPSET_ATTR_FAMILY])) + FAILURE("Broken TYPE kernel message: " + "missing attribute '%s'!", + !nla[IPSET_ATTR_TYPENAME] ? "typename" : + !nla[IPSET_ATTR_REVISION] ? "revision" : + "family"); + + typename = mnl_attr_get_str(nla[IPSET_ATTR_TYPENAME]); + orig = ipset_data_get(data, IPSET_OPT_TYPENAME); + if (!STREQ(typename, orig)) + FAILURE("Broken TYPE kernel message: sent typename `%s' " + "does not match with received one `%s'!", + orig, typename); + + ATTR2DATA(session, nla, IPSET_ATTR_TYPENAME, cmd_attrs); + ATTR2DATA(session, nla, IPSET_ATTR_REVISION, cmd_attrs); + ATTR2DATA(session, nla, IPSET_ATTR_FAMILY, cmd_attrs); + if (nla[IPSET_ATTR_REVISION_MIN]) + ATTR2DATA(session, nla, IPSET_ATTR_REVISION_MIN, cmd_attrs); + + return MNL_CB_STOP; +} + +static int +cmd_attr_cb(const struct nlattr *attr, void *data) +{ + return generic_data_attr_cb(attr, data, IPSET_ATTR_CMD_MAX, cmd_attrs); +} + +#if 0 +static int +mnl_attr_parse_dbg(const struct nlmsghdr *nlh, int offset, + mnl_attr_cb_t cb, void *data) +{ + int ret = MNL_CB_OK; + struct nlattr *attr = mnl_nlmsg_get_payload_offset(nlh, offset); + int len = nlh->nlmsg_len - MNL_NLMSG_HDRLEN - MNL_ALIGN(offset); + + while (mnl_attr_ok(attr, len)) { + D("attr: type %u, attrlen %u, len %u", + mnl_attr_get_type(attr), attr->nla_len, len); + if (cb && (ret = cb(attr, data)) <= MNL_CB_STOP) + return ret; + attr = mnl_attr_next(attr, &len); + } + return ret; +} +#endif + +static int +callback_data(const struct nlmsghdr *nlh, void *data) +{ + struct ipset_session *session = data; + struct nlattr *nla[IPSET_ATTR_CMD_MAX+1] = {}; + uint8_t proto, cmd; + int ret = MNL_CB_OK, nfmsglen = MNL_ALIGN(sizeof(struct nfgenmsg)); + + D("called, nlmsg_len %u", nlh->nlmsg_len); + cmd = ipset_get_nlmsg_type(nlh); + if (cmd == IPSET_CMD_LIST && session->cmd == IPSET_CMD_SAVE) + /* Kernel always send IPSET_CMD_LIST */ + cmd = IPSET_CMD_SAVE; + + if (cmd != session->cmd) + FAILURE("Protocol error, we sent command %s " + "and received %s[%u]", + cmd2name[session->cmd], + cmd < IPSET_MSG_MAX ? cmd2name[cmd] : "unknown", cmd); + + if (mnl_attr_parse(nlh, nfmsglen, cmd_attr_cb, nla) < MNL_CB_STOP) + FAILURE("Broken %s kernel message: " + "cannot validate and parse attributes", + cmd2name[cmd]); + + if (!nla[IPSET_ATTR_PROTOCOL]) + FAILURE("Sad, sad day: kernel message %s " + "does not carry the protocol version.", + cmd2name[cmd]); + + proto = mnl_attr_get_u8(nla[IPSET_ATTR_PROTOCOL]); + + /* Check protocol */ + if (cmd != IPSET_CMD_PROTOCOL && proto != session->protocol) + FAILURE("Giving up: kernel protocol version %u " + "does not match our protocol version %u", + proto, session->protocol); + + D("Message: %s", cmd2name[cmd]); + switch (cmd) { + case IPSET_CMD_LIST: + case IPSET_CMD_SAVE: + ret = callback_list(session, nla, cmd); + D("flag multi: %u", nlh->nlmsg_flags & NLM_F_MULTI); + if (ret >= MNL_CB_STOP && !(nlh->nlmsg_flags & NLM_F_MULTI)) + ret = print_set_done(session, false); + break; + case IPSET_CMD_PROTOCOL: + if (!session->version_checked) + ret = callback_version(session, nla); + break; + case IPSET_CMD_HEADER: + ret = callback_header(session, nla); + break; + case IPSET_CMD_TYPE: + ret = callback_type(session, nla); + break; + default: + FAILURE("Data message received when not expected at %s", + cmd2name[session->cmd]); + } + D("return code: %s", ret == MNL_CB_STOP ? "stop" : + ret == MNL_CB_OK ? "ok" : "error"); + return ret; +} + +static int +callback_done(const struct nlmsghdr *nlh UNUSED, void *data) +{ + struct ipset_session *session = data; + + D(" called"); + if (session->cmd == IPSET_CMD_LIST || session->cmd == IPSET_CMD_SAVE) + return print_set_done(session, true); + + FAILURE("Invalid message received in non LIST or SAVE state."); +} + +static int +decode_errmsg(struct ipset_session *session, const struct nlmsghdr *nlh) +{ + const struct nlmsgerr *err = mnl_nlmsg_get_payload(nlh); + const struct nlmsghdr *msg = &err->msg; + struct nlattr *nla[IPSET_ATTR_CMD_MAX+1] = {}; + enum ipset_cmd cmd; + int nfmsglen = MNL_ALIGN(sizeof(struct nfgenmsg)); + + if (nlh->nlmsg_len < (uint32_t) MNL_ALIGN(sizeof(struct nlmsgerr)) || + nlh->nlmsg_len < MNL_ALIGN(sizeof(struct nlmsgerr)) + + msg->nlmsg_len) + FAILURE("Broken error report message received."); + + cmd = ipset_get_nlmsg_type(msg); + D("nlsmg_len: %u", msg->nlmsg_len); + if (cmd != session->cmd) + FAILURE("Protocol error, we sent command %s " + "and received error report for %s[%u]", + cmd2name[session->cmd], + cmd < IPSET_MSG_MAX ? cmd2name[cmd] : "unknown", cmd); + + if (mnl_attr_parse(msg, nfmsglen, cmd_attr_cb, nla) < MNL_CB_STOP) + FAILURE("Broken %s error report message: " + "cannot validate attributes", + cmd2name[cmd]); + + if (!nla[IPSET_ATTR_PROTOCOL]) + FAILURE("Broken %s error report message: " + "missing protocol attribute", + cmd2name[cmd]); + + if (nla[IPSET_ATTR_LINENO]) { + session->lineno = mnl_attr_get_u32(nla[IPSET_ATTR_LINENO]); + if (nla[IPSET_ATTR_LINENO]->nla_type & NLA_F_NET_BYTEORDER) + session->lineno = ntohl(session->lineno); + } + + return ipset_errcode(session, cmd, -err->error); +} + +static int +callback_error(const struct nlmsghdr *nlh, void *cbdata) +{ + struct ipset_session *session = cbdata; + struct ipset_data *data = session->data; + const struct nlmsgerr *err = mnl_nlmsg_get_payload(nlh); + int ret = MNL_CB_ERROR; + + D(" called, cmd %s", cmd2name[session->cmd]); + if (nlh->nlmsg_len < mnl_nlmsg_size(sizeof(struct nlmsgerr))) + FAILURE("Broken error message received."); + + if (err->error == 0) { + /* ACK */ + ret = MNL_CB_STOP; + + switch (session->cmd) { + case IPSET_CMD_CREATE: + /* Add successfully created set to the cache */ + ipset_cache_add(ipset_data_setname(data), + ipset_data_get(data, IPSET_OPT_TYPE), + ipset_data_family(data)); + break; + case IPSET_CMD_DESTROY: + /* Delete destroyed sets from the cache */ + ipset_cache_del(ipset_data_setname(data)); + /* Fall through */ + case IPSET_CMD_FLUSH: + break; + case IPSET_CMD_RENAME: + ipset_cache_rename(ipset_data_setname(data), + ipset_data_get(data, + IPSET_OPT_SETNAME2)); + break; + case IPSET_CMD_SWAP: + ipset_cache_swap(ipset_data_setname(data), + ipset_data_get(data, + IPSET_OPT_SETNAME2)); + break; + case IPSET_CMD_TEST: + if (!(session->envopts & IPSET_ENV_QUIET)) { + ipset_print_elem(session->report, + IPSET_ERRORBUFLEN, + session->data, + IPSET_OPT_NONE, 0); + ipset_warn(session, " is in set %s.", + ipset_data_setname(data)); + } + /* Fall through */ + case IPSET_CMD_ADD: + case IPSET_CMD_DEL: + break; + case IPSET_CMD_LIST: + case IPSET_CMD_SAVE: + /* No set in kernel */ + print_set_done(session, true); + break; + default: + FAILURE("ACK message received to command %s[%u], " + "which is not expected", + session->cmd < IPSET_MSG_MAX + ? cmd2name[session->cmd] : "unknown", + session->cmd); + } + return ret; + } + D("nlmsgerr error: %u", -err->error); + + /* Error messages */ + + /* Special case for IPSET_CMD_TEST */ + if (session->cmd == IPSET_CMD_TEST && + err->error == -IPSET_ERR_EXIST) { + if (!(session->envopts & IPSET_ENV_QUIET)) { + ipset_print_elem(session->report, IPSET_ERRORBUFLEN, + session->data, IPSET_OPT_NONE, 0); + ipset_notice(session, " is NOT in set %s.", + ipset_data_setname(data)); + } + return ret; + } + + decode_errmsg(session, nlh); + + return ret; +} + +static int +callback_noop(const struct nlmsghdr *nlh UNUSED, void *data UNUSED) +{ + return MNL_CB_OK; +} +/* + * Build and send messages + */ + +static inline int +open_nested(struct ipset_session *session, struct nlmsghdr *nlh, int attr) +{ + if (nlh->nlmsg_len + MNL_ATTR_HDRLEN > session->bufsize) + return 1; + session->nested[session->nestid++] = mnl_attr_nest_start(nlh, attr); + return 0; +} + +static inline void +close_nested(struct ipset_session *session, struct nlmsghdr *nlh) +{ + mnl_attr_nest_end(nlh, session->nested[session->nestid-1]); + session->nested[--session->nestid] = NULL; +} + +static size_t +attr_len(const struct ipset_attr_policy *attr, uint8_t family, uint16_t *flags) +{ + switch (attr->type) { + case MNL_TYPE_NESTED: + if (attr->len) + return attr->len; + + *flags = NLA_F_NET_BYTEORDER; + return family == NFPROTO_IPV4 ? sizeof(uint32_t) + : sizeof(struct in6_addr); + case MNL_TYPE_U64: + *flags = NLA_F_NET_BYTEORDER; + return sizeof(uint64_t); + case MNL_TYPE_U32: + *flags = NLA_F_NET_BYTEORDER; + return sizeof(uint32_t); + case MNL_TYPE_U16: + *flags = NLA_F_NET_BYTEORDER; + return sizeof(uint16_t); + case MNL_TYPE_U8: + return sizeof(uint8_t); + default: + return attr->len; + } +} + +#define BUFFER_FULL(bufsize, nlmsg_len, nestlen, attrlen) \ +(nlmsg_len + nestlen + MNL_ATTR_HDRLEN + MNL_ALIGN(alen) + \ + MNL_ALIGN(sizeof(struct nlmsgerr)) > bufsize) + +static int +rawdata2attr(struct ipset_session *session, struct nlmsghdr *nlh, + const void *d, int type, uint8_t family, + const struct ipset_attr_policy attrs[]) +{ + const struct ipset_attr_policy *attr; + int alen; + uint16_t flags = 0; + + + attr = &attrs[type]; + if (attr->type == MNL_TYPE_NESTED) { + /* IP addresses */ + struct nlattr *nested; + int atype = family == NFPROTO_IPV4 ? IPSET_ATTR_IPADDR_IPV4 + : IPSET_ATTR_IPADDR_IPV6; + + alen = attr_len(attr, family, &flags); + if (BUFFER_FULL(session->bufsize, nlh->nlmsg_len, + MNL_ATTR_HDRLEN, alen)) + return 1; + nested = mnl_attr_nest_start(nlh, type); + D("family: %s", family == NFPROTO_IPV4 ? "INET" : + family == NFPROTO_IPV6 ? "INET6" : "UNSPEC"); + mnl_attr_put(nlh, atype | flags, alen, d); + mnl_attr_nest_end(nlh, nested); + + return 0; + } + + alen = attr_len(attr, family, &flags); + if (BUFFER_FULL(session->bufsize, nlh->nlmsg_len, 0, alen)) + return 1; + + switch (attr->type) { + case MNL_TYPE_U64: { + uint64_t value = htobe64(*(const uint64_t *)d); + + mnl_attr_put(nlh, type | flags, alen, &value); + return 0; + } + case MNL_TYPE_U32: { + uint32_t value = htonl(*(const uint32_t *)d); + + mnl_attr_put(nlh, type | flags, alen, &value); + return 0; + } + case MNL_TYPE_U16: { + uint16_t value = htons(*(const uint16_t *)d); + + mnl_attr_put(nlh, type | flags, alen, &value); + return 0; + } + case MNL_TYPE_NUL_STRING: + alen = strlen((const char *)d) + 1; + break; + default: + break; + } + + mnl_attr_put(nlh, type | flags, alen, d); + + return 0; +} + +static int +data2attr(struct ipset_session *session, struct nlmsghdr *nlh, + struct ipset_data *data, int type, uint8_t family, + const struct ipset_attr_policy attrs[]) +{ + const struct ipset_attr_policy *attr = &attrs[type]; + + return rawdata2attr(session, nlh, ipset_data_get(data, attr->opt), + type, family, attrs); +} + +#define ADDATTR_PROTOCOL(nlh, protocol) \ + mnl_attr_put_u8(nlh, IPSET_ATTR_PROTOCOL, protocol) + +#define ADDATTR(session, nlh, data, type, family, attrs) \ + data2attr(session, nlh, data, type, family, attrs) + +#define ADDATTR_SETNAME(session, nlh, data) \ + data2attr(session, nlh, data, IPSET_ATTR_SETNAME, NFPROTO_IPV4, \ + cmd_attrs) + +#define ADDATTR_IF(session, nlh, data, type, family, attrs) \ + ipset_data_test(data, attrs[type].opt) ? \ + data2attr(session, nlh, data, type, family, attrs) : 0 + +#define ADDATTR_RAW(session, nlh, data, type, attrs) \ + rawdata2attr(session, nlh, data, type, NFPROTO_IPV4, attrs) + +static void +addattr_create(struct ipset_session *session, + struct nlmsghdr *nlh, struct ipset_data *data, uint8_t family) +{ + int i; + + for (i = IPSET_ATTR_UNSPEC + 1; i <= IPSET_ATTR_CREATE_MAX; i++) + ADDATTR_IF(session, nlh, data, i, family, create_attrs); +} + +static int +addattr_adt(struct ipset_session *session, + struct nlmsghdr *nlh, struct ipset_data *data, uint8_t family) +{ + int i; + + for (i = IPSET_ATTR_UNSPEC + 1; i <= IPSET_ATTR_ADT_MAX; i++) + if (ADDATTR_IF(session, nlh, data, i, family, adt_attrs)) + return 1; + return 0; +} + +#define PRIVATE_MSG_BUFLEN 256 + +static int +build_send_private_msg(struct ipset_session *session, enum ipset_cmd cmd) +{ + char buffer[PRIVATE_MSG_BUFLEN] __attribute__ ((aligned)) = {}; + struct nlmsghdr *nlh = (void *)buffer; + struct ipset_data *data = session->data; + int len = PRIVATE_MSG_BUFLEN, ret; + enum ipset_cmd saved = session->cmd; + + /* Initialize header */ + session->transport->fill_hdr(session->handle, cmd, buffer, len, 0); + + ADDATTR_PROTOCOL(nlh, + cmd == IPSET_CMD_PROTOCOL ? IPSET_PROTOCOL : session->protocol); + + switch (cmd) { + case IPSET_CMD_PROTOCOL: + break; + case IPSET_CMD_HEADER: + if (!ipset_data_test(data, IPSET_SETNAME)) + return ipset_err(session, + "Invalid internal HEADER command: " + "missing setname"); + ADDATTR_SETNAME(session, nlh, data); + break; + case IPSET_CMD_TYPE: + if (!ipset_data_test(data, IPSET_OPT_TYPENAME)) + return ipset_err(session, + "Invalid internal TYPE command: " + "missing settype"); + ADDATTR(session, nlh, data, IPSET_ATTR_TYPENAME, + NFPROTO_IPV4, cmd_attrs); + if (ipset_data_test(data, IPSET_OPT_FAMILY)) + ADDATTR(session, nlh, data, IPSET_ATTR_FAMILY, + NFPROTO_IPV4, cmd_attrs); + else + /* bitmap:port and list:set types */ + mnl_attr_put_u8(nlh, IPSET_ATTR_FAMILY, NFPROTO_UNSPEC); + break; + default: + return ipset_err(session, "Internal error: " + "unknown private command %u", cmd); + } + + /* Backup, then restore real command */ + session->cmd = cmd; + ret = session->transport->query(session->handle, buffer, len); + session->cmd = saved; + + return ret; +} + +static inline bool +may_aggregate_ad(struct ipset_session *session, enum ipset_cmd cmd) +{ + return session->lineno != 0 && + (cmd == IPSET_CMD_ADD || cmd == IPSET_CMD_DEL) && + cmd == session->cmd && + STREQ(ipset_data_setname(session->data), session->saved_setname); +} + +static int +build_msg(struct ipset_session *session, bool aggregate) +{ + struct nlmsghdr *nlh = session->buffer; + struct ipset_data *data = session->data; + + /* Public commands */ + D("cmd %s, nlmsg_len: %u", cmd2name[session->cmd], nlh->nlmsg_len); + if (nlh->nlmsg_len == 0) { + /* Initialize header */ + aggregate = false; + session->transport->fill_hdr(session->handle, + session->cmd, + session->buffer, + session->bufsize, + session->envopts); + ADDATTR_PROTOCOL(nlh, session->protocol); + } + D("Protocol added, aggregate %s", aggregate ? "yes" : "no"); + switch (session->cmd) { + case IPSET_CMD_CREATE: { + const struct ipset_type *type; + + /* Sanity checkings */ + if (!ipset_data_test(data, IPSET_SETNAME)) + return ipset_err(session, + "Invalid create command: missing setname"); + if (!ipset_data_test(data, IPSET_OPT_TYPE)) + return ipset_err(session, + "Invalid create command: missing settype"); + + type = ipset_data_get(data, IPSET_OPT_TYPE); + /* Core attributes: + * setname, typename, revision, family, flags (optional) */ + ADDATTR_SETNAME(session, nlh, data); + ADDATTR(session, nlh, data, IPSET_ATTR_TYPENAME, + NFPROTO_IPV4, cmd_attrs); + ADDATTR_RAW(session, nlh, &type->revision, + IPSET_ATTR_REVISION, cmd_attrs); + D("family: %u, type family %u", + ipset_data_family(data), type->family); + if (ipset_data_test(data, IPSET_OPT_FAMILY)) + ADDATTR(session, nlh, data, IPSET_ATTR_FAMILY, + NFPROTO_IPV4, cmd_attrs); + else + /* bitmap:port and list:set types */ + mnl_attr_put_u8(nlh, IPSET_ATTR_FAMILY, NFPROTO_UNSPEC); + + /* Type-specific create attributes */ + D("call open_nested"); + open_nested(session, nlh, IPSET_ATTR_DATA); + addattr_create(session, nlh, data, type->family); + D("call close_nested"); + close_nested(session, nlh); + break; + } + case IPSET_CMD_DESTROY: + case IPSET_CMD_FLUSH: + case IPSET_CMD_SAVE: + if (ipset_data_test(data, IPSET_SETNAME)) + ADDATTR_SETNAME(session, nlh, data); + break; + case IPSET_CMD_LIST: { + uint32_t flags = 0; + + if (session->envopts & IPSET_ENV_LIST_SETNAME) + flags |= IPSET_FLAG_LIST_SETNAME; + if (session->envopts & IPSET_ENV_LIST_HEADER) + flags |= IPSET_FLAG_LIST_HEADER; + if (ipset_data_test(data, IPSET_SETNAME)) + ADDATTR_SETNAME(session, nlh, data); + if (flags && session->mode != IPSET_LIST_SAVE) { + ipset_data_set(data, IPSET_OPT_FLAGS, &flags); + ADDATTR(session, nlh, data, IPSET_ATTR_FLAGS, + NFPROTO_IPV4, cmd_attrs); + } + break; + } + case IPSET_CMD_RENAME: + case IPSET_CMD_SWAP: + if (!ipset_data_test(data, IPSET_SETNAME)) + return ipset_err(session, + "Invalid %s command: missing from-setname", + session->cmd == IPSET_CMD_SWAP ? "swap" : + "rename"); + if (!ipset_data_test(data, IPSET_OPT_SETNAME2)) + return ipset_err(session, + "Invalid %s command: missing to-setname", + session->cmd == IPSET_CMD_SWAP ? "swap" : + "rename"); + ADDATTR_SETNAME(session, nlh, data); + ADDATTR_RAW(session, nlh, + ipset_data_get(data, IPSET_OPT_SETNAME2), + IPSET_ATTR_SETNAME2, cmd_attrs); + break; + case IPSET_CMD_ADD: + case IPSET_CMD_DEL: { + const struct ipset_type *type; + + if (!aggregate) { + /* Setname, type not checked/added yet */ + if (!ipset_data_test(data, IPSET_SETNAME)) + return ipset_err(session, + "Invalid %s command: missing setname", + session->cmd == IPSET_CMD_ADD ? "add" : + "del"); + + if (!ipset_data_test(data, IPSET_OPT_TYPE)) + return ipset_err(session, + "Invalid %s command: missing settype", + session->cmd == IPSET_CMD_ADD ? "add" : + "del"); + + /* Core options: setname */ + ADDATTR_SETNAME(session, nlh, data); + if (session->lineno != 0) { + /* Restore mode */ + ADDATTR_RAW(session, nlh, &session->lineno, + IPSET_ATTR_LINENO, cmd_attrs); + open_nested(session, nlh, IPSET_ATTR_ADT); + } + } + type = ipset_data_get(data, IPSET_OPT_TYPE); + D("family: %u, type family %u", + ipset_data_family(data), type->family); + if (open_nested(session, nlh, IPSET_ATTR_DATA)) { + D("open_nested failed"); + return 1; + } + if (addattr_adt(session, nlh, data, ipset_data_family(data)) || + ADDATTR_RAW(session, nlh, &session->lineno, + IPSET_ATTR_LINENO, cmd_attrs)) { + /* Cancel last, unfinished nested attribute */ + mnl_attr_nest_cancel(nlh, + session->nested[session->nestid-1]); + session->nested[--session->nestid] = NULL; + return 1; + } + close_nested(session, nlh); + break; + } + case IPSET_CMD_TEST: { + const struct ipset_type *type; + /* Return codes are not aggregated, so tests cannot be either */ + + /* Setname, type not checked/added yet */ + + if (!ipset_data_test(data, IPSET_SETNAME)) + return ipset_err(session, + "Invalid test command: missing setname"); + + if (!ipset_data_test(data, IPSET_OPT_TYPE)) + return ipset_err(session, + "Invalid test command: missing settype"); + + type = ipset_data_get(data, IPSET_OPT_TYPE); + D("family: %u, type family %u", + ipset_data_family(data), type->family); + ADDATTR_SETNAME(session, nlh, data); + open_nested(session, nlh, IPSET_ATTR_DATA); + addattr_adt(session, nlh, data, ipset_data_family(data)); + close_nested(session, nlh); + break; + } + default: + return ipset_err(session, "Internal error: unknown command %u", + session->cmd); + } + return 0; +} + +/** + * ipset_commit - commit buffered commands + * @session: session structure + * + * Commit buffered commands, if there are any. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_commit(struct ipset_session *session) +{ + struct nlmsghdr *nlh; + int ret = 0, i; + + assert(session); + + nlh = session->buffer; + D("send buffer: len %u, cmd %s", + nlh->nlmsg_len, cmd2name[session->cmd]); + if (nlh->nlmsg_len == 0) + /* Nothing to do */ + return 0; + + /* Close nested data blocks */ + for (i = session->nestid - 1; i >= 0; i--) + close_nested(session, nlh); + + /* Send buffer */ + ret = session->transport->query(session->handle, + session->buffer, + session->bufsize); + + /* Reset saved data and nested state */ + session->saved_setname[0] = '\0'; + session->printed_set = 0; + for (i = session->nestid - 1; i >= 0; i--) + session->nested[i] = NULL; + session->nestid = 0; + nlh->nlmsg_len = 0; + + D("ret: %d", ret); + + if (ret < 0) { + if (session->report[0] != '\0') + return -1; + else + return ipset_err(session, + "Internal protocol error"); + } + return 0; +} + +static mnl_cb_t cb_ctl[] = { + [NLMSG_NOOP] = callback_noop, + [NLMSG_ERROR] = callback_error, + [NLMSG_DONE] = callback_done, + [NLMSG_OVERRUN] = callback_noop, + [NLMSG_MIN_TYPE] = callback_data, +}; + +static inline struct ipset_handle * +init_transport(struct ipset_session *session) +{ + session->handle = session->transport->init(cb_ctl, session); + + return session->handle; +} + +/** + * ipset_cmd - execute a command + * @session: session structure + * @cmd: command to execute + * @lineno: command line number in restore mode + * + * Execute - or prepare/buffer in restore mode - a command. + * It is the caller responsibility that the data field be filled out + * with all required parameters for a successful execution. + * The data field is cleared after this function call for the public + * commands. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_cmd(struct ipset_session *session, enum ipset_cmd cmd, uint32_t lineno) +{ + struct ipset_data *data; + bool aggregate = false; + int ret = -1; + + assert(session); + + if (cmd < IPSET_CMD_NONE || cmd >= IPSET_MSG_MAX) + return 0; + + /* Initialize transport method if not done yet */ + if (session->handle == NULL && init_transport(session) == NULL) + return ipset_err(session, + "Cannot open session to kernel."); + + data = session->data; + + /* Check protocol version once */ + if (!session->version_checked) { + if (build_send_private_msg(session, IPSET_CMD_PROTOCOL) < 0) + return -1; + if (ipset_session_report_type(session) == IPSET_WARNING && + cmd != IPSET_CMD_NONE) + /* Suppress protocol warning */ + ipset_session_report_reset(session); + } + /* IPSET_CMD_NONE: check protocol version only */ + if (cmd == IPSET_CMD_NONE) + return 0; + + /* Private commands */ + if (cmd == IPSET_CMD_TYPE || cmd == IPSET_CMD_HEADER) + return build_send_private_msg(session, cmd); + + /* Check aggregatable commands */ + aggregate = may_aggregate_ad(session, cmd); + if (!aggregate) { + /* Flush possible aggregated commands */ + ret = ipset_commit(session); + if (ret < 0) + return ret; + } + + /* Real command: update lineno too */ + session->cmd = cmd; + session->lineno = lineno; + + /* Set default output mode */ + if (cmd == IPSET_CMD_LIST) { + if (session->mode == IPSET_LIST_NONE) + session->mode = IPSET_LIST_PLAIN; + } else if (cmd == IPSET_CMD_SAVE) { + if (session->mode == IPSET_LIST_NONE) + session->mode = IPSET_LIST_SAVE; + } + /* Start the root element in XML mode */ + if ((cmd == IPSET_CMD_LIST || cmd == IPSET_CMD_SAVE) && + session->mode == IPSET_LIST_XML) + safe_snprintf(session, "\n"); + + D("next: build_msg"); + /* Build new message or append buffered commands */ + ret = build_msg(session, aggregate); + D("build_msg returned %u", ret); + if (ret > 0) { + /* Buffer is full, send buffered commands */ + ret = ipset_commit(session); + if (ret < 0) + goto cleanup; + ret = build_msg(session, false); + D("build_msg 2 returned %u", ret); + } + if (ret < 0) + goto cleanup; + D("past: build_msg"); + + /* We have to save the type for error handling */ + session->saved_type = ipset_data_get(data, IPSET_OPT_TYPE); + if (session->lineno != 0 && + (cmd == IPSET_CMD_ADD || cmd == IPSET_CMD_DEL)) { + /* Save setname for the next possible aggregated restore line */ + strcpy(session->saved_setname, ipset_data_setname(data)); + ipset_data_reset(data); + /* Don't commit: we may aggregate next command */ + ret = 0; + goto cleanup; + } + + D("call commit"); + ret = ipset_commit(session); + +cleanup: + D("reset data"); + ipset_data_reset(data); + return ret; +} + +static +int __attribute__ ((format (printf, 3, 4))) +default_print_outfn(struct ipset_session *session, void *p UNUSED, + const char *fmt, ...) +{ + int len; + va_list args; + + va_start(args, fmt); + len = vfprintf(session->ostream, fmt, args); + va_end(args); + + return len; +} + +/** + * ipset_session_print_outfn - set session output printing function + * @session: session structure + * @outfn: output printing function + * @p: pointer to private area + * + * Set the session output printing function. If the @outfn is NULL, + * then the default output function is configured. You can set + * the @p pointer to a private area: the output printing function + * is called with @p in one of its arguments. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_session_print_outfn(struct ipset_session *session, + ipset_print_outfn outfn, + void *p) +{ + session->print_outfn = outfn ? outfn : default_print_outfn; + session->p = p; + return 0; +} + +/** + * ipset_session_init - initialize an ipset session + * @outfn: output printing function + * @p: pointer to private area + * + * Initialize an ipset session by allocating a session structure + * and filling out with the initialization data. The function + * calls ipset_session_print_outfn() to set @print_outfn, @p. + * + * Returns the created session sctructure on success or NULL. + */ +struct ipset_session * +ipset_session_init(ipset_print_outfn print_outfn, void *p) +{ + struct ipset_session *session; + size_t bufsize = getpagesize(); + + /* Create session object */ + session = calloc(1, sizeof(struct ipset_session) + bufsize); + if (session == NULL) + return NULL; + session->outbuf = calloc(1, IPSET_OUTBUFLEN); + if (session->outbuf == NULL) + goto free_session; + session->outbuflen = IPSET_OUTBUFLEN; + session->bufsize = bufsize; + session->buffer = session + 1; + session->istream = stdin; + session->ostream = stdout; + session->protocol = IPSET_PROTOCOL; + INIT_LIST_HEAD(&session->sorted); + INIT_LIST_HEAD(&session->pool); + + /* The single transport method yet */ + session->transport = &ipset_mnl_transport; + + /* Output function */ + ipset_session_print_outfn(session, print_outfn, p); + + /* Initialize data structures */ + session->data = ipset_data_init(); + if (session->data == NULL) + goto free_outbuf; + + ipset_cache_init(); + return session; + +free_outbuf: + free(session->outbuf); +free_session: + free(session); + return NULL; +} + +/** + * ipset_session_io_full - set full IO for the session + * @session: session structure + * @filename: filename + * @what: operate on input/output + * + * The normal "-file" CLI interface does not provide an interface + * to set both the input (restore) and output (list/save) for + * a session. This function makes it possible to configure those. + * + * When a filename for input is passed, then the file will be opened + * for reading. + * When a filename for output is passed, then the file will be opened + * for writing. + * Previously opened files are closed. + * If NULL is passed as filename, stdin/stdout is set. + * Input/output files can be set separatedly. + * The function returns error if the file cannot be opened or + * normal IO mode is already set. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_session_io_full(struct ipset_session *session, const char *filename, + enum ipset_io_type what) +{ + FILE *f; + + assert(session); + + if (session->normal_io) + return ipset_err(session, + "Normal IO is in use, full IO cannot be selected"); + + switch (what) { + case IPSET_IO_INPUT: + if (session->istream != stdin) + fclose(session->istream); + if (!filename) { + session->istream = stdin; + } else { + f = fopen(filename, "r"); + if (!f) + return ipset_err(session, + "Cannot open %s for reading: %s", + filename, strerror(errno)); + session->istream = f; + } + break; + case IPSET_IO_OUTPUT: + if (session->ostream != stdout) + fclose(session->ostream); + if (!filename) { + session->ostream = stdout; + } else { + f = fopen(filename, "w"); + if (!f) + return ipset_err(session, + "Cannot open %s for writing: %s", + filename, strerror(errno)); + session->ostream = f; + } + break; + default: + return ipset_err(session, + "Library error, invalid ipset_io_type"); + } + session->full_io = !(session->istream == stdin && + session->ostream == stdout); + return 0; +} + +/** + * ipset_session_io_normal - set normal IO for the session + * @session: session structure + * @filename: filename + * @what: operate on input/output + * + * The normal "-file" CLI interface to set either the input (restore) + * or output (list/save) for a session. This function does not make + * possible to set both independently. + * + * When a filename for input is passed, then the file will be opened + * for reading. + * When a filename for output is passed, then the file will be opened + * for writing. + * Previously opened files are closed. + * If NULL is passed as filename, stdin/stdout is set. + * Input/output files cannot be set separatedly. + * The function returns error if the file cannot be opened or + * full IO mode is already set. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_session_io_normal(struct ipset_session *session, const char *filename, + enum ipset_io_type what) +{ + FILE *f; + + assert(session); + assert(filename); + + if (session->full_io) + return ipset_err(session, + "Full IO is in use, normal IO cannot be selected"); + if (session->istream != stdin) { + fclose(session->istream); + session->istream = stdin; + } + if (session->ostream != stdout) { + fclose(session->ostream); + session->ostream = stdout; + } + switch (what) { + case IPSET_IO_INPUT: + f = fopen(filename, "r"); + if (!f) + return ipset_err(session, + "Cannot open %s for reading: %s", + filename, strerror(errno)); + session->istream = f; + break; + case IPSET_IO_OUTPUT: + f = fopen(filename, "w"); + if (!f) + return ipset_err(session, + "Cannot open %s for writing: %s", + filename, strerror(errno)); + session->ostream = f; + break; + default: + return ipset_err(session, + "Library error, invalid ipset_io_type"); + } + session->normal_io = !(session->istream == stdin && + session->ostream == stdout); + return 0; +} + +/** + * ipset_session_io_stream - returns the input or output stream + * @what: operate on input/output + * + * Returns the input or output stream of the session. + */ +FILE * +ipset_session_io_stream(struct ipset_session *session, + enum ipset_io_type what) +{ + switch (what) { + case IPSET_IO_INPUT: + return session->istream; + case IPSET_IO_OUTPUT: + return session->ostream; + default: + return NULL; + } +} + +/** + * ipset_session_io_close - closes the input or output stream + * @what: operate on input/output + * + * Closes the input or output stream of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_session_io_close(struct ipset_session *session, + enum ipset_io_type what) +{ + switch (what) { + case IPSET_IO_INPUT: + if (session->istream != stdin) { + fclose(session->istream); + session->istream = stdin; + } + break; + case IPSET_IO_OUTPUT: + if (session->ostream != stdout) { + fclose(session->ostream); + session->ostream = stdout; + } + break; + default: + break; + } + return 0; +} + +/** + * ipset_session_fini - destroy an ipset session + * @session: session structure + * + * Destroy an ipset session: release the created structures. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_session_fini(struct ipset_session *session) +{ + struct ipset_sorted *pos, *n; + assert(session); + + if (session->handle) + session->transport->fini(session->handle); + if (session->data) + ipset_data_fini(session->data); + if (session->istream != stdin) + fclose(session->istream); + if (session->ostream != stdout) + fclose(session->ostream); + + ipset_cache_fini(); + + list_for_each_entry_safe(pos, n, &session->sorted, list) { + list_del(&pos->list); + free(pos); + } + list_for_each_entry_safe(pos, n, &session->pool, list) { + list_del(&pos->list); + free(pos); + } + free(session->outbuf); + free(session); + return 0; +} + +#ifdef IPSET_DEBUG +#include "debug.c" +#endif diff --git a/lib/types.c b/lib/types.c new file mode 100644 index 0000000..1adf640 --- /dev/null +++ b/lib/types.c @@ -0,0 +1,673 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* assert */ +#include /* errno */ +#include /* ETH_ALEN */ +#include /* struct in6_addr */ +#include /* AF_ */ +#include /* malloc, free */ +#include /* FIXME: debug */ +#include /* MNL_ALIGN */ + +#include /* D() */ +#include /* ipset_data_* */ +#include /* ipset_cmd */ +#include /* STREQ */ +#include /* prototypes */ + +#ifdef ENABLE_SETTYPE_MODULES +#include +#include +#include +#endif + +/* Userspace cache of sets which exists in the kernel */ + +struct ipset { + char name[IPSET_MAXNAMELEN]; /* set name */ + const struct ipset_type *type; /* set type */ + uint8_t family; /* family */ + struct ipset *next; +}; + +static struct ipset_type *typelist; /* registered set types */ +static struct ipset *setlist; /* cached sets */ + +/** + * ipset_cache_add - add a set to the cache + * @name: set name + * @type: set type structure + * + * Add the named set to the internal cache with the specified + * set type. The set name must be unique. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_cache_add(const char *name, const struct ipset_type *type, + uint8_t family) +{ + struct ipset *s, *n; + + assert(name); + assert(type); + + n = malloc(sizeof(*n)); + if (n == NULL) + return -ENOMEM; + + ipset_strlcpy(n->name, name, IPSET_MAXNAMELEN); + n->type = type; + n->family = family; + n->next = NULL; + + if (setlist == NULL) { + setlist = n; + return 0; + } + for (s = setlist; s->next != NULL; s = s->next) { + if (STREQ(name, s->name)) { + free(n); + return -EEXIST; + } + } + s->next = n; + + return 0; +} + +/** + * ipset_cache_del - delete set from the cache + * @name: set name + * + * Delete the named set from the internal cache. If NULL is + * specified as setname, the whole cache is emptied. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_cache_del(const char *name) +{ + struct ipset *s, *match = NULL, *prev = NULL; + + if (!name) { + for (s = setlist; s != NULL; ) { + prev = s; + s = s->next; + free(prev); + } + setlist = NULL; + return 0; + } + for (s = setlist; s != NULL && match == NULL; s = s->next) { + if (STREQ(s->name, name)) { + match = s; + if (prev == NULL) + setlist = match->next; + else + prev->next = match->next; + } + prev = s; + } + if (match == NULL) + return -EEXIST; + + free(match); + return 0; +} + +/** + * ipset_cache_rename - rename a set in the cache + * @from: the set to rename + * @to: the new name of the set + * + * Rename the given set in the cache. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_cache_rename(const char *from, const char *to) +{ + struct ipset *s; + + assert(from); + assert(to); + + for (s = setlist; s != NULL; s = s->next) { + if (STREQ(s->name, from)) { + ipset_strlcpy(s->name, to, IPSET_MAXNAMELEN); + return 0; + } + } + return -EEXIST; +} + +/** + * ipset_cache_swap - swap two sets in the cache + * @from: the first set + * @to: the second set + * + * Swap two existing sets in the cache. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_cache_swap(const char *from, const char *to) +{ + struct ipset *s, *a = NULL, *b = NULL; + + assert(from); + assert(to); + + for (s = setlist; s != NULL && (a == NULL || b == NULL); s = s->next) { + if (a == NULL && STREQ(s->name, from)) + a = s; + if (b == NULL && STREQ(s->name, to)) + b = s; + } + if (a != NULL && b != NULL) { + ipset_strlcpy(a->name, to, IPSET_MAXNAMELEN); + ipset_strlcpy(b->name, from, IPSET_MAXNAMELEN); + return 0; + } + + return -EEXIST; +} + +#define MATCH_FAMILY(type, f) \ + (f == NFPROTO_UNSPEC || type->family == f || \ + type->family == NFPROTO_IPSET_IPV46) + +bool +ipset_match_typename(const char *name, const struct ipset_type *type) +{ + const char * const *alias = type->alias; + + if (STREQ(name, type->name)) + return true; + + while (alias[0]) { + if (STREQ(name, alias[0])) + return true; + alias++; + } + return false; +} + +static inline const struct ipset_type * +create_type_get(struct ipset_session *session) +{ + struct ipset_type *t, *match = NULL; + struct ipset_data *data; + const char *typename; + uint8_t family, tmin = 0, tmax = 0; + uint8_t kmin, kmax; + int ret; + bool ignore_family = false; + + data = ipset_session_data(session); + assert(data); + typename = ipset_data_get(data, IPSET_OPT_TYPENAME); + assert(typename); + family = ipset_data_family(data); + + /* Check registered types in userspace */ + for (t = typelist; t != NULL; t = t->next) { + /* Skip revisions which are unsupported by the kernel */ + if (t->kernel_check == IPSET_KERNEL_MISMATCH) + continue; + if (ipset_match_typename(typename, t) + && MATCH_FAMILY(t, family)) { + if (match == NULL) { + match = t; + tmin = tmax = t->revision; + } else if (t->family == match->family) + tmin = t->revision; + } + } + if (!match) + return ipset_errptr(session, + "Syntax error: unknown settype %s", + typename); + + /* Family is unspecified yet: set from matching set type */ + if (family == NFPROTO_UNSPEC && match->family != NFPROTO_UNSPEC) { + family = match->family == NFPROTO_IPSET_IPV46 ? + NFPROTO_IPV4 : match->family; + ipset_data_set(data, IPSET_OPT_FAMILY, &family); + if (match->family == NFPROTO_IPSET_IPV46) + ignore_family = true; + } + + if (match->kernel_check == IPSET_KERNEL_OK) + goto found; + + /* Check kernel */ + ret = ipset_cmd(session, IPSET_CMD_TYPE, 0); + if (ret != 0) + return NULL; + + kmin = kmax = *(const uint8_t *)ipset_data_get(data, + IPSET_OPT_REVISION); + if (ipset_data_test(data, IPSET_OPT_REVISION_MIN)) + kmin = *(const uint8_t *)ipset_data_get(data, + IPSET_OPT_REVISION_MIN); + + if (MAX(tmin, kmin) > MIN(tmax, kmax)) { + if (kmin > tmax) + return ipset_errptr(session, + "Kernel supports %s type, family %s " + "with minimal revision %u while ipset program " + "with maximal revision %u.\n" + "You need to upgrade your ipset program.", + typename, + family == NFPROTO_IPV4 ? "INET" : + family == NFPROTO_IPV6 ? "INET6" : "UNSPEC", + kmin, tmax); + else + return ipset_errptr(session, + "Kernel supports %s type, family %s " + "with maximal revision %u while ipset program " + "with minimal revision %u.\n" + "You need to upgrade your kernel.", + typename, + family == NFPROTO_IPV4 ? "INET" : + family == NFPROTO_IPV6 ? "INET6" : "UNSPEC", + kmax, tmin); + } + + /* Disable unsupported revisions */ + for (match = NULL, t = typelist; t != NULL; t = t->next) { + /* Skip revisions which are unsupported by the kernel */ + if (t->kernel_check == IPSET_KERNEL_MISMATCH) + continue; + if (ipset_match_typename(typename, t) + && MATCH_FAMILY(t, family)) { + if (t->revision < kmin || t->revision > kmax) + t->kernel_check = IPSET_KERNEL_MISMATCH; + else if (match == NULL) + match = t; + } + } + match->kernel_check = IPSET_KERNEL_OK; +found: + ipset_data_set(data, IPSET_OPT_TYPE, match); + + if (ignore_family) { + /* Overload ignored flag */ + D("set ignored flag to FAMILY"); + ipset_data_ignored(data, IPSET_OPT_FAMILY); + } + return match; +} + +#define set_family_and_type(data, match, family) do { \ + if (family == NFPROTO_UNSPEC && match->family != NFPROTO_UNSPEC) \ + family = match->family == NFPROTO_IPSET_IPV46 ? \ + NFPROTO_IPV4 : match->family;\ + ipset_data_set(data, IPSET_OPT_FAMILY, &family); \ + ipset_data_set(data, IPSET_OPT_TYPE, match); \ +} while (0) + + +static inline const struct ipset_type * +adt_type_get(struct ipset_session *session) +{ + struct ipset_data *data; + struct ipset *s; + struct ipset_type *t; + const struct ipset_type *match; + const char *setname, *typename; + const uint8_t *revision; + uint8_t family = NFPROTO_UNSPEC; + int ret; + + data = ipset_session_data(session); + assert(data); + setname = ipset_data_setname(data); + assert(setname); + + /* Check existing sets in cache */ + for (s = setlist; s != NULL; s = s->next) { + if (STREQ(setname, s->name)) { + ipset_data_set(data, IPSET_OPT_FAMILY, &s->family); + ipset_data_set(data, IPSET_OPT_TYPE, s->type); + return s->type; + } + } + + /* Check kernel */ + ret = ipset_cmd(session, IPSET_CMD_HEADER, 0); + if (ret != 0) + return NULL; + + typename = ipset_data_get(data, IPSET_OPT_TYPENAME); + revision = ipset_data_get(data, IPSET_OPT_REVISION); + family = ipset_data_family(data); + + /* Check registered types */ + for (t = typelist, match = NULL; + t != NULL && match == NULL; t = t->next) { + if (t->kernel_check == IPSET_KERNEL_MISMATCH) + continue; + if (STREQ(typename, t->name) + && MATCH_FAMILY(t, family) + && *revision == t->revision) { + t->kernel_check = IPSET_KERNEL_OK; + match = t; + } + } + if (!match) + return ipset_errptr(session, + "Kernel-library incompatibility: " + "set %s in kernel has got settype %s " + "with family %s and revision %u while " + "ipset library does not support the " + "settype with that family and revision.", + setname, typename, + family == NFPROTO_IPV4 ? "inet" : + family == NFPROTO_IPV6 ? "inet6" : "unspec", + *revision); + + set_family_and_type(data, match, family); + + return match; +} + +/** + * ipset_type_get - get a set type from the kernel + * @session: session structure + * @cmd: the command which needs the set type + * + * Build up and send a private message to the kernel in order to + * get the set type. When creating the set, we send the typename + * and family and get the supported revisions of the given set type. + * When adding/deleting/testing an entry, we send the setname and + * receive the typename, family and revision. + * + * Returns the set type for success and NULL for failure. + */ +const struct ipset_type * +ipset_type_get(struct ipset_session *session, enum ipset_cmd cmd) +{ + assert(session); + + switch (cmd) { + case IPSET_CMD_CREATE: + return ipset_data_test(ipset_session_data(session), + IPSET_OPT_TYPE) + ? ipset_data_get(ipset_session_data(session), + IPSET_OPT_TYPE) + : create_type_get(session); + case IPSET_CMD_ADD: + case IPSET_CMD_DEL: + case IPSET_CMD_TEST: + return adt_type_get(session); + default: + break; + } + + assert(cmd == IPSET_CMD_NONE); + return NULL; +} + +/** + * ipset_type_higher_rev - find the next higher userspace revision + * @type: set type + * + * Find the next higher revision of the set type for the input + * set type. Higher revision numbers come first on typelist. + * + * Returns the found or original set type, cannot fail. + */ +const struct ipset_type * +ipset_type_higher_rev(const struct ipset_type *type) +{ + const struct ipset_type *t; + + /* Check all registered types in userspace */ + for (t = typelist; t != NULL; t = t->next) { + if (STREQ(type->name, t->name) + && type->family == t->family + && type == t->next) + return t; + } + return type; +} + +/** + * ipset_type_check - check the set type received from kernel + * @session: session structure + * + * Check the set type received from the kernel (typename, revision, + * family) against the userspace types looking for a matching type. + * + * Returns the set type for success and NULL for failure. + */ +const struct ipset_type * +ipset_type_check(struct ipset_session *session) +{ + const struct ipset_type *t, *match = NULL; + struct ipset_data *data; + const char *typename; + uint8_t family = NFPROTO_UNSPEC, revision; + + assert(session); + data = ipset_session_data(session); + assert(data); + + typename = ipset_data_get(data, IPSET_OPT_TYPENAME); + family = ipset_data_family(data); + revision = *(const uint8_t *) ipset_data_get(data, IPSET_OPT_REVISION); + + /* Check registered types */ + for (t = typelist; t != NULL && match == NULL; t = t->next) { + if (t->kernel_check == IPSET_KERNEL_MISMATCH) + continue; + if (ipset_match_typename(typename, t) + && MATCH_FAMILY(t, family) + && t->revision == revision) + match = t; + } + if (!match) + return ipset_errptr(session, + "Kernel and userspace incompatible: " + "settype %s with revision %u not supported " + "by userspace.", typename, revision); + + set_family_and_type(data, match, family); + + return match; +} + +/** + * ipset_type_add - add (register) a userspace set type + * @type: pointer to the set type structure + * + * Add the given set type to the type list. The types + * are added sorted, in descending revision number. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_type_add(struct ipset_type *type) +{ + struct ipset_type *t, *prev; + const struct ipset_arg *arg; + enum ipset_adt cmd; + int i; + + assert(type); + + if (strlen(type->name) > IPSET_MAXNAMELEN - 1) + return -EINVAL; + + for (cmd = IPSET_ADD; cmd < IPSET_CADT_MAX; cmd++) { + for (i = 0; type->cmd[cmd].args[i] != IPSET_ARG_NONE; i++) { + arg = ipset_keyword(type->cmd[cmd].args[i]); + type->cmd[cmd].full |= IPSET_FLAG(arg->opt); + } + } + /* Add to the list: higher revision numbers first */ + for (t = typelist, prev = NULL; t != NULL; t = t->next) { + if (STREQ(t->name, type->name)) { + if (t->revision == type->revision) + return -EEXIST; + else if (t->revision < type->revision) { + type->next = t; + if (prev) + prev->next = type; + else + typelist = type; + return 0; + } + } + if (t->next != NULL && STREQ(t->next->name, type->name)) { + if (t->next->revision == type->revision) + return -EEXIST; + else if (t->next->revision < type->revision) { + type->next = t->next; + t->next = type; + return 0; + } + } + prev = t; + } + type->next = typelist; + typelist = type; + return 0; +} + +/** + * ipset_typename_resolve - resolve typename alias + * @str: typename or alias + * + * Check the typenames (and aliases) and return the + * preferred name of the set type. + * + * Returns the name of the matching set type or NULL. + */ +const char * +ipset_typename_resolve(const char *str) +{ + const struct ipset_type *t; + + for (t = typelist; t != NULL; t = t->next) + if (ipset_match_typename(str, t)) + return t->name; + return NULL; +} + +/** + * ipset_types - return the list of the set types + * + * The types can be unchecked with respect of the running kernel. + * Only useful for type specific help. + * + * Returns the list of the set types. + */ +const struct ipset_type * +ipset_types(void) +{ + return typelist; +} + +/** + * ipset_cache_init - initialize set cache + * + * Initialize the set cache in userspace. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_cache_init(void) +{ + return 0; +} + +/** + * ipset_cache_fini - release the set cache + * + * Release the set cache. + */ +void +ipset_cache_fini(void) +{ + struct ipset *set; + + while (setlist) { + set = setlist; + setlist = setlist->next; + free(set); + } +} + +extern void ipset_types_init(void); + +/** + * ipset_load_types - load known set types + * + * Load in (register) all known set types for the system + */ +void +ipset_load_types(void) +{ +#ifdef ENABLE_SETTYPE_MODULES + const char *dir = IPSET_MODSDIR; + const char *next = NULL; + char path[256]; + char file[256]; + struct dirent **list = NULL; + int n; + int len; +#endif + + if (typelist != NULL) + return; + + /* Initialize static types */ + ipset_types_init(); + +#ifdef ENABLE_SETTYPE_MODULES + /* Initialize dynamic types */ + do { + next = strchr(dir, ':'); + if (next == NULL) + next = dir + strlen(dir); + + len = snprintf(path, sizeof(path), "%.*s", + (unsigned int)(next - dir), dir); + + if (len >= (int)sizeof(path) || len < 0) + continue; + + n = scandir(path, &list, NULL, alphasort); + if (n < 0) + continue; + + while (n--) { + if (strstr(list[n]->d_name, ".so") == NULL) + goto nextf; + + len = snprintf(file, sizeof(file), "%s/%s", + path, list[n]->d_name); + if (len >= (int)sizeof(file) || len < (int)0) + goto nextf; + + if (dlopen(file, RTLD_NOW) == NULL) + fprintf(stderr, "%s: %s\n", file, dlerror()); + +nextf: + free(list[n]); + } + + free(list); + + dir = next + 1; + } while (*next != '\0'); +#endif /* ENABLE_SETTYPE_MODULES */ +} diff --git a/libltdl/COPYING.LIB b/libltdl/COPYING.LIB new file mode 100644 index 0000000..4362b49 --- /dev/null +++ b/libltdl/COPYING.LIB @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser 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 Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/libltdl/README b/libltdl/README new file mode 100644 index 0000000..c9629ed --- /dev/null +++ b/libltdl/README @@ -0,0 +1,20 @@ +This is GNU libltdl, a system independent dlopen wrapper for GNU libtool. + +It supports the following dlopen interfaces: +* dlopen (POSIX) +* shl_load (HP-UX) +* LoadLibrary (Win16 and Win32) +* load_add_on (BeOS) +* GNU DLD (emulates dynamic linking for static libraries) +* dyld (darwin/Mac OS X) +* libtool's dlpreopen +-- + Copyright (C) 1999, 2003, 2011-2015 Free Software Foundation, Inc. + Written by Thomas Tanner, 1999 + + This file is part of GNU Libtool. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. diff --git a/libltdl/libltdl/lt__alloc.h b/libltdl/libltdl/lt__alloc.h new file mode 100644 index 0000000..db1a989 --- /dev/null +++ b/libltdl/libltdl/lt__alloc.h @@ -0,0 +1,58 @@ +/* lt__alloc.h -- internal memory management interface + + Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. + Written by Gary V. Vaughan, 2004 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#if !defined LT__ALLOC_H +#define LT__ALLOC_H 1 + +#include "lt_system.h" + +LT_BEGIN_C_DECLS + +#define MALLOC(tp, n) (tp*) lt__malloc((n) * sizeof(tp)) +#define REALLOC(tp, mem, n) (tp*) lt__realloc((mem), (n) * sizeof(tp)) +#define FREE(mem) LT_STMT_START { \ + free (mem); mem = NULL; } LT_STMT_END +#define MEMREASSIGN(p, q) LT_STMT_START { \ + if ((p) != (q)) { free (p); (p) = (q); (q) = 0; } \ + } LT_STMT_END + +/* If set, this function is called when memory allocation has failed. */ +LT_SCOPE void (*lt__alloc_die) (void); + +LT_SCOPE void *lt__malloc (size_t n); +LT_SCOPE void *lt__zalloc (size_t n); +LT_SCOPE void *lt__realloc (void *mem, size_t n); +LT_SCOPE void *lt__memdup (void const *mem, size_t n); + +LT_SCOPE char *lt__strdup (const char *string); + +LT_END_C_DECLS + +#endif /*!defined LT__ALLOC_H*/ diff --git a/libltdl/libltdl/lt__argz_.h b/libltdl/libltdl/lt__argz_.h new file mode 100644 index 0000000..e0d3b18 --- /dev/null +++ b/libltdl/libltdl/lt__argz_.h @@ -0,0 +1,69 @@ +/* lt__argz.h -- internal argz interface for non-glibc systems + + Copyright (C) 2004, 2007-2008, 2011-2015 Free Software Foundation, + Inc. + Written by Gary V. Vaughan, 2004 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#if !defined LT__ARGZ_H +#define LT__ARGZ_H 1 + +#include +#define __need_error_t +#include +#include + +#if defined LTDL +# include "lt__glibc.h" +# include "lt_system.h" +#else +# define LT_SCOPE +#endif + +#if defined __cplusplus +extern "C" { +#endif + +LT_SCOPE error_t argz_append (char **pargz, size_t *pargz_len, + const char *buf, size_t buf_len); +LT_SCOPE error_t argz_create_sep(const char *str, int delim, + char **pargz, size_t *pargz_len); +LT_SCOPE error_t argz_insert (char **pargz, size_t *pargz_len, + char *before, const char *entry); +LT_SCOPE char * argz_next (char *argz, size_t argz_len, + const char *entry); +LT_SCOPE void argz_stringify (char *argz, size_t argz_len, int sep); + +#if defined __cplusplus +} +#endif + +#if !defined LTDL +# undef LT_SCOPE +#endif + +#endif /*!defined LT__ARGZ_H*/ diff --git a/libltdl/libltdl/lt__dirent.h b/libltdl/libltdl/lt__dirent.h new file mode 100644 index 0000000..9b6aaea --- /dev/null +++ b/libltdl/libltdl/lt__dirent.h @@ -0,0 +1,88 @@ +/* lt__dirent.h -- internal directory entry scanning interface + + Copyright (C) 2001, 2004, 2006, 2011-2015 Free Software Foundation, + Inc. + Written by Bob Friesenhahn, 2001 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#if !defined LT__DIRENT_H +#define LT__DIRENT_H 1 + +#if defined LT_CONFIG_H +# include LT_CONFIG_H +#else +# include +#endif + +#include "lt_system.h" + +#ifdef HAVE_DIRENT_H +/* We have a fully operational dirent subsystem. */ +# include +# define D_NAMLEN(dirent) (strlen((dirent)->d_name)) + +#elif defined __WINDOWS__ +/* Use some wrapper code to emulate dirent on windows.. */ +# define WINDOWS_DIRENT_EMULATION 1 + +# include + +# define D_NAMLEN(dirent) (strlen((dirent)->d_name)) +# define dirent lt__dirent +# define DIR lt__DIR +# define opendir lt__opendir +# define readdir lt__readdir +# define closedir lt__closedir + +LT_BEGIN_C_DECLS + +struct dirent +{ + char d_name[LT_FILENAME_MAX]; + int d_namlen; +}; + +typedef struct +{ + HANDLE hSearch; + WIN32_FIND_DATA Win32FindData; + BOOL firsttime; + struct dirent file_info; +} DIR; + + +LT_SCOPE DIR * opendir (const char *path); +LT_SCOPE struct dirent *readdir (DIR *entry); +LT_SCOPE void closedir (DIR *entry); + +LT_END_C_DECLS + +#else /* !defined __WINDOWS__*/ +ERROR - cannot find dirent +#endif /*!defined __WINDOWS__*/ + +#endif /*!defined LT__DIRENT_H*/ diff --git a/libltdl/libltdl/lt__glibc.h b/libltdl/libltdl/lt__glibc.h new file mode 100644 index 0000000..80ee450 --- /dev/null +++ b/libltdl/libltdl/lt__glibc.h @@ -0,0 +1,89 @@ +/* lt__glibc.h -- support for non glibc environments + + Copyright (C) 2004, 2006-2007, 2011-2015 Free Software Foundation, + Inc. + Written by Gary V. Vaughan, 2004 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#if !defined LT__GLIBC_H +#define LT__GLIBC_H 1 + +#if defined LT_CONFIG_H +# include LT_CONFIG_H +#else +# include +#endif + +#if !defined HAVE_ARGZ_H || !defined HAVE_WORKING_ARGZ +/* Redefine any glibc symbols we reimplement to import the + implementations into our lt__ namespace so we don't ever + clash with the system library if our clients use argz_* + from there in addition to libltdl. */ +# undef argz_append +# define argz_append lt__argz_append +# undef argz_create_sep +# define argz_create_sep lt__argz_create_sep +# undef argz_insert +# define argz_insert lt__argz_insert +# undef argz_next +# define argz_next lt__argz_next +# undef argz_stringify +# define argz_stringify lt__argz_stringify + +# include + +#else + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#ifdef __cplusplus +} +#endif + +#endif /*!defined HAVE_ARGZ_H || !defined HAVE_WORKING_ARGZ*/ + +# define slist_concat lt__slist_concat +# define slist_cons lt__slist_cons +# define slist_delete lt__slist_delete +# define slist_remove lt__slist_remove +# define slist_reverse lt__slist_reverse +# define slist_sort lt__slist_sort +# define slist_tail lt__slist_tail +# define slist_nth lt__slist_nth +# define slist_find lt__slist_find +# define slist_length lt__slist_length +# define slist_foreach lt__slist_foreach +# define slist_box lt__slist_box +# define slist_unbox lt__slist_unbox + +#include + +#endif /*!defined LT__GLIBC_H*/ diff --git a/libltdl/libltdl/lt__private.h b/libltdl/libltdl/lt__private.h new file mode 100644 index 0000000..a91849b --- /dev/null +++ b/libltdl/libltdl/lt__private.h @@ -0,0 +1,149 @@ +/* lt__private.h -- internal apis for libltdl + + Copyright (C) 2004-2008, 2011-2015 Free Software Foundation, Inc. + Written by Gary V. Vaughan, 2004 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy con be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#if !defined LT__PRIVATE_H +#define LT__PRIVATE_H 1 + +#if defined LT_CONFIG_H +# include LT_CONFIG_H +#else +# include +#endif + +#include +#include +#include +#include +#include + +#if defined HAVE_UNISTD_H +# include +#endif + +/* Import internal interfaces... */ +#include "lt__alloc.h" +#include "lt__dirent.h" +#include "lt__strl.h" +#include "lt__glibc.h" + +/* ...and all exported interfaces. */ +#include "ltdl.h" + +#if defined WITH_DMALLOC +# include +#endif + +/* DLL building support on win32 hosts; mostly to workaround their + ridiculous implementation of data symbol exporting. */ +#ifndef LT_GLOBAL_DATA +# if defined __WINDOWS__ || defined __CYGWIN__ +# if defined DLL_EXPORT /* defined by libtool (if required) */ +# define LT_GLOBAL_DATA __declspec(dllexport) +# endif +# endif +# ifndef LT_GLOBAL_DATA +# define LT_GLOBAL_DATA /* static linking or !__WINDOWS__ */ +# endif +#endif + +#ifndef __attribute__ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__ +# define __attribute__(x) +# endif +#endif + +#ifndef LT__UNUSED +# define LT__UNUSED __attribute__ ((__unused__)) +#endif + + +LT_BEGIN_C_DECLS + +#if !defined errno +extern int errno; +#endif + +LT_SCOPE void lt__alloc_die_callback (void); + + +/* For readability: */ +#define STRNEQ(s1, s2) (strcmp((s1), (s2)) != 0) +#define STREQ(s1, s2) (strcmp((s1), (s2)) == 0) + + + +/* --- OPAQUE STRUCTURES DECLARED IN LTDL.H --- */ + +/* This type is used for the array of interface data sets in each handler. */ +typedef struct { + lt_dlinterface_id key; + void * data; +} lt_interface_data; + +struct lt__handle { + lt_dlhandle next; + const lt_dlvtable * vtable; /* dlopening interface */ + lt_dlinfo info; /* user visible fields */ + int depcount; /* number of dependencies */ + lt_dlhandle * deplibs; /* dependencies */ + lt_module module; /* system module handle */ + void * system; /* system specific data */ + lt_interface_data * interface_data; /* per caller associated data */ + int flags; /* various boolean stats */ +}; + +struct lt__advise { + unsigned int try_ext:1; /* try system library extensions. */ + unsigned int is_resident:1; /* module can't be unloaded. */ + unsigned int is_symglobal:1; /* module symbols can satisfy + subsequently loaded modules. */ + unsigned int is_symlocal:1; /* module symbols are only available + locally. */ + unsigned int try_preload_only:1;/* only preloaded modules will be tried. */ +}; + +/* --- ERROR HANDLING --- */ + +/* Extract the diagnostic strings from the error table macro in the same + order as the enumerated indices in lt_error.h. */ + +#define LT__STRERROR(name) lt__error_string(LT_CONC(LT_ERROR_,name)) + +#define LT__GETERROR(lvalue) (lvalue) = lt__get_last_error() +#define LT__SETERRORSTR(errormsg) lt__set_last_error(errormsg) +#define LT__SETERROR(errorcode) LT__SETERRORSTR(LT__STRERROR(errorcode)) + +LT_SCOPE const char *lt__error_string (int errorcode); +LT_SCOPE const char *lt__get_last_error (void); +LT_SCOPE const char *lt__set_last_error (const char *errormsg); + +LT_END_C_DECLS + +#endif /*!defined LT__PRIVATE_H*/ diff --git a/libltdl/libltdl/lt__strl.h b/libltdl/libltdl/lt__strl.h new file mode 100644 index 0000000..a1db2e6 --- /dev/null +++ b/libltdl/libltdl/lt__strl.h @@ -0,0 +1,53 @@ +/* lt__strl.h -- size-bounded string copying and concatenation + + Copyright (C) 2004, 2006, 2011-2015 Free Software Foundation, Inc. + Written by Bob Friesenhahn, 2004 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#if !defined LT__STRL_H +#define LT__STRL_H 1 + +#if defined LT_CONFIG_H +# include LT_CONFIG_H +#else +# include +#endif + +#include +#include "lt_system.h" + +#if !defined HAVE_STRLCAT +# define strlcat(dst,src,dstsize) lt_strlcat(dst,src,dstsize) +LT_SCOPE size_t lt_strlcat(char *dst, const char *src, const size_t dstsize); +#endif /* !defined HAVE_STRLCAT */ + +#if !defined HAVE_STRLCPY +# define strlcpy(dst,src,dstsize) lt_strlcpy(dst,src,dstsize) +LT_SCOPE size_t lt_strlcpy(char *dst, const char *src, const size_t dstsize); +#endif /* !defined HAVE_STRLCPY */ + +#endif /*!defined LT__STRL_H*/ diff --git a/libltdl/libltdl/lt_dlloader.h b/libltdl/libltdl/lt_dlloader.h new file mode 100644 index 0000000..66cf047 --- /dev/null +++ b/libltdl/libltdl/lt_dlloader.h @@ -0,0 +1,91 @@ +/* lt_dlloader.h -- dynamic library loader interface + + Copyright (C) 2004, 2007-2008, 2011-2015 Free Software Foundation, + Inc. + Written by Gary V. Vaughan, 2004 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#if !defined LT_DLLOADER_H +#define LT_DLLOADER_H 1 + +#include + +LT_BEGIN_C_DECLS + +typedef void * lt_dlloader; +typedef void * lt_module; +typedef void * lt_user_data; +typedef struct lt__advise * lt_dladvise; + +/* Function pointer types for module loader vtable entries: */ +typedef lt_module lt_module_open (lt_user_data data, + const char *filename, + lt_dladvise advise); +typedef int lt_module_close (lt_user_data data, + lt_module module); +typedef void * lt_find_sym (lt_user_data data, lt_module module, + const char *symbolname); +typedef int lt_dlloader_init (lt_user_data data); +typedef int lt_dlloader_exit (lt_user_data data); + +/* Default priority is LT_DLLOADER_PREPEND if none is explicitly given. */ +typedef enum { + LT_DLLOADER_PREPEND = 0, LT_DLLOADER_APPEND +} lt_dlloader_priority; + +/* This structure defines a module loader, as populated by the get_vtable + entry point of each loader. */ +typedef struct { + const char * name; + const char * sym_prefix; + lt_module_open * module_open; + lt_module_close * module_close; + lt_find_sym * find_sym; + lt_dlloader_init * dlloader_init; + lt_dlloader_exit * dlloader_exit; + lt_user_data dlloader_data; + lt_dlloader_priority priority; +} lt_dlvtable; + +LT_SCOPE int lt_dlloader_add (const lt_dlvtable *vtable); +LT_SCOPE lt_dlloader lt_dlloader_next (const lt_dlloader loader); + +LT_SCOPE lt_dlvtable * lt_dlloader_remove (const char *name); +LT_SCOPE const lt_dlvtable *lt_dlloader_find (const char *name); +LT_SCOPE const lt_dlvtable *lt_dlloader_get (lt_dlloader loader); + + +/* Type of a function to get a loader's vtable: */ +typedef const lt_dlvtable *lt_get_vtable (lt_user_data data); + +#ifdef LT_DEBUG_LOADERS +LT_SCOPE void lt_dlloader_dump (void); +#endif + +LT_END_C_DECLS + +#endif /*!defined LT_DLLOADER_H*/ diff --git a/libltdl/libltdl/lt_error.h b/libltdl/libltdl/lt_error.h new file mode 100644 index 0000000..367c36b --- /dev/null +++ b/libltdl/libltdl/lt_error.h @@ -0,0 +1,86 @@ +/* lt_error.h -- error propagation interface + + Copyright (C) 1999-2001, 2004, 2007, 2011-2015 Free Software + Foundation, Inc. + Written by Thomas Tanner, 1999 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +/* Only include this header file once. */ +#if !defined LT_ERROR_H +#define LT_ERROR_H 1 + +#include + +LT_BEGIN_C_DECLS + +/* Defining error strings alongside their symbolic names in a macro in + this way allows us to expand the macro in different contexts with + confidence that the enumeration of symbolic names will map correctly + onto the table of error strings. \0 is appended to the strings to + expilicitely initialize the string terminator. */ +#define lt_dlerror_table \ + LT_ERROR(UNKNOWN, "unknown error\0") \ + LT_ERROR(DLOPEN_NOT_SUPPORTED, "dlopen support not available\0") \ + LT_ERROR(INVALID_LOADER, "invalid loader\0") \ + LT_ERROR(INIT_LOADER, "loader initialization failed\0") \ + LT_ERROR(REMOVE_LOADER, "loader removal failed\0") \ + LT_ERROR(FILE_NOT_FOUND, "file not found\0") \ + LT_ERROR(DEPLIB_NOT_FOUND, "dependency library not found\0") \ + LT_ERROR(NO_SYMBOLS, "no symbols defined\0") \ + LT_ERROR(CANNOT_OPEN, "can't open the module\0") \ + LT_ERROR(CANNOT_CLOSE, "can't close the module\0") \ + LT_ERROR(SYMBOL_NOT_FOUND, "symbol not found\0") \ + LT_ERROR(NO_MEMORY, "not enough memory\0") \ + LT_ERROR(INVALID_HANDLE, "invalid module handle\0") \ + LT_ERROR(BUFFER_OVERFLOW, "internal buffer overflow\0") \ + LT_ERROR(INVALID_ERRORCODE, "invalid errorcode\0") \ + LT_ERROR(SHUTDOWN, "library already shutdown\0") \ + LT_ERROR(CLOSE_RESIDENT_MODULE, "can't close resident module\0") \ + LT_ERROR(INVALID_MUTEX_ARGS, "internal error (code withdrawn)\0")\ + LT_ERROR(INVALID_POSITION, "invalid search path insert position\0")\ + LT_ERROR(CONFLICTING_FLAGS, "symbol visibility can be global or local\0") + +/* Enumerate the symbolic error names. */ +enum { +#define LT_ERROR(name, diagnostic) LT_CONC(LT_ERROR_, name), + lt_dlerror_table +#undef LT_ERROR + + LT_ERROR_MAX +}; + +/* Should be max of the error string lengths above (plus one for C++) */ +#define LT_ERROR_LEN_MAX (41) + +/* These functions are only useful from inside custom module loaders. */ +LT_SCOPE int lt_dladderror (const char *diagnostic); +LT_SCOPE int lt_dlseterror (int errorcode); + + +LT_END_C_DECLS + +#endif /*!defined LT_ERROR_H*/ diff --git a/libltdl/libltdl/lt_system.h b/libltdl/libltdl/lt_system.h new file mode 100644 index 0000000..a9bc7ec --- /dev/null +++ b/libltdl/libltdl/lt_system.h @@ -0,0 +1,166 @@ +/* lt_system.h -- system portability abstraction layer + + Copyright (C) 2004, 2007, 2010-2015 Free Software Foundation, Inc. + Written by Gary V. Vaughan, 2004 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#if !defined LT_SYSTEM_H +#define LT_SYSTEM_H 1 + +#include +#include +#include + +/* Some systems do not define EXIT_*, even with STDC_HEADERS. */ +#if !defined EXIT_SUCCESS +# define EXIT_SUCCESS 0 +#endif +#if !defined EXIT_FAILURE +# define EXIT_FAILURE 1 +#endif + +/* Just pick a big number... */ +#define LT_FILENAME_MAX 2048 + + +/* Saves on those hard to debug '\0' typos.... */ +#define LT_EOS_CHAR '\0' + +/* LTDL_BEGIN_C_DECLS should be used at the beginning of your declarations, + so that C++ compilers don't mangle their names. Use LTDL_END_C_DECLS at + the end of C declarations. */ +#if defined __cplusplus +# define LT_BEGIN_C_DECLS extern "C" { +# define LT_END_C_DECLS } +#else +# define LT_BEGIN_C_DECLS /* empty */ +# define LT_END_C_DECLS /* empty */ +#endif + +/* LT_STMT_START/END are used to create macros that expand to a + a single compound statement in a portable way. */ +#if defined __GNUC__ && !defined __STRICT_ANSI__ && !defined __cplusplus +# define LT_STMT_START (void)( +# define LT_STMT_END ) +#else +# if (defined sun || defined __sun__) +# define LT_STMT_START if (1) +# define LT_STMT_END else (void)0 +# else +# define LT_STMT_START do +# define LT_STMT_END while (0) +# endif +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +/* Canonicalise Windows and Cygwin recognition macros. + To match the values set by recent Cygwin compilers, make sure that if + __CYGWIN__ is defined (after canonicalisation), __WINDOWS__ is NOT! */ +#if defined __CYGWIN32__ && !defined __CYGWIN__ +# define __CYGWIN__ __CYGWIN32__ +#endif +#if defined __CYGWIN__ +# if defined __WINDOWS__ +# undef __WINDOWS__ +# endif +#elif defined _WIN32 +# define __WINDOWS__ _WIN32 +#elif defined WIN32 +# define __WINDOWS__ WIN32 +#endif +#if defined __CYGWIN__ && defined __WINDOWS__ +# undef __WINDOWS__ +#endif + + +/* DLL building support on win32 hosts; mostly to workaround their + ridiculous implementation of data symbol exporting. */ +#if !defined LT_SCOPE +# if defined __WINDOWS__ || defined __CYGWIN__ +# if defined DLL_EXPORT /* defined by libtool (if required) */ +# define LT_SCOPE extern __declspec(dllexport) +# endif +# if defined LIBLTDL_DLL_IMPORT /* define if linking with this dll */ + /* note: cygwin/mingw compilers can rely instead on auto-import */ +# define LT_SCOPE extern __declspec(dllimport) +# endif +# endif +# if !defined LT_SCOPE /* static linking or !__WINDOWS__ */ +# define LT_SCOPE extern +# endif +#endif + +#if defined __WINDOWS__ +/* LT_DIRSEP_CHAR is accepted *in addition* to '/' as a directory + separator when it is set. */ +# define LT_DIRSEP_CHAR '\\' +# define LT_PATHSEP_CHAR ';' +#else +# define LT_PATHSEP_CHAR ':' +#endif + +#if defined _MSC_VER /* Visual Studio */ +# define R_OK 4 +#endif + +/* fopen() mode flags for reading a text file */ +#undef LT_READTEXT_MODE +#if defined __WINDOWS__ || defined __CYGWIN__ +# define LT_READTEXT_MODE "rt" +#else +# define LT_READTEXT_MODE "r" +#endif + +/* The extra indirection to the LT__STR and LT__CONC macros is required so + that if the arguments to LT_STR() (or LT_CONC()) are themselves macros, + they will be expanded before being quoted. */ +#ifndef LT_STR +# define LT__STR(arg) #arg +# define LT_STR(arg) LT__STR(arg) +#endif + +#ifndef LT_CONC +# define LT__CONC(a, b) a##b +# define LT_CONC(a, b) LT__CONC(a, b) +#endif +#ifndef LT_CONC3 +# define LT__CONC3(a, b, c) a##b##c +# define LT_CONC3(a, b, c) LT__CONC3(a, b, c) +#endif + +#endif /*!defined LT_SYSTEM_H*/ diff --git a/libltdl/libltdl/slist.h b/libltdl/libltdl/slist.h new file mode 100644 index 0000000..ba54736 --- /dev/null +++ b/libltdl/libltdl/slist.h @@ -0,0 +1,97 @@ +/* slist.h -- generalised singly linked lists + + Copyright (C) 2000, 2004, 2009, 2011-2015 Free Software Foundation, + Inc. + Written by Gary V. Vaughan, 2000 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +/* A generalised list. This is deliberately transparent so that you + can make the NEXT field of all your chained data structures first, + and then cast them to '(SList *)' so that they can be manipulated + by this API. + + Alternatively, you can generate raw SList elements using slist_new(), + and put the element data in the USERDATA field. Either way you + get to manage the memory involved by yourself. +*/ + +#if !defined SLIST_H +#define SLIST_H 1 + +#if defined LTDL +# include +# include +#else +# define LT_SCOPE +#endif + +#include + +#if defined __cplusplus +extern "C" { +#endif + +typedef struct slist { + struct slist *next; /* chain forward pointer*/ + const void *userdata; /* for boxed 'SList' item */ +} SList; + +typedef void * SListCallback (SList *item, void *userdata); +typedef int SListCompare (const SList *item1, const SList *item2, + void *userdata); + +LT_SCOPE SList *slist_concat (SList *head, SList *tail); +LT_SCOPE SList *slist_cons (SList *item, SList *slist); + +LT_SCOPE SList *slist_delete (SList *slist, void (*delete_fct) (void *item)); +LT_SCOPE SList *slist_remove (SList **phead, SListCallback *find, + void *matchdata); +LT_SCOPE SList *slist_reverse (SList *slist); +LT_SCOPE SList *slist_sort (SList *slist, SListCompare *compare, + void *userdata); + +LT_SCOPE SList *slist_tail (SList *slist); +LT_SCOPE SList *slist_nth (SList *slist, size_t n); +LT_SCOPE void * slist_find (SList *slist, SListCallback *find, + void *matchdata); +LT_SCOPE size_t slist_length (SList *slist); + +LT_SCOPE void * slist_foreach (SList *slist, SListCallback *foreach, + void *userdata); + +LT_SCOPE SList *slist_box (const void *userdata); +LT_SCOPE void * slist_unbox (SList *item); + +#if defined __cplusplus +} +#endif + +#if !defined LTDL +# undef LT_SCOPE +#endif + +#endif /*!defined SLIST_H*/ diff --git a/libltdl/loaders/dld_link.c b/libltdl/loaders/dld_link.c new file mode 100644 index 0000000..a73880f --- /dev/null +++ b/libltdl/loaders/dld_link.c @@ -0,0 +1,158 @@ +/* loader-dld_link.c -- dynamic linking with dld + + Copyright (C) 1998-2000, 2004, 2006-2008, 2011-2015 Free Software + Foundation, Inc. + Written by Thomas Tanner, 1998 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "lt__private.h" +#include "lt_dlloader.h" + +/* Use the preprocessor to rename non-static symbols to avoid namespace + collisions when the loader code is statically linked into libltdl. + Use the "_LTX_" prefix so that the symbol addresses can + be fetched from the preloaded symbol list by lt_dlsym(): */ +#define get_vtable dld_link_LTX_get_vtable + +LT_BEGIN_C_DECLS +LT_SCOPE lt_dlvtable *get_vtable (lt_user_data loader_data); +LT_END_C_DECLS + + +/* Boilerplate code to set up the vtable for hooking this loader into + libltdl's loader list: */ +static int vl_exit (lt_user_data loader_data); +static lt_module vm_open (lt_user_data loader_data, const char *filename, + lt_dladvise advise); +static int vm_close (lt_user_data loader_data, lt_module module); +static void * vm_sym (lt_user_data loader_data, lt_module module, + const char *symbolname); + +static lt_dlvtable *vtable = 0; + +/* Return the vtable for this loader, only the name and sym_prefix + attributes (plus the virtual function implementations, obviously) + change between loaders. */ +lt_dlvtable * +get_vtable (lt_user_data loader_data) +{ + if (!vtable) + { + vtable = lt__zalloc (sizeof *vtable); + } + + if (vtable && !vtable->name) + { + vtable->name = "lt_dld_link"; + vtable->module_open = vm_open; + vtable->module_close = vm_close; + vtable->find_sym = vm_sym; + vtable->dlloader_exit = vl_exit; + vtable->dlloader_data = loader_data; + vtable->priority = LT_DLLOADER_APPEND; + } + + if (vtable && (vtable->dlloader_data != loader_data)) + { + LT__SETERROR (INIT_LOADER); + return 0; + } + + return vtable; +} + + + +/* --- IMPLEMENTATION --- */ + + +#if defined HAVE_DLD_H +# include +#endif + +/* A function called through the vtable when this loader is no + longer needed by the application. */ +static int +vl_exit (lt_user_data loader_data LT__UNUSED) +{ + vtable = NULL; + return 0; +} + +/* A function called through the vtable to open a module with this + loader. Returns an opaque representation of the newly opened + module for processing with this loader's other vtable functions. */ +static lt_module +vm_open (lt_user_data loader_data LT__UNUSED, const char *filename, + lt_dladvise advise LT__UNUSED) +{ + lt_module module = lt__strdup (filename); + + if (dld_link (filename) != 0) + { + LT__SETERROR (CANNOT_OPEN); + FREE (module); + } + + return module; +} + +/* A function called through the vtable when a particular module + should be unloaded. */ +static int +vm_close (lt_user_data loader_data LT__UNUSED, lt_module module) +{ + int errors = 0; + + if (dld_unlink_by_file ((char*)(module), 1) != 0) + { + LT__SETERROR (CANNOT_CLOSE); + ++errors; + } + else + { + FREE (module); + } + + return errors; +} + +/* A function called through the vtable to get the address of + a symbol loaded from a particular module. */ +static void * +vm_sym (lt_user_data loader_data LT__UNUSED, lt_module module LT__UNUSED, + const char *name) +{ + void *address = dld_get_func (name); + + if (!address) + { + LT__SETERROR (SYMBOL_NOT_FOUND); + } + + return address; +} diff --git a/libltdl/loaders/dlopen.c b/libltdl/loaders/dlopen.c new file mode 100644 index 0000000..0bc562c --- /dev/null +++ b/libltdl/loaders/dlopen.c @@ -0,0 +1,275 @@ +/* loader-dlopen.c -- dynamic linking with dlopen/dlsym + + Copyright (C) 1998-2000, 2004, 2006-2008, 2011-2015 Free Software + Foundation, Inc. + Written by Thomas Tanner, 1998 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "lt__private.h" +#include "lt_dlloader.h" + +/* Use the preprocessor to rename non-static symbols to avoid namespace + collisions when the loader code is statically linked into libltdl. + Use the "_LTX_" prefix so that the symbol addresses can + be fetched from the preloaded symbol list by lt_dlsym(): */ +#define get_vtable dlopen_LTX_get_vtable + +LT_BEGIN_C_DECLS +LT_SCOPE lt_dlvtable *get_vtable (lt_user_data loader_data); +LT_END_C_DECLS + + +/* Boilerplate code to set up the vtable for hooking this loader into + libltdl's loader list: */ +static int vl_exit (lt_user_data loader_data); +static lt_module vm_open (lt_user_data loader_data, const char *filename, + lt_dladvise advise); +static int vm_close (lt_user_data loader_data, lt_module module); +static void * vm_sym (lt_user_data loader_data, lt_module module, + const char *symbolname); + +static lt_dlvtable *vtable = 0; + +/* Return the vtable for this loader, only the name and sym_prefix + attributes (plus the virtual function implementations, obviously) + change between loaders. */ +lt_dlvtable * +get_vtable (lt_user_data loader_data) +{ + if (!vtable) + { + vtable = (lt_dlvtable *) lt__zalloc (sizeof *vtable); + } + + if (vtable && !vtable->name) + { + vtable->name = "lt_dlopen"; +#if defined DLSYM_USCORE + vtable->sym_prefix = "_"; +#endif + vtable->module_open = vm_open; + vtable->module_close = vm_close; + vtable->find_sym = vm_sym; + vtable->dlloader_exit = vl_exit; + vtable->dlloader_data = loader_data; + vtable->priority = LT_DLLOADER_PREPEND; + } + + if (vtable && (vtable->dlloader_data != loader_data)) + { + LT__SETERROR (INIT_LOADER); + return 0; + } + + return vtable; +} + + + +/* --- IMPLEMENTATION --- */ + + +#if defined HAVE_DLFCN_H +# include +#endif + +#if defined HAVE_SYS_DL_H +# include +#endif + + +/* We may have to define LT_LAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#if !defined LT_LAZY_OR_NOW +# if defined RTLD_LAZY +# define LT_LAZY_OR_NOW RTLD_LAZY +# else +# if defined DL_LAZY +# define LT_LAZY_OR_NOW DL_LAZY +# endif +# endif /* !RTLD_LAZY */ +#endif +#if !defined LT_LAZY_OR_NOW +# if defined RTLD_NOW +# define LT_LAZY_OR_NOW RTLD_NOW +# else +# if defined DL_NOW +# define LT_LAZY_OR_NOW DL_NOW +# endif +# endif /* !RTLD_NOW */ +#endif +#if !defined LT_LAZY_OR_NOW +# define LT_LAZY_OR_NOW 0 +#endif /* !LT_LAZY_OR_NOW */ + +/* We only support local and global symbols from modules for loaders + that provide such a thing, otherwise the system default is used. */ +#if !defined RTLD_GLOBAL +# if defined DL_GLOBAL +# define RTLD_GLOBAL DL_GLOBAL +# endif +#endif /* !RTLD_GLOBAL */ +#if !defined RTLD_LOCAL +# if defined DL_LOCAL +# define RTLD_LOCAL DL_LOCAL +# endif +#endif /* !RTLD_LOCAL */ + +#if defined HAVE_DLERROR +# define DLERROR(arg) dlerror () +#else +# define DLERROR(arg) LT__STRERROR (arg) +#endif + +#define DL__SETERROR(errorcode) \ + LT__SETERRORSTR (DLERROR (errorcode)) + + +/* A function called through the vtable when this loader is no + longer needed by the application. */ +static int +vl_exit (lt_user_data loader_data LT__UNUSED) +{ + vtable = NULL; + return 0; +} + + +/* A function called through the vtable to open a module with this + loader. Returns an opaque representation of the newly opened + module for processing with this loader's other vtable functions. */ +static lt_module +vm_open (lt_user_data loader_data LT__UNUSED, const char *filename, + lt_dladvise advise) +{ + int module_flags = LT_LAZY_OR_NOW; + lt_module module; +#ifdef RTLD_MEMBER + int len = LT_STRLEN (filename); +#endif + + if (advise) + { +#ifdef RTLD_GLOBAL + /* If there is some means of asking for global symbol resolution, + do so. */ + if (advise->is_symglobal) + module_flags |= RTLD_GLOBAL; +#else + /* Otherwise, reset that bit so the caller can tell it wasn't + acted on. */ + advise->is_symglobal = 0; +#endif + +/* And similarly for local only symbol resolution. */ +#ifdef RTLD_LOCAL + if (advise->is_symlocal) + module_flags |= RTLD_LOCAL; +#else + advise->is_symlocal = 0; +#endif + } + +#ifdef RTLD_MEMBER /* AIX */ + if (len >= 4) /* at least "l(m)" */ + { + /* Advise loading an archive member only if the filename really + contains both the opening and closing parent, and a member. */ + if (filename[len-1] == ')') + { + const char *opening = strrchr(filename, '('); + if (opening && opening < (filename+len-2) && strchr(opening+1, '/') == NULL) + module_flags |= RTLD_MEMBER; + } + } +#endif + + module = dlopen (filename, module_flags); + +#if defined RTLD_MEMBER && defined LT_SHARED_LIB_MEMBER + if (!module && len && !(module_flags & RTLD_MEMBER) && errno == ENOEXEC) + { + /* Loading without a member specified failed with "Exec format error". + So the file is there, but either has wrong bitwidth, or is an + archive eventually containing the default shared archive member. + Retry with default member, getting same error in worst case. */ + const char *member = LT_SHARED_LIB_MEMBER; + + char *attempt = MALLOC (char, len + strlen (member) + 1); + if (!attempt) + { + LT__SETERROR (NO_MEMORY); + return module; + } + + sprintf (attempt, "%s%s", filename, member); + module = vm_open (loader_data, attempt, advise); + FREE (attempt); + return module; + } +#endif + + if (!module) + { + DL__SETERROR (CANNOT_OPEN); + } + + return module; +} + + +/* A function called through the vtable when a particular module + should be unloaded. */ +static int +vm_close (lt_user_data loader_data LT__UNUSED, lt_module module) +{ + int errors = 0; + + if (dlclose (module) != 0) + { + DL__SETERROR (CANNOT_CLOSE); + ++errors; + } + + return errors; +} + + +/* A function called through the vtable to get the address of + a symbol loaded from a particular module. */ +static void * +vm_sym (lt_user_data loader_data LT__UNUSED, lt_module module, const char *name) +{ + void *address = dlsym (module, name); + + if (!address) + { + DL__SETERROR (SYMBOL_NOT_FOUND); + } + + return address; +} diff --git a/libltdl/loaders/dyld.c b/libltdl/loaders/dyld.c new file mode 100644 index 0000000..6c099e0 --- /dev/null +++ b/libltdl/loaders/dyld.c @@ -0,0 +1,511 @@ +/* loader-dyld.c -- dynamic linking on darwin and OS X + + Copyright (C) 1998-2000, 2004, 2006-2008, 2011-2015 Free Software + Foundation, Inc. + Written by Peter O'Gorman, 1998 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "lt__private.h" +#include "lt_dlloader.h" + +/* Use the preprocessor to rename non-static symbols to avoid namespace + collisions when the loader code is statically linked into libltdl. + Use the "_LTX_" prefix so that the symbol addresses can + be fetched from the preloaded symbol list by lt_dlsym(): */ +#define get_vtable dyld_LTX_get_vtable + +LT_BEGIN_C_DECLS +LT_SCOPE lt_dlvtable *get_vtable (lt_user_data loader_data); +LT_END_C_DECLS + + +/* Boilerplate code to set up the vtable for hooking this loader into + libltdl's loader list: */ +static int vl_init (lt_user_data loader_data); +static int vl_exit (lt_user_data loader_data); +static lt_module vm_open (lt_user_data loader_data, const char *filename, + lt_dladvise advise); +static int vm_close (lt_user_data loader_data, lt_module module); +static void * vm_sym (lt_user_data loader_data, lt_module module, + const char *symbolname); + +static lt_dlvtable *vtable = 0; + +/* Return the vtable for this loader, only the name and sym_prefix + attributes (plus the virtual function implementations, obviously) + change between loaders. */ +lt_dlvtable * +get_vtable (lt_user_data loader_data) +{ + if (!vtable) + { + vtable = lt__zalloc (sizeof *vtable); + } + + if (vtable && !vtable->name) + { + vtable->name = "lt_dyld"; + vtable->sym_prefix = "_"; + vtable->dlloader_init = vl_init; + vtable->module_open = vm_open; + vtable->module_close = vm_close; + vtable->find_sym = vm_sym; + vtable->dlloader_exit = vl_exit; + vtable->dlloader_data = loader_data; + vtable->priority = LT_DLLOADER_APPEND; + } + + if (vtable && (vtable->dlloader_data != loader_data)) + { + LT__SETERROR (INIT_LOADER); + return 0; + } + + return vtable; +} + + + +/* --- IMPLEMENTATION --- */ + + +#if defined HAVE_MACH_O_DYLD_H +# if !defined __APPLE_CC__ && !defined __MWERKS__ && !defined __private_extern__ + /* Is this correct? Does it still function properly? */ +# define __private_extern__ extern +# endif +# include +#endif + +#include + +/* We have to put some stuff here that isn't in older dyld.h files */ +#if !defined ENUM_DYLD_BOOL +# define ENUM_DYLD_BOOL +# undef FALSE +# undef TRUE + enum DYLD_BOOL { + FALSE, + TRUE + }; +#endif +#if !defined LC_REQ_DYLD +# define LC_REQ_DYLD 0x80000000 +#endif +#if !defined LC_LOAD_WEAK_DYLIB +# define LC_LOAD_WEAK_DYLIB (0x18 | LC_REQ_DYLD) +#endif + +#if !defined NSADDIMAGE_OPTION_NONE +# define NSADDIMAGE_OPTION_NONE 0x0 +#endif +#if !defined NSADDIMAGE_OPTION_RETURN_ON_ERROR +# define NSADDIMAGE_OPTION_RETURN_ON_ERROR 0x1 +#endif +#if !defined NSADDIMAGE_OPTION_WITH_SEARCHING +# define NSADDIMAGE_OPTION_WITH_SEARCHING 0x2 +#endif +#if !defined NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED +# define NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED 0x4 +#endif +#if !defined NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME +# define NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME 0x8 +#endif + +#if !defined NSLOOKUPSYMBOLINIMAGE_OPTION_BIND +# define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND 0x0 +#endif +#if !defined NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW +# define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW 0x1 +#endif +#if !defined NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_FULLY +# define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_FULLY 0x2 +#endif +#if !defined NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR +# define NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR 0x4 +#endif + +#define LT__SYMLOOKUP_OPTS (NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW \ + | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) + +#if defined __BIG_ENDIAN__ +# define LT__MAGIC MH_MAGIC +#else +# define LT__MAGIC MH_CIGAM +#endif + +#define DYLD__SETMYERROR(errmsg) LT__SETERRORSTR (dylderror (errmsg)) +#define DYLD__SETERROR(errcode) DYLD__SETMYERROR (LT__STRERROR (errcode)) + +typedef struct mach_header mach_header; +typedef struct dylib_command dylib_command; + +static const char *dylderror (const char *errmsg); +static const mach_header *lt__nsmodule_get_header (NSModule module); +static const char *lt__header_get_instnam (const mach_header *mh); +static const mach_header *lt__match_loadedlib (const char *name); +static NSSymbol lt__linkedlib_symbol (const char *symname, const mach_header *mh); + +static const mach_header *(*lt__addimage) (const char *image_name, + unsigned long options) = 0; +static NSSymbol (*lt__image_symbol) (const mach_header *image, + const char *symbolName, + unsigned long options) = 0; +static enum DYLD_BOOL (*lt__image_symbol_p) (const mach_header *image, + const char *symbolName) = 0; +static enum DYLD_BOOL (*lt__module_export) (NSModule module) = 0; + +static int dyld_cannot_close = 0; + + +/* A function called through the vtable when this loader is no + longer needed by the application. */ +static int +vl_exit (lt_user_data loader_data LT__UNUSED) +{ + vtable = NULL; + return 0; +} + +/* A function called through the vtable to initialise this loader. */ +static int +vl_init (lt_user_data loader_data) +{ + int errors = 0; + + if (! dyld_cannot_close) + { + if (!_dyld_present ()) + { + ++errors; + } + else + { + (void) _dyld_func_lookup ("__dyld_NSAddImage", + (unsigned long*) <__addimage); + (void) _dyld_func_lookup ("__dyld_NSLookupSymbolInImage", + (unsigned long*)<__image_symbol); + (void) _dyld_func_lookup ("__dyld_NSIsSymbolNameDefinedInImage", + (unsigned long*) <__image_symbol_p); + (void) _dyld_func_lookup ("__dyld_NSMakePrivateModulePublic", + (unsigned long*) <__module_export); + dyld_cannot_close = lt_dladderror ("can't close a dylib"); + } + } + + return errors; +} + + +/* A function called through the vtable to open a module with this + loader. Returns an opaque representation of the newly opened + module for processing with this loader's other vtable functions. */ +static lt_module +vm_open (lt_user_data loader_data, const char *filename, + lt_dladvise advise LT__UNUSED) +{ + lt_module module = 0; + NSObjectFileImage ofi = 0; + + if (!filename) + { + return (lt_module) -1; + } + + switch (NSCreateObjectFileImageFromFile (filename, &ofi)) + { + case NSObjectFileImageSuccess: + module = NSLinkModule (ofi, filename, NSLINKMODULE_OPTION_RETURN_ON_ERROR + | NSLINKMODULE_OPTION_PRIVATE + | NSLINKMODULE_OPTION_BINDNOW); + NSDestroyObjectFileImage (ofi); + + if (module) + { + lt__module_export (module); + } + break; + + case NSObjectFileImageInappropriateFile: + if (lt__image_symbol_p && lt__image_symbol) + { + module = (lt_module) lt__addimage(filename, + NSADDIMAGE_OPTION_RETURN_ON_ERROR); + } + break; + + case NSObjectFileImageFailure: + case NSObjectFileImageArch: + case NSObjectFileImageFormat: + case NSObjectFileImageAccess: + /*NOWORK*/ + break; + } + + if (!module) + { + DYLD__SETERROR (CANNOT_OPEN); + } + + return module; +} + + +/* A function called through the vtable when a particular module + should be unloaded. */ +static int +vm_close (lt_user_data loader_data, lt_module module) +{ + int errors = 0; + + if (module != (lt_module) -1) + { + const mach_header *mh = (const mach_header *) module; + int flags = 0; + if (mh->magic == LT__MAGIC) + { + lt_dlseterror (dyld_cannot_close); + ++errors; + } + else + { + /* Currently, if a module contains c++ static destructors and it + is unloaded, we get a segfault in atexit(), due to compiler and + dynamic loader differences of opinion, this works around that. */ + if ((const struct section *) NULL != + getsectbynamefromheader (lt__nsmodule_get_header (module), + "__DATA", "__mod_term_func")) + { + flags |= NSUNLINKMODULE_OPTION_KEEP_MEMORY_MAPPED; + } +#if defined __ppc__ + flags |= NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES; +#endif + if (!NSUnLinkModule (module, flags)) + { + DYLD__SETERROR (CANNOT_CLOSE); + ++errors; + } + } + } + + return errors; +} + +/* A function called through the vtable to get the address of + a symbol loaded from a particular module. */ +static void * +vm_sym (lt_user_data loader_data, lt_module module, const char *name) +{ + NSSymbol *nssym = 0; + const mach_header *mh = (const mach_header *) module; + char saveError[256] = "Symbol not found"; + + if (module == (lt_module) -1) + { + void *address, *unused; + _dyld_lookup_and_bind (name, (unsigned long*) &address, &unused); + return address; + } + + if (mh->magic == LT__MAGIC) + { + if (lt__image_symbol_p && lt__image_symbol) + { + if (lt__image_symbol_p (mh, name)) + { + nssym = lt__image_symbol (mh, name, LT__SYMLOOKUP_OPTS); + } + } + + } + else + { + nssym = NSLookupSymbolInModule (module, name); + } + + if (!nssym) + { + strlcpy (saveError, dylderror (LT__STRERROR (SYMBOL_NOT_FOUND)), 255); + saveError[255] = 0; + if (!mh) + { + mh = (mach_header *)lt__nsmodule_get_header (module); + } + nssym = lt__linkedlib_symbol (name, mh); + } + + if (!nssym) + { + LT__SETERRORSTR (saveError); + } + + return nssym ? NSAddressOfSymbol (nssym) : 0; +} + + + + +/* --- HELPER FUNCTIONS --- */ + + +/* Return the dyld error string, or the passed in error string if none. */ +static const char * +dylderror (const char *errmsg) +{ + NSLinkEditErrors ler; + int lerno; + const char *file; + const char *errstr; + + NSLinkEditError (&ler, &lerno, &file, &errstr); + + if (! (errstr && *errstr)) + { + errstr = errmsg; + } + + return errstr; +} + +/* There should probably be an apple dyld api for this. */ +static const mach_header * +lt__nsmodule_get_header (NSModule module) +{ + int i = _dyld_image_count(); + const char *modname = NSNameOfModule (module); + const mach_header *mh = 0; + + if (!modname) + return NULL; + + while (i > 0) + { + --i; + if (strneq (_dyld_get_image_name (i), modname)) + { + mh = _dyld_get_image_header (i); + break; + } + } + + return mh; +} + +/* NSAddImage is also used to get the loaded image, but it only works if + the lib is installed, for uninstalled libs we need to check the + install_names against each other. Note that this is still broken if + DYLD_IMAGE_SUFFIX is set and a different lib was loaded as a result. */ +static const char * +lt__header_get_instnam (const mach_header *mh) +{ + unsigned long offset = sizeof(mach_header); + const char* result = 0; + int j; + + for (j = 0; j < mh->ncmds; j++) + { + struct load_command *lc; + + lc = (struct load_command*) (((unsigned long) mh) + offset); + if (LC_ID_DYLIB == lc->cmd) + { + result=(char*)(((dylib_command*) lc)->dylib.name.offset + + (unsigned long) lc); + } + offset += lc->cmdsize; + } + + return result; +} + +static const mach_header * +lt__match_loadedlib (const char *name) +{ + const mach_header *mh = 0; + int i = _dyld_image_count(); + + while (i > 0) + { + const char *id; + + --i; + id = lt__header_get_instnam (_dyld_get_image_header (i)); + if (id && strneq (id, name)) + { + mh = _dyld_get_image_header (i); + break; + } + } + + return mh; +} + +/* Safe to assume our mh is good. */ +static NSSymbol +lt__linkedlib_symbol (const char *symname, const mach_header *mh) +{ + NSSymbol symbol = 0; + + if (lt__image_symbol && NSIsSymbolNameDefined (symname)) + { + unsigned long offset = sizeof(mach_header); + struct load_command *lc; + int j; + + for (j = 0; j < mh->ncmds; j++) + { + lc = (struct load_command*) (((unsigned long) mh) + offset); + if ((LC_LOAD_DYLIB == lc->cmd) || (LC_LOAD_WEAK_DYLIB == lc->cmd)) + { + unsigned long base = ((dylib_command *) lc)->dylib.name.offset; + char *name = (char *) (base + (unsigned long) lc); + const mach_header *mh1 = lt__match_loadedlib (name); + + if (!mh1) + { + /* Maybe NSAddImage can find it */ + mh1 = lt__addimage (name, + NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED + | NSADDIMAGE_OPTION_WITH_SEARCHING + | NSADDIMAGE_OPTION_RETURN_ON_ERROR); + } + + if (mh1) + { + symbol = lt__image_symbol (mh1, symname, LT__SYMLOOKUP_OPTS); + if (symbol) + break; + } + } + + offset += lc->cmdsize; + } + } + + return symbol; +} diff --git a/libltdl/loaders/load_add_on.c b/libltdl/loaders/load_add_on.c new file mode 100644 index 0000000..b070906 --- /dev/null +++ b/libltdl/loaders/load_add_on.c @@ -0,0 +1,167 @@ +/* loader-load_add_on.c -- dynamic linking for BeOS + + Copyright (C) 1998-2000, 2004, 2006-2008, 2011-2015 Free Software + Foundation, Inc. + Written by Thomas Tanner, 1998 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "lt__private.h" +#include "lt_dlloader.h" + +/* Use the preprocessor to rename non-static symbols to avoid namespace + collisions when the loader code is statically linked into libltdl. + Use the "_LTX_" prefix so that the symbol addresses can + be fetched from the preloaded symbol list by lt_dlsym(): */ +#define get_vtable load_add_on_LTX_get_vtable + +LT_BEGIN_C_DECLS +LT_SCOPE lt_dlvtable *get_vtable (lt_user_data loader_data); +LT_END_C_DECLS + + +/* Boilerplate code to set up the vtable for hooking this loader into + libltdl's loader list: */ +static int vl_exit (lt_user_data loader_data); +static lt_module vm_open (lt_user_data loader_data, const char *filename, + lt_dladvise advise); +static int vm_close (lt_user_data loader_data, lt_module module); +static void * vm_sym (lt_user_data loader_data, lt_module module, + const char *symbolname); + +static lt_dlvtable *vtable = 0; + +/* Return the vtable for this loader, only the name and sym_prefix + attributes (plus the virtual function implementations, obviously) + change between loaders. */ +lt_dlvtable * +get_vtable (lt_user_data loader_data) +{ + if (!vtable) + { + vtable = lt__zalloc (sizeof *vtable); + } + + if (vtable && !vtable->name) + { + vtable->name = "lt_load_add_on"; + vtable->module_open = vm_open; + vtable->module_close = vm_close; + vtable->find_sym = vm_sym; + vtable->dlloader_exit = vl_exit; + vtable->dlloader_data = loader_data; + vtable->priority = LT_DLLOADER_APPEND; + } + + if (vtable && (vtable->dlloader_data != loader_data)) + { + LT__SETERROR (INIT_LOADER); + return 0; + } + + return vtable; +} + + + +/* --- IMPLEMENTATION --- */ + + +#include + +/* A function called through the vtable when this loader is no + longer needed by the application. */ +static int +vl_exit (lt_user_data loader_data LT__UNUSED) +{ + vtable = NULL; + return 0; +} + +/* A function called through the vtable to open a module with this + loader. Returns an opaque representation of the newly opened + module for processing with this loader's other vtable functions. */ +static lt_module +vm_open (lt_user_data loader_data LT__UNUSED, const char *filename, + lt_dladvise advise LT__UNUSED) +{ + image_id image = 0; + + if (filename) + { + image = load_add_on (filename); + } + else + { + image_info info; + int32 cookie = 0; + if (get_next_image_info (0, &cookie, &info) == B_OK) + image = load_add_on (info.name); + } + + if (image <= 0) + { + LT__SETERROR (CANNOT_OPEN); + image = 0; + } + + return (lt_module) image; +} + + +/* A function called through the vtable when a particular module + should be unloaded. */ +static int +vm_close (lt_user_data loader_data LT__UNUSED, lt_module module) +{ + int errors = 0; + + if (unload_add_on ((image_id) module) != B_OK) + { + LT__SETERROR (CANNOT_CLOSE); + ++errors; + } + + return errors; +} + + +/* A function called through the vtable to get the address of + a symbol loaded from a particular module. */ +static void * +vm_sym (lt_user_data loader_data LT__UNUSED, lt_module module, const char *name) +{ + void *address = 0; + image_id image = (image_id) module; + + if (get_image_symbol (image, name, B_SYMBOL_TYPE_ANY, address) != B_OK) + { + LT__SETERROR (SYMBOL_NOT_FOUND); + address = 0; + } + + return address; +} diff --git a/libltdl/loaders/loadlibrary.c b/libltdl/loaders/loadlibrary.c new file mode 100644 index 0000000..0891f6d --- /dev/null +++ b/libltdl/loaders/loadlibrary.c @@ -0,0 +1,369 @@ +/* loader-loadlibrary.c -- dynamic linking for Win32 + + Copyright (C) 1998-2000, 2004-2008, 2010-2015 Free Software + Foundation, Inc. + Written by Thomas Tanner, 1998 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "lt__private.h" +#include "lt_dlloader.h" + +#if defined __CYGWIN__ +# include +#endif + +/* Use the preprocessor to rename non-static symbols to avoid namespace + collisions when the loader code is statically linked into libltdl. + Use the "_LTX_" prefix so that the symbol addresses can + be fetched from the preloaded symbol list by lt_dlsym(): */ +#define get_vtable loadlibrary_LTX_get_vtable + +LT_BEGIN_C_DECLS +LT_SCOPE lt_dlvtable *get_vtable (lt_user_data loader_data); +LT_END_C_DECLS + + +/* Boilerplate code to set up the vtable for hooking this loader into + libltdl's loader list: */ +static int vl_exit (lt_user_data loader_data); +static lt_module vm_open (lt_user_data loader_data, const char *filename, + lt_dladvise advise); +static int vm_close (lt_user_data loader_data, lt_module module); +static void * vm_sym (lt_user_data loader_data, lt_module module, + const char *symbolname); + +static lt_dlinterface_id iface_id = 0; +static lt_dlvtable *vtable = 0; + +/* Return the vtable for this loader, only the name and sym_prefix + attributes (plus the virtual function implementations, obviously) + change between loaders. */ +lt_dlvtable * +get_vtable (lt_user_data loader_data) +{ + if (!vtable) + { + vtable = (lt_dlvtable *) lt__zalloc (sizeof *vtable); + iface_id = lt_dlinterface_register ("ltdl loadlibrary", NULL); + } + + if (vtable && !vtable->name) + { + vtable->name = "lt_loadlibrary"; + vtable->module_open = vm_open; + vtable->module_close = vm_close; + vtable->find_sym = vm_sym; + vtable->dlloader_exit = vl_exit; + vtable->dlloader_data = loader_data; + vtable->priority = LT_DLLOADER_APPEND; + } + + if (vtable && (vtable->dlloader_data != loader_data)) + { + LT__SETERROR (INIT_LOADER); + return 0; + } + + return vtable; +} + + + +/* --- IMPLEMENTATION --- */ + + +#include + +#define LOCALFREE(mem) LT_STMT_START { \ + if (mem) { LocalFree ((void *)mem); mem = NULL; } } LT_STMT_END +#define LOADLIB__SETERROR(errmsg) LT__SETERRORSTR (loadlibraryerror (errmsg)) +#define LOADLIB_SETERROR(errcode) LOADLIB__SETERROR (LT__STRERROR (errcode)) + +static const char *loadlibraryerror (const char *default_errmsg); +static DWORD WINAPI wrap_getthreaderrormode (void); +static DWORD WINAPI fallback_getthreaderrormode (void); +static BOOL WINAPI wrap_setthreaderrormode (DWORD mode, DWORD *oldmode); +static BOOL WINAPI fallback_setthreaderrormode (DWORD mode, DWORD *oldmode); + +typedef DWORD (WINAPI getthreaderrormode_type) (void); +typedef BOOL (WINAPI setthreaderrormode_type) (DWORD, DWORD *); + +static getthreaderrormode_type *getthreaderrormode = wrap_getthreaderrormode; +static setthreaderrormode_type *setthreaderrormode = wrap_setthreaderrormode; +static char *error_message = 0; + + +/* A function called through the vtable when this loader is no + longer needed by the application. */ +static int +vl_exit (lt_user_data loader_data LT__UNUSED) +{ + vtable = NULL; + LOCALFREE (error_message); + return 0; +} + +/* A function called through the vtable to open a module with this + loader. Returns an opaque representation of the newly opened + module for processing with this loader's other vtable functions. */ +static lt_module +vm_open (lt_user_data loader_data LT__UNUSED, const char *filename, + lt_dladvise advise LT__UNUSED) +{ + lt_module module = 0; + char *ext; + char wpath[MAX_PATH]; + size_t len; + + if (!filename) + { + /* Get the name of main module */ + *wpath = 0; + GetModuleFileName (NULL, wpath, sizeof (wpath)); + filename = wpath; + } + else + { + len = LT_STRLEN (filename); + + if (len >= MAX_PATH) + { + LT__SETERROR (CANNOT_OPEN); + return 0; + } + +#if HAVE_DECL_CYGWIN_CONV_PATH + if (cygwin_conv_path (CCP_POSIX_TO_WIN_A, filename, wpath, MAX_PATH)) + { + LT__SETERROR (CANNOT_OPEN); + return 0; + } + len = 0; +#elif defined __CYGWIN__ + cygwin_conv_to_full_win32_path (filename, wpath); + len = 0; +#else + strcpy(wpath, filename); +#endif + + ext = strrchr (wpath, '.'); + if (!ext) + { + /* Append a '.' to stop Windows from adding an + implicit '.dll' extension. */ + if (!len) + len = strlen (wpath); + + if (len + 1 >= MAX_PATH) + { + LT__SETERROR (CANNOT_OPEN); + return 0; + } + + wpath[len] = '.'; + wpath[len+1] = '\0'; + } + } + + { + /* Silence dialog from LoadLibrary on some failures. */ + DWORD errormode = getthreaderrormode (); + DWORD last_error; + + setthreaderrormode (errormode | SEM_FAILCRITICALERRORS, NULL); + + module = LoadLibrary (wpath); + + /* Restore the error mode. */ + last_error = GetLastError (); + setthreaderrormode (errormode, NULL); + SetLastError (last_error); + } + + /* libltdl expects this function to fail if it is unable + to physically load the library. Sadly, LoadLibrary + will search the loaded libraries for a match and return + one of them if the path search load fails. + + We check whether LoadLibrary is returning a handle to + an already loaded module, and simulate failure if we + find one. */ + { + lt_dlhandle cur = 0; + + while ((cur = lt_dlhandle_iterate (iface_id, cur))) + { + if (!cur->module) + { + cur = 0; + break; + } + + if (cur->module == module) + { + break; + } + } + + if (!module) + LOADLIB_SETERROR (CANNOT_OPEN); + else if (cur) + { + LT__SETERROR (CANNOT_OPEN); + module = 0; + } + } + + return module; +} + + +/* A function called through the vtable when a particular module + should be unloaded. */ +static int +vm_close (lt_user_data loader_data LT__UNUSED, lt_module module) +{ + int errors = 0; + + if (FreeLibrary ((HMODULE) module) == 0) + { + LOADLIB_SETERROR (CANNOT_CLOSE); + ++errors; + } + + return errors; +} + + +/* A function called through the vtable to get the address of + a symbol loaded from a particular module. */ +static void * +vm_sym (lt_user_data loader_data LT__UNUSED, lt_module module, const char *name) +{ + void *address = (void *) GetProcAddress ((HMODULE) module, name); + + if (!address) + { + LOADLIB_SETERROR (SYMBOL_NOT_FOUND); + } + + return address; +} + + + +/* --- HELPER FUNCTIONS --- */ + + +/* Return the windows error message, or the passed in error message on + failure. */ +static const char * +loadlibraryerror (const char *default_errmsg) +{ + size_t len; + LOCALFREE (error_message); + + FormatMessageA (FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError (), + 0, + (char *) &error_message, + 0, NULL); + + /* Remove trailing CRNL */ + len = LT_STRLEN (error_message); + if (len && error_message[len - 1] == '\n') + error_message[--len] = LT_EOS_CHAR; + if (len && error_message[len - 1] == '\r') + error_message[--len] = LT_EOS_CHAR; + + return len ? error_message : default_errmsg; +} + +/* A function called through the getthreaderrormode variable that checks + if the system supports GetThreadErrorMode (or GetErrorMode) and arranges + for it or a fallback implementation to be called directly in the future. + The selected version is then called. */ +static DWORD WINAPI +wrap_getthreaderrormode (void) +{ + HMODULE kernel32 = GetModuleHandleA ("kernel32.dll"); + getthreaderrormode + = (getthreaderrormode_type *) GetProcAddress (kernel32, + "GetThreadErrorMode"); + if (!getthreaderrormode) + getthreaderrormode + = (getthreaderrormode_type *) GetProcAddress (kernel32, + "GetErrorMode"); + if (!getthreaderrormode) + getthreaderrormode = fallback_getthreaderrormode; + return getthreaderrormode (); +} + +/* A function called through the getthreaderrormode variable for cases + where the system does not support GetThreadErrorMode or GetErrorMode */ +static DWORD WINAPI +fallback_getthreaderrormode (void) +{ + /* Prior to Windows Vista, the only way to get the current error + mode was to set a new one. In our case, we are setting a new + error mode right after "getting" it while ignoring the error + mode in effect when setting the new error mode, so that's + fairly ok. */ + return (DWORD) SetErrorMode (SEM_FAILCRITICALERRORS); +} + +/* A function called through the setthreaderrormode variable that checks + if the system supports SetThreadErrorMode and arranges for it or a + fallback implementation to be called directly in the future. + The selected version is then called. */ +static BOOL WINAPI +wrap_setthreaderrormode (DWORD mode, DWORD *oldmode) +{ + HMODULE kernel32 = GetModuleHandleA ("kernel32.dll"); + setthreaderrormode + = (setthreaderrormode_type *) GetProcAddress (kernel32, + "SetThreadErrorMode"); + if (!setthreaderrormode) + setthreaderrormode = fallback_setthreaderrormode; + return setthreaderrormode (mode, oldmode); +} + +/* A function called through the setthreaderrormode variable for cases + where the system does not support SetThreadErrorMode. */ +static BOOL WINAPI +fallback_setthreaderrormode (DWORD mode, DWORD *oldmode) +{ + /* Prior to Windows 7, there was no way to set the thread local error + mode, so set the process global error mode instead. */ + DWORD old = (DWORD) SetErrorMode (mode); + if (oldmode) + *oldmode = old; + return TRUE; +} diff --git a/libltdl/loaders/preopen.c b/libltdl/loaders/preopen.c new file mode 100644 index 0000000..139e373 --- /dev/null +++ b/libltdl/loaders/preopen.c @@ -0,0 +1,387 @@ +/* loader-preopen.c -- emulate dynamic linking using preloaded_symbols + + Copyright (C) 1998-2000, 2004, 2006-2008, 2011-2015 Free Software + Foundation, Inc. + Written by Thomas Tanner, 1998 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "lt__private.h" +#include "lt_dlloader.h" + +/* Use the preprocessor to rename non-static symbols to avoid namespace + collisions when the loader code is statically linked into libltdl. + Use the "_LTX_" prefix so that the symbol addresses can + be fetched from the preloaded symbol list by lt_dlsym(): */ +#define get_vtable preopen_LTX_get_vtable + +LT_BEGIN_C_DECLS +LT_SCOPE lt_dlvtable *get_vtable (lt_user_data loader_data); +LT_END_C_DECLS + + +/* Boilerplate code to set up the vtable for hooking this loader into + libltdl's loader list: */ +static int vl_init (lt_user_data loader_data); +static int vl_exit (lt_user_data loader_data); +static lt_module vm_open (lt_user_data loader_data, const char *filename, + lt_dladvise advise); +static int vm_close (lt_user_data loader_data, lt_module module); +static void * vm_sym (lt_user_data loader_data, lt_module module, + const char *symbolname); + +static lt_dlvtable *vtable = 0; + +/* Return the vtable for this loader, only the name and sym_prefix + attributes (plus the virtual function implementations, obviously) + change between loaders. */ +lt_dlvtable * +get_vtable (lt_user_data loader_data) +{ + if (!vtable) + { + vtable = (lt_dlvtable *) lt__zalloc (sizeof *vtable); + } + + if (vtable && !vtable->name) + { + vtable->name = "lt_preopen"; + vtable->sym_prefix = 0; + vtable->module_open = vm_open; + vtable->module_close = vm_close; + vtable->find_sym = vm_sym; + vtable->dlloader_init = vl_init; + vtable->dlloader_exit = vl_exit; + vtable->dlloader_data = loader_data; + vtable->priority = LT_DLLOADER_PREPEND; + } + + if (vtable && (vtable->dlloader_data != loader_data)) + { + LT__SETERROR (INIT_LOADER); + return 0; + } + + return vtable; +} + + + +/* --- IMPLEMENTATION --- */ + + +/* Wrapper type to chain together symbol lists of various origins. */ +typedef struct symlist_chain +{ + struct symlist_chain *next; + const lt_dlsymlist *symlist; +} symlist_chain; + + +static int add_symlist (const lt_dlsymlist *symlist); +static int free_symlists (void); + +/* The start of the symbol lists chain. */ +static symlist_chain *preloaded_symlists = 0; + +/* A symbol list preloaded before lt_init() was called. */ +static const lt_dlsymlist *default_preloaded_symbols = 0; + + +/* A function called through the vtable to initialise this loader. */ +static int +vl_init (lt_user_data loader_data LT__UNUSED) +{ + int errors = 0; + + preloaded_symlists = 0; + if (default_preloaded_symbols) + { + errors = lt_dlpreload (default_preloaded_symbols); + } + + return errors; +} + + +/* A function called through the vtable when this loader is no + longer needed by the application. */ +static int +vl_exit (lt_user_data loader_data LT__UNUSED) +{ + vtable = NULL; + free_symlists (); + return 0; +} + + +/* A function called through the vtable to open a module with this + loader. Returns an opaque representation of the newly opened + module for processing with this loader's other vtable functions. */ +static lt_module +vm_open (lt_user_data loader_data LT__UNUSED, const char *filename, + lt_dladvise advise LT__UNUSED) +{ + symlist_chain *lists; + lt_module module = 0; + + if (!preloaded_symlists) + { + LT__SETERROR (NO_SYMBOLS); + goto done; + } + + /* Can't use NULL as the reflective symbol header, as NULL is + used to mark the end of the entire symbol list. Self-dlpreopened + symbols follow this magic number, chosen to be an unlikely + clash with a real module name. */ + if (!filename) + { + filename = "@PROGRAM@"; + } + + for (lists = preloaded_symlists; lists; lists = lists->next) + { + const lt_dlsymlist *symbol; + for (symbol= lists->symlist; symbol->name; ++symbol) + { + if (!symbol->address && STREQ (symbol->name, filename)) + { + /* If the next symbol's name and address is 0, it means + the module just contains the originator and no symbols. + In this case we pretend that we never saw the module and + hope that some other loader will be able to load the module + and have access to its symbols */ + const lt_dlsymlist *next_symbol = symbol +1; + if (next_symbol->address && next_symbol->name) + { + module = (lt_module) lists->symlist; + goto done; + } + } + } + } + + LT__SETERROR (FILE_NOT_FOUND); + + done: + return module; +} + + +/* A function called through the vtable when a particular module + should be unloaded. */ +static int +vm_close (lt_user_data loader_data LT__UNUSED, lt_module module LT__UNUSED) +{ + /* Just to silence gcc -Wall */ + module = 0; + return 0; +} + + +/* A function called through the vtable to get the address of + a symbol loaded from a particular module. */ +static void * +vm_sym (lt_user_data loader_data LT__UNUSED, lt_module module, const char *name) +{ + lt_dlsymlist *symbol = (lt_dlsymlist*) module; + + if (symbol[1].name && STREQ (symbol[1].name, "@INIT@")) + { + symbol++; /* Skip optional init entry. */ + } + + symbol +=2; /* Skip header (originator then libname). */ + + while (symbol->name) + { + if (STREQ (symbol->name, name)) + { + return symbol->address; + } + + ++symbol; + } + + LT__SETERROR (SYMBOL_NOT_FOUND); + + return 0; +} + + + +/* --- HELPER FUNCTIONS --- */ + + +/* The symbol lists themselves are not allocated from the heap, but + we can unhook them and free up the chain of links between them. */ +static int +free_symlists (void) +{ + symlist_chain *lists; + + lists = preloaded_symlists; + while (lists) + { + symlist_chain *next = lists->next; + FREE (lists); + lists = next; + } + preloaded_symlists = 0; + + return 0; +} + +/* Add a new symbol list to the global chain. */ +static int +add_symlist (const lt_dlsymlist *symlist) +{ + symlist_chain *lists; + int errors = 0; + + /* Search for duplicate entries: */ + for (lists = preloaded_symlists; + lists && lists->symlist != symlist; lists = lists->next) + /*NOWORK*/; + + /* Don't add the same list twice: */ + if (!lists) + { + symlist_chain *tmp = (symlist_chain *) lt__zalloc (sizeof *tmp); + + if (tmp) + { + tmp->symlist = symlist; + tmp->next = preloaded_symlists; + preloaded_symlists = tmp; + + if (symlist[1].name && STREQ (symlist[1].name, "@INIT@")) + { + void (*init_symlist)(void); + *(void **)(&init_symlist) = symlist[1].address; + (*init_symlist)(); + } + } + else + { + ++errors; + } + } + + return errors; +} + + + +/* --- PRELOADING API CALL IMPLEMENTATIONS --- */ + + +/* Save a default symbol list for later. */ +int +lt_dlpreload_default (const lt_dlsymlist *preloaded) +{ + default_preloaded_symbols = preloaded; + return 0; +} + + +/* Add a symbol list to the global chain, or with a NULL argument, + revert to just the default list. */ +int +lt_dlpreload (const lt_dlsymlist *preloaded) +{ + int errors = 0; + + if (preloaded) + { + errors = add_symlist (preloaded); + } + else + { + free_symlists(); + + if (default_preloaded_symbols) + { + errors = lt_dlpreload (default_preloaded_symbols); + } + } + + return errors; +} + + +/* Open all the preloaded modules from the named originator, executing + a callback for each one. If ORIGINATOR is NULL, then call FUNC for + each preloaded module from the program itself. */ +int +lt_dlpreload_open (const char *originator, lt_dlpreload_callback_func *func) +{ + symlist_chain *list; + int errors = 0; + int found = 0; + + /* For each symlist in the chain... */ + for (list = preloaded_symlists; list; list = list->next) + { + /* ...that was preloaded by the requesting ORIGINATOR... */ + if ((originator && STREQ (list->symlist->name, originator)) + || (!originator && STREQ (list->symlist->name, "@PROGRAM@"))) + { + const lt_dlsymlist *symbol; + unsigned int idx = 0; + + ++found; + + /* ...load the symbols per source compilation unit: + (we preincrement the index to skip over the originator entry) */ + while ((symbol = &list->symlist[++idx])->name != 0) + { + if ((symbol->address == 0) + && (STRNEQ (symbol->name, "@PROGRAM@"))) + { + lt_dlhandle handle = lt_dlopen (symbol->name); + if (handle == 0) + { + ++errors; + } + else + { + errors += (*func) (handle); + } + } + } + } + } + + if (!found) + { + LT__SETERROR(CANNOT_OPEN); + ++errors; + } + + return errors; +} diff --git a/libltdl/loaders/shl_load.c b/libltdl/loaders/shl_load.c new file mode 100644 index 0000000..960386b --- /dev/null +++ b/libltdl/loaders/shl_load.c @@ -0,0 +1,222 @@ +/* loader-shl_load.c -- dynamic linking with shl_load (HP-UX) + + Copyright (C) 1998-2000, 2004, 2006-2008, 2011-2015 Free Software + Foundation, Inc. + Written by Thomas Tanner, 1998 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "lt__private.h" +#include "lt_dlloader.h" + +/* Use the preprocessor to rename non-static symbols to avoid namespace + collisions when the loader code is statically linked into libltdl. + Use the "_LTX_" prefix so that the symbol addresses can + be fetched from the preloaded symbol list by lt_dlsym(): */ +#define get_vtable shl_load_LTX_get_vtable + +LT_BEGIN_C_DECLS +LT_SCOPE lt_dlvtable *get_vtable (lt_user_data loader_data); +LT_END_C_DECLS + + +/* Boilerplate code to set up the vtable for hooking this loader into + libltdl's loader list: */ +static int vl_exit (lt_user_data loader_data); +static lt_module vm_open (lt_user_data loader_data, const char *filename, + lt_dladvise advise); +static int vm_close (lt_user_data loader_data, lt_module module); +static void * vm_sym (lt_user_data loader_data, lt_module module, + const char *symbolname); + +static lt_dlvtable *vtable = 0; + +/* Return the vtable for this loader, only the name and sym_prefix + attributes (plus the virtual function implementations, obviously) + change between loaders. */ +lt_dlvtable * +get_vtable (lt_user_data loader_data) +{ + if (!vtable) + { + vtable = lt__zalloc (sizeof *vtable); + } + + if (vtable && !vtable->name) + { + vtable->name = "lt_shl_load"; + vtable->module_open = vm_open; + vtable->module_close = vm_close; + vtable->find_sym = vm_sym; + vtable->dlloader_exit = vl_exit; + vtable->dlloader_data = loader_data; + vtable->priority = LT_DLLOADER_APPEND; + } + + if (vtable && (vtable->dlloader_data != loader_data)) + { + LT__SETERROR (INIT_LOADER); + return 0; + } + + return vtable; +} + + + +/* --- IMPLEMENTATION --- */ + + +#if defined HAVE_DL_H +# include +#endif + +/* some flags are missing on some systems, so we provide + * harmless defaults. + * + * Mandatory: + * BIND_IMMEDIATE - Resolve symbol references when the library is loaded. + * BIND_DEFERRED - Delay code symbol resolution until actual reference. + * + * Optionally: + * BIND_FIRST - Place the library at the head of the symbol search + * order. + * BIND_NONFATAL - The default BIND_IMMEDIATE behavior is to treat all + * unsatisfied symbols as fatal. This flag allows + * binding of unsatisfied code symbols to be deferred + * until use. + * [Perl: For certain libraries, like DCE, deferred + * binding often causes run time problems. Adding + * BIND_NONFATAL to BIND_IMMEDIATE still allows + * unresolved references in situations like this.] + * BIND_NOSTART - Do not call the initializer for the shared library + * when the library is loaded, nor on a future call to + * shl_unload(). + * BIND_VERBOSE - Print verbose messages concerning possible + * unsatisfied symbols. + * + * hp9000s700/hp9000s800: + * BIND_RESTRICTED - Restrict symbols visible by the library to those + * present at library load time. + * DYNAMIC_PATH - Allow the loader to dynamically search for the + * library specified by the path argument. + */ + +#if !defined DYNAMIC_PATH +# define DYNAMIC_PATH 0 +#endif +#if !defined BIND_RESTRICTED +# define BIND_RESTRICTED 0 +#endif + +#define LT_BIND_FLAGS (BIND_IMMEDIATE | BIND_NONFATAL | DYNAMIC_PATH) + + +/* A function called through the vtable when this loader is no + longer needed by the application. */ +static int +vl_exit (lt_user_data loader_data LT__UNUSED) +{ + vtable = NULL; + return 0; +} + +/* A function called through the vtable to open a module with this + loader. Returns an opaque representation of the newly opened + module for processing with this loader's other vtable functions. */ +static lt_module +vm_open (lt_user_data loader_data LT__UNUSED, const char *filename, + lt_dladvise advise LT__UNUSED) +{ + static shl_t self = (shl_t) 0; + lt_module module = shl_load (filename, LT_BIND_FLAGS, 0L); + + /* Since searching for a symbol against a NULL module handle will also + look in everything else that was already loaded and exported with + the -E compiler flag, we always cache a handle saved before any + modules are loaded. */ + if (!self) + { + void *address; + shl_findsym (&self, "main", TYPE_UNDEFINED, &address); + } + + if (!filename) + { + module = self; + } + else + { + module = shl_load (filename, LT_BIND_FLAGS, 0L); + + if (!module) + { + LT__SETERROR (CANNOT_OPEN); + } + } + + return module; +} + +/* A function called through the vtable when a particular module + should be unloaded. */ +static int +vm_close (lt_user_data loader_data LT__UNUSED, lt_module module) +{ + int errors = 0; + + if (module && (shl_unload ((shl_t) (module)) != 0)) + { + LT__SETERROR (CANNOT_CLOSE); + ++errors; + } + + return errors; +} + + +/* A function called through the vtable to get the address of + a symbol loaded from a particular module. */ +static void * +vm_sym (lt_user_data loader_data LT__UNUSED, lt_module module, const char *name) +{ + void *address = 0; + + /* sys_shl_open should never return a NULL module handle */ + if (module == (lt_module) 0) + { + LT__SETERROR (INVALID_HANDLE); + } + else if (!shl_findsym((shl_t*) &module, name, TYPE_UNDEFINED, &address)) + { + if (!address) + { + LT__SETERROR (SYMBOL_NOT_FOUND); + } + } + + return address; +} diff --git a/libltdl/lt__alloc.c b/libltdl/lt__alloc.c new file mode 100644 index 0000000..d24bf8f --- /dev/null +++ b/libltdl/lt__alloc.c @@ -0,0 +1,96 @@ +/* lt__alloc.c -- internal memory management interface + + Copyright (C) 2004, 2006-2007, 2011-2015 Free Software Foundation, + Inc. + Written by Gary V. Vaughan, 2004 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "lt__private.h" + +#include + +#include "lt__alloc.h" + +static void alloc_die_default (void); + +void (*lt__alloc_die) (void) = alloc_die_default; + +/* Unless overridden, exit on memory failure. */ +static void +alloc_die_default (void) +{ + fprintf (stderr, "Out of memory.\n"); + exit (EXIT_FAILURE); +} + +void * +lt__malloc (size_t n) +{ + void *mem; + + if (! (mem = malloc (n))) + (*lt__alloc_die) (); + + return mem; +} + +void * +lt__zalloc (size_t n) +{ + void *mem; + + if ((mem = lt__malloc (n))) + memset (mem, 0, n); + + return mem; +} + +void * +lt__realloc (void *mem, size_t n) +{ + if (! (mem = realloc (mem, n))) + (*lt__alloc_die) (); + + return mem; +} + +void * +lt__memdup (void const *mem, size_t n) +{ + void *newmem; + + if ((newmem = lt__malloc (n))) + return memcpy (newmem, mem, n); + + return 0; +} + +char * +lt__strdup (const char *string) +{ + return (char *) lt__memdup (string, strlen (string) +1); +} diff --git a/libltdl/lt__argz.c b/libltdl/lt__argz.c new file mode 100644 index 0000000..75f7af8 --- /dev/null +++ b/libltdl/lt__argz.c @@ -0,0 +1,225 @@ +/* lt__argz.c -- argz implementation for non-glibc systems + + Copyright (C) 2004, 2006-2008, 2011-2015 Free Software Foundation, + Inc. + Written by Gary V. Vaughan, 2004 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#if defined LTDL && defined LT_CONFIG_H +# include LT_CONFIG_H +#else +# include +#endif + +#include + +#include +#include +#include +#include +#include + +#define EOS_CHAR '\0' + +error_t +argz_append (char **pargz, size_t *pargz_len, const char *buf, size_t buf_len) +{ + size_t argz_len; + char *argz; + + assert (pargz); + assert (pargz_len); + assert ((*pargz && *pargz_len) || (!*pargz && !*pargz_len)); + + /* If nothing needs to be appended, no more work is required. */ + if (buf_len == 0) + return 0; + + /* Ensure there is enough room to append BUF_LEN. */ + argz_len = *pargz_len + buf_len; + argz = (char *) realloc (*pargz, argz_len); + if (!argz) + return ENOMEM; + + /* Copy characters from BUF after terminating '\0' in ARGZ. */ + memcpy (argz + *pargz_len, buf, buf_len); + + /* Assign new values. */ + *pargz = argz; + *pargz_len = argz_len; + + return 0; +} + + +error_t +argz_create_sep (const char *str, int delim, char **pargz, size_t *pargz_len) +{ + size_t argz_len; + char *argz = 0; + + assert (str); + assert (pargz); + assert (pargz_len); + + /* Make a copy of STR, but replacing each occurrence of + DELIM with '\0'. */ + argz_len = 1+ strlen (str); + if (argz_len) + { + const char *p; + char *q; + + argz = (char *) malloc (argz_len); + if (!argz) + return ENOMEM; + + for (p = str, q = argz; *p != EOS_CHAR; ++p) + { + if (*p == delim) + { + /* Ignore leading delimiters, and fold consecutive + delimiters in STR into a single '\0' in ARGZ. */ + if ((q > argz) && (q[-1] != EOS_CHAR)) + *q++ = EOS_CHAR; + else + --argz_len; + } + else + *q++ = *p; + } + /* Copy terminating EOS_CHAR. */ + *q = *p; + } + + /* If ARGZ_LEN has shrunk to nothing, release ARGZ's memory. */ + if (!argz_len) + argz = (free (argz), (char *) 0); + + /* Assign new values. */ + *pargz = argz; + *pargz_len = argz_len; + + return 0; +} + + +error_t +argz_insert (char **pargz, size_t *pargz_len, char *before, const char *entry) +{ + assert (pargz); + assert (pargz_len); + assert (entry && *entry); + + /* No BEFORE address indicates ENTRY should be inserted after the + current last element. */ + if (!before) + return argz_append (pargz, pargz_len, entry, 1+ strlen (entry)); + + /* This probably indicates a programmer error, but to preserve + semantics, scan back to the start of an entry if BEFORE points + into the middle of it. */ + while ((before > *pargz) && (before[-1] != EOS_CHAR)) + --before; + + { + size_t entry_len = 1+ strlen (entry); + size_t argz_len = *pargz_len + entry_len; + size_t offset = before - *pargz; + char *argz = (char *) realloc (*pargz, argz_len); + + if (!argz) + return ENOMEM; + + /* Make BEFORE point to the equivalent offset in ARGZ that it + used to have in *PARGZ incase realloc() moved the block. */ + before = argz + offset; + + /* Move the ARGZ entries starting at BEFORE up into the new + space at the end -- making room to copy ENTRY into the + resulting gap. */ + memmove (before + entry_len, before, *pargz_len - offset); + memcpy (before, entry, entry_len); + + /* Assign new values. */ + *pargz = argz; + *pargz_len = argz_len; + } + + return 0; +} + + +char * +argz_next (char *argz, size_t argz_len, const char *entry) +{ + assert ((argz && argz_len) || (!argz && !argz_len)); + + if (entry) + { + /* Either ARGZ/ARGZ_LEN is empty, or ENTRY points into an address + within the ARGZ vector. */ + assert ((!argz && !argz_len) + || ((argz <= entry) && (entry < (argz + argz_len)))); + + /* Move to the char immediately after the terminating + '\0' of ENTRY. */ + entry = 1+ strchr (entry, EOS_CHAR); + + /* Return either the new ENTRY, or else NULL if ARGZ is + exhausted. */ + return (entry >= argz + argz_len) ? 0 : (char *) entry; + } + else + { + /* This should probably be flagged as a programmer error, + since starting an argz_next loop with the iterator set + to ARGZ is safer. To preserve semantics, handle the NULL + case by returning the start of ARGZ (if any). */ + if (argz_len > 0) + return argz; + else + return 0; + } +} + + +void +argz_stringify (char *argz, size_t argz_len, int sep) +{ + assert ((argz && argz_len) || (!argz && !argz_len)); + + if (sep) + { + --argz_len; /* don't stringify the terminating EOS */ + while (--argz_len > 0) + { + if (argz[argz_len] == EOS_CHAR) + argz[argz_len] = sep; + } + } +} diff --git a/libltdl/lt__dirent.c b/libltdl/lt__dirent.c new file mode 100644 index 0000000..596aa2b --- /dev/null +++ b/libltdl/lt__dirent.c @@ -0,0 +1,106 @@ +/* lt__dirent.c -- internal directory entry scanning interface + + Copyright (C) 2001, 2004, 2011-2015 Free Software Foundation, Inc. + Written by Bob Friesenhahn, 2001 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "lt__private.h" + +#include + +#include "lt__dirent.h" + +#if defined __WINDOWS__ + +void +closedir (DIR *entry) +{ + assert (entry != (DIR *) NULL); + FindClose (entry->hSearch); + free (entry); +} + + +DIR * +opendir (const char *path) +{ + char file_spec[LT_FILENAME_MAX]; + DIR *entry; + + assert (path != (char *) 0); + if (lt_strlcpy (file_spec, path, sizeof file_spec) >= sizeof file_spec + || lt_strlcat (file_spec, "\\", sizeof file_spec) >= sizeof file_spec) + return (DIR *) 0; + entry = (DIR *) malloc (sizeof(DIR)); + if (entry != (DIR *) 0) + { + entry->firsttime = TRUE; + entry->hSearch = FindFirstFile (file_spec, &entry->Win32FindData); + + if (entry->hSearch == INVALID_HANDLE_VALUE) + { + if (lt_strlcat (file_spec, "\\*.*", sizeof file_spec) < sizeof file_spec) + { + entry->hSearch = FindFirstFile (file_spec, &entry->Win32FindData); + } + + if (entry->hSearch == INVALID_HANDLE_VALUE) + { + entry = (free (entry), (DIR *) 0); + } + } + } + + return entry; +} + + +struct dirent * +readdir (DIR *entry) +{ + int status; + + if (entry == (DIR *) 0) + return (struct dirent *) 0; + + if (!entry->firsttime) + { + status = FindNextFile (entry->hSearch, &entry->Win32FindData); + if (status == 0) + return (struct dirent *) 0; + } + + entry->firsttime = FALSE; + if (lt_strlcpy (entry->file_info.d_name, entry->Win32FindData.cFileName, + sizeof entry->file_info.d_name) >= sizeof entry->file_info.d_name) + return (struct dirent *) 0; + entry->file_info.d_namlen = strlen (entry->file_info.d_name); + + return &entry->file_info; +} + +#endif /*defined __WINDOWS__*/ diff --git a/libltdl/lt__strl.c b/libltdl/lt__strl.c new file mode 100644 index 0000000..65be904 --- /dev/null +++ b/libltdl/lt__strl.c @@ -0,0 +1,127 @@ +/* lt__strl.c -- size-bounded string copying and concatenation + + Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. + Written by Bob Friesenhahn, 2004 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include +#include + +#include "lt__strl.h" + +/* + lt_strlcat appends the NULL-terminated string src to the end of dst. + It will append at most dstsize - strlen(dst) - 1 bytes, + NULL-terminating the result. The total length of the string that + would have been created given sufficient buffer size (may be longer + than dstsize) is returned. This function substitutes for strlcat(), + which is available under NetBSD, FreeBSD and Solaris 9. + + Buffer overflow can be checked as follows: + + if (lt_strlcat(dst, src, dstsize) >= dstsize) + return -1; +*/ +#if !defined HAVE_STRLCAT +size_t +lt_strlcat(char *dst, const char *src, const size_t dstsize) +{ + size_t length; + char *p; + const char *q; + + assert(dst != NULL); + assert(src != (const char *) NULL); + assert(dstsize >= 1); + + length=strlen(dst); + + /* + Copy remaining characters from src while constraining length to + size - 1. + */ + for ( p = dst + length, q = src; + (*q != 0) && (length < dstsize - 1); + length++, p++, q++ ) + *p = *q; + + dst[length]='\0'; + + /* + Add remaining length of src to length. + */ + while (*q++) + length++; + + return length; +} +#endif /* !defined HAVE_STRLCAT */ + +/* + lt_strlcpy copies up to dstsize - 1 characters from the NULL-terminated + string src to dst, NULL-terminating the result. The total length of + the string that would have been created given sufficient buffer + size (may be longer than dstsize) is returned. This function + substitutes for strlcpy(), which is available under OpenBSD, FreeBSD + and Solaris 9. + + Buffer overflow can be checked as follows: + + if (lt_strlcpy(dst, src, dstsize) >= dstsize) + return -1; +*/ +#if !defined HAVE_STRLCPY +size_t +lt_strlcpy(char *dst, const char *src, const size_t dstsize) +{ + size_t length=0; + char *p; + const char *q; + + assert(dst != NULL); + assert(src != (const char *) NULL); + assert(dstsize >= 1); + + /* + Copy src to dst within bounds of size-1. + */ + for ( p=dst, q=src, length=0; + (*q != 0) && (length < dstsize-1); + length++, p++, q++ ) + *p = *q; + + dst[length]='\0'; + + /* + Add remaining length of src to length. + */ + while (*q++) + length++; + + return length; +} +#endif /* !defined HAVE_STRLCPY */ diff --git a/libltdl/lt_dlloader.c b/libltdl/lt_dlloader.c new file mode 100644 index 0000000..b81cfa9 --- /dev/null +++ b/libltdl/lt_dlloader.c @@ -0,0 +1,211 @@ +/* lt_dlloader.c -- dynamic library loader interface + + Copyright (C) 2004, 2007-2008, 2011-2015 Free Software Foundation, + Inc. + Written by Gary V. Vaughan, 2004 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "lt__private.h" +#include "lt_dlloader.h" + +#define RETURN_SUCCESS 0 +#define RETURN_FAILURE 1 + +static void * loader_callback (SList *item, void *userdata); + +/* A list of all the dlloaders we know about, each stored as a boxed + SList item: */ +static SList *loaders = 0; + + +/* Return NULL, unless the loader in this ITEM has a matching name, + in which case we return the matching item so that its address is + passed back out (for possible freeing) by slist_remove. */ +static void * +loader_callback (SList *item, void *userdata) +{ + const lt_dlvtable *vtable = (const lt_dlvtable *) item->userdata; + const char * name = (const char *) userdata; + + assert (vtable); + + return STREQ (vtable->name, name) ? (void *) item : NULL; +} + + +/* Hook VTABLE into our global LOADERS list according to its own + PRIORITY field value. */ +int +lt_dlloader_add (const lt_dlvtable *vtable) +{ + SList *item; + + if ((vtable == 0) /* diagnose invalid vtable fields */ + || (vtable->module_open == 0) + || (vtable->module_close == 0) + || (vtable->find_sym == 0) + || ((vtable->priority != LT_DLLOADER_PREPEND) && + (vtable->priority != LT_DLLOADER_APPEND))) + { + LT__SETERROR (INVALID_LOADER); + return RETURN_FAILURE; + } + + item = slist_box (vtable); + if (!item) + { + (*lt__alloc_die) (); + + /* Let the caller know something went wrong if lt__alloc_die + doesn't abort. */ + return RETURN_FAILURE; + } + + if (vtable->priority == LT_DLLOADER_PREPEND) + { + loaders = slist_cons (item, loaders); + } + else + { + assert (vtable->priority == LT_DLLOADER_APPEND); + loaders = slist_concat (loaders, item); + } + + return RETURN_SUCCESS; +} + +#ifdef LT_DEBUG_LOADERS +static void * +loader_dump_callback (SList *item, void *userdata) +{ + const lt_dlvtable *vtable = (const lt_dlvtable *) item->userdata; + fprintf (stderr, ", %s", (vtable && vtable->name) ? vtable->name : "(null)"); + return 0; +} + +void +lt_dlloader_dump (void) +{ + fprintf (stderr, "loaders: "); + if (!loaders) + { + fprintf (stderr, "(empty)"); + } + else + { + const lt_dlvtable *head = (const lt_dlvtable *) loaders->userdata; + fprintf (stderr, "%s", (head && head->name) ? head->name : "(null)"); + if (slist_tail (loaders)) + slist_foreach (slist_tail (loaders), loader_dump_callback, NULL); + } + fprintf (stderr, "\n"); +} +#endif + +/* An iterator for the global loader list: if LOADER is NULL, then + return the first element, otherwise the following element. */ +lt_dlloader +lt_dlloader_next (lt_dlloader loader) +{ + SList *item = (SList *) loader; + return (lt_dlloader) (item ? item->next : loaders); +} + + +/* Non-destructive unboxing of a loader. */ +const lt_dlvtable * +lt_dlloader_get (lt_dlloader loader) +{ + return (const lt_dlvtable *) (loader ? ((SList *) loader)->userdata : NULL); +} + + +/* Return the contents of the first item in the global loader list + with a matching NAME after removing it from that list. If there + was no match, return NULL; if there is an error, return NULL and + set an error for lt_dlerror; do not set an error if only resident + modules need this loader; in either case, the loader list is not + changed if NULL is returned. */ +lt_dlvtable * +lt_dlloader_remove (const char *name) +{ + const lt_dlvtable * vtable = lt_dlloader_find (name); + static const char id_string[] = "lt_dlloader_remove"; + lt_dlinterface_id iface; + lt_dlhandle handle = 0; + int in_use = 0; + int in_use_by_resident = 0; + + if (!vtable) + { + LT__SETERROR (INVALID_LOADER); + return 0; + } + + /* Fail if there are any open modules that use this loader. */ + iface = lt_dlinterface_register (id_string, NULL); + while ((handle = lt_dlhandle_iterate (iface, handle))) + { + lt_dlhandle cur = handle; + if (cur->vtable == vtable) + { + in_use = 1; + if (lt_dlisresident (handle)) + in_use_by_resident = 1; + } + } + lt_dlinterface_free (iface); + if (in_use) + { + if (!in_use_by_resident) + LT__SETERROR (REMOVE_LOADER); + return 0; + } + + /* Call the loader finalisation function. */ + if (vtable && vtable->dlloader_exit) + { + if ((*vtable->dlloader_exit) (vtable->dlloader_data) != 0) + { + /* If there is an exit function, and it returns non-zero + then it must set an error, and we will not remove it + from the list. */ + return 0; + } + } + + /* If we got this far, remove the loader from our global list. */ + return (lt_dlvtable *) + slist_unbox ((SList *) slist_remove (&loaders, loader_callback, (void *) name)); +} + + +const lt_dlvtable * +lt_dlloader_find (const char *name) +{ + return lt_dlloader_get (slist_find (loaders, loader_callback, (void *) name)); +} diff --git a/libltdl/lt_error.c b/libltdl/lt_error.c new file mode 100644 index 0000000..7be92c6 --- /dev/null +++ b/libltdl/lt_error.c @@ -0,0 +1,111 @@ +/* lt_error.c -- error propagation interface + + Copyright (C) 1999-2001, 2004-2005, 2007, 2011-2015 Free Software + Foundation, Inc. + Written by Thomas Tanner, 1999 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "lt__private.h" +#include "lt_error.h" + +static const char *last_error = 0; +static const char error_strings[LT_ERROR_MAX][LT_ERROR_LEN_MAX + 1] = + { +#define LT_ERROR(name, diagnostic) diagnostic, + lt_dlerror_table +#undef LT_ERROR + }; + +static const char **user_error_strings = 0; +static int errorcount = LT_ERROR_MAX; + +int +lt_dladderror (const char *diagnostic) +{ + int errindex = 0; + int result = -1; + const char **temp = (const char **) 0; + + assert (diagnostic); + + errindex = errorcount - LT_ERROR_MAX; + temp = REALLOC (const char *, user_error_strings, 1 + errindex); + if (temp) + { + user_error_strings = temp; + user_error_strings[errindex] = diagnostic; + result = errorcount++; + } + + return result; +} + +int +lt_dlseterror (int errindex) +{ + int errors = 0; + + if (errindex >= errorcount || errindex < 0) + { + /* Ack! Error setting the error message! */ + LT__SETERROR (INVALID_ERRORCODE); + ++errors; + } + else if (errindex < LT_ERROR_MAX) + { + /* No error setting the error message! */ + LT__SETERRORSTR (error_strings[errindex]); + } + else + { + /* No error setting the error message! */ + LT__SETERRORSTR (user_error_strings[errindex - LT_ERROR_MAX]); + } + + return errors; +} + +const char * +lt__error_string (int errorcode) +{ + assert (errorcode >= 0); + assert (errorcode < LT_ERROR_MAX); + + return error_strings[errorcode]; +} + +const char * +lt__get_last_error (void) +{ + return last_error; +} + +const char * +lt__set_last_error (const char *errormsg) +{ + return last_error = errormsg; +} diff --git a/libltdl/ltdl.c b/libltdl/ltdl.c new file mode 100644 index 0000000..6013f2a --- /dev/null +++ b/libltdl/ltdl.c @@ -0,0 +1,2471 @@ +/* ltdl.c -- system independent dlopen wrapper + + Copyright (C) 1998-2000, 2004-2008, 2011-2015 Free Software + Foundation, Inc. + Written by Thomas Tanner, 1998 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "lt__private.h" +#include "lt_system.h" +#include "lt_dlloader.h" + + +/* --- MANIFEST CONSTANTS --- */ + + +/* Standard libltdl search path environment variable name */ +#undef LTDL_SEARCHPATH_VAR +#define LTDL_SEARCHPATH_VAR "LTDL_LIBRARY_PATH" + +/* Standard libtool archive file extension. */ +#undef LT_ARCHIVE_EXT +#define LT_ARCHIVE_EXT ".la" + +/* max. filename length */ +#if !defined LT_FILENAME_MAX +# define LT_FILENAME_MAX 1024 +#endif + +#if !defined LT_LIBEXT +# define LT_LIBEXT "a" +#endif + +#if !defined LT_LIBPREFIX +# define LT_LIBPREFIX "lib" +#endif + +/* This is the maximum symbol size that won't require malloc/free */ +#undef LT_SYMBOL_LENGTH +#define LT_SYMBOL_LENGTH 128 + +/* This accounts for the _LTX_ separator */ +#undef LT_SYMBOL_OVERHEAD +#define LT_SYMBOL_OVERHEAD 5 + +/* Various boolean flags can be stored in the flags field of an + lt_dlhandle... */ +#define LT_DLIS_RESIDENT(handle) ((handle)->info.is_resident) +#define LT_DLIS_SYMGLOBAL(handle) ((handle)->info.is_symglobal) +#define LT_DLIS_SYMLOCAL(handle) ((handle)->info.is_symlocal) + + +static const char objdir[] = LT_OBJDIR; +static const char archive_ext[] = LT_ARCHIVE_EXT; +static const char libext[] = LT_LIBEXT; +static const char libprefix[] = LT_LIBPREFIX; +#if defined LT_MODULE_EXT +static const char shlib_ext[] = LT_MODULE_EXT; +#endif +/* If the loadable module suffix is not the same as the linkable + * shared library suffix, this will be defined. */ +#if defined LT_SHARED_EXT +static const char shared_ext[] = LT_SHARED_EXT; +#endif +#if defined LT_DLSEARCH_PATH +static const char sys_dlsearch_path[] = LT_DLSEARCH_PATH; +#endif + + + + +/* --- DYNAMIC MODULE LOADING --- */ + + +/* The type of a function used at each iteration of foreach_dirinpath(). */ +typedef int foreach_callback_func (char *filename, void *data1, + void *data2); +/* foreachfile_callback itself calls a function of this type: */ +typedef int file_worker_func (const char *filename, void *data); + + +static int foreach_dirinpath (const char *search_path, + const char *base_name, + foreach_callback_func *func, + void *data1, void *data2); +static int find_file_callback (char *filename, void *data1, + void *data2); +static int find_handle_callback (char *filename, void *data, + void *ignored); +static int foreachfile_callback (char *filename, void *data1, + void *data2); + + +static int canonicalize_path (const char *path, char **pcanonical); +static int argzize_path (const char *path, + char **pargz, size_t *pargz_len); +static FILE *find_file (const char *search_path, + const char *base_name, char **pdir); +static lt_dlhandle *find_handle (const char *search_path, + const char *base_name, + lt_dlhandle *handle, + lt_dladvise advise); +static int find_module (lt_dlhandle *handle, const char *dir, + const char *libdir, const char *dlname, + const char *old_name, int installed, + lt_dladvise advise); +static int has_library_ext (const char *filename); +static int load_deplibs (lt_dlhandle handle, char *deplibs); +static int trim (char **dest, const char *str); +static int try_dlopen (lt_dlhandle *handle, + const char *filename, const char *ext, + lt_dladvise advise); +static int tryall_dlopen (lt_dlhandle *handle, + const char *filename, + lt_dladvise padvise, + const lt_dlvtable *vtable); +static int unload_deplibs (lt_dlhandle handle); +static int lt_argz_insert (char **pargz, size_t *pargz_len, + char *before, const char *entry); +static int lt_argz_insertinorder (char **pargz, size_t *pargz_len, + const char *entry); +static int lt_argz_insertdir (char **pargz, size_t *pargz_len, + const char *dirnam, struct dirent *dp); +static int lt_dlpath_insertdir (char **ppath, char *before, + const char *dir); +static int list_files_by_dir (const char *dirnam, + char **pargz, size_t *pargz_len); +static int file_not_found (void); + +#ifdef HAVE_LIBDLLOADER +static int loader_init_callback (lt_dlhandle handle); +#endif /* HAVE_LIBDLLOADER */ + +static int loader_init (lt_get_vtable *vtable_func, + lt_user_data data); + +static char *user_search_path= 0; +static lt_dlhandle handles = 0; +static int initialized = 0; + +/* Our memory failure callback sets the error message to be passed back + up to the client, so we must be careful to return from mallocation + callers if allocation fails (as this callback returns!!). */ +void +lt__alloc_die_callback (void) +{ + LT__SETERROR (NO_MEMORY); +} + +#ifdef HAVE_LIBDLLOADER +/* This function is called to initialise each preloaded module loader, + and hook it into the list of loaders to be used when attempting to + dlopen an application module. */ +static int +loader_init_callback (lt_dlhandle handle) +{ + lt_get_vtable *vtable_func = (lt_get_vtable *) lt_dlsym (handle, "get_vtable"); + return loader_init (vtable_func, 0); +} +#endif /* HAVE_LIBDLLOADER */ + +static int +loader_init (lt_get_vtable *vtable_func, lt_user_data data) +{ + const lt_dlvtable *vtable = 0; + int errors = 0; + + if (vtable_func) + { + vtable = (*vtable_func) (data); + } + + /* lt_dlloader_add will LT__SETERROR if it fails. */ + errors += lt_dlloader_add (vtable); + + assert (errors || vtable); + + if ((!errors) && vtable->dlloader_init) + { + if ((*vtable->dlloader_init) (vtable->dlloader_data)) + { + LT__SETERROR (INIT_LOADER); + ++errors; + } + } + + return errors; +} + +/* Bootstrap the loader loading with the preopening loader. */ +#define get_vtable preopen_LTX_get_vtable +#define preloaded_symbols LT_CONC3(lt_, LTDLOPEN, _LTX_preloaded_symbols) + +LT_BEGIN_C_DECLS +LT_SCOPE const lt_dlvtable * get_vtable (lt_user_data data); +LT_END_C_DECLS +#ifdef HAVE_LIBDLLOADER +extern LT_DLSYM_CONST lt_dlsymlist preloaded_symbols[]; +#endif + +/* Initialize libltdl. */ +int +lt_dlinit (void) +{ + int errors = 0; + + /* Initialize only at first call. */ + if (++initialized == 1) + { + lt__alloc_die = lt__alloc_die_callback; + handles = 0; + user_search_path = 0; /* empty search path */ + + /* First set up the statically loaded preload module loader, so + we can use it to preopen the other loaders we linked in at + compile time. */ + errors += loader_init (get_vtable, 0); + + /* Now open all the preloaded module loaders, so the application + can use _them_ to lt_dlopen its own modules. */ +#ifdef HAVE_LIBDLLOADER + if (!errors) + { + errors += lt_dlpreload (preloaded_symbols); + } + + if (!errors) + { + errors += lt_dlpreload_open (LT_STR(LTDLOPEN), loader_init_callback); + } +#endif /* HAVE_LIBDLLOADER */ + } + +#ifdef LT_DEBUG_LOADERS + lt_dlloader_dump(); +#endif + + return errors; +} + +int +lt_dlexit (void) +{ + /* shut down libltdl */ + lt_dlloader *loader = 0; + lt_dlhandle handle = handles; + int errors = 0; + + if (!initialized) + { + LT__SETERROR (SHUTDOWN); + ++errors; + goto done; + } + + /* shut down only at last call. */ + if (--initialized == 0) + { + int level; + + while (handles && LT_DLIS_RESIDENT (handles)) + { + handles = handles->next; + } + + /* close all modules */ + for (level = 1; handle; ++level) + { + lt_dlhandle cur = handles; + int saw_nonresident = 0; + + while (cur) + { + lt_dlhandle tmp = cur; + cur = cur->next; + if (!LT_DLIS_RESIDENT (tmp)) + { + saw_nonresident = 1; + if (tmp->info.ref_count <= level) + { + if (lt_dlclose (tmp)) + { + ++errors; + } + /* Make sure that the handle pointed to by 'cur' still exists. + lt_dlclose recursively closes dependent libraries, which removes + them from the linked list. One of these might be the one + pointed to by 'cur'. */ + if (cur) + { + for (tmp = handles; tmp; tmp = tmp->next) + if (tmp == cur) + break; + if (! tmp) + cur = handles; + } + } + } + } + /* done if only resident modules are left */ + if (!saw_nonresident) + break; + } + + /* When removing loaders, we can only find out failure by testing + the error string, so avoid a spurious one from an earlier + failed command. */ + if (!errors) + LT__SETERRORSTR (0); + + /* close all loaders */ + for (loader = (lt_dlloader *) lt_dlloader_next (NULL); loader;) + { + lt_dlloader *next = (lt_dlloader *) lt_dlloader_next (loader); + lt_dlvtable *vtable = (lt_dlvtable *) lt_dlloader_get (loader); + + if ((vtable = lt_dlloader_remove ((char *) vtable->name))) + { + FREE (vtable); + } + else + { + /* ignore errors due to resident modules */ + const char *err; + LT__GETERROR (err); + if (err) + ++errors; + } + + loader = next; + } + + FREE(user_search_path); + } + + done: + return errors; +} + + +/* Try VTABLE or, if VTABLE is NULL, all available loaders for FILENAME. + If the library is not successfully loaded, return non-zero. Otherwise, + the dlhandle is stored at the address given in PHANDLE. */ +static int +tryall_dlopen (lt_dlhandle *phandle, const char *filename, + lt_dladvise advise, const lt_dlvtable *vtable) +{ + lt_dlhandle handle = handles; + const char * saved_error = 0; + int errors = 0; + +#ifdef LT_DEBUG_LOADERS + fprintf (stderr, "tryall_dlopen (%s, %s)\n", + filename ? filename : "(null)", + vtable ? vtable->name : "(ALL)"); +#endif + + LT__GETERROR (saved_error); + + /* check whether the module was already opened */ + for (;handle; handle = handle->next) + { + if ((handle->info.filename == filename) /* dlopen self: 0 == 0 */ + || (handle->info.filename && filename + && STREQ (handle->info.filename, filename))) + { + break; + } + } + + if (handle) + { + ++handle->info.ref_count; + *phandle = handle; + goto done; + } + + handle = *phandle; + if (filename) + { + /* Comment out the check of file permissions using access. + This call seems to always return -1 with error EACCES. + */ + /* We need to catch missing file errors early so that + file_not_found() can detect what happened. + if (access (filename, R_OK) != 0) + { + LT__SETERROR (FILE_NOT_FOUND); + ++errors; + goto done; + } */ + + handle->info.filename = lt__strdup (filename); + if (!handle->info.filename) + { + ++errors; + goto done; + } + } + else + { + handle->info.filename = 0; + } + + { + lt_dlloader loader = lt_dlloader_next (0); + const lt_dlvtable *loader_vtable; + + do + { + if (vtable) + loader_vtable = vtable; + else + loader_vtable = lt_dlloader_get (loader); + +#ifdef LT_DEBUG_LOADERS + fprintf (stderr, "Calling %s->module_open (%s)\n", + (loader_vtable && loader_vtable->name) ? loader_vtable->name : "(null)", + filename ? filename : "(null)"); +#endif + handle->module = (*loader_vtable->module_open) (loader_vtable->dlloader_data, + filename, advise); +#ifdef LT_DEBUG_LOADERS + if (!handle->module) { + char *error; + LT__GETERROR(error); + fprintf (stderr, " Result: Failed\n" + " Error message << %s >>\n", + error ? error : "(null)"); + } else { + fprintf (stderr, " Result: Success\n"); + } +#endif + + if (handle->module != 0) + { + if (advise) + { + handle->info.is_resident = advise->is_resident; + handle->info.is_symglobal = advise->is_symglobal; + handle->info.is_symlocal = advise->is_symlocal; + } + break; + } + } + while (!vtable && (loader = lt_dlloader_next (loader))); + + /* If VTABLE was given but couldn't open the module, or VTABLE wasn't + given but we exhausted all loaders without opening the module, bail + out! */ + if ((vtable && !handle->module) + || (!vtable && !loader)) + { + FREE (handle->info.filename); + ++errors; + goto done; + } + + handle->vtable = loader_vtable; + } + + LT__SETERRORSTR (saved_error); + + done: + return errors; +} + + +static int +tryall_dlopen_module (lt_dlhandle *handle, const char *prefix, + const char *dirname, const char *dlname, + lt_dladvise advise) +{ + int error = 0; + char *filename = 0; + size_t filename_len = 0; + size_t dirname_len = LT_STRLEN (dirname); + + assert (handle); + assert (dirname); + assert (dlname); +#if defined LT_DIRSEP_CHAR + /* Only canonicalized names (i.e. with DIRSEP chars already converted) + should make it into this function: */ + assert (strchr (dirname, LT_DIRSEP_CHAR) == 0); +#endif + + if (dirname_len > 0) + if (dirname[dirname_len -1] == '/') + --dirname_len; + filename_len = dirname_len + 1 + LT_STRLEN (dlname); + + /* Allocate memory, and combine DIRNAME and MODULENAME into it. + The PREFIX (if any) is handled below. */ + filename = MALLOC (char, filename_len + 1); + if (!filename) + return 1; + + sprintf (filename, "%.*s/%s", (int) dirname_len, dirname, dlname); + + /* Now that we have combined DIRNAME and MODULENAME, if there is + also a PREFIX to contend with, simply recurse with the arguments + shuffled. Otherwise, attempt to open FILENAME as a module. */ + if (prefix) + { + error += tryall_dlopen_module (handle, (const char *) 0, + prefix, filename, advise); + } + else if (tryall_dlopen (handle, filename, advise, 0) != 0) + { + ++error; + } + + FREE (filename); + return error; +} + +static int +find_module (lt_dlhandle *handle, const char *dir, const char *libdir, + const char *dlname, const char *old_name, int installed, + lt_dladvise advise) +{ + /* Try to open the old library first; if it was dlpreopened, + we want the preopened version of it, even if a dlopenable + module is available. */ + if (old_name && tryall_dlopen (handle, old_name, + advise, lt_dlloader_find ("lt_preopen") ) == 0) + { + return 0; + } + + /* Try to open the dynamic library. */ + if (dlname) + { + /* try to open the installed module */ + if (installed && libdir) + { + if (tryall_dlopen_module (handle, (const char *) 0, + libdir, dlname, advise) == 0) + return 0; + } + + /* try to open the not-installed module */ + if (!installed) + { + if (tryall_dlopen_module (handle, dir, objdir, + dlname, advise) == 0) + return 0; + } + + /* maybe it was moved to another directory */ + { + if (dir && (tryall_dlopen_module (handle, (const char *) 0, + dir, dlname, advise) == 0)) + return 0; + } + } + + return 1; +} + + +static int +canonicalize_path (const char *path, char **pcanonical) +{ + char *canonical = 0; + + assert (path && *path); + assert (pcanonical); + + canonical = MALLOC (char, 1+ LT_STRLEN (path)); + if (!canonical) + return 1; + + { + size_t dest = 0; + size_t src; + for (src = 0; path[src] != LT_EOS_CHAR; ++src) + { + /* Path separators are not copied to the beginning or end of + the destination, or if another separator would follow + immediately. */ + if (path[src] == LT_PATHSEP_CHAR) + { + if ((dest == 0) + || (path[1+ src] == LT_PATHSEP_CHAR) + || (path[1+ src] == LT_EOS_CHAR)) + continue; + } + + /* Anything other than a directory separator is copied verbatim. */ + if ((path[src] != '/') +#if defined LT_DIRSEP_CHAR + && (path[src] != LT_DIRSEP_CHAR) +#endif + ) + { + canonical[dest++] = path[src]; + } + /* Directory separators are converted and copied only if they are + not at the end of a path -- i.e. before a path separator or + NULL terminator. */ + else if ((path[1+ src] != LT_PATHSEP_CHAR) + && (path[1+ src] != LT_EOS_CHAR) +#if defined LT_DIRSEP_CHAR + && (path[1+ src] != LT_DIRSEP_CHAR) +#endif + && (path[1+ src] != '/')) + { + canonical[dest++] = '/'; + } + } + + /* Add an end-of-string marker at the end. */ + canonical[dest] = LT_EOS_CHAR; + } + + /* Assign new value. */ + *pcanonical = canonical; + + return 0; +} + +static int +argzize_path (const char *path, char **pargz, size_t *pargz_len) +{ + error_t error; + + assert (path); + assert (pargz); + assert (pargz_len); + + if ((error = argz_create_sep (path, LT_PATHSEP_CHAR, pargz, pargz_len))) + { + switch (error) + { + case ENOMEM: + LT__SETERROR (NO_MEMORY); + break; + default: + LT__SETERROR (UNKNOWN); + break; + } + + return 1; + } + + return 0; +} + +/* Repeatedly call FUNC with each LT_PATHSEP_CHAR delimited element + of SEARCH_PATH and references to DATA1 and DATA2, until FUNC returns + non-zero or all elements are exhausted. If BASE_NAME is non-NULL, + it is appended to each SEARCH_PATH element before FUNC is called. */ +static int +foreach_dirinpath (const char *search_path, const char *base_name, + foreach_callback_func *func, void *data1, void *data2) +{ + int result = 0; + size_t filenamesize = 0; + size_t lenbase = LT_STRLEN (base_name); + size_t argz_len = 0; + char *argz = 0; + char *filename = 0; + char *canonical = 0; + + if (!search_path || !*search_path) + { + LT__SETERROR (FILE_NOT_FOUND); + goto cleanup; + } + + if (canonicalize_path (search_path, &canonical) != 0) + goto cleanup; + + if (argzize_path (canonical, &argz, &argz_len) != 0) + goto cleanup; + + { + char *dir_name = 0; + while ((dir_name = argz_next (argz, argz_len, dir_name))) + { + size_t lendir = LT_STRLEN (dir_name); + + if (1+ lendir + lenbase >= filenamesize) + { + FREE (filename); + filenamesize = 1+ lendir + 1+ lenbase; /* "/d" + '/' + "f" + '\0' */ + filename = MALLOC (char, filenamesize); + if (!filename) + goto cleanup; + } + + assert (filenamesize > lendir); + strcpy (filename, dir_name); + + if (base_name && *base_name) + { + if (filename[lendir -1] != '/') + filename[lendir++] = '/'; + strcpy (filename +lendir, base_name); + } + + if ((result = (*func) (filename, data1, data2))) + { + break; + } + } + } + + cleanup: + FREE (argz); + FREE (canonical); + FREE (filename); + + return result; +} + +/* If FILEPATH can be opened, store the name of the directory component + in DATA1, and the opened FILE* structure address in DATA2. Otherwise + DATA1 is unchanged, but DATA2 is set to a pointer to NULL. */ +static int +find_file_callback (char *filename, void *data1, void *data2) +{ + char **pdir = (char **) data1; + FILE **pfile = (FILE **) data2; + int is_done = 0; + + assert (filename && *filename); + assert (pdir); + assert (pfile); + + if ((*pfile = fopen (filename, LT_READTEXT_MODE))) + { + char *dirend = strrchr (filename, '/'); + + if (dirend > filename) + *dirend = LT_EOS_CHAR; + + FREE (*pdir); + *pdir = lt__strdup (filename); + is_done = (*pdir == 0) ? -1 : 1; + } + + return is_done; +} + +static FILE * +find_file (const char *search_path, const char *base_name, char **pdir) +{ + FILE *file = 0; + + foreach_dirinpath (search_path, base_name, find_file_callback, pdir, &file); + + return file; +} + +static int +find_handle_callback (char *filename, void *data, void *data2) +{ + lt_dlhandle *phandle = (lt_dlhandle *) data; + int notfound = access (filename, R_OK); + lt_dladvise advise = (lt_dladvise) data2; + + /* Bail out if file cannot be read... */ + if (notfound) + return 0; + + /* Try to dlopen the file, but do not continue searching in any + case. */ + if (tryall_dlopen (phandle, filename, advise, 0) != 0) + *phandle = 0; + + return 1; +} + +/* If HANDLE was found return it, otherwise return 0. If HANDLE was + found but could not be opened, *HANDLE will be set to 0. */ +static lt_dlhandle * +find_handle (const char *search_path, const char *base_name, + lt_dlhandle *phandle, lt_dladvise advise) +{ + if (!search_path) + return 0; + + if (!foreach_dirinpath (search_path, base_name, find_handle_callback, + phandle, advise)) + return 0; + + return phandle; +} + +#if !defined LTDL_DLOPEN_DEPLIBS +static int +load_deplibs (lt_dlhandle handle, char * deplibs LT__UNUSED) +{ + handle->depcount = 0; + return 0; +} + +#else /* defined LTDL_DLOPEN_DEPLIBS */ +static int +load_deplibs (lt_dlhandle handle, char *deplibs) +{ + char *p, *save_search_path = 0; + int depcount = 0; + int i; + char **names = 0; + int errors = 0; + + handle->depcount = 0; + + if (!deplibs) + { + return errors; + } + ++errors; + + if (user_search_path) + { + save_search_path = lt__strdup (user_search_path); + if (!save_search_path) + goto cleanup; + } + + /* extract search paths and count deplibs */ + p = deplibs; + while (*p) + { + if (!isspace ((unsigned char) *p)) + { + char *end = p+1; + while (*end && !isspace((unsigned char) *end)) + { + ++end; + } + + if (strncmp(p, "-L", 2) == 0 || strncmp(p, "-R", 2) == 0) + { + char save = *end; + *end = 0; /* set a temporary string terminator */ + if (lt_dladdsearchdir(p+2)) + { + goto cleanup; + } + *end = save; + } + else + { + ++depcount; + } + + p = end; + } + else + { + ++p; + } + } + + + if (!depcount) + { + errors = 0; + goto cleanup; + } + + names = MALLOC (char *, depcount); + if (!names) + goto cleanup; + + /* now only extract the actual deplibs */ + depcount = 0; + p = deplibs; + while (*p) + { + if (isspace ((unsigned char) *p)) + { + ++p; + } + else + { + char *end = p+1; + while (*end && !isspace ((unsigned char) *end)) + { + ++end; + } + + if (strncmp(p, "-L", 2) != 0 && strncmp(p, "-R", 2) != 0) + { + char *name; + char save = *end; + *end = 0; /* set a temporary string terminator */ + if (strncmp(p, "-l", 2) == 0) + { + size_t name_len = 3+ /* "lib" */ LT_STRLEN (p + 2); + name = MALLOC (char, 1+ name_len); + if (name) + sprintf (name, "lib%s", p+2); + } + else + name = lt__strdup(p); + + if (!name) + goto cleanup_names; + + names[depcount++] = name; + *end = save; + } + p = end; + } + } + + /* load the deplibs (in reverse order) + At this stage, don't worry if the deplibs do not load correctly, + they may already be statically linked into the loading application + for instance. There will be a more enlightening error message + later on if the loaded module cannot resolve all of its symbols. */ + if (depcount) + { + lt_dlhandle cur = handle; + int j = 0; + + cur->deplibs = MALLOC (lt_dlhandle, depcount); + if (!cur->deplibs) + goto cleanup_names; + + for (i = 0; i < depcount; ++i) + { + cur->deplibs[j] = lt_dlopenext(names[depcount-1-i]); + if (cur->deplibs[j]) + { + ++j; + } + } + + cur->depcount = j; /* Number of successfully loaded deplibs */ + errors = 0; + } + + cleanup_names: + for (i = 0; i < depcount; ++i) + { + FREE (names[i]); + } + + cleanup: + FREE (names); + /* restore the old search path */ + if (save_search_path) { + MEMREASSIGN (user_search_path, save_search_path); + } + + return errors; +} +#endif /* defined LTDL_DLOPEN_DEPLIBS */ + +static int +unload_deplibs (lt_dlhandle handle) +{ + int i; + int errors = 0; + lt_dlhandle cur = handle; + + if (cur->depcount) + { + for (i = 0; i < cur->depcount; ++i) + { + if (!LT_DLIS_RESIDENT (cur->deplibs[i])) + { + errors += lt_dlclose (cur->deplibs[i]); + } + } + FREE (cur->deplibs); + } + + return errors; +} + +static int +trim (char **dest, const char *str) +{ + /* remove the leading and trailing "'" from str + and store the result in dest */ + const char *end = strrchr (str, '\''); + size_t len = LT_STRLEN (str); + char *tmp; + + FREE (*dest); + + if (!end || end == str) + return 1; + + if (len > 3 && str[0] == '\'') + { + tmp = MALLOC (char, end - str); + if (!tmp) + return 1; + + memcpy(tmp, &str[1], (end - str) - 1); + tmp[(end - str) - 1] = LT_EOS_CHAR; + *dest = tmp; + } + else + { + *dest = 0; + } + + return 0; +} + +/* Read the .la file FILE. */ +static int +parse_dotla_file(FILE *file, char **dlname, char **libdir, char **deplibs, + char **old_name, int *installed) +{ + int errors = 0; + size_t line_len = LT_FILENAME_MAX; + char * line = MALLOC (char, line_len); + + if (!line) + { + LT__SETERROR (FILE_NOT_FOUND); + return 1; + } + + while (!feof (file)) + { + line[line_len-2] = '\0'; + if (!fgets (line, (int) line_len, file)) + { + break; + } + + /* Handle the case where we occasionally need to read a line + that is longer than the initial buffer size. + Behave even if the file contains NUL bytes due to corruption. */ + while (line[line_len-2] != '\0' && line[line_len-2] != '\n' && !feof (file)) + { + line = REALLOC (char, line, line_len *2); + if (!line) + { + ++errors; + goto cleanup; + } + line[line_len * 2 - 2] = '\0'; + if (!fgets (&line[line_len -1], (int) line_len +1, file)) + { + break; + } + line_len *= 2; + } + + if (line[0] == '\n' || line[0] == '#') + { + continue; + } + +#undef STR_DLNAME +#define STR_DLNAME "dlname=" + if (strncmp (line, STR_DLNAME, sizeof (STR_DLNAME) - 1) == 0) + { + errors += trim (dlname, &line[sizeof (STR_DLNAME) - 1]); + } + +#undef STR_OLD_LIBRARY +#define STR_OLD_LIBRARY "old_library=" + else if (strncmp (line, STR_OLD_LIBRARY, + sizeof (STR_OLD_LIBRARY) - 1) == 0) + { + errors += trim (old_name, &line[sizeof (STR_OLD_LIBRARY) - 1]); + } + + /* Windows native tools do not understand the POSIX paths we store + in libdir. */ +#undef STR_LIBDIR +#define STR_LIBDIR "libdir=" + else if (strncmp (line, STR_LIBDIR, sizeof (STR_LIBDIR) - 1) == 0) + { + errors += trim (libdir, &line[sizeof(STR_LIBDIR) - 1]); +#ifdef __WINDOWS__ + /* Disallow following unix-style paths on MinGW. */ + if (*libdir && (**libdir == '/' || **libdir == '\\')) + **libdir = '\0'; +#endif + } + +#undef STR_DL_DEPLIBS +#define STR_DL_DEPLIBS "dependency_libs=" + else if (strncmp (line, STR_DL_DEPLIBS, + sizeof (STR_DL_DEPLIBS) - 1) == 0) + { + errors += trim (deplibs, &line[sizeof (STR_DL_DEPLIBS) - 1]); + } + else if (STREQ (line, "installed=yes\n")) + { + *installed = 1; + } + else if (STREQ (line, "installed=no\n")) + { + *installed = 0; + } + +#undef STR_LIBRARY_NAMES +#define STR_LIBRARY_NAMES "library_names=" + else if (!*dlname && strncmp (line, STR_LIBRARY_NAMES, + sizeof (STR_LIBRARY_NAMES) - 1) == 0) + { + char *last_libname; + errors += trim (dlname, &line[sizeof (STR_LIBRARY_NAMES) - 1]); + if (!errors + && *dlname + && (last_libname = strrchr (*dlname, ' ')) != 0) + { + last_libname = lt__strdup (last_libname + 1); + if (!last_libname) + { + ++errors; + goto cleanup; + } + MEMREASSIGN (*dlname, last_libname); + } + } + + if (errors) + break; + } +cleanup: + FREE (line); + return errors; +} + + +/* Try to open FILENAME as a module. */ +static int +try_dlopen (lt_dlhandle *phandle, const char *filename, const char *ext, + lt_dladvise advise) +{ + const char * saved_error = 0; + char * archive_name = 0; + char * canonical = 0; + char * base_name = 0; + char * dir = 0; + char * name = 0; + char * attempt = 0; + int errors = 0; + lt_dlhandle newhandle; + + assert (phandle); + assert (*phandle == 0); + +#ifdef LT_DEBUG_LOADERS + fprintf (stderr, "try_dlopen (%s, %s)\n", + filename ? filename : "(null)", + ext ? ext : "(null)"); +#endif + + LT__GETERROR (saved_error); + + /* dlopen self? */ + if (!filename) + { + *phandle = (lt_dlhandle) lt__zalloc (sizeof (struct lt__handle)); + if (*phandle == 0) + return 1; + + newhandle = *phandle; + + /* lt_dlclose()ing yourself is very bad! Disallow it. */ + newhandle->info.is_resident = 1; + + if (tryall_dlopen (&newhandle, 0, advise, 0) != 0) + { + FREE (*phandle); + return 1; + } + + goto register_handle; + } + + assert (filename && *filename); + + if (ext) + { + attempt = MALLOC (char, LT_STRLEN (filename) + LT_STRLEN (ext) + 1); + if (!attempt) + return 1; + + sprintf(attempt, "%s%s", filename, ext); + } + else + { + attempt = lt__strdup (filename); + if (!attempt) + return 1; + } + + /* Doing this immediately allows internal functions to safely + assume only canonicalized paths are passed. */ + if (canonicalize_path (attempt, &canonical) != 0) + { + ++errors; + goto cleanup; + } + + /* If the canonical module name is a path (relative or absolute) + then split it into a directory part and a name part. */ + base_name = strrchr (canonical, '/'); + if (base_name) + { + size_t dirlen = (1+ base_name) - canonical; + + dir = MALLOC (char, 1+ dirlen); + if (!dir) + { + ++errors; + goto cleanup; + } + + strlcpy (dir, canonical, dirlen); + dir[dirlen] = LT_EOS_CHAR; + + ++base_name; + } + else + MEMREASSIGN (base_name, canonical); + + assert (base_name && *base_name); + + ext = strrchr (base_name, '.'); + if (!ext) + { + ext = base_name + LT_STRLEN (base_name); + } + + /* extract the module name from the file name */ + name = MALLOC (char, ext - base_name + 1); + if (!name) + { + ++errors; + goto cleanup; + } + + /* canonicalize the module name */ + { + int i; + for (i = 0; i < ext - base_name; ++i) + { + if (isalnum ((unsigned char)(base_name[i]))) + { + name[i] = base_name[i]; + } + else + { + name[i] = '_'; + } + } + name[ext - base_name] = LT_EOS_CHAR; + } + + /* Before trawling through the file system in search of a module, + check whether we are opening a preloaded module. */ + if (!dir) + { + const lt_dlvtable *vtable = lt_dlloader_find ("lt_preopen"); + + if (vtable) + { + /* libprefix + name + "." + libext + NULL */ + archive_name = MALLOC (char, strlen (libprefix) + LT_STRLEN (name) + strlen (libext) + 2); + *phandle = (lt_dlhandle) lt__zalloc (sizeof (struct lt__handle)); + + if ((*phandle == NULL) || (archive_name == NULL)) + { + ++errors; + goto cleanup; + } + newhandle = *phandle; + + /* Preloaded modules are always named according to their old + archive name. */ + if (strncmp(name, "lib", 3) == 0) + { + sprintf (archive_name, "%s%s.%s", libprefix, name + 3, libext); + } + else + { + sprintf (archive_name, "%s.%s", name, libext); + } + + if (tryall_dlopen (&newhandle, archive_name, advise, vtable) == 0) + { + goto register_handle; + } + + /* If we're still here, there was no matching preloaded module, + so put things back as we found them, and continue searching. */ + FREE (*phandle); + newhandle = NULL; + } + } + + /* If we are allowing only preloaded modules, and we didn't find + anything yet, give up on the search here. */ + if (advise && advise->try_preload_only) + { + goto cleanup; + } + + /* Check whether we are opening a libtool module (.la extension). */ + if (ext && STREQ (ext, archive_ext)) + { + /* this seems to be a libtool module */ + FILE * file = 0; + char * dlname = 0; + char * old_name = 0; + char * libdir = 0; + char * deplibs = 0; + + /* if we can't find the installed flag, it is probably an + installed libtool archive, produced with an old version + of libtool */ + int installed = 1; + + /* Now try to open the .la file. If there is no directory name + component, try to find it first in user_search_path and then other + prescribed paths. Otherwise (or in any case if the module was not + yet found) try opening just the module name as passed. */ + if (!dir) + { + const char *search_path = user_search_path; + + if (search_path) + file = find_file (user_search_path, base_name, &dir); + + if (!file) + { + search_path = getenv (LTDL_SEARCHPATH_VAR); + if (search_path) + file = find_file (search_path, base_name, &dir); + } + +#if defined LT_MODULE_PATH_VAR + if (!file) + { + search_path = getenv (LT_MODULE_PATH_VAR); + if (search_path) + file = find_file (search_path, base_name, &dir); + } +#endif +#if defined LT_DLSEARCH_PATH + if (!file && *sys_dlsearch_path) + { + file = find_file (sys_dlsearch_path, base_name, &dir); + } +#endif + } + else + { + file = fopen (attempt, LT_READTEXT_MODE); + } + + /* If we didn't find the file by now, it really isn't there. Set + the status flag, and bail out. */ + if (!file) + { + LT__SETERROR (FILE_NOT_FOUND); + ++errors; + goto cleanup; + } + + /* read the .la file */ + if (parse_dotla_file(file, &dlname, &libdir, &deplibs, + &old_name, &installed) != 0) + ++errors; + + fclose (file); + + /* allocate the handle */ + *phandle = (lt_dlhandle) lt__zalloc (sizeof (struct lt__handle)); + if (*phandle == 0) + ++errors; + + if (errors) + { + FREE (dlname); + FREE (old_name); + FREE (libdir); + FREE (deplibs); + FREE (*phandle); + goto cleanup; + } + + assert (*phandle); + + if (load_deplibs (*phandle, deplibs) == 0) + { + newhandle = *phandle; + /* find_module may replace newhandle */ + if (find_module (&newhandle, dir, libdir, dlname, old_name, + installed, advise)) + { + unload_deplibs (*phandle); + ++errors; + } + } + else + { + ++errors; + } + + FREE (dlname); + FREE (old_name); + FREE (libdir); + FREE (deplibs); + + if (errors) + { + FREE (*phandle); + goto cleanup; + } + + if (*phandle != newhandle) + { + unload_deplibs (*phandle); + } + } + else + { + /* not a libtool module */ + *phandle = (lt_dlhandle) lt__zalloc (sizeof (struct lt__handle)); + if (*phandle == 0) + { + ++errors; + goto cleanup; + } + + newhandle = *phandle; + + /* If the module has no directory name component, try to find it + first in user_search_path and then other prescribed paths. + Otherwise (or in any case if the module was not yet found) try + opening just the module name as passed. */ + if ((dir || (!find_handle (user_search_path, base_name, + &newhandle, advise) + && !find_handle (getenv (LTDL_SEARCHPATH_VAR), base_name, + &newhandle, advise) +#if defined LT_MODULE_PATH_VAR + && !find_handle (getenv (LT_MODULE_PATH_VAR), base_name, + &newhandle, advise) +#endif +#if defined LT_DLSEARCH_PATH + && !find_handle (sys_dlsearch_path, base_name, + &newhandle, advise) +#endif + ))) + { + if (tryall_dlopen (&newhandle, attempt, advise, 0) != 0) + { + newhandle = NULL; + } + } + + if (!newhandle) + { + FREE (*phandle); + ++errors; + goto cleanup; + } + } + + register_handle: + MEMREASSIGN (*phandle, newhandle); + + if ((*phandle)->info.ref_count == 0) + { + (*phandle)->info.ref_count = 1; + MEMREASSIGN ((*phandle)->info.name, name); + + (*phandle)->next = handles; + handles = *phandle; + } + + LT__SETERRORSTR (saved_error); + + cleanup: + FREE (dir); + FREE (attempt); + FREE (name); + if (!canonical) /* was MEMREASSIGNed */ + FREE (base_name); + FREE (canonical); + FREE (archive_name); + + return errors; +} + + +/* If the last error message stored was 'FILE_NOT_FOUND', then return + non-zero. */ +static int +file_not_found (void) +{ + const char *error = 0; + + LT__GETERROR (error); + if (error == LT__STRERROR (FILE_NOT_FOUND)) + return 1; + + return 0; +} + + +/* Unless FILENAME already bears a suitable library extension, then + return 0. */ +static int +has_library_ext (const char *filename) +{ + const char * ext = 0; + + assert (filename); + + ext = strrchr (filename, '.'); + + if (ext && ((STREQ (ext, archive_ext)) +#if defined LT_MODULE_EXT + || (STREQ (ext, shlib_ext)) +#endif +#if defined LT_SHARED_EXT + || (STREQ (ext, shared_ext)) +#endif + )) + { + return 1; + } + + return 0; +} + + +/* Initialise and configure a user lt_dladvise opaque object. */ + +int +lt_dladvise_init (lt_dladvise *padvise) +{ + lt_dladvise advise = (lt_dladvise) lt__zalloc (sizeof (struct lt__advise)); + *padvise = advise; + return (advise ? 0 : 1); +} + +int +lt_dladvise_destroy (lt_dladvise *padvise) +{ + if (padvise) + FREE(*padvise); + return 0; +} + +int +lt_dladvise_ext (lt_dladvise *padvise) +{ + assert (padvise && *padvise); + (*padvise)->try_ext = 1; + return 0; +} + +int +lt_dladvise_resident (lt_dladvise *padvise) +{ + assert (padvise && *padvise); + (*padvise)->is_resident = 1; + return 0; +} + +int +lt_dladvise_local (lt_dladvise *padvise) +{ + assert (padvise && *padvise); + (*padvise)->is_symlocal = 1; + return 0; +} + +int +lt_dladvise_global (lt_dladvise *padvise) +{ + assert (padvise && *padvise); + (*padvise)->is_symglobal = 1; + return 0; +} + +int +lt_dladvise_preload (lt_dladvise *padvise) +{ + assert (padvise && *padvise); + (*padvise)->try_preload_only = 1; + return 0; +} + +/* Libtool-1.5.x interface for loading a new module named FILENAME. */ +lt_dlhandle +lt_dlopen (const char *filename) +{ + return lt_dlopenadvise (filename, NULL); +} + + +/* If FILENAME has an ARCHIVE_EXT or MODULE_EXT extension, try to + open the FILENAME as passed. Otherwise try appending ARCHIVE_EXT, + and if a file is still not found try again with MODULE_EXT appended + instead. */ +lt_dlhandle +lt_dlopenext (const char *filename) +{ + lt_dlhandle handle = 0; + lt_dladvise advise; + + if (!lt_dladvise_init (&advise) && !lt_dladvise_ext (&advise)) + handle = lt_dlopenadvise (filename, advise); + + lt_dladvise_destroy (&advise); + return handle; +} + + +lt_dlhandle +lt_dlopenadvise (const char *filename, lt_dladvise advise) +{ + lt_dlhandle handle = 0; + int errors = 0; + const char * saved_error = 0; + + LT__GETERROR (saved_error); + + /* Can't have symbols hidden and visible at the same time! */ + if (advise && advise->is_symlocal && advise->is_symglobal) + { + LT__SETERROR (CONFLICTING_FLAGS); + return 0; + } + + if (!filename + || !advise + || !advise->try_ext + || has_library_ext (filename)) + { + /* Just incase we missed a code path in try_dlopen() that reports + an error, but forgot to reset handle... */ + if (try_dlopen (&handle, filename, NULL, advise) != 0) + return 0; + + return handle; + } + else if (filename && *filename) + { + + /* First try appending ARCHIVE_EXT. */ + errors += try_dlopen (&handle, filename, archive_ext, advise); + + /* If we found FILENAME, stop searching -- whether we were able to + load the file as a module or not. If the file exists but loading + failed, it is better to return an error message here than to + report FILE_NOT_FOUND when the alternatives (foo.so etc) are not + in the module search path. */ + if (handle || ((errors > 0) && !file_not_found ())) + return handle; + +#if defined LT_MODULE_EXT + /* Try appending SHLIB_EXT. */ + LT__SETERRORSTR (saved_error); + errors = try_dlopen (&handle, filename, shlib_ext, advise); + + /* As before, if the file was found but loading failed, return now + with the current error message. */ + if (handle || ((errors > 0) && !file_not_found ())) + return handle; +#endif + +#if defined LT_SHARED_EXT + /* Try appending SHARED_EXT. */ + LT__SETERRORSTR (saved_error); + errors = try_dlopen (&handle, filename, shared_ext, advise); + + /* As before, if the file was found but loading failed, return now + with the current error message. */ + if (handle || ((errors > 0) && !file_not_found ())) + return handle; +#endif + } + + /* Still here? Then we really did fail to locate any of the file + names we tried. */ + LT__SETERROR (FILE_NOT_FOUND); + return 0; +} + + +static int +lt_argz_insert (char **pargz, size_t *pargz_len, char *before, + const char *entry) +{ + error_t error; + + /* Prior to Sep 8, 2005, newlib had a bug where argz_insert(pargz, + pargz_len, NULL, entry) failed with EINVAL. */ + if (before) + error = argz_insert (pargz, pargz_len, before, entry); + else + error = argz_append (pargz, pargz_len, entry, 1 + strlen (entry)); + + if (error) + { + switch (error) + { + case ENOMEM: + LT__SETERROR (NO_MEMORY); + break; + default: + LT__SETERROR (UNKNOWN); + break; + } + return 1; + } + + return 0; +} + +static int +lt_argz_insertinorder (char **pargz, size_t *pargz_len, const char *entry) +{ + char *before = 0; + + assert (pargz); + assert (pargz_len); + assert (entry && *entry); + + if (*pargz) + while ((before = argz_next (*pargz, *pargz_len, before))) + { + int cmp = strcmp (entry, before); + + if (cmp < 0) break; + if (cmp == 0) return 0; /* No duplicates! */ + } + + return lt_argz_insert (pargz, pargz_len, before, entry); +} + +static int +lt_argz_insertdir (char **pargz, size_t *pargz_len, const char *dirnam, + struct dirent *dp) +{ + char *buf = 0; + size_t buf_len = 0; + char *end = 0; + size_t end_offset = 0; + size_t dir_len = 0; + int errors = 0; + + assert (pargz); + assert (pargz_len); + assert (dp); + + dir_len = LT_STRLEN (dirnam); + end = dp->d_name + D_NAMLEN(dp); + + /* Ignore version numbers. */ + { + char *p; + for (p = end; p -1 > dp->d_name; --p) + if (strchr (".0123456789", p[-1]) == 0) + break; + + if (*p == '.') + end = p; + } + + /* Ignore filename extension. */ + { + char *p; + for (p = end -1; p > dp->d_name; --p) + if (*p == '.') + { + end = p; + break; + } + } + + /* Prepend the directory name. */ + end_offset = end - dp->d_name; + buf_len = dir_len + 1+ end_offset; + buf = MALLOC (char, 1+ buf_len); + if (!buf) + return ++errors; + + assert (buf); + + strcpy (buf, dirnam); + strcat (buf, "/"); + strncat (buf, dp->d_name, end_offset); + buf[buf_len] = LT_EOS_CHAR; + + /* Try to insert (in order) into ARGZ/ARGZ_LEN. */ + if (lt_argz_insertinorder (pargz, pargz_len, buf) != 0) + ++errors; + + FREE (buf); + + return errors; +} + +static int +list_files_by_dir (const char *dirnam, char **pargz, size_t *pargz_len) +{ + DIR *dirp = 0; + int errors = 0; + + assert (dirnam && *dirnam); + assert (pargz); + assert (pargz_len); + assert (dirnam[LT_STRLEN(dirnam) -1] != '/'); + + dirp = opendir (dirnam); + if (dirp) + { + struct dirent *dp = 0; + + while ((dp = readdir (dirp))) + if (dp->d_name[0] != '.') + if (lt_argz_insertdir (pargz, pargz_len, dirnam, dp)) + { + ++errors; + break; + } + + closedir (dirp); + } + else + ++errors; + + return errors; +} + + +/* If there are any files in DIRNAME, call the function passed in + DATA1 (with the name of each file and DATA2 as arguments). */ +static int +foreachfile_callback (char *dirname, void *data1, void *data2) +{ + file_worker_func *func = *(file_worker_func **) data1; + + int is_done = 0; + char *argz = 0; + size_t argz_len = 0; + + if (list_files_by_dir (dirname, &argz, &argz_len) != 0) + goto cleanup; + if (!argz) + goto cleanup; + + { + char *filename = 0; + while ((filename = argz_next (argz, argz_len, filename))) + if ((is_done = (*func) (filename, data2))) + break; + } + + cleanup: + FREE (argz); + + return is_done; +} + + +/* Call FUNC for each unique extensionless file in SEARCH_PATH, along + with DATA. The filenames passed to FUNC would be suitable for + passing to lt_dlopenext. The extensions are stripped so that + individual modules do not generate several entries (e.g. libfoo.la, + libfoo.so, libfoo.so.1, libfoo.so.1.0.0). If SEARCH_PATH is NULL, + then the same directories that lt_dlopen would search are examined. */ +int +lt_dlforeachfile (const char *search_path, + int (*func) (const char *filename, void *data), + void *data) +{ + int is_done = 0; + file_worker_func **fpptr = &func; + + if (search_path) + { + /* If a specific path was passed, search only the directories + listed in it. */ + is_done = foreach_dirinpath (search_path, 0, + foreachfile_callback, fpptr, data); + } + else + { + /* Otherwise search the default paths. */ + is_done = foreach_dirinpath (user_search_path, 0, + foreachfile_callback, fpptr, data); + if (!is_done) + { + is_done = foreach_dirinpath (getenv(LTDL_SEARCHPATH_VAR), 0, + foreachfile_callback, fpptr, data); + } + +#if defined LT_MODULE_PATH_VAR + if (!is_done) + { + is_done = foreach_dirinpath (getenv(LT_MODULE_PATH_VAR), 0, + foreachfile_callback, fpptr, data); + } +#endif +#if defined LT_DLSEARCH_PATH + if (!is_done && *sys_dlsearch_path) + { + is_done = foreach_dirinpath (sys_dlsearch_path, 0, + foreachfile_callback, fpptr, data); + } +#endif + } + + return is_done; +} + +int +lt_dlclose (lt_dlhandle handle) +{ + lt_dlhandle cur, last; + int errors = 0; + + /* check whether the handle is valid */ + last = cur = handles; + while (cur && handle != cur) + { + last = cur; + cur = cur->next; + } + + if (!cur) + { + LT__SETERROR (INVALID_HANDLE); + ++errors; + goto done; + } + + cur = handle; + cur->info.ref_count--; + + /* Note that even with resident modules, we must track the ref_count + correctly incase the user decides to reset the residency flag + later (even though the API makes no provision for that at the + moment). */ + if (cur->info.ref_count <= 0 && !LT_DLIS_RESIDENT (cur)) + { + lt_user_data data = cur->vtable->dlloader_data; + + if (cur != handles) + { + last->next = cur->next; + } + else + { + handles = cur->next; + } + + errors += cur->vtable->module_close (data, cur->module); + errors += unload_deplibs (handle); + + /* It is up to the callers to free the data itself. */ + FREE (cur->interface_data); + + FREE (cur->info.filename); + FREE (cur->info.name); + FREE (cur); + + goto done; + } + + if (LT_DLIS_RESIDENT (handle)) + { + LT__SETERROR (CLOSE_RESIDENT_MODULE); + ++errors; + } + + done: + return errors; +} + +void * +lt_dlsym (lt_dlhandle place, const char *symbol) +{ + size_t lensym; + char lsym[LT_SYMBOL_LENGTH]; + char *sym; + void *address; + lt_user_data data; + lt_dlhandle handle; + + if (!place) + { + LT__SETERROR (INVALID_HANDLE); + return 0; + } + + handle = place; + + if (!symbol) + { + LT__SETERROR (SYMBOL_NOT_FOUND); + return 0; + } + + lensym = LT_STRLEN (symbol) + LT_STRLEN (handle->vtable->sym_prefix) + + LT_STRLEN (handle->info.name); + + if (lensym + LT_SYMBOL_OVERHEAD < LT_SYMBOL_LENGTH) + { + sym = lsym; + } + else + { + sym = MALLOC (char, lensym + LT_SYMBOL_OVERHEAD + 1); + if (!sym) + { + LT__SETERROR (BUFFER_OVERFLOW); + return 0; + } + } + + data = handle->vtable->dlloader_data; + if (handle->info.name) + { + const char *saved_error; + + LT__GETERROR (saved_error); + + /* this is a libtool module */ + if (handle->vtable->sym_prefix) + { + strcpy(sym, handle->vtable->sym_prefix); + strcat(sym, handle->info.name); + } + else + { + strcpy(sym, handle->info.name); + } + + strcat(sym, "_LTX_"); + strcat(sym, symbol); + + /* try "modulename_LTX_symbol" */ + address = handle->vtable->find_sym (data, handle->module, sym); + if (address) + { + if (sym != lsym) + { + FREE (sym); + } + return address; + } + LT__SETERRORSTR (saved_error); + } + + /* otherwise try "symbol" */ + if (handle->vtable->sym_prefix) + { + strcpy(sym, handle->vtable->sym_prefix); + strcat(sym, symbol); + } + else + { + strcpy(sym, symbol); + } + + address = handle->vtable->find_sym (data, handle->module, sym); + if (sym != lsym) + { + FREE (sym); + } + + return address; +} + +const char * +lt_dlerror (void) +{ + const char *error; + + LT__GETERROR (error); + LT__SETERRORSTR (0); + + return error; +} + +static int +lt_dlpath_insertdir (char **ppath, char *before, const char *dir) +{ + int errors = 0; + char *canonical = 0; + char *argz = 0; + size_t argz_len = 0; + + assert (ppath); + assert (dir && *dir); + + if (canonicalize_path (dir, &canonical) != 0) + { + ++errors; + goto cleanup; + } + + assert (canonical && *canonical); + + /* If *PPATH is empty, set it to DIR. */ + if (*ppath == 0) + { + assert (!before); /* BEFORE cannot be set without PPATH. */ + assert (dir); /* Without DIR, don't call this function! */ + + *ppath = lt__strdup (dir); + if (*ppath == 0) + ++errors; + + goto cleanup; + } + + assert (ppath && *ppath); + + if (argzize_path (*ppath, &argz, &argz_len) != 0) + { + ++errors; + goto cleanup; + } + + /* Convert BEFORE into an equivalent offset into ARGZ. This only works + if *PPATH is already canonicalized, and hence does not change length + with respect to ARGZ. We canonicalize each entry as it is added to + the search path, and don't call this function with (uncanonicalized) + user paths, so this is a fair assumption. */ + if (before) + { + assert (*ppath <= before); + assert ((int) (before - *ppath) <= (int) strlen (*ppath)); + + before = before - *ppath + argz; + } + + if (lt_argz_insert (&argz, &argz_len, before, dir) != 0) + { + ++errors; + goto cleanup; + } + + argz_stringify (argz, argz_len, LT_PATHSEP_CHAR); + MEMREASSIGN(*ppath, argz); + + cleanup: + FREE (argz); + FREE (canonical); + + return errors; +} + +int +lt_dladdsearchdir (const char *search_dir) +{ + int errors = 0; + + if (search_dir && *search_dir) + { + if (lt_dlpath_insertdir (&user_search_path, 0, search_dir) != 0) + ++errors; + } + + return errors; +} + +int +lt_dlinsertsearchdir (const char *before, const char *search_dir) +{ + int errors = 0; + + if (before) + { + if ((before < user_search_path) + || (before >= user_search_path + LT_STRLEN (user_search_path))) + { + LT__SETERROR (INVALID_POSITION); + return 1; + } + } + + if (search_dir && *search_dir) + { + if (lt_dlpath_insertdir (&user_search_path, + (char *) before, search_dir) != 0) + { + ++errors; + } + } + + return errors; +} + +int +lt_dlsetsearchpath (const char *search_path) +{ + int errors = 0; + + FREE (user_search_path); + + if (!search_path || !LT_STRLEN (search_path)) + { + return errors; + } + + if (canonicalize_path (search_path, &user_search_path) != 0) + ++errors; + + return errors; +} + +const char * +lt_dlgetsearchpath (void) +{ + const char *saved_path; + + saved_path = user_search_path; + + return saved_path; +} + +int +lt_dlmakeresident (lt_dlhandle handle) +{ + int errors = 0; + + if (!handle) + { + LT__SETERROR (INVALID_HANDLE); + ++errors; + } + else + { + handle->info.is_resident = 1; + } + + return errors; +} + +int +lt_dlisresident (lt_dlhandle handle) +{ + if (!handle) + { + LT__SETERROR (INVALID_HANDLE); + return -1; + } + + return LT_DLIS_RESIDENT (handle); +} + + + +/* --- MODULE INFORMATION --- */ + +typedef struct { + char *id_string; + lt_dlhandle_interface *iface; +} lt__interface_id; + +lt_dlinterface_id +lt_dlinterface_register (const char *id_string, lt_dlhandle_interface *iface) +{ + lt__interface_id *interface_id = (lt__interface_id *) lt__malloc (sizeof *interface_id); + + /* If lt__malloc fails, it will LT__SETERROR (NO_MEMORY), which + can then be detected with lt_dlerror() if we return 0. */ + if (interface_id) + { + interface_id->id_string = lt__strdup (id_string); + if (!interface_id->id_string) + FREE (interface_id); + else + interface_id->iface = iface; + } + + return (lt_dlinterface_id) interface_id; +} + +void lt_dlinterface_free (lt_dlinterface_id key) +{ + lt__interface_id *interface_id = (lt__interface_id *)key; + FREE (interface_id->id_string); + FREE (interface_id); +} + +void * +lt_dlcaller_set_data (lt_dlinterface_id key, lt_dlhandle handle, void *data) +{ + int n_elements = 0; + void *stale = (void *) 0; + lt_dlhandle cur = handle; + int i; + + if (cur->interface_data) + while (cur->interface_data[n_elements].key) + ++n_elements; + + for (i = 0; i < n_elements; ++i) + { + if (cur->interface_data[i].key == key) + { + stale = cur->interface_data[i].data; + break; + } + } + + /* Ensure that there is enough room in this handle's interface_data + array to accept a new element (and an empty end marker). */ + if (i == n_elements) + { + lt_interface_data *temp + = REALLOC (lt_interface_data, cur->interface_data, 2+ n_elements); + + if (!temp) + { + stale = 0; + goto done; + } + + cur->interface_data = temp; + + /* We only need this if we needed to allocate a new interface_data. */ + cur->interface_data[i].key = key; + cur->interface_data[1+ i].key = 0; + } + + cur->interface_data[i].data = data; + + done: + return stale; +} + +void * +lt_dlcaller_get_data (lt_dlinterface_id key, lt_dlhandle handle) +{ + void *result = (void *) 0; + lt_dlhandle cur = handle; + + /* Locate the index of the element with a matching KEY. */ + if (cur->interface_data) + { + int i; + for (i = 0; cur->interface_data[i].key; ++i) + { + if (cur->interface_data[i].key == key) + { + result = cur->interface_data[i].data; + break; + } + } + } + + return result; +} + +const lt_dlinfo * +lt_dlgetinfo (lt_dlhandle handle) +{ + if (!handle) + { + LT__SETERROR (INVALID_HANDLE); + return 0; + } + + return &(handle->info); +} + + +lt_dlhandle +lt_dlhandle_iterate (lt_dlinterface_id iface, lt_dlhandle place) +{ + lt_dlhandle handle = place; + lt__interface_id *iterator = (lt__interface_id *) iface; + + assert (iface); /* iface is a required argument */ + + if (!handle) + handle = handles; + else + handle = handle->next; + + /* advance while the interface check fails */ + while (handle && iterator->iface + && ((*iterator->iface) (handle, iterator->id_string) != 0)) + { + handle = handle->next; + } + + return handle; +} + + +lt_dlhandle +lt_dlhandle_fetch (lt_dlinterface_id iface, const char *module_name) +{ + lt_dlhandle handle = 0; + + assert (iface); /* iface is a required argument */ + + while ((handle = lt_dlhandle_iterate (iface, handle))) + { + lt_dlhandle cur = handle; + if (cur && cur->info.name && STREQ (cur->info.name, module_name)) + break; + } + + return handle; +} + + +int +lt_dlhandle_map (lt_dlinterface_id iface, + int (*func) (lt_dlhandle handle, void *data), void *data) +{ + lt__interface_id *iterator = (lt__interface_id *) iface; + lt_dlhandle cur = handles; + + assert (iface); /* iface is a required argument */ + + while (cur) + { + int errorcode = 0; + + /* advance while the interface check fails */ + while (cur && iterator->iface + && ((*iterator->iface) (cur, iterator->id_string) != 0)) + { + cur = cur->next; + } + + if ((errorcode = (*func) (cur, data)) != 0) + return errorcode; + } + + return 0; +} diff --git a/libltdl/ltdl.h b/libltdl/ltdl.h new file mode 100644 index 0000000..f811399 --- /dev/null +++ b/libltdl/ltdl.h @@ -0,0 +1,163 @@ +/* ltdl.h -- generic dlopen functions + + Copyright (C) 1998-2000, 2004-2005, 2007-2008, 2011-2015 Free + Software Foundation, Inc. + Written by Thomas Tanner, 1998 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +/* Only include this header file once. */ +#if !defined LTDL_H +#define LTDL_H 1 + +#include +#include +#include + +LT_BEGIN_C_DECLS + + +/* LT_STRLEN can be used safely on NULL pointers. */ +#define LT_STRLEN(s) (((s) && (s)[0]) ? strlen (s) : 0) + + +/* --- DYNAMIC MODULE LOADING API --- */ + + +typedef struct lt__handle *lt_dlhandle; /* A loaded module. */ + +/* Initialisation and finalisation functions for libltdl. */ +LT_SCOPE int lt_dlinit (void); +LT_SCOPE int lt_dlexit (void); + +/* Module search path manipulation. */ +LT_SCOPE int lt_dladdsearchdir (const char *search_dir); +LT_SCOPE int lt_dlinsertsearchdir (const char *before, + const char *search_dir); +LT_SCOPE int lt_dlsetsearchpath (const char *search_path); +LT_SCOPE const char *lt_dlgetsearchpath (void); +LT_SCOPE int lt_dlforeachfile ( + const char *search_path, + int (*func) (const char *filename, void *data), + void *data); + +/* User module loading advisors. */ +LT_SCOPE int lt_dladvise_init (lt_dladvise *advise); +LT_SCOPE int lt_dladvise_destroy (lt_dladvise *advise); +LT_SCOPE int lt_dladvise_ext (lt_dladvise *advise); +LT_SCOPE int lt_dladvise_resident (lt_dladvise *advise); +LT_SCOPE int lt_dladvise_local (lt_dladvise *advise); +LT_SCOPE int lt_dladvise_global (lt_dladvise *advise); +LT_SCOPE int lt_dladvise_preload (lt_dladvise *advise); + +/* Portable libltdl versions of the system dlopen() API. */ +LT_SCOPE lt_dlhandle lt_dlopen (const char *filename); +LT_SCOPE lt_dlhandle lt_dlopenext (const char *filename); +LT_SCOPE lt_dlhandle lt_dlopenadvise (const char *filename, + lt_dladvise advise); +LT_SCOPE void * lt_dlsym (lt_dlhandle handle, const char *name); +LT_SCOPE const char *lt_dlerror (void); +LT_SCOPE int lt_dlclose (lt_dlhandle handle); + + + +/* --- PRELOADED MODULE SUPPORT --- */ + + +/* A preopened symbol. Arrays of this type comprise the exported + symbols for a dlpreopened module. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; + +typedef int lt_dlpreload_callback_func (lt_dlhandle handle); + +LT_SCOPE int lt_dlpreload (const lt_dlsymlist *preloaded); +LT_SCOPE int lt_dlpreload_default (const lt_dlsymlist *preloaded); +LT_SCOPE int lt_dlpreload_open (const char *originator, + lt_dlpreload_callback_func *func); + +#define lt_preloaded_symbols lt__PROGRAM__LTX_preloaded_symbols +/* Ensure C linkage. */ +extern LT_DLSYM_CONST lt_dlsymlist lt__PROGRAM__LTX_preloaded_symbols[]; + +#define LTDL_SET_PRELOADED_SYMBOLS() \ + lt_dlpreload_default(lt_preloaded_symbols) + + + + +/* --- MODULE INFORMATION --- */ + + +/* Associating user data with loaded modules. */ +typedef void * lt_dlinterface_id; +typedef int lt_dlhandle_interface (lt_dlhandle handle, const char *id_string); + +LT_SCOPE lt_dlinterface_id lt_dlinterface_register (const char *id_string, + lt_dlhandle_interface *iface); +LT_SCOPE void lt_dlinterface_free (lt_dlinterface_id key); +LT_SCOPE void * lt_dlcaller_set_data (lt_dlinterface_id key, + lt_dlhandle handle, void *data); +LT_SCOPE void * lt_dlcaller_get_data (lt_dlinterface_id key, + lt_dlhandle handle); + + +/* Read only information pertaining to a loaded module. */ +typedef struct { + char * filename; /* file name */ + char * name; /* module name */ + int ref_count; /* number of times lt_dlopened minus + number of times lt_dlclosed. */ + unsigned int is_resident:1; /* module can't be unloaded. */ + unsigned int is_symglobal:1; /* module symbols can satisfy + subsequently loaded modules. */ + unsigned int is_symlocal:1; /* module symbols are only available + locally. */ +} lt_dlinfo; + +LT_SCOPE const lt_dlinfo *lt_dlgetinfo (lt_dlhandle handle); + +LT_SCOPE lt_dlhandle lt_dlhandle_iterate (lt_dlinterface_id iface, + lt_dlhandle place); +LT_SCOPE lt_dlhandle lt_dlhandle_fetch (lt_dlinterface_id iface, + const char *module_name); +LT_SCOPE int lt_dlhandle_map (lt_dlinterface_id iface, + int (*func) (lt_dlhandle handle, void *data), + void *data); + + + +/* Deprecated module residency management API. */ +LT_SCOPE int lt_dlmakeresident (lt_dlhandle handle); +LT_SCOPE int lt_dlisresident (lt_dlhandle handle); + +#define lt_ptr void * + +LT_END_C_DECLS + +#endif /*!defined LTDL_H*/ diff --git a/libltdl/ltdl.mk b/libltdl/ltdl.mk new file mode 100644 index 0000000..eb03f5a --- /dev/null +++ b/libltdl/ltdl.mk @@ -0,0 +1,149 @@ +## ltdl.mk -- includable Makefile snippet +## +## Copyright (C) 2003-2005, 2007, 2011-2015 Free Software Foundation, +## Inc. +## Written by Gary V. Vaughan, 2003 +## +## NOTE: The canonical source of this file is maintained with the +## GNU Libtool package. Report bugs to bug-libtool@gnu.org. +## +## GNU Libltdl is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. +## +## You should have received a copy of the GNU LesserGeneral Public +## License along with GNU Libltdl; see the file COPYING.LIB. If not, a +## copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +## or obtained by writing to the Free Software Foundation, Inc., +## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +##### + +## DO NOT REMOVE THIS LINE -- make depends on it + +# -I$(srcdir) is needed for user that built libltdl with a sub-Automake +# (not as a sub-package!) using 'nostdinc': +AM_CPPFLAGS += -DLT_CONFIG_H='<$(LT_CONFIG_H)>' \ + -DLTDL -I. -I$(srcdir) -Ilibltdl \ + -I$(srcdir)/libltdl -Ilibltdl/libltdl \ + -I$(srcdir)/libltdl/libltdl +AM_LDFLAGS += -no-undefined +LTDL_VERSION_INFO = -version-info 10:1:3 + +noinst_LTLIBRARIES += $(LT_DLLOADERS) + +if INSTALL_LTDL +ltdlincludedir = $(includedir)/libltdl +ltdlinclude_HEADERS = libltdl/libltdl/lt_system.h \ + libltdl/libltdl/lt_error.h \ + libltdl/libltdl/lt_dlloader.h +include_HEADERS += libltdl/ltdl.h +lib_LTLIBRARIES += libltdl/libltdl.la +endif + +if CONVENIENCE_LTDL +noinst_LTLIBRARIES += libltdl/libltdlc.la +endif + +libltdl_libltdl_la_SOURCES = libltdl/libltdl/lt__alloc.h \ + libltdl/libltdl/lt__dirent.h \ + libltdl/libltdl/lt__glibc.h \ + libltdl/libltdl/lt__private.h \ + libltdl/libltdl/lt__strl.h \ + libltdl/libltdl/lt_dlloader.h \ + libltdl/libltdl/lt_error.h \ + libltdl/libltdl/lt_system.h \ + libltdl/libltdl/slist.h \ + libltdl/loaders/preopen.c \ + libltdl/lt__alloc.c \ + libltdl/lt_dlloader.c \ + libltdl/lt_error.c \ + libltdl/ltdl.c \ + libltdl/ltdl.h \ + libltdl/slist.c + +EXTRA_DIST += libltdl/lt__dirent.c \ + libltdl/lt__strl.c + +libltdl_libltdl_la_CPPFLAGS = -DLTDLOPEN=$(LTDLOPEN) $(AM_CPPFLAGS) +libltdl_libltdl_la_LDFLAGS = $(AM_LDFLAGS) $(LTDL_VERSION_INFO) $(LT_DLPREOPEN) +libltdl_libltdl_la_LIBADD = $(ltdl_LTLIBOBJS) +libltdl_libltdl_la_DEPENDENCIES = $(LT_DLLOADERS) $(ltdl_LTLIBOBJS) + +libltdl_libltdlc_la_SOURCES = $(libltdl_libltdl_la_SOURCES) +libltdl_libltdlc_la_CPPFLAGS = -DLTDLOPEN=$(LTDLOPEN)c $(AM_CPPFLAGS) +libltdl_libltdlc_la_LDFLAGS = $(AM_LDFLAGS) $(LT_DLPREOPEN) +libltdl_libltdlc_la_LIBADD = $(libltdl_libltdl_la_LIBADD) +libltdl_libltdlc_la_DEPENDENCIES= $(libltdl_libltdl_la_DEPENDENCIES) + +## The loaders are preopened by libltdl, itself always built from +## pic-objects (either as a shared library, or a convenience library), +## so the loaders themselves must be made from pic-objects too. We +## use convenience libraries for that purpose: +EXTRA_LTLIBRARIES += libltdl/dlopen.la \ + libltdl/dld_link.la \ + libltdl/dyld.la \ + libltdl/load_add_on.la \ + libltdl/loadlibrary.la \ + libltdl/shl_load.la + +libltdl_dlopen_la_SOURCES = libltdl/loaders/dlopen.c +libltdl_dlopen_la_LDFLAGS = -module -avoid-version +libltdl_dlopen_la_LIBADD = $(LIBADD_DLOPEN) + +libltdl_dld_link_la_SOURCES = libltdl/loaders/dld_link.c +libltdl_dld_link_la_LDFLAGS = -module -avoid-version +libltdl_dld_link_la_LIBADD = -ldld + +libltdl_dyld_la_SOURCES = libltdl/loaders/dyld.c +libltdl_dyld_la_LDFLAGS = -module -avoid-version + +libltdl_load_add_on_la_SOURCES = libltdl/loaders/load_add_on.c +libltdl_load_add_on_la_LDFLAGS = -module -avoid-version + +libltdl_loadlibrary_la_SOURCES = libltdl/loaders/loadlibrary.c +libltdl_loadlibrary_la_LDFLAGS = -module -avoid-version + +libltdl_shl_load_la_SOURCES = libltdl/loaders/shl_load.c +libltdl_shl_load_la_LDFLAGS = -module -avoid-version +libltdl_shl_load_la_LIBADD = $(LIBADD_SHL_LOAD) + +## Make sure these will be cleaned even when they're not built by default: +CLEANFILES += libltdl/libltdl.la \ + libltdl/libltdlc.la \ + libltdl/libdlloader.la + +## Automake-1.9.6 doesn't clean subdir AC_LIBOBJ compiled objects +## automatically: +CLEANFILES += $(ltdl_LIBOBJS) $(ltdl_LTLIBOBJS) + +EXTRA_DIST += libltdl/COPYING.LIB \ + libltdl/README + +## --------------------------- ## +## Gnulib Makefile.am snippets ## +## --------------------------- ## + +BUILT_SOURCES += libltdl/libltdl/$(LT_ARGZ_H) +EXTRA_DIST += libltdl/libltdl/lt__argz_.h \ + libltdl/lt__argz.c + +# We need the following in order to create an when the system +# doesn't have one that works with the given compiler. +all-local $(lib_OBJECTS): libltdl/libltdl/$(LT_ARGZ_H) +libltdl/libltdl/lt__argz.h: libltdl/libltdl/lt__argz_.h + $(AM_V_at)$(mkinstalldirs) . libltdl/libltdl + $(AM_V_GEN)cp $(srcdir)/libltdl/libltdl/lt__argz_.h $@-t + $(AM_V_at)mv $@-t $@ +MOSTLYCLEANFILES += libltdl/libltdl/lt__argz.h \ + libltdl/libltdl/lt__argz.h-t diff --git a/libltdl/slist.c b/libltdl/slist.c new file mode 100644 index 0000000..4c8f20c --- /dev/null +++ b/libltdl/slist.c @@ -0,0 +1,379 @@ +/* slist.c -- generalised singly linked lists + + Copyright (C) 2000, 2004, 2007-2009, 2011-2015 Free Software + Foundation, Inc. + Written by Gary V. Vaughan, 2000 + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + +GNU Libltdl is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser 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 Lesser 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 Libltdl 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with GNU Libltdl; see the file COPYING.LIB. If not, a +copy can be downloaded from http://www.gnu.org/licenses/lgpl.html, +or obtained by writing to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include + +#include "slist.h" +#include + +static SList * slist_sort_merge (SList *left, SList *right, + SListCompare *compare, void *userdata); + + +/* Call DELETE repeatedly on each element of HEAD. + + CAVEAT: If you call this when HEAD is the start of a list of boxed + items, you must remember that each item passed back to your + DELETE function will be a boxed item that must be slist_unbox()ed + before operating on its contents. + + e.g. void boxed_delete (void *item) { item_free (slist_unbox (item)); } + ... + slist = slist_delete (slist, boxed_delete); + ... +*/ +SList * +slist_delete (SList *head, void (*delete_fct) (void *item)) +{ + assert (delete_fct); + + while (head) + { + SList *next = head->next; + (*delete_fct) (head); + head = next; + } + + return 0; +} + +/* Call FIND repeatedly with MATCHDATA and each item of *PHEAD, until + FIND returns non-NULL, or the list is exhausted. If a match is found + the matching item is destructively removed from *PHEAD, and the value + returned by the matching call to FIND is returned. + + CAVEAT: To avoid memory leaks, unless you already have the address of + the stale item, you should probably return that from FIND if + it makes a successful match. Don't forget to slist_unbox() + every item in a boxed list before operating on its contents. */ +SList * +slist_remove (SList **phead, SListCallback *find, void *matchdata) +{ + SList *stale = 0; + void *result = 0; + + assert (find); + + if (!phead || !*phead) + return 0; + + /* Does the head of the passed list match? */ + result = (*find) (*phead, matchdata); + if (result) + { + stale = *phead; + *phead = stale->next; + } + /* what about the rest of the elements? */ + else + { + SList *head; + for (head = *phead; head->next; head = head->next) + { + result = (*find) (head->next, matchdata); + if (result) + { + stale = head->next; + head->next = stale->next; + break; + } + } + } + + return (SList *) result; +} + +/* Call FIND repeatedly with each element of SLIST and MATCHDATA, until + FIND returns non-NULL, or the list is exhausted. If a match is found + the value returned by the matching call to FIND is returned. */ +void * +slist_find (SList *slist, SListCallback *find, void *matchdata) +{ + void *result = 0; + + assert (find); + + for (; slist; slist = slist->next) + { + result = (*find) (slist, matchdata); + if (result) + break; + } + + return result; +} + +/* Return a single list, composed by destructively concatenating the + items in HEAD and TAIL. The values of HEAD and TAIL are undefined + after calling this function. + + CAVEAT: Don't mix boxed and unboxed items in a single list. + + e.g. slist1 = slist_concat (slist1, slist2); */ +SList * +slist_concat (SList *head, SList *tail) +{ + SList *last; + + if (!head) + { + return tail; + } + + last = head; + while (last->next) + last = last->next; + + last->next = tail; + + return head; +} + +/* Return a single list, composed by destructively appending all of + the items in SLIST to ITEM. The values of ITEM and SLIST are undefined + after calling this function. + + CAVEAT: Don't mix boxed and unboxed items in a single list. + + e.g. slist1 = slist_cons (slist_box (data), slist1); */ +SList * +slist_cons (SList *item, SList *slist) +{ + if (!item) + { + return slist; + } + + assert (!item->next); + + item->next = slist; + return item; +} + +/* Return a list starting at the second item of SLIST. */ +SList * +slist_tail (SList *slist) +{ + return slist ? slist->next : NULL; +} + +/* Return a list starting at the Nth item of SLIST. If SLIST is less + than N items long, NULL is returned. Just to be confusing, list items + are counted from 1, to get the 2nd element of slist: + + e.g. shared_list = slist_nth (slist, 2); */ +SList * +slist_nth (SList *slist, size_t n) +{ + for (;n > 1 && slist; n--) + slist = slist->next; + + return slist; +} + +/* Return the number of items in SLIST. We start counting from 1, so + the length of a list with no items is 0, and so on. */ +size_t +slist_length (SList *slist) +{ + size_t n; + + for (n = 0; slist; ++n) + slist = slist->next; + + return n; +} + +/* Destructively reverse the order of items in SLIST. The value of SLIST + is undefined after calling this function. + + CAVEAT: You must store the result of this function, or you might not + be able to get all the items except the first one back again. + + e.g. slist = slist_reverse (slist); */ +SList * +slist_reverse (SList *slist) +{ + SList *result = 0; + SList *next; + + while (slist) + { + next = slist->next; + slist->next = result; + result = slist; + slist = next; + } + + return result; +} + +/* Call FOREACH once for each item in SLIST, passing both the item and + USERDATA on each call. */ +void * +slist_foreach (SList *slist, SListCallback *foreach, void *userdata) +{ + void *result = 0; + + assert (foreach); + + while (slist) + { + SList *next = slist->next; + result = (*foreach) (slist, userdata); + + if (result) + break; + + slist = next; + } + + return result; +} + +/* Destructively merge the items of two ordered lists LEFT and RIGHT, + returning a single sorted list containing the items of both -- Part of + the quicksort algorithm. The values of LEFT and RIGHT are undefined + after calling this function. + + At each iteration, add another item to the merged list by taking the + lowest valued item from the head of either LEFT or RIGHT, determined + by passing those items and USERDATA to COMPARE. COMPARE should return + less than 0 if the head of LEFT has the lower value, greater than 0 if + the head of RIGHT has the lower value, otherwise 0. */ +static SList * +slist_sort_merge (SList *left, SList *right, SListCompare *compare, + void *userdata) +{ + SList merged, *insert; + + insert = &merged; + + while (left && right) + { + if ((*compare) (left, right, userdata) <= 0) + { + insert = insert->next = left; + left = left->next; + } + else + { + insert = insert->next = right; + right = right->next; + } + } + + insert->next = left ? left : right; + + return merged.next; +} + +/* Perform a destructive quicksort on the items in SLIST, by repeatedly + calling COMPARE with a pair of items from SLIST along with USERDATA + at every iteration. COMPARE is a function as defined above for + slist_sort_merge(). The value of SLIST is undefined after calling + this function. + + e.g. slist = slist_sort (slist, compare, 0); */ +SList * +slist_sort (SList *slist, SListCompare *compare, void *userdata) +{ + SList *left, *right; + + if (!slist) + return slist; + + /* Be sure that LEFT and RIGHT never contain the same item. */ + left = slist; + right = slist->next; + + if (!right) + return left; + + /* Skip two items with RIGHT and one with SLIST, until RIGHT falls off + the end. SLIST must be about half way along. */ + while (right && (right = right->next)) + { + if (!right || !(right = right->next)) + break; + slist = slist->next; + } + right = slist->next; + slist->next = 0; + + /* Sort LEFT and RIGHT, then merge the two. */ + return slist_sort_merge (slist_sort (left, compare, userdata), + slist_sort (right, compare, userdata), + compare, userdata); +} + + +/* Aside from using the functions above to manage chained structures of + any type that has a NEXT pointer as its first field, SLISTs can + be comprised of boxed items. The boxes are chained together in + that case, so there is no need for a NEXT field in the item proper. + Some care must be taken to slist_box and slist_unbox each item in + a boxed list at the appropriate points to avoid leaking the memory + used for the boxes. It us usually a very bad idea to mix boxed and + non-boxed items in a single list. */ + +/* Return a 'boxed' freshly mallocated 1 element list containing + USERDATA. */ +SList * +slist_box (const void *userdata) +{ + SList *item = (SList *) malloc (sizeof *item); + + if (item) + { + item->next = 0; + item->userdata = userdata; + } + + return item; +} + +/* Return the contents of a 'boxed' ITEM, recycling the box itself. */ +void * +slist_unbox (SList *item) +{ + void *userdata = 0; + + if (item) + { + /* Strip the const, because responsibility for this memory + passes to the caller on return. */ + userdata = (void *) item->userdata; + free (item); + } + + return userdata; +} diff --git a/m4/.gitignore b/m4/.gitignore new file mode 100644 index 0000000..4d934ba --- /dev/null +++ b/m4/.gitignore @@ -0,0 +1,3 @@ +/libtool.m4 +/lt*.m4 +/argz.m4 diff --git a/m4/ax_cflags_gcc_option.m4 b/m4/ax_cflags_gcc_option.m4 new file mode 100644 index 0000000..8cffe5d --- /dev/null +++ b/m4/ax_cflags_gcc_option.m4 @@ -0,0 +1,225 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_cflags_gcc_option.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CFLAGS_GCC_OPTION (optionflag [,[shellvar][,[A][,[NA]]]) +# +# DESCRIPTION +# +# AX_CFLAGS_GCC_OPTION(-fomit-frame-pointer) would show a message like +# "checking CFLAGS for gcc -fomit-frame-pointer ... yes" and add the +# optionflag to CFLAGS if it is understood. You can override the +# shellvar-default of CFLAGS of course. The order of arguments stems from +# the explicit macros like AX_CFLAGS_WARN_ALL. +# +# The cousin AX_CXXFLAGS_GCC_OPTION would check for an option to add to +# CXXFLAGS - and it uses the autoconf setup for C++ instead of C (since it +# is possible to use different compilers for C and C++). +# +# The macro is a lot simpler than any special AX_CFLAGS_* macro (or +# ax_cxx_rtti.m4 macro) but allows to check for arbitrary options. +# However, if you use this macro in a few places, it would be great if you +# would make up a new function-macro and submit it to the ac-archive. +# +# - $1 option-to-check-for : required ("-option" as non-value) +# - $2 shell-variable-to-add-to : CFLAGS (or CXXFLAGS in the other case) +# - $3 action-if-found : add value to shellvariable +# - $4 action-if-not-found : nothing +# +# Note: in earlier versions, $1-$2 were swapped. We try to detect the +# situation and accept a $2=~/-/ as being the old option-to-check-for. +# +# There are other variants that emerged from the original macro variant +# which did just test an option to be possibly added. However, some +# compilers accept an option silently, or possibly for just another option +# that was not intended. Therefore, we have to do a generic test for a +# compiler family. For gcc we check "-pedantic" being accepted which is +# also understood by compilers who just want to be compatible with gcc +# even when not being made from gcc sources. +# +# See also: AX_CFLAGS_SUN_OPTION, AX_CFLAGS_HPUX_OPTION, +# AX_CFLAGS_AIX_OPTION, and AX_CFLAGS_IRIX_OPTION. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf 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. + +#serial 13 + +AC_DEFUN([AX_CFLAGS_GCC_OPTION_OLD], [dnl +AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl +AS_VAR_PUSHDEF([VAR],[ax_cv_cflags_gcc_option_$2])dnl +AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)], +VAR,[AS_VAR_SET([VAR],["no, unknown"]) + AC_LANG_SAVE + AC_LANG_C + ac_save_[]FLAGS="$[]FLAGS" +for ac_arg dnl +in "-pedantic -Werror % m4_ifval($2,$2,-option)" dnl GCC + "-pedantic % m4_ifval($2,$2,-option) %% no, obsolete" dnl new GCC + # +do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + AC_TRY_COMPILE([],[return 0;], + [AS_VAR_SET([VAR],[`echo $ac_arg | sed -e 's,.*% *,,'`]); break]) +done + FLAGS="$ac_save_[]FLAGS" + AC_LANG_RESTORE +]) +m4_ifdef([AS_VAR_COPY],[AS_VAR_COPY([var],[VAR])],[var=AS_VAR_GET([VAR])]) +case ".$var" in + .ok|.ok,*) m4_ifvaln($3,$3) ;; + .|.no|.no,*) m4_ifvaln($4,$4) ;; + *) m4_ifvaln($3,$3,[ + if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $var " 2>&1 >/dev/null + then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $var]) + else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $var"]) + m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $var" + fi ]) ;; +esac +AS_VAR_POPDEF([VAR])dnl +AS_VAR_POPDEF([FLAGS])dnl +]) + + +dnl the only difference - the LANG selection... and the default FLAGS + +AC_DEFUN([AX_CXXFLAGS_GCC_OPTION_OLD], [dnl +AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl +AS_VAR_PUSHDEF([VAR],[ax_cv_cxxflags_gcc_option_$2])dnl +AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)], +VAR,[AS_VAR_SET([VAR],["no, unknown"]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_[]FLAGS="$[]FLAGS" +for ac_arg dnl +in "-pedantic -Werror % m4_ifval($2,$2,-option)" dnl GCC + "-pedantic % m4_ifval($2,$2,-option) %% no, obsolete" dnl new GCC + # +do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + AC_TRY_COMPILE([],[return 0;], + [AS_VAR_SET([VAR],[`echo $ac_arg | sed -e 's,.*% *,,'`]); break]) +done + FLAGS="$ac_save_[]FLAGS" + AC_LANG_RESTORE +]) +m4_ifdef([AS_VAR_COPY],[AS_VAR_COPY([var],[VAR])],[var=AS_VAR_GET([VAR])]) +case ".$var" in + .ok|.ok,*) m4_ifvaln($3,$3) ;; + .|.no|.no,*) m4_ifvaln($4,$4) ;; + *) m4_ifvaln($3,$3,[ + if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $var " 2>&1 >/dev/null + then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $var]) + else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $var"]) + m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $var" + fi ]) ;; +esac +AS_VAR_POPDEF([VAR])dnl +AS_VAR_POPDEF([FLAGS])dnl +]) + +dnl ------------------------------------------------------------------------- + +AC_DEFUN([AX_CFLAGS_GCC_OPTION_NEW], [dnl +AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl +AS_VAR_PUSHDEF([VAR],[ax_cv_cflags_gcc_option_$1])dnl +AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)], +VAR,[AS_VAR_SET([VAR],["no, unknown"]) + AC_LANG_SAVE + AC_LANG_C + ac_save_[]FLAGS="$[]FLAGS" +for ac_arg dnl +in "-pedantic -Werror % m4_ifval($1,$1,-option)" dnl GCC + "-pedantic % m4_ifval($1,$1,-option) %% no, obsolete" dnl new GCC + # +do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + AC_TRY_COMPILE([],[return 0;], + [AS_VAR_SET([VAR],[`echo $ac_arg | sed -e 's,.*% *,,'`]); break]) +done + FLAGS="$ac_save_[]FLAGS" + AC_LANG_RESTORE +]) +m4_ifdef([AS_VAR_COPY],[AS_VAR_COPY([var],[VAR])],[var=AS_VAR_GET([VAR])]) +case ".$var" in + .ok|.ok,*) m4_ifvaln($3,$3) ;; + .|.no|.no,*) m4_ifvaln($4,$4) ;; + *) m4_ifvaln($3,$3,[ + if echo " $[]m4_ifval($2,$2,FLAGS) " | grep " $var " 2>&1 >/dev/null + then AC_RUN_LOG([: m4_ifval($2,$2,FLAGS) does contain $var]) + else AC_RUN_LOG([: m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $var"]) + m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $var" + fi ]) ;; +esac +AS_VAR_POPDEF([VAR])dnl +AS_VAR_POPDEF([FLAGS])dnl +]) + + +dnl the only difference - the LANG selection... and the default FLAGS + +AC_DEFUN([AX_CXXFLAGS_GCC_OPTION_NEW], [dnl +AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl +AS_VAR_PUSHDEF([VAR],[ax_cv_cxxflags_gcc_option_$1])dnl +AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)], +VAR,[AS_VAR_SET([VAR],["no, unknown"]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_[]FLAGS="$[]FLAGS" +for ac_arg dnl +in "-pedantic -Werror % m4_ifval($1,$1,-option)" dnl GCC + "-pedantic % m4_ifval($1,$1,-option) %% no, obsolete" dnl new GCC + # +do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + AC_TRY_COMPILE([],[return 0;], + [AS_VAR_SET([VAR],[`echo $ac_arg | sed -e 's,.*% *,,'`]); break]) +done + FLAGS="$ac_save_[]FLAGS" + AC_LANG_RESTORE +]) +m4_ifdef([AS_VAR_COPY],[AS_VAR_COPY([var],[VAR])],[var=AS_VAR_GET([VAR])]) +case ".$var" in + .ok|.ok,*) m4_ifvaln($3,$3) ;; + .|.no|.no,*) m4_ifvaln($4,$4) ;; + *) m4_ifvaln($3,$3,[ + if echo " $[]m4_ifval($2,$2,FLAGS) " | grep " $var " 2>&1 >/dev/null + then AC_RUN_LOG([: m4_ifval($2,$2,FLAGS) does contain $var]) + else AC_RUN_LOG([: m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $var"]) + m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $var" + fi ]) ;; +esac +AS_VAR_POPDEF([VAR])dnl +AS_VAR_POPDEF([FLAGS])dnl +]) + +AC_DEFUN([AX_CFLAGS_GCC_OPTION],[ifelse(m4_bregexp([$2],[-]),-1, +[AX_CFLAGS_GCC_OPTION_NEW($@)],[AX_CFLAGS_GCC_OPTION_OLD($@)])]) + +AC_DEFUN([AX_CXXFLAGS_GCC_OPTION],[ifelse(m4_bregexp([$2],[-]),-1, +[AX_CXXFLAGS_GCC_OPTION_NEW($@)],[AX_CXXFLAGS_GCC_OPTION_OLD($@)])]) diff --git a/m4/libtool.m4 b/m4/libtool.m4 new file mode 100644 index 0000000..ee80844 --- /dev/null +++ b/m4/libtool.m4 @@ -0,0 +1,8387 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 2014 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 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 this program. If not, see . +]) + +# serial 58 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + +# _LT_CC_BASENAME(CC) +# ------------------- +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. +m4_defun([_LT_CC_BASENAME], +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +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 set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# 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 + +_LT_CC_BASENAME([$compiler]) + +# 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 + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify 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' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from 'configure', and 'config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain=$ac_aux_dir/ltmain.sh +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the 'libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags='_LT_TAGS'dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# 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' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# '#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test 0 = "$lt_write_fail" && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +'$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test 0 != $[#] +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try '$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try '$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test yes = "$silent" && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options that 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 +# Generated automatically by $as_me ($PACKAGE) $VERSION +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +_LT_COPYING +_LT_LIBTOOL_TAGS + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_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 set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # 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 '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# 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 +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +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* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +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* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [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" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS=$save_LDFLAGS + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + 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 yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; 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" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="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" + _LT_TAGVAR(module_expsym_cmds, $1)="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" + m4_if([$1], [CXX], +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`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 "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case $ECHO in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([$with_sysroot]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and where our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test no = "$enable_libtool_lock" || 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 what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); 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 what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test yes = "$lt_cv_prog_gnu_ld"; 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* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); 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*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + 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" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + 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" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + 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 +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# 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 + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment + # 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:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + 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 "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test yes = "[$]$2"; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $3" + 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>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +]) + +if test yes = "[$]$2"; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + 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; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + 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; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # 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 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + 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" && \ + test undefined != "$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`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 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 +]) +if test -n "$lt_cv_sys_max_cmd_len"; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes = "$cross_compiling"; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#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 + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 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; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes != "$enable_dlopen"; 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 + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen=shl_load], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen=dlopen], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && 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" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + 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 +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=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:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + 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 "$_lt_compiler_boilerplate" | $SED '/^$/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_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $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* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + 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 + AC_MSG_RESULT([$hard_links]) + if test no = "$hard_links"; then + AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[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]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then + + # We can hardcode non-existent directories. + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && + # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +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" + AC_MSG_RESULT([yes]) +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" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # 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 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # 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` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + 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" + elif test -n "$lt_multi_os_dir"; then + 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; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +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 + +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; 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 + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.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' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' + # 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' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + 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=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $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 # correct to gnu/linux during the next big refactor + 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,$cc_basename in + yes,*) + # gcc + 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' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + 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 + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + 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 + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # 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' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # 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`' +m4_if([$1], [],[ + 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 # correct to gnu/linux during the next big refactor + 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 + ;; + +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[[23]].*) 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$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + 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 + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + 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=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + 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 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + 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' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + 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 + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # 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 + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # 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 + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) 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;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 # correct to gnu/linux during the next big refactor + 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* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + 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 + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + 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' + ;; + +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 # correct to gnu/linux during the next big refactor + 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 yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 # correct to gnu/linux during the next big refactor + 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=sco + 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 yes = "$with_gnu_ld"; 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 # correct to gnu/linux during the next big refactor + 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 # correct to gnu/linux during the next big refactor + 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 +AC_MSG_RESULT([$dynamic_linker]) +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[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]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program that can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[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 +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" + 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]) +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program that can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + 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 yes = "$with_gnu_ld"; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[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 &1 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[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 +# that 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 + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + 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 + ;; + +haiku*) + 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])(-bit)?( [LM]SB)? 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 glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | 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* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; 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 + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +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 + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[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 + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + 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]) +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM=-lm) + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# 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 ia64 = "$host_cpu"; 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 + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# 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"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$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"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/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, + # D for any global variable and I for any imported 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};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,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 + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # 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 AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && 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 +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#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. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$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_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +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 + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | 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 + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + 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*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | 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). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test yes = "$GCC"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-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_TAGVAR(lt_prog_compiler_pic, $1)='-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 + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + 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_TAGVAR(lt_prog_compiler_pic, $1)='-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_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + + 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). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-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_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # 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'. + _LT_TAGVAR(exclude_expsyms, $1)=['_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. +dnl Note also adjust exclude_expsyms for C++ above. + 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 yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; 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 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$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 + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[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 ia64 != "$host_cpu"; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, 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 install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$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)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$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, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); 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 + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$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. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='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 | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; 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 no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$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 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='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 + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='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 $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $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 + _LT_TAGVAR(ld_shlibs, $1)=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 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** 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 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$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. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test ia64 = "$host_cpu"; 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 GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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 + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + 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. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GCC"; 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 + _LT_TAGVAR(hardcode_direct, $1)=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 + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$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. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$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. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$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. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$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)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-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. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # 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. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=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. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=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*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $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. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + osf3*) + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='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 "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $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='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='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' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='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 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=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 yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT 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. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $_LT_TAGVAR(archive_cmds, $1) 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. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [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]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC=$CC +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$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);}' + +_LT_TAG_COMPILER +# 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 +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## 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_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report what library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC=$lt_save_CC +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # 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(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test ia64 = "$host_cpu"; 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 + 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 + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + 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. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GXX"; 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 + _LT_TAGVAR(hardcode_direct, $1)=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 + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$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. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$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. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$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. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # 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. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $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, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); 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 -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$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. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='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' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=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'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT 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. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD + + ## 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... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf 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). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)=$prev$p + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)=$p + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)=$p + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test no = "$F77"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_F77"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD + + ## 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... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test no = "$FC"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_FC"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD + + ## 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... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_FC" + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## 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_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## 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_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code=$lt_simple_compile_test_code + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f "$lt_ac_sed" && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test 10 -lt "$lt_ac_count" && break + lt_ac_count=`expr $lt_ac_count + 1` + if test "$lt_ac_count" -gt "$lt_ac_max"; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# 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 +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine what file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/m4/ltargz.m4 b/m4/ltargz.m4 new file mode 100644 index 0000000..0908d90 --- /dev/null +++ b/m4/ltargz.m4 @@ -0,0 +1,74 @@ +# Portability macros for glibc argz. -*- Autoconf -*- +# +# Copyright (C) 2004-2007, 2011-2015 Free Software Foundation, Inc. +# Written by Gary V. Vaughan +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 1 ltargz.m4 + +AC_DEFUN([LT_FUNC_ARGZ], [ +AC_CHECK_HEADERS([argz.h], [], [], [AC_INCLUDES_DEFAULT]) + +AC_CHECK_TYPES([error_t], + [], + [AC_DEFINE([error_t], [int], + [Define to a type to use for 'error_t' if it is not otherwise available.]) + AC_DEFINE([__error_t_defined], [1], [Define so that glibc/gnulib argp.h + does not typedef error_t.])], + [#if defined(HAVE_ARGZ_H) +# include +#endif]) + +LT_ARGZ_H= +AC_CHECK_FUNCS([argz_add argz_append argz_count argz_create_sep argz_insert \ + argz_next argz_stringify], [], [LT_ARGZ_H=lt__argz.h; AC_LIBOBJ([lt__argz])]) + +dnl if have system argz functions, allow forced use of +dnl libltdl-supplied implementation (and default to do so +dnl on "known bad" systems). Could use a runtime check, but +dnl (a) detecting malloc issues is notoriously unreliable +dnl (b) only known system that declares argz functions, +dnl provides them, yet they are broken, is cygwin +dnl releases prior to 16-Mar-2007 (1.5.24 and earlier) +dnl So, it's more straightforward simply to special case +dnl this for known bad systems. +AS_IF([test -z "$LT_ARGZ_H"], + [AC_CACHE_CHECK( + [if argz actually works], + [lt_cv_sys_argz_works], + [[case $host_os in #( + *cygwin*) + lt_cv_sys_argz_works=no + if test no != "$cross_compiling"; then + lt_cv_sys_argz_works="guessing no" + else + lt_sed_extract_leading_digits='s/^\([0-9\.]*\).*/\1/' + save_IFS=$IFS + IFS=-. + set x `uname -r | sed -e "$lt_sed_extract_leading_digits"` + IFS=$save_IFS + lt_os_major=${2-0} + lt_os_minor=${3-0} + lt_os_micro=${4-0} + if test 1 -lt "$lt_os_major" \ + || { test 1 -eq "$lt_os_major" \ + && { test 5 -lt "$lt_os_minor" \ + || { test 5 -eq "$lt_os_minor" \ + && test 24 -lt "$lt_os_micro"; }; }; }; then + lt_cv_sys_argz_works=yes + fi + fi + ;; #( + *) lt_cv_sys_argz_works=yes ;; + esac]]) + AS_IF([test yes = "$lt_cv_sys_argz_works"], + [AC_DEFINE([HAVE_WORKING_ARGZ], 1, + [This value is set to 1 to indicate that the system argz facility works])], + [LT_ARGZ_H=lt__argz.h + AC_LIBOBJ([lt__argz])])]) + +AC_SUBST([LT_ARGZ_H]) +]) diff --git a/m4/ltdl.m4 b/m4/ltdl.m4 new file mode 100644 index 0000000..560522a --- /dev/null +++ b/m4/ltdl.m4 @@ -0,0 +1,909 @@ +# ltdl.m4 - Configure ltdl for the target system. -*-Autoconf-*- +# +# Copyright (C) 1999-2008, 2011-2015 Free Software Foundation, Inc. +# Written by Thomas Tanner, 1999 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 20 LTDL_INIT + +# LT_CONFIG_LTDL_DIR(DIRECTORY, [LTDL-MODE]) +# ------------------------------------------ +# DIRECTORY contains the libltdl sources. It is okay to call this +# function multiple times, as long as the same DIRECTORY is always given. +AC_DEFUN([LT_CONFIG_LTDL_DIR], +[AC_BEFORE([$0], [LTDL_INIT]) +_$0($*) +])# LT_CONFIG_LTDL_DIR + +# We break this out into a separate macro, so that we can call it safely +# internally without being caught accidentally by the sed scan in libtoolize. +m4_defun([_LT_CONFIG_LTDL_DIR], +[dnl remove trailing slashes +m4_pushdef([_ARG_DIR], m4_bpatsubst([$1], [/*$])) +m4_case(_LTDL_DIR, + [], [dnl only set lt_ltdl_dir if _ARG_DIR is not simply '.' + m4_if(_ARG_DIR, [.], + [], + [m4_define([_LTDL_DIR], _ARG_DIR) + _LT_SHELL_INIT([lt_ltdl_dir=']_ARG_DIR['])])], + [m4_if(_ARG_DIR, _LTDL_DIR, + [], + [m4_fatal([multiple libltdl directories: ']_LTDL_DIR[', ']_ARG_DIR['])])]) +m4_popdef([_ARG_DIR]) +])# _LT_CONFIG_LTDL_DIR + +# Initialise: +m4_define([_LTDL_DIR], []) + + +# _LT_BUILD_PREFIX +# ---------------- +# If Autoconf is new enough, expand to '$(top_build_prefix)', otherwise +# to '$(top_builddir)/'. +m4_define([_LT_BUILD_PREFIX], +[m4_ifdef([AC_AUTOCONF_VERSION], + [m4_if(m4_version_compare(m4_defn([AC_AUTOCONF_VERSION]), [2.62]), + [-1], [m4_ifdef([_AC_HAVE_TOP_BUILD_PREFIX], + [$(top_build_prefix)], + [$(top_builddir)/])], + [$(top_build_prefix)])], + [$(top_builddir)/])[]dnl +]) + + +# LTDL_CONVENIENCE +# ---------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. LIBLTDL will be prefixed with +# '$(top_build_prefix)' if available, otherwise with '$(top_builddir)/', +# and LTDLINCL will be prefixed with '$(top_srcdir)/' (note the single +# quotes!). If your package is not flat and you're not using automake, +# define top_build_prefix, top_builddir, and top_srcdir appropriately +# in your Makefiles. +AC_DEFUN([LTDL_CONVENIENCE], +[AC_BEFORE([$0], [LTDL_INIT])dnl +dnl Although the argument is deprecated and no longer documented, +dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one +dnl here make sure it is the same as any other declaration of libltdl's +dnl location! This also ensures lt_ltdl_dir is set when configure.ac is +dnl not yet using an explicit LT_CONFIG_LTDL_DIR. +m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl +_$0() +])# LTDL_CONVENIENCE + +# AC_LIBLTDL_CONVENIENCE accepted a directory argument in older libtools, +# now we have LT_CONFIG_LTDL_DIR: +AU_DEFUN([AC_LIBLTDL_CONVENIENCE], +[_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +_LTDL_CONVENIENCE]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBLTDL_CONVENIENCE], []) + + +# _LTDL_CONVENIENCE +# ----------------- +# Code shared by LTDL_CONVENIENCE and LTDL_INIT([convenience]). +m4_defun([_LTDL_CONVENIENCE], +[case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; +esac +LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdlc.la" +LTDLDEPS=$LIBLTDL +LTDLINCL='-I$(top_srcdir)'"${lt_ltdl_dir+/$lt_ltdl_dir}" + +AC_SUBST([LIBLTDL]) +AC_SUBST([LTDLDEPS]) +AC_SUBST([LTDLINCL]) + +# For backwards non-gettext consistent compatibility... +INCLTDL=$LTDLINCL +AC_SUBST([INCLTDL]) +])# _LTDL_CONVENIENCE + + +# LTDL_INSTALLABLE +# ---------------- +# sets LIBLTDL to the link flags for the libltdl installable library +# and LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called from here. If an installed libltdl +# is not found, LIBLTDL will be prefixed with '$(top_build_prefix)' if +# available, otherwise with '$(top_builddir)/', and LTDLINCL will be +# prefixed with '$(top_srcdir)/' (note the single quotes!). If your +# package is not flat and you're not using automake, define top_build_prefix, +# top_builddir, and top_srcdir appropriately in your Makefiles. +# In the future, this macro may have to be called after LT_INIT. +AC_DEFUN([LTDL_INSTALLABLE], +[AC_BEFORE([$0], [LTDL_INIT])dnl +dnl Although the argument is deprecated and no longer documented, +dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one +dnl here make sure it is the same as any other declaration of libltdl's +dnl location! This also ensures lt_ltdl_dir is set when configure.ac is +dnl not yet using an explicit LT_CONFIG_LTDL_DIR. +m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl +_$0() +])# LTDL_INSTALLABLE + +# AC_LIBLTDL_INSTALLABLE accepted a directory argument in older libtools, +# now we have LT_CONFIG_LTDL_DIR: +AU_DEFUN([AC_LIBLTDL_INSTALLABLE], +[_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +_LTDL_INSTALLABLE]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBLTDL_INSTALLABLE], []) + + +# _LTDL_INSTALLABLE +# ----------------- +# Code shared by LTDL_INSTALLABLE and LTDL_INIT([installable]). +m4_defun([_LTDL_INSTALLABLE], +[if test -f "$prefix/lib/libltdl.la"; then + lt_save_LDFLAGS=$LDFLAGS + LDFLAGS="-L$prefix/lib $LDFLAGS" + AC_CHECK_LIB([ltdl], [lt_dlinit], [lt_lib_ltdl=yes]) + LDFLAGS=$lt_save_LDFLAGS + if test yes = "${lt_lib_ltdl-no}"; then + if test yes != "$enable_ltdl_install"; then + # Don't overwrite $prefix/lib/libltdl.la without --enable-ltdl-install + AC_MSG_WARN([not overwriting libltdl at $prefix, force with '--enable-ltdl-install']) + enable_ltdl_install=no + fi + elif test no = "$enable_ltdl_install"; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + fi +fi + +# If configure.ac declared an installable ltdl, and the user didn't override +# with --disable-ltdl-install, we will install the shipped libltdl. +case $enable_ltdl_install in + no) ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL=-lltdl + LTDLDEPS= + LTDLINCL= + ;; + *) enable_ltdl_install=yes + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdl.la" + LTDLDEPS=$LIBLTDL + LTDLINCL='-I$(top_srcdir)'"${lt_ltdl_dir+/$lt_ltdl_dir}" + ;; +esac + +AC_SUBST([LIBLTDL]) +AC_SUBST([LTDLDEPS]) +AC_SUBST([LTDLINCL]) + +# For backwards non-gettext consistent compatibility... +INCLTDL=$LTDLINCL +AC_SUBST([INCLTDL]) +])# LTDL_INSTALLABLE + + +# _LTDL_MODE_DISPATCH +# ------------------- +m4_define([_LTDL_MODE_DISPATCH], +[dnl If _LTDL_DIR is '.', then we are configuring libltdl itself: +m4_if(_LTDL_DIR, [], + [], + dnl if _LTDL_MODE was not set already, the default value is 'subproject': + [m4_case(m4_default(_LTDL_MODE, [subproject]), + [subproject], [AC_CONFIG_SUBDIRS(_LTDL_DIR) + _LT_SHELL_INIT([lt_dlopen_dir=$lt_ltdl_dir])], + [nonrecursive], [_LT_SHELL_INIT([lt_dlopen_dir=$lt_ltdl_dir; lt_libobj_prefix=$lt_ltdl_dir/])], + [recursive], [], + [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])])dnl +dnl Be careful not to expand twice: +m4_define([$0], []) +])# _LTDL_MODE_DISPATCH + + +# _LT_LIBOBJ(MODULE_NAME) +# ----------------------- +# Like AC_LIBOBJ, except that MODULE_NAME goes into _LT_LIBOBJS instead +# of into LIBOBJS. +AC_DEFUN([_LT_LIBOBJ], [ + m4_pattern_allow([^_LT_LIBOBJS$]) + _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext" +])# _LT_LIBOBJS + + +# LTDL_INIT([OPTIONS]) +# -------------------- +# Clients of libltdl can use this macro to allow the installer to +# choose between a shipped copy of the ltdl sources or a preinstalled +# version of the library. If the shipped ltdl sources are not in a +# subdirectory named libltdl, the directory name must be given by +# LT_CONFIG_LTDL_DIR. +AC_DEFUN([LTDL_INIT], +[dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +dnl We need to keep our own list of libobjs separate from our parent project, +dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while +dnl we look for our own LIBOBJs. +m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ])) +m4_pushdef([AC_LIBSOURCES]) + +dnl If not otherwise defined, default to the 1.5.x compatible subproject mode: +m4_if(_LTDL_MODE, [], + [m4_define([_LTDL_MODE], m4_default([$2], [subproject])) + m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])], + [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])]) + +AC_ARG_WITH([included_ltdl], + [AS_HELP_STRING([--with-included-ltdl], + [use the GNU ltdl sources included here])]) + +if test yes != "$with_included_ltdl"; then + # We are not being forced to use the included libltdl sources, so + # decide whether there is a useful installed version we can use. + AC_CHECK_HEADER([ltdl.h], + [AC_CHECK_DECL([lt_dlinterface_register], + [AC_CHECK_LIB([ltdl], [lt_dladvise_preload], + [with_included_ltdl=no], + [with_included_ltdl=yes])], + [with_included_ltdl=yes], + [AC_INCLUDES_DEFAULT + #include ])], + [with_included_ltdl=yes], + [AC_INCLUDES_DEFAULT] + ) +fi + +dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE +dnl was called yet, then for old times' sake, we assume libltdl is in an +dnl eponymous directory: +AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])]) + +AC_ARG_WITH([ltdl_include], + [AS_HELP_STRING([--with-ltdl-include=DIR], + [use the ltdl headers installed in DIR])]) + +if test -n "$with_ltdl_include"; then + if test -f "$with_ltdl_include/ltdl.h"; then : + else + AC_MSG_ERROR([invalid ltdl include directory: '$with_ltdl_include']) + fi +else + with_ltdl_include=no +fi + +AC_ARG_WITH([ltdl_lib], + [AS_HELP_STRING([--with-ltdl-lib=DIR], + [use the libltdl.la installed in DIR])]) + +if test -n "$with_ltdl_lib"; then + if test -f "$with_ltdl_lib/libltdl.la"; then : + else + AC_MSG_ERROR([invalid ltdl library directory: '$with_ltdl_lib']) + fi +else + with_ltdl_lib=no +fi + +case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in + ,yes,no,no,) + m4_case(m4_default(_LTDL_TYPE, [convenience]), + [convenience], [_LTDL_CONVENIENCE], + [installable], [_LTDL_INSTALLABLE], + [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)]) + ;; + ,no,no,no,) + # If the included ltdl is not to be used, then use the + # preinstalled libltdl we found. + AC_DEFINE([HAVE_LTDL], [1], + [Define this if a modern libltdl is already installed]) + LIBLTDL=-lltdl + LTDLDEPS= + LTDLINCL= + ;; + ,no*,no,*) + AC_MSG_ERROR(['--with-ltdl-include' and '--with-ltdl-lib' options must be used together]) + ;; + *) with_included_ltdl=no + LIBLTDL="-L$with_ltdl_lib -lltdl" + LTDLDEPS= + LTDLINCL=-I$with_ltdl_include + ;; +esac +INCLTDL=$LTDLINCL + +# Report our decision... +AC_MSG_CHECKING([where to find libltdl headers]) +AC_MSG_RESULT([$LTDLINCL]) +AC_MSG_CHECKING([where to find libltdl library]) +AC_MSG_RESULT([$LIBLTDL]) + +_LTDL_SETUP + +dnl restore autoconf definition. +m4_popdef([AC_LIBOBJ]) +m4_popdef([AC_LIBSOURCES]) + +AC_CONFIG_COMMANDS_PRE([ + _ltdl_libobjs= + _ltdl_ltlibobjs= + if test -n "$_LT_LIBOBJS"; then + # Remove the extension. + _lt_sed_drop_objext='s/\.o$//;s/\.obj$//' + for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do + _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext" + _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo" + done + fi + AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs]) + AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs]) +]) + +# Only expand once: +m4_define([LTDL_INIT]) +])# LTDL_INIT + +# Old names: +AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)]) +AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)]) +AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIB_LTDL], []) +dnl AC_DEFUN([AC_WITH_LTDL], []) +dnl AC_DEFUN([LT_WITH_LTDL], []) + + +# _LTDL_SETUP +# ----------- +# Perform all the checks necessary for compilation of the ltdl objects +# -- including compiler checks and header checks. This is a public +# interface mainly for the benefit of libltdl's own configure.ac, most +# other users should call LTDL_INIT instead. +AC_DEFUN([_LTDL_SETUP], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_SYS_MODULE_EXT])dnl +AC_REQUIRE([LT_SYS_MODULE_PATH])dnl +AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl +AC_REQUIRE([LT_LIB_DLLOAD])dnl +AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl +AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl +AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl +AC_REQUIRE([LT_FUNC_ARGZ])dnl + +m4_require([_LT_CHECK_OBJDIR])dnl +m4_require([_LT_HEADER_DLFCN])dnl +m4_require([_LT_CHECK_DLPREOPEN])dnl +m4_require([_LT_DECL_SED])dnl + +dnl Don't require this, or it will be expanded earlier than the code +dnl that sets the variables it relies on: +_LT_ENABLE_INSTALL + +dnl _LTDL_MODE specific code must be called at least once: +_LTDL_MODE_DISPATCH + +# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS +# the user used. This is so that ltdl.h can pick up the parent projects +# config.h file, The first file in AC_CONFIG_HEADERS must contain the +# definitions required by ltdl.c. +# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility). +AC_CONFIG_COMMANDS_PRE([dnl +m4_pattern_allow([^LT_CONFIG_H$])dnl +m4_ifset([AH_HEADER], + [LT_CONFIG_H=AH_HEADER], + [m4_ifset([AC_LIST_HEADERS], + [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's|^[[ ]]*||;s|[[ :]].*$||'`], + [])])]) +AC_SUBST([LT_CONFIG_H]) + +AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h], + [], [], [AC_INCLUDES_DEFAULT]) + +AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])]) +AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])]) + +m4_pattern_allow([LT_LIBEXT])dnl +AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension]) + +name= +eval "lt_libprefix=\"$libname_spec\"" +m4_pattern_allow([LT_LIBPREFIX])dnl +AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix]) + +name=ltdl +eval "LTDLOPEN=\"$libname_spec\"" +AC_SUBST([LTDLOPEN]) +])# _LTDL_SETUP + + +# _LT_ENABLE_INSTALL +# ------------------ +m4_define([_LT_ENABLE_INSTALL], +[AC_ARG_ENABLE([ltdl-install], + [AS_HELP_STRING([--enable-ltdl-install], [install libltdl])]) + +case ,$enable_ltdl_install,$enable_ltdl_convenience in + *yes*) ;; + *) enable_ltdl_convenience=yes ;; +esac + +m4_ifdef([AM_CONDITIONAL], +[AM_CONDITIONAL(INSTALL_LTDL, test no != "${enable_ltdl_install-no}") + AM_CONDITIONAL(CONVENIENCE_LTDL, test no != "${enable_ltdl_convenience-no}")]) +])# _LT_ENABLE_INSTALL + + +# LT_SYS_DLOPEN_DEPLIBS +# --------------------- +AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_CACHE_CHECK([whether deplibs are loaded by dlopen], + [lt_cv_sys_dlopen_deplibs], + [# PORTME does your system automatically load deplibs for dlopen? + # or its logical equivalent (e.g. shl_load for HP-UX < 11) + # For now, we just catch OSes we know something about -- in the + # future, we'll try test this programmatically. + lt_cv_sys_dlopen_deplibs=unknown + case $host_os in + aix3*|aix4.1.*|aix4.2.*) + # Unknown whether this is true for these versions of AIX, but + # we want this 'case' here to explicitly catch those versions. + lt_cv_sys_dlopen_deplibs=unknown + ;; + aix[[4-9]]*) + lt_cv_sys_dlopen_deplibs=yes + ;; + amigaos*) + case $host_cpu in + powerpc) + lt_cv_sys_dlopen_deplibs=no + ;; + esac + ;; + bitrig*) + lt_cv_sys_dlopen_deplibs=yes + ;; + darwin*) + # Assuming the user has installed a libdl from somewhere, this is true + # If you are looking for one http://www.opendarwin.org/projects/dlcompat + lt_cv_sys_dlopen_deplibs=yes + ;; + freebsd* | dragonfly*) + lt_cv_sys_dlopen_deplibs=yes + ;; + gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu) + # GNU and its variants, using gnu ld.so (Glibc) + lt_cv_sys_dlopen_deplibs=yes + ;; + hpux10*|hpux11*) + lt_cv_sys_dlopen_deplibs=yes + ;; + interix*) + lt_cv_sys_dlopen_deplibs=yes + ;; + irix[[12345]]*|irix6.[[01]]*) + # Catch all versions of IRIX before 6.2, and indicate that we don't + # know how it worked for any of those versions. + lt_cv_sys_dlopen_deplibs=unknown + ;; + irix*) + # The case above catches anything before 6.2, and it's known that + # at 6.2 and later dlopen does load deplibs. + lt_cv_sys_dlopen_deplibs=yes + ;; + netbsd* | netbsdelf*-gnu) + lt_cv_sys_dlopen_deplibs=yes + ;; + openbsd*) + lt_cv_sys_dlopen_deplibs=yes + ;; + osf[[1234]]*) + # dlopen did load deplibs (at least at 4.x), but until the 5.x series, + # it did *not* use an RPATH in a shared library to find objects the + # library depends on, so we explicitly say 'no'. + lt_cv_sys_dlopen_deplibs=no + ;; + osf5.0|osf5.0a|osf5.1) + # dlopen *does* load deplibs and with the right loader patch applied + # it even uses RPATH in a shared library to search for shared objects + # that the library depends on, but there's no easy way to know if that + # patch is installed. Since this is the case, all we can really + # say is unknown -- it depends on the patch being installed. If + # it is, this changes to 'yes'. Without it, it would be 'no'. + lt_cv_sys_dlopen_deplibs=unknown + ;; + osf*) + # the two cases above should catch all versions of osf <= 5.1. Read + # the comments above for what we know about them. + # At > 5.1, deplibs are loaded *and* any RPATH in a shared library + # is used to find them so we can finally say 'yes'. + lt_cv_sys_dlopen_deplibs=yes + ;; + qnx*) + lt_cv_sys_dlopen_deplibs=yes + ;; + solaris*) + lt_cv_sys_dlopen_deplibs=yes + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + libltdl_cv_sys_dlopen_deplibs=yes + ;; + esac + ]) +if test yes != "$lt_cv_sys_dlopen_deplibs"; then + AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1], + [Define if the OS needs help to load dependent libraries for dlopen().]) +fi +])# LT_SYS_DLOPEN_DEPLIBS + +# Old name: +AU_ALIAS([AC_LTDL_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], []) + + +# LT_SYS_MODULE_EXT +# ----------------- +AC_DEFUN([LT_SYS_MODULE_EXT], +[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +AC_CACHE_CHECK([what extension is used for runtime loadable modules], + [libltdl_cv_shlibext], +[ +module=yes +eval libltdl_cv_shlibext=$shrext_cmds +module=no +eval libltdl_cv_shrext=$shrext_cmds + ]) +if test -n "$libltdl_cv_shlibext"; then + m4_pattern_allow([LT_MODULE_EXT])dnl + AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"], + [Define to the extension used for runtime loadable modules, say, ".so".]) +fi +if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then + m4_pattern_allow([LT_SHARED_EXT])dnl + AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"], + [Define to the shared library suffix, say, ".dylib".]) +fi +if test -n "$shared_archive_member_spec"; then + m4_pattern_allow([LT_SHARED_LIB_MEMBER])dnl + AC_DEFINE_UNQUOTED([LT_SHARED_LIB_MEMBER], ["($shared_archive_member_spec.o)"], + [Define to the shared archive member specification, say "(shr.o)".]) +fi +])# LT_SYS_MODULE_EXT + +# Old name: +AU_ALIAS([AC_LTDL_SHLIBEXT], [LT_SYS_MODULE_EXT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LTDL_SHLIBEXT], []) + + +# LT_SYS_MODULE_PATH +# ------------------ +AC_DEFUN([LT_SYS_MODULE_PATH], +[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +AC_CACHE_CHECK([what variable specifies run-time module search path], + [lt_cv_module_path_var], [lt_cv_module_path_var=$shlibpath_var]) +if test -n "$lt_cv_module_path_var"; then + m4_pattern_allow([LT_MODULE_PATH_VAR])dnl + AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"], + [Define to the name of the environment variable that determines the run-time module search path.]) +fi +])# LT_SYS_MODULE_PATH + +# Old name: +AU_ALIAS([AC_LTDL_SHLIBPATH], [LT_SYS_MODULE_PATH]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LTDL_SHLIBPATH], []) + + +# LT_SYS_DLSEARCH_PATH +# -------------------- +AC_DEFUN([LT_SYS_DLSEARCH_PATH], +[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +AC_CACHE_CHECK([for the default library search path], + [lt_cv_sys_dlsearch_path], + [lt_cv_sys_dlsearch_path=$sys_lib_dlsearch_path_spec]) +if test -n "$lt_cv_sys_dlsearch_path"; then + sys_dlsearch_path= + for dir in $lt_cv_sys_dlsearch_path; do + if test -z "$sys_dlsearch_path"; then + sys_dlsearch_path=$dir + else + sys_dlsearch_path=$sys_dlsearch_path$PATH_SEPARATOR$dir + fi + done + m4_pattern_allow([LT_DLSEARCH_PATH])dnl + AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"], + [Define to the system default library search path.]) +fi +])# LT_SYS_DLSEARCH_PATH + +# Old name: +AU_ALIAS([AC_LTDL_SYSSEARCHPATH], [LT_SYS_DLSEARCH_PATH]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LTDL_SYSSEARCHPATH], []) + + +# _LT_CHECK_DLPREOPEN +# ------------------- +m4_defun([_LT_CHECK_DLPREOPEN], +[m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +AC_CACHE_CHECK([whether libtool supports -dlopen/-dlpreopen], + [libltdl_cv_preloaded_symbols], + [if test -n "$lt_cv_sys_global_symbol_pipe"; then + libltdl_cv_preloaded_symbols=yes + else + libltdl_cv_preloaded_symbols=no + fi + ]) +if test yes = "$libltdl_cv_preloaded_symbols"; then + AC_DEFINE([HAVE_PRELOADED_SYMBOLS], [1], + [Define if libtool can extract symbol lists from object files.]) +fi +])# _LT_CHECK_DLPREOPEN + + +# LT_LIB_DLLOAD +# ------------- +AC_DEFUN([LT_LIB_DLLOAD], +[m4_pattern_allow([^LT_DLLOADERS$]) +LT_DLLOADERS= +AC_SUBST([LT_DLLOADERS]) + +AC_LANG_PUSH([C]) +lt_dlload_save_LIBS=$LIBS + +LIBADD_DLOPEN= +AC_SEARCH_LIBS([dlopen], [dl], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) + if test "$ac_cv_search_dlopen" != "none required"; then + LIBADD_DLOPEN=-ldl + fi + libltdl_cv_lib_dl_dlopen=yes + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H +# include +#endif + ]], [[dlopen(0, 0);]])], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) + libltdl_cv_func_dlopen=yes + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], + [AC_CHECK_LIB([svld], [dlopen], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) + LIBADD_DLOPEN=-lsvld libltdl_cv_func_dlopen=yes + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])]) +if test yes = "$libltdl_cv_func_dlopen" || test yes = "$libltdl_cv_lib_dl_dlopen" +then + lt_save_LIBS=$LIBS + LIBS="$LIBS $LIBADD_DLOPEN" + AC_CHECK_FUNCS([dlerror]) + LIBS=$lt_save_LIBS +fi +AC_SUBST([LIBADD_DLOPEN]) + +LIBADD_SHL_LOAD= +AC_CHECK_FUNC([shl_load], + [AC_DEFINE([HAVE_SHL_LOAD], [1], + [Define if you have the shl_load function.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"], + [AC_CHECK_LIB([dld], [shl_load], + [AC_DEFINE([HAVE_SHL_LOAD], [1], + [Define if you have the shl_load function.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la" + LIBADD_SHL_LOAD=-ldld])]) +AC_SUBST([LIBADD_SHL_LOAD]) + +case $host_os in +darwin[[1567]].*) +# We only want this for pre-Mac OS X 10.4. + AC_CHECK_FUNC([_dyld_func_lookup], + [AC_DEFINE([HAVE_DYLD], [1], + [Define if you have the _dyld_func_lookup function.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"]) + ;; +beos*) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la" + ;; +cygwin* | mingw* | pw32*) + AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include ]]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la" + ;; +esac + +AC_CHECK_LIB([dld], [dld_link], + [AC_DEFINE([HAVE_DLD], [1], + [Define if you have the GNU dld library.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"]) +AC_SUBST([LIBADD_DLD_LINK]) + +m4_pattern_allow([^LT_DLPREOPEN$]) +LT_DLPREOPEN= +if test -n "$LT_DLLOADERS" +then + for lt_loader in $LT_DLLOADERS; do + LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader " + done + AC_DEFINE([HAVE_LIBDLLOADER], [1], + [Define if libdlloader will be built on this platform]) +fi +AC_SUBST([LT_DLPREOPEN]) + +dnl This isn't used anymore, but set it for backwards compatibility +LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD" +AC_SUBST([LIBADD_DL]) + +LIBS=$lt_dlload_save_LIBS +AC_LANG_POP +])# LT_LIB_DLLOAD + +# Old name: +AU_ALIAS([AC_LTDL_DLLIB], [LT_LIB_DLLOAD]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LTDL_DLLIB], []) + + +# LT_SYS_SYMBOL_USCORE +# -------------------- +# does the compiler prefix global symbols with an underscore? +AC_DEFUN([LT_SYS_SYMBOL_USCORE], +[m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +AC_CACHE_CHECK([for _ prefix in compiled symbols], + [lt_cv_sys_symbol_underscore], + [lt_cv_sys_symbol_underscore=no + cat > conftest.$ac_ext <<_LT_EOF +void nm_test_func(){} +int main(){nm_test_func;return 0;} +_LT_EOF + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + ac_nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then + # See whether the symbols have a leading underscore. + if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then + lt_cv_sys_symbol_underscore=yes + else + if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then + : + else + echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD + fi + fi + else + echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.c >&AS_MESSAGE_LOG_FD + fi + rm -rf conftest* + ]) + sys_symbol_underscore=$lt_cv_sys_symbol_underscore + AC_SUBST([sys_symbol_underscore]) +])# LT_SYS_SYMBOL_USCORE + +# Old name: +AU_ALIAS([AC_LTDL_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LTDL_SYMBOL_USCORE], []) + + +# LT_FUNC_DLSYM_USCORE +# -------------------- +AC_DEFUN([LT_FUNC_DLSYM_USCORE], +[AC_REQUIRE([_LT_COMPILER_PIC])dnl for lt_prog_compiler_wl +AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl for lt_cv_sys_symbol_underscore +AC_REQUIRE([LT_SYS_MODULE_EXT])dnl for libltdl_cv_shlibext +if test yes = "$lt_cv_sys_symbol_underscore"; then + if test yes = "$libltdl_cv_func_dlopen" || test yes = "$libltdl_cv_lib_dl_dlopen"; then + AC_CACHE_CHECK([whether we have to add an underscore for dlsym], + [libltdl_cv_need_uscore], + [libltdl_cv_need_uscore=unknown + dlsym_uscore_save_LIBS=$LIBS + LIBS="$LIBS $LIBADD_DLOPEN" + libname=conftmod # stay within 8.3 filename limits! + cat >$libname.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif +int fnord () { return 42; }] +_LT_EOF + + # ltfn_module_cmds module_cmds + # Execute tilde-delimited MODULE_CMDS with environment primed for + # $module_cmds or $archive_cmds type content. + ltfn_module_cmds () + {( # subshell avoids polluting parent global environment + module_cmds_save_ifs=$IFS; IFS='~' + for cmd in @S|@1; do + IFS=$module_cmds_save_ifs + libobjs=$libname.$ac_objext; lib=$libname$libltdl_cv_shlibext + rpath=/not-exists; soname=$libname$libltdl_cv_shlibext; output_objdir=. + major=; versuffix=; verstring=; deplibs= + ECHO=echo; wl=$lt_prog_compiler_wl; allow_undefined_flag= + eval $cmd + done + IFS=$module_cmds_save_ifs + )} + + # Compile a loadable module using libtool macro expansion results. + $CC $pic_flag -c $libname.$ac_ext + ltfn_module_cmds "${module_cmds:-$archive_cmds}" + + # Try to fetch fnord with dlsym(). + libltdl_dlunknown=0; libltdl_dlnouscore=1; libltdl_dluscore=2 + cat >conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" +#if HAVE_DLFCN_H +#include +#endif +#include +#ifndef RTLD_GLOBAL +# ifdef DL_GLOBAL +# define RTLD_GLOBAL DL_GLOBAL +# else +# define RTLD_GLOBAL 0 +# endif +#endif +#ifndef RTLD_NOW +# ifdef DL_NOW +# define RTLD_NOW DL_NOW +# else +# define RTLD_NOW 0 +# endif +#endif +int main () { + void *handle = dlopen ("`pwd`/$libname$libltdl_cv_shlibext", RTLD_GLOBAL|RTLD_NOW); + int status = $libltdl_dlunknown; + if (handle) { + if (dlsym (handle, "fnord")) + status = $libltdl_dlnouscore; + else { + if (dlsym (handle, "_fnord")) + status = $libltdl_dluscore; + else + puts (dlerror ()); + } + dlclose (handle); + } else + puts (dlerror ()); + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + libltdl_status=$? + case x$libltdl_status in + x$libltdl_dlnouscore) libltdl_cv_need_uscore=no ;; + x$libltdl_dluscore) libltdl_cv_need_uscore=yes ;; + x*) libltdl_cv_need_uscore=unknown ;; + esac + fi + rm -rf conftest* $libname* + LIBS=$dlsym_uscore_save_LIBS + ]) + fi +fi + +if test yes = "$libltdl_cv_need_uscore"; then + AC_DEFINE([NEED_USCORE], [1], + [Define if dlsym() requires a leading underscore in symbol names.]) +fi +])# LT_FUNC_DLSYM_USCORE + +# Old name: +AU_ALIAS([AC_LTDL_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LTDL_DLSYM_USCORE], []) diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4 new file mode 100644 index 0000000..94b0829 --- /dev/null +++ b/m4/ltoptions.m4 @@ -0,0 +1,437 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 8 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option '$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl 'shared' nor 'disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the 'shared' and +# 'disable-shared' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [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], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the 'static' and +# 'disable-static' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [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], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the 'fast-install' +# and 'disable-fast-install' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [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], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' +# LT_INIT options. +# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [pic_mode=m4_default([$1], [default])]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4 new file mode 100644 index 0000000..48bc934 --- /dev/null +++ b/m4/ltsugar.m4 @@ -0,0 +1,124 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59, which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/m4/ltversion.m4 b/m4/ltversion.m4 new file mode 100644 index 0000000..fa04b52 --- /dev/null +++ b/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 4179 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.6' +macro_revision='2.4.6' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4 new file mode 100644 index 0000000..c6b26f8 --- /dev/null +++ b/m4/lt~obsolete.m4 @@ -0,0 +1,99 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/netlink.patch b/netlink.patch new file mode 100644 index 0000000..faa873b --- /dev/null +++ b/netlink.patch @@ -0,0 +1,46 @@ +diff --git a/include/linux/netfilter/nfnetlink.h b/include/linux/netfilter/nfnetlink.h +index 361d6b5..2b11fc1 100644 +--- a/include/linux/netfilter/nfnetlink.h ++++ b/include/linux/netfilter/nfnetlink.h +@@ -47,7 +47,8 @@ struct nfgenmsg { + #define NFNL_SUBSYS_QUEUE 3 + #define NFNL_SUBSYS_ULOG 4 + #define NFNL_SUBSYS_OSF 5 +-#define NFNL_SUBSYS_COUNT 6 ++#define NFNL_SUBSYS_IPSET 6 ++#define NFNL_SUBSYS_COUNT 7 + + #ifdef __KERNEL__ + +diff --git a/include/net/netlink.h b/include/net/netlink.h +index 373f1a9..8a3906a 100644 +--- a/include/net/netlink.h ++++ b/include/net/netlink.h +@@ -856,18 +856,27 @@ static inline int nla_put_msecs(struct sk_buff *skb, int attrtype, + #define NLA_PUT_BE16(skb, attrtype, value) \ + NLA_PUT_TYPE(skb, __be16, attrtype, value) + ++#define NLA_PUT_NET16(skb, attrtype, value) \ ++ NLA_PUT_BE16(skb, attrtype | NLA_F_NET_BYTEORDER, value) ++ + #define NLA_PUT_U32(skb, attrtype, value) \ + NLA_PUT_TYPE(skb, u32, attrtype, value) + + #define NLA_PUT_BE32(skb, attrtype, value) \ + NLA_PUT_TYPE(skb, __be32, attrtype, value) + ++#define NLA_PUT_NET32(skb, attrtype, value) \ ++ NLA_PUT_BE32(skb, attrtype | NLA_F_NET_BYTEORDER, value) ++ + #define NLA_PUT_U64(skb, attrtype, value) \ + NLA_PUT_TYPE(skb, u64, attrtype, value) + + #define NLA_PUT_BE64(skb, attrtype, value) \ + NLA_PUT_TYPE(skb, __be64, attrtype, value) + ++#define NLA_PUT_NET64(skb, attrtype, value) \ ++ NLA_PUT_BE64(skb, attrtype | NLA_F_NET_BYTEORDER, value) ++ + #define NLA_PUT_STRING(skb, attrtype, value) \ + NLA_PUT(skb, attrtype, strlen(value) + 1, value) + diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..6166aba --- /dev/null +++ b/src/.gitignore @@ -0,0 +1 @@ +/ipset diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..438fcec --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,21 @@ +include $(top_srcdir)/Make_global.am + +sbin_PROGRAMS = ipset +ipset_SOURCES = ipset.c +ipset_LDADD = ../lib/libipset.la + +if ENABLE_SETTYPE_MODULES +AM_LDFLAGS = -shared +else +if ENABLE_STATIC +AM_LDFLAGS = -static +endif +endif + +dist_man_MANS = ipset.8 + +sparse-check: $(ipset_SOURCES:.c=.d) + +%.d: %.c + $(IPSET_AM_V_CHECK)\ + $(SPARSE) -I.. $(SPARSE_FLAGS) $(AM_CFLAGS) $(AM_CPPFLAGS) $< || : diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 0000000..e1fd112 --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,869 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 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@ + +# This is _NOT_ the library release version, it's an API version. +# Please read Chapter 6 "Library interface versions" of the libtool +# documentation before making any modification +# +# http://sources.redhat.com/autobook/autobook/autobook_91.html +# +# The version scheme used by Libtool tracks interfaces, where an interface +# is the set of exported entry points into the library. All Libtool libraries +# start with `-version-info' set to `0:0:0' -- this will be the default +# version number if you don't explicitly set it on the Libtool link command +# line. The meaning of these numbers (from left to right) is as follows: +# +# current +# The number of the current interface exported by the library. A current +# value of `0', means that you are calling the interface exported by this +# library interface 0. +# +# revision +# The implementation number of the most recent interface exported by this +# library. In this case, a revision value of `0' means that this is the +# first implementation of the interface. +# +# If the next release of this library exports the same interface, but has +# a different implementation (perhaps some bugs have been fixed), the +# revision number will be higher, but current number will be the same. +# In that case, when given a choice, the library with the highest revision +# will always be used by the runtime loader. +# +# age +# The number of previous additional interfaces supported by this library. +# If age were `2', then this library can be linked into executables which +# were built with a release of this library that exported the current +# interface number, current, or any of the previous two interfaces. +# +# By definition age must be less than or equal to current. At the outset, +# only the first ever interface is implemented, so age can only be `0'. +# +# 1. If you have changed any of the sources for this library, the revision +# number must be incremented. +# This is a new revision of the current interface. +# +# 2. If the interface has changed, then current must be incremented, and +# revision reset to `0'. +# This is the first revision of a new interface. +# +# 3. If the new interface is a superset of the previous interface (that is, +# if the previous interface has not been broken by the changes in this +# new release), then age must be incremented. +# This release is backwards compatible with the previous release. +# +# 4. If the new interface has removed elements with respect to the previous +# interface, then you have broken backward compatibility and age must be +# reset to `0'. +# This release has a new, but backwards incompatible interface. +# +# For example, if the next release of the library included some new commands +# for an existing socket protocol, you would use -version-info 1:0:1. +# This is the first revision of a new interface. This release is backwards +# compatible with the previous release. +# +# Later, you implement a faster way of handling part of the algorithm at the +# core of the library, and release it with -version-info 1:1:1. This is a new +# revision of the current interface. +# +# Unfortunately the speed of your new implementation can only be fully +# exploited by changing the API to access the structures at a lower level, +# which breaks compatibility with the previous interface, so you release it +# as -version-info 2:0:0. This release has a new, but backwards incompatible +# interface. + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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@ +@ENABLE_DEBUG_TRUE@am__append_1 = -g -g3 -ggdb -gdwarf-2 -DIPSET_DEBUG -Wall -Werror +@ENABLE_DEBUG_FALSE@am__append_2 = -O2 -DNDEBUG +sbin_PROGRAMS = ipset$(EXEEXT) +subdir = src +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltargz.m4 \ + $(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)" +PROGRAMS = $(sbin_PROGRAMS) +am_ipset_OBJECTS = ipset.$(OBJEXT) +ipset_OBJECTS = $(am_ipset_OBJECTS) +ipset_DEPENDENCIES = ../lib/libipset.la +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(ipset_SOURCES) +DIST_SOURCES = $(ipset_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +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__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +man8dir = $(mandir)/man8 +NROFF = nroff +MANS = $(dist_man_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \ + $(top_srcdir)/Make_global.am $(top_srcdir)/build-aux/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +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@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +HAVE_CHECKENTRY_BOOL = @HAVE_CHECKENTRY_BOOL@ +HAVE_ETHER_ADDR_COPY = @HAVE_ETHER_ADDR_COPY@ +HAVE_ETHER_ADDR_EQUAL = @HAVE_ETHER_ADDR_EQUAL@ +HAVE_EXPORT_H = @HAVE_EXPORT_H@ +HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H = @HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H@ +HAVE_IPV6_SKIP_EXTHDR_ARGS = @HAVE_IPV6_SKIP_EXTHDR_ARGS@ +HAVE_IS_ZERO_ETHER_ADDR = @HAVE_IS_ZERO_ETHER_ADDR@ +HAVE_KVCALLOC = @HAVE_KVCALLOC@ +HAVE_KVFREE = @HAVE_KVFREE@ +HAVE_LIST_LAST_ENTRY = @HAVE_LIST_LAST_ENTRY@ +HAVE_LIST_NEXT_ENTRY = @HAVE_LIST_NEXT_ENTRY@ +HAVE_LOCKDEP_NFNL_IS_HELD = @HAVE_LOCKDEP_NFNL_IS_HELD@ +HAVE_NETLINK_DUMP_START_ARGS = @HAVE_NETLINK_DUMP_START_ARGS@ +HAVE_NETLINK_EXTENDED_ACK = @HAVE_NETLINK_EXTENDED_ACK@ +HAVE_NET_IN_NFNL_CALLBACK_FN = @HAVE_NET_IN_NFNL_CALLBACK_FN@ +HAVE_NET_IN_XT_ACTION_PARAM = @HAVE_NET_IN_XT_ACTION_PARAM@ +HAVE_NET_OPS_ASYNC = @HAVE_NET_OPS_ASYNC@ +HAVE_NET_OPS_ID = @HAVE_NET_OPS_ID@ +HAVE_NFNL_LOCK_SUBSYS = @HAVE_NFNL_LOCK_SUBSYS@ +HAVE_NFNL_MSG_TYPE = @HAVE_NFNL_MSG_TYPE@ +HAVE_NF_BRIDGE_GET_PHYSDEV = @HAVE_NF_BRIDGE_GET_PHYSDEV@ +HAVE_NLA_PUT_64BIT = @HAVE_NLA_PUT_64BIT@ +HAVE_NLA_PUT_BE16 = @HAVE_NLA_PUT_BE16@ +HAVE_NLA_PUT_BE64 = @HAVE_NLA_PUT_BE64@ +HAVE_NLA_PUT_IN_ADDR = @HAVE_NLA_PUT_IN_ADDR@ +HAVE_NL_INFO_PORTID = @HAVE_NL_INFO_PORTID@ +HAVE_NS_CAPABLE = @HAVE_NS_CAPABLE@ +HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS = @HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS@ +HAVE_PASSING_EXTENDED_ACK_TO_PARSERS = @HAVE_PASSING_EXTENDED_ACK_TO_PARSERS@ +HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE = @HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE@ +HAVE_STATE_IN_XT_ACTION_PARAM = @HAVE_STATE_IN_XT_ACTION_PARAM@ +HAVE_STRSCPY = @HAVE_STRSCPY@ +HAVE_STRUCT_XT_ACTION_PARAM = @HAVE_STRUCT_XT_ACTION_PARAM@ +HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET = @HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET@ +HAVE_TCF_EMATCH_STRUCT_NET = @HAVE_TCF_EMATCH_STRUCT_NET@ +HAVE_TC_SKB_PROTOCOL = @HAVE_TC_SKB_PROTOCOL@ +HAVE_TIMER_SETUP = @HAVE_TIMER_SETUP@ +HAVE_TYPEDEF_SCTP_SCTPHDR_T = @HAVE_TYPEDEF_SCTP_SCTPHDR_T@ +HAVE_USER_NS_IN_STRUCT_NET = @HAVE_USER_NS_IN_STRUCT_NET@ +HAVE_VZALLOC = @HAVE_VZALLOC@ +HAVE_XT_FAMILY = @HAVE_XT_FAMILY@ +HAVE_XT_MTCHK_PARAM_STRUCT_NET = @HAVE_XT_MTCHK_PARAM_STRUCT_NET@ +HAVE_XT_NET = @HAVE_XT_NET@ +HAVE_XT_TARGET_PARAM = @HAVE_XT_TARGET_PARAM@ +INCLTDL = @INCLTDL@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KBUILDDIR = @KBUILDDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBADD_DL = @LIBADD_DL@ +LIBADD_DLD_LINK = @LIBADD_DLD_LINK@ +LIBADD_DLOPEN = @LIBADD_DLOPEN@ +LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@ +LIBLTDL = @LIBLTDL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTDLDEPS = @LTDLDEPS@ +LTDLINCL = @LTDLINCL@ +LTDLOPEN = @LTDLOPEN@ +LTLIBOBJS = @LTLIBOBJS@ +LT_ARGZ_H = @LT_ARGZ_H@ +LT_CONFIG_H = @LT_CONFIG_H@ +LT_DLLOADERS = @LT_DLLOADERS@ +LT_DLPREOPEN = @LT_DLPREOPEN@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAXSETS = @MAXSETS@ +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@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SETTYPE_MODLIST = @SETTYPE_MODLIST@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +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_AR = @ac_ct_AR@ +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@ +bashcompdir = @bashcompdir@ +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@ +libmnl_CFLAGS = @libmnl_CFLAGS@ +libmnl_LIBS = @libmnl_LIBS@ +localedir = @localedir@ +localstatedir = @localstatedir@ +ltdl_LIBOBJS = @ltdl_LIBOBJS@ +ltdl_LTLIBOBJS = @ltdl_LTLIBOBJS@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sys_symbol_underscore = @sys_symbol_underscore@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# curr:rev:age +LIBVERSION = 14:0:1 +AM_CPPFLAGS = $(kinclude_CFLAGS) $(all_includes) -I$(top_srcdir)/include +AM_CFLAGS = -std=gnu99 $(am__append_1) $(am__append_2) +SPARSE = sparse +SPARSE_FLAGS = -Wsparse-all -I../include $(SPARSE_EXT_FLAGS) +IPSET_AM_V_CHECK = $(ipset_am__v_CHECK_$(V)) +ipset_am__v_CHECK_ = $(ipset_am__v_CHECK_$(AM_DEFAULT_VERBOSITY)) +ipset_am__v_CHECK_0 = @echo " CHECK " $<; +ipset_SOURCES = ipset.c +ipset_LDADD = ../lib/libipset.la +@ENABLE_SETTYPE_MODULES_FALSE@@ENABLE_STATIC_TRUE@AM_LDFLAGS = -static +@ENABLE_SETTYPE_MODULES_TRUE@AM_LDFLAGS = -shared +dist_man_MANS = ipset.8 +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/Make_global.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) --foreign src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/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_srcdir)/Make_global.am $(am__empty): + +$(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-sbinPROGRAMS: $(sbin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-sbinPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(sbindir)" && rm -f $$files + +clean-sbinPROGRAMS: + @list='$(sbin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +ipset$(EXEEXT): $(ipset_OBJECTS) $(ipset_DEPENDENCIES) $(EXTRA_ipset_DEPENDENCIES) + @rm -f ipset$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(ipset_OBJECTS) $(ipset_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipset.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man8: $(dist_man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(dist_man_MANS)'; \ + test -n "$(man8dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man8dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.8[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \ + done; } + +uninstall-man8: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man8dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.8[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + 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-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +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 $(PROGRAMS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"; 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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +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-sbinPROGRAMS \ + 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-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-sbinPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man8 + +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-man uninstall-sbinPROGRAMS + +uninstall-man: uninstall-man8 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-sbinPROGRAMS cscopelist-am ctags ctags-am \ + 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-man8 install-pdf \ + install-pdf-am install-ps install-ps-am install-sbinPROGRAMS \ + 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 tags-am uninstall uninstall-am \ + uninstall-man uninstall-man8 uninstall-sbinPROGRAMS + +.PRECIOUS: Makefile + + +sparse-check: $(ipset_SOURCES:.c=.d) + +%.d: %.c + $(IPSET_AM_V_CHECK)\ + $(SPARSE) -I.. $(SPARSE_FLAGS) $(AM_CFLAGS) $(AM_CPPFLAGS) $< || : + +# 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/ipset.8 b/src/ipset.8 new file mode 100644 index 0000000..674e0da --- /dev/null +++ b/src/ipset.8 @@ -0,0 +1,1093 @@ +.\" Man page written by Jozsef Kadlecsik +.\" +.\" 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 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., 675 Mass Ave, Cambridge, MA 02139, USA. +.TH "IPSET" "8" "Jun 25, 2015" "Jozsef Kadlecsik" "" +.SH "NAME" +ipset \(em administration tool for IP sets +.SH "SYNOPSIS" +\fBipset\fR [ \fIOPTIONS\fR ] \fICOMMAND\fR [ \fICOMMAND\-OPTIONS\fR ] +.PP +COMMANDS := { \fBcreate\fR | \fBadd\fR | \fBdel\fR | \fBtest\fR | \fBdestroy\fR | \fBlist\fR | \fBsave\fR | \fBrestore\fR | \fBflush\fR | \fBrename\fR | \fBswap\fR | \fBhelp\fR | \fBversion\fR | \fB\-\fR } +.PP +\fIOPTIONS\fR := { \fB\-exist\fR | \fB\-output\fR { \fBplain\fR | \fBsave\fR | \fBxml\fR } | \fB\-quiet\fR | \fB\-resolve\fR | \fB\-sorted\fR | \fB\-name\fR | \fB\-terse\fR | \fB\-file\fR \fIfilename\fR } +.PP +\fBipset\fR \fBcreate\fR \fISETNAME\fR \fITYPENAME\fR [ \fICREATE\-OPTIONS\fR ] +.PP +\fBipset\fR \fBadd\fR \fISETNAME\fR \fIADD\-ENTRY\fR [ \fIADD\-OPTIONS\fR ] +.PP +\fBipset\fR \fBdel\fR \fISETNAME\fR \fIDEL\-ENTRY\fR [ \fIDEL\-OPTIONS\fR ] +.PP +\fBipset\fR \fBtest\fR \fISETNAME\fR \fITEST\-ENTRY\fR [ \fITEST\-OPTIONS\fR ] +.PP +\fBipset\fR \fBdestroy\fR [ \fISETNAME\fR ] +.PP +\fBipset\fR \fBlist\fR [ \fISETNAME\fR ] +.PP +\fBipset\fR \fBsave\fR [ \fISETNAME\fR ] +.PP +\fBipset\fR \fBrestore\fR +.PP +\fBipset\fR \fBflush\fR [ \fISETNAME\fR ] +.PP +\fBipset\fR \fBrename\fR \fISETNAME\-FROM\fR \fISETNAME\-TO\fR +.PP +\fBipset\fR \fBswap\fR \fISETNAME\-FROM\fR \fISETNAME\-TO\fR +.PP +\fBipset\fR \fBhelp\fR [ \fITYPENAME\fR ] +.PP +\fBipset\fR \fBversion\fR +.PP +\fBipset\fR \fB\-\fR +.SH "DESCRIPTION" +\fBipset\fR +is used to set up, maintain and inspect so called IP sets in the Linux +kernel. Depending on the type of the set, an IP set may store IP(v4/v6) +addresses, (TCP/UDP) port numbers, IP and MAC address pairs, IP address +and port number pairs, etc. See the set type definitions below. +.PP +\fBIptables\fR +matches and targets referring to sets create references, which +protect the given sets in the kernel. A set cannot be destroyed +while there is a single reference pointing to it. +.SH "OPTIONS" +The options that are recognized by +\fBipset\fR +can be divided into several different groups. +.SS COMMANDS +These options specify the desired action to perform. Only one of them +can be specified on the command line unless otherwise specified below. +For all the long versions of the command names, you need to use only enough +letters to ensure that +\fBipset\fR +can differentiate it from all other commands. The +\fBipset\fR +parser follows the order here when looking for the shortest match +in the long command names. +.TP +\fBn\fP, \fBcreate\fP \fISETNAME\fP \fITYPENAME\fP [ \fICREATE\-OPTIONS\fP ] +Create a set identified with setname and specified type. The type may require +type specific options. If the +\fB\-exist\fR +option is specified, +\fBipset\fR +ignores the error otherwise raised when the same set (setname and create parameters +are identical) already exists. +.TP +\fBadd\fP \fISETNAME\fP \fIADD\-ENTRY\fP [ \fIADD\-OPTIONS\fP ] +Add a given entry to the set. If the +\fB\-exist\fR +option is specified, +\fBipset\fR +ignores if the entry already added to the set. +.TP +\fBdel\fP \fISETNAME\fP \fIDEL\-ENTRY\fP [ \fIDEL\-OPTIONS\fP ] +Delete an entry from a set. If the +\fB\-exist\fR +option is specified and the entry is not in the set (maybe already expired), +then the command is ignored. +.TP +\fBtest\fP \fISETNAME\fP \fITEST\-ENTRY\fP [ \fITEST\-OPTIONS\fP ] +Test whether an entry is in a set or not. Exit status number is zero +if the tested entry is in the set and nonzero if it is missing from +the set. +.TP +\fBx\fP, \fBdestroy\fP [ \fISETNAME\fP ] +Destroy the specified set or all the sets if none is given. + +If the set has got reference(s), nothing is done and no set destroyed. +.TP +\fBlist\fP [ \fISETNAME\fP ] [ \fIOPTIONS\fP ] +List the header data and the entries for the specified set, or for +all sets if none is given. The +\fB\-resolve\fP +option can be used to force name lookups (which may be slow). When the +\fB\-sorted\fP +option is given, the entries are listed/saved sorted (which may be slow). +The option +\fB\-output\fR +can be used to control the format of the listing: +\fBplain\fR, \fBsave\fR or \fBxml\fR. +(The default is +\fBplain\fR.) +If the option +\fB\-name\fR +is specified, just the names of the existing sets are listed. If the option +\fB\-terse\fR +is specified, just the set names and headers are listed. The output is printed +to stdout, the option +\fB\-file\fR +can be used to specify a filename instead of stdout. +.TP +\fBsave\fP [ \fISETNAME\fP ] +Save the given set, or all sets if none is given +to stdout in a format that +\fBrestore\fP +can read. The option +\fB\-file\fR +can be used to specify a filename instead of stdout. +.TP +\fBrestore\fP +Restore a saved session generated by +\fBsave\fP. +The saved session can be fed from stdin or the option +\fB\-file\fR +can be used to specify a filename instead of stdin. + +Please note, existing sets and elements are not erased by +\fBrestore\fP unless specified so in the restore file. All commands +are allowed in restore mode except \fBlist\fP, \fBhelp\fP, +\fBversion\fP, interactive mode and \fBrestore\fP itself. +.TP +\fBflush\fP [ \fISETNAME\fP ] +Flush all entries from the specified set or flush +all sets if none is given. +.TP +\fBe\fP, \fBrename\fP \fISETNAME\-FROM\fP \fISETNAME\-TO\fP +Rename a set. Set identified by +\fISETNAME\-TO\fR +must not exist. +.TP +\fBw\fP, \fBswap\fP \fISETNAME\-FROM\fP \fISETNAME\-TO\fP +Swap the content of two sets, or in another words, +exchange the name of two sets. The referred sets must exist and +compatible type of sets can be swapped only. +.TP +\fBhelp\fP [ \fITYPENAME\fP ] +Print help and set type specific help if +\fITYPENAME\fR +is specified. +.TP +\fBversion\fP +Print program version. +.TP +\fB\-\fP +If a dash is specified as command, then +\fBipset\fR +enters a simple interactive mode and the commands are read from the standard input. +The interactive mode can be finished by entering the pseudo\-command +\fBquit\fR. +.P +.SS "OTHER OPTIONS" +The following additional options can be specified. The long option names +cannot be abbreviated. +.TP +\fB\-!\fP, \fB\-exist\fP +Ignore errors when exactly the same set is to be created or already +added entry is added or missing entry is deleted. +.TP +\fB\-o\fP, \fB\-output\fP { \fBplain\fR | \fBsave\fR | \fBxml\fR } +Select the output format to the +\fBlist\fR +command. +.TP +\fB\-q\fP, \fB\-quiet\fP +Suppress any output to stdout and stderr. +\fBipset\fR +will still exit with error if it cannot continue. +.TP +\fB\-r\fP, \fB\-resolve\fP +When listing sets, enforce name lookup. The +program will try to display the IP entries resolved to +host names which requires +\fBslow\fR +DNS lookups. +.TP +\fB\-s\fP, \fB\-sorted\fP +Sorted output. When listing or saving sets, the entries are listed sorted. +.TP +\fB\-n\fP, \fB\-name\fP +List just the names of the existing sets, i.e. suppress listing of set headers and members. +.TP +\fB\-t\fP, \fB\-terse\fP +List the set names and headers, i.e. suppress listing of set members. +.TP +\fB\-f\fP, \fB\-file\fP \fIfilename\fR +Specify a filename to print into instead of stdout +(\fBlist\fR +or +\fBsave\fR +commands) or read from instead of stdin +(\fBrestore\fR +command). +.SH "INTRODUCTION" +A set type comprises of the storage method by which the data is stored and +the data type(s) which are stored in the set. Therefore the +\fITYPENAME\fR +parameter of the +\fBcreate\fR +command follows the syntax + +\fITYPENAME\fR := \fImethod\fR\fB:\fR\fIdatatype\fR[\fB,\fR\fIdatatype\fR[\fB,\fR\fIdatatype\fR]] + +where the current list of the methods are +\fBbitmap\fR, \fBhash\fR, and \fBlist\fR and the possible data types +are \fBip\fR, \fBnet\fR, \fBmac\fR, \fBport\fR and \fBiface\fR. +The dimension of a set is equal to the number of data types in its type name. + +When adding, deleting or testing entries in a set, the same comma separated +data syntax must be used for the entry parameter of the commands, i.e +.IP +ipset add foo ipaddr,portnum,ipaddr +.PP +If host names or service names with dash in the name are used instead of IP +addresses or service numbers, then the host name or service name must be enclosed +in square brackets. Example: +.IP +ipset add foo [test\-hostname],[ftp\-data] +.PP +In the case of host names the DNS resolver is called internally +by \fBipset\fR but if it returns multiple IP addresses, only the +first one is used. + +The \fBbitmap\fR and \fBlist\fR types use a fixed sized storage. The \fBhash\fR +types use a hash to store the elements. In order to avoid clashes in the hash, +a limited number of chaining, and if that is exhausted, the doubling of the hash size +is performed when adding entries by the +\fBipset\fR +command. When entries added by the +\fBSET\fR +target of +\fBiptables/ip6tables\fR, +then the hash size is fixed and the set won't be duplicated, even if the new +entry cannot be added to the set. +.SH "GENERIC CREATE AND ADD OPTIONS" +.SS timeout +All set types supports the optional \fBtimeout\fR +parameter when creating a set and adding entries. The value of the \fBtimeout\fR +parameter for the \fBcreate\fR command means the default timeout value (in seconds) +for new entries. If a set is created with timeout support, then the same +\fBtimeout\fR option can be used to specify non\-default timeout values +when adding entries. Zero timeout value means the entry is added permanent to the set. +The timeout value of already added elements can be changed by re-adding the element +using the \fB\-exist\fR option. The largest possible timeout value is 2147483 +(in seconds). Example: +.IP +ipset create test hash:ip timeout 300 +.IP +ipset add test 192.168.0.1 timeout 60 +.IP +ipset \-exist add test 192.168.0.1 timeout 600 +.PP +When listing the set, the number of entries printed in the header might be +larger than the listed number of entries for sets with the timeout extensions: +the number of entries in the set is updated when elements added/deleted to the +set and periodically when the garbage collector evicts the timed out entries. +.PP +.SS "counters, packets, bytes" +All set types support the optional \fBcounters\fR +option when creating a set. If the option is specified then the set is created +with packet and byte counters per element support. The packet and byte counters +are initialized to zero when the elements are (re\-)added to the set, +unless the packet and byte counter values are explicitly specified by the +\fBpackets\fR and \fBbytes\fR options. An example when an element is added +to a set with non\-zero counter values: +.IP +ipset create foo hash:ip counters +.IP +ipset add foo 192.168.1.1 packets 42 bytes 1024 +.PP +.SS comment +All set types support the optional \fBcomment\fR extension. +Enabling this extension on an ipset enables you to annotate an ipset entry with +an arbitrary string. This string is completely ignored by both the kernel and ipset +itself and is purely for providing a convenient means to document the reason for an +entry's existence. Comments must not contain any quotation marks and the usual escape +character (\\) has no meaning. For example, the following shell command is illegal: +.IP +ipset add foo 1.1.1.1 comment "this comment is \\"bad\\"" +.PP +In the above, your shell will of course escape the quotation marks and ipset will see +the quote marks in the argument for the comment, which will result in a parse error. +If you are writing your own system, you should avoid creating comments containing a +quotation mark if you do not want to break "ipset save" and "ipset restore", +nonetheless, the kernel will not stop you from doing so. The following is perfectly +acceptable: +.IP +ipset create foo hash:ip comment +.IP +ipset add foo 192.168.1.1/24 comment "allow access to SMB share on \\\\\\\\fileserv\\\\" +.IP +the above would appear as: "allow access to SMB share on \\\\fileserv\\" +.PP +.SS "skbinfo, skbmark, skbprio, skbqueue" +All set types support the optional \fBskbinfo\fR extension. This extension allows you to +store the metainfo (firewall mark, tc class and hardware queue) with every entry and map it to +packets by usage of SET netfilter target with \-\-map\-set option. +\fBskbmark\fR option format: \fBMARK\fR or \fBMARK/MASK\fR, where \fBMARK\fR and \fBMASK\fR are 32bit hex +numbers with 0x prefix. If only \fBmark\fR is specified mask 0xffffffff are used. +\fBskbprio\fR option has tc class format: \fBMAJOR:MINOR\fR, where \fBmajor\fR and \fBminor\fR numbers +are hex without 0x prefix. +\fBskbqueue\fR option is just decimal number. +.IP +ipset create foo hash:ip skbinfo +.IP +ipset add foo skbmark 0x1111/0xff00ffff skbprio 1:10 skbqueue 10 +.PP +.SS hashsize +This parameter is valid for the \fBcreate\fR command of all \fBhash\fR type sets. +It defines the initial hash size for the set, default is 1024. The hash size must be a power +of two, the kernel automatically rounds up non power of two hash sizes to the first +correct value. +Example: +.IP +ipset create test hash:ip hashsize 1536 +.PP +.SS maxelem +This parameter is valid for the \fBcreate\fR command of all \fBhash\fR type sets. +It does define the maximal number of elements which can be stored in the set, default 65536. +Example: +.IP +ipset create test hash:ip maxelem 2048. +.PP +.SS family { inet | inet6 } +This parameter is valid for the \fBcreate\fR command of all \fBhash\fR type sets +except for hash:mac. +It defines the protocol family of the IP addresses to be stored in the set. The default is +\fBinet\fR, i.e IPv4. +For the \fBinet\fR family one can add or delete multiple entries by specifying +a range or a network of IPv4 addresses in the IP address part of the entry: +.PP +\fIipaddr\fR := { \fIip\fR | \fIfromaddr\fR\-\fItoaddr\fR | \fIip\fR/\fIcidr\fR } +.PP +\fInetaddr\fR := { \fIfromaddr\fR\-\fItoaddr\fR | \fIip\fR/\fIcidr\fR } +.PP +Example: +.IP +ipset create test hash:ip family inet6 +.PP +.SS nomatch +The \fBhash\fR set types which can store \fBnet\fR type of data (i.e. hash:*net*) +support the optional \fBnomatch\fR +option when adding entries. When matching elements in the set, entries marked +as \fBnomatch\fR are skipped as if those were not added to the set, which makes +possible to build up sets with exceptions. See the example at hash type +\fBhash:net\fR below. + +When elements are tested by \fBipset\fR, the \fBnomatch\fR +flags are taken into account. If one wants to test the existence of an element +marked with \fBnomatch\fR in a set, then the flag must be specified too. +.SS forceadd +All hash set types support the optional \fBforceadd\fR parameter when creating a set. +When sets created with this option become full the next addition to the set may +succeed and evict a random entry from the set. +.IP +ipset create foo hash:ip forceadd +.PP +.SH "SET TYPES" +.SS bitmap:ip +The \fBbitmap:ip\fR set type uses a memory range to store either IPv4 host +(default) or IPv4 network addresses. A \fBbitmap:ip\fR type of set can store up +to 65536 entries. +.PP +\fICREATE\-OPTIONS\fR := \fBrange\fP \fIfromip\fP\-\fItoip\fR|\fIip\fR/\fIcidr\fR [ \fBnetmask\fP \fIcidr\fP ] [ \fBtimeout\fR \fIvalue\fR ] [ \fBcounters\fP ] [ \fBcomment\fP ] [ \fBskbinfo\fP ] +.PP +\fIADD\-ENTRY\fR := { \fIip\fR | \fIfromip\fR\-\fItoip\fR | \fIip\fR/\fIcidr\fR } +.PP +\fIADD\-OPTIONS\fR := [ \fBtimeout\fR \fIvalue\fR ] [ \fBpackets\fR \fIvalue\fR ] [ \fBbytes\fR \fIvalue\fR ] [ \fBcomment\fR \fIstring\fR ] [ \fBskbmark\fR \fIvalue\fR ] [ \fBskbprio\fR \fIvalue\fR ] [ \fBskbqueue\fR \fIvalue\fR ] +.PP +\fIDEL\-ENTRY\fR := { \fIip\fR | \fIfromip\fR\-\fItoip\fR | \fIip\fR/\fIcidr\fR } +.PP +\fITEST\-ENTRY\fR := \fIip\fR +.PP +Mandatory \fBcreate\fR options: +.TP +\fBrange\fP \fIfromip\fP\-\fItoip\fR|\fIip\fR/\fIcidr\fR +Create the set from the specified inclusive address range expressed in an +IPv4 address range or network. The size of the range (in entries) cannot exceed +the limit of maximum 65536 elements. +.PP +Optional \fBcreate\fR options: +.TP +\fBnetmask\fP \fIcidr\fP +When the optional \fBnetmask\fP parameter specified, network addresses will be +stored in the set instead of IP host addresses. The \fIcidr\fR prefix value must be +between 1\-32. +An IP address will be in the set if the network address, which is resulted by +masking the address with the specified netmask, can be found in the set. +.PP +The \fBbitmap:ip\fR type supports adding or deleting multiple entries in one +command. +.PP +Examples: +.IP +ipset create foo bitmap:ip range 192.168.0.0/16 +.IP +ipset add foo 192.168.1/24 +.IP +ipset test foo 192.168.1.1 +.SS bitmap:ip,mac +The \fBbitmap:ip,mac\fR set type uses a memory range to store IPv4 and a MAC address pairs. A \fBbitmap:ip,mac\fR type of set can store up to 65536 entries. +.PP +\fICREATE\-OPTIONS\fR := \fBrange\fP \fIfromip\fP\-\fItoip\fR|\fIip\fR/\fIcidr\fR [ \fBtimeout\fR \fIvalue\fR ] [ \fBcounters\fP ] [ \fBcomment\fP ] [ \fBskbinfo\fP ] +.PP +\fIADD\-ENTRY\fR := \fIip\fR[,\fImacaddr\fR] +.PP +\fIADD\-OPTIONS\fR := [ \fBtimeout\fR \fIvalue\fR ] [ \fBpackets\fR \fIvalue\fR ] [ \fBbytes\fR \fIvalue\fR ] [ \fBcomment\fR \fIstring\fR ] [ \fBskbmark\fR \fIvalue\fR ] [ \fBskbprio\fR \fIvalue\fR ] [ \fBskbqueue\fR \fIvalue\fR ] +.PP +\fIDEL\-ENTRY\fR := \fIip\fR[,\fImacaddr\fR] +.PP +\fITEST\-ENTRY\fR := \fIip\fR[,\fImacaddr\fR] +.PP +Mandatory options to use when creating a \fBbitmap:ip,mac\fR type of set: +.TP +\fBrange\fP \fIfromip\fP\-\fItoip\fR|\fIip\fR/\fIcidr\fR +Create the set from the specified inclusive address range expressed in an +IPv4 address range or network. The size of the range cannot exceed the limit +of maximum 65536 entries. +.PP +The \fBbitmap:ip,mac\fR type is exceptional in the sense that the MAC part can +be left out when adding/deleting/testing entries in the set. If we add an entry +without the MAC address specified, then when the first time the entry is +matched by the kernel, it will automatically fill out the missing MAC address with the +MAC address from the packet. The source MAC address is used if the entry matched +due to a \fBsrc\fR parameter of the \fBset\fR match, and the destination MAC +address is used if available and the entry matched due to a \fBdst\fR parameter. +If the entry was specified with a timeout value, the timer starts off when the +IP and MAC address pair is complete. +.PP +The \fBbitmap:ip,mac\fR type of sets require two \fBsrc/dst\fR parameters of +the \fBset\fR match and \fBSET\fR target netfilter kernel modules. For matches +on destination MAC addresses, see COMMENTS below. +.PP +Examples: +.IP +ipset create foo bitmap:ip,mac range 192.168.0.0/16 +.IP +ipset add foo 192.168.1.1,12:34:56:78:9A:BC +.IP +ipset test foo 192.168.1.1 +.SS bitmap:port +The \fBbitmap:port\fR set type uses a memory range to store port numbers +and such a set can store up to 65536 ports. +.PP +\fICREATE\-OPTIONS\fR := \fBrange\fP \fIfromport\fP\-\fItoport [ \fBtimeout\fR \fIvalue\fR ] [ \fBcounters\fP ] [ \fBcomment\fP ] [ \fBskbinfo\fP ] +.PP +\fIADD\-ENTRY\fR := { \fI[proto:]port\fR | \fI[proto:]fromport\fR\-\fItoport\fR } +.PP +\fIADD\-OPTIONS\fR := [ \fBtimeout\fR \fIvalue\fR ] [ \fBpackets\fR \fIvalue\fR ] [ \fBbytes\fR \fIvalue\fR ] [ \fBcomment\fR \fIstring\fR ] [ \fBskbmark\fR \fIvalue\fR ] [ \fBskbprio\fR \fIvalue\fR ] [ \fBskbqueue\fR \fIvalue\fR ] +.PP +\fIDEL\-ENTRY\fR := { \fI[proto:]port\fR | \fI[proto:]fromport\fR\-\fItoport\fR } +.PP +\fITEST\-ENTRY\fR := \fI[proto:]port\fR +.PP +Mandatory options to use when creating a \fBbitmap:port\fR type of set: +.TP +\fBrange\fP \fI[proto:]fromport\fP\-\fItoport\fR +Create the set from the specified inclusive port range. +.PP +The \fBset\fR match and \fBSET\fR target netfilter kernel modules interpret +the stored numbers as TCP or UDP port numbers. +.PP +\fBproto\fR only needs to be specified if a service name is used, +and that name does not exist as a TCP service. +.PP +Examples: +.IP +ipset create foo bitmap:port range 0\-1024 +.IP +ipset add foo 80 +.IP +ipset test foo 80 +.IP +ipset del foo udp:[macon-udp]-[tn-tl-w2] +.SS hash:ip +The \fBhash:ip\fR set type uses a hash to store IP host addresses (default) or +network addresses. Zero valued IP address cannot be stored in a \fBhash:ip\fR +type of set. +.PP +\fICREATE\-OPTIONS\fR := [ \fBfamily\fR { \fBinet\fR | \fBinet6\fR } ] | [ \fBhashsize\fR \fIvalue\fR ] [ \fBmaxelem\fR \fIvalue\fR ] [ \fBnetmask\fP \fIcidr\fP ] [ \fBtimeout\fR \fIvalue\fR ] [ \fBcounters\fP ] [ \fBcomment\fP ] [ \fBskbinfo\fP ] +.PP +\fIADD\-ENTRY\fR := \fIipaddr\fR +.PP +\fIADD\-OPTIONS\fR := [ \fBtimeout\fR \fIvalue\fR ] [ \fBpackets\fR \fIvalue\fR ] [ \fBbytes\fR \fIvalue\fR ] [ \fBcomment\fR \fIstring\fR ] [ \fBskbmark\fR \fIvalue\fR ] [ \fBskbprio\fR \fIvalue\fR ] [ \fBskbqueue\fR \fIvalue\fR ] +.PP +\fIDEL\-ENTRY\fR := \fIipaddr\fR +.PP +\fITEST\-ENTRY\fR := \fIipaddr\fR +.PP +Optional \fBcreate\fR options: +.TP +\fBnetmask\fP \fIcidr\fP +When the optional \fBnetmask\fP parameter specified, network addresses will be +stored in the set instead of IP host addresses. The \fIcidr\fP prefix value must be +between 1\-32 for IPv4 and between 1\-128 for IPv6. An IP address will be in the set +if the network address, which is resulted by masking the address with the netmask, +can be found in the set. +Examples: +.IP +ipset create foo hash:ip netmask 30 +.IP +ipset add foo 192.168.1.0/24 +.IP +ipset test foo 192.168.1.2 +.SS hash:mac +The \fBhash:mac\fR set type uses a hash to store MAC addresses. Zero valued MAC addresses cannot be stored in a \fBhash:mac\fR +type of set. For matches on destination MAC addresses, see COMMENTS below. +.PP +\fICREATE\-OPTIONS\fR := [ \fBhashsize\fR \fIvalue\fR ] [ \fBmaxelem\fR \fIvalue\fR ] [ \fBtimeout\fR \fIvalue\fR ] [ \fBcounters\fP ] [ \fBcomment\fP ] [ \fBskbinfo\fP ] +.PP +\fIADD\-ENTRY\fR := \fImacaddr\fR +.PP +\fIADD\-OPTIONS\fR := [ \fBtimeout\fR \fIvalue\fR ] [ \fBpackets\fR \fIvalue\fR ] [ \fBbytes\fR \fIvalue\fR ] [ \fBcomment\fR \fIstring\fR ] [ \fBskbmark\fR \fIvalue\fR ] [ \fBskbprio\fR \fIvalue\fR ] [ \fBskbqueue\fR \fIvalue\fR ] +.PP +\fIDEL\-ENTRY\fR := \fImacaddr\fR +.PP +\fITEST\-ENTRY\fR := \fImacaddr\fR +.PP +Examples: +.IP +ipset create foo hash:mac +.IP +ipset add foo 01:02:03:04:05:06 +.IP +ipset test foo 01:02:03:04:05:06 + +.SS hash:ip,mac +The \fBhash:ip,mac\fR set type uses a hash to store IP and a MAC address pairs. Zero valued MAC addresses cannot be stored in a \fBhash:ip,mac\fR +type of set. For matches on destination MAC addresses, see COMMENTS below. +.PP +\fICREATE\-OPTIONS\fR := [ \fBfamily\fR { \fBinet\fR | \fBinet6\fR } ] | [ \fBhashsize\fR \fIvalue\fR ] [ \fBmaxelem\fR \fIvalue\fR ] [ \fBtimeout\fR \fIvalue\fR ] [ \fBcounters\fP ] [ \fBcomment\fP ] [ \fBskbinfo\fP ] +.PP +\fIADD\-ENTRY\fR := \fIipaddr\fR,\fImacaddr\fR +.PP +\fIADD\-OPTIONS\fR := [ \fBtimeout\fR \fIvalue\fR ] [ \fBpackets\fR \fIvalue\fR ] [ \fBbytes\fR \fIvalue\fR ] [ \fBcomment\fR \fIstring\fR ] [ \fBskbmark\fR \fIvalue\fR ] [ \fBskbprio\fR \fIvalue\fR ] [ \fBskbqueue\fR \fIvalue\fR ] +.PP +\fIDEL\-ENTRY\fR := \fIipaddr\fR,\fImacaddr\fR +.PP +\fITEST\-ENTRY\fR := \fIipaddr\fR,\fImacaddr\fR +.PP +Examples: +.IP +ipset create foo hash:ip,mac +.IP +ipset add foo 1.1.1.1,01:02:03:04:05:06 +.IP +ipset test foo 1.1.1.1,01:02:03:04:05:06 + +.SS hash:net +The \fBhash:net\fR set type uses a hash to store different sized IP network addresses. +Network address with zero prefix size cannot be stored in this type of sets. +.PP +\fICREATE\-OPTIONS\fR := [ \fBfamily\fR { \fBinet\fR | \fBinet6\fR } ] | [ \fBhashsize\fR \fIvalue\fR ] [ \fBmaxelem\fR \fIvalue\fR ] [ \fBtimeout\fR \fIvalue\fR ] [ \fBcounters\fP ] [ \fBcomment\fP ] [ \fBskbinfo\fP ] +.PP +\fIADD\-ENTRY\fR := \fInetaddr\fR +.PP +\fIADD\-OPTIONS\fR := [ \fBtimeout\fR \fIvalue\fR ] [ \fBnomatch\fR ] [ \fBpackets\fR \fIvalue\fR ] [ \fBbytes\fR \fIvalue\fR ] [ \fBcomment\fR \fIstring\fR ] [ \fBskbmark\fR \fIvalue\fR ] [ \fBskbprio\fR \fIvalue\fR ] [ \fBskbqueue\fR \fIvalue\fR ] +.PP +\fIDEL\-ENTRY\fR := \fInetaddr\fR +.PP +\fITEST\-ENTRY\fR := \fInetaddr\fR +.PP +where +\fInetaddr\fR := \fIip\fR[/\fIcidr\fR] +.PP +When adding/deleting/testing entries, if the cidr prefix parameter is not specified, +then the host prefix value is assumed. When adding/deleting entries, the exact +element is added/deleted and overlapping elements are not checked by the kernel. +When testing entries, if a host address is tested, then the kernel tries to match +the host address in the networks added to the set and reports the result accordingly. +.PP +From the \fBset\fR netfilter match point of view the searching for a match +always starts from the smallest size of netblock (most specific +prefix) to the largest one (least specific prefix) added to the set. +When adding/deleting IP addresses to the set by the \fBSET\fR netfilter target, +it will be added/deleted by the most specific prefix which can be found in the +set, or by the host prefix value if the set is empty. +.PP +The lookup time grows linearly with the number of the different prefix +values added to the set. +.PP +Example: +.IP +ipset create foo hash:net +.IP +ipset add foo 192.168.0.0/24 +.IP +ipset add foo 10.1.0.0/16 +.IP +ipset add foo 192.168.0/24 +.IP +ipset add foo 192.168.0/30 nomatch +.PP +When matching the elements in the set above, all IP addresses will match +from the networks 192.168.0.0/24, 10.1.0.0/16 and 192.168.0/24 except +the ones from 192.168.0/30. +.SS hash:net,net +The \fBhash:net,net\fR set type uses a hash to store pairs of different sized IP +network addresses. Bear in mind that the first parameter has precedence +over the second, so a nomatch entry could be potentially be ineffective if a more specific +first parameter existed with a suitable second parameter. +Network address with zero prefix size cannot be stored in this type of set. +.PP +\fICREATE\-OPTIONS\fR := [ \fBfamily\fR { \fBinet\fR | \fBinet6\fR } ] | [ \fBhashsize\fR \fIvalue\fR ] [ \fBmaxelem\fR \fIvalue\fR ] [ \fBtimeout\fR \fIvalue\fR ] [ \fBcounters\fP ] [ \fBcomment\fP ] [ \fBskbinfo\fP ] +.PP +\fIADD\-ENTRY\fR := \fInetaddr\fR,\fInetaddr\fR +.PP +\fIADD\-OPTIONS\fR := [ \fBtimeout\fR \fIvalue\fR ] [ \fBnomatch\fR ] [ \fBpackets\fR \fIvalue\fR ] [ \fBbytes\fR \fIvalue\fR ] [ \fBcomment\fR \fIstring\fR ] [ \fBskbmark\fR \fIvalue\fR ] [ \fBskbprio\fR \fIvalue\fR ] [ \fBskbqueue\fR \fIvalue\fR ] +.PP +\fIDEL\-ENTRY\fR := \fInetaddr\fR,\fInetaddr\fR +.PP +\fITEST\-ENTRY\fR := \fInetaddr\fR,\fInetaddr\fR +.PP +where +\fInetaddr\fR := \fIip\fR[/\fIcidr\fR] +.PP +When adding/deleting/testing entries, if the cidr prefix parameter is not specified, +then the host prefix value is assumed. When adding/deleting entries, the exact +element is added/deleted and overlapping elements are not checked by the kernel. +When testing entries, if a host address is tested, then the kernel tries to match +the host address in the networks added to the set and reports the result accordingly. +.PP +From the \fBset\fR netfilter match point of view the searching for a match +always starts from the smallest size of netblock (most specific +prefix) to the largest one (least specific prefix) with the first param +having precedence. +When adding/deleting IP addresses to the set by the \fBSET\fR netfilter target, +it will be added/deleted by the most specific prefix which can be found in +the set, or by the host prefix value if the set is empty. +.PP +The lookup time grows linearly with the number of the different prefix +values added to the first parameter of the set. The number of secondary prefixes +further increases this as the list of secondary prefixes is traversed per primary +prefix. +.PP +Example: +.IP +ipset create foo hash:net,net +.IP +ipset add foo 192.168.0.0/24,10.0.1.0/24 +.IP +ipset add foo 10.1.0.0/16,10.255.0.0/24 +.IP +ipset add foo 192.168.0/24,192.168.54.0-192.168.54.255 +.IP +ipset add foo 192.168.0/30,192.168.64/30 nomatch +.PP +When matching the elements in the set above, all IP addresses will match +from the networks 192.168.0.0/24<->10.0.1.0/24, 10.1.0.0/16<->10.255.0.0/24 +and 192.168.0/24<->192.168.54.0/24 except the ones from +192.168.0/30<->192.168.64/30. +.SS hash:ip,port +The \fBhash:ip,port\fR set type uses a hash to store IP address and port number pairs. +The port number is interpreted together with a protocol (default TCP) and zero +protocol number cannot be used. +.PP +\fICREATE\-OPTIONS\fR := [ \fBfamily\fR { \fBinet\fR | \fBinet6\fR } ] | [ \fBhashsize\fR \fIvalue\fR ] [ \fBmaxelem\fR \fIvalue\fR ] [ \fBtimeout\fR \fIvalue\fR ] [ \fBcounters\fP ] [ \fBcomment\fP ] [ \fBskbinfo\fP ] +.PP +\fIADD\-ENTRY\fR := \fIipaddr\fR,[\fIproto\fR:]\fIport\fR +.PP +\fIADD\-OPTIONS\fR := [ \fBtimeout\fR \fIvalue\fR ] [ \fBpackets\fR \fIvalue\fR ] [ \fBbytes\fR \fIvalue\fR ] [ \fBcomment\fR \fIstring\fR ] [ \fBskbmark\fR \fIvalue\fR ] [ \fBskbprio\fR \fIvalue\fR ] [ \fBskbqueue\fR \fIvalue\fR ] +.PP +\fIDEL\-ENTRY\fR := \fIipaddr\fR,[\fIproto\fR:]\fIport\fR +.PP +\fITEST\-ENTRY\fR := \fIipaddr\fR,[\fIproto\fR:]\fIport\fR +.PP +The +[\fIproto\fR:]\fIport\fR +part of the elements may be expressed in the following forms, where the range +variations are valid when adding or deleting entries: +.TP +\fIportname[\-portname]\fR +TCP port or range of ports expressed in TCP portname identifiers from /etc/services +.TP +\fIportnumber[\-portnumber]\fR +TCP port or range of ports expressed in TCP port numbers +.TP +\fBtcp\fR|\fBsctp\fR|\fBudp\fR|\fBudplite\fR:\fIportname\fR|\fIportnumber\fR[\-\fIportname\fR|\fIportnumber\fR] +TCP, SCTP, UDP or UDPLITE port or port range expressed in port name(s) or port number(s) +.TP +\fBicmp\fR:\fIcodename\fR|\fItype\fR/\fIcode\fR +ICMP codename or type/code. The supported ICMP codename identifiers can always +be listed by the help command. +.TP +\fBicmpv6\fR:\fIcodename\fR|\fItype\fR/\fIcode\fR +ICMPv6 codename or type/code. The supported ICMPv6 codename identifiers can always +be listed by the help command. +.TP +\fIproto\fR:0 +All other protocols, as an identifier from /etc/protocols or number. The pseudo +port number must be zero. +.PP +The \fBhash:ip,port\fR type of sets require +two \fBsrc\fR/\fBdst\fR parameters of the \fBset\fR match and \fBSET\fR +target kernel modules. +.PP +Examples: +.IP +ipset create foo hash:ip,port +.IP +ipset add foo 192.168.1.0/24,80\-82 +.IP +ipset add foo 192.168.1.1,udp:53 +.IP +ipset add foo 192.168.1.1,vrrp:0 +.IP +ipset test foo 192.168.1.1,80 +.SS hash:net,port +The \fBhash:net,port\fR set type uses a hash to store different sized IP network +address and port pairs. The port number is interpreted together with a protocol +(default TCP) and zero protocol number cannot be used. Network +address with zero prefix size is not accepted either. +.PP +\fICREATE\-OPTIONS\fR := [ \fBfamily\fR { \fBinet\fR | \fBinet6\fR } ] | [ \fBhashsize\fR \fIvalue\fR ] [ \fBmaxelem\fR \fIvalue\fR ] [ \fBtimeout\fR \fIvalue\fR ] [ \fBcounters\fP ] [ \fBcomment\fP ] [ \fBskbinfo\fP ] +.PP +\fIADD\-ENTRY\fR := \fInetaddr\fR,[\fIproto\fR:]\fIport\fR +.PP +\fIADD\-OPTIONS\fR := [ \fBtimeout\fR \fIvalue\fR ] [ \fBnomatch\fR ] [ \fBpackets\fR \fIvalue\fR ] [ \fBbytes\fR \fIvalue\fR ] [ \fBcomment\fR \fIstring\fR ] [ \fBskbmark\fR \fIvalue\fR ] [ \fBskbprio\fR \fIvalue\fR ] [ \fBskbqueue\fR \fIvalue\fR ] +.PP +\fIDEL\-ENTRY\fR := \fInetaddr\fR,[\fIproto\fR:]\fIport\fR +.PP +\fITEST\-ENTRY\fR := \fInetaddr\fR,[\fIproto\fR:]\fIport\fR +.PP +where +\fInetaddr\fR := \fIip\fR[/\fIcidr\fR] +.PP +For the \fInetaddr\fR part of the elements +see the description at the \fBhash:net\fR set type. For the +[\fIproto\fR:]\fIport\fR +part of the elements see the description at the +\fBhash:ip,port\fR set type. +.PP +When adding/deleting/testing entries, if the cidr prefix parameter is not specified, +then the host prefix value is assumed. When adding/deleting entries, the exact +element is added/deleted and overlapping elements are not checked by the kernel. +When testing entries, if a host address is tested, then the kernel tries to match +the host address in the networks added to the set and reports the result accordingly. +.PP +From the \fBset\fR netfilter match point of view the searching for a match +always starts from the smallest size of netblock (most specific +prefix) to the largest one (least specific prefix) added to the set. +When adding/deleting IP +addresses to the set by the \fBSET\fR netfilter target, it will be +added/deleted by the most specific prefix which can be found in the +set, or by the host prefix value if the set is empty. +.PP +The lookup time grows linearly with the number of the different prefix +values added to the set. +.PP +Examples: +.IP +ipset create foo hash:net,port +.IP +ipset add foo 192.168.0/24,25 +.IP +ipset add foo 10.1.0.0/16,80 +.IP +ipset test foo 192.168.0/24,25 +.SS hash:ip,port,ip +The \fBhash:ip,port,ip\fR set type uses a hash to store IP address, port number +and a second IP address triples. The port number is interpreted together with a +protocol (default TCP) and zero protocol number cannot be used. +.PP +\fICREATE\-OPTIONS\fR := [ \fBfamily\fR { \fBinet\fR | \fBinet6\fR } ] | [ \fBhashsize\fR \fIvalue\fR ] [ \fBmaxelem\fR \fIvalue\fR ] [ \fBtimeout\fR \fIvalue\fR ] [ \fBcounters\fP ] [ \fBcomment\fP ] [ \fBskbinfo\fP ] +.PP +\fIADD\-ENTRY\fR := \fIipaddr\fR,[\fIproto\fR:]\fIport\fR,\fIip\fR +.PP +\fIADD\-OPTIONS\fR := [ \fBtimeout\fR \fIvalue\fR ] [ \fBpackets\fR \fIvalue\fR ] [ \fBbytes\fR \fIvalue\fR ] [ \fBcomment\fR \fIstring\fR ] [ \fBskbmark\fR \fIvalue\fR ] [ \fBskbprio\fR \fIvalue\fR ] [ \fBskbqueue\fR \fIvalue\fR ] +.PP +\fIDEL\-ENTRY\fR := \fIipaddr\fR,[\fIproto\fR:]\fIport\fR,\fIip\fR +.PP +\fITEST\-ENTRY\fR := \fIipaddr\fR,[\fIproto\fR:]\fIport\fR,\fIip\fR +.PP +For the first \fIipaddr\fR and +[\fIproto\fR:]\fIport\fR +parts of the elements see the descriptions at the +\fBhash:ip,port\fR set type. +.PP +The \fBhash:ip,port,ip\fR type of sets require +three \fBsrc\fR/\fBdst\fR parameters of the \fBset\fR match and \fBSET\fR +target kernel modules. +.PP +Examples: +.IP +ipset create foo hash:ip,port,ip +.IP +ipset add foo 192.168.1.1,80,10.0.0.1 +.IP +ipset test foo 192.168.1.1,udp:53,10.0.0.1 +.SS hash:ip,port,net +The \fBhash:ip,port,net\fR set type uses a hash to store IP address, port number +and IP network address triples. The port number is interpreted together with a +protocol (default TCP) and zero protocol number cannot be used. Network +address with zero prefix size cannot be stored either. +.PP +\fICREATE\-OPTIONS\fR := [ \fBfamily\fR { \fBinet\fR | \fBinet6\fR } ] | [ \fBhashsize\fR \fIvalue\fR ] [ \fBmaxelem\fR \fIvalue\fR ] [ \fBtimeout\fR \fIvalue\fR ] [ \fBcounters\fP ] [ \fBcomment\fP ] [ \fBskbinfo\fP ] +.PP +\fIADD\-ENTRY\fR := \fIipaddr\fR,[\fIproto\fR:]\fIport\fR,\fInetaddr\fR +.PP +\fIADD\-OPTIONS\fR := [ \fBtimeout\fR \fIvalue\fR ] [ \fBnomatch\fR ] [ \fBpackets\fR \fIvalue\fR ] [ \fBbytes\fR \fIvalue\fR ] [ \fBcomment\fR \fIstring\fR ] [ \fBskbmark\fR \fIvalue\fR ] [ \fBskbprio\fR \fIvalue\fR ] [ \fBskbqueue\fR \fIvalue\fR ] +.PP +\fIDEL\-ENTRY\fR := \fIipaddr\fR,[\fIproto\fR:]\fIport\fR,\fInetaddr\fR +.PP +\fITEST\-ENTRY\fR := \fIipaddr\fR,[\fIproto\fR:]\fIport\fR,\fInetaddr\fR +.PP +where +\fInetaddr\fR := \fIip\fR[/\fIcidr\fR] +.PP +For the \fIipaddr\fR and +[\fIproto\fR:]\fIport\fR +parts of the elements see the descriptions at the +\fBhash:ip,port\fR set type. For the \fInetaddr\fR part of the elements +see the description at the \fBhash:net\fR set type. +.PP +From the \fBset\fR netfilter match point of view the searching for a match +always starts from the smallest size of netblock (most specific +cidr) to the largest one (least specific cidr) added to the set. +When adding/deleting triples +to the set by the \fBSET\fR netfilter target, it will be +added/deleted by the most specific cidr which can be found in the +set, or by the host cidr value if the set is empty. +.PP +The lookup time grows linearly with the number of the different \fIcidr\fR +values added to the set. +.PP +The \fBhash:ip,port,net\fR type of sets require three \fBsrc\fR/\fBdst\fR parameters of +the \fBset\fR match and \fBSET\fR target kernel modules. +.PP +Examples: +.IP +ipset create foo hash:ip,port,net +.IP +ipset add foo 192.168.1,80,10.0.0/24 +.IP +ipset add foo 192.168.2,25,10.1.0.0/16 +.IP +ipset test foo 192.168.1,80.10.0.0/24 +.SS hash:ip,mark +The \fBhash:ip,mark\fR set type uses a hash to store IP address and packet mark pairs. +.PP +\fICREATE\-OPTIONS\fR := [ \fBfamily\fR { \fBinet\fR | \fBinet6\fR } ] | [ \fBmarkmask\fR \fIvalue\fR ] [ \fBhashsize\fR \fIvalue\fR ] [ \fBmaxelem\fR \fIvalue\fR ] [ \fBtimeout\fR \fIvalue\fR ] [ \fBcounters\fP ] [ \fBcomment\fP ] [ \fBskbinfo\fP ] +.PP +\fIADD\-ENTRY\fR := \fIipaddr\fR,\fImark\fR +.PP +\fIADD\-OPTIONS\fR := [ \fBtimeout\fR \fIvalue\fR ] [ \fBpackets\fR \fIvalue\fR ] [ \fBbytes\fR \fIvalue\fR ] [ \fBcomment\fR \fIstring\fR ] [ \fBskbmark\fR \fIvalue\fR ] [ \fBskbprio\fR \fIvalue\fR ] [ \fBskbqueue\fR \fIvalue\fR ] +.PP +\fIDEL\-ENTRY\fR := \fIipaddr\fR,\fImark\fR +.PP +\fITEST\-ENTRY\fR := \fIipaddr\fR,\fImark\fR +.PP +Optional \fBcreate\fR options: +.TP +\fBmarkmask\fR \fIvalue\fR +Allows you to set bits you are interested in the packet mark. This values is then used to perform bitwise AND operation for every mark added. +markmask can be any value between 1 and 4294967295, by default all 32 bits are set. +.PP +The +\fImark\fR +can be any value between 0 and 4294967295. +.PP +The \fBhash:ip,mark\fR type of sets require +two \fBsrc\fR/\fBdst\fR parameters of the \fBset\fR match and \fBSET\fR +target kernel modules. +.PP +Examples: +.IP +ipset create foo hash:ip,mark +.IP +ipset add foo 192.168.1.0/24,555 +.IP +ipset add foo 192.168.1.1,0x63 +.IP +ipset add foo 192.168.1.1,111236 +.SS hash:net,port,net +The \fBhash:net,port,net\fR set type behaves similarly to hash:ip,port,net but accepts a +cidr value for both the first and last parameter. Either subnet is permitted to be a /0 +should you wish to match port between all destinations. +.PP +\fICREATE\-OPTIONS\fR := [ \fBfamily\fR { \fBinet\fR | \fBinet6\fR } ] | [ \fBhashsize\fR \fIvalue\fR ] [ \fBmaxelem\fR \fIvalue\fR ] [ \fBtimeout\fR \fIvalue\fR ] [ \fBcounters\fP ] [ \fBcomment\fP ] [ \fBskbinfo\fP ] +.PP +\fIADD\-ENTRY\fR := \fInetaddr\fR,[\fIproto\fR:]\fIport\fR,\fInetaddr\fR +.PP +\fIADD\-OPTIONS\fR := [ \fBtimeout\fR \fIvalue\fR ] [ \fBnomatch\fR ] [ \fBpackets\fR \fIvalue\fR ] [ \fBbytes\fR \fIvalue\fR ] [ \fBcomment\fR \fIstring\fR ] [ \fBskbmark\fR \fIvalue\fR ] [ \fBskbprio\fR \fIvalue\fR ] [ \fBskbqueue\fR \fIvalue\fR ] +.PP +\fIDEL\-ENTRY\fR := \fInetaddr\fR,[\fIproto\fR:]\fIport\fR,\fInetaddr\fR +.PP +\fITEST\-ENTRY\fR := \fInetaddr\fR,[\fIproto\fR:]\fIport\fR,\fInetaddr\fR +.PP +where +\fInetaddr\fR := \fIip\fR[/\fIcidr\fR] +.PP +For the [\fIproto\fR:]\fIport\fR +part of the elements see the description at the +\fBhash:ip,port\fR set type. For the \fInetaddr\fR part of the elements +see the description at the \fBhash:net\fR set type. +.PP +From the \fBset\fR netfilter match point of view the searching for a match +always starts from the smallest size of netblock (most specific +cidr) to the largest one (least specific cidr) added to the set. +When adding/deleting triples +to the set by the \fBSET\fR netfilter target, it will be +added/deleted by the most specific cidr which can be found in the +set, or by the host cidr value if the set is empty. The first subnet has +precedence when performing the most-specific lookup, just as for hash:net,net +.PP +The lookup time grows linearly with the number of the different \fIcidr\fR +values added to the set and by the number of secondary \fIcidr\fR values per +primary. +.PP +The \fBhash:net,port,net\fR type of sets require three \fBsrc\fR/\fBdst\fR parameters of +the \fBset\fR match and \fBSET\fR target kernel modules. +.PP +Examples: +.IP +ipset create foo hash:net,port,net +.IP +ipset add foo 192.168.1.0/24,0,10.0.0/24 +.IP +ipset add foo 192.168.2.0/24,25,10.1.0.0/16 +.IP +ipset test foo 192.168.1.1,80,10.0.0.1 +.SS hash:net,iface +The \fBhash:net,iface\fR set type uses a hash to store different sized IP network +address and interface name pairs. +.PP +\fICREATE\-OPTIONS\fR := [ \fBfamily\fR { \fBinet\fR | \fBinet6\fR } ] | [ \fBhashsize\fR \fIvalue\fR ] [ \fBmaxelem\fR \fIvalue\fR ] [ \fBtimeout\fR \fIvalue\fR ] [ \fBcounters\fP ] [ \fBcomment\fP ] [ \fBskbinfo\fP ] +.PP +\fIADD\-ENTRY\fR := \fInetaddr\fR,[\fBphysdev\fR:]\fIiface\fR +.PP +\fIADD\-OPTIONS\fR := [ \fBtimeout\fR \fIvalue\fR ] [ \fBnomatch\fR ] [ \fBpackets\fR \fIvalue\fR ] [ \fBbytes\fR \fIvalue\fR ] [ \fBcomment\fR \fIstring\fR ] [ \fBskbmark\fR \fIvalue\fR ] [ \fBskbprio\fR \fIvalue\fR ] [ \fBskbqueue\fR \fIvalue\fR ] +.PP +\fIDEL\-ENTRY\fR := \fInetaddr\fR,[\fBphysdev\fR:]\fIiface\fR +.PP +\fITEST\-ENTRY\fR := \fInetaddr\fR,[\fBphysdev\fR:]\fIiface\fR +.PP +where +\fInetaddr\fR := \fIip\fR[/\fIcidr\fR] +.PP +For the \fInetaddr\fR part of the elements +see the description at the \fBhash:net\fR set type. +.PP +When adding/deleting/testing entries, if the cidr prefix parameter is not specified, +then the host prefix value is assumed. When adding/deleting entries, the exact +element is added/deleted and overlapping elements are not checked by the kernel. +When testing entries, if a host address is tested, then the kernel tries to match +the host address in the networks added to the set and reports the result accordingly. +.PP +From the \fBset\fR netfilter match point of view the searching for a match +always starts from the smallest size of netblock (most specific +prefix) to the largest one (least specific prefix) added to the set. +When adding/deleting IP +addresses to the set by the \fBSET\fR netfilter target, it will be +added/deleted by the most specific prefix which can be found in the +set, or by the host prefix value if the set is empty. +.PP +The second direction parameter of the \fBset\fR match and +\fBSET\fR target modules corresponds to the incoming/outgoing interface: +\fBsrc\fR to the incoming one (similar to the \fB\-i\fR flag of iptables), while +\fBdst\fR to the outgoing one (similar to the \fB\-o\fR flag of iptables). When +the interface is flagged with \fBphysdev:\fR, the interface is interpreted +as the incoming/outgoing bridge port. +.PP +The lookup time grows linearly with the number of the different prefix +values added to the set. +.PP +The internal restriction of the \fBhash:net,iface\fR set type is that +the same network prefix cannot be stored with more than 64 different interfaces +in a single set. +.PP +Examples: +.IP +ipset create foo hash:net,iface +.IP +ipset add foo 192.168.0/24,eth0 +.IP +ipset add foo 10.1.0.0/16,eth1 +.IP +ipset test foo 192.168.0/24,eth0 +.SS list:set +The \fBlist:set\fR type uses a simple list in which you can store +set names. +.PP +\fICREATE\-OPTIONS\fR := [ \fBsize\fR \fIvalue\fR ] [ \fBtimeout\fR \fIvalue\fR ] [ \fBcounters\fP ] [ \fBcomment\fP ] [ \fBskbinfo\fP ] +.PP +\fIADD\-ENTRY\fR := \fIsetname\fR [ { \fBbefore\fR | \fBafter\fR } \fIsetname\fR ] +.PP +\fIADD\-OPTIONS\fR := [ \fBtimeout\fR \fIvalue\fR ] [ \fBpackets\fR \fIvalue\fR ] [ \fBbytes\fR \fIvalue\fR ] [ \fBcomment\fR \fIstring\fR ] [ \fBskbmark\fR \fIvalue\fR ] [ \fBskbprio\fR \fIvalue\fR ] [ \fBskbqueue\fR \fIvalue\fR ] +.PP +\fIDEL\-ENTRY\fR := \fIsetname\fR [ { \fBbefore\fR | \fBafter\fR } \fIsetname\fR ] +.PP +\fITEST\-ENTRY\fR := \fIsetname\fR [ { \fBbefore\fR | \fBafter\fR } \fIsetname\fR ] +.PP +Optional \fBcreate\fR options: +.TP +\fBsize\fR \fIvalue\fR +The size of the list, the default is 8. The parameter is ignored since ipset +version 6.24. +.PP +By the \fBipset\fR command you can add, delete and test set names in a +\fBlist:set\fR type of set. +.PP +By the \fBset\fR match or \fBSET\fR target of netfilter +you can test, add or delete entries in the sets added to the \fBlist:set\fR +type of set. The match will try to find a matching entry in the sets and +the target will try to add an entry to the first set to which it can be added. +The number of direction options of the match and target are important: sets which +require more parameters than specified are skipped, while sets with equal +or less parameters are checked, elements added/deleted. For example if \fIa\fR and +\fIb\fR are \fBlist:set\fR type of sets then in the command +.IP +iptables \-m set \-\-match\-set a src,dst \-j SET \-\-add\-set b src,dst +.PP +the match and target will skip any set in \fIa\fR and \fIb\fR +which stores data triples, but will match all sets with single or double +data storage in \fIa\fR set and stop matching at the first successful set, +and add src to the first single or src,dst to the first double data storage set +in \fIb\fR to which the entry can be added. You can imagine a \fBlist:set\fR +type of set as an ordered union of the set elements. +.PP +Please note: by the \fBipset\fR command you can add, delete and \fBtest\fR +the setnames in a \fBlist:set\fR type of set, and \fBnot\fR the presence of +a set's member (such as an IP address). +.SH "GENERAL RESTRICTIONS" +Zero valued set entries cannot be used with hash methods. Zero protocol value with ports +cannot be used. +.SH "COMMENTS" +If you want to store same size subnets from a given network +(say /24 blocks from a /8 network), use the \fBbitmap:ip\fR set type. +If you want to store random same size networks (say random /24 blocks), +use the \fBhash:ip\fR set type. If you have got random size of netblocks, +use \fBhash:net\fR. +.PP +Matching on destination MAC addresses using the \fBdst\fR parameter of the +\fBset\fR match netfilter kernel modules will only work if the destination MAC +address is available in the packet at the given processing stage, that is, it +only applies for incoming packets in the \fBPREROUTING\fR, \fBINPUT\fR and +\fBFORWARD\fR chains, against the MAC address as originally found in the +received packet (typically, one of the MAC addresses of the local host). This is +\fBnot\fR the destination MAC address a destination IP address resolves to, +after routing. If the MAC address is not available (e.g. in the \fBOUTPUT\fR +chain), the packet will simply not match. +.PP +Backward compatibility is maintained and old \fBipset\fR syntax is still supported. +.PP +The \fBiptree\fR and \fBiptreemap\fR set types are removed: if you refer to them, +they are automatically replaced by \fBhash:ip\fR type of sets. +.SH "DIAGNOSTICS" +Various error messages are printed to standard error. The exit code +is 0 for correct functioning. +.SH "BUGS" +Bugs? No, just funny features. :\-) +OK, just kidding... +.SH "SEE ALSO" +\fBiptables\fR(8), +\fBip6tables\fR(8) +\fBiptables-extensions\fR(8) +.SH "AUTHORS" +Jozsef Kadlecsik wrote ipset, which is based on ippool by +Joakim Axelsson, Patrick Schaaf and Martin Josefsson. +.br +Sven Wegener wrote the iptreemap type. +.SH "LAST REMARK" +\fBI stand on the shoulders of giants.\fR diff --git a/src/ipset.c b/src/ipset.c new file mode 100644 index 0000000..fcb2247 --- /dev/null +++ b/src/ipset.c @@ -0,0 +1,37 @@ +/* Copyright 2000-2002 Joakim Axelsson (gozem@linux.nu) + * Patrick Schaaf (bof@bof.de) + * Copyright 2003-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* assert */ +#include /* fprintf */ +#include /* exit */ + +#include +#include /* ipset library */ + +int +main(int argc, char *argv[]) +{ + struct ipset *ipset; + int ret; + + /* Load set types */ + ipset_load_types(); + + /* Initialize ipset library */ + ipset = ipset_init(); + if (ipset == NULL) { + fprintf(stderr, "Cannot initialize ipset, aborting."); + exit(1); + } + + ret = ipset_parse_argv(ipset, argc, argv); + + ipset_fini(ipset); + + return ret; +} diff --git a/src/ui.c b/src/ui.c new file mode 100644 index 0000000..fb378ba --- /dev/null +++ b/src/ui.c @@ -0,0 +1,288 @@ +/* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include /* assert */ +#include /* memcmp, str* */ + +#include /* IPSET_CMD_* */ +#include /* id_to_icmp */ +#include /* id_to_icmpv6 */ +#include /* IPSET_*_ARG */ +#include /* ipset_envopt_parse */ +#include /* ipset_parse_family */ +#include /* ipset_print_family */ +#include /* STREQ */ +#include /* prototypes */ + +/* Commands and environment options */ + +const struct ipset_commands ipset_commands[] = { + /* Order is important */ + + { /* c[reate], --create, n[ew], -N */ + .cmd = IPSET_CMD_CREATE, + .name = { "create", "new", "-N" }, + .has_arg = IPSET_MANDATORY_ARG2, + .help = "SETNAME TYPENAME [type-specific-options]\n" + " Create a new set", + }, + { /* a[dd], --add, -A */ + .cmd = IPSET_CMD_ADD, + .name = { "add", "-A", NULL }, + .has_arg = IPSET_MANDATORY_ARG2, + .help = "SETNAME ENTRY\n" + " Add entry to the named set", + }, + { /* d[el], --del, -D */ + .cmd = IPSET_CMD_DEL, + .name = { "del", "-D", NULL }, + .has_arg = IPSET_MANDATORY_ARG2, + .help = "SETNAME ENTRY\n" + " Delete entry from the named set", + }, + { /* t[est], --test, -T */ + .cmd = IPSET_CMD_TEST, + .name = { "test", "-T", NULL }, + .has_arg = IPSET_MANDATORY_ARG2, + .help = "SETNAME ENTRY\n" + " Test entry in the named set", + }, + { /* des[troy], --destroy, x, -X */ + .cmd = IPSET_CMD_DESTROY, + .name = { "destroy", "x", "-X" }, + .has_arg = IPSET_OPTIONAL_ARG, + .help = "[SETNAME]\n" + " Destroy a named set or all sets", + }, + { /* l[ist], --list, -L */ + .cmd = IPSET_CMD_LIST, + .name = { "list", "-L", NULL }, + .has_arg = IPSET_OPTIONAL_ARG, + .help = "[SETNAME]\n" + " List the entries of a named set or all sets", + }, + { /* s[save], --save, -S */ + .cmd = IPSET_CMD_SAVE, + .name = { "save", "-S", NULL }, + .has_arg = IPSET_OPTIONAL_ARG, + .help = "[SETNAME]\n" + " Save the named set or all sets to stdout", + }, + { /* r[estore], --restore, -R */ + .cmd = IPSET_CMD_RESTORE, + .name = { "restore", "-R", NULL }, + .has_arg = IPSET_NO_ARG, + .help = "\n" + " Restore a saved state", + }, + { /* f[lush], --flush, -F */ + .cmd = IPSET_CMD_FLUSH, + .name = { "flush", "-F", NULL }, + .has_arg = IPSET_OPTIONAL_ARG, + .help = "[SETNAME]\n" + " Flush a named set or all sets", + }, + { /* ren[ame], --rename, e, -E */ + .cmd = IPSET_CMD_RENAME, + .name = { "rename", "e", "-E" }, + .has_arg = IPSET_MANDATORY_ARG2, + .help = "FROM-SETNAME TO-SETNAME\n" + " Rename two sets", + }, + { /* sw[ap], --swap, w, -W */ + .cmd = IPSET_CMD_SWAP, + .name = { "swap", "w", "-W" }, + .has_arg = IPSET_MANDATORY_ARG2, + .help = "FROM-SETNAME TO-SETNAME\n" + " Swap the contect of two existing sets", + }, + { /* h[elp, --help, -H */ + .cmd = IPSET_CMD_HELP, + .name = { "help", "-h", "-H" }, + .has_arg = IPSET_OPTIONAL_ARG, + .help = "[TYPENAME]\n" + " Print help, and settype specific help", + }, + { /* v[ersion], --version, -V */ + .cmd = IPSET_CMD_VERSION, + .name = { "version", "-v", "-V" }, + .has_arg = IPSET_NO_ARG, + .help = "\n" + " Print version information", + }, + { /* q[uit] */ + .cmd = IPSET_CMD_QUIT, + .name = { "quit", NULL }, + .has_arg = IPSET_NO_ARG, + .help = "\n" + " Quit interactive mode", + }, + { }, +}; + +/* Match a command: try to match as a prefix or letter-command */ +bool +ipset_match_cmd(const char *arg, const char * const name[]) +{ + size_t len, skip = 0; + int i; + + assert(arg); + assert(name && name[0]); + + /* Ignore two leading dashes */ + if (arg[0] == '-' && arg[1] == '-') + skip = 2; + + len = strlen(arg); + if (len <= skip || (len == 1 && arg[0] == '-')) + return false; + + for (i = 0; i < IPSET_CMD_ALIASES && name[i] != NULL; i++) { + /* New command name options */ + if (STRNEQ(arg + skip, name[i], len - skip)) + return true; + } + return false; +} + +/* Used up so far + * + * -A add + * -D del + * -E rename + * -f -file + * -F flush + * -h help + * -H help + * -L list + * -n -name + * -N create + * -o -output + * -r -resolve + * -R restore + * -s -sorted + * -S save + * -t -terse + * -T test + * -q -quiet + * -X destroy + * -v version + * -V version + * -W swap + * -! -exist + */ + +const struct ipset_envopts ipset_envopts[] = { + { .name = { "-o", "-output" }, + .has_arg = IPSET_MANDATORY_ARG, .flag = IPSET_OPT_MAX, + .parse = ipset_parse_output, + .help = "plain|save|xml\n" + " Specify output mode for listing sets.\n" + " Default value for \"list\" command is mode \"plain\"\n" + " and for \"save\" command is mode \"save\".", + }, + { .name = { "-s", "-sorted" }, + .parse = ipset_envopt_parse, + .has_arg = IPSET_NO_ARG, .flag = IPSET_ENV_SORTED, + .help = "\n" + " Print elements sorted (if supported by the set type).", + }, + { .name = { "-q", "-quiet" }, + .parse = ipset_envopt_parse, + .has_arg = IPSET_NO_ARG, .flag = IPSET_ENV_QUIET, + .help = "\n" + " Suppress any notice or warning message.", + }, + { .name = { "-r", "-resolve" }, + .parse = ipset_envopt_parse, + .has_arg = IPSET_NO_ARG, .flag = IPSET_ENV_RESOLVE, + .help = "\n" + " Try to resolve IP addresses in the output (slow!)", + }, + { .name = { "-!", "-exist" }, + .parse = ipset_envopt_parse, + .has_arg = IPSET_NO_ARG, .flag = IPSET_ENV_EXIST, + .help = "\n" + " Ignore errors when creating or adding sets or\n" + " elements that do exist or when deleting elements\n" + " that don't exist.", + }, + { .name = { "-n", "-name" }, + .parse = ipset_envopt_parse, + .has_arg = IPSET_NO_ARG, .flag = IPSET_ENV_LIST_SETNAME, + .help = "\n" + " When listing, just list setnames from the kernel.\n", + }, + { .name = { "-t", "-terse" }, + .parse = ipset_envopt_parse, + .has_arg = IPSET_NO_ARG, .flag = IPSET_ENV_LIST_HEADER, + .help = "\n" + " When listing, list setnames and set headers\n" + " from kernel only.", + }, + { .name = { "-f", "-file" }, + .parse = ipset_parse_file, + .has_arg = IPSET_MANDATORY_ARG, .flag = IPSET_OPT_MAX, + .help = "\n" + " Read from the given file instead of standard\n" + " input (restore) or write to given file instead\n" + " of standard output (list/save).", + }, + { }, +}; + +/* Strict option matching */ +bool +ipset_match_option(const char *arg, const char * const name[]) +{ + assert(arg); + assert(name && name[0]); + + /* Skip two leading dashes */ + if (arg[0] == '-' && arg[1] == '-') + arg++, arg++; + + return STREQ(arg, name[0]) || + (name[1] != NULL && STREQ(arg, name[1])); +} + +/* Strict envopt matching */ +bool +ipset_match_envopt(const char *arg, const char * const name[]) +{ + assert(arg); + assert(name && name[0]); + + /* Skip one leading dash */ + if (arg[0] == '-' && arg[1] == '-') + arg++; + + return STREQ(arg, name[0]) || + (name[1] != NULL && STREQ(arg, name[1])); +} + +/** + * ipset_shift_argv - shift off an argument + * @arc: argument count + * @argv: array of argument strings + * @from: from where shift off an argument + * + * Shift off the argument at "from" from the array of + * arguments argv of size argc. + */ +void +ipset_shift_argv(int *argc, char *argv[], int from) +{ + int i; + + assert(*argc >= from + 1); + + for (i = from + 1; i <= *argc; i++) + argv[i-1] = argv[i]; + (*argc)--; + return; +} diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 0000000..9b62557 --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,5 @@ +## Process this file with automake to produce Makefile.in + +include $(top_srcdir)/Make_global.am + +TESTS = ./runtest.sh diff --git a/tests/big_sort.saved b/tests/big_sort.saved new file mode 100644 index 0000000..e45389a --- /dev/null +++ b/tests/big_sort.saved @@ -0,0 +1,65537 @@ +create test hash:ip family inet hashsize 32768 maxelem 65536 +add test 10.10.0.0 +add test 10.10.0.1 +add test 10.10.0.10 +add test 10.10.0.100 +add test 10.10.0.101 +add test 10.10.0.102 +add test 10.10.0.103 +add test 10.10.0.104 +add test 10.10.0.105 +add test 10.10.0.106 +add test 10.10.0.107 +add test 10.10.0.108 +add test 10.10.0.109 +add test 10.10.0.11 +add test 10.10.0.110 +add test 10.10.0.111 +add test 10.10.0.112 +add test 10.10.0.113 +add test 10.10.0.114 +add test 10.10.0.115 +add test 10.10.0.116 +add test 10.10.0.117 +add test 10.10.0.118 +add test 10.10.0.119 +add test 10.10.0.12 +add test 10.10.0.120 +add test 10.10.0.121 +add test 10.10.0.122 +add test 10.10.0.123 +add test 10.10.0.124 +add test 10.10.0.125 +add test 10.10.0.126 +add test 10.10.0.127 +add test 10.10.0.128 +add test 10.10.0.129 +add test 10.10.0.13 +add test 10.10.0.130 +add test 10.10.0.131 +add test 10.10.0.132 +add test 10.10.0.133 +add test 10.10.0.134 +add test 10.10.0.135 +add test 10.10.0.136 +add test 10.10.0.137 +add test 10.10.0.138 +add test 10.10.0.139 +add test 10.10.0.14 +add test 10.10.0.140 +add test 10.10.0.141 +add test 10.10.0.142 +add test 10.10.0.143 +add test 10.10.0.144 +add test 10.10.0.145 +add test 10.10.0.146 +add test 10.10.0.147 +add test 10.10.0.148 +add test 10.10.0.149 +add test 10.10.0.15 +add test 10.10.0.150 +add test 10.10.0.151 +add test 10.10.0.152 +add test 10.10.0.153 +add test 10.10.0.154 +add test 10.10.0.155 +add test 10.10.0.156 +add test 10.10.0.157 +add test 10.10.0.158 +add test 10.10.0.159 +add test 10.10.0.16 +add test 10.10.0.160 +add test 10.10.0.161 +add test 10.10.0.162 +add test 10.10.0.163 +add test 10.10.0.164 +add test 10.10.0.165 +add test 10.10.0.166 +add test 10.10.0.167 +add test 10.10.0.168 +add test 10.10.0.169 +add test 10.10.0.17 +add test 10.10.0.170 +add test 10.10.0.171 +add test 10.10.0.172 +add test 10.10.0.173 +add test 10.10.0.174 +add test 10.10.0.175 +add test 10.10.0.176 +add test 10.10.0.177 +add test 10.10.0.178 +add test 10.10.0.179 +add test 10.10.0.18 +add test 10.10.0.180 +add test 10.10.0.181 +add test 10.10.0.182 +add test 10.10.0.183 +add test 10.10.0.184 +add test 10.10.0.185 +add test 10.10.0.186 +add test 10.10.0.187 +add test 10.10.0.188 +add test 10.10.0.189 +add test 10.10.0.19 +add test 10.10.0.190 +add test 10.10.0.191 +add test 10.10.0.192 +add test 10.10.0.193 +add test 10.10.0.194 +add test 10.10.0.195 +add test 10.10.0.196 +add test 10.10.0.197 +add test 10.10.0.198 +add test 10.10.0.199 +add test 10.10.0.2 +add test 10.10.0.20 +add test 10.10.0.200 +add test 10.10.0.201 +add test 10.10.0.202 +add test 10.10.0.203 +add test 10.10.0.204 +add test 10.10.0.205 +add test 10.10.0.206 +add test 10.10.0.207 +add test 10.10.0.208 +add test 10.10.0.209 +add test 10.10.0.21 +add test 10.10.0.210 +add test 10.10.0.211 +add test 10.10.0.212 +add test 10.10.0.213 +add test 10.10.0.214 +add test 10.10.0.215 +add test 10.10.0.216 +add test 10.10.0.217 +add test 10.10.0.218 +add test 10.10.0.219 +add test 10.10.0.22 +add test 10.10.0.220 +add test 10.10.0.221 +add test 10.10.0.222 +add test 10.10.0.223 +add test 10.10.0.224 +add test 10.10.0.225 +add test 10.10.0.226 +add test 10.10.0.227 +add test 10.10.0.228 +add test 10.10.0.229 +add test 10.10.0.23 +add test 10.10.0.230 +add test 10.10.0.231 +add test 10.10.0.232 +add test 10.10.0.233 +add test 10.10.0.234 +add test 10.10.0.235 +add test 10.10.0.236 +add test 10.10.0.237 +add test 10.10.0.238 +add test 10.10.0.239 +add test 10.10.0.24 +add test 10.10.0.240 +add test 10.10.0.241 +add test 10.10.0.242 +add test 10.10.0.243 +add test 10.10.0.244 +add test 10.10.0.245 +add test 10.10.0.246 +add test 10.10.0.247 +add test 10.10.0.248 +add test 10.10.0.249 +add test 10.10.0.25 +add test 10.10.0.250 +add test 10.10.0.251 +add test 10.10.0.252 +add test 10.10.0.253 +add test 10.10.0.254 +add test 10.10.0.255 +add test 10.10.0.26 +add test 10.10.0.27 +add test 10.10.0.28 +add test 10.10.0.29 +add test 10.10.0.3 +add test 10.10.0.30 +add test 10.10.0.31 +add test 10.10.0.32 +add test 10.10.0.33 +add test 10.10.0.34 +add test 10.10.0.35 +add test 10.10.0.36 +add test 10.10.0.37 +add test 10.10.0.38 +add test 10.10.0.39 +add test 10.10.0.4 +add test 10.10.0.40 +add test 10.10.0.41 +add test 10.10.0.42 +add test 10.10.0.43 +add test 10.10.0.44 +add test 10.10.0.45 +add test 10.10.0.46 +add test 10.10.0.47 +add test 10.10.0.48 +add test 10.10.0.49 +add test 10.10.0.5 +add test 10.10.0.50 +add test 10.10.0.51 +add test 10.10.0.52 +add test 10.10.0.53 +add test 10.10.0.54 +add test 10.10.0.55 +add test 10.10.0.56 +add test 10.10.0.57 +add test 10.10.0.58 +add test 10.10.0.59 +add test 10.10.0.6 +add test 10.10.0.60 +add test 10.10.0.61 +add test 10.10.0.62 +add test 10.10.0.63 +add test 10.10.0.64 +add test 10.10.0.65 +add test 10.10.0.66 +add test 10.10.0.67 +add test 10.10.0.68 +add test 10.10.0.69 +add test 10.10.0.7 +add test 10.10.0.70 +add test 10.10.0.71 +add test 10.10.0.72 +add test 10.10.0.73 +add test 10.10.0.74 +add test 10.10.0.75 +add test 10.10.0.76 +add test 10.10.0.77 +add test 10.10.0.78 +add test 10.10.0.79 +add test 10.10.0.8 +add test 10.10.0.80 +add test 10.10.0.81 +add test 10.10.0.82 +add test 10.10.0.83 +add test 10.10.0.84 +add test 10.10.0.85 +add test 10.10.0.86 +add test 10.10.0.87 +add test 10.10.0.88 +add test 10.10.0.89 +add test 10.10.0.9 +add test 10.10.0.90 +add test 10.10.0.91 +add test 10.10.0.92 +add test 10.10.0.93 +add test 10.10.0.94 +add test 10.10.0.95 +add test 10.10.0.96 +add test 10.10.0.97 +add test 10.10.0.98 +add test 10.10.0.99 +add test 10.10.1.0 +add test 10.10.1.1 +add test 10.10.1.10 +add test 10.10.1.100 +add test 10.10.1.101 +add test 10.10.1.102 +add test 10.10.1.103 +add test 10.10.1.104 +add test 10.10.1.105 +add test 10.10.1.106 +add test 10.10.1.107 +add test 10.10.1.108 +add test 10.10.1.109 +add test 10.10.1.11 +add test 10.10.1.110 +add test 10.10.1.111 +add test 10.10.1.112 +add test 10.10.1.113 +add test 10.10.1.114 +add test 10.10.1.115 +add test 10.10.1.116 +add test 10.10.1.117 +add test 10.10.1.118 +add test 10.10.1.119 +add test 10.10.1.12 +add test 10.10.1.120 +add test 10.10.1.121 +add test 10.10.1.122 +add test 10.10.1.123 +add test 10.10.1.124 +add test 10.10.1.125 +add test 10.10.1.126 +add test 10.10.1.127 +add test 10.10.1.128 +add test 10.10.1.129 +add test 10.10.1.13 +add test 10.10.1.130 +add test 10.10.1.131 +add test 10.10.1.132 +add test 10.10.1.133 +add test 10.10.1.134 +add test 10.10.1.135 +add test 10.10.1.136 +add test 10.10.1.137 +add test 10.10.1.138 +add test 10.10.1.139 +add test 10.10.1.14 +add test 10.10.1.140 +add test 10.10.1.141 +add test 10.10.1.142 +add test 10.10.1.143 +add test 10.10.1.144 +add test 10.10.1.145 +add test 10.10.1.146 +add test 10.10.1.147 +add test 10.10.1.148 +add test 10.10.1.149 +add test 10.10.1.15 +add test 10.10.1.150 +add test 10.10.1.151 +add test 10.10.1.152 +add test 10.10.1.153 +add test 10.10.1.154 +add test 10.10.1.155 +add test 10.10.1.156 +add test 10.10.1.157 +add test 10.10.1.158 +add test 10.10.1.159 +add test 10.10.1.16 +add test 10.10.1.160 +add test 10.10.1.161 +add test 10.10.1.162 +add test 10.10.1.163 +add test 10.10.1.164 +add test 10.10.1.165 +add test 10.10.1.166 +add test 10.10.1.167 +add test 10.10.1.168 +add test 10.10.1.169 +add test 10.10.1.17 +add test 10.10.1.170 +add test 10.10.1.171 +add test 10.10.1.172 +add test 10.10.1.173 +add test 10.10.1.174 +add test 10.10.1.175 +add test 10.10.1.176 +add test 10.10.1.177 +add test 10.10.1.178 +add test 10.10.1.179 +add test 10.10.1.18 +add test 10.10.1.180 +add test 10.10.1.181 +add test 10.10.1.182 +add test 10.10.1.183 +add test 10.10.1.184 +add test 10.10.1.185 +add test 10.10.1.186 +add test 10.10.1.187 +add test 10.10.1.188 +add test 10.10.1.189 +add test 10.10.1.19 +add test 10.10.1.190 +add test 10.10.1.191 +add test 10.10.1.192 +add test 10.10.1.193 +add test 10.10.1.194 +add test 10.10.1.195 +add test 10.10.1.196 +add test 10.10.1.197 +add test 10.10.1.198 +add test 10.10.1.199 +add test 10.10.1.2 +add test 10.10.1.20 +add test 10.10.1.200 +add test 10.10.1.201 +add test 10.10.1.202 +add test 10.10.1.203 +add test 10.10.1.204 +add test 10.10.1.205 +add test 10.10.1.206 +add test 10.10.1.207 +add test 10.10.1.208 +add test 10.10.1.209 +add test 10.10.1.21 +add test 10.10.1.210 +add test 10.10.1.211 +add test 10.10.1.212 +add test 10.10.1.213 +add test 10.10.1.214 +add test 10.10.1.215 +add test 10.10.1.216 +add test 10.10.1.217 +add test 10.10.1.218 +add test 10.10.1.219 +add test 10.10.1.22 +add test 10.10.1.220 +add test 10.10.1.221 +add test 10.10.1.222 +add test 10.10.1.223 +add test 10.10.1.224 +add test 10.10.1.225 +add test 10.10.1.226 +add test 10.10.1.227 +add test 10.10.1.228 +add test 10.10.1.229 +add test 10.10.1.23 +add test 10.10.1.230 +add test 10.10.1.231 +add test 10.10.1.232 +add test 10.10.1.233 +add test 10.10.1.234 +add test 10.10.1.235 +add test 10.10.1.236 +add test 10.10.1.237 +add test 10.10.1.238 +add test 10.10.1.239 +add test 10.10.1.24 +add test 10.10.1.240 +add test 10.10.1.241 +add test 10.10.1.242 +add test 10.10.1.243 +add test 10.10.1.244 +add test 10.10.1.245 +add test 10.10.1.246 +add test 10.10.1.247 +add test 10.10.1.248 +add test 10.10.1.249 +add test 10.10.1.25 +add test 10.10.1.250 +add test 10.10.1.251 +add test 10.10.1.252 +add test 10.10.1.253 +add test 10.10.1.254 +add test 10.10.1.255 +add test 10.10.1.26 +add test 10.10.1.27 +add test 10.10.1.28 +add test 10.10.1.29 +add test 10.10.1.3 +add test 10.10.1.30 +add test 10.10.1.31 +add test 10.10.1.32 +add test 10.10.1.33 +add test 10.10.1.34 +add test 10.10.1.35 +add test 10.10.1.36 +add test 10.10.1.37 +add test 10.10.1.38 +add test 10.10.1.39 +add test 10.10.1.4 +add test 10.10.1.40 +add test 10.10.1.41 +add test 10.10.1.42 +add test 10.10.1.43 +add test 10.10.1.44 +add test 10.10.1.45 +add test 10.10.1.46 +add test 10.10.1.47 +add test 10.10.1.48 +add test 10.10.1.49 +add test 10.10.1.5 +add test 10.10.1.50 +add test 10.10.1.51 +add test 10.10.1.52 +add test 10.10.1.53 +add test 10.10.1.54 +add test 10.10.1.55 +add test 10.10.1.56 +add test 10.10.1.57 +add test 10.10.1.58 +add test 10.10.1.59 +add test 10.10.1.6 +add test 10.10.1.60 +add test 10.10.1.61 +add test 10.10.1.62 +add test 10.10.1.63 +add test 10.10.1.64 +add test 10.10.1.65 +add test 10.10.1.66 +add test 10.10.1.67 +add test 10.10.1.68 +add test 10.10.1.69 +add test 10.10.1.7 +add test 10.10.1.70 +add test 10.10.1.71 +add test 10.10.1.72 +add test 10.10.1.73 +add test 10.10.1.74 +add test 10.10.1.75 +add test 10.10.1.76 +add test 10.10.1.77 +add test 10.10.1.78 +add test 10.10.1.79 +add test 10.10.1.8 +add test 10.10.1.80 +add test 10.10.1.81 +add test 10.10.1.82 +add test 10.10.1.83 +add test 10.10.1.84 +add test 10.10.1.85 +add test 10.10.1.86 +add test 10.10.1.87 +add test 10.10.1.88 +add test 10.10.1.89 +add test 10.10.1.9 +add test 10.10.1.90 +add test 10.10.1.91 +add test 10.10.1.92 +add test 10.10.1.93 +add test 10.10.1.94 +add test 10.10.1.95 +add test 10.10.1.96 +add test 10.10.1.97 +add test 10.10.1.98 +add test 10.10.1.99 +add test 10.10.10.0 +add test 10.10.10.1 +add test 10.10.10.10 +add test 10.10.10.100 +add test 10.10.10.101 +add test 10.10.10.102 +add test 10.10.10.103 +add test 10.10.10.104 +add test 10.10.10.105 +add test 10.10.10.106 +add test 10.10.10.107 +add test 10.10.10.108 +add test 10.10.10.109 +add test 10.10.10.11 +add test 10.10.10.110 +add test 10.10.10.111 +add test 10.10.10.112 +add test 10.10.10.113 +add test 10.10.10.114 +add test 10.10.10.115 +add test 10.10.10.116 +add test 10.10.10.117 +add test 10.10.10.118 +add test 10.10.10.119 +add test 10.10.10.12 +add test 10.10.10.120 +add test 10.10.10.121 +add test 10.10.10.122 +add test 10.10.10.123 +add test 10.10.10.124 +add test 10.10.10.125 +add test 10.10.10.126 +add test 10.10.10.127 +add test 10.10.10.128 +add test 10.10.10.129 +add test 10.10.10.13 +add test 10.10.10.130 +add test 10.10.10.131 +add test 10.10.10.132 +add test 10.10.10.133 +add test 10.10.10.134 +add test 10.10.10.135 +add test 10.10.10.136 +add test 10.10.10.137 +add test 10.10.10.138 +add test 10.10.10.139 +add test 10.10.10.14 +add test 10.10.10.140 +add test 10.10.10.141 +add test 10.10.10.142 +add test 10.10.10.143 +add test 10.10.10.144 +add test 10.10.10.145 +add test 10.10.10.146 +add test 10.10.10.147 +add test 10.10.10.148 +add test 10.10.10.149 +add test 10.10.10.15 +add test 10.10.10.150 +add test 10.10.10.151 +add test 10.10.10.152 +add test 10.10.10.153 +add test 10.10.10.154 +add test 10.10.10.155 +add test 10.10.10.156 +add test 10.10.10.157 +add test 10.10.10.158 +add test 10.10.10.159 +add test 10.10.10.16 +add test 10.10.10.160 +add test 10.10.10.161 +add test 10.10.10.162 +add test 10.10.10.163 +add test 10.10.10.164 +add test 10.10.10.165 +add test 10.10.10.166 +add test 10.10.10.167 +add test 10.10.10.168 +add test 10.10.10.169 +add test 10.10.10.17 +add test 10.10.10.170 +add test 10.10.10.171 +add test 10.10.10.172 +add test 10.10.10.173 +add test 10.10.10.174 +add test 10.10.10.175 +add test 10.10.10.176 +add test 10.10.10.177 +add test 10.10.10.178 +add test 10.10.10.179 +add test 10.10.10.18 +add test 10.10.10.180 +add test 10.10.10.181 +add test 10.10.10.182 +add test 10.10.10.183 +add test 10.10.10.184 +add test 10.10.10.185 +add test 10.10.10.186 +add test 10.10.10.187 +add test 10.10.10.188 +add test 10.10.10.189 +add test 10.10.10.19 +add test 10.10.10.190 +add test 10.10.10.191 +add test 10.10.10.192 +add test 10.10.10.193 +add test 10.10.10.194 +add test 10.10.10.195 +add test 10.10.10.196 +add test 10.10.10.197 +add test 10.10.10.198 +add test 10.10.10.199 +add test 10.10.10.2 +add test 10.10.10.20 +add test 10.10.10.200 +add test 10.10.10.201 +add test 10.10.10.202 +add test 10.10.10.203 +add test 10.10.10.204 +add test 10.10.10.205 +add test 10.10.10.206 +add test 10.10.10.207 +add test 10.10.10.208 +add test 10.10.10.209 +add test 10.10.10.21 +add test 10.10.10.210 +add test 10.10.10.211 +add test 10.10.10.212 +add test 10.10.10.213 +add test 10.10.10.214 +add test 10.10.10.215 +add test 10.10.10.216 +add test 10.10.10.217 +add test 10.10.10.218 +add test 10.10.10.219 +add test 10.10.10.22 +add test 10.10.10.220 +add test 10.10.10.221 +add test 10.10.10.222 +add test 10.10.10.223 +add test 10.10.10.224 +add test 10.10.10.225 +add test 10.10.10.226 +add test 10.10.10.227 +add test 10.10.10.228 +add test 10.10.10.229 +add test 10.10.10.23 +add test 10.10.10.230 +add test 10.10.10.231 +add test 10.10.10.232 +add test 10.10.10.233 +add test 10.10.10.234 +add test 10.10.10.235 +add test 10.10.10.236 +add test 10.10.10.237 +add test 10.10.10.238 +add test 10.10.10.239 +add test 10.10.10.24 +add test 10.10.10.240 +add test 10.10.10.241 +add test 10.10.10.242 +add test 10.10.10.243 +add test 10.10.10.244 +add test 10.10.10.245 +add test 10.10.10.246 +add test 10.10.10.247 +add test 10.10.10.248 +add test 10.10.10.249 +add test 10.10.10.25 +add test 10.10.10.250 +add test 10.10.10.251 +add test 10.10.10.252 +add test 10.10.10.253 +add test 10.10.10.254 +add test 10.10.10.255 +add test 10.10.10.26 +add test 10.10.10.27 +add test 10.10.10.28 +add test 10.10.10.29 +add test 10.10.10.3 +add test 10.10.10.30 +add test 10.10.10.31 +add test 10.10.10.32 +add test 10.10.10.33 +add test 10.10.10.34 +add test 10.10.10.35 +add test 10.10.10.36 +add test 10.10.10.37 +add test 10.10.10.38 +add test 10.10.10.39 +add test 10.10.10.4 +add test 10.10.10.40 +add test 10.10.10.41 +add test 10.10.10.42 +add test 10.10.10.43 +add test 10.10.10.44 +add test 10.10.10.45 +add test 10.10.10.46 +add test 10.10.10.47 +add test 10.10.10.48 +add test 10.10.10.49 +add test 10.10.10.5 +add test 10.10.10.50 +add test 10.10.10.51 +add test 10.10.10.52 +add test 10.10.10.53 +add test 10.10.10.54 +add test 10.10.10.55 +add test 10.10.10.56 +add test 10.10.10.57 +add test 10.10.10.58 +add test 10.10.10.59 +add test 10.10.10.6 +add test 10.10.10.60 +add test 10.10.10.61 +add test 10.10.10.62 +add test 10.10.10.63 +add test 10.10.10.64 +add test 10.10.10.65 +add test 10.10.10.66 +add test 10.10.10.67 +add test 10.10.10.68 +add test 10.10.10.69 +add test 10.10.10.7 +add test 10.10.10.70 +add test 10.10.10.71 +add test 10.10.10.72 +add test 10.10.10.73 +add test 10.10.10.74 +add test 10.10.10.75 +add test 10.10.10.76 +add test 10.10.10.77 +add test 10.10.10.78 +add test 10.10.10.79 +add test 10.10.10.8 +add test 10.10.10.80 +add test 10.10.10.81 +add test 10.10.10.82 +add test 10.10.10.83 +add test 10.10.10.84 +add test 10.10.10.85 +add test 10.10.10.86 +add test 10.10.10.87 +add test 10.10.10.88 +add test 10.10.10.89 +add test 10.10.10.9 +add test 10.10.10.90 +add test 10.10.10.91 +add test 10.10.10.92 +add test 10.10.10.93 +add test 10.10.10.94 +add test 10.10.10.95 +add test 10.10.10.96 +add test 10.10.10.97 +add test 10.10.10.98 +add test 10.10.10.99 +add test 10.10.100.0 +add test 10.10.100.1 +add test 10.10.100.10 +add test 10.10.100.100 +add test 10.10.100.101 +add test 10.10.100.102 +add test 10.10.100.103 +add test 10.10.100.104 +add test 10.10.100.105 +add test 10.10.100.106 +add test 10.10.100.107 +add test 10.10.100.108 +add test 10.10.100.109 +add test 10.10.100.11 +add test 10.10.100.110 +add test 10.10.100.111 +add test 10.10.100.112 +add test 10.10.100.113 +add test 10.10.100.114 +add test 10.10.100.115 +add test 10.10.100.116 +add test 10.10.100.117 +add test 10.10.100.118 +add test 10.10.100.119 +add test 10.10.100.12 +add test 10.10.100.120 +add test 10.10.100.121 +add test 10.10.100.122 +add test 10.10.100.123 +add test 10.10.100.124 +add test 10.10.100.125 +add test 10.10.100.126 +add test 10.10.100.127 +add test 10.10.100.128 +add test 10.10.100.129 +add test 10.10.100.13 +add test 10.10.100.130 +add test 10.10.100.131 +add test 10.10.100.132 +add test 10.10.100.133 +add test 10.10.100.134 +add test 10.10.100.135 +add test 10.10.100.136 +add test 10.10.100.137 +add test 10.10.100.138 +add test 10.10.100.139 +add test 10.10.100.14 +add test 10.10.100.140 +add test 10.10.100.141 +add test 10.10.100.142 +add test 10.10.100.143 +add test 10.10.100.144 +add test 10.10.100.145 +add test 10.10.100.146 +add test 10.10.100.147 +add test 10.10.100.148 +add test 10.10.100.149 +add test 10.10.100.15 +add test 10.10.100.150 +add test 10.10.100.151 +add test 10.10.100.152 +add test 10.10.100.153 +add test 10.10.100.154 +add test 10.10.100.155 +add test 10.10.100.156 +add test 10.10.100.157 +add test 10.10.100.158 +add test 10.10.100.159 +add test 10.10.100.16 +add test 10.10.100.160 +add test 10.10.100.161 +add test 10.10.100.162 +add test 10.10.100.163 +add test 10.10.100.164 +add test 10.10.100.165 +add test 10.10.100.166 +add test 10.10.100.167 +add test 10.10.100.168 +add test 10.10.100.169 +add test 10.10.100.17 +add test 10.10.100.170 +add test 10.10.100.171 +add test 10.10.100.172 +add test 10.10.100.173 +add test 10.10.100.174 +add test 10.10.100.175 +add test 10.10.100.176 +add test 10.10.100.177 +add test 10.10.100.178 +add test 10.10.100.179 +add test 10.10.100.18 +add test 10.10.100.180 +add test 10.10.100.181 +add test 10.10.100.182 +add test 10.10.100.183 +add test 10.10.100.184 +add test 10.10.100.185 +add test 10.10.100.186 +add test 10.10.100.187 +add test 10.10.100.188 +add test 10.10.100.189 +add test 10.10.100.19 +add test 10.10.100.190 +add test 10.10.100.191 +add test 10.10.100.192 +add test 10.10.100.193 +add test 10.10.100.194 +add test 10.10.100.195 +add test 10.10.100.196 +add test 10.10.100.197 +add test 10.10.100.198 +add test 10.10.100.199 +add test 10.10.100.2 +add test 10.10.100.20 +add test 10.10.100.200 +add test 10.10.100.201 +add test 10.10.100.202 +add test 10.10.100.203 +add test 10.10.100.204 +add test 10.10.100.205 +add test 10.10.100.206 +add test 10.10.100.207 +add test 10.10.100.208 +add test 10.10.100.209 +add test 10.10.100.21 +add test 10.10.100.210 +add test 10.10.100.211 +add test 10.10.100.212 +add test 10.10.100.213 +add test 10.10.100.214 +add test 10.10.100.215 +add test 10.10.100.216 +add test 10.10.100.217 +add test 10.10.100.218 +add test 10.10.100.219 +add test 10.10.100.22 +add test 10.10.100.220 +add test 10.10.100.221 +add test 10.10.100.222 +add test 10.10.100.223 +add test 10.10.100.224 +add test 10.10.100.225 +add test 10.10.100.226 +add test 10.10.100.227 +add test 10.10.100.228 +add test 10.10.100.229 +add test 10.10.100.23 +add test 10.10.100.230 +add test 10.10.100.231 +add test 10.10.100.232 +add test 10.10.100.233 +add test 10.10.100.234 +add test 10.10.100.235 +add test 10.10.100.236 +add test 10.10.100.237 +add test 10.10.100.238 +add test 10.10.100.239 +add test 10.10.100.24 +add test 10.10.100.240 +add test 10.10.100.241 +add test 10.10.100.242 +add test 10.10.100.243 +add test 10.10.100.244 +add test 10.10.100.245 +add test 10.10.100.246 +add test 10.10.100.247 +add test 10.10.100.248 +add test 10.10.100.249 +add test 10.10.100.25 +add test 10.10.100.250 +add test 10.10.100.251 +add test 10.10.100.252 +add test 10.10.100.253 +add test 10.10.100.254 +add test 10.10.100.255 +add test 10.10.100.26 +add test 10.10.100.27 +add test 10.10.100.28 +add test 10.10.100.29 +add test 10.10.100.3 +add test 10.10.100.30 +add test 10.10.100.31 +add test 10.10.100.32 +add test 10.10.100.33 +add test 10.10.100.34 +add test 10.10.100.35 +add test 10.10.100.36 +add test 10.10.100.37 +add test 10.10.100.38 +add test 10.10.100.39 +add test 10.10.100.4 +add test 10.10.100.40 +add test 10.10.100.41 +add test 10.10.100.42 +add test 10.10.100.43 +add test 10.10.100.44 +add test 10.10.100.45 +add test 10.10.100.46 +add test 10.10.100.47 +add test 10.10.100.48 +add test 10.10.100.49 +add test 10.10.100.5 +add test 10.10.100.50 +add test 10.10.100.51 +add test 10.10.100.52 +add test 10.10.100.53 +add test 10.10.100.54 +add test 10.10.100.55 +add test 10.10.100.56 +add test 10.10.100.57 +add test 10.10.100.58 +add test 10.10.100.59 +add test 10.10.100.6 +add test 10.10.100.60 +add test 10.10.100.61 +add test 10.10.100.62 +add test 10.10.100.63 +add test 10.10.100.64 +add test 10.10.100.65 +add test 10.10.100.66 +add test 10.10.100.67 +add test 10.10.100.68 +add test 10.10.100.69 +add test 10.10.100.7 +add test 10.10.100.70 +add test 10.10.100.71 +add test 10.10.100.72 +add test 10.10.100.73 +add test 10.10.100.74 +add test 10.10.100.75 +add test 10.10.100.76 +add test 10.10.100.77 +add test 10.10.100.78 +add test 10.10.100.79 +add test 10.10.100.8 +add test 10.10.100.80 +add test 10.10.100.81 +add test 10.10.100.82 +add test 10.10.100.83 +add test 10.10.100.84 +add test 10.10.100.85 +add test 10.10.100.86 +add test 10.10.100.87 +add test 10.10.100.88 +add test 10.10.100.89 +add test 10.10.100.9 +add test 10.10.100.90 +add test 10.10.100.91 +add test 10.10.100.92 +add test 10.10.100.93 +add test 10.10.100.94 +add test 10.10.100.95 +add test 10.10.100.96 +add test 10.10.100.97 +add test 10.10.100.98 +add test 10.10.100.99 +add test 10.10.101.0 +add test 10.10.101.1 +add test 10.10.101.10 +add test 10.10.101.100 +add test 10.10.101.101 +add test 10.10.101.102 +add test 10.10.101.103 +add test 10.10.101.104 +add test 10.10.101.105 +add test 10.10.101.106 +add test 10.10.101.107 +add test 10.10.101.108 +add test 10.10.101.109 +add test 10.10.101.11 +add test 10.10.101.110 +add test 10.10.101.111 +add test 10.10.101.112 +add test 10.10.101.113 +add test 10.10.101.114 +add test 10.10.101.115 +add test 10.10.101.116 +add test 10.10.101.117 +add test 10.10.101.118 +add test 10.10.101.119 +add test 10.10.101.12 +add test 10.10.101.120 +add test 10.10.101.121 +add test 10.10.101.122 +add test 10.10.101.123 +add test 10.10.101.124 +add test 10.10.101.125 +add test 10.10.101.126 +add test 10.10.101.127 +add test 10.10.101.128 +add test 10.10.101.129 +add test 10.10.101.13 +add test 10.10.101.130 +add test 10.10.101.131 +add test 10.10.101.132 +add test 10.10.101.133 +add test 10.10.101.134 +add test 10.10.101.135 +add test 10.10.101.136 +add test 10.10.101.137 +add test 10.10.101.138 +add test 10.10.101.139 +add test 10.10.101.14 +add test 10.10.101.140 +add test 10.10.101.141 +add test 10.10.101.142 +add test 10.10.101.143 +add test 10.10.101.144 +add test 10.10.101.145 +add test 10.10.101.146 +add test 10.10.101.147 +add test 10.10.101.148 +add test 10.10.101.149 +add test 10.10.101.15 +add test 10.10.101.150 +add test 10.10.101.151 +add test 10.10.101.152 +add test 10.10.101.153 +add test 10.10.101.154 +add test 10.10.101.155 +add test 10.10.101.156 +add test 10.10.101.157 +add test 10.10.101.158 +add test 10.10.101.159 +add test 10.10.101.16 +add test 10.10.101.160 +add test 10.10.101.161 +add test 10.10.101.162 +add test 10.10.101.163 +add test 10.10.101.164 +add test 10.10.101.165 +add test 10.10.101.166 +add test 10.10.101.167 +add test 10.10.101.168 +add test 10.10.101.169 +add test 10.10.101.17 +add test 10.10.101.170 +add test 10.10.101.171 +add test 10.10.101.172 +add test 10.10.101.173 +add test 10.10.101.174 +add test 10.10.101.175 +add test 10.10.101.176 +add test 10.10.101.177 +add test 10.10.101.178 +add test 10.10.101.179 +add test 10.10.101.18 +add test 10.10.101.180 +add test 10.10.101.181 +add test 10.10.101.182 +add test 10.10.101.183 +add test 10.10.101.184 +add test 10.10.101.185 +add test 10.10.101.186 +add test 10.10.101.187 +add test 10.10.101.188 +add test 10.10.101.189 +add test 10.10.101.19 +add test 10.10.101.190 +add test 10.10.101.191 +add test 10.10.101.192 +add test 10.10.101.193 +add test 10.10.101.194 +add test 10.10.101.195 +add test 10.10.101.196 +add test 10.10.101.197 +add test 10.10.101.198 +add test 10.10.101.199 +add test 10.10.101.2 +add test 10.10.101.20 +add test 10.10.101.200 +add test 10.10.101.201 +add test 10.10.101.202 +add test 10.10.101.203 +add test 10.10.101.204 +add test 10.10.101.205 +add test 10.10.101.206 +add test 10.10.101.207 +add test 10.10.101.208 +add test 10.10.101.209 +add test 10.10.101.21 +add test 10.10.101.210 +add test 10.10.101.211 +add test 10.10.101.212 +add test 10.10.101.213 +add test 10.10.101.214 +add test 10.10.101.215 +add test 10.10.101.216 +add test 10.10.101.217 +add test 10.10.101.218 +add test 10.10.101.219 +add test 10.10.101.22 +add test 10.10.101.220 +add test 10.10.101.221 +add test 10.10.101.222 +add test 10.10.101.223 +add test 10.10.101.224 +add test 10.10.101.225 +add test 10.10.101.226 +add test 10.10.101.227 +add test 10.10.101.228 +add test 10.10.101.229 +add test 10.10.101.23 +add test 10.10.101.230 +add test 10.10.101.231 +add test 10.10.101.232 +add test 10.10.101.233 +add test 10.10.101.234 +add test 10.10.101.235 +add test 10.10.101.236 +add test 10.10.101.237 +add test 10.10.101.238 +add test 10.10.101.239 +add test 10.10.101.24 +add test 10.10.101.240 +add test 10.10.101.241 +add test 10.10.101.242 +add test 10.10.101.243 +add test 10.10.101.244 +add test 10.10.101.245 +add test 10.10.101.246 +add test 10.10.101.247 +add test 10.10.101.248 +add test 10.10.101.249 +add test 10.10.101.25 +add test 10.10.101.250 +add test 10.10.101.251 +add test 10.10.101.252 +add test 10.10.101.253 +add test 10.10.101.254 +add test 10.10.101.255 +add test 10.10.101.26 +add test 10.10.101.27 +add test 10.10.101.28 +add test 10.10.101.29 +add test 10.10.101.3 +add test 10.10.101.30 +add test 10.10.101.31 +add test 10.10.101.32 +add test 10.10.101.33 +add test 10.10.101.34 +add test 10.10.101.35 +add test 10.10.101.36 +add test 10.10.101.37 +add test 10.10.101.38 +add test 10.10.101.39 +add test 10.10.101.4 +add test 10.10.101.40 +add test 10.10.101.41 +add test 10.10.101.42 +add test 10.10.101.43 +add test 10.10.101.44 +add test 10.10.101.45 +add test 10.10.101.46 +add test 10.10.101.47 +add test 10.10.101.48 +add test 10.10.101.49 +add test 10.10.101.5 +add test 10.10.101.50 +add test 10.10.101.51 +add test 10.10.101.52 +add test 10.10.101.53 +add test 10.10.101.54 +add test 10.10.101.55 +add test 10.10.101.56 +add test 10.10.101.57 +add test 10.10.101.58 +add test 10.10.101.59 +add test 10.10.101.6 +add test 10.10.101.60 +add test 10.10.101.61 +add test 10.10.101.62 +add test 10.10.101.63 +add test 10.10.101.64 +add test 10.10.101.65 +add test 10.10.101.66 +add test 10.10.101.67 +add test 10.10.101.68 +add test 10.10.101.69 +add test 10.10.101.7 +add test 10.10.101.70 +add test 10.10.101.71 +add test 10.10.101.72 +add test 10.10.101.73 +add test 10.10.101.74 +add test 10.10.101.75 +add test 10.10.101.76 +add test 10.10.101.77 +add test 10.10.101.78 +add test 10.10.101.79 +add test 10.10.101.8 +add test 10.10.101.80 +add test 10.10.101.81 +add test 10.10.101.82 +add test 10.10.101.83 +add test 10.10.101.84 +add test 10.10.101.85 +add test 10.10.101.86 +add test 10.10.101.87 +add test 10.10.101.88 +add test 10.10.101.89 +add test 10.10.101.9 +add test 10.10.101.90 +add test 10.10.101.91 +add test 10.10.101.92 +add test 10.10.101.93 +add test 10.10.101.94 +add test 10.10.101.95 +add test 10.10.101.96 +add test 10.10.101.97 +add test 10.10.101.98 +add test 10.10.101.99 +add test 10.10.102.0 +add test 10.10.102.1 +add test 10.10.102.10 +add test 10.10.102.100 +add test 10.10.102.101 +add test 10.10.102.102 +add test 10.10.102.103 +add test 10.10.102.104 +add test 10.10.102.105 +add test 10.10.102.106 +add test 10.10.102.107 +add test 10.10.102.108 +add test 10.10.102.109 +add test 10.10.102.11 +add test 10.10.102.110 +add test 10.10.102.111 +add test 10.10.102.112 +add test 10.10.102.113 +add test 10.10.102.114 +add test 10.10.102.115 +add test 10.10.102.116 +add test 10.10.102.117 +add test 10.10.102.118 +add test 10.10.102.119 +add test 10.10.102.12 +add test 10.10.102.120 +add test 10.10.102.121 +add test 10.10.102.122 +add test 10.10.102.123 +add test 10.10.102.124 +add test 10.10.102.125 +add test 10.10.102.126 +add test 10.10.102.127 +add test 10.10.102.128 +add test 10.10.102.129 +add test 10.10.102.13 +add test 10.10.102.130 +add test 10.10.102.131 +add test 10.10.102.132 +add test 10.10.102.133 +add test 10.10.102.134 +add test 10.10.102.135 +add test 10.10.102.136 +add test 10.10.102.137 +add test 10.10.102.138 +add test 10.10.102.139 +add test 10.10.102.14 +add test 10.10.102.140 +add test 10.10.102.141 +add test 10.10.102.142 +add test 10.10.102.143 +add test 10.10.102.144 +add test 10.10.102.145 +add test 10.10.102.146 +add test 10.10.102.147 +add test 10.10.102.148 +add test 10.10.102.149 +add test 10.10.102.15 +add test 10.10.102.150 +add test 10.10.102.151 +add test 10.10.102.152 +add test 10.10.102.153 +add test 10.10.102.154 +add test 10.10.102.155 +add test 10.10.102.156 +add test 10.10.102.157 +add test 10.10.102.158 +add test 10.10.102.159 +add test 10.10.102.16 +add test 10.10.102.160 +add test 10.10.102.161 +add test 10.10.102.162 +add test 10.10.102.163 +add test 10.10.102.164 +add test 10.10.102.165 +add test 10.10.102.166 +add test 10.10.102.167 +add test 10.10.102.168 +add test 10.10.102.169 +add test 10.10.102.17 +add test 10.10.102.170 +add test 10.10.102.171 +add test 10.10.102.172 +add test 10.10.102.173 +add test 10.10.102.174 +add test 10.10.102.175 +add test 10.10.102.176 +add test 10.10.102.177 +add test 10.10.102.178 +add test 10.10.102.179 +add test 10.10.102.18 +add test 10.10.102.180 +add test 10.10.102.181 +add test 10.10.102.182 +add test 10.10.102.183 +add test 10.10.102.184 +add test 10.10.102.185 +add test 10.10.102.186 +add test 10.10.102.187 +add test 10.10.102.188 +add test 10.10.102.189 +add test 10.10.102.19 +add test 10.10.102.190 +add test 10.10.102.191 +add test 10.10.102.192 +add test 10.10.102.193 +add test 10.10.102.194 +add test 10.10.102.195 +add test 10.10.102.196 +add test 10.10.102.197 +add test 10.10.102.198 +add test 10.10.102.199 +add test 10.10.102.2 +add test 10.10.102.20 +add test 10.10.102.200 +add test 10.10.102.201 +add test 10.10.102.202 +add test 10.10.102.203 +add test 10.10.102.204 +add test 10.10.102.205 +add test 10.10.102.206 +add test 10.10.102.207 +add test 10.10.102.208 +add test 10.10.102.209 +add test 10.10.102.21 +add test 10.10.102.210 +add test 10.10.102.211 +add test 10.10.102.212 +add test 10.10.102.213 +add test 10.10.102.214 +add test 10.10.102.215 +add test 10.10.102.216 +add test 10.10.102.217 +add test 10.10.102.218 +add test 10.10.102.219 +add test 10.10.102.22 +add test 10.10.102.220 +add test 10.10.102.221 +add test 10.10.102.222 +add test 10.10.102.223 +add test 10.10.102.224 +add test 10.10.102.225 +add test 10.10.102.226 +add test 10.10.102.227 +add test 10.10.102.228 +add test 10.10.102.229 +add test 10.10.102.23 +add test 10.10.102.230 +add test 10.10.102.231 +add test 10.10.102.232 +add test 10.10.102.233 +add test 10.10.102.234 +add test 10.10.102.235 +add test 10.10.102.236 +add test 10.10.102.237 +add test 10.10.102.238 +add test 10.10.102.239 +add test 10.10.102.24 +add test 10.10.102.240 +add test 10.10.102.241 +add test 10.10.102.242 +add test 10.10.102.243 +add test 10.10.102.244 +add test 10.10.102.245 +add test 10.10.102.246 +add test 10.10.102.247 +add test 10.10.102.248 +add test 10.10.102.249 +add test 10.10.102.25 +add test 10.10.102.250 +add test 10.10.102.251 +add test 10.10.102.252 +add test 10.10.102.253 +add test 10.10.102.254 +add test 10.10.102.255 +add test 10.10.102.26 +add test 10.10.102.27 +add test 10.10.102.28 +add test 10.10.102.29 +add test 10.10.102.3 +add test 10.10.102.30 +add test 10.10.102.31 +add test 10.10.102.32 +add test 10.10.102.33 +add test 10.10.102.34 +add test 10.10.102.35 +add test 10.10.102.36 +add test 10.10.102.37 +add test 10.10.102.38 +add test 10.10.102.39 +add test 10.10.102.4 +add test 10.10.102.40 +add test 10.10.102.41 +add test 10.10.102.42 +add test 10.10.102.43 +add test 10.10.102.44 +add test 10.10.102.45 +add test 10.10.102.46 +add test 10.10.102.47 +add test 10.10.102.48 +add test 10.10.102.49 +add test 10.10.102.5 +add test 10.10.102.50 +add test 10.10.102.51 +add test 10.10.102.52 +add test 10.10.102.53 +add test 10.10.102.54 +add test 10.10.102.55 +add test 10.10.102.56 +add test 10.10.102.57 +add test 10.10.102.58 +add test 10.10.102.59 +add test 10.10.102.6 +add test 10.10.102.60 +add test 10.10.102.61 +add test 10.10.102.62 +add test 10.10.102.63 +add test 10.10.102.64 +add test 10.10.102.65 +add test 10.10.102.66 +add test 10.10.102.67 +add test 10.10.102.68 +add test 10.10.102.69 +add test 10.10.102.7 +add test 10.10.102.70 +add test 10.10.102.71 +add test 10.10.102.72 +add test 10.10.102.73 +add test 10.10.102.74 +add test 10.10.102.75 +add test 10.10.102.76 +add test 10.10.102.77 +add test 10.10.102.78 +add test 10.10.102.79 +add test 10.10.102.8 +add test 10.10.102.80 +add test 10.10.102.81 +add test 10.10.102.82 +add test 10.10.102.83 +add test 10.10.102.84 +add test 10.10.102.85 +add test 10.10.102.86 +add test 10.10.102.87 +add test 10.10.102.88 +add test 10.10.102.89 +add test 10.10.102.9 +add test 10.10.102.90 +add test 10.10.102.91 +add test 10.10.102.92 +add test 10.10.102.93 +add test 10.10.102.94 +add test 10.10.102.95 +add test 10.10.102.96 +add test 10.10.102.97 +add test 10.10.102.98 +add test 10.10.102.99 +add test 10.10.103.0 +add test 10.10.103.1 +add test 10.10.103.10 +add test 10.10.103.100 +add test 10.10.103.101 +add test 10.10.103.102 +add test 10.10.103.103 +add test 10.10.103.104 +add test 10.10.103.105 +add test 10.10.103.106 +add test 10.10.103.107 +add test 10.10.103.108 +add test 10.10.103.109 +add test 10.10.103.11 +add test 10.10.103.110 +add test 10.10.103.111 +add test 10.10.103.112 +add test 10.10.103.113 +add test 10.10.103.114 +add test 10.10.103.115 +add test 10.10.103.116 +add test 10.10.103.117 +add test 10.10.103.118 +add test 10.10.103.119 +add test 10.10.103.12 +add test 10.10.103.120 +add test 10.10.103.121 +add test 10.10.103.122 +add test 10.10.103.123 +add test 10.10.103.124 +add test 10.10.103.125 +add test 10.10.103.126 +add test 10.10.103.127 +add test 10.10.103.128 +add test 10.10.103.129 +add test 10.10.103.13 +add test 10.10.103.130 +add test 10.10.103.131 +add test 10.10.103.132 +add test 10.10.103.133 +add test 10.10.103.134 +add test 10.10.103.135 +add test 10.10.103.136 +add test 10.10.103.137 +add test 10.10.103.138 +add test 10.10.103.139 +add test 10.10.103.14 +add test 10.10.103.140 +add test 10.10.103.141 +add test 10.10.103.142 +add test 10.10.103.143 +add test 10.10.103.144 +add test 10.10.103.145 +add test 10.10.103.146 +add test 10.10.103.147 +add test 10.10.103.148 +add test 10.10.103.149 +add test 10.10.103.15 +add test 10.10.103.150 +add test 10.10.103.151 +add test 10.10.103.152 +add test 10.10.103.153 +add test 10.10.103.154 +add test 10.10.103.155 +add test 10.10.103.156 +add test 10.10.103.157 +add test 10.10.103.158 +add test 10.10.103.159 +add test 10.10.103.16 +add test 10.10.103.160 +add test 10.10.103.161 +add test 10.10.103.162 +add test 10.10.103.163 +add test 10.10.103.164 +add test 10.10.103.165 +add test 10.10.103.166 +add test 10.10.103.167 +add test 10.10.103.168 +add test 10.10.103.169 +add test 10.10.103.17 +add test 10.10.103.170 +add test 10.10.103.171 +add test 10.10.103.172 +add test 10.10.103.173 +add test 10.10.103.174 +add test 10.10.103.175 +add test 10.10.103.176 +add test 10.10.103.177 +add test 10.10.103.178 +add test 10.10.103.179 +add test 10.10.103.18 +add test 10.10.103.180 +add test 10.10.103.181 +add test 10.10.103.182 +add test 10.10.103.183 +add test 10.10.103.184 +add test 10.10.103.185 +add test 10.10.103.186 +add test 10.10.103.187 +add test 10.10.103.188 +add test 10.10.103.189 +add test 10.10.103.19 +add test 10.10.103.190 +add test 10.10.103.191 +add test 10.10.103.192 +add test 10.10.103.193 +add test 10.10.103.194 +add test 10.10.103.195 +add test 10.10.103.196 +add test 10.10.103.197 +add test 10.10.103.198 +add test 10.10.103.199 +add test 10.10.103.2 +add test 10.10.103.20 +add test 10.10.103.200 +add test 10.10.103.201 +add test 10.10.103.202 +add test 10.10.103.203 +add test 10.10.103.204 +add test 10.10.103.205 +add test 10.10.103.206 +add test 10.10.103.207 +add test 10.10.103.208 +add test 10.10.103.209 +add test 10.10.103.21 +add test 10.10.103.210 +add test 10.10.103.211 +add test 10.10.103.212 +add test 10.10.103.213 +add test 10.10.103.214 +add test 10.10.103.215 +add test 10.10.103.216 +add test 10.10.103.217 +add test 10.10.103.218 +add test 10.10.103.219 +add test 10.10.103.22 +add test 10.10.103.220 +add test 10.10.103.221 +add test 10.10.103.222 +add test 10.10.103.223 +add test 10.10.103.224 +add test 10.10.103.225 +add test 10.10.103.226 +add test 10.10.103.227 +add test 10.10.103.228 +add test 10.10.103.229 +add test 10.10.103.23 +add test 10.10.103.230 +add test 10.10.103.231 +add test 10.10.103.232 +add test 10.10.103.233 +add test 10.10.103.234 +add test 10.10.103.235 +add test 10.10.103.236 +add test 10.10.103.237 +add test 10.10.103.238 +add test 10.10.103.239 +add test 10.10.103.24 +add test 10.10.103.240 +add test 10.10.103.241 +add test 10.10.103.242 +add test 10.10.103.243 +add test 10.10.103.244 +add test 10.10.103.245 +add test 10.10.103.246 +add test 10.10.103.247 +add test 10.10.103.248 +add test 10.10.103.249 +add test 10.10.103.25 +add test 10.10.103.250 +add test 10.10.103.251 +add test 10.10.103.252 +add test 10.10.103.253 +add test 10.10.103.254 +add test 10.10.103.255 +add test 10.10.103.26 +add test 10.10.103.27 +add test 10.10.103.28 +add test 10.10.103.29 +add test 10.10.103.3 +add test 10.10.103.30 +add test 10.10.103.31 +add test 10.10.103.32 +add test 10.10.103.33 +add test 10.10.103.34 +add test 10.10.103.35 +add test 10.10.103.36 +add test 10.10.103.37 +add test 10.10.103.38 +add test 10.10.103.39 +add test 10.10.103.4 +add test 10.10.103.40 +add test 10.10.103.41 +add test 10.10.103.42 +add test 10.10.103.43 +add test 10.10.103.44 +add test 10.10.103.45 +add test 10.10.103.46 +add test 10.10.103.47 +add test 10.10.103.48 +add test 10.10.103.49 +add test 10.10.103.5 +add test 10.10.103.50 +add test 10.10.103.51 +add test 10.10.103.52 +add test 10.10.103.53 +add test 10.10.103.54 +add test 10.10.103.55 +add test 10.10.103.56 +add test 10.10.103.57 +add test 10.10.103.58 +add test 10.10.103.59 +add test 10.10.103.6 +add test 10.10.103.60 +add test 10.10.103.61 +add test 10.10.103.62 +add test 10.10.103.63 +add test 10.10.103.64 +add test 10.10.103.65 +add test 10.10.103.66 +add test 10.10.103.67 +add test 10.10.103.68 +add test 10.10.103.69 +add test 10.10.103.7 +add test 10.10.103.70 +add test 10.10.103.71 +add test 10.10.103.72 +add test 10.10.103.73 +add test 10.10.103.74 +add test 10.10.103.75 +add test 10.10.103.76 +add test 10.10.103.77 +add test 10.10.103.78 +add test 10.10.103.79 +add test 10.10.103.8 +add test 10.10.103.80 +add test 10.10.103.81 +add test 10.10.103.82 +add test 10.10.103.83 +add test 10.10.103.84 +add test 10.10.103.85 +add test 10.10.103.86 +add test 10.10.103.87 +add test 10.10.103.88 +add test 10.10.103.89 +add test 10.10.103.9 +add test 10.10.103.90 +add test 10.10.103.91 +add test 10.10.103.92 +add test 10.10.103.93 +add test 10.10.103.94 +add test 10.10.103.95 +add test 10.10.103.96 +add test 10.10.103.97 +add test 10.10.103.98 +add test 10.10.103.99 +add test 10.10.104.0 +add test 10.10.104.1 +add test 10.10.104.10 +add test 10.10.104.100 +add test 10.10.104.101 +add test 10.10.104.102 +add test 10.10.104.103 +add test 10.10.104.104 +add test 10.10.104.105 +add test 10.10.104.106 +add test 10.10.104.107 +add test 10.10.104.108 +add test 10.10.104.109 +add test 10.10.104.11 +add test 10.10.104.110 +add test 10.10.104.111 +add test 10.10.104.112 +add test 10.10.104.113 +add test 10.10.104.114 +add test 10.10.104.115 +add test 10.10.104.116 +add test 10.10.104.117 +add test 10.10.104.118 +add test 10.10.104.119 +add test 10.10.104.12 +add test 10.10.104.120 +add test 10.10.104.121 +add test 10.10.104.122 +add test 10.10.104.123 +add test 10.10.104.124 +add test 10.10.104.125 +add test 10.10.104.126 +add test 10.10.104.127 +add test 10.10.104.128 +add test 10.10.104.129 +add test 10.10.104.13 +add test 10.10.104.130 +add test 10.10.104.131 +add test 10.10.104.132 +add test 10.10.104.133 +add test 10.10.104.134 +add test 10.10.104.135 +add test 10.10.104.136 +add test 10.10.104.137 +add test 10.10.104.138 +add test 10.10.104.139 +add test 10.10.104.14 +add test 10.10.104.140 +add test 10.10.104.141 +add test 10.10.104.142 +add test 10.10.104.143 +add test 10.10.104.144 +add test 10.10.104.145 +add test 10.10.104.146 +add test 10.10.104.147 +add test 10.10.104.148 +add test 10.10.104.149 +add test 10.10.104.15 +add test 10.10.104.150 +add test 10.10.104.151 +add test 10.10.104.152 +add test 10.10.104.153 +add test 10.10.104.154 +add test 10.10.104.155 +add test 10.10.104.156 +add test 10.10.104.157 +add test 10.10.104.158 +add test 10.10.104.159 +add test 10.10.104.16 +add test 10.10.104.160 +add test 10.10.104.161 +add test 10.10.104.162 +add test 10.10.104.163 +add test 10.10.104.164 +add test 10.10.104.165 +add test 10.10.104.166 +add test 10.10.104.167 +add test 10.10.104.168 +add test 10.10.104.169 +add test 10.10.104.17 +add test 10.10.104.170 +add test 10.10.104.171 +add test 10.10.104.172 +add test 10.10.104.173 +add test 10.10.104.174 +add test 10.10.104.175 +add test 10.10.104.176 +add test 10.10.104.177 +add test 10.10.104.178 +add test 10.10.104.179 +add test 10.10.104.18 +add test 10.10.104.180 +add test 10.10.104.181 +add test 10.10.104.182 +add test 10.10.104.183 +add test 10.10.104.184 +add test 10.10.104.185 +add test 10.10.104.186 +add test 10.10.104.187 +add test 10.10.104.188 +add test 10.10.104.189 +add test 10.10.104.19 +add test 10.10.104.190 +add test 10.10.104.191 +add test 10.10.104.192 +add test 10.10.104.193 +add test 10.10.104.194 +add test 10.10.104.195 +add test 10.10.104.196 +add test 10.10.104.197 +add test 10.10.104.198 +add test 10.10.104.199 +add test 10.10.104.2 +add test 10.10.104.20 +add test 10.10.104.200 +add test 10.10.104.201 +add test 10.10.104.202 +add test 10.10.104.203 +add test 10.10.104.204 +add test 10.10.104.205 +add test 10.10.104.206 +add test 10.10.104.207 +add test 10.10.104.208 +add test 10.10.104.209 +add test 10.10.104.21 +add test 10.10.104.210 +add test 10.10.104.211 +add test 10.10.104.212 +add test 10.10.104.213 +add test 10.10.104.214 +add test 10.10.104.215 +add test 10.10.104.216 +add test 10.10.104.217 +add test 10.10.104.218 +add test 10.10.104.219 +add test 10.10.104.22 +add test 10.10.104.220 +add test 10.10.104.221 +add test 10.10.104.222 +add test 10.10.104.223 +add test 10.10.104.224 +add test 10.10.104.225 +add test 10.10.104.226 +add test 10.10.104.227 +add test 10.10.104.228 +add test 10.10.104.229 +add test 10.10.104.23 +add test 10.10.104.230 +add test 10.10.104.231 +add test 10.10.104.232 +add test 10.10.104.233 +add test 10.10.104.234 +add test 10.10.104.235 +add test 10.10.104.236 +add test 10.10.104.237 +add test 10.10.104.238 +add test 10.10.104.239 +add test 10.10.104.24 +add test 10.10.104.240 +add test 10.10.104.241 +add test 10.10.104.242 +add test 10.10.104.243 +add test 10.10.104.244 +add test 10.10.104.245 +add test 10.10.104.246 +add test 10.10.104.247 +add test 10.10.104.248 +add test 10.10.104.249 +add test 10.10.104.25 +add test 10.10.104.250 +add test 10.10.104.251 +add test 10.10.104.252 +add test 10.10.104.253 +add test 10.10.104.254 +add test 10.10.104.255 +add test 10.10.104.26 +add test 10.10.104.27 +add test 10.10.104.28 +add test 10.10.104.29 +add test 10.10.104.3 +add test 10.10.104.30 +add test 10.10.104.31 +add test 10.10.104.32 +add test 10.10.104.33 +add test 10.10.104.34 +add test 10.10.104.35 +add test 10.10.104.36 +add test 10.10.104.37 +add test 10.10.104.38 +add test 10.10.104.39 +add test 10.10.104.4 +add test 10.10.104.40 +add test 10.10.104.41 +add test 10.10.104.42 +add test 10.10.104.43 +add test 10.10.104.44 +add test 10.10.104.45 +add test 10.10.104.46 +add test 10.10.104.47 +add test 10.10.104.48 +add test 10.10.104.49 +add test 10.10.104.5 +add test 10.10.104.50 +add test 10.10.104.51 +add test 10.10.104.52 +add test 10.10.104.53 +add test 10.10.104.54 +add test 10.10.104.55 +add test 10.10.104.56 +add test 10.10.104.57 +add test 10.10.104.58 +add test 10.10.104.59 +add test 10.10.104.6 +add test 10.10.104.60 +add test 10.10.104.61 +add test 10.10.104.62 +add test 10.10.104.63 +add test 10.10.104.64 +add test 10.10.104.65 +add test 10.10.104.66 +add test 10.10.104.67 +add test 10.10.104.68 +add test 10.10.104.69 +add test 10.10.104.7 +add test 10.10.104.70 +add test 10.10.104.71 +add test 10.10.104.72 +add test 10.10.104.73 +add test 10.10.104.74 +add test 10.10.104.75 +add test 10.10.104.76 +add test 10.10.104.77 +add test 10.10.104.78 +add test 10.10.104.79 +add test 10.10.104.8 +add test 10.10.104.80 +add test 10.10.104.81 +add test 10.10.104.82 +add test 10.10.104.83 +add test 10.10.104.84 +add test 10.10.104.85 +add test 10.10.104.86 +add test 10.10.104.87 +add test 10.10.104.88 +add test 10.10.104.89 +add test 10.10.104.9 +add test 10.10.104.90 +add test 10.10.104.91 +add test 10.10.104.92 +add test 10.10.104.93 +add test 10.10.104.94 +add test 10.10.104.95 +add test 10.10.104.96 +add test 10.10.104.97 +add test 10.10.104.98 +add test 10.10.104.99 +add test 10.10.105.0 +add test 10.10.105.1 +add test 10.10.105.10 +add test 10.10.105.100 +add test 10.10.105.101 +add test 10.10.105.102 +add test 10.10.105.103 +add test 10.10.105.104 +add test 10.10.105.105 +add test 10.10.105.106 +add test 10.10.105.107 +add test 10.10.105.108 +add test 10.10.105.109 +add test 10.10.105.11 +add test 10.10.105.110 +add test 10.10.105.111 +add test 10.10.105.112 +add test 10.10.105.113 +add test 10.10.105.114 +add test 10.10.105.115 +add test 10.10.105.116 +add test 10.10.105.117 +add test 10.10.105.118 +add test 10.10.105.119 +add test 10.10.105.12 +add test 10.10.105.120 +add test 10.10.105.121 +add test 10.10.105.122 +add test 10.10.105.123 +add test 10.10.105.124 +add test 10.10.105.125 +add test 10.10.105.126 +add test 10.10.105.127 +add test 10.10.105.128 +add test 10.10.105.129 +add test 10.10.105.13 +add test 10.10.105.130 +add test 10.10.105.131 +add test 10.10.105.132 +add test 10.10.105.133 +add test 10.10.105.134 +add test 10.10.105.135 +add test 10.10.105.136 +add test 10.10.105.137 +add test 10.10.105.138 +add test 10.10.105.139 +add test 10.10.105.14 +add test 10.10.105.140 +add test 10.10.105.141 +add test 10.10.105.142 +add test 10.10.105.143 +add test 10.10.105.144 +add test 10.10.105.145 +add test 10.10.105.146 +add test 10.10.105.147 +add test 10.10.105.148 +add test 10.10.105.149 +add test 10.10.105.15 +add test 10.10.105.150 +add test 10.10.105.151 +add test 10.10.105.152 +add test 10.10.105.153 +add test 10.10.105.154 +add test 10.10.105.155 +add test 10.10.105.156 +add test 10.10.105.157 +add test 10.10.105.158 +add test 10.10.105.159 +add test 10.10.105.16 +add test 10.10.105.160 +add test 10.10.105.161 +add test 10.10.105.162 +add test 10.10.105.163 +add test 10.10.105.164 +add test 10.10.105.165 +add test 10.10.105.166 +add test 10.10.105.167 +add test 10.10.105.168 +add test 10.10.105.169 +add test 10.10.105.17 +add test 10.10.105.170 +add test 10.10.105.171 +add test 10.10.105.172 +add test 10.10.105.173 +add test 10.10.105.174 +add test 10.10.105.175 +add test 10.10.105.176 +add test 10.10.105.177 +add test 10.10.105.178 +add test 10.10.105.179 +add test 10.10.105.18 +add test 10.10.105.180 +add test 10.10.105.181 +add test 10.10.105.182 +add test 10.10.105.183 +add test 10.10.105.184 +add test 10.10.105.185 +add test 10.10.105.186 +add test 10.10.105.187 +add test 10.10.105.188 +add test 10.10.105.189 +add test 10.10.105.19 +add test 10.10.105.190 +add test 10.10.105.191 +add test 10.10.105.192 +add test 10.10.105.193 +add test 10.10.105.194 +add test 10.10.105.195 +add test 10.10.105.196 +add test 10.10.105.197 +add test 10.10.105.198 +add test 10.10.105.199 +add test 10.10.105.2 +add test 10.10.105.20 +add test 10.10.105.200 +add test 10.10.105.201 +add test 10.10.105.202 +add test 10.10.105.203 +add test 10.10.105.204 +add test 10.10.105.205 +add test 10.10.105.206 +add test 10.10.105.207 +add test 10.10.105.208 +add test 10.10.105.209 +add test 10.10.105.21 +add test 10.10.105.210 +add test 10.10.105.211 +add test 10.10.105.212 +add test 10.10.105.213 +add test 10.10.105.214 +add test 10.10.105.215 +add test 10.10.105.216 +add test 10.10.105.217 +add test 10.10.105.218 +add test 10.10.105.219 +add test 10.10.105.22 +add test 10.10.105.220 +add test 10.10.105.221 +add test 10.10.105.222 +add test 10.10.105.223 +add test 10.10.105.224 +add test 10.10.105.225 +add test 10.10.105.226 +add test 10.10.105.227 +add test 10.10.105.228 +add test 10.10.105.229 +add test 10.10.105.23 +add test 10.10.105.230 +add test 10.10.105.231 +add test 10.10.105.232 +add test 10.10.105.233 +add test 10.10.105.234 +add test 10.10.105.235 +add test 10.10.105.236 +add test 10.10.105.237 +add test 10.10.105.238 +add test 10.10.105.239 +add test 10.10.105.24 +add test 10.10.105.240 +add test 10.10.105.241 +add test 10.10.105.242 +add test 10.10.105.243 +add test 10.10.105.244 +add test 10.10.105.245 +add test 10.10.105.246 +add test 10.10.105.247 +add test 10.10.105.248 +add test 10.10.105.249 +add test 10.10.105.25 +add test 10.10.105.250 +add test 10.10.105.251 +add test 10.10.105.252 +add test 10.10.105.253 +add test 10.10.105.254 +add test 10.10.105.255 +add test 10.10.105.26 +add test 10.10.105.27 +add test 10.10.105.28 +add test 10.10.105.29 +add test 10.10.105.3 +add test 10.10.105.30 +add test 10.10.105.31 +add test 10.10.105.32 +add test 10.10.105.33 +add test 10.10.105.34 +add test 10.10.105.35 +add test 10.10.105.36 +add test 10.10.105.37 +add test 10.10.105.38 +add test 10.10.105.39 +add test 10.10.105.4 +add test 10.10.105.40 +add test 10.10.105.41 +add test 10.10.105.42 +add test 10.10.105.43 +add test 10.10.105.44 +add test 10.10.105.45 +add test 10.10.105.46 +add test 10.10.105.47 +add test 10.10.105.48 +add test 10.10.105.49 +add test 10.10.105.5 +add test 10.10.105.50 +add test 10.10.105.51 +add test 10.10.105.52 +add test 10.10.105.53 +add test 10.10.105.54 +add test 10.10.105.55 +add test 10.10.105.56 +add test 10.10.105.57 +add test 10.10.105.58 +add test 10.10.105.59 +add test 10.10.105.6 +add test 10.10.105.60 +add test 10.10.105.61 +add test 10.10.105.62 +add test 10.10.105.63 +add test 10.10.105.64 +add test 10.10.105.65 +add test 10.10.105.66 +add test 10.10.105.67 +add test 10.10.105.68 +add test 10.10.105.69 +add test 10.10.105.7 +add test 10.10.105.70 +add test 10.10.105.71 +add test 10.10.105.72 +add test 10.10.105.73 +add test 10.10.105.74 +add test 10.10.105.75 +add test 10.10.105.76 +add test 10.10.105.77 +add test 10.10.105.78 +add test 10.10.105.79 +add test 10.10.105.8 +add test 10.10.105.80 +add test 10.10.105.81 +add test 10.10.105.82 +add test 10.10.105.83 +add test 10.10.105.84 +add test 10.10.105.85 +add test 10.10.105.86 +add test 10.10.105.87 +add test 10.10.105.88 +add test 10.10.105.89 +add test 10.10.105.9 +add test 10.10.105.90 +add test 10.10.105.91 +add test 10.10.105.92 +add test 10.10.105.93 +add test 10.10.105.94 +add test 10.10.105.95 +add test 10.10.105.96 +add test 10.10.105.97 +add test 10.10.105.98 +add test 10.10.105.99 +add test 10.10.106.0 +add test 10.10.106.1 +add test 10.10.106.10 +add test 10.10.106.100 +add test 10.10.106.101 +add test 10.10.106.102 +add test 10.10.106.103 +add test 10.10.106.104 +add test 10.10.106.105 +add test 10.10.106.106 +add test 10.10.106.107 +add test 10.10.106.108 +add test 10.10.106.109 +add test 10.10.106.11 +add test 10.10.106.110 +add test 10.10.106.111 +add test 10.10.106.112 +add test 10.10.106.113 +add test 10.10.106.114 +add test 10.10.106.115 +add test 10.10.106.116 +add test 10.10.106.117 +add test 10.10.106.118 +add test 10.10.106.119 +add test 10.10.106.12 +add test 10.10.106.120 +add test 10.10.106.121 +add test 10.10.106.122 +add test 10.10.106.123 +add test 10.10.106.124 +add test 10.10.106.125 +add test 10.10.106.126 +add test 10.10.106.127 +add test 10.10.106.128 +add test 10.10.106.129 +add test 10.10.106.13 +add test 10.10.106.130 +add test 10.10.106.131 +add test 10.10.106.132 +add test 10.10.106.133 +add test 10.10.106.134 +add test 10.10.106.135 +add test 10.10.106.136 +add test 10.10.106.137 +add test 10.10.106.138 +add test 10.10.106.139 +add test 10.10.106.14 +add test 10.10.106.140 +add test 10.10.106.141 +add test 10.10.106.142 +add test 10.10.106.143 +add test 10.10.106.144 +add test 10.10.106.145 +add test 10.10.106.146 +add test 10.10.106.147 +add test 10.10.106.148 +add test 10.10.106.149 +add test 10.10.106.15 +add test 10.10.106.150 +add test 10.10.106.151 +add test 10.10.106.152 +add test 10.10.106.153 +add test 10.10.106.154 +add test 10.10.106.155 +add test 10.10.106.156 +add test 10.10.106.157 +add test 10.10.106.158 +add test 10.10.106.159 +add test 10.10.106.16 +add test 10.10.106.160 +add test 10.10.106.161 +add test 10.10.106.162 +add test 10.10.106.163 +add test 10.10.106.164 +add test 10.10.106.165 +add test 10.10.106.166 +add test 10.10.106.167 +add test 10.10.106.168 +add test 10.10.106.169 +add test 10.10.106.17 +add test 10.10.106.170 +add test 10.10.106.171 +add test 10.10.106.172 +add test 10.10.106.173 +add test 10.10.106.174 +add test 10.10.106.175 +add test 10.10.106.176 +add test 10.10.106.177 +add test 10.10.106.178 +add test 10.10.106.179 +add test 10.10.106.18 +add test 10.10.106.180 +add test 10.10.106.181 +add test 10.10.106.182 +add test 10.10.106.183 +add test 10.10.106.184 +add test 10.10.106.185 +add test 10.10.106.186 +add test 10.10.106.187 +add test 10.10.106.188 +add test 10.10.106.189 +add test 10.10.106.19 +add test 10.10.106.190 +add test 10.10.106.191 +add test 10.10.106.192 +add test 10.10.106.193 +add test 10.10.106.194 +add test 10.10.106.195 +add test 10.10.106.196 +add test 10.10.106.197 +add test 10.10.106.198 +add test 10.10.106.199 +add test 10.10.106.2 +add test 10.10.106.20 +add test 10.10.106.200 +add test 10.10.106.201 +add test 10.10.106.202 +add test 10.10.106.203 +add test 10.10.106.204 +add test 10.10.106.205 +add test 10.10.106.206 +add test 10.10.106.207 +add test 10.10.106.208 +add test 10.10.106.209 +add test 10.10.106.21 +add test 10.10.106.210 +add test 10.10.106.211 +add test 10.10.106.212 +add test 10.10.106.213 +add test 10.10.106.214 +add test 10.10.106.215 +add test 10.10.106.216 +add test 10.10.106.217 +add test 10.10.106.218 +add test 10.10.106.219 +add test 10.10.106.22 +add test 10.10.106.220 +add test 10.10.106.221 +add test 10.10.106.222 +add test 10.10.106.223 +add test 10.10.106.224 +add test 10.10.106.225 +add test 10.10.106.226 +add test 10.10.106.227 +add test 10.10.106.228 +add test 10.10.106.229 +add test 10.10.106.23 +add test 10.10.106.230 +add test 10.10.106.231 +add test 10.10.106.232 +add test 10.10.106.233 +add test 10.10.106.234 +add test 10.10.106.235 +add test 10.10.106.236 +add test 10.10.106.237 +add test 10.10.106.238 +add test 10.10.106.239 +add test 10.10.106.24 +add test 10.10.106.240 +add test 10.10.106.241 +add test 10.10.106.242 +add test 10.10.106.243 +add test 10.10.106.244 +add test 10.10.106.245 +add test 10.10.106.246 +add test 10.10.106.247 +add test 10.10.106.248 +add test 10.10.106.249 +add test 10.10.106.25 +add test 10.10.106.250 +add test 10.10.106.251 +add test 10.10.106.252 +add test 10.10.106.253 +add test 10.10.106.254 +add test 10.10.106.255 +add test 10.10.106.26 +add test 10.10.106.27 +add test 10.10.106.28 +add test 10.10.106.29 +add test 10.10.106.3 +add test 10.10.106.30 +add test 10.10.106.31 +add test 10.10.106.32 +add test 10.10.106.33 +add test 10.10.106.34 +add test 10.10.106.35 +add test 10.10.106.36 +add test 10.10.106.37 +add test 10.10.106.38 +add test 10.10.106.39 +add test 10.10.106.4 +add test 10.10.106.40 +add test 10.10.106.41 +add test 10.10.106.42 +add test 10.10.106.43 +add test 10.10.106.44 +add test 10.10.106.45 +add test 10.10.106.46 +add test 10.10.106.47 +add test 10.10.106.48 +add test 10.10.106.49 +add test 10.10.106.5 +add test 10.10.106.50 +add test 10.10.106.51 +add test 10.10.106.52 +add test 10.10.106.53 +add test 10.10.106.54 +add test 10.10.106.55 +add test 10.10.106.56 +add test 10.10.106.57 +add test 10.10.106.58 +add test 10.10.106.59 +add test 10.10.106.6 +add test 10.10.106.60 +add test 10.10.106.61 +add test 10.10.106.62 +add test 10.10.106.63 +add test 10.10.106.64 +add test 10.10.106.65 +add test 10.10.106.66 +add test 10.10.106.67 +add test 10.10.106.68 +add test 10.10.106.69 +add test 10.10.106.7 +add test 10.10.106.70 +add test 10.10.106.71 +add test 10.10.106.72 +add test 10.10.106.73 +add test 10.10.106.74 +add test 10.10.106.75 +add test 10.10.106.76 +add test 10.10.106.77 +add test 10.10.106.78 +add test 10.10.106.79 +add test 10.10.106.8 +add test 10.10.106.80 +add test 10.10.106.81 +add test 10.10.106.82 +add test 10.10.106.83 +add test 10.10.106.84 +add test 10.10.106.85 +add test 10.10.106.86 +add test 10.10.106.87 +add test 10.10.106.88 +add test 10.10.106.89 +add test 10.10.106.9 +add test 10.10.106.90 +add test 10.10.106.91 +add test 10.10.106.92 +add test 10.10.106.93 +add test 10.10.106.94 +add test 10.10.106.95 +add test 10.10.106.96 +add test 10.10.106.97 +add test 10.10.106.98 +add test 10.10.106.99 +add test 10.10.107.0 +add test 10.10.107.1 +add test 10.10.107.10 +add test 10.10.107.100 +add test 10.10.107.101 +add test 10.10.107.102 +add test 10.10.107.103 +add test 10.10.107.104 +add test 10.10.107.105 +add test 10.10.107.106 +add test 10.10.107.107 +add test 10.10.107.108 +add test 10.10.107.109 +add test 10.10.107.11 +add test 10.10.107.110 +add test 10.10.107.111 +add test 10.10.107.112 +add test 10.10.107.113 +add test 10.10.107.114 +add test 10.10.107.115 +add test 10.10.107.116 +add test 10.10.107.117 +add test 10.10.107.118 +add test 10.10.107.119 +add test 10.10.107.12 +add test 10.10.107.120 +add test 10.10.107.121 +add test 10.10.107.122 +add test 10.10.107.123 +add test 10.10.107.124 +add test 10.10.107.125 +add test 10.10.107.126 +add test 10.10.107.127 +add test 10.10.107.128 +add test 10.10.107.129 +add test 10.10.107.13 +add test 10.10.107.130 +add test 10.10.107.131 +add test 10.10.107.132 +add test 10.10.107.133 +add test 10.10.107.134 +add test 10.10.107.135 +add test 10.10.107.136 +add test 10.10.107.137 +add test 10.10.107.138 +add test 10.10.107.139 +add test 10.10.107.14 +add test 10.10.107.140 +add test 10.10.107.141 +add test 10.10.107.142 +add test 10.10.107.143 +add test 10.10.107.144 +add test 10.10.107.145 +add test 10.10.107.146 +add test 10.10.107.147 +add test 10.10.107.148 +add test 10.10.107.149 +add test 10.10.107.15 +add test 10.10.107.150 +add test 10.10.107.151 +add test 10.10.107.152 +add test 10.10.107.153 +add test 10.10.107.154 +add test 10.10.107.155 +add test 10.10.107.156 +add test 10.10.107.157 +add test 10.10.107.158 +add test 10.10.107.159 +add test 10.10.107.16 +add test 10.10.107.160 +add test 10.10.107.161 +add test 10.10.107.162 +add test 10.10.107.163 +add test 10.10.107.164 +add test 10.10.107.165 +add test 10.10.107.166 +add test 10.10.107.167 +add test 10.10.107.168 +add test 10.10.107.169 +add test 10.10.107.17 +add test 10.10.107.170 +add test 10.10.107.171 +add test 10.10.107.172 +add test 10.10.107.173 +add test 10.10.107.174 +add test 10.10.107.175 +add test 10.10.107.176 +add test 10.10.107.177 +add test 10.10.107.178 +add test 10.10.107.179 +add test 10.10.107.18 +add test 10.10.107.180 +add test 10.10.107.181 +add test 10.10.107.182 +add test 10.10.107.183 +add test 10.10.107.184 +add test 10.10.107.185 +add test 10.10.107.186 +add test 10.10.107.187 +add test 10.10.107.188 +add test 10.10.107.189 +add test 10.10.107.19 +add test 10.10.107.190 +add test 10.10.107.191 +add test 10.10.107.192 +add test 10.10.107.193 +add test 10.10.107.194 +add test 10.10.107.195 +add test 10.10.107.196 +add test 10.10.107.197 +add test 10.10.107.198 +add test 10.10.107.199 +add test 10.10.107.2 +add test 10.10.107.20 +add test 10.10.107.200 +add test 10.10.107.201 +add test 10.10.107.202 +add test 10.10.107.203 +add test 10.10.107.204 +add test 10.10.107.205 +add test 10.10.107.206 +add test 10.10.107.207 +add test 10.10.107.208 +add test 10.10.107.209 +add test 10.10.107.21 +add test 10.10.107.210 +add test 10.10.107.211 +add test 10.10.107.212 +add test 10.10.107.213 +add test 10.10.107.214 +add test 10.10.107.215 +add test 10.10.107.216 +add test 10.10.107.217 +add test 10.10.107.218 +add test 10.10.107.219 +add test 10.10.107.22 +add test 10.10.107.220 +add test 10.10.107.221 +add test 10.10.107.222 +add test 10.10.107.223 +add test 10.10.107.224 +add test 10.10.107.225 +add test 10.10.107.226 +add test 10.10.107.227 +add test 10.10.107.228 +add test 10.10.107.229 +add test 10.10.107.23 +add test 10.10.107.230 +add test 10.10.107.231 +add test 10.10.107.232 +add test 10.10.107.233 +add test 10.10.107.234 +add test 10.10.107.235 +add test 10.10.107.236 +add test 10.10.107.237 +add test 10.10.107.238 +add test 10.10.107.239 +add test 10.10.107.24 +add test 10.10.107.240 +add test 10.10.107.241 +add test 10.10.107.242 +add test 10.10.107.243 +add test 10.10.107.244 +add test 10.10.107.245 +add test 10.10.107.246 +add test 10.10.107.247 +add test 10.10.107.248 +add test 10.10.107.249 +add test 10.10.107.25 +add test 10.10.107.250 +add test 10.10.107.251 +add test 10.10.107.252 +add test 10.10.107.253 +add test 10.10.107.254 +add test 10.10.107.255 +add test 10.10.107.26 +add test 10.10.107.27 +add test 10.10.107.28 +add test 10.10.107.29 +add test 10.10.107.3 +add test 10.10.107.30 +add test 10.10.107.31 +add test 10.10.107.32 +add test 10.10.107.33 +add test 10.10.107.34 +add test 10.10.107.35 +add test 10.10.107.36 +add test 10.10.107.37 +add test 10.10.107.38 +add test 10.10.107.39 +add test 10.10.107.4 +add test 10.10.107.40 +add test 10.10.107.41 +add test 10.10.107.42 +add test 10.10.107.43 +add test 10.10.107.44 +add test 10.10.107.45 +add test 10.10.107.46 +add test 10.10.107.47 +add test 10.10.107.48 +add test 10.10.107.49 +add test 10.10.107.5 +add test 10.10.107.50 +add test 10.10.107.51 +add test 10.10.107.52 +add test 10.10.107.53 +add test 10.10.107.54 +add test 10.10.107.55 +add test 10.10.107.56 +add test 10.10.107.57 +add test 10.10.107.58 +add test 10.10.107.59 +add test 10.10.107.6 +add test 10.10.107.60 +add test 10.10.107.61 +add test 10.10.107.62 +add test 10.10.107.63 +add test 10.10.107.64 +add test 10.10.107.65 +add test 10.10.107.66 +add test 10.10.107.67 +add test 10.10.107.68 +add test 10.10.107.69 +add test 10.10.107.7 +add test 10.10.107.70 +add test 10.10.107.71 +add test 10.10.107.72 +add test 10.10.107.73 +add test 10.10.107.74 +add test 10.10.107.75 +add test 10.10.107.76 +add test 10.10.107.77 +add test 10.10.107.78 +add test 10.10.107.79 +add test 10.10.107.8 +add test 10.10.107.80 +add test 10.10.107.81 +add test 10.10.107.82 +add test 10.10.107.83 +add test 10.10.107.84 +add test 10.10.107.85 +add test 10.10.107.86 +add test 10.10.107.87 +add test 10.10.107.88 +add test 10.10.107.89 +add test 10.10.107.9 +add test 10.10.107.90 +add test 10.10.107.91 +add test 10.10.107.92 +add test 10.10.107.93 +add test 10.10.107.94 +add test 10.10.107.95 +add test 10.10.107.96 +add test 10.10.107.97 +add test 10.10.107.98 +add test 10.10.107.99 +add test 10.10.108.0 +add test 10.10.108.1 +add test 10.10.108.10 +add test 10.10.108.100 +add test 10.10.108.101 +add test 10.10.108.102 +add test 10.10.108.103 +add test 10.10.108.104 +add test 10.10.108.105 +add test 10.10.108.106 +add test 10.10.108.107 +add test 10.10.108.108 +add test 10.10.108.109 +add test 10.10.108.11 +add test 10.10.108.110 +add test 10.10.108.111 +add test 10.10.108.112 +add test 10.10.108.113 +add test 10.10.108.114 +add test 10.10.108.115 +add test 10.10.108.116 +add test 10.10.108.117 +add test 10.10.108.118 +add test 10.10.108.119 +add test 10.10.108.12 +add test 10.10.108.120 +add test 10.10.108.121 +add test 10.10.108.122 +add test 10.10.108.123 +add test 10.10.108.124 +add test 10.10.108.125 +add test 10.10.108.126 +add test 10.10.108.127 +add test 10.10.108.128 +add test 10.10.108.129 +add test 10.10.108.13 +add test 10.10.108.130 +add test 10.10.108.131 +add test 10.10.108.132 +add test 10.10.108.133 +add test 10.10.108.134 +add test 10.10.108.135 +add test 10.10.108.136 +add test 10.10.108.137 +add test 10.10.108.138 +add test 10.10.108.139 +add test 10.10.108.14 +add test 10.10.108.140 +add test 10.10.108.141 +add test 10.10.108.142 +add test 10.10.108.143 +add test 10.10.108.144 +add test 10.10.108.145 +add test 10.10.108.146 +add test 10.10.108.147 +add test 10.10.108.148 +add test 10.10.108.149 +add test 10.10.108.15 +add test 10.10.108.150 +add test 10.10.108.151 +add test 10.10.108.152 +add test 10.10.108.153 +add test 10.10.108.154 +add test 10.10.108.155 +add test 10.10.108.156 +add test 10.10.108.157 +add test 10.10.108.158 +add test 10.10.108.159 +add test 10.10.108.16 +add test 10.10.108.160 +add test 10.10.108.161 +add test 10.10.108.162 +add test 10.10.108.163 +add test 10.10.108.164 +add test 10.10.108.165 +add test 10.10.108.166 +add test 10.10.108.167 +add test 10.10.108.168 +add test 10.10.108.169 +add test 10.10.108.17 +add test 10.10.108.170 +add test 10.10.108.171 +add test 10.10.108.172 +add test 10.10.108.173 +add test 10.10.108.174 +add test 10.10.108.175 +add test 10.10.108.176 +add test 10.10.108.177 +add test 10.10.108.178 +add test 10.10.108.179 +add test 10.10.108.18 +add test 10.10.108.180 +add test 10.10.108.181 +add test 10.10.108.182 +add test 10.10.108.183 +add test 10.10.108.184 +add test 10.10.108.185 +add test 10.10.108.186 +add test 10.10.108.187 +add test 10.10.108.188 +add test 10.10.108.189 +add test 10.10.108.19 +add test 10.10.108.190 +add test 10.10.108.191 +add test 10.10.108.192 +add test 10.10.108.193 +add test 10.10.108.194 +add test 10.10.108.195 +add test 10.10.108.196 +add test 10.10.108.197 +add test 10.10.108.198 +add test 10.10.108.199 +add test 10.10.108.2 +add test 10.10.108.20 +add test 10.10.108.200 +add test 10.10.108.201 +add test 10.10.108.202 +add test 10.10.108.203 +add test 10.10.108.204 +add test 10.10.108.205 +add test 10.10.108.206 +add test 10.10.108.207 +add test 10.10.108.208 +add test 10.10.108.209 +add test 10.10.108.21 +add test 10.10.108.210 +add test 10.10.108.211 +add test 10.10.108.212 +add test 10.10.108.213 +add test 10.10.108.214 +add test 10.10.108.215 +add test 10.10.108.216 +add test 10.10.108.217 +add test 10.10.108.218 +add test 10.10.108.219 +add test 10.10.108.22 +add test 10.10.108.220 +add test 10.10.108.221 +add test 10.10.108.222 +add test 10.10.108.223 +add test 10.10.108.224 +add test 10.10.108.225 +add test 10.10.108.226 +add test 10.10.108.227 +add test 10.10.108.228 +add test 10.10.108.229 +add test 10.10.108.23 +add test 10.10.108.230 +add test 10.10.108.231 +add test 10.10.108.232 +add test 10.10.108.233 +add test 10.10.108.234 +add test 10.10.108.235 +add test 10.10.108.236 +add test 10.10.108.237 +add test 10.10.108.238 +add test 10.10.108.239 +add test 10.10.108.24 +add test 10.10.108.240 +add test 10.10.108.241 +add test 10.10.108.242 +add test 10.10.108.243 +add test 10.10.108.244 +add test 10.10.108.245 +add test 10.10.108.246 +add test 10.10.108.247 +add test 10.10.108.248 +add test 10.10.108.249 +add test 10.10.108.25 +add test 10.10.108.250 +add test 10.10.108.251 +add test 10.10.108.252 +add test 10.10.108.253 +add test 10.10.108.254 +add test 10.10.108.255 +add test 10.10.108.26 +add test 10.10.108.27 +add test 10.10.108.28 +add test 10.10.108.29 +add test 10.10.108.3 +add test 10.10.108.30 +add test 10.10.108.31 +add test 10.10.108.32 +add test 10.10.108.33 +add test 10.10.108.34 +add test 10.10.108.35 +add test 10.10.108.36 +add test 10.10.108.37 +add test 10.10.108.38 +add test 10.10.108.39 +add test 10.10.108.4 +add test 10.10.108.40 +add test 10.10.108.41 +add test 10.10.108.42 +add test 10.10.108.43 +add test 10.10.108.44 +add test 10.10.108.45 +add test 10.10.108.46 +add test 10.10.108.47 +add test 10.10.108.48 +add test 10.10.108.49 +add test 10.10.108.5 +add test 10.10.108.50 +add test 10.10.108.51 +add test 10.10.108.52 +add test 10.10.108.53 +add test 10.10.108.54 +add test 10.10.108.55 +add test 10.10.108.56 +add test 10.10.108.57 +add test 10.10.108.58 +add test 10.10.108.59 +add test 10.10.108.6 +add test 10.10.108.60 +add test 10.10.108.61 +add test 10.10.108.62 +add test 10.10.108.63 +add test 10.10.108.64 +add test 10.10.108.65 +add test 10.10.108.66 +add test 10.10.108.67 +add test 10.10.108.68 +add test 10.10.108.69 +add test 10.10.108.7 +add test 10.10.108.70 +add test 10.10.108.71 +add test 10.10.108.72 +add test 10.10.108.73 +add test 10.10.108.74 +add test 10.10.108.75 +add test 10.10.108.76 +add test 10.10.108.77 +add test 10.10.108.78 +add test 10.10.108.79 +add test 10.10.108.8 +add test 10.10.108.80 +add test 10.10.108.81 +add test 10.10.108.82 +add test 10.10.108.83 +add test 10.10.108.84 +add test 10.10.108.85 +add test 10.10.108.86 +add test 10.10.108.87 +add test 10.10.108.88 +add test 10.10.108.89 +add test 10.10.108.9 +add test 10.10.108.90 +add test 10.10.108.91 +add test 10.10.108.92 +add test 10.10.108.93 +add test 10.10.108.94 +add test 10.10.108.95 +add test 10.10.108.96 +add test 10.10.108.97 +add test 10.10.108.98 +add test 10.10.108.99 +add test 10.10.109.0 +add test 10.10.109.1 +add test 10.10.109.10 +add test 10.10.109.100 +add test 10.10.109.101 +add test 10.10.109.102 +add test 10.10.109.103 +add test 10.10.109.104 +add test 10.10.109.105 +add test 10.10.109.106 +add test 10.10.109.107 +add test 10.10.109.108 +add test 10.10.109.109 +add test 10.10.109.11 +add test 10.10.109.110 +add test 10.10.109.111 +add test 10.10.109.112 +add test 10.10.109.113 +add test 10.10.109.114 +add test 10.10.109.115 +add test 10.10.109.116 +add test 10.10.109.117 +add test 10.10.109.118 +add test 10.10.109.119 +add test 10.10.109.12 +add test 10.10.109.120 +add test 10.10.109.121 +add test 10.10.109.122 +add test 10.10.109.123 +add test 10.10.109.124 +add test 10.10.109.125 +add test 10.10.109.126 +add test 10.10.109.127 +add test 10.10.109.128 +add test 10.10.109.129 +add test 10.10.109.13 +add test 10.10.109.130 +add test 10.10.109.131 +add test 10.10.109.132 +add test 10.10.109.133 +add test 10.10.109.134 +add test 10.10.109.135 +add test 10.10.109.136 +add test 10.10.109.137 +add test 10.10.109.138 +add test 10.10.109.139 +add test 10.10.109.14 +add test 10.10.109.140 +add test 10.10.109.141 +add test 10.10.109.142 +add test 10.10.109.143 +add test 10.10.109.144 +add test 10.10.109.145 +add test 10.10.109.146 +add test 10.10.109.147 +add test 10.10.109.148 +add test 10.10.109.149 +add test 10.10.109.15 +add test 10.10.109.150 +add test 10.10.109.151 +add test 10.10.109.152 +add test 10.10.109.153 +add test 10.10.109.154 +add test 10.10.109.155 +add test 10.10.109.156 +add test 10.10.109.157 +add test 10.10.109.158 +add test 10.10.109.159 +add test 10.10.109.16 +add test 10.10.109.160 +add test 10.10.109.161 +add test 10.10.109.162 +add test 10.10.109.163 +add test 10.10.109.164 +add test 10.10.109.165 +add test 10.10.109.166 +add test 10.10.109.167 +add test 10.10.109.168 +add test 10.10.109.169 +add test 10.10.109.17 +add test 10.10.109.170 +add test 10.10.109.171 +add test 10.10.109.172 +add test 10.10.109.173 +add test 10.10.109.174 +add test 10.10.109.175 +add test 10.10.109.176 +add test 10.10.109.177 +add test 10.10.109.178 +add test 10.10.109.179 +add test 10.10.109.18 +add test 10.10.109.180 +add test 10.10.109.181 +add test 10.10.109.182 +add test 10.10.109.183 +add test 10.10.109.184 +add test 10.10.109.185 +add test 10.10.109.186 +add test 10.10.109.187 +add test 10.10.109.188 +add test 10.10.109.189 +add test 10.10.109.19 +add test 10.10.109.190 +add test 10.10.109.191 +add test 10.10.109.192 +add test 10.10.109.193 +add test 10.10.109.194 +add test 10.10.109.195 +add test 10.10.109.196 +add test 10.10.109.197 +add test 10.10.109.198 +add test 10.10.109.199 +add test 10.10.109.2 +add test 10.10.109.20 +add test 10.10.109.200 +add test 10.10.109.201 +add test 10.10.109.202 +add test 10.10.109.203 +add test 10.10.109.204 +add test 10.10.109.205 +add test 10.10.109.206 +add test 10.10.109.207 +add test 10.10.109.208 +add test 10.10.109.209 +add test 10.10.109.21 +add test 10.10.109.210 +add test 10.10.109.211 +add test 10.10.109.212 +add test 10.10.109.213 +add test 10.10.109.214 +add test 10.10.109.215 +add test 10.10.109.216 +add test 10.10.109.217 +add test 10.10.109.218 +add test 10.10.109.219 +add test 10.10.109.22 +add test 10.10.109.220 +add test 10.10.109.221 +add test 10.10.109.222 +add test 10.10.109.223 +add test 10.10.109.224 +add test 10.10.109.225 +add test 10.10.109.226 +add test 10.10.109.227 +add test 10.10.109.228 +add test 10.10.109.229 +add test 10.10.109.23 +add test 10.10.109.230 +add test 10.10.109.231 +add test 10.10.109.232 +add test 10.10.109.233 +add test 10.10.109.234 +add test 10.10.109.235 +add test 10.10.109.236 +add test 10.10.109.237 +add test 10.10.109.238 +add test 10.10.109.239 +add test 10.10.109.24 +add test 10.10.109.240 +add test 10.10.109.241 +add test 10.10.109.242 +add test 10.10.109.243 +add test 10.10.109.244 +add test 10.10.109.245 +add test 10.10.109.246 +add test 10.10.109.247 +add test 10.10.109.248 +add test 10.10.109.249 +add test 10.10.109.25 +add test 10.10.109.250 +add test 10.10.109.251 +add test 10.10.109.252 +add test 10.10.109.253 +add test 10.10.109.254 +add test 10.10.109.255 +add test 10.10.109.26 +add test 10.10.109.27 +add test 10.10.109.28 +add test 10.10.109.29 +add test 10.10.109.3 +add test 10.10.109.30 +add test 10.10.109.31 +add test 10.10.109.32 +add test 10.10.109.33 +add test 10.10.109.34 +add test 10.10.109.35 +add test 10.10.109.36 +add test 10.10.109.37 +add test 10.10.109.38 +add test 10.10.109.39 +add test 10.10.109.4 +add test 10.10.109.40 +add test 10.10.109.41 +add test 10.10.109.42 +add test 10.10.109.43 +add test 10.10.109.44 +add test 10.10.109.45 +add test 10.10.109.46 +add test 10.10.109.47 +add test 10.10.109.48 +add test 10.10.109.49 +add test 10.10.109.5 +add test 10.10.109.50 +add test 10.10.109.51 +add test 10.10.109.52 +add test 10.10.109.53 +add test 10.10.109.54 +add test 10.10.109.55 +add test 10.10.109.56 +add test 10.10.109.57 +add test 10.10.109.58 +add test 10.10.109.59 +add test 10.10.109.6 +add test 10.10.109.60 +add test 10.10.109.61 +add test 10.10.109.62 +add test 10.10.109.63 +add test 10.10.109.64 +add test 10.10.109.65 +add test 10.10.109.66 +add test 10.10.109.67 +add test 10.10.109.68 +add test 10.10.109.69 +add test 10.10.109.7 +add test 10.10.109.70 +add test 10.10.109.71 +add test 10.10.109.72 +add test 10.10.109.73 +add test 10.10.109.74 +add test 10.10.109.75 +add test 10.10.109.76 +add test 10.10.109.77 +add test 10.10.109.78 +add test 10.10.109.79 +add test 10.10.109.8 +add test 10.10.109.80 +add test 10.10.109.81 +add test 10.10.109.82 +add test 10.10.109.83 +add test 10.10.109.84 +add test 10.10.109.85 +add test 10.10.109.86 +add test 10.10.109.87 +add test 10.10.109.88 +add test 10.10.109.89 +add test 10.10.109.9 +add test 10.10.109.90 +add test 10.10.109.91 +add test 10.10.109.92 +add test 10.10.109.93 +add test 10.10.109.94 +add test 10.10.109.95 +add test 10.10.109.96 +add test 10.10.109.97 +add test 10.10.109.98 +add test 10.10.109.99 +add test 10.10.11.0 +add test 10.10.11.1 +add test 10.10.11.10 +add test 10.10.11.100 +add test 10.10.11.101 +add test 10.10.11.102 +add test 10.10.11.103 +add test 10.10.11.104 +add test 10.10.11.105 +add test 10.10.11.106 +add test 10.10.11.107 +add test 10.10.11.108 +add test 10.10.11.109 +add test 10.10.11.11 +add test 10.10.11.110 +add test 10.10.11.111 +add test 10.10.11.112 +add test 10.10.11.113 +add test 10.10.11.114 +add test 10.10.11.115 +add test 10.10.11.116 +add test 10.10.11.117 +add test 10.10.11.118 +add test 10.10.11.119 +add test 10.10.11.12 +add test 10.10.11.120 +add test 10.10.11.121 +add test 10.10.11.122 +add test 10.10.11.123 +add test 10.10.11.124 +add test 10.10.11.125 +add test 10.10.11.126 +add test 10.10.11.127 +add test 10.10.11.128 +add test 10.10.11.129 +add test 10.10.11.13 +add test 10.10.11.130 +add test 10.10.11.131 +add test 10.10.11.132 +add test 10.10.11.133 +add test 10.10.11.134 +add test 10.10.11.135 +add test 10.10.11.136 +add test 10.10.11.137 +add test 10.10.11.138 +add test 10.10.11.139 +add test 10.10.11.14 +add test 10.10.11.140 +add test 10.10.11.141 +add test 10.10.11.142 +add test 10.10.11.143 +add test 10.10.11.144 +add test 10.10.11.145 +add test 10.10.11.146 +add test 10.10.11.147 +add test 10.10.11.148 +add test 10.10.11.149 +add test 10.10.11.15 +add test 10.10.11.150 +add test 10.10.11.151 +add test 10.10.11.152 +add test 10.10.11.153 +add test 10.10.11.154 +add test 10.10.11.155 +add test 10.10.11.156 +add test 10.10.11.157 +add test 10.10.11.158 +add test 10.10.11.159 +add test 10.10.11.16 +add test 10.10.11.160 +add test 10.10.11.161 +add test 10.10.11.162 +add test 10.10.11.163 +add test 10.10.11.164 +add test 10.10.11.165 +add test 10.10.11.166 +add test 10.10.11.167 +add test 10.10.11.168 +add test 10.10.11.169 +add test 10.10.11.17 +add test 10.10.11.170 +add test 10.10.11.171 +add test 10.10.11.172 +add test 10.10.11.173 +add test 10.10.11.174 +add test 10.10.11.175 +add test 10.10.11.176 +add test 10.10.11.177 +add test 10.10.11.178 +add test 10.10.11.179 +add test 10.10.11.18 +add test 10.10.11.180 +add test 10.10.11.181 +add test 10.10.11.182 +add test 10.10.11.183 +add test 10.10.11.184 +add test 10.10.11.185 +add test 10.10.11.186 +add test 10.10.11.187 +add test 10.10.11.188 +add test 10.10.11.189 +add test 10.10.11.19 +add test 10.10.11.190 +add test 10.10.11.191 +add test 10.10.11.192 +add test 10.10.11.193 +add test 10.10.11.194 +add test 10.10.11.195 +add test 10.10.11.196 +add test 10.10.11.197 +add test 10.10.11.198 +add test 10.10.11.199 +add test 10.10.11.2 +add test 10.10.11.20 +add test 10.10.11.200 +add test 10.10.11.201 +add test 10.10.11.202 +add test 10.10.11.203 +add test 10.10.11.204 +add test 10.10.11.205 +add test 10.10.11.206 +add test 10.10.11.207 +add test 10.10.11.208 +add test 10.10.11.209 +add test 10.10.11.21 +add test 10.10.11.210 +add test 10.10.11.211 +add test 10.10.11.212 +add test 10.10.11.213 +add test 10.10.11.214 +add test 10.10.11.215 +add test 10.10.11.216 +add test 10.10.11.217 +add test 10.10.11.218 +add test 10.10.11.219 +add test 10.10.11.22 +add test 10.10.11.220 +add test 10.10.11.221 +add test 10.10.11.222 +add test 10.10.11.223 +add test 10.10.11.224 +add test 10.10.11.225 +add test 10.10.11.226 +add test 10.10.11.227 +add test 10.10.11.228 +add test 10.10.11.229 +add test 10.10.11.23 +add test 10.10.11.230 +add test 10.10.11.231 +add test 10.10.11.232 +add test 10.10.11.233 +add test 10.10.11.234 +add test 10.10.11.235 +add test 10.10.11.236 +add test 10.10.11.237 +add test 10.10.11.238 +add test 10.10.11.239 +add test 10.10.11.24 +add test 10.10.11.240 +add test 10.10.11.241 +add test 10.10.11.242 +add test 10.10.11.243 +add test 10.10.11.244 +add test 10.10.11.245 +add test 10.10.11.246 +add test 10.10.11.247 +add test 10.10.11.248 +add test 10.10.11.249 +add test 10.10.11.25 +add test 10.10.11.250 +add test 10.10.11.251 +add test 10.10.11.252 +add test 10.10.11.253 +add test 10.10.11.254 +add test 10.10.11.255 +add test 10.10.11.26 +add test 10.10.11.27 +add test 10.10.11.28 +add test 10.10.11.29 +add test 10.10.11.3 +add test 10.10.11.30 +add test 10.10.11.31 +add test 10.10.11.32 +add test 10.10.11.33 +add test 10.10.11.34 +add test 10.10.11.35 +add test 10.10.11.36 +add test 10.10.11.37 +add test 10.10.11.38 +add test 10.10.11.39 +add test 10.10.11.4 +add test 10.10.11.40 +add test 10.10.11.41 +add test 10.10.11.42 +add test 10.10.11.43 +add test 10.10.11.44 +add test 10.10.11.45 +add test 10.10.11.46 +add test 10.10.11.47 +add test 10.10.11.48 +add test 10.10.11.49 +add test 10.10.11.5 +add test 10.10.11.50 +add test 10.10.11.51 +add test 10.10.11.52 +add test 10.10.11.53 +add test 10.10.11.54 +add test 10.10.11.55 +add test 10.10.11.56 +add test 10.10.11.57 +add test 10.10.11.58 +add test 10.10.11.59 +add test 10.10.11.6 +add test 10.10.11.60 +add test 10.10.11.61 +add test 10.10.11.62 +add test 10.10.11.63 +add test 10.10.11.64 +add test 10.10.11.65 +add test 10.10.11.66 +add test 10.10.11.67 +add test 10.10.11.68 +add test 10.10.11.69 +add test 10.10.11.7 +add test 10.10.11.70 +add test 10.10.11.71 +add test 10.10.11.72 +add test 10.10.11.73 +add test 10.10.11.74 +add test 10.10.11.75 +add test 10.10.11.76 +add test 10.10.11.77 +add test 10.10.11.78 +add test 10.10.11.79 +add test 10.10.11.8 +add test 10.10.11.80 +add test 10.10.11.81 +add test 10.10.11.82 +add test 10.10.11.83 +add test 10.10.11.84 +add test 10.10.11.85 +add test 10.10.11.86 +add test 10.10.11.87 +add test 10.10.11.88 +add test 10.10.11.89 +add test 10.10.11.9 +add test 10.10.11.90 +add test 10.10.11.91 +add test 10.10.11.92 +add test 10.10.11.93 +add test 10.10.11.94 +add test 10.10.11.95 +add test 10.10.11.96 +add test 10.10.11.97 +add test 10.10.11.98 +add test 10.10.11.99 +add test 10.10.110.0 +add test 10.10.110.1 +add test 10.10.110.10 +add test 10.10.110.100 +add test 10.10.110.101 +add test 10.10.110.102 +add test 10.10.110.103 +add test 10.10.110.104 +add test 10.10.110.105 +add test 10.10.110.106 +add test 10.10.110.107 +add test 10.10.110.108 +add test 10.10.110.109 +add test 10.10.110.11 +add test 10.10.110.110 +add test 10.10.110.111 +add test 10.10.110.112 +add test 10.10.110.113 +add test 10.10.110.114 +add test 10.10.110.115 +add test 10.10.110.116 +add test 10.10.110.117 +add test 10.10.110.118 +add test 10.10.110.119 +add test 10.10.110.12 +add test 10.10.110.120 +add test 10.10.110.121 +add test 10.10.110.122 +add test 10.10.110.123 +add test 10.10.110.124 +add test 10.10.110.125 +add test 10.10.110.126 +add test 10.10.110.127 +add test 10.10.110.128 +add test 10.10.110.129 +add test 10.10.110.13 +add test 10.10.110.130 +add test 10.10.110.131 +add test 10.10.110.132 +add test 10.10.110.133 +add test 10.10.110.134 +add test 10.10.110.135 +add test 10.10.110.136 +add test 10.10.110.137 +add test 10.10.110.138 +add test 10.10.110.139 +add test 10.10.110.14 +add test 10.10.110.140 +add test 10.10.110.141 +add test 10.10.110.142 +add test 10.10.110.143 +add test 10.10.110.144 +add test 10.10.110.145 +add test 10.10.110.146 +add test 10.10.110.147 +add test 10.10.110.148 +add test 10.10.110.149 +add test 10.10.110.15 +add test 10.10.110.150 +add test 10.10.110.151 +add test 10.10.110.152 +add test 10.10.110.153 +add test 10.10.110.154 +add test 10.10.110.155 +add test 10.10.110.156 +add test 10.10.110.157 +add test 10.10.110.158 +add test 10.10.110.159 +add test 10.10.110.16 +add test 10.10.110.160 +add test 10.10.110.161 +add test 10.10.110.162 +add test 10.10.110.163 +add test 10.10.110.164 +add test 10.10.110.165 +add test 10.10.110.166 +add test 10.10.110.167 +add test 10.10.110.168 +add test 10.10.110.169 +add test 10.10.110.17 +add test 10.10.110.170 +add test 10.10.110.171 +add test 10.10.110.172 +add test 10.10.110.173 +add test 10.10.110.174 +add test 10.10.110.175 +add test 10.10.110.176 +add test 10.10.110.177 +add test 10.10.110.178 +add test 10.10.110.179 +add test 10.10.110.18 +add test 10.10.110.180 +add test 10.10.110.181 +add test 10.10.110.182 +add test 10.10.110.183 +add test 10.10.110.184 +add test 10.10.110.185 +add test 10.10.110.186 +add test 10.10.110.187 +add test 10.10.110.188 +add test 10.10.110.189 +add test 10.10.110.19 +add test 10.10.110.190 +add test 10.10.110.191 +add test 10.10.110.192 +add test 10.10.110.193 +add test 10.10.110.194 +add test 10.10.110.195 +add test 10.10.110.196 +add test 10.10.110.197 +add test 10.10.110.198 +add test 10.10.110.199 +add test 10.10.110.2 +add test 10.10.110.20 +add test 10.10.110.200 +add test 10.10.110.201 +add test 10.10.110.202 +add test 10.10.110.203 +add test 10.10.110.204 +add test 10.10.110.205 +add test 10.10.110.206 +add test 10.10.110.207 +add test 10.10.110.208 +add test 10.10.110.209 +add test 10.10.110.21 +add test 10.10.110.210 +add test 10.10.110.211 +add test 10.10.110.212 +add test 10.10.110.213 +add test 10.10.110.214 +add test 10.10.110.215 +add test 10.10.110.216 +add test 10.10.110.217 +add test 10.10.110.218 +add test 10.10.110.219 +add test 10.10.110.22 +add test 10.10.110.220 +add test 10.10.110.221 +add test 10.10.110.222 +add test 10.10.110.223 +add test 10.10.110.224 +add test 10.10.110.225 +add test 10.10.110.226 +add test 10.10.110.227 +add test 10.10.110.228 +add test 10.10.110.229 +add test 10.10.110.23 +add test 10.10.110.230 +add test 10.10.110.231 +add test 10.10.110.232 +add test 10.10.110.233 +add test 10.10.110.234 +add test 10.10.110.235 +add test 10.10.110.236 +add test 10.10.110.237 +add test 10.10.110.238 +add test 10.10.110.239 +add test 10.10.110.24 +add test 10.10.110.240 +add test 10.10.110.241 +add test 10.10.110.242 +add test 10.10.110.243 +add test 10.10.110.244 +add test 10.10.110.245 +add test 10.10.110.246 +add test 10.10.110.247 +add test 10.10.110.248 +add test 10.10.110.249 +add test 10.10.110.25 +add test 10.10.110.250 +add test 10.10.110.251 +add test 10.10.110.252 +add test 10.10.110.253 +add test 10.10.110.254 +add test 10.10.110.255 +add test 10.10.110.26 +add test 10.10.110.27 +add test 10.10.110.28 +add test 10.10.110.29 +add test 10.10.110.3 +add test 10.10.110.30 +add test 10.10.110.31 +add test 10.10.110.32 +add test 10.10.110.33 +add test 10.10.110.34 +add test 10.10.110.35 +add test 10.10.110.36 +add test 10.10.110.37 +add test 10.10.110.38 +add test 10.10.110.39 +add test 10.10.110.4 +add test 10.10.110.40 +add test 10.10.110.41 +add test 10.10.110.42 +add test 10.10.110.43 +add test 10.10.110.44 +add test 10.10.110.45 +add test 10.10.110.46 +add test 10.10.110.47 +add test 10.10.110.48 +add test 10.10.110.49 +add test 10.10.110.5 +add test 10.10.110.50 +add test 10.10.110.51 +add test 10.10.110.52 +add test 10.10.110.53 +add test 10.10.110.54 +add test 10.10.110.55 +add test 10.10.110.56 +add test 10.10.110.57 +add test 10.10.110.58 +add test 10.10.110.59 +add test 10.10.110.6 +add test 10.10.110.60 +add test 10.10.110.61 +add test 10.10.110.62 +add test 10.10.110.63 +add test 10.10.110.64 +add test 10.10.110.65 +add test 10.10.110.66 +add test 10.10.110.67 +add test 10.10.110.68 +add test 10.10.110.69 +add test 10.10.110.7 +add test 10.10.110.70 +add test 10.10.110.71 +add test 10.10.110.72 +add test 10.10.110.73 +add test 10.10.110.74 +add test 10.10.110.75 +add test 10.10.110.76 +add test 10.10.110.77 +add test 10.10.110.78 +add test 10.10.110.79 +add test 10.10.110.8 +add test 10.10.110.80 +add test 10.10.110.81 +add test 10.10.110.82 +add test 10.10.110.83 +add test 10.10.110.84 +add test 10.10.110.85 +add test 10.10.110.86 +add test 10.10.110.87 +add test 10.10.110.88 +add test 10.10.110.89 +add test 10.10.110.9 +add test 10.10.110.90 +add test 10.10.110.91 +add test 10.10.110.92 +add test 10.10.110.93 +add test 10.10.110.94 +add test 10.10.110.95 +add test 10.10.110.96 +add test 10.10.110.97 +add test 10.10.110.98 +add test 10.10.110.99 +add test 10.10.111.0 +add test 10.10.111.1 +add test 10.10.111.10 +add test 10.10.111.100 +add test 10.10.111.101 +add test 10.10.111.102 +add test 10.10.111.103 +add test 10.10.111.104 +add test 10.10.111.105 +add test 10.10.111.106 +add test 10.10.111.107 +add test 10.10.111.108 +add test 10.10.111.109 +add test 10.10.111.11 +add test 10.10.111.110 +add test 10.10.111.111 +add test 10.10.111.112 +add test 10.10.111.113 +add test 10.10.111.114 +add test 10.10.111.115 +add test 10.10.111.116 +add test 10.10.111.117 +add test 10.10.111.118 +add test 10.10.111.119 +add test 10.10.111.12 +add test 10.10.111.120 +add test 10.10.111.121 +add test 10.10.111.122 +add test 10.10.111.123 +add test 10.10.111.124 +add test 10.10.111.125 +add test 10.10.111.126 +add test 10.10.111.127 +add test 10.10.111.128 +add test 10.10.111.129 +add test 10.10.111.13 +add test 10.10.111.130 +add test 10.10.111.131 +add test 10.10.111.132 +add test 10.10.111.133 +add test 10.10.111.134 +add test 10.10.111.135 +add test 10.10.111.136 +add test 10.10.111.137 +add test 10.10.111.138 +add test 10.10.111.139 +add test 10.10.111.14 +add test 10.10.111.140 +add test 10.10.111.141 +add test 10.10.111.142 +add test 10.10.111.143 +add test 10.10.111.144 +add test 10.10.111.145 +add test 10.10.111.146 +add test 10.10.111.147 +add test 10.10.111.148 +add test 10.10.111.149 +add test 10.10.111.15 +add test 10.10.111.150 +add test 10.10.111.151 +add test 10.10.111.152 +add test 10.10.111.153 +add test 10.10.111.154 +add test 10.10.111.155 +add test 10.10.111.156 +add test 10.10.111.157 +add test 10.10.111.158 +add test 10.10.111.159 +add test 10.10.111.16 +add test 10.10.111.160 +add test 10.10.111.161 +add test 10.10.111.162 +add test 10.10.111.163 +add test 10.10.111.164 +add test 10.10.111.165 +add test 10.10.111.166 +add test 10.10.111.167 +add test 10.10.111.168 +add test 10.10.111.169 +add test 10.10.111.17 +add test 10.10.111.170 +add test 10.10.111.171 +add test 10.10.111.172 +add test 10.10.111.173 +add test 10.10.111.174 +add test 10.10.111.175 +add test 10.10.111.176 +add test 10.10.111.177 +add test 10.10.111.178 +add test 10.10.111.179 +add test 10.10.111.18 +add test 10.10.111.180 +add test 10.10.111.181 +add test 10.10.111.182 +add test 10.10.111.183 +add test 10.10.111.184 +add test 10.10.111.185 +add test 10.10.111.186 +add test 10.10.111.187 +add test 10.10.111.188 +add test 10.10.111.189 +add test 10.10.111.19 +add test 10.10.111.190 +add test 10.10.111.191 +add test 10.10.111.192 +add test 10.10.111.193 +add test 10.10.111.194 +add test 10.10.111.195 +add test 10.10.111.196 +add test 10.10.111.197 +add test 10.10.111.198 +add test 10.10.111.199 +add test 10.10.111.2 +add test 10.10.111.20 +add test 10.10.111.200 +add test 10.10.111.201 +add test 10.10.111.202 +add test 10.10.111.203 +add test 10.10.111.204 +add test 10.10.111.205 +add test 10.10.111.206 +add test 10.10.111.207 +add test 10.10.111.208 +add test 10.10.111.209 +add test 10.10.111.21 +add test 10.10.111.210 +add test 10.10.111.211 +add test 10.10.111.212 +add test 10.10.111.213 +add test 10.10.111.214 +add test 10.10.111.215 +add test 10.10.111.216 +add test 10.10.111.217 +add test 10.10.111.218 +add test 10.10.111.219 +add test 10.10.111.22 +add test 10.10.111.220 +add test 10.10.111.221 +add test 10.10.111.222 +add test 10.10.111.223 +add test 10.10.111.224 +add test 10.10.111.225 +add test 10.10.111.226 +add test 10.10.111.227 +add test 10.10.111.228 +add test 10.10.111.229 +add test 10.10.111.23 +add test 10.10.111.230 +add test 10.10.111.231 +add test 10.10.111.232 +add test 10.10.111.233 +add test 10.10.111.234 +add test 10.10.111.235 +add test 10.10.111.236 +add test 10.10.111.237 +add test 10.10.111.238 +add test 10.10.111.239 +add test 10.10.111.24 +add test 10.10.111.240 +add test 10.10.111.241 +add test 10.10.111.242 +add test 10.10.111.243 +add test 10.10.111.244 +add test 10.10.111.245 +add test 10.10.111.246 +add test 10.10.111.247 +add test 10.10.111.248 +add test 10.10.111.249 +add test 10.10.111.25 +add test 10.10.111.250 +add test 10.10.111.251 +add test 10.10.111.252 +add test 10.10.111.253 +add test 10.10.111.254 +add test 10.10.111.255 +add test 10.10.111.26 +add test 10.10.111.27 +add test 10.10.111.28 +add test 10.10.111.29 +add test 10.10.111.3 +add test 10.10.111.30 +add test 10.10.111.31 +add test 10.10.111.32 +add test 10.10.111.33 +add test 10.10.111.34 +add test 10.10.111.35 +add test 10.10.111.36 +add test 10.10.111.37 +add test 10.10.111.38 +add test 10.10.111.39 +add test 10.10.111.4 +add test 10.10.111.40 +add test 10.10.111.41 +add test 10.10.111.42 +add test 10.10.111.43 +add test 10.10.111.44 +add test 10.10.111.45 +add test 10.10.111.46 +add test 10.10.111.47 +add test 10.10.111.48 +add test 10.10.111.49 +add test 10.10.111.5 +add test 10.10.111.50 +add test 10.10.111.51 +add test 10.10.111.52 +add test 10.10.111.53 +add test 10.10.111.54 +add test 10.10.111.55 +add test 10.10.111.56 +add test 10.10.111.57 +add test 10.10.111.58 +add test 10.10.111.59 +add test 10.10.111.6 +add test 10.10.111.60 +add test 10.10.111.61 +add test 10.10.111.62 +add test 10.10.111.63 +add test 10.10.111.64 +add test 10.10.111.65 +add test 10.10.111.66 +add test 10.10.111.67 +add test 10.10.111.68 +add test 10.10.111.69 +add test 10.10.111.7 +add test 10.10.111.70 +add test 10.10.111.71 +add test 10.10.111.72 +add test 10.10.111.73 +add test 10.10.111.74 +add test 10.10.111.75 +add test 10.10.111.76 +add test 10.10.111.77 +add test 10.10.111.78 +add test 10.10.111.79 +add test 10.10.111.8 +add test 10.10.111.80 +add test 10.10.111.81 +add test 10.10.111.82 +add test 10.10.111.83 +add test 10.10.111.84 +add test 10.10.111.85 +add test 10.10.111.86 +add test 10.10.111.87 +add test 10.10.111.88 +add test 10.10.111.89 +add test 10.10.111.9 +add test 10.10.111.90 +add test 10.10.111.91 +add test 10.10.111.92 +add test 10.10.111.93 +add test 10.10.111.94 +add test 10.10.111.95 +add test 10.10.111.96 +add test 10.10.111.97 +add test 10.10.111.98 +add test 10.10.111.99 +add test 10.10.112.0 +add test 10.10.112.1 +add test 10.10.112.10 +add test 10.10.112.100 +add test 10.10.112.101 +add test 10.10.112.102 +add test 10.10.112.103 +add test 10.10.112.104 +add test 10.10.112.105 +add test 10.10.112.106 +add test 10.10.112.107 +add test 10.10.112.108 +add test 10.10.112.109 +add test 10.10.112.11 +add test 10.10.112.110 +add test 10.10.112.111 +add test 10.10.112.112 +add test 10.10.112.113 +add test 10.10.112.114 +add test 10.10.112.115 +add test 10.10.112.116 +add test 10.10.112.117 +add test 10.10.112.118 +add test 10.10.112.119 +add test 10.10.112.12 +add test 10.10.112.120 +add test 10.10.112.121 +add test 10.10.112.122 +add test 10.10.112.123 +add test 10.10.112.124 +add test 10.10.112.125 +add test 10.10.112.126 +add test 10.10.112.127 +add test 10.10.112.128 +add test 10.10.112.129 +add test 10.10.112.13 +add test 10.10.112.130 +add test 10.10.112.131 +add test 10.10.112.132 +add test 10.10.112.133 +add test 10.10.112.134 +add test 10.10.112.135 +add test 10.10.112.136 +add test 10.10.112.137 +add test 10.10.112.138 +add test 10.10.112.139 +add test 10.10.112.14 +add test 10.10.112.140 +add test 10.10.112.141 +add test 10.10.112.142 +add test 10.10.112.143 +add test 10.10.112.144 +add test 10.10.112.145 +add test 10.10.112.146 +add test 10.10.112.147 +add test 10.10.112.148 +add test 10.10.112.149 +add test 10.10.112.15 +add test 10.10.112.150 +add test 10.10.112.151 +add test 10.10.112.152 +add test 10.10.112.153 +add test 10.10.112.154 +add test 10.10.112.155 +add test 10.10.112.156 +add test 10.10.112.157 +add test 10.10.112.158 +add test 10.10.112.159 +add test 10.10.112.16 +add test 10.10.112.160 +add test 10.10.112.161 +add test 10.10.112.162 +add test 10.10.112.163 +add test 10.10.112.164 +add test 10.10.112.165 +add test 10.10.112.166 +add test 10.10.112.167 +add test 10.10.112.168 +add test 10.10.112.169 +add test 10.10.112.17 +add test 10.10.112.170 +add test 10.10.112.171 +add test 10.10.112.172 +add test 10.10.112.173 +add test 10.10.112.174 +add test 10.10.112.175 +add test 10.10.112.176 +add test 10.10.112.177 +add test 10.10.112.178 +add test 10.10.112.179 +add test 10.10.112.18 +add test 10.10.112.180 +add test 10.10.112.181 +add test 10.10.112.182 +add test 10.10.112.183 +add test 10.10.112.184 +add test 10.10.112.185 +add test 10.10.112.186 +add test 10.10.112.187 +add test 10.10.112.188 +add test 10.10.112.189 +add test 10.10.112.19 +add test 10.10.112.190 +add test 10.10.112.191 +add test 10.10.112.192 +add test 10.10.112.193 +add test 10.10.112.194 +add test 10.10.112.195 +add test 10.10.112.196 +add test 10.10.112.197 +add test 10.10.112.198 +add test 10.10.112.199 +add test 10.10.112.2 +add test 10.10.112.20 +add test 10.10.112.200 +add test 10.10.112.201 +add test 10.10.112.202 +add test 10.10.112.203 +add test 10.10.112.204 +add test 10.10.112.205 +add test 10.10.112.206 +add test 10.10.112.207 +add test 10.10.112.208 +add test 10.10.112.209 +add test 10.10.112.21 +add test 10.10.112.210 +add test 10.10.112.211 +add test 10.10.112.212 +add test 10.10.112.213 +add test 10.10.112.214 +add test 10.10.112.215 +add test 10.10.112.216 +add test 10.10.112.217 +add test 10.10.112.218 +add test 10.10.112.219 +add test 10.10.112.22 +add test 10.10.112.220 +add test 10.10.112.221 +add test 10.10.112.222 +add test 10.10.112.223 +add test 10.10.112.224 +add test 10.10.112.225 +add test 10.10.112.226 +add test 10.10.112.227 +add test 10.10.112.228 +add test 10.10.112.229 +add test 10.10.112.23 +add test 10.10.112.230 +add test 10.10.112.231 +add test 10.10.112.232 +add test 10.10.112.233 +add test 10.10.112.234 +add test 10.10.112.235 +add test 10.10.112.236 +add test 10.10.112.237 +add test 10.10.112.238 +add test 10.10.112.239 +add test 10.10.112.24 +add test 10.10.112.240 +add test 10.10.112.241 +add test 10.10.112.242 +add test 10.10.112.243 +add test 10.10.112.244 +add test 10.10.112.245 +add test 10.10.112.246 +add test 10.10.112.247 +add test 10.10.112.248 +add test 10.10.112.249 +add test 10.10.112.25 +add test 10.10.112.250 +add test 10.10.112.251 +add test 10.10.112.252 +add test 10.10.112.253 +add test 10.10.112.254 +add test 10.10.112.255 +add test 10.10.112.26 +add test 10.10.112.27 +add test 10.10.112.28 +add test 10.10.112.29 +add test 10.10.112.3 +add test 10.10.112.30 +add test 10.10.112.31 +add test 10.10.112.32 +add test 10.10.112.33 +add test 10.10.112.34 +add test 10.10.112.35 +add test 10.10.112.36 +add test 10.10.112.37 +add test 10.10.112.38 +add test 10.10.112.39 +add test 10.10.112.4 +add test 10.10.112.40 +add test 10.10.112.41 +add test 10.10.112.42 +add test 10.10.112.43 +add test 10.10.112.44 +add test 10.10.112.45 +add test 10.10.112.46 +add test 10.10.112.47 +add test 10.10.112.48 +add test 10.10.112.49 +add test 10.10.112.5 +add test 10.10.112.50 +add test 10.10.112.51 +add test 10.10.112.52 +add test 10.10.112.53 +add test 10.10.112.54 +add test 10.10.112.55 +add test 10.10.112.56 +add test 10.10.112.57 +add test 10.10.112.58 +add test 10.10.112.59 +add test 10.10.112.6 +add test 10.10.112.60 +add test 10.10.112.61 +add test 10.10.112.62 +add test 10.10.112.63 +add test 10.10.112.64 +add test 10.10.112.65 +add test 10.10.112.66 +add test 10.10.112.67 +add test 10.10.112.68 +add test 10.10.112.69 +add test 10.10.112.7 +add test 10.10.112.70 +add test 10.10.112.71 +add test 10.10.112.72 +add test 10.10.112.73 +add test 10.10.112.74 +add test 10.10.112.75 +add test 10.10.112.76 +add test 10.10.112.77 +add test 10.10.112.78 +add test 10.10.112.79 +add test 10.10.112.8 +add test 10.10.112.80 +add test 10.10.112.81 +add test 10.10.112.82 +add test 10.10.112.83 +add test 10.10.112.84 +add test 10.10.112.85 +add test 10.10.112.86 +add test 10.10.112.87 +add test 10.10.112.88 +add test 10.10.112.89 +add test 10.10.112.9 +add test 10.10.112.90 +add test 10.10.112.91 +add test 10.10.112.92 +add test 10.10.112.93 +add test 10.10.112.94 +add test 10.10.112.95 +add test 10.10.112.96 +add test 10.10.112.97 +add test 10.10.112.98 +add test 10.10.112.99 +add test 10.10.113.0 +add test 10.10.113.1 +add test 10.10.113.10 +add test 10.10.113.100 +add test 10.10.113.101 +add test 10.10.113.102 +add test 10.10.113.103 +add test 10.10.113.104 +add test 10.10.113.105 +add test 10.10.113.106 +add test 10.10.113.107 +add test 10.10.113.108 +add test 10.10.113.109 +add test 10.10.113.11 +add test 10.10.113.110 +add test 10.10.113.111 +add test 10.10.113.112 +add test 10.10.113.113 +add test 10.10.113.114 +add test 10.10.113.115 +add test 10.10.113.116 +add test 10.10.113.117 +add test 10.10.113.118 +add test 10.10.113.119 +add test 10.10.113.12 +add test 10.10.113.120 +add test 10.10.113.121 +add test 10.10.113.122 +add test 10.10.113.123 +add test 10.10.113.124 +add test 10.10.113.125 +add test 10.10.113.126 +add test 10.10.113.127 +add test 10.10.113.128 +add test 10.10.113.129 +add test 10.10.113.13 +add test 10.10.113.130 +add test 10.10.113.131 +add test 10.10.113.132 +add test 10.10.113.133 +add test 10.10.113.134 +add test 10.10.113.135 +add test 10.10.113.136 +add test 10.10.113.137 +add test 10.10.113.138 +add test 10.10.113.139 +add test 10.10.113.14 +add test 10.10.113.140 +add test 10.10.113.141 +add test 10.10.113.142 +add test 10.10.113.143 +add test 10.10.113.144 +add test 10.10.113.145 +add test 10.10.113.146 +add test 10.10.113.147 +add test 10.10.113.148 +add test 10.10.113.149 +add test 10.10.113.15 +add test 10.10.113.150 +add test 10.10.113.151 +add test 10.10.113.152 +add test 10.10.113.153 +add test 10.10.113.154 +add test 10.10.113.155 +add test 10.10.113.156 +add test 10.10.113.157 +add test 10.10.113.158 +add test 10.10.113.159 +add test 10.10.113.16 +add test 10.10.113.160 +add test 10.10.113.161 +add test 10.10.113.162 +add test 10.10.113.163 +add test 10.10.113.164 +add test 10.10.113.165 +add test 10.10.113.166 +add test 10.10.113.167 +add test 10.10.113.168 +add test 10.10.113.169 +add test 10.10.113.17 +add test 10.10.113.170 +add test 10.10.113.171 +add test 10.10.113.172 +add test 10.10.113.173 +add test 10.10.113.174 +add test 10.10.113.175 +add test 10.10.113.176 +add test 10.10.113.177 +add test 10.10.113.178 +add test 10.10.113.179 +add test 10.10.113.18 +add test 10.10.113.180 +add test 10.10.113.181 +add test 10.10.113.182 +add test 10.10.113.183 +add test 10.10.113.184 +add test 10.10.113.185 +add test 10.10.113.186 +add test 10.10.113.187 +add test 10.10.113.188 +add test 10.10.113.189 +add test 10.10.113.19 +add test 10.10.113.190 +add test 10.10.113.191 +add test 10.10.113.192 +add test 10.10.113.193 +add test 10.10.113.194 +add test 10.10.113.195 +add test 10.10.113.196 +add test 10.10.113.197 +add test 10.10.113.198 +add test 10.10.113.199 +add test 10.10.113.2 +add test 10.10.113.20 +add test 10.10.113.200 +add test 10.10.113.201 +add test 10.10.113.202 +add test 10.10.113.203 +add test 10.10.113.204 +add test 10.10.113.205 +add test 10.10.113.206 +add test 10.10.113.207 +add test 10.10.113.208 +add test 10.10.113.209 +add test 10.10.113.21 +add test 10.10.113.210 +add test 10.10.113.211 +add test 10.10.113.212 +add test 10.10.113.213 +add test 10.10.113.214 +add test 10.10.113.215 +add test 10.10.113.216 +add test 10.10.113.217 +add test 10.10.113.218 +add test 10.10.113.219 +add test 10.10.113.22 +add test 10.10.113.220 +add test 10.10.113.221 +add test 10.10.113.222 +add test 10.10.113.223 +add test 10.10.113.224 +add test 10.10.113.225 +add test 10.10.113.226 +add test 10.10.113.227 +add test 10.10.113.228 +add test 10.10.113.229 +add test 10.10.113.23 +add test 10.10.113.230 +add test 10.10.113.231 +add test 10.10.113.232 +add test 10.10.113.233 +add test 10.10.113.234 +add test 10.10.113.235 +add test 10.10.113.236 +add test 10.10.113.237 +add test 10.10.113.238 +add test 10.10.113.239 +add test 10.10.113.24 +add test 10.10.113.240 +add test 10.10.113.241 +add test 10.10.113.242 +add test 10.10.113.243 +add test 10.10.113.244 +add test 10.10.113.245 +add test 10.10.113.246 +add test 10.10.113.247 +add test 10.10.113.248 +add test 10.10.113.249 +add test 10.10.113.25 +add test 10.10.113.250 +add test 10.10.113.251 +add test 10.10.113.252 +add test 10.10.113.253 +add test 10.10.113.254 +add test 10.10.113.255 +add test 10.10.113.26 +add test 10.10.113.27 +add test 10.10.113.28 +add test 10.10.113.29 +add test 10.10.113.3 +add test 10.10.113.30 +add test 10.10.113.31 +add test 10.10.113.32 +add test 10.10.113.33 +add test 10.10.113.34 +add test 10.10.113.35 +add test 10.10.113.36 +add test 10.10.113.37 +add test 10.10.113.38 +add test 10.10.113.39 +add test 10.10.113.4 +add test 10.10.113.40 +add test 10.10.113.41 +add test 10.10.113.42 +add test 10.10.113.43 +add test 10.10.113.44 +add test 10.10.113.45 +add test 10.10.113.46 +add test 10.10.113.47 +add test 10.10.113.48 +add test 10.10.113.49 +add test 10.10.113.5 +add test 10.10.113.50 +add test 10.10.113.51 +add test 10.10.113.52 +add test 10.10.113.53 +add test 10.10.113.54 +add test 10.10.113.55 +add test 10.10.113.56 +add test 10.10.113.57 +add test 10.10.113.58 +add test 10.10.113.59 +add test 10.10.113.6 +add test 10.10.113.60 +add test 10.10.113.61 +add test 10.10.113.62 +add test 10.10.113.63 +add test 10.10.113.64 +add test 10.10.113.65 +add test 10.10.113.66 +add test 10.10.113.67 +add test 10.10.113.68 +add test 10.10.113.69 +add test 10.10.113.7 +add test 10.10.113.70 +add test 10.10.113.71 +add test 10.10.113.72 +add test 10.10.113.73 +add test 10.10.113.74 +add test 10.10.113.75 +add test 10.10.113.76 +add test 10.10.113.77 +add test 10.10.113.78 +add test 10.10.113.79 +add test 10.10.113.8 +add test 10.10.113.80 +add test 10.10.113.81 +add test 10.10.113.82 +add test 10.10.113.83 +add test 10.10.113.84 +add test 10.10.113.85 +add test 10.10.113.86 +add test 10.10.113.87 +add test 10.10.113.88 +add test 10.10.113.89 +add test 10.10.113.9 +add test 10.10.113.90 +add test 10.10.113.91 +add test 10.10.113.92 +add test 10.10.113.93 +add test 10.10.113.94 +add test 10.10.113.95 +add test 10.10.113.96 +add test 10.10.113.97 +add test 10.10.113.98 +add test 10.10.113.99 +add test 10.10.114.0 +add test 10.10.114.1 +add test 10.10.114.10 +add test 10.10.114.100 +add test 10.10.114.101 +add test 10.10.114.102 +add test 10.10.114.103 +add test 10.10.114.104 +add test 10.10.114.105 +add test 10.10.114.106 +add test 10.10.114.107 +add test 10.10.114.108 +add test 10.10.114.109 +add test 10.10.114.11 +add test 10.10.114.110 +add test 10.10.114.111 +add test 10.10.114.112 +add test 10.10.114.113 +add test 10.10.114.114 +add test 10.10.114.115 +add test 10.10.114.116 +add test 10.10.114.117 +add test 10.10.114.118 +add test 10.10.114.119 +add test 10.10.114.12 +add test 10.10.114.120 +add test 10.10.114.121 +add test 10.10.114.122 +add test 10.10.114.123 +add test 10.10.114.124 +add test 10.10.114.125 +add test 10.10.114.126 +add test 10.10.114.127 +add test 10.10.114.128 +add test 10.10.114.129 +add test 10.10.114.13 +add test 10.10.114.130 +add test 10.10.114.131 +add test 10.10.114.132 +add test 10.10.114.133 +add test 10.10.114.134 +add test 10.10.114.135 +add test 10.10.114.136 +add test 10.10.114.137 +add test 10.10.114.138 +add test 10.10.114.139 +add test 10.10.114.14 +add test 10.10.114.140 +add test 10.10.114.141 +add test 10.10.114.142 +add test 10.10.114.143 +add test 10.10.114.144 +add test 10.10.114.145 +add test 10.10.114.146 +add test 10.10.114.147 +add test 10.10.114.148 +add test 10.10.114.149 +add test 10.10.114.15 +add test 10.10.114.150 +add test 10.10.114.151 +add test 10.10.114.152 +add test 10.10.114.153 +add test 10.10.114.154 +add test 10.10.114.155 +add test 10.10.114.156 +add test 10.10.114.157 +add test 10.10.114.158 +add test 10.10.114.159 +add test 10.10.114.16 +add test 10.10.114.160 +add test 10.10.114.161 +add test 10.10.114.162 +add test 10.10.114.163 +add test 10.10.114.164 +add test 10.10.114.165 +add test 10.10.114.166 +add test 10.10.114.167 +add test 10.10.114.168 +add test 10.10.114.169 +add test 10.10.114.17 +add test 10.10.114.170 +add test 10.10.114.171 +add test 10.10.114.172 +add test 10.10.114.173 +add test 10.10.114.174 +add test 10.10.114.175 +add test 10.10.114.176 +add test 10.10.114.177 +add test 10.10.114.178 +add test 10.10.114.179 +add test 10.10.114.18 +add test 10.10.114.180 +add test 10.10.114.181 +add test 10.10.114.182 +add test 10.10.114.183 +add test 10.10.114.184 +add test 10.10.114.185 +add test 10.10.114.186 +add test 10.10.114.187 +add test 10.10.114.188 +add test 10.10.114.189 +add test 10.10.114.19 +add test 10.10.114.190 +add test 10.10.114.191 +add test 10.10.114.192 +add test 10.10.114.193 +add test 10.10.114.194 +add test 10.10.114.195 +add test 10.10.114.196 +add test 10.10.114.197 +add test 10.10.114.198 +add test 10.10.114.199 +add test 10.10.114.2 +add test 10.10.114.20 +add test 10.10.114.200 +add test 10.10.114.201 +add test 10.10.114.202 +add test 10.10.114.203 +add test 10.10.114.204 +add test 10.10.114.205 +add test 10.10.114.206 +add test 10.10.114.207 +add test 10.10.114.208 +add test 10.10.114.209 +add test 10.10.114.21 +add test 10.10.114.210 +add test 10.10.114.211 +add test 10.10.114.212 +add test 10.10.114.213 +add test 10.10.114.214 +add test 10.10.114.215 +add test 10.10.114.216 +add test 10.10.114.217 +add test 10.10.114.218 +add test 10.10.114.219 +add test 10.10.114.22 +add test 10.10.114.220 +add test 10.10.114.221 +add test 10.10.114.222 +add test 10.10.114.223 +add test 10.10.114.224 +add test 10.10.114.225 +add test 10.10.114.226 +add test 10.10.114.227 +add test 10.10.114.228 +add test 10.10.114.229 +add test 10.10.114.23 +add test 10.10.114.230 +add test 10.10.114.231 +add test 10.10.114.232 +add test 10.10.114.233 +add test 10.10.114.234 +add test 10.10.114.235 +add test 10.10.114.236 +add test 10.10.114.237 +add test 10.10.114.238 +add test 10.10.114.239 +add test 10.10.114.24 +add test 10.10.114.240 +add test 10.10.114.241 +add test 10.10.114.242 +add test 10.10.114.243 +add test 10.10.114.244 +add test 10.10.114.245 +add test 10.10.114.246 +add test 10.10.114.247 +add test 10.10.114.248 +add test 10.10.114.249 +add test 10.10.114.25 +add test 10.10.114.250 +add test 10.10.114.251 +add test 10.10.114.252 +add test 10.10.114.253 +add test 10.10.114.254 +add test 10.10.114.255 +add test 10.10.114.26 +add test 10.10.114.27 +add test 10.10.114.28 +add test 10.10.114.29 +add test 10.10.114.3 +add test 10.10.114.30 +add test 10.10.114.31 +add test 10.10.114.32 +add test 10.10.114.33 +add test 10.10.114.34 +add test 10.10.114.35 +add test 10.10.114.36 +add test 10.10.114.37 +add test 10.10.114.38 +add test 10.10.114.39 +add test 10.10.114.4 +add test 10.10.114.40 +add test 10.10.114.41 +add test 10.10.114.42 +add test 10.10.114.43 +add test 10.10.114.44 +add test 10.10.114.45 +add test 10.10.114.46 +add test 10.10.114.47 +add test 10.10.114.48 +add test 10.10.114.49 +add test 10.10.114.5 +add test 10.10.114.50 +add test 10.10.114.51 +add test 10.10.114.52 +add test 10.10.114.53 +add test 10.10.114.54 +add test 10.10.114.55 +add test 10.10.114.56 +add test 10.10.114.57 +add test 10.10.114.58 +add test 10.10.114.59 +add test 10.10.114.6 +add test 10.10.114.60 +add test 10.10.114.61 +add test 10.10.114.62 +add test 10.10.114.63 +add test 10.10.114.64 +add test 10.10.114.65 +add test 10.10.114.66 +add test 10.10.114.67 +add test 10.10.114.68 +add test 10.10.114.69 +add test 10.10.114.7 +add test 10.10.114.70 +add test 10.10.114.71 +add test 10.10.114.72 +add test 10.10.114.73 +add test 10.10.114.74 +add test 10.10.114.75 +add test 10.10.114.76 +add test 10.10.114.77 +add test 10.10.114.78 +add test 10.10.114.79 +add test 10.10.114.8 +add test 10.10.114.80 +add test 10.10.114.81 +add test 10.10.114.82 +add test 10.10.114.83 +add test 10.10.114.84 +add test 10.10.114.85 +add test 10.10.114.86 +add test 10.10.114.87 +add test 10.10.114.88 +add test 10.10.114.89 +add test 10.10.114.9 +add test 10.10.114.90 +add test 10.10.114.91 +add test 10.10.114.92 +add test 10.10.114.93 +add test 10.10.114.94 +add test 10.10.114.95 +add test 10.10.114.96 +add test 10.10.114.97 +add test 10.10.114.98 +add test 10.10.114.99 +add test 10.10.115.0 +add test 10.10.115.1 +add test 10.10.115.10 +add test 10.10.115.100 +add test 10.10.115.101 +add test 10.10.115.102 +add test 10.10.115.103 +add test 10.10.115.104 +add test 10.10.115.105 +add test 10.10.115.106 +add test 10.10.115.107 +add test 10.10.115.108 +add test 10.10.115.109 +add test 10.10.115.11 +add test 10.10.115.110 +add test 10.10.115.111 +add test 10.10.115.112 +add test 10.10.115.113 +add test 10.10.115.114 +add test 10.10.115.115 +add test 10.10.115.116 +add test 10.10.115.117 +add test 10.10.115.118 +add test 10.10.115.119 +add test 10.10.115.12 +add test 10.10.115.120 +add test 10.10.115.121 +add test 10.10.115.122 +add test 10.10.115.123 +add test 10.10.115.124 +add test 10.10.115.125 +add test 10.10.115.126 +add test 10.10.115.127 +add test 10.10.115.128 +add test 10.10.115.129 +add test 10.10.115.13 +add test 10.10.115.130 +add test 10.10.115.131 +add test 10.10.115.132 +add test 10.10.115.133 +add test 10.10.115.134 +add test 10.10.115.135 +add test 10.10.115.136 +add test 10.10.115.137 +add test 10.10.115.138 +add test 10.10.115.139 +add test 10.10.115.14 +add test 10.10.115.140 +add test 10.10.115.141 +add test 10.10.115.142 +add test 10.10.115.143 +add test 10.10.115.144 +add test 10.10.115.145 +add test 10.10.115.146 +add test 10.10.115.147 +add test 10.10.115.148 +add test 10.10.115.149 +add test 10.10.115.15 +add test 10.10.115.150 +add test 10.10.115.151 +add test 10.10.115.152 +add test 10.10.115.153 +add test 10.10.115.154 +add test 10.10.115.155 +add test 10.10.115.156 +add test 10.10.115.157 +add test 10.10.115.158 +add test 10.10.115.159 +add test 10.10.115.16 +add test 10.10.115.160 +add test 10.10.115.161 +add test 10.10.115.162 +add test 10.10.115.163 +add test 10.10.115.164 +add test 10.10.115.165 +add test 10.10.115.166 +add test 10.10.115.167 +add test 10.10.115.168 +add test 10.10.115.169 +add test 10.10.115.17 +add test 10.10.115.170 +add test 10.10.115.171 +add test 10.10.115.172 +add test 10.10.115.173 +add test 10.10.115.174 +add test 10.10.115.175 +add test 10.10.115.176 +add test 10.10.115.177 +add test 10.10.115.178 +add test 10.10.115.179 +add test 10.10.115.18 +add test 10.10.115.180 +add test 10.10.115.181 +add test 10.10.115.182 +add test 10.10.115.183 +add test 10.10.115.184 +add test 10.10.115.185 +add test 10.10.115.186 +add test 10.10.115.187 +add test 10.10.115.188 +add test 10.10.115.189 +add test 10.10.115.19 +add test 10.10.115.190 +add test 10.10.115.191 +add test 10.10.115.192 +add test 10.10.115.193 +add test 10.10.115.194 +add test 10.10.115.195 +add test 10.10.115.196 +add test 10.10.115.197 +add test 10.10.115.198 +add test 10.10.115.199 +add test 10.10.115.2 +add test 10.10.115.20 +add test 10.10.115.200 +add test 10.10.115.201 +add test 10.10.115.202 +add test 10.10.115.203 +add test 10.10.115.204 +add test 10.10.115.205 +add test 10.10.115.206 +add test 10.10.115.207 +add test 10.10.115.208 +add test 10.10.115.209 +add test 10.10.115.21 +add test 10.10.115.210 +add test 10.10.115.211 +add test 10.10.115.212 +add test 10.10.115.213 +add test 10.10.115.214 +add test 10.10.115.215 +add test 10.10.115.216 +add test 10.10.115.217 +add test 10.10.115.218 +add test 10.10.115.219 +add test 10.10.115.22 +add test 10.10.115.220 +add test 10.10.115.221 +add test 10.10.115.222 +add test 10.10.115.223 +add test 10.10.115.224 +add test 10.10.115.225 +add test 10.10.115.226 +add test 10.10.115.227 +add test 10.10.115.228 +add test 10.10.115.229 +add test 10.10.115.23 +add test 10.10.115.230 +add test 10.10.115.231 +add test 10.10.115.232 +add test 10.10.115.233 +add test 10.10.115.234 +add test 10.10.115.235 +add test 10.10.115.236 +add test 10.10.115.237 +add test 10.10.115.238 +add test 10.10.115.239 +add test 10.10.115.24 +add test 10.10.115.240 +add test 10.10.115.241 +add test 10.10.115.242 +add test 10.10.115.243 +add test 10.10.115.244 +add test 10.10.115.245 +add test 10.10.115.246 +add test 10.10.115.247 +add test 10.10.115.248 +add test 10.10.115.249 +add test 10.10.115.25 +add test 10.10.115.250 +add test 10.10.115.251 +add test 10.10.115.252 +add test 10.10.115.253 +add test 10.10.115.254 +add test 10.10.115.255 +add test 10.10.115.26 +add test 10.10.115.27 +add test 10.10.115.28 +add test 10.10.115.29 +add test 10.10.115.3 +add test 10.10.115.30 +add test 10.10.115.31 +add test 10.10.115.32 +add test 10.10.115.33 +add test 10.10.115.34 +add test 10.10.115.35 +add test 10.10.115.36 +add test 10.10.115.37 +add test 10.10.115.38 +add test 10.10.115.39 +add test 10.10.115.4 +add test 10.10.115.40 +add test 10.10.115.41 +add test 10.10.115.42 +add test 10.10.115.43 +add test 10.10.115.44 +add test 10.10.115.45 +add test 10.10.115.46 +add test 10.10.115.47 +add test 10.10.115.48 +add test 10.10.115.49 +add test 10.10.115.5 +add test 10.10.115.50 +add test 10.10.115.51 +add test 10.10.115.52 +add test 10.10.115.53 +add test 10.10.115.54 +add test 10.10.115.55 +add test 10.10.115.56 +add test 10.10.115.57 +add test 10.10.115.58 +add test 10.10.115.59 +add test 10.10.115.6 +add test 10.10.115.60 +add test 10.10.115.61 +add test 10.10.115.62 +add test 10.10.115.63 +add test 10.10.115.64 +add test 10.10.115.65 +add test 10.10.115.66 +add test 10.10.115.67 +add test 10.10.115.68 +add test 10.10.115.69 +add test 10.10.115.7 +add test 10.10.115.70 +add test 10.10.115.71 +add test 10.10.115.72 +add test 10.10.115.73 +add test 10.10.115.74 +add test 10.10.115.75 +add test 10.10.115.76 +add test 10.10.115.77 +add test 10.10.115.78 +add test 10.10.115.79 +add test 10.10.115.8 +add test 10.10.115.80 +add test 10.10.115.81 +add test 10.10.115.82 +add test 10.10.115.83 +add test 10.10.115.84 +add test 10.10.115.85 +add test 10.10.115.86 +add test 10.10.115.87 +add test 10.10.115.88 +add test 10.10.115.89 +add test 10.10.115.9 +add test 10.10.115.90 +add test 10.10.115.91 +add test 10.10.115.92 +add test 10.10.115.93 +add test 10.10.115.94 +add test 10.10.115.95 +add test 10.10.115.96 +add test 10.10.115.97 +add test 10.10.115.98 +add test 10.10.115.99 +add test 10.10.116.0 +add test 10.10.116.1 +add test 10.10.116.10 +add test 10.10.116.100 +add test 10.10.116.101 +add test 10.10.116.102 +add test 10.10.116.103 +add test 10.10.116.104 +add test 10.10.116.105 +add test 10.10.116.106 +add test 10.10.116.107 +add test 10.10.116.108 +add test 10.10.116.109 +add test 10.10.116.11 +add test 10.10.116.110 +add test 10.10.116.111 +add test 10.10.116.112 +add test 10.10.116.113 +add test 10.10.116.114 +add test 10.10.116.115 +add test 10.10.116.116 +add test 10.10.116.117 +add test 10.10.116.118 +add test 10.10.116.119 +add test 10.10.116.12 +add test 10.10.116.120 +add test 10.10.116.121 +add test 10.10.116.122 +add test 10.10.116.123 +add test 10.10.116.124 +add test 10.10.116.125 +add test 10.10.116.126 +add test 10.10.116.127 +add test 10.10.116.128 +add test 10.10.116.129 +add test 10.10.116.13 +add test 10.10.116.130 +add test 10.10.116.131 +add test 10.10.116.132 +add test 10.10.116.133 +add test 10.10.116.134 +add test 10.10.116.135 +add test 10.10.116.136 +add test 10.10.116.137 +add test 10.10.116.138 +add test 10.10.116.139 +add test 10.10.116.14 +add test 10.10.116.140 +add test 10.10.116.141 +add test 10.10.116.142 +add test 10.10.116.143 +add test 10.10.116.144 +add test 10.10.116.145 +add test 10.10.116.146 +add test 10.10.116.147 +add test 10.10.116.148 +add test 10.10.116.149 +add test 10.10.116.15 +add test 10.10.116.150 +add test 10.10.116.151 +add test 10.10.116.152 +add test 10.10.116.153 +add test 10.10.116.154 +add test 10.10.116.155 +add test 10.10.116.156 +add test 10.10.116.157 +add test 10.10.116.158 +add test 10.10.116.159 +add test 10.10.116.16 +add test 10.10.116.160 +add test 10.10.116.161 +add test 10.10.116.162 +add test 10.10.116.163 +add test 10.10.116.164 +add test 10.10.116.165 +add test 10.10.116.166 +add test 10.10.116.167 +add test 10.10.116.168 +add test 10.10.116.169 +add test 10.10.116.17 +add test 10.10.116.170 +add test 10.10.116.171 +add test 10.10.116.172 +add test 10.10.116.173 +add test 10.10.116.174 +add test 10.10.116.175 +add test 10.10.116.176 +add test 10.10.116.177 +add test 10.10.116.178 +add test 10.10.116.179 +add test 10.10.116.18 +add test 10.10.116.180 +add test 10.10.116.181 +add test 10.10.116.182 +add test 10.10.116.183 +add test 10.10.116.184 +add test 10.10.116.185 +add test 10.10.116.186 +add test 10.10.116.187 +add test 10.10.116.188 +add test 10.10.116.189 +add test 10.10.116.19 +add test 10.10.116.190 +add test 10.10.116.191 +add test 10.10.116.192 +add test 10.10.116.193 +add test 10.10.116.194 +add test 10.10.116.195 +add test 10.10.116.196 +add test 10.10.116.197 +add test 10.10.116.198 +add test 10.10.116.199 +add test 10.10.116.2 +add test 10.10.116.20 +add test 10.10.116.200 +add test 10.10.116.201 +add test 10.10.116.202 +add test 10.10.116.203 +add test 10.10.116.204 +add test 10.10.116.205 +add test 10.10.116.206 +add test 10.10.116.207 +add test 10.10.116.208 +add test 10.10.116.209 +add test 10.10.116.21 +add test 10.10.116.210 +add test 10.10.116.211 +add test 10.10.116.212 +add test 10.10.116.213 +add test 10.10.116.214 +add test 10.10.116.215 +add test 10.10.116.216 +add test 10.10.116.217 +add test 10.10.116.218 +add test 10.10.116.219 +add test 10.10.116.22 +add test 10.10.116.220 +add test 10.10.116.221 +add test 10.10.116.222 +add test 10.10.116.223 +add test 10.10.116.224 +add test 10.10.116.225 +add test 10.10.116.226 +add test 10.10.116.227 +add test 10.10.116.228 +add test 10.10.116.229 +add test 10.10.116.23 +add test 10.10.116.230 +add test 10.10.116.231 +add test 10.10.116.232 +add test 10.10.116.233 +add test 10.10.116.234 +add test 10.10.116.235 +add test 10.10.116.236 +add test 10.10.116.237 +add test 10.10.116.238 +add test 10.10.116.239 +add test 10.10.116.24 +add test 10.10.116.240 +add test 10.10.116.241 +add test 10.10.116.242 +add test 10.10.116.243 +add test 10.10.116.244 +add test 10.10.116.245 +add test 10.10.116.246 +add test 10.10.116.247 +add test 10.10.116.248 +add test 10.10.116.249 +add test 10.10.116.25 +add test 10.10.116.250 +add test 10.10.116.251 +add test 10.10.116.252 +add test 10.10.116.253 +add test 10.10.116.254 +add test 10.10.116.255 +add test 10.10.116.26 +add test 10.10.116.27 +add test 10.10.116.28 +add test 10.10.116.29 +add test 10.10.116.3 +add test 10.10.116.30 +add test 10.10.116.31 +add test 10.10.116.32 +add test 10.10.116.33 +add test 10.10.116.34 +add test 10.10.116.35 +add test 10.10.116.36 +add test 10.10.116.37 +add test 10.10.116.38 +add test 10.10.116.39 +add test 10.10.116.4 +add test 10.10.116.40 +add test 10.10.116.41 +add test 10.10.116.42 +add test 10.10.116.43 +add test 10.10.116.44 +add test 10.10.116.45 +add test 10.10.116.46 +add test 10.10.116.47 +add test 10.10.116.48 +add test 10.10.116.49 +add test 10.10.116.5 +add test 10.10.116.50 +add test 10.10.116.51 +add test 10.10.116.52 +add test 10.10.116.53 +add test 10.10.116.54 +add test 10.10.116.55 +add test 10.10.116.56 +add test 10.10.116.57 +add test 10.10.116.58 +add test 10.10.116.59 +add test 10.10.116.6 +add test 10.10.116.60 +add test 10.10.116.61 +add test 10.10.116.62 +add test 10.10.116.63 +add test 10.10.116.64 +add test 10.10.116.65 +add test 10.10.116.66 +add test 10.10.116.67 +add test 10.10.116.68 +add test 10.10.116.69 +add test 10.10.116.7 +add test 10.10.116.70 +add test 10.10.116.71 +add test 10.10.116.72 +add test 10.10.116.73 +add test 10.10.116.74 +add test 10.10.116.75 +add test 10.10.116.76 +add test 10.10.116.77 +add test 10.10.116.78 +add test 10.10.116.79 +add test 10.10.116.8 +add test 10.10.116.80 +add test 10.10.116.81 +add test 10.10.116.82 +add test 10.10.116.83 +add test 10.10.116.84 +add test 10.10.116.85 +add test 10.10.116.86 +add test 10.10.116.87 +add test 10.10.116.88 +add test 10.10.116.89 +add test 10.10.116.9 +add test 10.10.116.90 +add test 10.10.116.91 +add test 10.10.116.92 +add test 10.10.116.93 +add test 10.10.116.94 +add test 10.10.116.95 +add test 10.10.116.96 +add test 10.10.116.97 +add test 10.10.116.98 +add test 10.10.116.99 +add test 10.10.117.0 +add test 10.10.117.1 +add test 10.10.117.10 +add test 10.10.117.100 +add test 10.10.117.101 +add test 10.10.117.102 +add test 10.10.117.103 +add test 10.10.117.104 +add test 10.10.117.105 +add test 10.10.117.106 +add test 10.10.117.107 +add test 10.10.117.108 +add test 10.10.117.109 +add test 10.10.117.11 +add test 10.10.117.110 +add test 10.10.117.111 +add test 10.10.117.112 +add test 10.10.117.113 +add test 10.10.117.114 +add test 10.10.117.115 +add test 10.10.117.116 +add test 10.10.117.117 +add test 10.10.117.118 +add test 10.10.117.119 +add test 10.10.117.12 +add test 10.10.117.120 +add test 10.10.117.121 +add test 10.10.117.122 +add test 10.10.117.123 +add test 10.10.117.124 +add test 10.10.117.125 +add test 10.10.117.126 +add test 10.10.117.127 +add test 10.10.117.128 +add test 10.10.117.129 +add test 10.10.117.13 +add test 10.10.117.130 +add test 10.10.117.131 +add test 10.10.117.132 +add test 10.10.117.133 +add test 10.10.117.134 +add test 10.10.117.135 +add test 10.10.117.136 +add test 10.10.117.137 +add test 10.10.117.138 +add test 10.10.117.139 +add test 10.10.117.14 +add test 10.10.117.140 +add test 10.10.117.141 +add test 10.10.117.142 +add test 10.10.117.143 +add test 10.10.117.144 +add test 10.10.117.145 +add test 10.10.117.146 +add test 10.10.117.147 +add test 10.10.117.148 +add test 10.10.117.149 +add test 10.10.117.15 +add test 10.10.117.150 +add test 10.10.117.151 +add test 10.10.117.152 +add test 10.10.117.153 +add test 10.10.117.154 +add test 10.10.117.155 +add test 10.10.117.156 +add test 10.10.117.157 +add test 10.10.117.158 +add test 10.10.117.159 +add test 10.10.117.16 +add test 10.10.117.160 +add test 10.10.117.161 +add test 10.10.117.162 +add test 10.10.117.163 +add test 10.10.117.164 +add test 10.10.117.165 +add test 10.10.117.166 +add test 10.10.117.167 +add test 10.10.117.168 +add test 10.10.117.169 +add test 10.10.117.17 +add test 10.10.117.170 +add test 10.10.117.171 +add test 10.10.117.172 +add test 10.10.117.173 +add test 10.10.117.174 +add test 10.10.117.175 +add test 10.10.117.176 +add test 10.10.117.177 +add test 10.10.117.178 +add test 10.10.117.179 +add test 10.10.117.18 +add test 10.10.117.180 +add test 10.10.117.181 +add test 10.10.117.182 +add test 10.10.117.183 +add test 10.10.117.184 +add test 10.10.117.185 +add test 10.10.117.186 +add test 10.10.117.187 +add test 10.10.117.188 +add test 10.10.117.189 +add test 10.10.117.19 +add test 10.10.117.190 +add test 10.10.117.191 +add test 10.10.117.192 +add test 10.10.117.193 +add test 10.10.117.194 +add test 10.10.117.195 +add test 10.10.117.196 +add test 10.10.117.197 +add test 10.10.117.198 +add test 10.10.117.199 +add test 10.10.117.2 +add test 10.10.117.20 +add test 10.10.117.200 +add test 10.10.117.201 +add test 10.10.117.202 +add test 10.10.117.203 +add test 10.10.117.204 +add test 10.10.117.205 +add test 10.10.117.206 +add test 10.10.117.207 +add test 10.10.117.208 +add test 10.10.117.209 +add test 10.10.117.21 +add test 10.10.117.210 +add test 10.10.117.211 +add test 10.10.117.212 +add test 10.10.117.213 +add test 10.10.117.214 +add test 10.10.117.215 +add test 10.10.117.216 +add test 10.10.117.217 +add test 10.10.117.218 +add test 10.10.117.219 +add test 10.10.117.22 +add test 10.10.117.220 +add test 10.10.117.221 +add test 10.10.117.222 +add test 10.10.117.223 +add test 10.10.117.224 +add test 10.10.117.225 +add test 10.10.117.226 +add test 10.10.117.227 +add test 10.10.117.228 +add test 10.10.117.229 +add test 10.10.117.23 +add test 10.10.117.230 +add test 10.10.117.231 +add test 10.10.117.232 +add test 10.10.117.233 +add test 10.10.117.234 +add test 10.10.117.235 +add test 10.10.117.236 +add test 10.10.117.237 +add test 10.10.117.238 +add test 10.10.117.239 +add test 10.10.117.24 +add test 10.10.117.240 +add test 10.10.117.241 +add test 10.10.117.242 +add test 10.10.117.243 +add test 10.10.117.244 +add test 10.10.117.245 +add test 10.10.117.246 +add test 10.10.117.247 +add test 10.10.117.248 +add test 10.10.117.249 +add test 10.10.117.25 +add test 10.10.117.250 +add test 10.10.117.251 +add test 10.10.117.252 +add test 10.10.117.253 +add test 10.10.117.254 +add test 10.10.117.255 +add test 10.10.117.26 +add test 10.10.117.27 +add test 10.10.117.28 +add test 10.10.117.29 +add test 10.10.117.3 +add test 10.10.117.30 +add test 10.10.117.31 +add test 10.10.117.32 +add test 10.10.117.33 +add test 10.10.117.34 +add test 10.10.117.35 +add test 10.10.117.36 +add test 10.10.117.37 +add test 10.10.117.38 +add test 10.10.117.39 +add test 10.10.117.4 +add test 10.10.117.40 +add test 10.10.117.41 +add test 10.10.117.42 +add test 10.10.117.43 +add test 10.10.117.44 +add test 10.10.117.45 +add test 10.10.117.46 +add test 10.10.117.47 +add test 10.10.117.48 +add test 10.10.117.49 +add test 10.10.117.5 +add test 10.10.117.50 +add test 10.10.117.51 +add test 10.10.117.52 +add test 10.10.117.53 +add test 10.10.117.54 +add test 10.10.117.55 +add test 10.10.117.56 +add test 10.10.117.57 +add test 10.10.117.58 +add test 10.10.117.59 +add test 10.10.117.6 +add test 10.10.117.60 +add test 10.10.117.61 +add test 10.10.117.62 +add test 10.10.117.63 +add test 10.10.117.64 +add test 10.10.117.65 +add test 10.10.117.66 +add test 10.10.117.67 +add test 10.10.117.68 +add test 10.10.117.69 +add test 10.10.117.7 +add test 10.10.117.70 +add test 10.10.117.71 +add test 10.10.117.72 +add test 10.10.117.73 +add test 10.10.117.74 +add test 10.10.117.75 +add test 10.10.117.76 +add test 10.10.117.77 +add test 10.10.117.78 +add test 10.10.117.79 +add test 10.10.117.8 +add test 10.10.117.80 +add test 10.10.117.81 +add test 10.10.117.82 +add test 10.10.117.83 +add test 10.10.117.84 +add test 10.10.117.85 +add test 10.10.117.86 +add test 10.10.117.87 +add test 10.10.117.88 +add test 10.10.117.89 +add test 10.10.117.9 +add test 10.10.117.90 +add test 10.10.117.91 +add test 10.10.117.92 +add test 10.10.117.93 +add test 10.10.117.94 +add test 10.10.117.95 +add test 10.10.117.96 +add test 10.10.117.97 +add test 10.10.117.98 +add test 10.10.117.99 +add test 10.10.118.0 +add test 10.10.118.1 +add test 10.10.118.10 +add test 10.10.118.100 +add test 10.10.118.101 +add test 10.10.118.102 +add test 10.10.118.103 +add test 10.10.118.104 +add test 10.10.118.105 +add test 10.10.118.106 +add test 10.10.118.107 +add test 10.10.118.108 +add test 10.10.118.109 +add test 10.10.118.11 +add test 10.10.118.110 +add test 10.10.118.111 +add test 10.10.118.112 +add test 10.10.118.113 +add test 10.10.118.114 +add test 10.10.118.115 +add test 10.10.118.116 +add test 10.10.118.117 +add test 10.10.118.118 +add test 10.10.118.119 +add test 10.10.118.12 +add test 10.10.118.120 +add test 10.10.118.121 +add test 10.10.118.122 +add test 10.10.118.123 +add test 10.10.118.124 +add test 10.10.118.125 +add test 10.10.118.126 +add test 10.10.118.127 +add test 10.10.118.128 +add test 10.10.118.129 +add test 10.10.118.13 +add test 10.10.118.130 +add test 10.10.118.131 +add test 10.10.118.132 +add test 10.10.118.133 +add test 10.10.118.134 +add test 10.10.118.135 +add test 10.10.118.136 +add test 10.10.118.137 +add test 10.10.118.138 +add test 10.10.118.139 +add test 10.10.118.14 +add test 10.10.118.140 +add test 10.10.118.141 +add test 10.10.118.142 +add test 10.10.118.143 +add test 10.10.118.144 +add test 10.10.118.145 +add test 10.10.118.146 +add test 10.10.118.147 +add test 10.10.118.148 +add test 10.10.118.149 +add test 10.10.118.15 +add test 10.10.118.150 +add test 10.10.118.151 +add test 10.10.118.152 +add test 10.10.118.153 +add test 10.10.118.154 +add test 10.10.118.155 +add test 10.10.118.156 +add test 10.10.118.157 +add test 10.10.118.158 +add test 10.10.118.159 +add test 10.10.118.16 +add test 10.10.118.160 +add test 10.10.118.161 +add test 10.10.118.162 +add test 10.10.118.163 +add test 10.10.118.164 +add test 10.10.118.165 +add test 10.10.118.166 +add test 10.10.118.167 +add test 10.10.118.168 +add test 10.10.118.169 +add test 10.10.118.17 +add test 10.10.118.170 +add test 10.10.118.171 +add test 10.10.118.172 +add test 10.10.118.173 +add test 10.10.118.174 +add test 10.10.118.175 +add test 10.10.118.176 +add test 10.10.118.177 +add test 10.10.118.178 +add test 10.10.118.179 +add test 10.10.118.18 +add test 10.10.118.180 +add test 10.10.118.181 +add test 10.10.118.182 +add test 10.10.118.183 +add test 10.10.118.184 +add test 10.10.118.185 +add test 10.10.118.186 +add test 10.10.118.187 +add test 10.10.118.188 +add test 10.10.118.189 +add test 10.10.118.19 +add test 10.10.118.190 +add test 10.10.118.191 +add test 10.10.118.192 +add test 10.10.118.193 +add test 10.10.118.194 +add test 10.10.118.195 +add test 10.10.118.196 +add test 10.10.118.197 +add test 10.10.118.198 +add test 10.10.118.199 +add test 10.10.118.2 +add test 10.10.118.20 +add test 10.10.118.200 +add test 10.10.118.201 +add test 10.10.118.202 +add test 10.10.118.203 +add test 10.10.118.204 +add test 10.10.118.205 +add test 10.10.118.206 +add test 10.10.118.207 +add test 10.10.118.208 +add test 10.10.118.209 +add test 10.10.118.21 +add test 10.10.118.210 +add test 10.10.118.211 +add test 10.10.118.212 +add test 10.10.118.213 +add test 10.10.118.214 +add test 10.10.118.215 +add test 10.10.118.216 +add test 10.10.118.217 +add test 10.10.118.218 +add test 10.10.118.219 +add test 10.10.118.22 +add test 10.10.118.220 +add test 10.10.118.221 +add test 10.10.118.222 +add test 10.10.118.223 +add test 10.10.118.224 +add test 10.10.118.225 +add test 10.10.118.226 +add test 10.10.118.227 +add test 10.10.118.228 +add test 10.10.118.229 +add test 10.10.118.23 +add test 10.10.118.230 +add test 10.10.118.231 +add test 10.10.118.232 +add test 10.10.118.233 +add test 10.10.118.234 +add test 10.10.118.235 +add test 10.10.118.236 +add test 10.10.118.237 +add test 10.10.118.238 +add test 10.10.118.239 +add test 10.10.118.24 +add test 10.10.118.240 +add test 10.10.118.241 +add test 10.10.118.242 +add test 10.10.118.243 +add test 10.10.118.244 +add test 10.10.118.245 +add test 10.10.118.246 +add test 10.10.118.247 +add test 10.10.118.248 +add test 10.10.118.249 +add test 10.10.118.25 +add test 10.10.118.250 +add test 10.10.118.251 +add test 10.10.118.252 +add test 10.10.118.253 +add test 10.10.118.254 +add test 10.10.118.255 +add test 10.10.118.26 +add test 10.10.118.27 +add test 10.10.118.28 +add test 10.10.118.29 +add test 10.10.118.3 +add test 10.10.118.30 +add test 10.10.118.31 +add test 10.10.118.32 +add test 10.10.118.33 +add test 10.10.118.34 +add test 10.10.118.35 +add test 10.10.118.36 +add test 10.10.118.37 +add test 10.10.118.38 +add test 10.10.118.39 +add test 10.10.118.4 +add test 10.10.118.40 +add test 10.10.118.41 +add test 10.10.118.42 +add test 10.10.118.43 +add test 10.10.118.44 +add test 10.10.118.45 +add test 10.10.118.46 +add test 10.10.118.47 +add test 10.10.118.48 +add test 10.10.118.49 +add test 10.10.118.5 +add test 10.10.118.50 +add test 10.10.118.51 +add test 10.10.118.52 +add test 10.10.118.53 +add test 10.10.118.54 +add test 10.10.118.55 +add test 10.10.118.56 +add test 10.10.118.57 +add test 10.10.118.58 +add test 10.10.118.59 +add test 10.10.118.6 +add test 10.10.118.60 +add test 10.10.118.61 +add test 10.10.118.62 +add test 10.10.118.63 +add test 10.10.118.64 +add test 10.10.118.65 +add test 10.10.118.66 +add test 10.10.118.67 +add test 10.10.118.68 +add test 10.10.118.69 +add test 10.10.118.7 +add test 10.10.118.70 +add test 10.10.118.71 +add test 10.10.118.72 +add test 10.10.118.73 +add test 10.10.118.74 +add test 10.10.118.75 +add test 10.10.118.76 +add test 10.10.118.77 +add test 10.10.118.78 +add test 10.10.118.79 +add test 10.10.118.8 +add test 10.10.118.80 +add test 10.10.118.81 +add test 10.10.118.82 +add test 10.10.118.83 +add test 10.10.118.84 +add test 10.10.118.85 +add test 10.10.118.86 +add test 10.10.118.87 +add test 10.10.118.88 +add test 10.10.118.89 +add test 10.10.118.9 +add test 10.10.118.90 +add test 10.10.118.91 +add test 10.10.118.92 +add test 10.10.118.93 +add test 10.10.118.94 +add test 10.10.118.95 +add test 10.10.118.96 +add test 10.10.118.97 +add test 10.10.118.98 +add test 10.10.118.99 +add test 10.10.119.0 +add test 10.10.119.1 +add test 10.10.119.10 +add test 10.10.119.100 +add test 10.10.119.101 +add test 10.10.119.102 +add test 10.10.119.103 +add test 10.10.119.104 +add test 10.10.119.105 +add test 10.10.119.106 +add test 10.10.119.107 +add test 10.10.119.108 +add test 10.10.119.109 +add test 10.10.119.11 +add test 10.10.119.110 +add test 10.10.119.111 +add test 10.10.119.112 +add test 10.10.119.113 +add test 10.10.119.114 +add test 10.10.119.115 +add test 10.10.119.116 +add test 10.10.119.117 +add test 10.10.119.118 +add test 10.10.119.119 +add test 10.10.119.12 +add test 10.10.119.120 +add test 10.10.119.121 +add test 10.10.119.122 +add test 10.10.119.123 +add test 10.10.119.124 +add test 10.10.119.125 +add test 10.10.119.126 +add test 10.10.119.127 +add test 10.10.119.128 +add test 10.10.119.129 +add test 10.10.119.13 +add test 10.10.119.130 +add test 10.10.119.131 +add test 10.10.119.132 +add test 10.10.119.133 +add test 10.10.119.134 +add test 10.10.119.135 +add test 10.10.119.136 +add test 10.10.119.137 +add test 10.10.119.138 +add test 10.10.119.139 +add test 10.10.119.14 +add test 10.10.119.140 +add test 10.10.119.141 +add test 10.10.119.142 +add test 10.10.119.143 +add test 10.10.119.144 +add test 10.10.119.145 +add test 10.10.119.146 +add test 10.10.119.147 +add test 10.10.119.148 +add test 10.10.119.149 +add test 10.10.119.15 +add test 10.10.119.150 +add test 10.10.119.151 +add test 10.10.119.152 +add test 10.10.119.153 +add test 10.10.119.154 +add test 10.10.119.155 +add test 10.10.119.156 +add test 10.10.119.157 +add test 10.10.119.158 +add test 10.10.119.159 +add test 10.10.119.16 +add test 10.10.119.160 +add test 10.10.119.161 +add test 10.10.119.162 +add test 10.10.119.163 +add test 10.10.119.164 +add test 10.10.119.165 +add test 10.10.119.166 +add test 10.10.119.167 +add test 10.10.119.168 +add test 10.10.119.169 +add test 10.10.119.17 +add test 10.10.119.170 +add test 10.10.119.171 +add test 10.10.119.172 +add test 10.10.119.173 +add test 10.10.119.174 +add test 10.10.119.175 +add test 10.10.119.176 +add test 10.10.119.177 +add test 10.10.119.178 +add test 10.10.119.179 +add test 10.10.119.18 +add test 10.10.119.180 +add test 10.10.119.181 +add test 10.10.119.182 +add test 10.10.119.183 +add test 10.10.119.184 +add test 10.10.119.185 +add test 10.10.119.186 +add test 10.10.119.187 +add test 10.10.119.188 +add test 10.10.119.189 +add test 10.10.119.19 +add test 10.10.119.190 +add test 10.10.119.191 +add test 10.10.119.192 +add test 10.10.119.193 +add test 10.10.119.194 +add test 10.10.119.195 +add test 10.10.119.196 +add test 10.10.119.197 +add test 10.10.119.198 +add test 10.10.119.199 +add test 10.10.119.2 +add test 10.10.119.20 +add test 10.10.119.200 +add test 10.10.119.201 +add test 10.10.119.202 +add test 10.10.119.203 +add test 10.10.119.204 +add test 10.10.119.205 +add test 10.10.119.206 +add test 10.10.119.207 +add test 10.10.119.208 +add test 10.10.119.209 +add test 10.10.119.21 +add test 10.10.119.210 +add test 10.10.119.211 +add test 10.10.119.212 +add test 10.10.119.213 +add test 10.10.119.214 +add test 10.10.119.215 +add test 10.10.119.216 +add test 10.10.119.217 +add test 10.10.119.218 +add test 10.10.119.219 +add test 10.10.119.22 +add test 10.10.119.220 +add test 10.10.119.221 +add test 10.10.119.222 +add test 10.10.119.223 +add test 10.10.119.224 +add test 10.10.119.225 +add test 10.10.119.226 +add test 10.10.119.227 +add test 10.10.119.228 +add test 10.10.119.229 +add test 10.10.119.23 +add test 10.10.119.230 +add test 10.10.119.231 +add test 10.10.119.232 +add test 10.10.119.233 +add test 10.10.119.234 +add test 10.10.119.235 +add test 10.10.119.236 +add test 10.10.119.237 +add test 10.10.119.238 +add test 10.10.119.239 +add test 10.10.119.24 +add test 10.10.119.240 +add test 10.10.119.241 +add test 10.10.119.242 +add test 10.10.119.243 +add test 10.10.119.244 +add test 10.10.119.245 +add test 10.10.119.246 +add test 10.10.119.247 +add test 10.10.119.248 +add test 10.10.119.249 +add test 10.10.119.25 +add test 10.10.119.250 +add test 10.10.119.251 +add test 10.10.119.252 +add test 10.10.119.253 +add test 10.10.119.254 +add test 10.10.119.255 +add test 10.10.119.26 +add test 10.10.119.27 +add test 10.10.119.28 +add test 10.10.119.29 +add test 10.10.119.3 +add test 10.10.119.30 +add test 10.10.119.31 +add test 10.10.119.32 +add test 10.10.119.33 +add test 10.10.119.34 +add test 10.10.119.35 +add test 10.10.119.36 +add test 10.10.119.37 +add test 10.10.119.38 +add test 10.10.119.39 +add test 10.10.119.4 +add test 10.10.119.40 +add test 10.10.119.41 +add test 10.10.119.42 +add test 10.10.119.43 +add test 10.10.119.44 +add test 10.10.119.45 +add test 10.10.119.46 +add test 10.10.119.47 +add test 10.10.119.48 +add test 10.10.119.49 +add test 10.10.119.5 +add test 10.10.119.50 +add test 10.10.119.51 +add test 10.10.119.52 +add test 10.10.119.53 +add test 10.10.119.54 +add test 10.10.119.55 +add test 10.10.119.56 +add test 10.10.119.57 +add test 10.10.119.58 +add test 10.10.119.59 +add test 10.10.119.6 +add test 10.10.119.60 +add test 10.10.119.61 +add test 10.10.119.62 +add test 10.10.119.63 +add test 10.10.119.64 +add test 10.10.119.65 +add test 10.10.119.66 +add test 10.10.119.67 +add test 10.10.119.68 +add test 10.10.119.69 +add test 10.10.119.7 +add test 10.10.119.70 +add test 10.10.119.71 +add test 10.10.119.72 +add test 10.10.119.73 +add test 10.10.119.74 +add test 10.10.119.75 +add test 10.10.119.76 +add test 10.10.119.77 +add test 10.10.119.78 +add test 10.10.119.79 +add test 10.10.119.8 +add test 10.10.119.80 +add test 10.10.119.81 +add test 10.10.119.82 +add test 10.10.119.83 +add test 10.10.119.84 +add test 10.10.119.85 +add test 10.10.119.86 +add test 10.10.119.87 +add test 10.10.119.88 +add test 10.10.119.89 +add test 10.10.119.9 +add test 10.10.119.90 +add test 10.10.119.91 +add test 10.10.119.92 +add test 10.10.119.93 +add test 10.10.119.94 +add test 10.10.119.95 +add test 10.10.119.96 +add test 10.10.119.97 +add test 10.10.119.98 +add test 10.10.119.99 +add test 10.10.12.0 +add test 10.10.12.1 +add test 10.10.12.10 +add test 10.10.12.100 +add test 10.10.12.101 +add test 10.10.12.102 +add test 10.10.12.103 +add test 10.10.12.104 +add test 10.10.12.105 +add test 10.10.12.106 +add test 10.10.12.107 +add test 10.10.12.108 +add test 10.10.12.109 +add test 10.10.12.11 +add test 10.10.12.110 +add test 10.10.12.111 +add test 10.10.12.112 +add test 10.10.12.113 +add test 10.10.12.114 +add test 10.10.12.115 +add test 10.10.12.116 +add test 10.10.12.117 +add test 10.10.12.118 +add test 10.10.12.119 +add test 10.10.12.12 +add test 10.10.12.120 +add test 10.10.12.121 +add test 10.10.12.122 +add test 10.10.12.123 +add test 10.10.12.124 +add test 10.10.12.125 +add test 10.10.12.126 +add test 10.10.12.127 +add test 10.10.12.128 +add test 10.10.12.129 +add test 10.10.12.13 +add test 10.10.12.130 +add test 10.10.12.131 +add test 10.10.12.132 +add test 10.10.12.133 +add test 10.10.12.134 +add test 10.10.12.135 +add test 10.10.12.136 +add test 10.10.12.137 +add test 10.10.12.138 +add test 10.10.12.139 +add test 10.10.12.14 +add test 10.10.12.140 +add test 10.10.12.141 +add test 10.10.12.142 +add test 10.10.12.143 +add test 10.10.12.144 +add test 10.10.12.145 +add test 10.10.12.146 +add test 10.10.12.147 +add test 10.10.12.148 +add test 10.10.12.149 +add test 10.10.12.15 +add test 10.10.12.150 +add test 10.10.12.151 +add test 10.10.12.152 +add test 10.10.12.153 +add test 10.10.12.154 +add test 10.10.12.155 +add test 10.10.12.156 +add test 10.10.12.157 +add test 10.10.12.158 +add test 10.10.12.159 +add test 10.10.12.16 +add test 10.10.12.160 +add test 10.10.12.161 +add test 10.10.12.162 +add test 10.10.12.163 +add test 10.10.12.164 +add test 10.10.12.165 +add test 10.10.12.166 +add test 10.10.12.167 +add test 10.10.12.168 +add test 10.10.12.169 +add test 10.10.12.17 +add test 10.10.12.170 +add test 10.10.12.171 +add test 10.10.12.172 +add test 10.10.12.173 +add test 10.10.12.174 +add test 10.10.12.175 +add test 10.10.12.176 +add test 10.10.12.177 +add test 10.10.12.178 +add test 10.10.12.179 +add test 10.10.12.18 +add test 10.10.12.180 +add test 10.10.12.181 +add test 10.10.12.182 +add test 10.10.12.183 +add test 10.10.12.184 +add test 10.10.12.185 +add test 10.10.12.186 +add test 10.10.12.187 +add test 10.10.12.188 +add test 10.10.12.189 +add test 10.10.12.19 +add test 10.10.12.190 +add test 10.10.12.191 +add test 10.10.12.192 +add test 10.10.12.193 +add test 10.10.12.194 +add test 10.10.12.195 +add test 10.10.12.196 +add test 10.10.12.197 +add test 10.10.12.198 +add test 10.10.12.199 +add test 10.10.12.2 +add test 10.10.12.20 +add test 10.10.12.200 +add test 10.10.12.201 +add test 10.10.12.202 +add test 10.10.12.203 +add test 10.10.12.204 +add test 10.10.12.205 +add test 10.10.12.206 +add test 10.10.12.207 +add test 10.10.12.208 +add test 10.10.12.209 +add test 10.10.12.21 +add test 10.10.12.210 +add test 10.10.12.211 +add test 10.10.12.212 +add test 10.10.12.213 +add test 10.10.12.214 +add test 10.10.12.215 +add test 10.10.12.216 +add test 10.10.12.217 +add test 10.10.12.218 +add test 10.10.12.219 +add test 10.10.12.22 +add test 10.10.12.220 +add test 10.10.12.221 +add test 10.10.12.222 +add test 10.10.12.223 +add test 10.10.12.224 +add test 10.10.12.225 +add test 10.10.12.226 +add test 10.10.12.227 +add test 10.10.12.228 +add test 10.10.12.229 +add test 10.10.12.23 +add test 10.10.12.230 +add test 10.10.12.231 +add test 10.10.12.232 +add test 10.10.12.233 +add test 10.10.12.234 +add test 10.10.12.235 +add test 10.10.12.236 +add test 10.10.12.237 +add test 10.10.12.238 +add test 10.10.12.239 +add test 10.10.12.24 +add test 10.10.12.240 +add test 10.10.12.241 +add test 10.10.12.242 +add test 10.10.12.243 +add test 10.10.12.244 +add test 10.10.12.245 +add test 10.10.12.246 +add test 10.10.12.247 +add test 10.10.12.248 +add test 10.10.12.249 +add test 10.10.12.25 +add test 10.10.12.250 +add test 10.10.12.251 +add test 10.10.12.252 +add test 10.10.12.253 +add test 10.10.12.254 +add test 10.10.12.255 +add test 10.10.12.26 +add test 10.10.12.27 +add test 10.10.12.28 +add test 10.10.12.29 +add test 10.10.12.3 +add test 10.10.12.30 +add test 10.10.12.31 +add test 10.10.12.32 +add test 10.10.12.33 +add test 10.10.12.34 +add test 10.10.12.35 +add test 10.10.12.36 +add test 10.10.12.37 +add test 10.10.12.38 +add test 10.10.12.39 +add test 10.10.12.4 +add test 10.10.12.40 +add test 10.10.12.41 +add test 10.10.12.42 +add test 10.10.12.43 +add test 10.10.12.44 +add test 10.10.12.45 +add test 10.10.12.46 +add test 10.10.12.47 +add test 10.10.12.48 +add test 10.10.12.49 +add test 10.10.12.5 +add test 10.10.12.50 +add test 10.10.12.51 +add test 10.10.12.52 +add test 10.10.12.53 +add test 10.10.12.54 +add test 10.10.12.55 +add test 10.10.12.56 +add test 10.10.12.57 +add test 10.10.12.58 +add test 10.10.12.59 +add test 10.10.12.6 +add test 10.10.12.60 +add test 10.10.12.61 +add test 10.10.12.62 +add test 10.10.12.63 +add test 10.10.12.64 +add test 10.10.12.65 +add test 10.10.12.66 +add test 10.10.12.67 +add test 10.10.12.68 +add test 10.10.12.69 +add test 10.10.12.7 +add test 10.10.12.70 +add test 10.10.12.71 +add test 10.10.12.72 +add test 10.10.12.73 +add test 10.10.12.74 +add test 10.10.12.75 +add test 10.10.12.76 +add test 10.10.12.77 +add test 10.10.12.78 +add test 10.10.12.79 +add test 10.10.12.8 +add test 10.10.12.80 +add test 10.10.12.81 +add test 10.10.12.82 +add test 10.10.12.83 +add test 10.10.12.84 +add test 10.10.12.85 +add test 10.10.12.86 +add test 10.10.12.87 +add test 10.10.12.88 +add test 10.10.12.89 +add test 10.10.12.9 +add test 10.10.12.90 +add test 10.10.12.91 +add test 10.10.12.92 +add test 10.10.12.93 +add test 10.10.12.94 +add test 10.10.12.95 +add test 10.10.12.96 +add test 10.10.12.97 +add test 10.10.12.98 +add test 10.10.12.99 +add test 10.10.120.0 +add test 10.10.120.1 +add test 10.10.120.10 +add test 10.10.120.100 +add test 10.10.120.101 +add test 10.10.120.102 +add test 10.10.120.103 +add test 10.10.120.104 +add test 10.10.120.105 +add test 10.10.120.106 +add test 10.10.120.107 +add test 10.10.120.108 +add test 10.10.120.109 +add test 10.10.120.11 +add test 10.10.120.110 +add test 10.10.120.111 +add test 10.10.120.112 +add test 10.10.120.113 +add test 10.10.120.114 +add test 10.10.120.115 +add test 10.10.120.116 +add test 10.10.120.117 +add test 10.10.120.118 +add test 10.10.120.119 +add test 10.10.120.12 +add test 10.10.120.120 +add test 10.10.120.121 +add test 10.10.120.122 +add test 10.10.120.123 +add test 10.10.120.124 +add test 10.10.120.125 +add test 10.10.120.126 +add test 10.10.120.127 +add test 10.10.120.128 +add test 10.10.120.129 +add test 10.10.120.13 +add test 10.10.120.130 +add test 10.10.120.131 +add test 10.10.120.132 +add test 10.10.120.133 +add test 10.10.120.134 +add test 10.10.120.135 +add test 10.10.120.136 +add test 10.10.120.137 +add test 10.10.120.138 +add test 10.10.120.139 +add test 10.10.120.14 +add test 10.10.120.140 +add test 10.10.120.141 +add test 10.10.120.142 +add test 10.10.120.143 +add test 10.10.120.144 +add test 10.10.120.145 +add test 10.10.120.146 +add test 10.10.120.147 +add test 10.10.120.148 +add test 10.10.120.149 +add test 10.10.120.15 +add test 10.10.120.150 +add test 10.10.120.151 +add test 10.10.120.152 +add test 10.10.120.153 +add test 10.10.120.154 +add test 10.10.120.155 +add test 10.10.120.156 +add test 10.10.120.157 +add test 10.10.120.158 +add test 10.10.120.159 +add test 10.10.120.16 +add test 10.10.120.160 +add test 10.10.120.161 +add test 10.10.120.162 +add test 10.10.120.163 +add test 10.10.120.164 +add test 10.10.120.165 +add test 10.10.120.166 +add test 10.10.120.167 +add test 10.10.120.168 +add test 10.10.120.169 +add test 10.10.120.17 +add test 10.10.120.170 +add test 10.10.120.171 +add test 10.10.120.172 +add test 10.10.120.173 +add test 10.10.120.174 +add test 10.10.120.175 +add test 10.10.120.176 +add test 10.10.120.177 +add test 10.10.120.178 +add test 10.10.120.179 +add test 10.10.120.18 +add test 10.10.120.180 +add test 10.10.120.181 +add test 10.10.120.182 +add test 10.10.120.183 +add test 10.10.120.184 +add test 10.10.120.185 +add test 10.10.120.186 +add test 10.10.120.187 +add test 10.10.120.188 +add test 10.10.120.189 +add test 10.10.120.19 +add test 10.10.120.190 +add test 10.10.120.191 +add test 10.10.120.192 +add test 10.10.120.193 +add test 10.10.120.194 +add test 10.10.120.195 +add test 10.10.120.196 +add test 10.10.120.197 +add test 10.10.120.198 +add test 10.10.120.199 +add test 10.10.120.2 +add test 10.10.120.20 +add test 10.10.120.200 +add test 10.10.120.201 +add test 10.10.120.202 +add test 10.10.120.203 +add test 10.10.120.204 +add test 10.10.120.205 +add test 10.10.120.206 +add test 10.10.120.207 +add test 10.10.120.208 +add test 10.10.120.209 +add test 10.10.120.21 +add test 10.10.120.210 +add test 10.10.120.211 +add test 10.10.120.212 +add test 10.10.120.213 +add test 10.10.120.214 +add test 10.10.120.215 +add test 10.10.120.216 +add test 10.10.120.217 +add test 10.10.120.218 +add test 10.10.120.219 +add test 10.10.120.22 +add test 10.10.120.220 +add test 10.10.120.221 +add test 10.10.120.222 +add test 10.10.120.223 +add test 10.10.120.224 +add test 10.10.120.225 +add test 10.10.120.226 +add test 10.10.120.227 +add test 10.10.120.228 +add test 10.10.120.229 +add test 10.10.120.23 +add test 10.10.120.230 +add test 10.10.120.231 +add test 10.10.120.232 +add test 10.10.120.233 +add test 10.10.120.234 +add test 10.10.120.235 +add test 10.10.120.236 +add test 10.10.120.237 +add test 10.10.120.238 +add test 10.10.120.239 +add test 10.10.120.24 +add test 10.10.120.240 +add test 10.10.120.241 +add test 10.10.120.242 +add test 10.10.120.243 +add test 10.10.120.244 +add test 10.10.120.245 +add test 10.10.120.246 +add test 10.10.120.247 +add test 10.10.120.248 +add test 10.10.120.249 +add test 10.10.120.25 +add test 10.10.120.250 +add test 10.10.120.251 +add test 10.10.120.252 +add test 10.10.120.253 +add test 10.10.120.254 +add test 10.10.120.255 +add test 10.10.120.26 +add test 10.10.120.27 +add test 10.10.120.28 +add test 10.10.120.29 +add test 10.10.120.3 +add test 10.10.120.30 +add test 10.10.120.31 +add test 10.10.120.32 +add test 10.10.120.33 +add test 10.10.120.34 +add test 10.10.120.35 +add test 10.10.120.36 +add test 10.10.120.37 +add test 10.10.120.38 +add test 10.10.120.39 +add test 10.10.120.4 +add test 10.10.120.40 +add test 10.10.120.41 +add test 10.10.120.42 +add test 10.10.120.43 +add test 10.10.120.44 +add test 10.10.120.45 +add test 10.10.120.46 +add test 10.10.120.47 +add test 10.10.120.48 +add test 10.10.120.49 +add test 10.10.120.5 +add test 10.10.120.50 +add test 10.10.120.51 +add test 10.10.120.52 +add test 10.10.120.53 +add test 10.10.120.54 +add test 10.10.120.55 +add test 10.10.120.56 +add test 10.10.120.57 +add test 10.10.120.58 +add test 10.10.120.59 +add test 10.10.120.6 +add test 10.10.120.60 +add test 10.10.120.61 +add test 10.10.120.62 +add test 10.10.120.63 +add test 10.10.120.64 +add test 10.10.120.65 +add test 10.10.120.66 +add test 10.10.120.67 +add test 10.10.120.68 +add test 10.10.120.69 +add test 10.10.120.7 +add test 10.10.120.70 +add test 10.10.120.71 +add test 10.10.120.72 +add test 10.10.120.73 +add test 10.10.120.74 +add test 10.10.120.75 +add test 10.10.120.76 +add test 10.10.120.77 +add test 10.10.120.78 +add test 10.10.120.79 +add test 10.10.120.8 +add test 10.10.120.80 +add test 10.10.120.81 +add test 10.10.120.82 +add test 10.10.120.83 +add test 10.10.120.84 +add test 10.10.120.85 +add test 10.10.120.86 +add test 10.10.120.87 +add test 10.10.120.88 +add test 10.10.120.89 +add test 10.10.120.9 +add test 10.10.120.90 +add test 10.10.120.91 +add test 10.10.120.92 +add test 10.10.120.93 +add test 10.10.120.94 +add test 10.10.120.95 +add test 10.10.120.96 +add test 10.10.120.97 +add test 10.10.120.98 +add test 10.10.120.99 +add test 10.10.121.0 +add test 10.10.121.1 +add test 10.10.121.10 +add test 10.10.121.100 +add test 10.10.121.101 +add test 10.10.121.102 +add test 10.10.121.103 +add test 10.10.121.104 +add test 10.10.121.105 +add test 10.10.121.106 +add test 10.10.121.107 +add test 10.10.121.108 +add test 10.10.121.109 +add test 10.10.121.11 +add test 10.10.121.110 +add test 10.10.121.111 +add test 10.10.121.112 +add test 10.10.121.113 +add test 10.10.121.114 +add test 10.10.121.115 +add test 10.10.121.116 +add test 10.10.121.117 +add test 10.10.121.118 +add test 10.10.121.119 +add test 10.10.121.12 +add test 10.10.121.120 +add test 10.10.121.121 +add test 10.10.121.122 +add test 10.10.121.123 +add test 10.10.121.124 +add test 10.10.121.125 +add test 10.10.121.126 +add test 10.10.121.127 +add test 10.10.121.128 +add test 10.10.121.129 +add test 10.10.121.13 +add test 10.10.121.130 +add test 10.10.121.131 +add test 10.10.121.132 +add test 10.10.121.133 +add test 10.10.121.134 +add test 10.10.121.135 +add test 10.10.121.136 +add test 10.10.121.137 +add test 10.10.121.138 +add test 10.10.121.139 +add test 10.10.121.14 +add test 10.10.121.140 +add test 10.10.121.141 +add test 10.10.121.142 +add test 10.10.121.143 +add test 10.10.121.144 +add test 10.10.121.145 +add test 10.10.121.146 +add test 10.10.121.147 +add test 10.10.121.148 +add test 10.10.121.149 +add test 10.10.121.15 +add test 10.10.121.150 +add test 10.10.121.151 +add test 10.10.121.152 +add test 10.10.121.153 +add test 10.10.121.154 +add test 10.10.121.155 +add test 10.10.121.156 +add test 10.10.121.157 +add test 10.10.121.158 +add test 10.10.121.159 +add test 10.10.121.16 +add test 10.10.121.160 +add test 10.10.121.161 +add test 10.10.121.162 +add test 10.10.121.163 +add test 10.10.121.164 +add test 10.10.121.165 +add test 10.10.121.166 +add test 10.10.121.167 +add test 10.10.121.168 +add test 10.10.121.169 +add test 10.10.121.17 +add test 10.10.121.170 +add test 10.10.121.171 +add test 10.10.121.172 +add test 10.10.121.173 +add test 10.10.121.174 +add test 10.10.121.175 +add test 10.10.121.176 +add test 10.10.121.177 +add test 10.10.121.178 +add test 10.10.121.179 +add test 10.10.121.18 +add test 10.10.121.180 +add test 10.10.121.181 +add test 10.10.121.182 +add test 10.10.121.183 +add test 10.10.121.184 +add test 10.10.121.185 +add test 10.10.121.186 +add test 10.10.121.187 +add test 10.10.121.188 +add test 10.10.121.189 +add test 10.10.121.19 +add test 10.10.121.190 +add test 10.10.121.191 +add test 10.10.121.192 +add test 10.10.121.193 +add test 10.10.121.194 +add test 10.10.121.195 +add test 10.10.121.196 +add test 10.10.121.197 +add test 10.10.121.198 +add test 10.10.121.199 +add test 10.10.121.2 +add test 10.10.121.20 +add test 10.10.121.200 +add test 10.10.121.201 +add test 10.10.121.202 +add test 10.10.121.203 +add test 10.10.121.204 +add test 10.10.121.205 +add test 10.10.121.206 +add test 10.10.121.207 +add test 10.10.121.208 +add test 10.10.121.209 +add test 10.10.121.21 +add test 10.10.121.210 +add test 10.10.121.211 +add test 10.10.121.212 +add test 10.10.121.213 +add test 10.10.121.214 +add test 10.10.121.215 +add test 10.10.121.216 +add test 10.10.121.217 +add test 10.10.121.218 +add test 10.10.121.219 +add test 10.10.121.22 +add test 10.10.121.220 +add test 10.10.121.221 +add test 10.10.121.222 +add test 10.10.121.223 +add test 10.10.121.224 +add test 10.10.121.225 +add test 10.10.121.226 +add test 10.10.121.227 +add test 10.10.121.228 +add test 10.10.121.229 +add test 10.10.121.23 +add test 10.10.121.230 +add test 10.10.121.231 +add test 10.10.121.232 +add test 10.10.121.233 +add test 10.10.121.234 +add test 10.10.121.235 +add test 10.10.121.236 +add test 10.10.121.237 +add test 10.10.121.238 +add test 10.10.121.239 +add test 10.10.121.24 +add test 10.10.121.240 +add test 10.10.121.241 +add test 10.10.121.242 +add test 10.10.121.243 +add test 10.10.121.244 +add test 10.10.121.245 +add test 10.10.121.246 +add test 10.10.121.247 +add test 10.10.121.248 +add test 10.10.121.249 +add test 10.10.121.25 +add test 10.10.121.250 +add test 10.10.121.251 +add test 10.10.121.252 +add test 10.10.121.253 +add test 10.10.121.254 +add test 10.10.121.255 +add test 10.10.121.26 +add test 10.10.121.27 +add test 10.10.121.28 +add test 10.10.121.29 +add test 10.10.121.3 +add test 10.10.121.30 +add test 10.10.121.31 +add test 10.10.121.32 +add test 10.10.121.33 +add test 10.10.121.34 +add test 10.10.121.35 +add test 10.10.121.36 +add test 10.10.121.37 +add test 10.10.121.38 +add test 10.10.121.39 +add test 10.10.121.4 +add test 10.10.121.40 +add test 10.10.121.41 +add test 10.10.121.42 +add test 10.10.121.43 +add test 10.10.121.44 +add test 10.10.121.45 +add test 10.10.121.46 +add test 10.10.121.47 +add test 10.10.121.48 +add test 10.10.121.49 +add test 10.10.121.5 +add test 10.10.121.50 +add test 10.10.121.51 +add test 10.10.121.52 +add test 10.10.121.53 +add test 10.10.121.54 +add test 10.10.121.55 +add test 10.10.121.56 +add test 10.10.121.57 +add test 10.10.121.58 +add test 10.10.121.59 +add test 10.10.121.6 +add test 10.10.121.60 +add test 10.10.121.61 +add test 10.10.121.62 +add test 10.10.121.63 +add test 10.10.121.64 +add test 10.10.121.65 +add test 10.10.121.66 +add test 10.10.121.67 +add test 10.10.121.68 +add test 10.10.121.69 +add test 10.10.121.7 +add test 10.10.121.70 +add test 10.10.121.71 +add test 10.10.121.72 +add test 10.10.121.73 +add test 10.10.121.74 +add test 10.10.121.75 +add test 10.10.121.76 +add test 10.10.121.77 +add test 10.10.121.78 +add test 10.10.121.79 +add test 10.10.121.8 +add test 10.10.121.80 +add test 10.10.121.81 +add test 10.10.121.82 +add test 10.10.121.83 +add test 10.10.121.84 +add test 10.10.121.85 +add test 10.10.121.86 +add test 10.10.121.87 +add test 10.10.121.88 +add test 10.10.121.89 +add test 10.10.121.9 +add test 10.10.121.90 +add test 10.10.121.91 +add test 10.10.121.92 +add test 10.10.121.93 +add test 10.10.121.94 +add test 10.10.121.95 +add test 10.10.121.96 +add test 10.10.121.97 +add test 10.10.121.98 +add test 10.10.121.99 +add test 10.10.122.0 +add test 10.10.122.1 +add test 10.10.122.10 +add test 10.10.122.100 +add test 10.10.122.101 +add test 10.10.122.102 +add test 10.10.122.103 +add test 10.10.122.104 +add test 10.10.122.105 +add test 10.10.122.106 +add test 10.10.122.107 +add test 10.10.122.108 +add test 10.10.122.109 +add test 10.10.122.11 +add test 10.10.122.110 +add test 10.10.122.111 +add test 10.10.122.112 +add test 10.10.122.113 +add test 10.10.122.114 +add test 10.10.122.115 +add test 10.10.122.116 +add test 10.10.122.117 +add test 10.10.122.118 +add test 10.10.122.119 +add test 10.10.122.12 +add test 10.10.122.120 +add test 10.10.122.121 +add test 10.10.122.122 +add test 10.10.122.123 +add test 10.10.122.124 +add test 10.10.122.125 +add test 10.10.122.126 +add test 10.10.122.127 +add test 10.10.122.128 +add test 10.10.122.129 +add test 10.10.122.13 +add test 10.10.122.130 +add test 10.10.122.131 +add test 10.10.122.132 +add test 10.10.122.133 +add test 10.10.122.134 +add test 10.10.122.135 +add test 10.10.122.136 +add test 10.10.122.137 +add test 10.10.122.138 +add test 10.10.122.139 +add test 10.10.122.14 +add test 10.10.122.140 +add test 10.10.122.141 +add test 10.10.122.142 +add test 10.10.122.143 +add test 10.10.122.144 +add test 10.10.122.145 +add test 10.10.122.146 +add test 10.10.122.147 +add test 10.10.122.148 +add test 10.10.122.149 +add test 10.10.122.15 +add test 10.10.122.150 +add test 10.10.122.151 +add test 10.10.122.152 +add test 10.10.122.153 +add test 10.10.122.154 +add test 10.10.122.155 +add test 10.10.122.156 +add test 10.10.122.157 +add test 10.10.122.158 +add test 10.10.122.159 +add test 10.10.122.16 +add test 10.10.122.160 +add test 10.10.122.161 +add test 10.10.122.162 +add test 10.10.122.163 +add test 10.10.122.164 +add test 10.10.122.165 +add test 10.10.122.166 +add test 10.10.122.167 +add test 10.10.122.168 +add test 10.10.122.169 +add test 10.10.122.17 +add test 10.10.122.170 +add test 10.10.122.171 +add test 10.10.122.172 +add test 10.10.122.173 +add test 10.10.122.174 +add test 10.10.122.175 +add test 10.10.122.176 +add test 10.10.122.177 +add test 10.10.122.178 +add test 10.10.122.179 +add test 10.10.122.18 +add test 10.10.122.180 +add test 10.10.122.181 +add test 10.10.122.182 +add test 10.10.122.183 +add test 10.10.122.184 +add test 10.10.122.185 +add test 10.10.122.186 +add test 10.10.122.187 +add test 10.10.122.188 +add test 10.10.122.189 +add test 10.10.122.19 +add test 10.10.122.190 +add test 10.10.122.191 +add test 10.10.122.192 +add test 10.10.122.193 +add test 10.10.122.194 +add test 10.10.122.195 +add test 10.10.122.196 +add test 10.10.122.197 +add test 10.10.122.198 +add test 10.10.122.199 +add test 10.10.122.2 +add test 10.10.122.20 +add test 10.10.122.200 +add test 10.10.122.201 +add test 10.10.122.202 +add test 10.10.122.203 +add test 10.10.122.204 +add test 10.10.122.205 +add test 10.10.122.206 +add test 10.10.122.207 +add test 10.10.122.208 +add test 10.10.122.209 +add test 10.10.122.21 +add test 10.10.122.210 +add test 10.10.122.211 +add test 10.10.122.212 +add test 10.10.122.213 +add test 10.10.122.214 +add test 10.10.122.215 +add test 10.10.122.216 +add test 10.10.122.217 +add test 10.10.122.218 +add test 10.10.122.219 +add test 10.10.122.22 +add test 10.10.122.220 +add test 10.10.122.221 +add test 10.10.122.222 +add test 10.10.122.223 +add test 10.10.122.224 +add test 10.10.122.225 +add test 10.10.122.226 +add test 10.10.122.227 +add test 10.10.122.228 +add test 10.10.122.229 +add test 10.10.122.23 +add test 10.10.122.230 +add test 10.10.122.231 +add test 10.10.122.232 +add test 10.10.122.233 +add test 10.10.122.234 +add test 10.10.122.235 +add test 10.10.122.236 +add test 10.10.122.237 +add test 10.10.122.238 +add test 10.10.122.239 +add test 10.10.122.24 +add test 10.10.122.240 +add test 10.10.122.241 +add test 10.10.122.242 +add test 10.10.122.243 +add test 10.10.122.244 +add test 10.10.122.245 +add test 10.10.122.246 +add test 10.10.122.247 +add test 10.10.122.248 +add test 10.10.122.249 +add test 10.10.122.25 +add test 10.10.122.250 +add test 10.10.122.251 +add test 10.10.122.252 +add test 10.10.122.253 +add test 10.10.122.254 +add test 10.10.122.255 +add test 10.10.122.26 +add test 10.10.122.27 +add test 10.10.122.28 +add test 10.10.122.29 +add test 10.10.122.3 +add test 10.10.122.30 +add test 10.10.122.31 +add test 10.10.122.32 +add test 10.10.122.33 +add test 10.10.122.34 +add test 10.10.122.35 +add test 10.10.122.36 +add test 10.10.122.37 +add test 10.10.122.38 +add test 10.10.122.39 +add test 10.10.122.4 +add test 10.10.122.40 +add test 10.10.122.41 +add test 10.10.122.42 +add test 10.10.122.43 +add test 10.10.122.44 +add test 10.10.122.45 +add test 10.10.122.46 +add test 10.10.122.47 +add test 10.10.122.48 +add test 10.10.122.49 +add test 10.10.122.5 +add test 10.10.122.50 +add test 10.10.122.51 +add test 10.10.122.52 +add test 10.10.122.53 +add test 10.10.122.54 +add test 10.10.122.55 +add test 10.10.122.56 +add test 10.10.122.57 +add test 10.10.122.58 +add test 10.10.122.59 +add test 10.10.122.6 +add test 10.10.122.60 +add test 10.10.122.61 +add test 10.10.122.62 +add test 10.10.122.63 +add test 10.10.122.64 +add test 10.10.122.65 +add test 10.10.122.66 +add test 10.10.122.67 +add test 10.10.122.68 +add test 10.10.122.69 +add test 10.10.122.7 +add test 10.10.122.70 +add test 10.10.122.71 +add test 10.10.122.72 +add test 10.10.122.73 +add test 10.10.122.74 +add test 10.10.122.75 +add test 10.10.122.76 +add test 10.10.122.77 +add test 10.10.122.78 +add test 10.10.122.79 +add test 10.10.122.8 +add test 10.10.122.80 +add test 10.10.122.81 +add test 10.10.122.82 +add test 10.10.122.83 +add test 10.10.122.84 +add test 10.10.122.85 +add test 10.10.122.86 +add test 10.10.122.87 +add test 10.10.122.88 +add test 10.10.122.89 +add test 10.10.122.9 +add test 10.10.122.90 +add test 10.10.122.91 +add test 10.10.122.92 +add test 10.10.122.93 +add test 10.10.122.94 +add test 10.10.122.95 +add test 10.10.122.96 +add test 10.10.122.97 +add test 10.10.122.98 +add test 10.10.122.99 +add test 10.10.123.0 +add test 10.10.123.1 +add test 10.10.123.10 +add test 10.10.123.100 +add test 10.10.123.101 +add test 10.10.123.102 +add test 10.10.123.103 +add test 10.10.123.104 +add test 10.10.123.105 +add test 10.10.123.106 +add test 10.10.123.107 +add test 10.10.123.108 +add test 10.10.123.109 +add test 10.10.123.11 +add test 10.10.123.110 +add test 10.10.123.111 +add test 10.10.123.112 +add test 10.10.123.113 +add test 10.10.123.114 +add test 10.10.123.115 +add test 10.10.123.116 +add test 10.10.123.117 +add test 10.10.123.118 +add test 10.10.123.119 +add test 10.10.123.12 +add test 10.10.123.120 +add test 10.10.123.121 +add test 10.10.123.122 +add test 10.10.123.123 +add test 10.10.123.124 +add test 10.10.123.125 +add test 10.10.123.126 +add test 10.10.123.127 +add test 10.10.123.128 +add test 10.10.123.129 +add test 10.10.123.13 +add test 10.10.123.130 +add test 10.10.123.131 +add test 10.10.123.132 +add test 10.10.123.133 +add test 10.10.123.134 +add test 10.10.123.135 +add test 10.10.123.136 +add test 10.10.123.137 +add test 10.10.123.138 +add test 10.10.123.139 +add test 10.10.123.14 +add test 10.10.123.140 +add test 10.10.123.141 +add test 10.10.123.142 +add test 10.10.123.143 +add test 10.10.123.144 +add test 10.10.123.145 +add test 10.10.123.146 +add test 10.10.123.147 +add test 10.10.123.148 +add test 10.10.123.149 +add test 10.10.123.15 +add test 10.10.123.150 +add test 10.10.123.151 +add test 10.10.123.152 +add test 10.10.123.153 +add test 10.10.123.154 +add test 10.10.123.155 +add test 10.10.123.156 +add test 10.10.123.157 +add test 10.10.123.158 +add test 10.10.123.159 +add test 10.10.123.16 +add test 10.10.123.160 +add test 10.10.123.161 +add test 10.10.123.162 +add test 10.10.123.163 +add test 10.10.123.164 +add test 10.10.123.165 +add test 10.10.123.166 +add test 10.10.123.167 +add test 10.10.123.168 +add test 10.10.123.169 +add test 10.10.123.17 +add test 10.10.123.170 +add test 10.10.123.171 +add test 10.10.123.172 +add test 10.10.123.173 +add test 10.10.123.174 +add test 10.10.123.175 +add test 10.10.123.176 +add test 10.10.123.177 +add test 10.10.123.178 +add test 10.10.123.179 +add test 10.10.123.18 +add test 10.10.123.180 +add test 10.10.123.181 +add test 10.10.123.182 +add test 10.10.123.183 +add test 10.10.123.184 +add test 10.10.123.185 +add test 10.10.123.186 +add test 10.10.123.187 +add test 10.10.123.188 +add test 10.10.123.189 +add test 10.10.123.19 +add test 10.10.123.190 +add test 10.10.123.191 +add test 10.10.123.192 +add test 10.10.123.193 +add test 10.10.123.194 +add test 10.10.123.195 +add test 10.10.123.196 +add test 10.10.123.197 +add test 10.10.123.198 +add test 10.10.123.199 +add test 10.10.123.2 +add test 10.10.123.20 +add test 10.10.123.200 +add test 10.10.123.201 +add test 10.10.123.202 +add test 10.10.123.203 +add test 10.10.123.204 +add test 10.10.123.205 +add test 10.10.123.206 +add test 10.10.123.207 +add test 10.10.123.208 +add test 10.10.123.209 +add test 10.10.123.21 +add test 10.10.123.210 +add test 10.10.123.211 +add test 10.10.123.212 +add test 10.10.123.213 +add test 10.10.123.214 +add test 10.10.123.215 +add test 10.10.123.216 +add test 10.10.123.217 +add test 10.10.123.218 +add test 10.10.123.219 +add test 10.10.123.22 +add test 10.10.123.220 +add test 10.10.123.221 +add test 10.10.123.222 +add test 10.10.123.223 +add test 10.10.123.224 +add test 10.10.123.225 +add test 10.10.123.226 +add test 10.10.123.227 +add test 10.10.123.228 +add test 10.10.123.229 +add test 10.10.123.23 +add test 10.10.123.230 +add test 10.10.123.231 +add test 10.10.123.232 +add test 10.10.123.233 +add test 10.10.123.234 +add test 10.10.123.235 +add test 10.10.123.236 +add test 10.10.123.237 +add test 10.10.123.238 +add test 10.10.123.239 +add test 10.10.123.24 +add test 10.10.123.240 +add test 10.10.123.241 +add test 10.10.123.242 +add test 10.10.123.243 +add test 10.10.123.244 +add test 10.10.123.245 +add test 10.10.123.246 +add test 10.10.123.247 +add test 10.10.123.248 +add test 10.10.123.249 +add test 10.10.123.25 +add test 10.10.123.250 +add test 10.10.123.251 +add test 10.10.123.252 +add test 10.10.123.253 +add test 10.10.123.254 +add test 10.10.123.255 +add test 10.10.123.26 +add test 10.10.123.27 +add test 10.10.123.28 +add test 10.10.123.29 +add test 10.10.123.3 +add test 10.10.123.30 +add test 10.10.123.31 +add test 10.10.123.32 +add test 10.10.123.33 +add test 10.10.123.34 +add test 10.10.123.35 +add test 10.10.123.36 +add test 10.10.123.37 +add test 10.10.123.38 +add test 10.10.123.39 +add test 10.10.123.4 +add test 10.10.123.40 +add test 10.10.123.41 +add test 10.10.123.42 +add test 10.10.123.43 +add test 10.10.123.44 +add test 10.10.123.45 +add test 10.10.123.46 +add test 10.10.123.47 +add test 10.10.123.48 +add test 10.10.123.49 +add test 10.10.123.5 +add test 10.10.123.50 +add test 10.10.123.51 +add test 10.10.123.52 +add test 10.10.123.53 +add test 10.10.123.54 +add test 10.10.123.55 +add test 10.10.123.56 +add test 10.10.123.57 +add test 10.10.123.58 +add test 10.10.123.59 +add test 10.10.123.6 +add test 10.10.123.60 +add test 10.10.123.61 +add test 10.10.123.62 +add test 10.10.123.63 +add test 10.10.123.64 +add test 10.10.123.65 +add test 10.10.123.66 +add test 10.10.123.67 +add test 10.10.123.68 +add test 10.10.123.69 +add test 10.10.123.7 +add test 10.10.123.70 +add test 10.10.123.71 +add test 10.10.123.72 +add test 10.10.123.73 +add test 10.10.123.74 +add test 10.10.123.75 +add test 10.10.123.76 +add test 10.10.123.77 +add test 10.10.123.78 +add test 10.10.123.79 +add test 10.10.123.8 +add test 10.10.123.80 +add test 10.10.123.81 +add test 10.10.123.82 +add test 10.10.123.83 +add test 10.10.123.84 +add test 10.10.123.85 +add test 10.10.123.86 +add test 10.10.123.87 +add test 10.10.123.88 +add test 10.10.123.89 +add test 10.10.123.9 +add test 10.10.123.90 +add test 10.10.123.91 +add test 10.10.123.92 +add test 10.10.123.93 +add test 10.10.123.94 +add test 10.10.123.95 +add test 10.10.123.96 +add test 10.10.123.97 +add test 10.10.123.98 +add test 10.10.123.99 +add test 10.10.124.0 +add test 10.10.124.1 +add test 10.10.124.10 +add test 10.10.124.100 +add test 10.10.124.101 +add test 10.10.124.102 +add test 10.10.124.103 +add test 10.10.124.104 +add test 10.10.124.105 +add test 10.10.124.106 +add test 10.10.124.107 +add test 10.10.124.108 +add test 10.10.124.109 +add test 10.10.124.11 +add test 10.10.124.110 +add test 10.10.124.111 +add test 10.10.124.112 +add test 10.10.124.113 +add test 10.10.124.114 +add test 10.10.124.115 +add test 10.10.124.116 +add test 10.10.124.117 +add test 10.10.124.118 +add test 10.10.124.119 +add test 10.10.124.12 +add test 10.10.124.120 +add test 10.10.124.121 +add test 10.10.124.122 +add test 10.10.124.123 +add test 10.10.124.124 +add test 10.10.124.125 +add test 10.10.124.126 +add test 10.10.124.127 +add test 10.10.124.128 +add test 10.10.124.129 +add test 10.10.124.13 +add test 10.10.124.130 +add test 10.10.124.131 +add test 10.10.124.132 +add test 10.10.124.133 +add test 10.10.124.134 +add test 10.10.124.135 +add test 10.10.124.136 +add test 10.10.124.137 +add test 10.10.124.138 +add test 10.10.124.139 +add test 10.10.124.14 +add test 10.10.124.140 +add test 10.10.124.141 +add test 10.10.124.142 +add test 10.10.124.143 +add test 10.10.124.144 +add test 10.10.124.145 +add test 10.10.124.146 +add test 10.10.124.147 +add test 10.10.124.148 +add test 10.10.124.149 +add test 10.10.124.15 +add test 10.10.124.150 +add test 10.10.124.151 +add test 10.10.124.152 +add test 10.10.124.153 +add test 10.10.124.154 +add test 10.10.124.155 +add test 10.10.124.156 +add test 10.10.124.157 +add test 10.10.124.158 +add test 10.10.124.159 +add test 10.10.124.16 +add test 10.10.124.160 +add test 10.10.124.161 +add test 10.10.124.162 +add test 10.10.124.163 +add test 10.10.124.164 +add test 10.10.124.165 +add test 10.10.124.166 +add test 10.10.124.167 +add test 10.10.124.168 +add test 10.10.124.169 +add test 10.10.124.17 +add test 10.10.124.170 +add test 10.10.124.171 +add test 10.10.124.172 +add test 10.10.124.173 +add test 10.10.124.174 +add test 10.10.124.175 +add test 10.10.124.176 +add test 10.10.124.177 +add test 10.10.124.178 +add test 10.10.124.179 +add test 10.10.124.18 +add test 10.10.124.180 +add test 10.10.124.181 +add test 10.10.124.182 +add test 10.10.124.183 +add test 10.10.124.184 +add test 10.10.124.185 +add test 10.10.124.186 +add test 10.10.124.187 +add test 10.10.124.188 +add test 10.10.124.189 +add test 10.10.124.19 +add test 10.10.124.190 +add test 10.10.124.191 +add test 10.10.124.192 +add test 10.10.124.193 +add test 10.10.124.194 +add test 10.10.124.195 +add test 10.10.124.196 +add test 10.10.124.197 +add test 10.10.124.198 +add test 10.10.124.199 +add test 10.10.124.2 +add test 10.10.124.20 +add test 10.10.124.200 +add test 10.10.124.201 +add test 10.10.124.202 +add test 10.10.124.203 +add test 10.10.124.204 +add test 10.10.124.205 +add test 10.10.124.206 +add test 10.10.124.207 +add test 10.10.124.208 +add test 10.10.124.209 +add test 10.10.124.21 +add test 10.10.124.210 +add test 10.10.124.211 +add test 10.10.124.212 +add test 10.10.124.213 +add test 10.10.124.214 +add test 10.10.124.215 +add test 10.10.124.216 +add test 10.10.124.217 +add test 10.10.124.218 +add test 10.10.124.219 +add test 10.10.124.22 +add test 10.10.124.220 +add test 10.10.124.221 +add test 10.10.124.222 +add test 10.10.124.223 +add test 10.10.124.224 +add test 10.10.124.225 +add test 10.10.124.226 +add test 10.10.124.227 +add test 10.10.124.228 +add test 10.10.124.229 +add test 10.10.124.23 +add test 10.10.124.230 +add test 10.10.124.231 +add test 10.10.124.232 +add test 10.10.124.233 +add test 10.10.124.234 +add test 10.10.124.235 +add test 10.10.124.236 +add test 10.10.124.237 +add test 10.10.124.238 +add test 10.10.124.239 +add test 10.10.124.24 +add test 10.10.124.240 +add test 10.10.124.241 +add test 10.10.124.242 +add test 10.10.124.243 +add test 10.10.124.244 +add test 10.10.124.245 +add test 10.10.124.246 +add test 10.10.124.247 +add test 10.10.124.248 +add test 10.10.124.249 +add test 10.10.124.25 +add test 10.10.124.250 +add test 10.10.124.251 +add test 10.10.124.252 +add test 10.10.124.253 +add test 10.10.124.254 +add test 10.10.124.255 +add test 10.10.124.26 +add test 10.10.124.27 +add test 10.10.124.28 +add test 10.10.124.29 +add test 10.10.124.3 +add test 10.10.124.30 +add test 10.10.124.31 +add test 10.10.124.32 +add test 10.10.124.33 +add test 10.10.124.34 +add test 10.10.124.35 +add test 10.10.124.36 +add test 10.10.124.37 +add test 10.10.124.38 +add test 10.10.124.39 +add test 10.10.124.4 +add test 10.10.124.40 +add test 10.10.124.41 +add test 10.10.124.42 +add test 10.10.124.43 +add test 10.10.124.44 +add test 10.10.124.45 +add test 10.10.124.46 +add test 10.10.124.47 +add test 10.10.124.48 +add test 10.10.124.49 +add test 10.10.124.5 +add test 10.10.124.50 +add test 10.10.124.51 +add test 10.10.124.52 +add test 10.10.124.53 +add test 10.10.124.54 +add test 10.10.124.55 +add test 10.10.124.56 +add test 10.10.124.57 +add test 10.10.124.58 +add test 10.10.124.59 +add test 10.10.124.6 +add test 10.10.124.60 +add test 10.10.124.61 +add test 10.10.124.62 +add test 10.10.124.63 +add test 10.10.124.64 +add test 10.10.124.65 +add test 10.10.124.66 +add test 10.10.124.67 +add test 10.10.124.68 +add test 10.10.124.69 +add test 10.10.124.7 +add test 10.10.124.70 +add test 10.10.124.71 +add test 10.10.124.72 +add test 10.10.124.73 +add test 10.10.124.74 +add test 10.10.124.75 +add test 10.10.124.76 +add test 10.10.124.77 +add test 10.10.124.78 +add test 10.10.124.79 +add test 10.10.124.8 +add test 10.10.124.80 +add test 10.10.124.81 +add test 10.10.124.82 +add test 10.10.124.83 +add test 10.10.124.84 +add test 10.10.124.85 +add test 10.10.124.86 +add test 10.10.124.87 +add test 10.10.124.88 +add test 10.10.124.89 +add test 10.10.124.9 +add test 10.10.124.90 +add test 10.10.124.91 +add test 10.10.124.92 +add test 10.10.124.93 +add test 10.10.124.94 +add test 10.10.124.95 +add test 10.10.124.96 +add test 10.10.124.97 +add test 10.10.124.98 +add test 10.10.124.99 +add test 10.10.125.0 +add test 10.10.125.1 +add test 10.10.125.10 +add test 10.10.125.100 +add test 10.10.125.101 +add test 10.10.125.102 +add test 10.10.125.103 +add test 10.10.125.104 +add test 10.10.125.105 +add test 10.10.125.106 +add test 10.10.125.107 +add test 10.10.125.108 +add test 10.10.125.109 +add test 10.10.125.11 +add test 10.10.125.110 +add test 10.10.125.111 +add test 10.10.125.112 +add test 10.10.125.113 +add test 10.10.125.114 +add test 10.10.125.115 +add test 10.10.125.116 +add test 10.10.125.117 +add test 10.10.125.118 +add test 10.10.125.119 +add test 10.10.125.12 +add test 10.10.125.120 +add test 10.10.125.121 +add test 10.10.125.122 +add test 10.10.125.123 +add test 10.10.125.124 +add test 10.10.125.125 +add test 10.10.125.126 +add test 10.10.125.127 +add test 10.10.125.128 +add test 10.10.125.129 +add test 10.10.125.13 +add test 10.10.125.130 +add test 10.10.125.131 +add test 10.10.125.132 +add test 10.10.125.133 +add test 10.10.125.134 +add test 10.10.125.135 +add test 10.10.125.136 +add test 10.10.125.137 +add test 10.10.125.138 +add test 10.10.125.139 +add test 10.10.125.14 +add test 10.10.125.140 +add test 10.10.125.141 +add test 10.10.125.142 +add test 10.10.125.143 +add test 10.10.125.144 +add test 10.10.125.145 +add test 10.10.125.146 +add test 10.10.125.147 +add test 10.10.125.148 +add test 10.10.125.149 +add test 10.10.125.15 +add test 10.10.125.150 +add test 10.10.125.151 +add test 10.10.125.152 +add test 10.10.125.153 +add test 10.10.125.154 +add test 10.10.125.155 +add test 10.10.125.156 +add test 10.10.125.157 +add test 10.10.125.158 +add test 10.10.125.159 +add test 10.10.125.16 +add test 10.10.125.160 +add test 10.10.125.161 +add test 10.10.125.162 +add test 10.10.125.163 +add test 10.10.125.164 +add test 10.10.125.165 +add test 10.10.125.166 +add test 10.10.125.167 +add test 10.10.125.168 +add test 10.10.125.169 +add test 10.10.125.17 +add test 10.10.125.170 +add test 10.10.125.171 +add test 10.10.125.172 +add test 10.10.125.173 +add test 10.10.125.174 +add test 10.10.125.175 +add test 10.10.125.176 +add test 10.10.125.177 +add test 10.10.125.178 +add test 10.10.125.179 +add test 10.10.125.18 +add test 10.10.125.180 +add test 10.10.125.181 +add test 10.10.125.182 +add test 10.10.125.183 +add test 10.10.125.184 +add test 10.10.125.185 +add test 10.10.125.186 +add test 10.10.125.187 +add test 10.10.125.188 +add test 10.10.125.189 +add test 10.10.125.19 +add test 10.10.125.190 +add test 10.10.125.191 +add test 10.10.125.192 +add test 10.10.125.193 +add test 10.10.125.194 +add test 10.10.125.195 +add test 10.10.125.196 +add test 10.10.125.197 +add test 10.10.125.198 +add test 10.10.125.199 +add test 10.10.125.2 +add test 10.10.125.20 +add test 10.10.125.200 +add test 10.10.125.201 +add test 10.10.125.202 +add test 10.10.125.203 +add test 10.10.125.204 +add test 10.10.125.205 +add test 10.10.125.206 +add test 10.10.125.207 +add test 10.10.125.208 +add test 10.10.125.209 +add test 10.10.125.21 +add test 10.10.125.210 +add test 10.10.125.211 +add test 10.10.125.212 +add test 10.10.125.213 +add test 10.10.125.214 +add test 10.10.125.215 +add test 10.10.125.216 +add test 10.10.125.217 +add test 10.10.125.218 +add test 10.10.125.219 +add test 10.10.125.22 +add test 10.10.125.220 +add test 10.10.125.221 +add test 10.10.125.222 +add test 10.10.125.223 +add test 10.10.125.224 +add test 10.10.125.225 +add test 10.10.125.226 +add test 10.10.125.227 +add test 10.10.125.228 +add test 10.10.125.229 +add test 10.10.125.23 +add test 10.10.125.230 +add test 10.10.125.231 +add test 10.10.125.232 +add test 10.10.125.233 +add test 10.10.125.234 +add test 10.10.125.235 +add test 10.10.125.236 +add test 10.10.125.237 +add test 10.10.125.238 +add test 10.10.125.239 +add test 10.10.125.24 +add test 10.10.125.240 +add test 10.10.125.241 +add test 10.10.125.242 +add test 10.10.125.243 +add test 10.10.125.244 +add test 10.10.125.245 +add test 10.10.125.246 +add test 10.10.125.247 +add test 10.10.125.248 +add test 10.10.125.249 +add test 10.10.125.25 +add test 10.10.125.250 +add test 10.10.125.251 +add test 10.10.125.252 +add test 10.10.125.253 +add test 10.10.125.254 +add test 10.10.125.255 +add test 10.10.125.26 +add test 10.10.125.27 +add test 10.10.125.28 +add test 10.10.125.29 +add test 10.10.125.3 +add test 10.10.125.30 +add test 10.10.125.31 +add test 10.10.125.32 +add test 10.10.125.33 +add test 10.10.125.34 +add test 10.10.125.35 +add test 10.10.125.36 +add test 10.10.125.37 +add test 10.10.125.38 +add test 10.10.125.39 +add test 10.10.125.4 +add test 10.10.125.40 +add test 10.10.125.41 +add test 10.10.125.42 +add test 10.10.125.43 +add test 10.10.125.44 +add test 10.10.125.45 +add test 10.10.125.46 +add test 10.10.125.47 +add test 10.10.125.48 +add test 10.10.125.49 +add test 10.10.125.5 +add test 10.10.125.50 +add test 10.10.125.51 +add test 10.10.125.52 +add test 10.10.125.53 +add test 10.10.125.54 +add test 10.10.125.55 +add test 10.10.125.56 +add test 10.10.125.57 +add test 10.10.125.58 +add test 10.10.125.59 +add test 10.10.125.6 +add test 10.10.125.60 +add test 10.10.125.61 +add test 10.10.125.62 +add test 10.10.125.63 +add test 10.10.125.64 +add test 10.10.125.65 +add test 10.10.125.66 +add test 10.10.125.67 +add test 10.10.125.68 +add test 10.10.125.69 +add test 10.10.125.7 +add test 10.10.125.70 +add test 10.10.125.71 +add test 10.10.125.72 +add test 10.10.125.73 +add test 10.10.125.74 +add test 10.10.125.75 +add test 10.10.125.76 +add test 10.10.125.77 +add test 10.10.125.78 +add test 10.10.125.79 +add test 10.10.125.8 +add test 10.10.125.80 +add test 10.10.125.81 +add test 10.10.125.82 +add test 10.10.125.83 +add test 10.10.125.84 +add test 10.10.125.85 +add test 10.10.125.86 +add test 10.10.125.87 +add test 10.10.125.88 +add test 10.10.125.89 +add test 10.10.125.9 +add test 10.10.125.90 +add test 10.10.125.91 +add test 10.10.125.92 +add test 10.10.125.93 +add test 10.10.125.94 +add test 10.10.125.95 +add test 10.10.125.96 +add test 10.10.125.97 +add test 10.10.125.98 +add test 10.10.125.99 +add test 10.10.126.0 +add test 10.10.126.1 +add test 10.10.126.10 +add test 10.10.126.100 +add test 10.10.126.101 +add test 10.10.126.102 +add test 10.10.126.103 +add test 10.10.126.104 +add test 10.10.126.105 +add test 10.10.126.106 +add test 10.10.126.107 +add test 10.10.126.108 +add test 10.10.126.109 +add test 10.10.126.11 +add test 10.10.126.110 +add test 10.10.126.111 +add test 10.10.126.112 +add test 10.10.126.113 +add test 10.10.126.114 +add test 10.10.126.115 +add test 10.10.126.116 +add test 10.10.126.117 +add test 10.10.126.118 +add test 10.10.126.119 +add test 10.10.126.12 +add test 10.10.126.120 +add test 10.10.126.121 +add test 10.10.126.122 +add test 10.10.126.123 +add test 10.10.126.124 +add test 10.10.126.125 +add test 10.10.126.126 +add test 10.10.126.127 +add test 10.10.126.128 +add test 10.10.126.129 +add test 10.10.126.13 +add test 10.10.126.130 +add test 10.10.126.131 +add test 10.10.126.132 +add test 10.10.126.133 +add test 10.10.126.134 +add test 10.10.126.135 +add test 10.10.126.136 +add test 10.10.126.137 +add test 10.10.126.138 +add test 10.10.126.139 +add test 10.10.126.14 +add test 10.10.126.140 +add test 10.10.126.141 +add test 10.10.126.142 +add test 10.10.126.143 +add test 10.10.126.144 +add test 10.10.126.145 +add test 10.10.126.146 +add test 10.10.126.147 +add test 10.10.126.148 +add test 10.10.126.149 +add test 10.10.126.15 +add test 10.10.126.150 +add test 10.10.126.151 +add test 10.10.126.152 +add test 10.10.126.153 +add test 10.10.126.154 +add test 10.10.126.155 +add test 10.10.126.156 +add test 10.10.126.157 +add test 10.10.126.158 +add test 10.10.126.159 +add test 10.10.126.16 +add test 10.10.126.160 +add test 10.10.126.161 +add test 10.10.126.162 +add test 10.10.126.163 +add test 10.10.126.164 +add test 10.10.126.165 +add test 10.10.126.166 +add test 10.10.126.167 +add test 10.10.126.168 +add test 10.10.126.169 +add test 10.10.126.17 +add test 10.10.126.170 +add test 10.10.126.171 +add test 10.10.126.172 +add test 10.10.126.173 +add test 10.10.126.174 +add test 10.10.126.175 +add test 10.10.126.176 +add test 10.10.126.177 +add test 10.10.126.178 +add test 10.10.126.179 +add test 10.10.126.18 +add test 10.10.126.180 +add test 10.10.126.181 +add test 10.10.126.182 +add test 10.10.126.183 +add test 10.10.126.184 +add test 10.10.126.185 +add test 10.10.126.186 +add test 10.10.126.187 +add test 10.10.126.188 +add test 10.10.126.189 +add test 10.10.126.19 +add test 10.10.126.190 +add test 10.10.126.191 +add test 10.10.126.192 +add test 10.10.126.193 +add test 10.10.126.194 +add test 10.10.126.195 +add test 10.10.126.196 +add test 10.10.126.197 +add test 10.10.126.198 +add test 10.10.126.199 +add test 10.10.126.2 +add test 10.10.126.20 +add test 10.10.126.200 +add test 10.10.126.201 +add test 10.10.126.202 +add test 10.10.126.203 +add test 10.10.126.204 +add test 10.10.126.205 +add test 10.10.126.206 +add test 10.10.126.207 +add test 10.10.126.208 +add test 10.10.126.209 +add test 10.10.126.21 +add test 10.10.126.210 +add test 10.10.126.211 +add test 10.10.126.212 +add test 10.10.126.213 +add test 10.10.126.214 +add test 10.10.126.215 +add test 10.10.126.216 +add test 10.10.126.217 +add test 10.10.126.218 +add test 10.10.126.219 +add test 10.10.126.22 +add test 10.10.126.220 +add test 10.10.126.221 +add test 10.10.126.222 +add test 10.10.126.223 +add test 10.10.126.224 +add test 10.10.126.225 +add test 10.10.126.226 +add test 10.10.126.227 +add test 10.10.126.228 +add test 10.10.126.229 +add test 10.10.126.23 +add test 10.10.126.230 +add test 10.10.126.231 +add test 10.10.126.232 +add test 10.10.126.233 +add test 10.10.126.234 +add test 10.10.126.235 +add test 10.10.126.236 +add test 10.10.126.237 +add test 10.10.126.238 +add test 10.10.126.239 +add test 10.10.126.24 +add test 10.10.126.240 +add test 10.10.126.241 +add test 10.10.126.242 +add test 10.10.126.243 +add test 10.10.126.244 +add test 10.10.126.245 +add test 10.10.126.246 +add test 10.10.126.247 +add test 10.10.126.248 +add test 10.10.126.249 +add test 10.10.126.25 +add test 10.10.126.250 +add test 10.10.126.251 +add test 10.10.126.252 +add test 10.10.126.253 +add test 10.10.126.254 +add test 10.10.126.255 +add test 10.10.126.26 +add test 10.10.126.27 +add test 10.10.126.28 +add test 10.10.126.29 +add test 10.10.126.3 +add test 10.10.126.30 +add test 10.10.126.31 +add test 10.10.126.32 +add test 10.10.126.33 +add test 10.10.126.34 +add test 10.10.126.35 +add test 10.10.126.36 +add test 10.10.126.37 +add test 10.10.126.38 +add test 10.10.126.39 +add test 10.10.126.4 +add test 10.10.126.40 +add test 10.10.126.41 +add test 10.10.126.42 +add test 10.10.126.43 +add test 10.10.126.44 +add test 10.10.126.45 +add test 10.10.126.46 +add test 10.10.126.47 +add test 10.10.126.48 +add test 10.10.126.49 +add test 10.10.126.5 +add test 10.10.126.50 +add test 10.10.126.51 +add test 10.10.126.52 +add test 10.10.126.53 +add test 10.10.126.54 +add test 10.10.126.55 +add test 10.10.126.56 +add test 10.10.126.57 +add test 10.10.126.58 +add test 10.10.126.59 +add test 10.10.126.6 +add test 10.10.126.60 +add test 10.10.126.61 +add test 10.10.126.62 +add test 10.10.126.63 +add test 10.10.126.64 +add test 10.10.126.65 +add test 10.10.126.66 +add test 10.10.126.67 +add test 10.10.126.68 +add test 10.10.126.69 +add test 10.10.126.7 +add test 10.10.126.70 +add test 10.10.126.71 +add test 10.10.126.72 +add test 10.10.126.73 +add test 10.10.126.74 +add test 10.10.126.75 +add test 10.10.126.76 +add test 10.10.126.77 +add test 10.10.126.78 +add test 10.10.126.79 +add test 10.10.126.8 +add test 10.10.126.80 +add test 10.10.126.81 +add test 10.10.126.82 +add test 10.10.126.83 +add test 10.10.126.84 +add test 10.10.126.85 +add test 10.10.126.86 +add test 10.10.126.87 +add test 10.10.126.88 +add test 10.10.126.89 +add test 10.10.126.9 +add test 10.10.126.90 +add test 10.10.126.91 +add test 10.10.126.92 +add test 10.10.126.93 +add test 10.10.126.94 +add test 10.10.126.95 +add test 10.10.126.96 +add test 10.10.126.97 +add test 10.10.126.98 +add test 10.10.126.99 +add test 10.10.127.0 +add test 10.10.127.1 +add test 10.10.127.10 +add test 10.10.127.100 +add test 10.10.127.101 +add test 10.10.127.102 +add test 10.10.127.103 +add test 10.10.127.104 +add test 10.10.127.105 +add test 10.10.127.106 +add test 10.10.127.107 +add test 10.10.127.108 +add test 10.10.127.109 +add test 10.10.127.11 +add test 10.10.127.110 +add test 10.10.127.111 +add test 10.10.127.112 +add test 10.10.127.113 +add test 10.10.127.114 +add test 10.10.127.115 +add test 10.10.127.116 +add test 10.10.127.117 +add test 10.10.127.118 +add test 10.10.127.119 +add test 10.10.127.12 +add test 10.10.127.120 +add test 10.10.127.121 +add test 10.10.127.122 +add test 10.10.127.123 +add test 10.10.127.124 +add test 10.10.127.125 +add test 10.10.127.126 +add test 10.10.127.127 +add test 10.10.127.128 +add test 10.10.127.129 +add test 10.10.127.13 +add test 10.10.127.130 +add test 10.10.127.131 +add test 10.10.127.132 +add test 10.10.127.133 +add test 10.10.127.134 +add test 10.10.127.135 +add test 10.10.127.136 +add test 10.10.127.137 +add test 10.10.127.138 +add test 10.10.127.139 +add test 10.10.127.14 +add test 10.10.127.140 +add test 10.10.127.141 +add test 10.10.127.142 +add test 10.10.127.143 +add test 10.10.127.144 +add test 10.10.127.145 +add test 10.10.127.146 +add test 10.10.127.147 +add test 10.10.127.148 +add test 10.10.127.149 +add test 10.10.127.15 +add test 10.10.127.150 +add test 10.10.127.151 +add test 10.10.127.152 +add test 10.10.127.153 +add test 10.10.127.154 +add test 10.10.127.155 +add test 10.10.127.156 +add test 10.10.127.157 +add test 10.10.127.158 +add test 10.10.127.159 +add test 10.10.127.16 +add test 10.10.127.160 +add test 10.10.127.161 +add test 10.10.127.162 +add test 10.10.127.163 +add test 10.10.127.164 +add test 10.10.127.165 +add test 10.10.127.166 +add test 10.10.127.167 +add test 10.10.127.168 +add test 10.10.127.169 +add test 10.10.127.17 +add test 10.10.127.170 +add test 10.10.127.171 +add test 10.10.127.172 +add test 10.10.127.173 +add test 10.10.127.174 +add test 10.10.127.175 +add test 10.10.127.176 +add test 10.10.127.177 +add test 10.10.127.178 +add test 10.10.127.179 +add test 10.10.127.18 +add test 10.10.127.180 +add test 10.10.127.181 +add test 10.10.127.182 +add test 10.10.127.183 +add test 10.10.127.184 +add test 10.10.127.185 +add test 10.10.127.186 +add test 10.10.127.187 +add test 10.10.127.188 +add test 10.10.127.189 +add test 10.10.127.19 +add test 10.10.127.190 +add test 10.10.127.191 +add test 10.10.127.192 +add test 10.10.127.193 +add test 10.10.127.194 +add test 10.10.127.195 +add test 10.10.127.196 +add test 10.10.127.197 +add test 10.10.127.198 +add test 10.10.127.199 +add test 10.10.127.2 +add test 10.10.127.20 +add test 10.10.127.200 +add test 10.10.127.201 +add test 10.10.127.202 +add test 10.10.127.203 +add test 10.10.127.204 +add test 10.10.127.205 +add test 10.10.127.206 +add test 10.10.127.207 +add test 10.10.127.208 +add test 10.10.127.209 +add test 10.10.127.21 +add test 10.10.127.210 +add test 10.10.127.211 +add test 10.10.127.212 +add test 10.10.127.213 +add test 10.10.127.214 +add test 10.10.127.215 +add test 10.10.127.216 +add test 10.10.127.217 +add test 10.10.127.218 +add test 10.10.127.219 +add test 10.10.127.22 +add test 10.10.127.220 +add test 10.10.127.221 +add test 10.10.127.222 +add test 10.10.127.223 +add test 10.10.127.224 +add test 10.10.127.225 +add test 10.10.127.226 +add test 10.10.127.227 +add test 10.10.127.228 +add test 10.10.127.229 +add test 10.10.127.23 +add test 10.10.127.230 +add test 10.10.127.231 +add test 10.10.127.232 +add test 10.10.127.233 +add test 10.10.127.234 +add test 10.10.127.235 +add test 10.10.127.236 +add test 10.10.127.237 +add test 10.10.127.238 +add test 10.10.127.239 +add test 10.10.127.24 +add test 10.10.127.240 +add test 10.10.127.241 +add test 10.10.127.242 +add test 10.10.127.243 +add test 10.10.127.244 +add test 10.10.127.245 +add test 10.10.127.246 +add test 10.10.127.247 +add test 10.10.127.248 +add test 10.10.127.249 +add test 10.10.127.25 +add test 10.10.127.250 +add test 10.10.127.251 +add test 10.10.127.252 +add test 10.10.127.253 +add test 10.10.127.254 +add test 10.10.127.255 +add test 10.10.127.26 +add test 10.10.127.27 +add test 10.10.127.28 +add test 10.10.127.29 +add test 10.10.127.3 +add test 10.10.127.30 +add test 10.10.127.31 +add test 10.10.127.32 +add test 10.10.127.33 +add test 10.10.127.34 +add test 10.10.127.35 +add test 10.10.127.36 +add test 10.10.127.37 +add test 10.10.127.38 +add test 10.10.127.39 +add test 10.10.127.4 +add test 10.10.127.40 +add test 10.10.127.41 +add test 10.10.127.42 +add test 10.10.127.43 +add test 10.10.127.44 +add test 10.10.127.45 +add test 10.10.127.46 +add test 10.10.127.47 +add test 10.10.127.48 +add test 10.10.127.49 +add test 10.10.127.5 +add test 10.10.127.50 +add test 10.10.127.51 +add test 10.10.127.52 +add test 10.10.127.53 +add test 10.10.127.54 +add test 10.10.127.55 +add test 10.10.127.56 +add test 10.10.127.57 +add test 10.10.127.58 +add test 10.10.127.59 +add test 10.10.127.6 +add test 10.10.127.60 +add test 10.10.127.61 +add test 10.10.127.62 +add test 10.10.127.63 +add test 10.10.127.64 +add test 10.10.127.65 +add test 10.10.127.66 +add test 10.10.127.67 +add test 10.10.127.68 +add test 10.10.127.69 +add test 10.10.127.7 +add test 10.10.127.70 +add test 10.10.127.71 +add test 10.10.127.72 +add test 10.10.127.73 +add test 10.10.127.74 +add test 10.10.127.75 +add test 10.10.127.76 +add test 10.10.127.77 +add test 10.10.127.78 +add test 10.10.127.79 +add test 10.10.127.8 +add test 10.10.127.80 +add test 10.10.127.81 +add test 10.10.127.82 +add test 10.10.127.83 +add test 10.10.127.84 +add test 10.10.127.85 +add test 10.10.127.86 +add test 10.10.127.87 +add test 10.10.127.88 +add test 10.10.127.89 +add test 10.10.127.9 +add test 10.10.127.90 +add test 10.10.127.91 +add test 10.10.127.92 +add test 10.10.127.93 +add test 10.10.127.94 +add test 10.10.127.95 +add test 10.10.127.96 +add test 10.10.127.97 +add test 10.10.127.98 +add test 10.10.127.99 +add test 10.10.128.0 +add test 10.10.128.1 +add test 10.10.128.10 +add test 10.10.128.100 +add test 10.10.128.101 +add test 10.10.128.102 +add test 10.10.128.103 +add test 10.10.128.104 +add test 10.10.128.105 +add test 10.10.128.106 +add test 10.10.128.107 +add test 10.10.128.108 +add test 10.10.128.109 +add test 10.10.128.11 +add test 10.10.128.110 +add test 10.10.128.111 +add test 10.10.128.112 +add test 10.10.128.113 +add test 10.10.128.114 +add test 10.10.128.115 +add test 10.10.128.116 +add test 10.10.128.117 +add test 10.10.128.118 +add test 10.10.128.119 +add test 10.10.128.12 +add test 10.10.128.120 +add test 10.10.128.121 +add test 10.10.128.122 +add test 10.10.128.123 +add test 10.10.128.124 +add test 10.10.128.125 +add test 10.10.128.126 +add test 10.10.128.127 +add test 10.10.128.128 +add test 10.10.128.129 +add test 10.10.128.13 +add test 10.10.128.130 +add test 10.10.128.131 +add test 10.10.128.132 +add test 10.10.128.133 +add test 10.10.128.134 +add test 10.10.128.135 +add test 10.10.128.136 +add test 10.10.128.137 +add test 10.10.128.138 +add test 10.10.128.139 +add test 10.10.128.14 +add test 10.10.128.140 +add test 10.10.128.141 +add test 10.10.128.142 +add test 10.10.128.143 +add test 10.10.128.144 +add test 10.10.128.145 +add test 10.10.128.146 +add test 10.10.128.147 +add test 10.10.128.148 +add test 10.10.128.149 +add test 10.10.128.15 +add test 10.10.128.150 +add test 10.10.128.151 +add test 10.10.128.152 +add test 10.10.128.153 +add test 10.10.128.154 +add test 10.10.128.155 +add test 10.10.128.156 +add test 10.10.128.157 +add test 10.10.128.158 +add test 10.10.128.159 +add test 10.10.128.16 +add test 10.10.128.160 +add test 10.10.128.161 +add test 10.10.128.162 +add test 10.10.128.163 +add test 10.10.128.164 +add test 10.10.128.165 +add test 10.10.128.166 +add test 10.10.128.167 +add test 10.10.128.168 +add test 10.10.128.169 +add test 10.10.128.17 +add test 10.10.128.170 +add test 10.10.128.171 +add test 10.10.128.172 +add test 10.10.128.173 +add test 10.10.128.174 +add test 10.10.128.175 +add test 10.10.128.176 +add test 10.10.128.177 +add test 10.10.128.178 +add test 10.10.128.179 +add test 10.10.128.18 +add test 10.10.128.180 +add test 10.10.128.181 +add test 10.10.128.182 +add test 10.10.128.183 +add test 10.10.128.184 +add test 10.10.128.185 +add test 10.10.128.186 +add test 10.10.128.187 +add test 10.10.128.188 +add test 10.10.128.189 +add test 10.10.128.19 +add test 10.10.128.190 +add test 10.10.128.191 +add test 10.10.128.192 +add test 10.10.128.193 +add test 10.10.128.194 +add test 10.10.128.195 +add test 10.10.128.196 +add test 10.10.128.197 +add test 10.10.128.198 +add test 10.10.128.199 +add test 10.10.128.2 +add test 10.10.128.20 +add test 10.10.128.200 +add test 10.10.128.201 +add test 10.10.128.202 +add test 10.10.128.203 +add test 10.10.128.204 +add test 10.10.128.205 +add test 10.10.128.206 +add test 10.10.128.207 +add test 10.10.128.208 +add test 10.10.128.209 +add test 10.10.128.21 +add test 10.10.128.210 +add test 10.10.128.211 +add test 10.10.128.212 +add test 10.10.128.213 +add test 10.10.128.214 +add test 10.10.128.215 +add test 10.10.128.216 +add test 10.10.128.217 +add test 10.10.128.218 +add test 10.10.128.219 +add test 10.10.128.22 +add test 10.10.128.220 +add test 10.10.128.221 +add test 10.10.128.222 +add test 10.10.128.223 +add test 10.10.128.224 +add test 10.10.128.225 +add test 10.10.128.226 +add test 10.10.128.227 +add test 10.10.128.228 +add test 10.10.128.229 +add test 10.10.128.23 +add test 10.10.128.230 +add test 10.10.128.231 +add test 10.10.128.232 +add test 10.10.128.233 +add test 10.10.128.234 +add test 10.10.128.235 +add test 10.10.128.236 +add test 10.10.128.237 +add test 10.10.128.238 +add test 10.10.128.239 +add test 10.10.128.24 +add test 10.10.128.240 +add test 10.10.128.241 +add test 10.10.128.242 +add test 10.10.128.243 +add test 10.10.128.244 +add test 10.10.128.245 +add test 10.10.128.246 +add test 10.10.128.247 +add test 10.10.128.248 +add test 10.10.128.249 +add test 10.10.128.25 +add test 10.10.128.250 +add test 10.10.128.251 +add test 10.10.128.252 +add test 10.10.128.253 +add test 10.10.128.254 +add test 10.10.128.255 +add test 10.10.128.26 +add test 10.10.128.27 +add test 10.10.128.28 +add test 10.10.128.29 +add test 10.10.128.3 +add test 10.10.128.30 +add test 10.10.128.31 +add test 10.10.128.32 +add test 10.10.128.33 +add test 10.10.128.34 +add test 10.10.128.35 +add test 10.10.128.36 +add test 10.10.128.37 +add test 10.10.128.38 +add test 10.10.128.39 +add test 10.10.128.4 +add test 10.10.128.40 +add test 10.10.128.41 +add test 10.10.128.42 +add test 10.10.128.43 +add test 10.10.128.44 +add test 10.10.128.45 +add test 10.10.128.46 +add test 10.10.128.47 +add test 10.10.128.48 +add test 10.10.128.49 +add test 10.10.128.5 +add test 10.10.128.50 +add test 10.10.128.51 +add test 10.10.128.52 +add test 10.10.128.53 +add test 10.10.128.54 +add test 10.10.128.55 +add test 10.10.128.56 +add test 10.10.128.57 +add test 10.10.128.58 +add test 10.10.128.59 +add test 10.10.128.6 +add test 10.10.128.60 +add test 10.10.128.61 +add test 10.10.128.62 +add test 10.10.128.63 +add test 10.10.128.64 +add test 10.10.128.65 +add test 10.10.128.66 +add test 10.10.128.67 +add test 10.10.128.68 +add test 10.10.128.69 +add test 10.10.128.7 +add test 10.10.128.70 +add test 10.10.128.71 +add test 10.10.128.72 +add test 10.10.128.73 +add test 10.10.128.74 +add test 10.10.128.75 +add test 10.10.128.76 +add test 10.10.128.77 +add test 10.10.128.78 +add test 10.10.128.79 +add test 10.10.128.8 +add test 10.10.128.80 +add test 10.10.128.81 +add test 10.10.128.82 +add test 10.10.128.83 +add test 10.10.128.84 +add test 10.10.128.85 +add test 10.10.128.86 +add test 10.10.128.87 +add test 10.10.128.88 +add test 10.10.128.89 +add test 10.10.128.9 +add test 10.10.128.90 +add test 10.10.128.91 +add test 10.10.128.92 +add test 10.10.128.93 +add test 10.10.128.94 +add test 10.10.128.95 +add test 10.10.128.96 +add test 10.10.128.97 +add test 10.10.128.98 +add test 10.10.128.99 +add test 10.10.129.0 +add test 10.10.129.1 +add test 10.10.129.10 +add test 10.10.129.100 +add test 10.10.129.101 +add test 10.10.129.102 +add test 10.10.129.103 +add test 10.10.129.104 +add test 10.10.129.105 +add test 10.10.129.106 +add test 10.10.129.107 +add test 10.10.129.108 +add test 10.10.129.109 +add test 10.10.129.11 +add test 10.10.129.110 +add test 10.10.129.111 +add test 10.10.129.112 +add test 10.10.129.113 +add test 10.10.129.114 +add test 10.10.129.115 +add test 10.10.129.116 +add test 10.10.129.117 +add test 10.10.129.118 +add test 10.10.129.119 +add test 10.10.129.12 +add test 10.10.129.120 +add test 10.10.129.121 +add test 10.10.129.122 +add test 10.10.129.123 +add test 10.10.129.124 +add test 10.10.129.125 +add test 10.10.129.126 +add test 10.10.129.127 +add test 10.10.129.128 +add test 10.10.129.129 +add test 10.10.129.13 +add test 10.10.129.130 +add test 10.10.129.131 +add test 10.10.129.132 +add test 10.10.129.133 +add test 10.10.129.134 +add test 10.10.129.135 +add test 10.10.129.136 +add test 10.10.129.137 +add test 10.10.129.138 +add test 10.10.129.139 +add test 10.10.129.14 +add test 10.10.129.140 +add test 10.10.129.141 +add test 10.10.129.142 +add test 10.10.129.143 +add test 10.10.129.144 +add test 10.10.129.145 +add test 10.10.129.146 +add test 10.10.129.147 +add test 10.10.129.148 +add test 10.10.129.149 +add test 10.10.129.15 +add test 10.10.129.150 +add test 10.10.129.151 +add test 10.10.129.152 +add test 10.10.129.153 +add test 10.10.129.154 +add test 10.10.129.155 +add test 10.10.129.156 +add test 10.10.129.157 +add test 10.10.129.158 +add test 10.10.129.159 +add test 10.10.129.16 +add test 10.10.129.160 +add test 10.10.129.161 +add test 10.10.129.162 +add test 10.10.129.163 +add test 10.10.129.164 +add test 10.10.129.165 +add test 10.10.129.166 +add test 10.10.129.167 +add test 10.10.129.168 +add test 10.10.129.169 +add test 10.10.129.17 +add test 10.10.129.170 +add test 10.10.129.171 +add test 10.10.129.172 +add test 10.10.129.173 +add test 10.10.129.174 +add test 10.10.129.175 +add test 10.10.129.176 +add test 10.10.129.177 +add test 10.10.129.178 +add test 10.10.129.179 +add test 10.10.129.18 +add test 10.10.129.180 +add test 10.10.129.181 +add test 10.10.129.182 +add test 10.10.129.183 +add test 10.10.129.184 +add test 10.10.129.185 +add test 10.10.129.186 +add test 10.10.129.187 +add test 10.10.129.188 +add test 10.10.129.189 +add test 10.10.129.19 +add test 10.10.129.190 +add test 10.10.129.191 +add test 10.10.129.192 +add test 10.10.129.193 +add test 10.10.129.194 +add test 10.10.129.195 +add test 10.10.129.196 +add test 10.10.129.197 +add test 10.10.129.198 +add test 10.10.129.199 +add test 10.10.129.2 +add test 10.10.129.20 +add test 10.10.129.200 +add test 10.10.129.201 +add test 10.10.129.202 +add test 10.10.129.203 +add test 10.10.129.204 +add test 10.10.129.205 +add test 10.10.129.206 +add test 10.10.129.207 +add test 10.10.129.208 +add test 10.10.129.209 +add test 10.10.129.21 +add test 10.10.129.210 +add test 10.10.129.211 +add test 10.10.129.212 +add test 10.10.129.213 +add test 10.10.129.214 +add test 10.10.129.215 +add test 10.10.129.216 +add test 10.10.129.217 +add test 10.10.129.218 +add test 10.10.129.219 +add test 10.10.129.22 +add test 10.10.129.220 +add test 10.10.129.221 +add test 10.10.129.222 +add test 10.10.129.223 +add test 10.10.129.224 +add test 10.10.129.225 +add test 10.10.129.226 +add test 10.10.129.227 +add test 10.10.129.228 +add test 10.10.129.229 +add test 10.10.129.23 +add test 10.10.129.230 +add test 10.10.129.231 +add test 10.10.129.232 +add test 10.10.129.233 +add test 10.10.129.234 +add test 10.10.129.235 +add test 10.10.129.236 +add test 10.10.129.237 +add test 10.10.129.238 +add test 10.10.129.239 +add test 10.10.129.24 +add test 10.10.129.240 +add test 10.10.129.241 +add test 10.10.129.242 +add test 10.10.129.243 +add test 10.10.129.244 +add test 10.10.129.245 +add test 10.10.129.246 +add test 10.10.129.247 +add test 10.10.129.248 +add test 10.10.129.249 +add test 10.10.129.25 +add test 10.10.129.250 +add test 10.10.129.251 +add test 10.10.129.252 +add test 10.10.129.253 +add test 10.10.129.254 +add test 10.10.129.255 +add test 10.10.129.26 +add test 10.10.129.27 +add test 10.10.129.28 +add test 10.10.129.29 +add test 10.10.129.3 +add test 10.10.129.30 +add test 10.10.129.31 +add test 10.10.129.32 +add test 10.10.129.33 +add test 10.10.129.34 +add test 10.10.129.35 +add test 10.10.129.36 +add test 10.10.129.37 +add test 10.10.129.38 +add test 10.10.129.39 +add test 10.10.129.4 +add test 10.10.129.40 +add test 10.10.129.41 +add test 10.10.129.42 +add test 10.10.129.43 +add test 10.10.129.44 +add test 10.10.129.45 +add test 10.10.129.46 +add test 10.10.129.47 +add test 10.10.129.48 +add test 10.10.129.49 +add test 10.10.129.5 +add test 10.10.129.50 +add test 10.10.129.51 +add test 10.10.129.52 +add test 10.10.129.53 +add test 10.10.129.54 +add test 10.10.129.55 +add test 10.10.129.56 +add test 10.10.129.57 +add test 10.10.129.58 +add test 10.10.129.59 +add test 10.10.129.6 +add test 10.10.129.60 +add test 10.10.129.61 +add test 10.10.129.62 +add test 10.10.129.63 +add test 10.10.129.64 +add test 10.10.129.65 +add test 10.10.129.66 +add test 10.10.129.67 +add test 10.10.129.68 +add test 10.10.129.69 +add test 10.10.129.7 +add test 10.10.129.70 +add test 10.10.129.71 +add test 10.10.129.72 +add test 10.10.129.73 +add test 10.10.129.74 +add test 10.10.129.75 +add test 10.10.129.76 +add test 10.10.129.77 +add test 10.10.129.78 +add test 10.10.129.79 +add test 10.10.129.8 +add test 10.10.129.80 +add test 10.10.129.81 +add test 10.10.129.82 +add test 10.10.129.83 +add test 10.10.129.84 +add test 10.10.129.85 +add test 10.10.129.86 +add test 10.10.129.87 +add test 10.10.129.88 +add test 10.10.129.89 +add test 10.10.129.9 +add test 10.10.129.90 +add test 10.10.129.91 +add test 10.10.129.92 +add test 10.10.129.93 +add test 10.10.129.94 +add test 10.10.129.95 +add test 10.10.129.96 +add test 10.10.129.97 +add test 10.10.129.98 +add test 10.10.129.99 +add test 10.10.13.0 +add test 10.10.13.1 +add test 10.10.13.10 +add test 10.10.13.100 +add test 10.10.13.101 +add test 10.10.13.102 +add test 10.10.13.103 +add test 10.10.13.104 +add test 10.10.13.105 +add test 10.10.13.106 +add test 10.10.13.107 +add test 10.10.13.108 +add test 10.10.13.109 +add test 10.10.13.11 +add test 10.10.13.110 +add test 10.10.13.111 +add test 10.10.13.112 +add test 10.10.13.113 +add test 10.10.13.114 +add test 10.10.13.115 +add test 10.10.13.116 +add test 10.10.13.117 +add test 10.10.13.118 +add test 10.10.13.119 +add test 10.10.13.12 +add test 10.10.13.120 +add test 10.10.13.121 +add test 10.10.13.122 +add test 10.10.13.123 +add test 10.10.13.124 +add test 10.10.13.125 +add test 10.10.13.126 +add test 10.10.13.127 +add test 10.10.13.128 +add test 10.10.13.129 +add test 10.10.13.13 +add test 10.10.13.130 +add test 10.10.13.131 +add test 10.10.13.132 +add test 10.10.13.133 +add test 10.10.13.134 +add test 10.10.13.135 +add test 10.10.13.136 +add test 10.10.13.137 +add test 10.10.13.138 +add test 10.10.13.139 +add test 10.10.13.14 +add test 10.10.13.140 +add test 10.10.13.141 +add test 10.10.13.142 +add test 10.10.13.143 +add test 10.10.13.144 +add test 10.10.13.145 +add test 10.10.13.146 +add test 10.10.13.147 +add test 10.10.13.148 +add test 10.10.13.149 +add test 10.10.13.15 +add test 10.10.13.150 +add test 10.10.13.151 +add test 10.10.13.152 +add test 10.10.13.153 +add test 10.10.13.154 +add test 10.10.13.155 +add test 10.10.13.156 +add test 10.10.13.157 +add test 10.10.13.158 +add test 10.10.13.159 +add test 10.10.13.16 +add test 10.10.13.160 +add test 10.10.13.161 +add test 10.10.13.162 +add test 10.10.13.163 +add test 10.10.13.164 +add test 10.10.13.165 +add test 10.10.13.166 +add test 10.10.13.167 +add test 10.10.13.168 +add test 10.10.13.169 +add test 10.10.13.17 +add test 10.10.13.170 +add test 10.10.13.171 +add test 10.10.13.172 +add test 10.10.13.173 +add test 10.10.13.174 +add test 10.10.13.175 +add test 10.10.13.176 +add test 10.10.13.177 +add test 10.10.13.178 +add test 10.10.13.179 +add test 10.10.13.18 +add test 10.10.13.180 +add test 10.10.13.181 +add test 10.10.13.182 +add test 10.10.13.183 +add test 10.10.13.184 +add test 10.10.13.185 +add test 10.10.13.186 +add test 10.10.13.187 +add test 10.10.13.188 +add test 10.10.13.189 +add test 10.10.13.19 +add test 10.10.13.190 +add test 10.10.13.191 +add test 10.10.13.192 +add test 10.10.13.193 +add test 10.10.13.194 +add test 10.10.13.195 +add test 10.10.13.196 +add test 10.10.13.197 +add test 10.10.13.198 +add test 10.10.13.199 +add test 10.10.13.2 +add test 10.10.13.20 +add test 10.10.13.200 +add test 10.10.13.201 +add test 10.10.13.202 +add test 10.10.13.203 +add test 10.10.13.204 +add test 10.10.13.205 +add test 10.10.13.206 +add test 10.10.13.207 +add test 10.10.13.208 +add test 10.10.13.209 +add test 10.10.13.21 +add test 10.10.13.210 +add test 10.10.13.211 +add test 10.10.13.212 +add test 10.10.13.213 +add test 10.10.13.214 +add test 10.10.13.215 +add test 10.10.13.216 +add test 10.10.13.217 +add test 10.10.13.218 +add test 10.10.13.219 +add test 10.10.13.22 +add test 10.10.13.220 +add test 10.10.13.221 +add test 10.10.13.222 +add test 10.10.13.223 +add test 10.10.13.224 +add test 10.10.13.225 +add test 10.10.13.226 +add test 10.10.13.227 +add test 10.10.13.228 +add test 10.10.13.229 +add test 10.10.13.23 +add test 10.10.13.230 +add test 10.10.13.231 +add test 10.10.13.232 +add test 10.10.13.233 +add test 10.10.13.234 +add test 10.10.13.235 +add test 10.10.13.236 +add test 10.10.13.237 +add test 10.10.13.238 +add test 10.10.13.239 +add test 10.10.13.24 +add test 10.10.13.240 +add test 10.10.13.241 +add test 10.10.13.242 +add test 10.10.13.243 +add test 10.10.13.244 +add test 10.10.13.245 +add test 10.10.13.246 +add test 10.10.13.247 +add test 10.10.13.248 +add test 10.10.13.249 +add test 10.10.13.25 +add test 10.10.13.250 +add test 10.10.13.251 +add test 10.10.13.252 +add test 10.10.13.253 +add test 10.10.13.254 +add test 10.10.13.255 +add test 10.10.13.26 +add test 10.10.13.27 +add test 10.10.13.28 +add test 10.10.13.29 +add test 10.10.13.3 +add test 10.10.13.30 +add test 10.10.13.31 +add test 10.10.13.32 +add test 10.10.13.33 +add test 10.10.13.34 +add test 10.10.13.35 +add test 10.10.13.36 +add test 10.10.13.37 +add test 10.10.13.38 +add test 10.10.13.39 +add test 10.10.13.4 +add test 10.10.13.40 +add test 10.10.13.41 +add test 10.10.13.42 +add test 10.10.13.43 +add test 10.10.13.44 +add test 10.10.13.45 +add test 10.10.13.46 +add test 10.10.13.47 +add test 10.10.13.48 +add test 10.10.13.49 +add test 10.10.13.5 +add test 10.10.13.50 +add test 10.10.13.51 +add test 10.10.13.52 +add test 10.10.13.53 +add test 10.10.13.54 +add test 10.10.13.55 +add test 10.10.13.56 +add test 10.10.13.57 +add test 10.10.13.58 +add test 10.10.13.59 +add test 10.10.13.6 +add test 10.10.13.60 +add test 10.10.13.61 +add test 10.10.13.62 +add test 10.10.13.63 +add test 10.10.13.64 +add test 10.10.13.65 +add test 10.10.13.66 +add test 10.10.13.67 +add test 10.10.13.68 +add test 10.10.13.69 +add test 10.10.13.7 +add test 10.10.13.70 +add test 10.10.13.71 +add test 10.10.13.72 +add test 10.10.13.73 +add test 10.10.13.74 +add test 10.10.13.75 +add test 10.10.13.76 +add test 10.10.13.77 +add test 10.10.13.78 +add test 10.10.13.79 +add test 10.10.13.8 +add test 10.10.13.80 +add test 10.10.13.81 +add test 10.10.13.82 +add test 10.10.13.83 +add test 10.10.13.84 +add test 10.10.13.85 +add test 10.10.13.86 +add test 10.10.13.87 +add test 10.10.13.88 +add test 10.10.13.89 +add test 10.10.13.9 +add test 10.10.13.90 +add test 10.10.13.91 +add test 10.10.13.92 +add test 10.10.13.93 +add test 10.10.13.94 +add test 10.10.13.95 +add test 10.10.13.96 +add test 10.10.13.97 +add test 10.10.13.98 +add test 10.10.13.99 +add test 10.10.130.0 +add test 10.10.130.1 +add test 10.10.130.10 +add test 10.10.130.100 +add test 10.10.130.101 +add test 10.10.130.102 +add test 10.10.130.103 +add test 10.10.130.104 +add test 10.10.130.105 +add test 10.10.130.106 +add test 10.10.130.107 +add test 10.10.130.108 +add test 10.10.130.109 +add test 10.10.130.11 +add test 10.10.130.110 +add test 10.10.130.111 +add test 10.10.130.112 +add test 10.10.130.113 +add test 10.10.130.114 +add test 10.10.130.115 +add test 10.10.130.116 +add test 10.10.130.117 +add test 10.10.130.118 +add test 10.10.130.119 +add test 10.10.130.12 +add test 10.10.130.120 +add test 10.10.130.121 +add test 10.10.130.122 +add test 10.10.130.123 +add test 10.10.130.124 +add test 10.10.130.125 +add test 10.10.130.126 +add test 10.10.130.127 +add test 10.10.130.128 +add test 10.10.130.129 +add test 10.10.130.13 +add test 10.10.130.130 +add test 10.10.130.131 +add test 10.10.130.132 +add test 10.10.130.133 +add test 10.10.130.134 +add test 10.10.130.135 +add test 10.10.130.136 +add test 10.10.130.137 +add test 10.10.130.138 +add test 10.10.130.139 +add test 10.10.130.14 +add test 10.10.130.140 +add test 10.10.130.141 +add test 10.10.130.142 +add test 10.10.130.143 +add test 10.10.130.144 +add test 10.10.130.145 +add test 10.10.130.146 +add test 10.10.130.147 +add test 10.10.130.148 +add test 10.10.130.149 +add test 10.10.130.15 +add test 10.10.130.150 +add test 10.10.130.151 +add test 10.10.130.152 +add test 10.10.130.153 +add test 10.10.130.154 +add test 10.10.130.155 +add test 10.10.130.156 +add test 10.10.130.157 +add test 10.10.130.158 +add test 10.10.130.159 +add test 10.10.130.16 +add test 10.10.130.160 +add test 10.10.130.161 +add test 10.10.130.162 +add test 10.10.130.163 +add test 10.10.130.164 +add test 10.10.130.165 +add test 10.10.130.166 +add test 10.10.130.167 +add test 10.10.130.168 +add test 10.10.130.169 +add test 10.10.130.17 +add test 10.10.130.170 +add test 10.10.130.171 +add test 10.10.130.172 +add test 10.10.130.173 +add test 10.10.130.174 +add test 10.10.130.175 +add test 10.10.130.176 +add test 10.10.130.177 +add test 10.10.130.178 +add test 10.10.130.179 +add test 10.10.130.18 +add test 10.10.130.180 +add test 10.10.130.181 +add test 10.10.130.182 +add test 10.10.130.183 +add test 10.10.130.184 +add test 10.10.130.185 +add test 10.10.130.186 +add test 10.10.130.187 +add test 10.10.130.188 +add test 10.10.130.189 +add test 10.10.130.19 +add test 10.10.130.190 +add test 10.10.130.191 +add test 10.10.130.192 +add test 10.10.130.193 +add test 10.10.130.194 +add test 10.10.130.195 +add test 10.10.130.196 +add test 10.10.130.197 +add test 10.10.130.198 +add test 10.10.130.199 +add test 10.10.130.2 +add test 10.10.130.20 +add test 10.10.130.200 +add test 10.10.130.201 +add test 10.10.130.202 +add test 10.10.130.203 +add test 10.10.130.204 +add test 10.10.130.205 +add test 10.10.130.206 +add test 10.10.130.207 +add test 10.10.130.208 +add test 10.10.130.209 +add test 10.10.130.21 +add test 10.10.130.210 +add test 10.10.130.211 +add test 10.10.130.212 +add test 10.10.130.213 +add test 10.10.130.214 +add test 10.10.130.215 +add test 10.10.130.216 +add test 10.10.130.217 +add test 10.10.130.218 +add test 10.10.130.219 +add test 10.10.130.22 +add test 10.10.130.220 +add test 10.10.130.221 +add test 10.10.130.222 +add test 10.10.130.223 +add test 10.10.130.224 +add test 10.10.130.225 +add test 10.10.130.226 +add test 10.10.130.227 +add test 10.10.130.228 +add test 10.10.130.229 +add test 10.10.130.23 +add test 10.10.130.230 +add test 10.10.130.231 +add test 10.10.130.232 +add test 10.10.130.233 +add test 10.10.130.234 +add test 10.10.130.235 +add test 10.10.130.236 +add test 10.10.130.237 +add test 10.10.130.238 +add test 10.10.130.239 +add test 10.10.130.24 +add test 10.10.130.240 +add test 10.10.130.241 +add test 10.10.130.242 +add test 10.10.130.243 +add test 10.10.130.244 +add test 10.10.130.245 +add test 10.10.130.246 +add test 10.10.130.247 +add test 10.10.130.248 +add test 10.10.130.249 +add test 10.10.130.25 +add test 10.10.130.250 +add test 10.10.130.251 +add test 10.10.130.252 +add test 10.10.130.253 +add test 10.10.130.254 +add test 10.10.130.255 +add test 10.10.130.26 +add test 10.10.130.27 +add test 10.10.130.28 +add test 10.10.130.29 +add test 10.10.130.3 +add test 10.10.130.30 +add test 10.10.130.31 +add test 10.10.130.32 +add test 10.10.130.33 +add test 10.10.130.34 +add test 10.10.130.35 +add test 10.10.130.36 +add test 10.10.130.37 +add test 10.10.130.38 +add test 10.10.130.39 +add test 10.10.130.4 +add test 10.10.130.40 +add test 10.10.130.41 +add test 10.10.130.42 +add test 10.10.130.43 +add test 10.10.130.44 +add test 10.10.130.45 +add test 10.10.130.46 +add test 10.10.130.47 +add test 10.10.130.48 +add test 10.10.130.49 +add test 10.10.130.5 +add test 10.10.130.50 +add test 10.10.130.51 +add test 10.10.130.52 +add test 10.10.130.53 +add test 10.10.130.54 +add test 10.10.130.55 +add test 10.10.130.56 +add test 10.10.130.57 +add test 10.10.130.58 +add test 10.10.130.59 +add test 10.10.130.6 +add test 10.10.130.60 +add test 10.10.130.61 +add test 10.10.130.62 +add test 10.10.130.63 +add test 10.10.130.64 +add test 10.10.130.65 +add test 10.10.130.66 +add test 10.10.130.67 +add test 10.10.130.68 +add test 10.10.130.69 +add test 10.10.130.7 +add test 10.10.130.70 +add test 10.10.130.71 +add test 10.10.130.72 +add test 10.10.130.73 +add test 10.10.130.74 +add test 10.10.130.75 +add test 10.10.130.76 +add test 10.10.130.77 +add test 10.10.130.78 +add test 10.10.130.79 +add test 10.10.130.8 +add test 10.10.130.80 +add test 10.10.130.81 +add test 10.10.130.82 +add test 10.10.130.83 +add test 10.10.130.84 +add test 10.10.130.85 +add test 10.10.130.86 +add test 10.10.130.87 +add test 10.10.130.88 +add test 10.10.130.89 +add test 10.10.130.9 +add test 10.10.130.90 +add test 10.10.130.91 +add test 10.10.130.92 +add test 10.10.130.93 +add test 10.10.130.94 +add test 10.10.130.95 +add test 10.10.130.96 +add test 10.10.130.97 +add test 10.10.130.98 +add test 10.10.130.99 +add test 10.10.131.0 +add test 10.10.131.1 +add test 10.10.131.10 +add test 10.10.131.100 +add test 10.10.131.101 +add test 10.10.131.102 +add test 10.10.131.103 +add test 10.10.131.104 +add test 10.10.131.105 +add test 10.10.131.106 +add test 10.10.131.107 +add test 10.10.131.108 +add test 10.10.131.109 +add test 10.10.131.11 +add test 10.10.131.110 +add test 10.10.131.111 +add test 10.10.131.112 +add test 10.10.131.113 +add test 10.10.131.114 +add test 10.10.131.115 +add test 10.10.131.116 +add test 10.10.131.117 +add test 10.10.131.118 +add test 10.10.131.119 +add test 10.10.131.12 +add test 10.10.131.120 +add test 10.10.131.121 +add test 10.10.131.122 +add test 10.10.131.123 +add test 10.10.131.124 +add test 10.10.131.125 +add test 10.10.131.126 +add test 10.10.131.127 +add test 10.10.131.128 +add test 10.10.131.129 +add test 10.10.131.13 +add test 10.10.131.130 +add test 10.10.131.131 +add test 10.10.131.132 +add test 10.10.131.133 +add test 10.10.131.134 +add test 10.10.131.135 +add test 10.10.131.136 +add test 10.10.131.137 +add test 10.10.131.138 +add test 10.10.131.139 +add test 10.10.131.14 +add test 10.10.131.140 +add test 10.10.131.141 +add test 10.10.131.142 +add test 10.10.131.143 +add test 10.10.131.144 +add test 10.10.131.145 +add test 10.10.131.146 +add test 10.10.131.147 +add test 10.10.131.148 +add test 10.10.131.149 +add test 10.10.131.15 +add test 10.10.131.150 +add test 10.10.131.151 +add test 10.10.131.152 +add test 10.10.131.153 +add test 10.10.131.154 +add test 10.10.131.155 +add test 10.10.131.156 +add test 10.10.131.157 +add test 10.10.131.158 +add test 10.10.131.159 +add test 10.10.131.16 +add test 10.10.131.160 +add test 10.10.131.161 +add test 10.10.131.162 +add test 10.10.131.163 +add test 10.10.131.164 +add test 10.10.131.165 +add test 10.10.131.166 +add test 10.10.131.167 +add test 10.10.131.168 +add test 10.10.131.169 +add test 10.10.131.17 +add test 10.10.131.170 +add test 10.10.131.171 +add test 10.10.131.172 +add test 10.10.131.173 +add test 10.10.131.174 +add test 10.10.131.175 +add test 10.10.131.176 +add test 10.10.131.177 +add test 10.10.131.178 +add test 10.10.131.179 +add test 10.10.131.18 +add test 10.10.131.180 +add test 10.10.131.181 +add test 10.10.131.182 +add test 10.10.131.183 +add test 10.10.131.184 +add test 10.10.131.185 +add test 10.10.131.186 +add test 10.10.131.187 +add test 10.10.131.188 +add test 10.10.131.189 +add test 10.10.131.19 +add test 10.10.131.190 +add test 10.10.131.191 +add test 10.10.131.192 +add test 10.10.131.193 +add test 10.10.131.194 +add test 10.10.131.195 +add test 10.10.131.196 +add test 10.10.131.197 +add test 10.10.131.198 +add test 10.10.131.199 +add test 10.10.131.2 +add test 10.10.131.20 +add test 10.10.131.200 +add test 10.10.131.201 +add test 10.10.131.202 +add test 10.10.131.203 +add test 10.10.131.204 +add test 10.10.131.205 +add test 10.10.131.206 +add test 10.10.131.207 +add test 10.10.131.208 +add test 10.10.131.209 +add test 10.10.131.21 +add test 10.10.131.210 +add test 10.10.131.211 +add test 10.10.131.212 +add test 10.10.131.213 +add test 10.10.131.214 +add test 10.10.131.215 +add test 10.10.131.216 +add test 10.10.131.217 +add test 10.10.131.218 +add test 10.10.131.219 +add test 10.10.131.22 +add test 10.10.131.220 +add test 10.10.131.221 +add test 10.10.131.222 +add test 10.10.131.223 +add test 10.10.131.224 +add test 10.10.131.225 +add test 10.10.131.226 +add test 10.10.131.227 +add test 10.10.131.228 +add test 10.10.131.229 +add test 10.10.131.23 +add test 10.10.131.230 +add test 10.10.131.231 +add test 10.10.131.232 +add test 10.10.131.233 +add test 10.10.131.234 +add test 10.10.131.235 +add test 10.10.131.236 +add test 10.10.131.237 +add test 10.10.131.238 +add test 10.10.131.239 +add test 10.10.131.24 +add test 10.10.131.240 +add test 10.10.131.241 +add test 10.10.131.242 +add test 10.10.131.243 +add test 10.10.131.244 +add test 10.10.131.245 +add test 10.10.131.246 +add test 10.10.131.247 +add test 10.10.131.248 +add test 10.10.131.249 +add test 10.10.131.25 +add test 10.10.131.250 +add test 10.10.131.251 +add test 10.10.131.252 +add test 10.10.131.253 +add test 10.10.131.254 +add test 10.10.131.255 +add test 10.10.131.26 +add test 10.10.131.27 +add test 10.10.131.28 +add test 10.10.131.29 +add test 10.10.131.3 +add test 10.10.131.30 +add test 10.10.131.31 +add test 10.10.131.32 +add test 10.10.131.33 +add test 10.10.131.34 +add test 10.10.131.35 +add test 10.10.131.36 +add test 10.10.131.37 +add test 10.10.131.38 +add test 10.10.131.39 +add test 10.10.131.4 +add test 10.10.131.40 +add test 10.10.131.41 +add test 10.10.131.42 +add test 10.10.131.43 +add test 10.10.131.44 +add test 10.10.131.45 +add test 10.10.131.46 +add test 10.10.131.47 +add test 10.10.131.48 +add test 10.10.131.49 +add test 10.10.131.5 +add test 10.10.131.50 +add test 10.10.131.51 +add test 10.10.131.52 +add test 10.10.131.53 +add test 10.10.131.54 +add test 10.10.131.55 +add test 10.10.131.56 +add test 10.10.131.57 +add test 10.10.131.58 +add test 10.10.131.59 +add test 10.10.131.6 +add test 10.10.131.60 +add test 10.10.131.61 +add test 10.10.131.62 +add test 10.10.131.63 +add test 10.10.131.64 +add test 10.10.131.65 +add test 10.10.131.66 +add test 10.10.131.67 +add test 10.10.131.68 +add test 10.10.131.69 +add test 10.10.131.7 +add test 10.10.131.70 +add test 10.10.131.71 +add test 10.10.131.72 +add test 10.10.131.73 +add test 10.10.131.74 +add test 10.10.131.75 +add test 10.10.131.76 +add test 10.10.131.77 +add test 10.10.131.78 +add test 10.10.131.79 +add test 10.10.131.8 +add test 10.10.131.80 +add test 10.10.131.81 +add test 10.10.131.82 +add test 10.10.131.83 +add test 10.10.131.84 +add test 10.10.131.85 +add test 10.10.131.86 +add test 10.10.131.87 +add test 10.10.131.88 +add test 10.10.131.89 +add test 10.10.131.9 +add test 10.10.131.90 +add test 10.10.131.91 +add test 10.10.131.92 +add test 10.10.131.93 +add test 10.10.131.94 +add test 10.10.131.95 +add test 10.10.131.96 +add test 10.10.131.97 +add test 10.10.131.98 +add test 10.10.131.99 +add test 10.10.132.0 +add test 10.10.132.1 +add test 10.10.132.10 +add test 10.10.132.100 +add test 10.10.132.101 +add test 10.10.132.102 +add test 10.10.132.103 +add test 10.10.132.104 +add test 10.10.132.105 +add test 10.10.132.106 +add test 10.10.132.107 +add test 10.10.132.108 +add test 10.10.132.109 +add test 10.10.132.11 +add test 10.10.132.110 +add test 10.10.132.111 +add test 10.10.132.112 +add test 10.10.132.113 +add test 10.10.132.114 +add test 10.10.132.115 +add test 10.10.132.116 +add test 10.10.132.117 +add test 10.10.132.118 +add test 10.10.132.119 +add test 10.10.132.12 +add test 10.10.132.120 +add test 10.10.132.121 +add test 10.10.132.122 +add test 10.10.132.123 +add test 10.10.132.124 +add test 10.10.132.125 +add test 10.10.132.126 +add test 10.10.132.127 +add test 10.10.132.128 +add test 10.10.132.129 +add test 10.10.132.13 +add test 10.10.132.130 +add test 10.10.132.131 +add test 10.10.132.132 +add test 10.10.132.133 +add test 10.10.132.134 +add test 10.10.132.135 +add test 10.10.132.136 +add test 10.10.132.137 +add test 10.10.132.138 +add test 10.10.132.139 +add test 10.10.132.14 +add test 10.10.132.140 +add test 10.10.132.141 +add test 10.10.132.142 +add test 10.10.132.143 +add test 10.10.132.144 +add test 10.10.132.145 +add test 10.10.132.146 +add test 10.10.132.147 +add test 10.10.132.148 +add test 10.10.132.149 +add test 10.10.132.15 +add test 10.10.132.150 +add test 10.10.132.151 +add test 10.10.132.152 +add test 10.10.132.153 +add test 10.10.132.154 +add test 10.10.132.155 +add test 10.10.132.156 +add test 10.10.132.157 +add test 10.10.132.158 +add test 10.10.132.159 +add test 10.10.132.16 +add test 10.10.132.160 +add test 10.10.132.161 +add test 10.10.132.162 +add test 10.10.132.163 +add test 10.10.132.164 +add test 10.10.132.165 +add test 10.10.132.166 +add test 10.10.132.167 +add test 10.10.132.168 +add test 10.10.132.169 +add test 10.10.132.17 +add test 10.10.132.170 +add test 10.10.132.171 +add test 10.10.132.172 +add test 10.10.132.173 +add test 10.10.132.174 +add test 10.10.132.175 +add test 10.10.132.176 +add test 10.10.132.177 +add test 10.10.132.178 +add test 10.10.132.179 +add test 10.10.132.18 +add test 10.10.132.180 +add test 10.10.132.181 +add test 10.10.132.182 +add test 10.10.132.183 +add test 10.10.132.184 +add test 10.10.132.185 +add test 10.10.132.186 +add test 10.10.132.187 +add test 10.10.132.188 +add test 10.10.132.189 +add test 10.10.132.19 +add test 10.10.132.190 +add test 10.10.132.191 +add test 10.10.132.192 +add test 10.10.132.193 +add test 10.10.132.194 +add test 10.10.132.195 +add test 10.10.132.196 +add test 10.10.132.197 +add test 10.10.132.198 +add test 10.10.132.199 +add test 10.10.132.2 +add test 10.10.132.20 +add test 10.10.132.200 +add test 10.10.132.201 +add test 10.10.132.202 +add test 10.10.132.203 +add test 10.10.132.204 +add test 10.10.132.205 +add test 10.10.132.206 +add test 10.10.132.207 +add test 10.10.132.208 +add test 10.10.132.209 +add test 10.10.132.21 +add test 10.10.132.210 +add test 10.10.132.211 +add test 10.10.132.212 +add test 10.10.132.213 +add test 10.10.132.214 +add test 10.10.132.215 +add test 10.10.132.216 +add test 10.10.132.217 +add test 10.10.132.218 +add test 10.10.132.219 +add test 10.10.132.22 +add test 10.10.132.220 +add test 10.10.132.221 +add test 10.10.132.222 +add test 10.10.132.223 +add test 10.10.132.224 +add test 10.10.132.225 +add test 10.10.132.226 +add test 10.10.132.227 +add test 10.10.132.228 +add test 10.10.132.229 +add test 10.10.132.23 +add test 10.10.132.230 +add test 10.10.132.231 +add test 10.10.132.232 +add test 10.10.132.233 +add test 10.10.132.234 +add test 10.10.132.235 +add test 10.10.132.236 +add test 10.10.132.237 +add test 10.10.132.238 +add test 10.10.132.239 +add test 10.10.132.24 +add test 10.10.132.240 +add test 10.10.132.241 +add test 10.10.132.242 +add test 10.10.132.243 +add test 10.10.132.244 +add test 10.10.132.245 +add test 10.10.132.246 +add test 10.10.132.247 +add test 10.10.132.248 +add test 10.10.132.249 +add test 10.10.132.25 +add test 10.10.132.250 +add test 10.10.132.251 +add test 10.10.132.252 +add test 10.10.132.253 +add test 10.10.132.254 +add test 10.10.132.255 +add test 10.10.132.26 +add test 10.10.132.27 +add test 10.10.132.28 +add test 10.10.132.29 +add test 10.10.132.3 +add test 10.10.132.30 +add test 10.10.132.31 +add test 10.10.132.32 +add test 10.10.132.33 +add test 10.10.132.34 +add test 10.10.132.35 +add test 10.10.132.36 +add test 10.10.132.37 +add test 10.10.132.38 +add test 10.10.132.39 +add test 10.10.132.4 +add test 10.10.132.40 +add test 10.10.132.41 +add test 10.10.132.42 +add test 10.10.132.43 +add test 10.10.132.44 +add test 10.10.132.45 +add test 10.10.132.46 +add test 10.10.132.47 +add test 10.10.132.48 +add test 10.10.132.49 +add test 10.10.132.5 +add test 10.10.132.50 +add test 10.10.132.51 +add test 10.10.132.52 +add test 10.10.132.53 +add test 10.10.132.54 +add test 10.10.132.55 +add test 10.10.132.56 +add test 10.10.132.57 +add test 10.10.132.58 +add test 10.10.132.59 +add test 10.10.132.6 +add test 10.10.132.60 +add test 10.10.132.61 +add test 10.10.132.62 +add test 10.10.132.63 +add test 10.10.132.64 +add test 10.10.132.65 +add test 10.10.132.66 +add test 10.10.132.67 +add test 10.10.132.68 +add test 10.10.132.69 +add test 10.10.132.7 +add test 10.10.132.70 +add test 10.10.132.71 +add test 10.10.132.72 +add test 10.10.132.73 +add test 10.10.132.74 +add test 10.10.132.75 +add test 10.10.132.76 +add test 10.10.132.77 +add test 10.10.132.78 +add test 10.10.132.79 +add test 10.10.132.8 +add test 10.10.132.80 +add test 10.10.132.81 +add test 10.10.132.82 +add test 10.10.132.83 +add test 10.10.132.84 +add test 10.10.132.85 +add test 10.10.132.86 +add test 10.10.132.87 +add test 10.10.132.88 +add test 10.10.132.89 +add test 10.10.132.9 +add test 10.10.132.90 +add test 10.10.132.91 +add test 10.10.132.92 +add test 10.10.132.93 +add test 10.10.132.94 +add test 10.10.132.95 +add test 10.10.132.96 +add test 10.10.132.97 +add test 10.10.132.98 +add test 10.10.132.99 +add test 10.10.133.0 +add test 10.10.133.1 +add test 10.10.133.10 +add test 10.10.133.100 +add test 10.10.133.101 +add test 10.10.133.102 +add test 10.10.133.103 +add test 10.10.133.104 +add test 10.10.133.105 +add test 10.10.133.106 +add test 10.10.133.107 +add test 10.10.133.108 +add test 10.10.133.109 +add test 10.10.133.11 +add test 10.10.133.110 +add test 10.10.133.111 +add test 10.10.133.112 +add test 10.10.133.113 +add test 10.10.133.114 +add test 10.10.133.115 +add test 10.10.133.116 +add test 10.10.133.117 +add test 10.10.133.118 +add test 10.10.133.119 +add test 10.10.133.12 +add test 10.10.133.120 +add test 10.10.133.121 +add test 10.10.133.122 +add test 10.10.133.123 +add test 10.10.133.124 +add test 10.10.133.125 +add test 10.10.133.126 +add test 10.10.133.127 +add test 10.10.133.128 +add test 10.10.133.129 +add test 10.10.133.13 +add test 10.10.133.130 +add test 10.10.133.131 +add test 10.10.133.132 +add test 10.10.133.133 +add test 10.10.133.134 +add test 10.10.133.135 +add test 10.10.133.136 +add test 10.10.133.137 +add test 10.10.133.138 +add test 10.10.133.139 +add test 10.10.133.14 +add test 10.10.133.140 +add test 10.10.133.141 +add test 10.10.133.142 +add test 10.10.133.143 +add test 10.10.133.144 +add test 10.10.133.145 +add test 10.10.133.146 +add test 10.10.133.147 +add test 10.10.133.148 +add test 10.10.133.149 +add test 10.10.133.15 +add test 10.10.133.150 +add test 10.10.133.151 +add test 10.10.133.152 +add test 10.10.133.153 +add test 10.10.133.154 +add test 10.10.133.155 +add test 10.10.133.156 +add test 10.10.133.157 +add test 10.10.133.158 +add test 10.10.133.159 +add test 10.10.133.16 +add test 10.10.133.160 +add test 10.10.133.161 +add test 10.10.133.162 +add test 10.10.133.163 +add test 10.10.133.164 +add test 10.10.133.165 +add test 10.10.133.166 +add test 10.10.133.167 +add test 10.10.133.168 +add test 10.10.133.169 +add test 10.10.133.17 +add test 10.10.133.170 +add test 10.10.133.171 +add test 10.10.133.172 +add test 10.10.133.173 +add test 10.10.133.174 +add test 10.10.133.175 +add test 10.10.133.176 +add test 10.10.133.177 +add test 10.10.133.178 +add test 10.10.133.179 +add test 10.10.133.18 +add test 10.10.133.180 +add test 10.10.133.181 +add test 10.10.133.182 +add test 10.10.133.183 +add test 10.10.133.184 +add test 10.10.133.185 +add test 10.10.133.186 +add test 10.10.133.187 +add test 10.10.133.188 +add test 10.10.133.189 +add test 10.10.133.19 +add test 10.10.133.190 +add test 10.10.133.191 +add test 10.10.133.192 +add test 10.10.133.193 +add test 10.10.133.194 +add test 10.10.133.195 +add test 10.10.133.196 +add test 10.10.133.197 +add test 10.10.133.198 +add test 10.10.133.199 +add test 10.10.133.2 +add test 10.10.133.20 +add test 10.10.133.200 +add test 10.10.133.201 +add test 10.10.133.202 +add test 10.10.133.203 +add test 10.10.133.204 +add test 10.10.133.205 +add test 10.10.133.206 +add test 10.10.133.207 +add test 10.10.133.208 +add test 10.10.133.209 +add test 10.10.133.21 +add test 10.10.133.210 +add test 10.10.133.211 +add test 10.10.133.212 +add test 10.10.133.213 +add test 10.10.133.214 +add test 10.10.133.215 +add test 10.10.133.216 +add test 10.10.133.217 +add test 10.10.133.218 +add test 10.10.133.219 +add test 10.10.133.22 +add test 10.10.133.220 +add test 10.10.133.221 +add test 10.10.133.222 +add test 10.10.133.223 +add test 10.10.133.224 +add test 10.10.133.225 +add test 10.10.133.226 +add test 10.10.133.227 +add test 10.10.133.228 +add test 10.10.133.229 +add test 10.10.133.23 +add test 10.10.133.230 +add test 10.10.133.231 +add test 10.10.133.232 +add test 10.10.133.233 +add test 10.10.133.234 +add test 10.10.133.235 +add test 10.10.133.236 +add test 10.10.133.237 +add test 10.10.133.238 +add test 10.10.133.239 +add test 10.10.133.24 +add test 10.10.133.240 +add test 10.10.133.241 +add test 10.10.133.242 +add test 10.10.133.243 +add test 10.10.133.244 +add test 10.10.133.245 +add test 10.10.133.246 +add test 10.10.133.247 +add test 10.10.133.248 +add test 10.10.133.249 +add test 10.10.133.25 +add test 10.10.133.250 +add test 10.10.133.251 +add test 10.10.133.252 +add test 10.10.133.253 +add test 10.10.133.254 +add test 10.10.133.255 +add test 10.10.133.26 +add test 10.10.133.27 +add test 10.10.133.28 +add test 10.10.133.29 +add test 10.10.133.3 +add test 10.10.133.30 +add test 10.10.133.31 +add test 10.10.133.32 +add test 10.10.133.33 +add test 10.10.133.34 +add test 10.10.133.35 +add test 10.10.133.36 +add test 10.10.133.37 +add test 10.10.133.38 +add test 10.10.133.39 +add test 10.10.133.4 +add test 10.10.133.40 +add test 10.10.133.41 +add test 10.10.133.42 +add test 10.10.133.43 +add test 10.10.133.44 +add test 10.10.133.45 +add test 10.10.133.46 +add test 10.10.133.47 +add test 10.10.133.48 +add test 10.10.133.49 +add test 10.10.133.5 +add test 10.10.133.50 +add test 10.10.133.51 +add test 10.10.133.52 +add test 10.10.133.53 +add test 10.10.133.54 +add test 10.10.133.55 +add test 10.10.133.56 +add test 10.10.133.57 +add test 10.10.133.58 +add test 10.10.133.59 +add test 10.10.133.6 +add test 10.10.133.60 +add test 10.10.133.61 +add test 10.10.133.62 +add test 10.10.133.63 +add test 10.10.133.64 +add test 10.10.133.65 +add test 10.10.133.66 +add test 10.10.133.67 +add test 10.10.133.68 +add test 10.10.133.69 +add test 10.10.133.7 +add test 10.10.133.70 +add test 10.10.133.71 +add test 10.10.133.72 +add test 10.10.133.73 +add test 10.10.133.74 +add test 10.10.133.75 +add test 10.10.133.76 +add test 10.10.133.77 +add test 10.10.133.78 +add test 10.10.133.79 +add test 10.10.133.8 +add test 10.10.133.80 +add test 10.10.133.81 +add test 10.10.133.82 +add test 10.10.133.83 +add test 10.10.133.84 +add test 10.10.133.85 +add test 10.10.133.86 +add test 10.10.133.87 +add test 10.10.133.88 +add test 10.10.133.89 +add test 10.10.133.9 +add test 10.10.133.90 +add test 10.10.133.91 +add test 10.10.133.92 +add test 10.10.133.93 +add test 10.10.133.94 +add test 10.10.133.95 +add test 10.10.133.96 +add test 10.10.133.97 +add test 10.10.133.98 +add test 10.10.133.99 +add test 10.10.134.0 +add test 10.10.134.1 +add test 10.10.134.10 +add test 10.10.134.100 +add test 10.10.134.101 +add test 10.10.134.102 +add test 10.10.134.103 +add test 10.10.134.104 +add test 10.10.134.105 +add test 10.10.134.106 +add test 10.10.134.107 +add test 10.10.134.108 +add test 10.10.134.109 +add test 10.10.134.11 +add test 10.10.134.110 +add test 10.10.134.111 +add test 10.10.134.112 +add test 10.10.134.113 +add test 10.10.134.114 +add test 10.10.134.115 +add test 10.10.134.116 +add test 10.10.134.117 +add test 10.10.134.118 +add test 10.10.134.119 +add test 10.10.134.12 +add test 10.10.134.120 +add test 10.10.134.121 +add test 10.10.134.122 +add test 10.10.134.123 +add test 10.10.134.124 +add test 10.10.134.125 +add test 10.10.134.126 +add test 10.10.134.127 +add test 10.10.134.128 +add test 10.10.134.129 +add test 10.10.134.13 +add test 10.10.134.130 +add test 10.10.134.131 +add test 10.10.134.132 +add test 10.10.134.133 +add test 10.10.134.134 +add test 10.10.134.135 +add test 10.10.134.136 +add test 10.10.134.137 +add test 10.10.134.138 +add test 10.10.134.139 +add test 10.10.134.14 +add test 10.10.134.140 +add test 10.10.134.141 +add test 10.10.134.142 +add test 10.10.134.143 +add test 10.10.134.144 +add test 10.10.134.145 +add test 10.10.134.146 +add test 10.10.134.147 +add test 10.10.134.148 +add test 10.10.134.149 +add test 10.10.134.15 +add test 10.10.134.150 +add test 10.10.134.151 +add test 10.10.134.152 +add test 10.10.134.153 +add test 10.10.134.154 +add test 10.10.134.155 +add test 10.10.134.156 +add test 10.10.134.157 +add test 10.10.134.158 +add test 10.10.134.159 +add test 10.10.134.16 +add test 10.10.134.160 +add test 10.10.134.161 +add test 10.10.134.162 +add test 10.10.134.163 +add test 10.10.134.164 +add test 10.10.134.165 +add test 10.10.134.166 +add test 10.10.134.167 +add test 10.10.134.168 +add test 10.10.134.169 +add test 10.10.134.17 +add test 10.10.134.170 +add test 10.10.134.171 +add test 10.10.134.172 +add test 10.10.134.173 +add test 10.10.134.174 +add test 10.10.134.175 +add test 10.10.134.176 +add test 10.10.134.177 +add test 10.10.134.178 +add test 10.10.134.179 +add test 10.10.134.18 +add test 10.10.134.180 +add test 10.10.134.181 +add test 10.10.134.182 +add test 10.10.134.183 +add test 10.10.134.184 +add test 10.10.134.185 +add test 10.10.134.186 +add test 10.10.134.187 +add test 10.10.134.188 +add test 10.10.134.189 +add test 10.10.134.19 +add test 10.10.134.190 +add test 10.10.134.191 +add test 10.10.134.192 +add test 10.10.134.193 +add test 10.10.134.194 +add test 10.10.134.195 +add test 10.10.134.196 +add test 10.10.134.197 +add test 10.10.134.198 +add test 10.10.134.199 +add test 10.10.134.2 +add test 10.10.134.20 +add test 10.10.134.200 +add test 10.10.134.201 +add test 10.10.134.202 +add test 10.10.134.203 +add test 10.10.134.204 +add test 10.10.134.205 +add test 10.10.134.206 +add test 10.10.134.207 +add test 10.10.134.208 +add test 10.10.134.209 +add test 10.10.134.21 +add test 10.10.134.210 +add test 10.10.134.211 +add test 10.10.134.212 +add test 10.10.134.213 +add test 10.10.134.214 +add test 10.10.134.215 +add test 10.10.134.216 +add test 10.10.134.217 +add test 10.10.134.218 +add test 10.10.134.219 +add test 10.10.134.22 +add test 10.10.134.220 +add test 10.10.134.221 +add test 10.10.134.222 +add test 10.10.134.223 +add test 10.10.134.224 +add test 10.10.134.225 +add test 10.10.134.226 +add test 10.10.134.227 +add test 10.10.134.228 +add test 10.10.134.229 +add test 10.10.134.23 +add test 10.10.134.230 +add test 10.10.134.231 +add test 10.10.134.232 +add test 10.10.134.233 +add test 10.10.134.234 +add test 10.10.134.235 +add test 10.10.134.236 +add test 10.10.134.237 +add test 10.10.134.238 +add test 10.10.134.239 +add test 10.10.134.24 +add test 10.10.134.240 +add test 10.10.134.241 +add test 10.10.134.242 +add test 10.10.134.243 +add test 10.10.134.244 +add test 10.10.134.245 +add test 10.10.134.246 +add test 10.10.134.247 +add test 10.10.134.248 +add test 10.10.134.249 +add test 10.10.134.25 +add test 10.10.134.250 +add test 10.10.134.251 +add test 10.10.134.252 +add test 10.10.134.253 +add test 10.10.134.254 +add test 10.10.134.255 +add test 10.10.134.26 +add test 10.10.134.27 +add test 10.10.134.28 +add test 10.10.134.29 +add test 10.10.134.3 +add test 10.10.134.30 +add test 10.10.134.31 +add test 10.10.134.32 +add test 10.10.134.33 +add test 10.10.134.34 +add test 10.10.134.35 +add test 10.10.134.36 +add test 10.10.134.37 +add test 10.10.134.38 +add test 10.10.134.39 +add test 10.10.134.4 +add test 10.10.134.40 +add test 10.10.134.41 +add test 10.10.134.42 +add test 10.10.134.43 +add test 10.10.134.44 +add test 10.10.134.45 +add test 10.10.134.46 +add test 10.10.134.47 +add test 10.10.134.48 +add test 10.10.134.49 +add test 10.10.134.5 +add test 10.10.134.50 +add test 10.10.134.51 +add test 10.10.134.52 +add test 10.10.134.53 +add test 10.10.134.54 +add test 10.10.134.55 +add test 10.10.134.56 +add test 10.10.134.57 +add test 10.10.134.58 +add test 10.10.134.59 +add test 10.10.134.6 +add test 10.10.134.60 +add test 10.10.134.61 +add test 10.10.134.62 +add test 10.10.134.63 +add test 10.10.134.64 +add test 10.10.134.65 +add test 10.10.134.66 +add test 10.10.134.67 +add test 10.10.134.68 +add test 10.10.134.69 +add test 10.10.134.7 +add test 10.10.134.70 +add test 10.10.134.71 +add test 10.10.134.72 +add test 10.10.134.73 +add test 10.10.134.74 +add test 10.10.134.75 +add test 10.10.134.76 +add test 10.10.134.77 +add test 10.10.134.78 +add test 10.10.134.79 +add test 10.10.134.8 +add test 10.10.134.80 +add test 10.10.134.81 +add test 10.10.134.82 +add test 10.10.134.83 +add test 10.10.134.84 +add test 10.10.134.85 +add test 10.10.134.86 +add test 10.10.134.87 +add test 10.10.134.88 +add test 10.10.134.89 +add test 10.10.134.9 +add test 10.10.134.90 +add test 10.10.134.91 +add test 10.10.134.92 +add test 10.10.134.93 +add test 10.10.134.94 +add test 10.10.134.95 +add test 10.10.134.96 +add test 10.10.134.97 +add test 10.10.134.98 +add test 10.10.134.99 +add test 10.10.135.0 +add test 10.10.135.1 +add test 10.10.135.10 +add test 10.10.135.100 +add test 10.10.135.101 +add test 10.10.135.102 +add test 10.10.135.103 +add test 10.10.135.104 +add test 10.10.135.105 +add test 10.10.135.106 +add test 10.10.135.107 +add test 10.10.135.108 +add test 10.10.135.109 +add test 10.10.135.11 +add test 10.10.135.110 +add test 10.10.135.111 +add test 10.10.135.112 +add test 10.10.135.113 +add test 10.10.135.114 +add test 10.10.135.115 +add test 10.10.135.116 +add test 10.10.135.117 +add test 10.10.135.118 +add test 10.10.135.119 +add test 10.10.135.12 +add test 10.10.135.120 +add test 10.10.135.121 +add test 10.10.135.122 +add test 10.10.135.123 +add test 10.10.135.124 +add test 10.10.135.125 +add test 10.10.135.126 +add test 10.10.135.127 +add test 10.10.135.128 +add test 10.10.135.129 +add test 10.10.135.13 +add test 10.10.135.130 +add test 10.10.135.131 +add test 10.10.135.132 +add test 10.10.135.133 +add test 10.10.135.134 +add test 10.10.135.135 +add test 10.10.135.136 +add test 10.10.135.137 +add test 10.10.135.138 +add test 10.10.135.139 +add test 10.10.135.14 +add test 10.10.135.140 +add test 10.10.135.141 +add test 10.10.135.142 +add test 10.10.135.143 +add test 10.10.135.144 +add test 10.10.135.145 +add test 10.10.135.146 +add test 10.10.135.147 +add test 10.10.135.148 +add test 10.10.135.149 +add test 10.10.135.15 +add test 10.10.135.150 +add test 10.10.135.151 +add test 10.10.135.152 +add test 10.10.135.153 +add test 10.10.135.154 +add test 10.10.135.155 +add test 10.10.135.156 +add test 10.10.135.157 +add test 10.10.135.158 +add test 10.10.135.159 +add test 10.10.135.16 +add test 10.10.135.160 +add test 10.10.135.161 +add test 10.10.135.162 +add test 10.10.135.163 +add test 10.10.135.164 +add test 10.10.135.165 +add test 10.10.135.166 +add test 10.10.135.167 +add test 10.10.135.168 +add test 10.10.135.169 +add test 10.10.135.17 +add test 10.10.135.170 +add test 10.10.135.171 +add test 10.10.135.172 +add test 10.10.135.173 +add test 10.10.135.174 +add test 10.10.135.175 +add test 10.10.135.176 +add test 10.10.135.177 +add test 10.10.135.178 +add test 10.10.135.179 +add test 10.10.135.18 +add test 10.10.135.180 +add test 10.10.135.181 +add test 10.10.135.182 +add test 10.10.135.183 +add test 10.10.135.184 +add test 10.10.135.185 +add test 10.10.135.186 +add test 10.10.135.187 +add test 10.10.135.188 +add test 10.10.135.189 +add test 10.10.135.19 +add test 10.10.135.190 +add test 10.10.135.191 +add test 10.10.135.192 +add test 10.10.135.193 +add test 10.10.135.194 +add test 10.10.135.195 +add test 10.10.135.196 +add test 10.10.135.197 +add test 10.10.135.198 +add test 10.10.135.199 +add test 10.10.135.2 +add test 10.10.135.20 +add test 10.10.135.200 +add test 10.10.135.201 +add test 10.10.135.202 +add test 10.10.135.203 +add test 10.10.135.204 +add test 10.10.135.205 +add test 10.10.135.206 +add test 10.10.135.207 +add test 10.10.135.208 +add test 10.10.135.209 +add test 10.10.135.21 +add test 10.10.135.210 +add test 10.10.135.211 +add test 10.10.135.212 +add test 10.10.135.213 +add test 10.10.135.214 +add test 10.10.135.215 +add test 10.10.135.216 +add test 10.10.135.217 +add test 10.10.135.218 +add test 10.10.135.219 +add test 10.10.135.22 +add test 10.10.135.220 +add test 10.10.135.221 +add test 10.10.135.222 +add test 10.10.135.223 +add test 10.10.135.224 +add test 10.10.135.225 +add test 10.10.135.226 +add test 10.10.135.227 +add test 10.10.135.228 +add test 10.10.135.229 +add test 10.10.135.23 +add test 10.10.135.230 +add test 10.10.135.231 +add test 10.10.135.232 +add test 10.10.135.233 +add test 10.10.135.234 +add test 10.10.135.235 +add test 10.10.135.236 +add test 10.10.135.237 +add test 10.10.135.238 +add test 10.10.135.239 +add test 10.10.135.24 +add test 10.10.135.240 +add test 10.10.135.241 +add test 10.10.135.242 +add test 10.10.135.243 +add test 10.10.135.244 +add test 10.10.135.245 +add test 10.10.135.246 +add test 10.10.135.247 +add test 10.10.135.248 +add test 10.10.135.249 +add test 10.10.135.25 +add test 10.10.135.250 +add test 10.10.135.251 +add test 10.10.135.252 +add test 10.10.135.253 +add test 10.10.135.254 +add test 10.10.135.255 +add test 10.10.135.26 +add test 10.10.135.27 +add test 10.10.135.28 +add test 10.10.135.29 +add test 10.10.135.3 +add test 10.10.135.30 +add test 10.10.135.31 +add test 10.10.135.32 +add test 10.10.135.33 +add test 10.10.135.34 +add test 10.10.135.35 +add test 10.10.135.36 +add test 10.10.135.37 +add test 10.10.135.38 +add test 10.10.135.39 +add test 10.10.135.4 +add test 10.10.135.40 +add test 10.10.135.41 +add test 10.10.135.42 +add test 10.10.135.43 +add test 10.10.135.44 +add test 10.10.135.45 +add test 10.10.135.46 +add test 10.10.135.47 +add test 10.10.135.48 +add test 10.10.135.49 +add test 10.10.135.5 +add test 10.10.135.50 +add test 10.10.135.51 +add test 10.10.135.52 +add test 10.10.135.53 +add test 10.10.135.54 +add test 10.10.135.55 +add test 10.10.135.56 +add test 10.10.135.57 +add test 10.10.135.58 +add test 10.10.135.59 +add test 10.10.135.6 +add test 10.10.135.60 +add test 10.10.135.61 +add test 10.10.135.62 +add test 10.10.135.63 +add test 10.10.135.64 +add test 10.10.135.65 +add test 10.10.135.66 +add test 10.10.135.67 +add test 10.10.135.68 +add test 10.10.135.69 +add test 10.10.135.7 +add test 10.10.135.70 +add test 10.10.135.71 +add test 10.10.135.72 +add test 10.10.135.73 +add test 10.10.135.74 +add test 10.10.135.75 +add test 10.10.135.76 +add test 10.10.135.77 +add test 10.10.135.78 +add test 10.10.135.79 +add test 10.10.135.8 +add test 10.10.135.80 +add test 10.10.135.81 +add test 10.10.135.82 +add test 10.10.135.83 +add test 10.10.135.84 +add test 10.10.135.85 +add test 10.10.135.86 +add test 10.10.135.87 +add test 10.10.135.88 +add test 10.10.135.89 +add test 10.10.135.9 +add test 10.10.135.90 +add test 10.10.135.91 +add test 10.10.135.92 +add test 10.10.135.93 +add test 10.10.135.94 +add test 10.10.135.95 +add test 10.10.135.96 +add test 10.10.135.97 +add test 10.10.135.98 +add test 10.10.135.99 +add test 10.10.136.0 +add test 10.10.136.1 +add test 10.10.136.10 +add test 10.10.136.100 +add test 10.10.136.101 +add test 10.10.136.102 +add test 10.10.136.103 +add test 10.10.136.104 +add test 10.10.136.105 +add test 10.10.136.106 +add test 10.10.136.107 +add test 10.10.136.108 +add test 10.10.136.109 +add test 10.10.136.11 +add test 10.10.136.110 +add test 10.10.136.111 +add test 10.10.136.112 +add test 10.10.136.113 +add test 10.10.136.114 +add test 10.10.136.115 +add test 10.10.136.116 +add test 10.10.136.117 +add test 10.10.136.118 +add test 10.10.136.119 +add test 10.10.136.12 +add test 10.10.136.120 +add test 10.10.136.121 +add test 10.10.136.122 +add test 10.10.136.123 +add test 10.10.136.124 +add test 10.10.136.125 +add test 10.10.136.126 +add test 10.10.136.127 +add test 10.10.136.128 +add test 10.10.136.129 +add test 10.10.136.13 +add test 10.10.136.130 +add test 10.10.136.131 +add test 10.10.136.132 +add test 10.10.136.133 +add test 10.10.136.134 +add test 10.10.136.135 +add test 10.10.136.136 +add test 10.10.136.137 +add test 10.10.136.138 +add test 10.10.136.139 +add test 10.10.136.14 +add test 10.10.136.140 +add test 10.10.136.141 +add test 10.10.136.142 +add test 10.10.136.143 +add test 10.10.136.144 +add test 10.10.136.145 +add test 10.10.136.146 +add test 10.10.136.147 +add test 10.10.136.148 +add test 10.10.136.149 +add test 10.10.136.15 +add test 10.10.136.150 +add test 10.10.136.151 +add test 10.10.136.152 +add test 10.10.136.153 +add test 10.10.136.154 +add test 10.10.136.155 +add test 10.10.136.156 +add test 10.10.136.157 +add test 10.10.136.158 +add test 10.10.136.159 +add test 10.10.136.16 +add test 10.10.136.160 +add test 10.10.136.161 +add test 10.10.136.162 +add test 10.10.136.163 +add test 10.10.136.164 +add test 10.10.136.165 +add test 10.10.136.166 +add test 10.10.136.167 +add test 10.10.136.168 +add test 10.10.136.169 +add test 10.10.136.17 +add test 10.10.136.170 +add test 10.10.136.171 +add test 10.10.136.172 +add test 10.10.136.173 +add test 10.10.136.174 +add test 10.10.136.175 +add test 10.10.136.176 +add test 10.10.136.177 +add test 10.10.136.178 +add test 10.10.136.179 +add test 10.10.136.18 +add test 10.10.136.180 +add test 10.10.136.181 +add test 10.10.136.182 +add test 10.10.136.183 +add test 10.10.136.184 +add test 10.10.136.185 +add test 10.10.136.186 +add test 10.10.136.187 +add test 10.10.136.188 +add test 10.10.136.189 +add test 10.10.136.19 +add test 10.10.136.190 +add test 10.10.136.191 +add test 10.10.136.192 +add test 10.10.136.193 +add test 10.10.136.194 +add test 10.10.136.195 +add test 10.10.136.196 +add test 10.10.136.197 +add test 10.10.136.198 +add test 10.10.136.199 +add test 10.10.136.2 +add test 10.10.136.20 +add test 10.10.136.200 +add test 10.10.136.201 +add test 10.10.136.202 +add test 10.10.136.203 +add test 10.10.136.204 +add test 10.10.136.205 +add test 10.10.136.206 +add test 10.10.136.207 +add test 10.10.136.208 +add test 10.10.136.209 +add test 10.10.136.21 +add test 10.10.136.210 +add test 10.10.136.211 +add test 10.10.136.212 +add test 10.10.136.213 +add test 10.10.136.214 +add test 10.10.136.215 +add test 10.10.136.216 +add test 10.10.136.217 +add test 10.10.136.218 +add test 10.10.136.219 +add test 10.10.136.22 +add test 10.10.136.220 +add test 10.10.136.221 +add test 10.10.136.222 +add test 10.10.136.223 +add test 10.10.136.224 +add test 10.10.136.225 +add test 10.10.136.226 +add test 10.10.136.227 +add test 10.10.136.228 +add test 10.10.136.229 +add test 10.10.136.23 +add test 10.10.136.230 +add test 10.10.136.231 +add test 10.10.136.232 +add test 10.10.136.233 +add test 10.10.136.234 +add test 10.10.136.235 +add test 10.10.136.236 +add test 10.10.136.237 +add test 10.10.136.238 +add test 10.10.136.239 +add test 10.10.136.24 +add test 10.10.136.240 +add test 10.10.136.241 +add test 10.10.136.242 +add test 10.10.136.243 +add test 10.10.136.244 +add test 10.10.136.245 +add test 10.10.136.246 +add test 10.10.136.247 +add test 10.10.136.248 +add test 10.10.136.249 +add test 10.10.136.25 +add test 10.10.136.250 +add test 10.10.136.251 +add test 10.10.136.252 +add test 10.10.136.253 +add test 10.10.136.254 +add test 10.10.136.255 +add test 10.10.136.26 +add test 10.10.136.27 +add test 10.10.136.28 +add test 10.10.136.29 +add test 10.10.136.3 +add test 10.10.136.30 +add test 10.10.136.31 +add test 10.10.136.32 +add test 10.10.136.33 +add test 10.10.136.34 +add test 10.10.136.35 +add test 10.10.136.36 +add test 10.10.136.37 +add test 10.10.136.38 +add test 10.10.136.39 +add test 10.10.136.4 +add test 10.10.136.40 +add test 10.10.136.41 +add test 10.10.136.42 +add test 10.10.136.43 +add test 10.10.136.44 +add test 10.10.136.45 +add test 10.10.136.46 +add test 10.10.136.47 +add test 10.10.136.48 +add test 10.10.136.49 +add test 10.10.136.5 +add test 10.10.136.50 +add test 10.10.136.51 +add test 10.10.136.52 +add test 10.10.136.53 +add test 10.10.136.54 +add test 10.10.136.55 +add test 10.10.136.56 +add test 10.10.136.57 +add test 10.10.136.58 +add test 10.10.136.59 +add test 10.10.136.6 +add test 10.10.136.60 +add test 10.10.136.61 +add test 10.10.136.62 +add test 10.10.136.63 +add test 10.10.136.64 +add test 10.10.136.65 +add test 10.10.136.66 +add test 10.10.136.67 +add test 10.10.136.68 +add test 10.10.136.69 +add test 10.10.136.7 +add test 10.10.136.70 +add test 10.10.136.71 +add test 10.10.136.72 +add test 10.10.136.73 +add test 10.10.136.74 +add test 10.10.136.75 +add test 10.10.136.76 +add test 10.10.136.77 +add test 10.10.136.78 +add test 10.10.136.79 +add test 10.10.136.8 +add test 10.10.136.80 +add test 10.10.136.81 +add test 10.10.136.82 +add test 10.10.136.83 +add test 10.10.136.84 +add test 10.10.136.85 +add test 10.10.136.86 +add test 10.10.136.87 +add test 10.10.136.88 +add test 10.10.136.89 +add test 10.10.136.9 +add test 10.10.136.90 +add test 10.10.136.91 +add test 10.10.136.92 +add test 10.10.136.93 +add test 10.10.136.94 +add test 10.10.136.95 +add test 10.10.136.96 +add test 10.10.136.97 +add test 10.10.136.98 +add test 10.10.136.99 +add test 10.10.137.0 +add test 10.10.137.1 +add test 10.10.137.10 +add test 10.10.137.100 +add test 10.10.137.101 +add test 10.10.137.102 +add test 10.10.137.103 +add test 10.10.137.104 +add test 10.10.137.105 +add test 10.10.137.106 +add test 10.10.137.107 +add test 10.10.137.108 +add test 10.10.137.109 +add test 10.10.137.11 +add test 10.10.137.110 +add test 10.10.137.111 +add test 10.10.137.112 +add test 10.10.137.113 +add test 10.10.137.114 +add test 10.10.137.115 +add test 10.10.137.116 +add test 10.10.137.117 +add test 10.10.137.118 +add test 10.10.137.119 +add test 10.10.137.12 +add test 10.10.137.120 +add test 10.10.137.121 +add test 10.10.137.122 +add test 10.10.137.123 +add test 10.10.137.124 +add test 10.10.137.125 +add test 10.10.137.126 +add test 10.10.137.127 +add test 10.10.137.128 +add test 10.10.137.129 +add test 10.10.137.13 +add test 10.10.137.130 +add test 10.10.137.131 +add test 10.10.137.132 +add test 10.10.137.133 +add test 10.10.137.134 +add test 10.10.137.135 +add test 10.10.137.136 +add test 10.10.137.137 +add test 10.10.137.138 +add test 10.10.137.139 +add test 10.10.137.14 +add test 10.10.137.140 +add test 10.10.137.141 +add test 10.10.137.142 +add test 10.10.137.143 +add test 10.10.137.144 +add test 10.10.137.145 +add test 10.10.137.146 +add test 10.10.137.147 +add test 10.10.137.148 +add test 10.10.137.149 +add test 10.10.137.15 +add test 10.10.137.150 +add test 10.10.137.151 +add test 10.10.137.152 +add test 10.10.137.153 +add test 10.10.137.154 +add test 10.10.137.155 +add test 10.10.137.156 +add test 10.10.137.157 +add test 10.10.137.158 +add test 10.10.137.159 +add test 10.10.137.16 +add test 10.10.137.160 +add test 10.10.137.161 +add test 10.10.137.162 +add test 10.10.137.163 +add test 10.10.137.164 +add test 10.10.137.165 +add test 10.10.137.166 +add test 10.10.137.167 +add test 10.10.137.168 +add test 10.10.137.169 +add test 10.10.137.17 +add test 10.10.137.170 +add test 10.10.137.171 +add test 10.10.137.172 +add test 10.10.137.173 +add test 10.10.137.174 +add test 10.10.137.175 +add test 10.10.137.176 +add test 10.10.137.177 +add test 10.10.137.178 +add test 10.10.137.179 +add test 10.10.137.18 +add test 10.10.137.180 +add test 10.10.137.181 +add test 10.10.137.182 +add test 10.10.137.183 +add test 10.10.137.184 +add test 10.10.137.185 +add test 10.10.137.186 +add test 10.10.137.187 +add test 10.10.137.188 +add test 10.10.137.189 +add test 10.10.137.19 +add test 10.10.137.190 +add test 10.10.137.191 +add test 10.10.137.192 +add test 10.10.137.193 +add test 10.10.137.194 +add test 10.10.137.195 +add test 10.10.137.196 +add test 10.10.137.197 +add test 10.10.137.198 +add test 10.10.137.199 +add test 10.10.137.2 +add test 10.10.137.20 +add test 10.10.137.200 +add test 10.10.137.201 +add test 10.10.137.202 +add test 10.10.137.203 +add test 10.10.137.204 +add test 10.10.137.205 +add test 10.10.137.206 +add test 10.10.137.207 +add test 10.10.137.208 +add test 10.10.137.209 +add test 10.10.137.21 +add test 10.10.137.210 +add test 10.10.137.211 +add test 10.10.137.212 +add test 10.10.137.213 +add test 10.10.137.214 +add test 10.10.137.215 +add test 10.10.137.216 +add test 10.10.137.217 +add test 10.10.137.218 +add test 10.10.137.219 +add test 10.10.137.22 +add test 10.10.137.220 +add test 10.10.137.221 +add test 10.10.137.222 +add test 10.10.137.223 +add test 10.10.137.224 +add test 10.10.137.225 +add test 10.10.137.226 +add test 10.10.137.227 +add test 10.10.137.228 +add test 10.10.137.229 +add test 10.10.137.23 +add test 10.10.137.230 +add test 10.10.137.231 +add test 10.10.137.232 +add test 10.10.137.233 +add test 10.10.137.234 +add test 10.10.137.235 +add test 10.10.137.236 +add test 10.10.137.237 +add test 10.10.137.238 +add test 10.10.137.239 +add test 10.10.137.24 +add test 10.10.137.240 +add test 10.10.137.241 +add test 10.10.137.242 +add test 10.10.137.243 +add test 10.10.137.244 +add test 10.10.137.245 +add test 10.10.137.246 +add test 10.10.137.247 +add test 10.10.137.248 +add test 10.10.137.249 +add test 10.10.137.25 +add test 10.10.137.250 +add test 10.10.137.251 +add test 10.10.137.252 +add test 10.10.137.253 +add test 10.10.137.254 +add test 10.10.137.255 +add test 10.10.137.26 +add test 10.10.137.27 +add test 10.10.137.28 +add test 10.10.137.29 +add test 10.10.137.3 +add test 10.10.137.30 +add test 10.10.137.31 +add test 10.10.137.32 +add test 10.10.137.33 +add test 10.10.137.34 +add test 10.10.137.35 +add test 10.10.137.36 +add test 10.10.137.37 +add test 10.10.137.38 +add test 10.10.137.39 +add test 10.10.137.4 +add test 10.10.137.40 +add test 10.10.137.41 +add test 10.10.137.42 +add test 10.10.137.43 +add test 10.10.137.44 +add test 10.10.137.45 +add test 10.10.137.46 +add test 10.10.137.47 +add test 10.10.137.48 +add test 10.10.137.49 +add test 10.10.137.5 +add test 10.10.137.50 +add test 10.10.137.51 +add test 10.10.137.52 +add test 10.10.137.53 +add test 10.10.137.54 +add test 10.10.137.55 +add test 10.10.137.56 +add test 10.10.137.57 +add test 10.10.137.58 +add test 10.10.137.59 +add test 10.10.137.6 +add test 10.10.137.60 +add test 10.10.137.61 +add test 10.10.137.62 +add test 10.10.137.63 +add test 10.10.137.64 +add test 10.10.137.65 +add test 10.10.137.66 +add test 10.10.137.67 +add test 10.10.137.68 +add test 10.10.137.69 +add test 10.10.137.7 +add test 10.10.137.70 +add test 10.10.137.71 +add test 10.10.137.72 +add test 10.10.137.73 +add test 10.10.137.74 +add test 10.10.137.75 +add test 10.10.137.76 +add test 10.10.137.77 +add test 10.10.137.78 +add test 10.10.137.79 +add test 10.10.137.8 +add test 10.10.137.80 +add test 10.10.137.81 +add test 10.10.137.82 +add test 10.10.137.83 +add test 10.10.137.84 +add test 10.10.137.85 +add test 10.10.137.86 +add test 10.10.137.87 +add test 10.10.137.88 +add test 10.10.137.89 +add test 10.10.137.9 +add test 10.10.137.90 +add test 10.10.137.91 +add test 10.10.137.92 +add test 10.10.137.93 +add test 10.10.137.94 +add test 10.10.137.95 +add test 10.10.137.96 +add test 10.10.137.97 +add test 10.10.137.98 +add test 10.10.137.99 +add test 10.10.138.0 +add test 10.10.138.1 +add test 10.10.138.10 +add test 10.10.138.100 +add test 10.10.138.101 +add test 10.10.138.102 +add test 10.10.138.103 +add test 10.10.138.104 +add test 10.10.138.105 +add test 10.10.138.106 +add test 10.10.138.107 +add test 10.10.138.108 +add test 10.10.138.109 +add test 10.10.138.11 +add test 10.10.138.110 +add test 10.10.138.111 +add test 10.10.138.112 +add test 10.10.138.113 +add test 10.10.138.114 +add test 10.10.138.115 +add test 10.10.138.116 +add test 10.10.138.117 +add test 10.10.138.118 +add test 10.10.138.119 +add test 10.10.138.12 +add test 10.10.138.120 +add test 10.10.138.121 +add test 10.10.138.122 +add test 10.10.138.123 +add test 10.10.138.124 +add test 10.10.138.125 +add test 10.10.138.126 +add test 10.10.138.127 +add test 10.10.138.128 +add test 10.10.138.129 +add test 10.10.138.13 +add test 10.10.138.130 +add test 10.10.138.131 +add test 10.10.138.132 +add test 10.10.138.133 +add test 10.10.138.134 +add test 10.10.138.135 +add test 10.10.138.136 +add test 10.10.138.137 +add test 10.10.138.138 +add test 10.10.138.139 +add test 10.10.138.14 +add test 10.10.138.140 +add test 10.10.138.141 +add test 10.10.138.142 +add test 10.10.138.143 +add test 10.10.138.144 +add test 10.10.138.145 +add test 10.10.138.146 +add test 10.10.138.147 +add test 10.10.138.148 +add test 10.10.138.149 +add test 10.10.138.15 +add test 10.10.138.150 +add test 10.10.138.151 +add test 10.10.138.152 +add test 10.10.138.153 +add test 10.10.138.154 +add test 10.10.138.155 +add test 10.10.138.156 +add test 10.10.138.157 +add test 10.10.138.158 +add test 10.10.138.159 +add test 10.10.138.16 +add test 10.10.138.160 +add test 10.10.138.161 +add test 10.10.138.162 +add test 10.10.138.163 +add test 10.10.138.164 +add test 10.10.138.165 +add test 10.10.138.166 +add test 10.10.138.167 +add test 10.10.138.168 +add test 10.10.138.169 +add test 10.10.138.17 +add test 10.10.138.170 +add test 10.10.138.171 +add test 10.10.138.172 +add test 10.10.138.173 +add test 10.10.138.174 +add test 10.10.138.175 +add test 10.10.138.176 +add test 10.10.138.177 +add test 10.10.138.178 +add test 10.10.138.179 +add test 10.10.138.18 +add test 10.10.138.180 +add test 10.10.138.181 +add test 10.10.138.182 +add test 10.10.138.183 +add test 10.10.138.184 +add test 10.10.138.185 +add test 10.10.138.186 +add test 10.10.138.187 +add test 10.10.138.188 +add test 10.10.138.189 +add test 10.10.138.19 +add test 10.10.138.190 +add test 10.10.138.191 +add test 10.10.138.192 +add test 10.10.138.193 +add test 10.10.138.194 +add test 10.10.138.195 +add test 10.10.138.196 +add test 10.10.138.197 +add test 10.10.138.198 +add test 10.10.138.199 +add test 10.10.138.2 +add test 10.10.138.20 +add test 10.10.138.200 +add test 10.10.138.201 +add test 10.10.138.202 +add test 10.10.138.203 +add test 10.10.138.204 +add test 10.10.138.205 +add test 10.10.138.206 +add test 10.10.138.207 +add test 10.10.138.208 +add test 10.10.138.209 +add test 10.10.138.21 +add test 10.10.138.210 +add test 10.10.138.211 +add test 10.10.138.212 +add test 10.10.138.213 +add test 10.10.138.214 +add test 10.10.138.215 +add test 10.10.138.216 +add test 10.10.138.217 +add test 10.10.138.218 +add test 10.10.138.219 +add test 10.10.138.22 +add test 10.10.138.220 +add test 10.10.138.221 +add test 10.10.138.222 +add test 10.10.138.223 +add test 10.10.138.224 +add test 10.10.138.225 +add test 10.10.138.226 +add test 10.10.138.227 +add test 10.10.138.228 +add test 10.10.138.229 +add test 10.10.138.23 +add test 10.10.138.230 +add test 10.10.138.231 +add test 10.10.138.232 +add test 10.10.138.233 +add test 10.10.138.234 +add test 10.10.138.235 +add test 10.10.138.236 +add test 10.10.138.237 +add test 10.10.138.238 +add test 10.10.138.239 +add test 10.10.138.24 +add test 10.10.138.240 +add test 10.10.138.241 +add test 10.10.138.242 +add test 10.10.138.243 +add test 10.10.138.244 +add test 10.10.138.245 +add test 10.10.138.246 +add test 10.10.138.247 +add test 10.10.138.248 +add test 10.10.138.249 +add test 10.10.138.25 +add test 10.10.138.250 +add test 10.10.138.251 +add test 10.10.138.252 +add test 10.10.138.253 +add test 10.10.138.254 +add test 10.10.138.255 +add test 10.10.138.26 +add test 10.10.138.27 +add test 10.10.138.28 +add test 10.10.138.29 +add test 10.10.138.3 +add test 10.10.138.30 +add test 10.10.138.31 +add test 10.10.138.32 +add test 10.10.138.33 +add test 10.10.138.34 +add test 10.10.138.35 +add test 10.10.138.36 +add test 10.10.138.37 +add test 10.10.138.38 +add test 10.10.138.39 +add test 10.10.138.4 +add test 10.10.138.40 +add test 10.10.138.41 +add test 10.10.138.42 +add test 10.10.138.43 +add test 10.10.138.44 +add test 10.10.138.45 +add test 10.10.138.46 +add test 10.10.138.47 +add test 10.10.138.48 +add test 10.10.138.49 +add test 10.10.138.5 +add test 10.10.138.50 +add test 10.10.138.51 +add test 10.10.138.52 +add test 10.10.138.53 +add test 10.10.138.54 +add test 10.10.138.55 +add test 10.10.138.56 +add test 10.10.138.57 +add test 10.10.138.58 +add test 10.10.138.59 +add test 10.10.138.6 +add test 10.10.138.60 +add test 10.10.138.61 +add test 10.10.138.62 +add test 10.10.138.63 +add test 10.10.138.64 +add test 10.10.138.65 +add test 10.10.138.66 +add test 10.10.138.67 +add test 10.10.138.68 +add test 10.10.138.69 +add test 10.10.138.7 +add test 10.10.138.70 +add test 10.10.138.71 +add test 10.10.138.72 +add test 10.10.138.73 +add test 10.10.138.74 +add test 10.10.138.75 +add test 10.10.138.76 +add test 10.10.138.77 +add test 10.10.138.78 +add test 10.10.138.79 +add test 10.10.138.8 +add test 10.10.138.80 +add test 10.10.138.81 +add test 10.10.138.82 +add test 10.10.138.83 +add test 10.10.138.84 +add test 10.10.138.85 +add test 10.10.138.86 +add test 10.10.138.87 +add test 10.10.138.88 +add test 10.10.138.89 +add test 10.10.138.9 +add test 10.10.138.90 +add test 10.10.138.91 +add test 10.10.138.92 +add test 10.10.138.93 +add test 10.10.138.94 +add test 10.10.138.95 +add test 10.10.138.96 +add test 10.10.138.97 +add test 10.10.138.98 +add test 10.10.138.99 +add test 10.10.139.0 +add test 10.10.139.1 +add test 10.10.139.10 +add test 10.10.139.100 +add test 10.10.139.101 +add test 10.10.139.102 +add test 10.10.139.103 +add test 10.10.139.104 +add test 10.10.139.105 +add test 10.10.139.106 +add test 10.10.139.107 +add test 10.10.139.108 +add test 10.10.139.109 +add test 10.10.139.11 +add test 10.10.139.110 +add test 10.10.139.111 +add test 10.10.139.112 +add test 10.10.139.113 +add test 10.10.139.114 +add test 10.10.139.115 +add test 10.10.139.116 +add test 10.10.139.117 +add test 10.10.139.118 +add test 10.10.139.119 +add test 10.10.139.12 +add test 10.10.139.120 +add test 10.10.139.121 +add test 10.10.139.122 +add test 10.10.139.123 +add test 10.10.139.124 +add test 10.10.139.125 +add test 10.10.139.126 +add test 10.10.139.127 +add test 10.10.139.128 +add test 10.10.139.129 +add test 10.10.139.13 +add test 10.10.139.130 +add test 10.10.139.131 +add test 10.10.139.132 +add test 10.10.139.133 +add test 10.10.139.134 +add test 10.10.139.135 +add test 10.10.139.136 +add test 10.10.139.137 +add test 10.10.139.138 +add test 10.10.139.139 +add test 10.10.139.14 +add test 10.10.139.140 +add test 10.10.139.141 +add test 10.10.139.142 +add test 10.10.139.143 +add test 10.10.139.144 +add test 10.10.139.145 +add test 10.10.139.146 +add test 10.10.139.147 +add test 10.10.139.148 +add test 10.10.139.149 +add test 10.10.139.15 +add test 10.10.139.150 +add test 10.10.139.151 +add test 10.10.139.152 +add test 10.10.139.153 +add test 10.10.139.154 +add test 10.10.139.155 +add test 10.10.139.156 +add test 10.10.139.157 +add test 10.10.139.158 +add test 10.10.139.159 +add test 10.10.139.16 +add test 10.10.139.160 +add test 10.10.139.161 +add test 10.10.139.162 +add test 10.10.139.163 +add test 10.10.139.164 +add test 10.10.139.165 +add test 10.10.139.166 +add test 10.10.139.167 +add test 10.10.139.168 +add test 10.10.139.169 +add test 10.10.139.17 +add test 10.10.139.170 +add test 10.10.139.171 +add test 10.10.139.172 +add test 10.10.139.173 +add test 10.10.139.174 +add test 10.10.139.175 +add test 10.10.139.176 +add test 10.10.139.177 +add test 10.10.139.178 +add test 10.10.139.179 +add test 10.10.139.18 +add test 10.10.139.180 +add test 10.10.139.181 +add test 10.10.139.182 +add test 10.10.139.183 +add test 10.10.139.184 +add test 10.10.139.185 +add test 10.10.139.186 +add test 10.10.139.187 +add test 10.10.139.188 +add test 10.10.139.189 +add test 10.10.139.19 +add test 10.10.139.190 +add test 10.10.139.191 +add test 10.10.139.192 +add test 10.10.139.193 +add test 10.10.139.194 +add test 10.10.139.195 +add test 10.10.139.196 +add test 10.10.139.197 +add test 10.10.139.198 +add test 10.10.139.199 +add test 10.10.139.2 +add test 10.10.139.20 +add test 10.10.139.200 +add test 10.10.139.201 +add test 10.10.139.202 +add test 10.10.139.203 +add test 10.10.139.204 +add test 10.10.139.205 +add test 10.10.139.206 +add test 10.10.139.207 +add test 10.10.139.208 +add test 10.10.139.209 +add test 10.10.139.21 +add test 10.10.139.210 +add test 10.10.139.211 +add test 10.10.139.212 +add test 10.10.139.213 +add test 10.10.139.214 +add test 10.10.139.215 +add test 10.10.139.216 +add test 10.10.139.217 +add test 10.10.139.218 +add test 10.10.139.219 +add test 10.10.139.22 +add test 10.10.139.220 +add test 10.10.139.221 +add test 10.10.139.222 +add test 10.10.139.223 +add test 10.10.139.224 +add test 10.10.139.225 +add test 10.10.139.226 +add test 10.10.139.227 +add test 10.10.139.228 +add test 10.10.139.229 +add test 10.10.139.23 +add test 10.10.139.230 +add test 10.10.139.231 +add test 10.10.139.232 +add test 10.10.139.233 +add test 10.10.139.234 +add test 10.10.139.235 +add test 10.10.139.236 +add test 10.10.139.237 +add test 10.10.139.238 +add test 10.10.139.239 +add test 10.10.139.24 +add test 10.10.139.240 +add test 10.10.139.241 +add test 10.10.139.242 +add test 10.10.139.243 +add test 10.10.139.244 +add test 10.10.139.245 +add test 10.10.139.246 +add test 10.10.139.247 +add test 10.10.139.248 +add test 10.10.139.249 +add test 10.10.139.25 +add test 10.10.139.250 +add test 10.10.139.251 +add test 10.10.139.252 +add test 10.10.139.253 +add test 10.10.139.254 +add test 10.10.139.255 +add test 10.10.139.26 +add test 10.10.139.27 +add test 10.10.139.28 +add test 10.10.139.29 +add test 10.10.139.3 +add test 10.10.139.30 +add test 10.10.139.31 +add test 10.10.139.32 +add test 10.10.139.33 +add test 10.10.139.34 +add test 10.10.139.35 +add test 10.10.139.36 +add test 10.10.139.37 +add test 10.10.139.38 +add test 10.10.139.39 +add test 10.10.139.4 +add test 10.10.139.40 +add test 10.10.139.41 +add test 10.10.139.42 +add test 10.10.139.43 +add test 10.10.139.44 +add test 10.10.139.45 +add test 10.10.139.46 +add test 10.10.139.47 +add test 10.10.139.48 +add test 10.10.139.49 +add test 10.10.139.5 +add test 10.10.139.50 +add test 10.10.139.51 +add test 10.10.139.52 +add test 10.10.139.53 +add test 10.10.139.54 +add test 10.10.139.55 +add test 10.10.139.56 +add test 10.10.139.57 +add test 10.10.139.58 +add test 10.10.139.59 +add test 10.10.139.6 +add test 10.10.139.60 +add test 10.10.139.61 +add test 10.10.139.62 +add test 10.10.139.63 +add test 10.10.139.64 +add test 10.10.139.65 +add test 10.10.139.66 +add test 10.10.139.67 +add test 10.10.139.68 +add test 10.10.139.69 +add test 10.10.139.7 +add test 10.10.139.70 +add test 10.10.139.71 +add test 10.10.139.72 +add test 10.10.139.73 +add test 10.10.139.74 +add test 10.10.139.75 +add test 10.10.139.76 +add test 10.10.139.77 +add test 10.10.139.78 +add test 10.10.139.79 +add test 10.10.139.8 +add test 10.10.139.80 +add test 10.10.139.81 +add test 10.10.139.82 +add test 10.10.139.83 +add test 10.10.139.84 +add test 10.10.139.85 +add test 10.10.139.86 +add test 10.10.139.87 +add test 10.10.139.88 +add test 10.10.139.89 +add test 10.10.139.9 +add test 10.10.139.90 +add test 10.10.139.91 +add test 10.10.139.92 +add test 10.10.139.93 +add test 10.10.139.94 +add test 10.10.139.95 +add test 10.10.139.96 +add test 10.10.139.97 +add test 10.10.139.98 +add test 10.10.139.99 +add test 10.10.14.0 +add test 10.10.14.1 +add test 10.10.14.10 +add test 10.10.14.100 +add test 10.10.14.101 +add test 10.10.14.102 +add test 10.10.14.103 +add test 10.10.14.104 +add test 10.10.14.105 +add test 10.10.14.106 +add test 10.10.14.107 +add test 10.10.14.108 +add test 10.10.14.109 +add test 10.10.14.11 +add test 10.10.14.110 +add test 10.10.14.111 +add test 10.10.14.112 +add test 10.10.14.113 +add test 10.10.14.114 +add test 10.10.14.115 +add test 10.10.14.116 +add test 10.10.14.117 +add test 10.10.14.118 +add test 10.10.14.119 +add test 10.10.14.12 +add test 10.10.14.120 +add test 10.10.14.121 +add test 10.10.14.122 +add test 10.10.14.123 +add test 10.10.14.124 +add test 10.10.14.125 +add test 10.10.14.126 +add test 10.10.14.127 +add test 10.10.14.128 +add test 10.10.14.129 +add test 10.10.14.13 +add test 10.10.14.130 +add test 10.10.14.131 +add test 10.10.14.132 +add test 10.10.14.133 +add test 10.10.14.134 +add test 10.10.14.135 +add test 10.10.14.136 +add test 10.10.14.137 +add test 10.10.14.138 +add test 10.10.14.139 +add test 10.10.14.14 +add test 10.10.14.140 +add test 10.10.14.141 +add test 10.10.14.142 +add test 10.10.14.143 +add test 10.10.14.144 +add test 10.10.14.145 +add test 10.10.14.146 +add test 10.10.14.147 +add test 10.10.14.148 +add test 10.10.14.149 +add test 10.10.14.15 +add test 10.10.14.150 +add test 10.10.14.151 +add test 10.10.14.152 +add test 10.10.14.153 +add test 10.10.14.154 +add test 10.10.14.155 +add test 10.10.14.156 +add test 10.10.14.157 +add test 10.10.14.158 +add test 10.10.14.159 +add test 10.10.14.16 +add test 10.10.14.160 +add test 10.10.14.161 +add test 10.10.14.162 +add test 10.10.14.163 +add test 10.10.14.164 +add test 10.10.14.165 +add test 10.10.14.166 +add test 10.10.14.167 +add test 10.10.14.168 +add test 10.10.14.169 +add test 10.10.14.17 +add test 10.10.14.170 +add test 10.10.14.171 +add test 10.10.14.172 +add test 10.10.14.173 +add test 10.10.14.174 +add test 10.10.14.175 +add test 10.10.14.176 +add test 10.10.14.177 +add test 10.10.14.178 +add test 10.10.14.179 +add test 10.10.14.18 +add test 10.10.14.180 +add test 10.10.14.181 +add test 10.10.14.182 +add test 10.10.14.183 +add test 10.10.14.184 +add test 10.10.14.185 +add test 10.10.14.186 +add test 10.10.14.187 +add test 10.10.14.188 +add test 10.10.14.189 +add test 10.10.14.19 +add test 10.10.14.190 +add test 10.10.14.191 +add test 10.10.14.192 +add test 10.10.14.193 +add test 10.10.14.194 +add test 10.10.14.195 +add test 10.10.14.196 +add test 10.10.14.197 +add test 10.10.14.198 +add test 10.10.14.199 +add test 10.10.14.2 +add test 10.10.14.20 +add test 10.10.14.200 +add test 10.10.14.201 +add test 10.10.14.202 +add test 10.10.14.203 +add test 10.10.14.204 +add test 10.10.14.205 +add test 10.10.14.206 +add test 10.10.14.207 +add test 10.10.14.208 +add test 10.10.14.209 +add test 10.10.14.21 +add test 10.10.14.210 +add test 10.10.14.211 +add test 10.10.14.212 +add test 10.10.14.213 +add test 10.10.14.214 +add test 10.10.14.215 +add test 10.10.14.216 +add test 10.10.14.217 +add test 10.10.14.218 +add test 10.10.14.219 +add test 10.10.14.22 +add test 10.10.14.220 +add test 10.10.14.221 +add test 10.10.14.222 +add test 10.10.14.223 +add test 10.10.14.224 +add test 10.10.14.225 +add test 10.10.14.226 +add test 10.10.14.227 +add test 10.10.14.228 +add test 10.10.14.229 +add test 10.10.14.23 +add test 10.10.14.230 +add test 10.10.14.231 +add test 10.10.14.232 +add test 10.10.14.233 +add test 10.10.14.234 +add test 10.10.14.235 +add test 10.10.14.236 +add test 10.10.14.237 +add test 10.10.14.238 +add test 10.10.14.239 +add test 10.10.14.24 +add test 10.10.14.240 +add test 10.10.14.241 +add test 10.10.14.242 +add test 10.10.14.243 +add test 10.10.14.244 +add test 10.10.14.245 +add test 10.10.14.246 +add test 10.10.14.247 +add test 10.10.14.248 +add test 10.10.14.249 +add test 10.10.14.25 +add test 10.10.14.250 +add test 10.10.14.251 +add test 10.10.14.252 +add test 10.10.14.253 +add test 10.10.14.254 +add test 10.10.14.255 +add test 10.10.14.26 +add test 10.10.14.27 +add test 10.10.14.28 +add test 10.10.14.29 +add test 10.10.14.3 +add test 10.10.14.30 +add test 10.10.14.31 +add test 10.10.14.32 +add test 10.10.14.33 +add test 10.10.14.34 +add test 10.10.14.35 +add test 10.10.14.36 +add test 10.10.14.37 +add test 10.10.14.38 +add test 10.10.14.39 +add test 10.10.14.4 +add test 10.10.14.40 +add test 10.10.14.41 +add test 10.10.14.42 +add test 10.10.14.43 +add test 10.10.14.44 +add test 10.10.14.45 +add test 10.10.14.46 +add test 10.10.14.47 +add test 10.10.14.48 +add test 10.10.14.49 +add test 10.10.14.5 +add test 10.10.14.50 +add test 10.10.14.51 +add test 10.10.14.52 +add test 10.10.14.53 +add test 10.10.14.54 +add test 10.10.14.55 +add test 10.10.14.56 +add test 10.10.14.57 +add test 10.10.14.58 +add test 10.10.14.59 +add test 10.10.14.6 +add test 10.10.14.60 +add test 10.10.14.61 +add test 10.10.14.62 +add test 10.10.14.63 +add test 10.10.14.64 +add test 10.10.14.65 +add test 10.10.14.66 +add test 10.10.14.67 +add test 10.10.14.68 +add test 10.10.14.69 +add test 10.10.14.7 +add test 10.10.14.70 +add test 10.10.14.71 +add test 10.10.14.72 +add test 10.10.14.73 +add test 10.10.14.74 +add test 10.10.14.75 +add test 10.10.14.76 +add test 10.10.14.77 +add test 10.10.14.78 +add test 10.10.14.79 +add test 10.10.14.8 +add test 10.10.14.80 +add test 10.10.14.81 +add test 10.10.14.82 +add test 10.10.14.83 +add test 10.10.14.84 +add test 10.10.14.85 +add test 10.10.14.86 +add test 10.10.14.87 +add test 10.10.14.88 +add test 10.10.14.89 +add test 10.10.14.9 +add test 10.10.14.90 +add test 10.10.14.91 +add test 10.10.14.92 +add test 10.10.14.93 +add test 10.10.14.94 +add test 10.10.14.95 +add test 10.10.14.96 +add test 10.10.14.97 +add test 10.10.14.98 +add test 10.10.14.99 +add test 10.10.140.0 +add test 10.10.140.1 +add test 10.10.140.10 +add test 10.10.140.100 +add test 10.10.140.101 +add test 10.10.140.102 +add test 10.10.140.103 +add test 10.10.140.104 +add test 10.10.140.105 +add test 10.10.140.106 +add test 10.10.140.107 +add test 10.10.140.108 +add test 10.10.140.109 +add test 10.10.140.11 +add test 10.10.140.110 +add test 10.10.140.111 +add test 10.10.140.112 +add test 10.10.140.113 +add test 10.10.140.114 +add test 10.10.140.115 +add test 10.10.140.116 +add test 10.10.140.117 +add test 10.10.140.118 +add test 10.10.140.119 +add test 10.10.140.12 +add test 10.10.140.120 +add test 10.10.140.121 +add test 10.10.140.122 +add test 10.10.140.123 +add test 10.10.140.124 +add test 10.10.140.125 +add test 10.10.140.126 +add test 10.10.140.127 +add test 10.10.140.128 +add test 10.10.140.129 +add test 10.10.140.13 +add test 10.10.140.130 +add test 10.10.140.131 +add test 10.10.140.132 +add test 10.10.140.133 +add test 10.10.140.134 +add test 10.10.140.135 +add test 10.10.140.136 +add test 10.10.140.137 +add test 10.10.140.138 +add test 10.10.140.139 +add test 10.10.140.14 +add test 10.10.140.140 +add test 10.10.140.141 +add test 10.10.140.142 +add test 10.10.140.143 +add test 10.10.140.144 +add test 10.10.140.145 +add test 10.10.140.146 +add test 10.10.140.147 +add test 10.10.140.148 +add test 10.10.140.149 +add test 10.10.140.15 +add test 10.10.140.150 +add test 10.10.140.151 +add test 10.10.140.152 +add test 10.10.140.153 +add test 10.10.140.154 +add test 10.10.140.155 +add test 10.10.140.156 +add test 10.10.140.157 +add test 10.10.140.158 +add test 10.10.140.159 +add test 10.10.140.16 +add test 10.10.140.160 +add test 10.10.140.161 +add test 10.10.140.162 +add test 10.10.140.163 +add test 10.10.140.164 +add test 10.10.140.165 +add test 10.10.140.166 +add test 10.10.140.167 +add test 10.10.140.168 +add test 10.10.140.169 +add test 10.10.140.17 +add test 10.10.140.170 +add test 10.10.140.171 +add test 10.10.140.172 +add test 10.10.140.173 +add test 10.10.140.174 +add test 10.10.140.175 +add test 10.10.140.176 +add test 10.10.140.177 +add test 10.10.140.178 +add test 10.10.140.179 +add test 10.10.140.18 +add test 10.10.140.180 +add test 10.10.140.181 +add test 10.10.140.182 +add test 10.10.140.183 +add test 10.10.140.184 +add test 10.10.140.185 +add test 10.10.140.186 +add test 10.10.140.187 +add test 10.10.140.188 +add test 10.10.140.189 +add test 10.10.140.19 +add test 10.10.140.190 +add test 10.10.140.191 +add test 10.10.140.192 +add test 10.10.140.193 +add test 10.10.140.194 +add test 10.10.140.195 +add test 10.10.140.196 +add test 10.10.140.197 +add test 10.10.140.198 +add test 10.10.140.199 +add test 10.10.140.2 +add test 10.10.140.20 +add test 10.10.140.200 +add test 10.10.140.201 +add test 10.10.140.202 +add test 10.10.140.203 +add test 10.10.140.204 +add test 10.10.140.205 +add test 10.10.140.206 +add test 10.10.140.207 +add test 10.10.140.208 +add test 10.10.140.209 +add test 10.10.140.21 +add test 10.10.140.210 +add test 10.10.140.211 +add test 10.10.140.212 +add test 10.10.140.213 +add test 10.10.140.214 +add test 10.10.140.215 +add test 10.10.140.216 +add test 10.10.140.217 +add test 10.10.140.218 +add test 10.10.140.219 +add test 10.10.140.22 +add test 10.10.140.220 +add test 10.10.140.221 +add test 10.10.140.222 +add test 10.10.140.223 +add test 10.10.140.224 +add test 10.10.140.225 +add test 10.10.140.226 +add test 10.10.140.227 +add test 10.10.140.228 +add test 10.10.140.229 +add test 10.10.140.23 +add test 10.10.140.230 +add test 10.10.140.231 +add test 10.10.140.232 +add test 10.10.140.233 +add test 10.10.140.234 +add test 10.10.140.235 +add test 10.10.140.236 +add test 10.10.140.237 +add test 10.10.140.238 +add test 10.10.140.239 +add test 10.10.140.24 +add test 10.10.140.240 +add test 10.10.140.241 +add test 10.10.140.242 +add test 10.10.140.243 +add test 10.10.140.244 +add test 10.10.140.245 +add test 10.10.140.246 +add test 10.10.140.247 +add test 10.10.140.248 +add test 10.10.140.249 +add test 10.10.140.25 +add test 10.10.140.250 +add test 10.10.140.251 +add test 10.10.140.252 +add test 10.10.140.253 +add test 10.10.140.254 +add test 10.10.140.255 +add test 10.10.140.26 +add test 10.10.140.27 +add test 10.10.140.28 +add test 10.10.140.29 +add test 10.10.140.3 +add test 10.10.140.30 +add test 10.10.140.31 +add test 10.10.140.32 +add test 10.10.140.33 +add test 10.10.140.34 +add test 10.10.140.35 +add test 10.10.140.36 +add test 10.10.140.37 +add test 10.10.140.38 +add test 10.10.140.39 +add test 10.10.140.4 +add test 10.10.140.40 +add test 10.10.140.41 +add test 10.10.140.42 +add test 10.10.140.43 +add test 10.10.140.44 +add test 10.10.140.45 +add test 10.10.140.46 +add test 10.10.140.47 +add test 10.10.140.48 +add test 10.10.140.49 +add test 10.10.140.5 +add test 10.10.140.50 +add test 10.10.140.51 +add test 10.10.140.52 +add test 10.10.140.53 +add test 10.10.140.54 +add test 10.10.140.55 +add test 10.10.140.56 +add test 10.10.140.57 +add test 10.10.140.58 +add test 10.10.140.59 +add test 10.10.140.6 +add test 10.10.140.60 +add test 10.10.140.61 +add test 10.10.140.62 +add test 10.10.140.63 +add test 10.10.140.64 +add test 10.10.140.65 +add test 10.10.140.66 +add test 10.10.140.67 +add test 10.10.140.68 +add test 10.10.140.69 +add test 10.10.140.7 +add test 10.10.140.70 +add test 10.10.140.71 +add test 10.10.140.72 +add test 10.10.140.73 +add test 10.10.140.74 +add test 10.10.140.75 +add test 10.10.140.76 +add test 10.10.140.77 +add test 10.10.140.78 +add test 10.10.140.79 +add test 10.10.140.8 +add test 10.10.140.80 +add test 10.10.140.81 +add test 10.10.140.82 +add test 10.10.140.83 +add test 10.10.140.84 +add test 10.10.140.85 +add test 10.10.140.86 +add test 10.10.140.87 +add test 10.10.140.88 +add test 10.10.140.89 +add test 10.10.140.9 +add test 10.10.140.90 +add test 10.10.140.91 +add test 10.10.140.92 +add test 10.10.140.93 +add test 10.10.140.94 +add test 10.10.140.95 +add test 10.10.140.96 +add test 10.10.140.97 +add test 10.10.140.98 +add test 10.10.140.99 +add test 10.10.141.0 +add test 10.10.141.1 +add test 10.10.141.10 +add test 10.10.141.100 +add test 10.10.141.101 +add test 10.10.141.102 +add test 10.10.141.103 +add test 10.10.141.104 +add test 10.10.141.105 +add test 10.10.141.106 +add test 10.10.141.107 +add test 10.10.141.108 +add test 10.10.141.109 +add test 10.10.141.11 +add test 10.10.141.110 +add test 10.10.141.111 +add test 10.10.141.112 +add test 10.10.141.113 +add test 10.10.141.114 +add test 10.10.141.115 +add test 10.10.141.116 +add test 10.10.141.117 +add test 10.10.141.118 +add test 10.10.141.119 +add test 10.10.141.12 +add test 10.10.141.120 +add test 10.10.141.121 +add test 10.10.141.122 +add test 10.10.141.123 +add test 10.10.141.124 +add test 10.10.141.125 +add test 10.10.141.126 +add test 10.10.141.127 +add test 10.10.141.128 +add test 10.10.141.129 +add test 10.10.141.13 +add test 10.10.141.130 +add test 10.10.141.131 +add test 10.10.141.132 +add test 10.10.141.133 +add test 10.10.141.134 +add test 10.10.141.135 +add test 10.10.141.136 +add test 10.10.141.137 +add test 10.10.141.138 +add test 10.10.141.139 +add test 10.10.141.14 +add test 10.10.141.140 +add test 10.10.141.141 +add test 10.10.141.142 +add test 10.10.141.143 +add test 10.10.141.144 +add test 10.10.141.145 +add test 10.10.141.146 +add test 10.10.141.147 +add test 10.10.141.148 +add test 10.10.141.149 +add test 10.10.141.15 +add test 10.10.141.150 +add test 10.10.141.151 +add test 10.10.141.152 +add test 10.10.141.153 +add test 10.10.141.154 +add test 10.10.141.155 +add test 10.10.141.156 +add test 10.10.141.157 +add test 10.10.141.158 +add test 10.10.141.159 +add test 10.10.141.16 +add test 10.10.141.160 +add test 10.10.141.161 +add test 10.10.141.162 +add test 10.10.141.163 +add test 10.10.141.164 +add test 10.10.141.165 +add test 10.10.141.166 +add test 10.10.141.167 +add test 10.10.141.168 +add test 10.10.141.169 +add test 10.10.141.17 +add test 10.10.141.170 +add test 10.10.141.171 +add test 10.10.141.172 +add test 10.10.141.173 +add test 10.10.141.174 +add test 10.10.141.175 +add test 10.10.141.176 +add test 10.10.141.177 +add test 10.10.141.178 +add test 10.10.141.179 +add test 10.10.141.18 +add test 10.10.141.180 +add test 10.10.141.181 +add test 10.10.141.182 +add test 10.10.141.183 +add test 10.10.141.184 +add test 10.10.141.185 +add test 10.10.141.186 +add test 10.10.141.187 +add test 10.10.141.188 +add test 10.10.141.189 +add test 10.10.141.19 +add test 10.10.141.190 +add test 10.10.141.191 +add test 10.10.141.192 +add test 10.10.141.193 +add test 10.10.141.194 +add test 10.10.141.195 +add test 10.10.141.196 +add test 10.10.141.197 +add test 10.10.141.198 +add test 10.10.141.199 +add test 10.10.141.2 +add test 10.10.141.20 +add test 10.10.141.200 +add test 10.10.141.201 +add test 10.10.141.202 +add test 10.10.141.203 +add test 10.10.141.204 +add test 10.10.141.205 +add test 10.10.141.206 +add test 10.10.141.207 +add test 10.10.141.208 +add test 10.10.141.209 +add test 10.10.141.21 +add test 10.10.141.210 +add test 10.10.141.211 +add test 10.10.141.212 +add test 10.10.141.213 +add test 10.10.141.214 +add test 10.10.141.215 +add test 10.10.141.216 +add test 10.10.141.217 +add test 10.10.141.218 +add test 10.10.141.219 +add test 10.10.141.22 +add test 10.10.141.220 +add test 10.10.141.221 +add test 10.10.141.222 +add test 10.10.141.223 +add test 10.10.141.224 +add test 10.10.141.225 +add test 10.10.141.226 +add test 10.10.141.227 +add test 10.10.141.228 +add test 10.10.141.229 +add test 10.10.141.23 +add test 10.10.141.230 +add test 10.10.141.231 +add test 10.10.141.232 +add test 10.10.141.233 +add test 10.10.141.234 +add test 10.10.141.235 +add test 10.10.141.236 +add test 10.10.141.237 +add test 10.10.141.238 +add test 10.10.141.239 +add test 10.10.141.24 +add test 10.10.141.240 +add test 10.10.141.241 +add test 10.10.141.242 +add test 10.10.141.243 +add test 10.10.141.244 +add test 10.10.141.245 +add test 10.10.141.246 +add test 10.10.141.247 +add test 10.10.141.248 +add test 10.10.141.249 +add test 10.10.141.25 +add test 10.10.141.250 +add test 10.10.141.251 +add test 10.10.141.252 +add test 10.10.141.253 +add test 10.10.141.254 +add test 10.10.141.255 +add test 10.10.141.26 +add test 10.10.141.27 +add test 10.10.141.28 +add test 10.10.141.29 +add test 10.10.141.3 +add test 10.10.141.30 +add test 10.10.141.31 +add test 10.10.141.32 +add test 10.10.141.33 +add test 10.10.141.34 +add test 10.10.141.35 +add test 10.10.141.36 +add test 10.10.141.37 +add test 10.10.141.38 +add test 10.10.141.39 +add test 10.10.141.4 +add test 10.10.141.40 +add test 10.10.141.41 +add test 10.10.141.42 +add test 10.10.141.43 +add test 10.10.141.44 +add test 10.10.141.45 +add test 10.10.141.46 +add test 10.10.141.47 +add test 10.10.141.48 +add test 10.10.141.49 +add test 10.10.141.5 +add test 10.10.141.50 +add test 10.10.141.51 +add test 10.10.141.52 +add test 10.10.141.53 +add test 10.10.141.54 +add test 10.10.141.55 +add test 10.10.141.56 +add test 10.10.141.57 +add test 10.10.141.58 +add test 10.10.141.59 +add test 10.10.141.6 +add test 10.10.141.60 +add test 10.10.141.61 +add test 10.10.141.62 +add test 10.10.141.63 +add test 10.10.141.64 +add test 10.10.141.65 +add test 10.10.141.66 +add test 10.10.141.67 +add test 10.10.141.68 +add test 10.10.141.69 +add test 10.10.141.7 +add test 10.10.141.70 +add test 10.10.141.71 +add test 10.10.141.72 +add test 10.10.141.73 +add test 10.10.141.74 +add test 10.10.141.75 +add test 10.10.141.76 +add test 10.10.141.77 +add test 10.10.141.78 +add test 10.10.141.79 +add test 10.10.141.8 +add test 10.10.141.80 +add test 10.10.141.81 +add test 10.10.141.82 +add test 10.10.141.83 +add test 10.10.141.84 +add test 10.10.141.85 +add test 10.10.141.86 +add test 10.10.141.87 +add test 10.10.141.88 +add test 10.10.141.89 +add test 10.10.141.9 +add test 10.10.141.90 +add test 10.10.141.91 +add test 10.10.141.92 +add test 10.10.141.93 +add test 10.10.141.94 +add test 10.10.141.95 +add test 10.10.141.96 +add test 10.10.141.97 +add test 10.10.141.98 +add test 10.10.141.99 +add test 10.10.142.0 +add test 10.10.142.1 +add test 10.10.142.10 +add test 10.10.142.100 +add test 10.10.142.101 +add test 10.10.142.102 +add test 10.10.142.103 +add test 10.10.142.104 +add test 10.10.142.105 +add test 10.10.142.106 +add test 10.10.142.107 +add test 10.10.142.108 +add test 10.10.142.109 +add test 10.10.142.11 +add test 10.10.142.110 +add test 10.10.142.111 +add test 10.10.142.112 +add test 10.10.142.113 +add test 10.10.142.114 +add test 10.10.142.115 +add test 10.10.142.116 +add test 10.10.142.117 +add test 10.10.142.118 +add test 10.10.142.119 +add test 10.10.142.12 +add test 10.10.142.120 +add test 10.10.142.121 +add test 10.10.142.122 +add test 10.10.142.123 +add test 10.10.142.124 +add test 10.10.142.125 +add test 10.10.142.126 +add test 10.10.142.127 +add test 10.10.142.128 +add test 10.10.142.129 +add test 10.10.142.13 +add test 10.10.142.130 +add test 10.10.142.131 +add test 10.10.142.132 +add test 10.10.142.133 +add test 10.10.142.134 +add test 10.10.142.135 +add test 10.10.142.136 +add test 10.10.142.137 +add test 10.10.142.138 +add test 10.10.142.139 +add test 10.10.142.14 +add test 10.10.142.140 +add test 10.10.142.141 +add test 10.10.142.142 +add test 10.10.142.143 +add test 10.10.142.144 +add test 10.10.142.145 +add test 10.10.142.146 +add test 10.10.142.147 +add test 10.10.142.148 +add test 10.10.142.149 +add test 10.10.142.15 +add test 10.10.142.150 +add test 10.10.142.151 +add test 10.10.142.152 +add test 10.10.142.153 +add test 10.10.142.154 +add test 10.10.142.155 +add test 10.10.142.156 +add test 10.10.142.157 +add test 10.10.142.158 +add test 10.10.142.159 +add test 10.10.142.16 +add test 10.10.142.160 +add test 10.10.142.161 +add test 10.10.142.162 +add test 10.10.142.163 +add test 10.10.142.164 +add test 10.10.142.165 +add test 10.10.142.166 +add test 10.10.142.167 +add test 10.10.142.168 +add test 10.10.142.169 +add test 10.10.142.17 +add test 10.10.142.170 +add test 10.10.142.171 +add test 10.10.142.172 +add test 10.10.142.173 +add test 10.10.142.174 +add test 10.10.142.175 +add test 10.10.142.176 +add test 10.10.142.177 +add test 10.10.142.178 +add test 10.10.142.179 +add test 10.10.142.18 +add test 10.10.142.180 +add test 10.10.142.181 +add test 10.10.142.182 +add test 10.10.142.183 +add test 10.10.142.184 +add test 10.10.142.185 +add test 10.10.142.186 +add test 10.10.142.187 +add test 10.10.142.188 +add test 10.10.142.189 +add test 10.10.142.19 +add test 10.10.142.190 +add test 10.10.142.191 +add test 10.10.142.192 +add test 10.10.142.193 +add test 10.10.142.194 +add test 10.10.142.195 +add test 10.10.142.196 +add test 10.10.142.197 +add test 10.10.142.198 +add test 10.10.142.199 +add test 10.10.142.2 +add test 10.10.142.20 +add test 10.10.142.200 +add test 10.10.142.201 +add test 10.10.142.202 +add test 10.10.142.203 +add test 10.10.142.204 +add test 10.10.142.205 +add test 10.10.142.206 +add test 10.10.142.207 +add test 10.10.142.208 +add test 10.10.142.209 +add test 10.10.142.21 +add test 10.10.142.210 +add test 10.10.142.211 +add test 10.10.142.212 +add test 10.10.142.213 +add test 10.10.142.214 +add test 10.10.142.215 +add test 10.10.142.216 +add test 10.10.142.217 +add test 10.10.142.218 +add test 10.10.142.219 +add test 10.10.142.22 +add test 10.10.142.220 +add test 10.10.142.221 +add test 10.10.142.222 +add test 10.10.142.223 +add test 10.10.142.224 +add test 10.10.142.225 +add test 10.10.142.226 +add test 10.10.142.227 +add test 10.10.142.228 +add test 10.10.142.229 +add test 10.10.142.23 +add test 10.10.142.230 +add test 10.10.142.231 +add test 10.10.142.232 +add test 10.10.142.233 +add test 10.10.142.234 +add test 10.10.142.235 +add test 10.10.142.236 +add test 10.10.142.237 +add test 10.10.142.238 +add test 10.10.142.239 +add test 10.10.142.24 +add test 10.10.142.240 +add test 10.10.142.241 +add test 10.10.142.242 +add test 10.10.142.243 +add test 10.10.142.244 +add test 10.10.142.245 +add test 10.10.142.246 +add test 10.10.142.247 +add test 10.10.142.248 +add test 10.10.142.249 +add test 10.10.142.25 +add test 10.10.142.250 +add test 10.10.142.251 +add test 10.10.142.252 +add test 10.10.142.253 +add test 10.10.142.254 +add test 10.10.142.255 +add test 10.10.142.26 +add test 10.10.142.27 +add test 10.10.142.28 +add test 10.10.142.29 +add test 10.10.142.3 +add test 10.10.142.30 +add test 10.10.142.31 +add test 10.10.142.32 +add test 10.10.142.33 +add test 10.10.142.34 +add test 10.10.142.35 +add test 10.10.142.36 +add test 10.10.142.37 +add test 10.10.142.38 +add test 10.10.142.39 +add test 10.10.142.4 +add test 10.10.142.40 +add test 10.10.142.41 +add test 10.10.142.42 +add test 10.10.142.43 +add test 10.10.142.44 +add test 10.10.142.45 +add test 10.10.142.46 +add test 10.10.142.47 +add test 10.10.142.48 +add test 10.10.142.49 +add test 10.10.142.5 +add test 10.10.142.50 +add test 10.10.142.51 +add test 10.10.142.52 +add test 10.10.142.53 +add test 10.10.142.54 +add test 10.10.142.55 +add test 10.10.142.56 +add test 10.10.142.57 +add test 10.10.142.58 +add test 10.10.142.59 +add test 10.10.142.6 +add test 10.10.142.60 +add test 10.10.142.61 +add test 10.10.142.62 +add test 10.10.142.63 +add test 10.10.142.64 +add test 10.10.142.65 +add test 10.10.142.66 +add test 10.10.142.67 +add test 10.10.142.68 +add test 10.10.142.69 +add test 10.10.142.7 +add test 10.10.142.70 +add test 10.10.142.71 +add test 10.10.142.72 +add test 10.10.142.73 +add test 10.10.142.74 +add test 10.10.142.75 +add test 10.10.142.76 +add test 10.10.142.77 +add test 10.10.142.78 +add test 10.10.142.79 +add test 10.10.142.8 +add test 10.10.142.80 +add test 10.10.142.81 +add test 10.10.142.82 +add test 10.10.142.83 +add test 10.10.142.84 +add test 10.10.142.85 +add test 10.10.142.86 +add test 10.10.142.87 +add test 10.10.142.88 +add test 10.10.142.89 +add test 10.10.142.9 +add test 10.10.142.90 +add test 10.10.142.91 +add test 10.10.142.92 +add test 10.10.142.93 +add test 10.10.142.94 +add test 10.10.142.95 +add test 10.10.142.96 +add test 10.10.142.97 +add test 10.10.142.98 +add test 10.10.142.99 +add test 10.10.143.0 +add test 10.10.143.1 +add test 10.10.143.10 +add test 10.10.143.100 +add test 10.10.143.101 +add test 10.10.143.102 +add test 10.10.143.103 +add test 10.10.143.104 +add test 10.10.143.105 +add test 10.10.143.106 +add test 10.10.143.107 +add test 10.10.143.108 +add test 10.10.143.109 +add test 10.10.143.11 +add test 10.10.143.110 +add test 10.10.143.111 +add test 10.10.143.112 +add test 10.10.143.113 +add test 10.10.143.114 +add test 10.10.143.115 +add test 10.10.143.116 +add test 10.10.143.117 +add test 10.10.143.118 +add test 10.10.143.119 +add test 10.10.143.12 +add test 10.10.143.120 +add test 10.10.143.121 +add test 10.10.143.122 +add test 10.10.143.123 +add test 10.10.143.124 +add test 10.10.143.125 +add test 10.10.143.126 +add test 10.10.143.127 +add test 10.10.143.128 +add test 10.10.143.129 +add test 10.10.143.13 +add test 10.10.143.130 +add test 10.10.143.131 +add test 10.10.143.132 +add test 10.10.143.133 +add test 10.10.143.134 +add test 10.10.143.135 +add test 10.10.143.136 +add test 10.10.143.137 +add test 10.10.143.138 +add test 10.10.143.139 +add test 10.10.143.14 +add test 10.10.143.140 +add test 10.10.143.141 +add test 10.10.143.142 +add test 10.10.143.143 +add test 10.10.143.144 +add test 10.10.143.145 +add test 10.10.143.146 +add test 10.10.143.147 +add test 10.10.143.148 +add test 10.10.143.149 +add test 10.10.143.15 +add test 10.10.143.150 +add test 10.10.143.151 +add test 10.10.143.152 +add test 10.10.143.153 +add test 10.10.143.154 +add test 10.10.143.155 +add test 10.10.143.156 +add test 10.10.143.157 +add test 10.10.143.158 +add test 10.10.143.159 +add test 10.10.143.16 +add test 10.10.143.160 +add test 10.10.143.161 +add test 10.10.143.162 +add test 10.10.143.163 +add test 10.10.143.164 +add test 10.10.143.165 +add test 10.10.143.166 +add test 10.10.143.167 +add test 10.10.143.168 +add test 10.10.143.169 +add test 10.10.143.17 +add test 10.10.143.170 +add test 10.10.143.171 +add test 10.10.143.172 +add test 10.10.143.173 +add test 10.10.143.174 +add test 10.10.143.175 +add test 10.10.143.176 +add test 10.10.143.177 +add test 10.10.143.178 +add test 10.10.143.179 +add test 10.10.143.18 +add test 10.10.143.180 +add test 10.10.143.181 +add test 10.10.143.182 +add test 10.10.143.183 +add test 10.10.143.184 +add test 10.10.143.185 +add test 10.10.143.186 +add test 10.10.143.187 +add test 10.10.143.188 +add test 10.10.143.189 +add test 10.10.143.19 +add test 10.10.143.190 +add test 10.10.143.191 +add test 10.10.143.192 +add test 10.10.143.193 +add test 10.10.143.194 +add test 10.10.143.195 +add test 10.10.143.196 +add test 10.10.143.197 +add test 10.10.143.198 +add test 10.10.143.199 +add test 10.10.143.2 +add test 10.10.143.20 +add test 10.10.143.200 +add test 10.10.143.201 +add test 10.10.143.202 +add test 10.10.143.203 +add test 10.10.143.204 +add test 10.10.143.205 +add test 10.10.143.206 +add test 10.10.143.207 +add test 10.10.143.208 +add test 10.10.143.209 +add test 10.10.143.21 +add test 10.10.143.210 +add test 10.10.143.211 +add test 10.10.143.212 +add test 10.10.143.213 +add test 10.10.143.214 +add test 10.10.143.215 +add test 10.10.143.216 +add test 10.10.143.217 +add test 10.10.143.218 +add test 10.10.143.219 +add test 10.10.143.22 +add test 10.10.143.220 +add test 10.10.143.221 +add test 10.10.143.222 +add test 10.10.143.223 +add test 10.10.143.224 +add test 10.10.143.225 +add test 10.10.143.226 +add test 10.10.143.227 +add test 10.10.143.228 +add test 10.10.143.229 +add test 10.10.143.23 +add test 10.10.143.230 +add test 10.10.143.231 +add test 10.10.143.232 +add test 10.10.143.233 +add test 10.10.143.234 +add test 10.10.143.235 +add test 10.10.143.236 +add test 10.10.143.237 +add test 10.10.143.238 +add test 10.10.143.239 +add test 10.10.143.24 +add test 10.10.143.240 +add test 10.10.143.241 +add test 10.10.143.242 +add test 10.10.143.243 +add test 10.10.143.244 +add test 10.10.143.245 +add test 10.10.143.246 +add test 10.10.143.247 +add test 10.10.143.248 +add test 10.10.143.249 +add test 10.10.143.25 +add test 10.10.143.250 +add test 10.10.143.251 +add test 10.10.143.252 +add test 10.10.143.253 +add test 10.10.143.254 +add test 10.10.143.255 +add test 10.10.143.26 +add test 10.10.143.27 +add test 10.10.143.28 +add test 10.10.143.29 +add test 10.10.143.3 +add test 10.10.143.30 +add test 10.10.143.31 +add test 10.10.143.32 +add test 10.10.143.33 +add test 10.10.143.34 +add test 10.10.143.35 +add test 10.10.143.36 +add test 10.10.143.37 +add test 10.10.143.38 +add test 10.10.143.39 +add test 10.10.143.4 +add test 10.10.143.40 +add test 10.10.143.41 +add test 10.10.143.42 +add test 10.10.143.43 +add test 10.10.143.44 +add test 10.10.143.45 +add test 10.10.143.46 +add test 10.10.143.47 +add test 10.10.143.48 +add test 10.10.143.49 +add test 10.10.143.5 +add test 10.10.143.50 +add test 10.10.143.51 +add test 10.10.143.52 +add test 10.10.143.53 +add test 10.10.143.54 +add test 10.10.143.55 +add test 10.10.143.56 +add test 10.10.143.57 +add test 10.10.143.58 +add test 10.10.143.59 +add test 10.10.143.6 +add test 10.10.143.60 +add test 10.10.143.61 +add test 10.10.143.62 +add test 10.10.143.63 +add test 10.10.143.64 +add test 10.10.143.65 +add test 10.10.143.66 +add test 10.10.143.67 +add test 10.10.143.68 +add test 10.10.143.69 +add test 10.10.143.7 +add test 10.10.143.70 +add test 10.10.143.71 +add test 10.10.143.72 +add test 10.10.143.73 +add test 10.10.143.74 +add test 10.10.143.75 +add test 10.10.143.76 +add test 10.10.143.77 +add test 10.10.143.78 +add test 10.10.143.79 +add test 10.10.143.8 +add test 10.10.143.80 +add test 10.10.143.81 +add test 10.10.143.82 +add test 10.10.143.83 +add test 10.10.143.84 +add test 10.10.143.85 +add test 10.10.143.86 +add test 10.10.143.87 +add test 10.10.143.88 +add test 10.10.143.89 +add test 10.10.143.9 +add test 10.10.143.90 +add test 10.10.143.91 +add test 10.10.143.92 +add test 10.10.143.93 +add test 10.10.143.94 +add test 10.10.143.95 +add test 10.10.143.96 +add test 10.10.143.97 +add test 10.10.143.98 +add test 10.10.143.99 +add test 10.10.144.0 +add test 10.10.144.1 +add test 10.10.144.10 +add test 10.10.144.100 +add test 10.10.144.101 +add test 10.10.144.102 +add test 10.10.144.103 +add test 10.10.144.104 +add test 10.10.144.105 +add test 10.10.144.106 +add test 10.10.144.107 +add test 10.10.144.108 +add test 10.10.144.109 +add test 10.10.144.11 +add test 10.10.144.110 +add test 10.10.144.111 +add test 10.10.144.112 +add test 10.10.144.113 +add test 10.10.144.114 +add test 10.10.144.115 +add test 10.10.144.116 +add test 10.10.144.117 +add test 10.10.144.118 +add test 10.10.144.119 +add test 10.10.144.12 +add test 10.10.144.120 +add test 10.10.144.121 +add test 10.10.144.122 +add test 10.10.144.123 +add test 10.10.144.124 +add test 10.10.144.125 +add test 10.10.144.126 +add test 10.10.144.127 +add test 10.10.144.128 +add test 10.10.144.129 +add test 10.10.144.13 +add test 10.10.144.130 +add test 10.10.144.131 +add test 10.10.144.132 +add test 10.10.144.133 +add test 10.10.144.134 +add test 10.10.144.135 +add test 10.10.144.136 +add test 10.10.144.137 +add test 10.10.144.138 +add test 10.10.144.139 +add test 10.10.144.14 +add test 10.10.144.140 +add test 10.10.144.141 +add test 10.10.144.142 +add test 10.10.144.143 +add test 10.10.144.144 +add test 10.10.144.145 +add test 10.10.144.146 +add test 10.10.144.147 +add test 10.10.144.148 +add test 10.10.144.149 +add test 10.10.144.15 +add test 10.10.144.150 +add test 10.10.144.151 +add test 10.10.144.152 +add test 10.10.144.153 +add test 10.10.144.154 +add test 10.10.144.155 +add test 10.10.144.156 +add test 10.10.144.157 +add test 10.10.144.158 +add test 10.10.144.159 +add test 10.10.144.16 +add test 10.10.144.160 +add test 10.10.144.161 +add test 10.10.144.162 +add test 10.10.144.163 +add test 10.10.144.164 +add test 10.10.144.165 +add test 10.10.144.166 +add test 10.10.144.167 +add test 10.10.144.168 +add test 10.10.144.169 +add test 10.10.144.17 +add test 10.10.144.170 +add test 10.10.144.171 +add test 10.10.144.172 +add test 10.10.144.173 +add test 10.10.144.174 +add test 10.10.144.175 +add test 10.10.144.176 +add test 10.10.144.177 +add test 10.10.144.178 +add test 10.10.144.179 +add test 10.10.144.18 +add test 10.10.144.180 +add test 10.10.144.181 +add test 10.10.144.182 +add test 10.10.144.183 +add test 10.10.144.184 +add test 10.10.144.185 +add test 10.10.144.186 +add test 10.10.144.187 +add test 10.10.144.188 +add test 10.10.144.189 +add test 10.10.144.19 +add test 10.10.144.190 +add test 10.10.144.191 +add test 10.10.144.192 +add test 10.10.144.193 +add test 10.10.144.194 +add test 10.10.144.195 +add test 10.10.144.196 +add test 10.10.144.197 +add test 10.10.144.198 +add test 10.10.144.199 +add test 10.10.144.2 +add test 10.10.144.20 +add test 10.10.144.200 +add test 10.10.144.201 +add test 10.10.144.202 +add test 10.10.144.203 +add test 10.10.144.204 +add test 10.10.144.205 +add test 10.10.144.206 +add test 10.10.144.207 +add test 10.10.144.208 +add test 10.10.144.209 +add test 10.10.144.21 +add test 10.10.144.210 +add test 10.10.144.211 +add test 10.10.144.212 +add test 10.10.144.213 +add test 10.10.144.214 +add test 10.10.144.215 +add test 10.10.144.216 +add test 10.10.144.217 +add test 10.10.144.218 +add test 10.10.144.219 +add test 10.10.144.22 +add test 10.10.144.220 +add test 10.10.144.221 +add test 10.10.144.222 +add test 10.10.144.223 +add test 10.10.144.224 +add test 10.10.144.225 +add test 10.10.144.226 +add test 10.10.144.227 +add test 10.10.144.228 +add test 10.10.144.229 +add test 10.10.144.23 +add test 10.10.144.230 +add test 10.10.144.231 +add test 10.10.144.232 +add test 10.10.144.233 +add test 10.10.144.234 +add test 10.10.144.235 +add test 10.10.144.236 +add test 10.10.144.237 +add test 10.10.144.238 +add test 10.10.144.239 +add test 10.10.144.24 +add test 10.10.144.240 +add test 10.10.144.241 +add test 10.10.144.242 +add test 10.10.144.243 +add test 10.10.144.244 +add test 10.10.144.245 +add test 10.10.144.246 +add test 10.10.144.247 +add test 10.10.144.248 +add test 10.10.144.249 +add test 10.10.144.25 +add test 10.10.144.250 +add test 10.10.144.251 +add test 10.10.144.252 +add test 10.10.144.253 +add test 10.10.144.254 +add test 10.10.144.255 +add test 10.10.144.26 +add test 10.10.144.27 +add test 10.10.144.28 +add test 10.10.144.29 +add test 10.10.144.3 +add test 10.10.144.30 +add test 10.10.144.31 +add test 10.10.144.32 +add test 10.10.144.33 +add test 10.10.144.34 +add test 10.10.144.35 +add test 10.10.144.36 +add test 10.10.144.37 +add test 10.10.144.38 +add test 10.10.144.39 +add test 10.10.144.4 +add test 10.10.144.40 +add test 10.10.144.41 +add test 10.10.144.42 +add test 10.10.144.43 +add test 10.10.144.44 +add test 10.10.144.45 +add test 10.10.144.46 +add test 10.10.144.47 +add test 10.10.144.48 +add test 10.10.144.49 +add test 10.10.144.5 +add test 10.10.144.50 +add test 10.10.144.51 +add test 10.10.144.52 +add test 10.10.144.53 +add test 10.10.144.54 +add test 10.10.144.55 +add test 10.10.144.56 +add test 10.10.144.57 +add test 10.10.144.58 +add test 10.10.144.59 +add test 10.10.144.6 +add test 10.10.144.60 +add test 10.10.144.61 +add test 10.10.144.62 +add test 10.10.144.63 +add test 10.10.144.64 +add test 10.10.144.65 +add test 10.10.144.66 +add test 10.10.144.67 +add test 10.10.144.68 +add test 10.10.144.69 +add test 10.10.144.7 +add test 10.10.144.70 +add test 10.10.144.71 +add test 10.10.144.72 +add test 10.10.144.73 +add test 10.10.144.74 +add test 10.10.144.75 +add test 10.10.144.76 +add test 10.10.144.77 +add test 10.10.144.78 +add test 10.10.144.79 +add test 10.10.144.8 +add test 10.10.144.80 +add test 10.10.144.81 +add test 10.10.144.82 +add test 10.10.144.83 +add test 10.10.144.84 +add test 10.10.144.85 +add test 10.10.144.86 +add test 10.10.144.87 +add test 10.10.144.88 +add test 10.10.144.89 +add test 10.10.144.9 +add test 10.10.144.90 +add test 10.10.144.91 +add test 10.10.144.92 +add test 10.10.144.93 +add test 10.10.144.94 +add test 10.10.144.95 +add test 10.10.144.96 +add test 10.10.144.97 +add test 10.10.144.98 +add test 10.10.144.99 +add test 10.10.145.0 +add test 10.10.145.1 +add test 10.10.145.10 +add test 10.10.145.100 +add test 10.10.145.101 +add test 10.10.145.102 +add test 10.10.145.103 +add test 10.10.145.104 +add test 10.10.145.105 +add test 10.10.145.106 +add test 10.10.145.107 +add test 10.10.145.108 +add test 10.10.145.109 +add test 10.10.145.11 +add test 10.10.145.110 +add test 10.10.145.111 +add test 10.10.145.112 +add test 10.10.145.113 +add test 10.10.145.114 +add test 10.10.145.115 +add test 10.10.145.116 +add test 10.10.145.117 +add test 10.10.145.118 +add test 10.10.145.119 +add test 10.10.145.12 +add test 10.10.145.120 +add test 10.10.145.121 +add test 10.10.145.122 +add test 10.10.145.123 +add test 10.10.145.124 +add test 10.10.145.125 +add test 10.10.145.126 +add test 10.10.145.127 +add test 10.10.145.128 +add test 10.10.145.129 +add test 10.10.145.13 +add test 10.10.145.130 +add test 10.10.145.131 +add test 10.10.145.132 +add test 10.10.145.133 +add test 10.10.145.134 +add test 10.10.145.135 +add test 10.10.145.136 +add test 10.10.145.137 +add test 10.10.145.138 +add test 10.10.145.139 +add test 10.10.145.14 +add test 10.10.145.140 +add test 10.10.145.141 +add test 10.10.145.142 +add test 10.10.145.143 +add test 10.10.145.144 +add test 10.10.145.145 +add test 10.10.145.146 +add test 10.10.145.147 +add test 10.10.145.148 +add test 10.10.145.149 +add test 10.10.145.15 +add test 10.10.145.150 +add test 10.10.145.151 +add test 10.10.145.152 +add test 10.10.145.153 +add test 10.10.145.154 +add test 10.10.145.155 +add test 10.10.145.156 +add test 10.10.145.157 +add test 10.10.145.158 +add test 10.10.145.159 +add test 10.10.145.16 +add test 10.10.145.160 +add test 10.10.145.161 +add test 10.10.145.162 +add test 10.10.145.163 +add test 10.10.145.164 +add test 10.10.145.165 +add test 10.10.145.166 +add test 10.10.145.167 +add test 10.10.145.168 +add test 10.10.145.169 +add test 10.10.145.17 +add test 10.10.145.170 +add test 10.10.145.171 +add test 10.10.145.172 +add test 10.10.145.173 +add test 10.10.145.174 +add test 10.10.145.175 +add test 10.10.145.176 +add test 10.10.145.177 +add test 10.10.145.178 +add test 10.10.145.179 +add test 10.10.145.18 +add test 10.10.145.180 +add test 10.10.145.181 +add test 10.10.145.182 +add test 10.10.145.183 +add test 10.10.145.184 +add test 10.10.145.185 +add test 10.10.145.186 +add test 10.10.145.187 +add test 10.10.145.188 +add test 10.10.145.189 +add test 10.10.145.19 +add test 10.10.145.190 +add test 10.10.145.191 +add test 10.10.145.192 +add test 10.10.145.193 +add test 10.10.145.194 +add test 10.10.145.195 +add test 10.10.145.196 +add test 10.10.145.197 +add test 10.10.145.198 +add test 10.10.145.199 +add test 10.10.145.2 +add test 10.10.145.20 +add test 10.10.145.200 +add test 10.10.145.201 +add test 10.10.145.202 +add test 10.10.145.203 +add test 10.10.145.204 +add test 10.10.145.205 +add test 10.10.145.206 +add test 10.10.145.207 +add test 10.10.145.208 +add test 10.10.145.209 +add test 10.10.145.21 +add test 10.10.145.210 +add test 10.10.145.211 +add test 10.10.145.212 +add test 10.10.145.213 +add test 10.10.145.214 +add test 10.10.145.215 +add test 10.10.145.216 +add test 10.10.145.217 +add test 10.10.145.218 +add test 10.10.145.219 +add test 10.10.145.22 +add test 10.10.145.220 +add test 10.10.145.221 +add test 10.10.145.222 +add test 10.10.145.223 +add test 10.10.145.224 +add test 10.10.145.225 +add test 10.10.145.226 +add test 10.10.145.227 +add test 10.10.145.228 +add test 10.10.145.229 +add test 10.10.145.23 +add test 10.10.145.230 +add test 10.10.145.231 +add test 10.10.145.232 +add test 10.10.145.233 +add test 10.10.145.234 +add test 10.10.145.235 +add test 10.10.145.236 +add test 10.10.145.237 +add test 10.10.145.238 +add test 10.10.145.239 +add test 10.10.145.24 +add test 10.10.145.240 +add test 10.10.145.241 +add test 10.10.145.242 +add test 10.10.145.243 +add test 10.10.145.244 +add test 10.10.145.245 +add test 10.10.145.246 +add test 10.10.145.247 +add test 10.10.145.248 +add test 10.10.145.249 +add test 10.10.145.25 +add test 10.10.145.250 +add test 10.10.145.251 +add test 10.10.145.252 +add test 10.10.145.253 +add test 10.10.145.254 +add test 10.10.145.255 +add test 10.10.145.26 +add test 10.10.145.27 +add test 10.10.145.28 +add test 10.10.145.29 +add test 10.10.145.3 +add test 10.10.145.30 +add test 10.10.145.31 +add test 10.10.145.32 +add test 10.10.145.33 +add test 10.10.145.34 +add test 10.10.145.35 +add test 10.10.145.36 +add test 10.10.145.37 +add test 10.10.145.38 +add test 10.10.145.39 +add test 10.10.145.4 +add test 10.10.145.40 +add test 10.10.145.41 +add test 10.10.145.42 +add test 10.10.145.43 +add test 10.10.145.44 +add test 10.10.145.45 +add test 10.10.145.46 +add test 10.10.145.47 +add test 10.10.145.48 +add test 10.10.145.49 +add test 10.10.145.5 +add test 10.10.145.50 +add test 10.10.145.51 +add test 10.10.145.52 +add test 10.10.145.53 +add test 10.10.145.54 +add test 10.10.145.55 +add test 10.10.145.56 +add test 10.10.145.57 +add test 10.10.145.58 +add test 10.10.145.59 +add test 10.10.145.6 +add test 10.10.145.60 +add test 10.10.145.61 +add test 10.10.145.62 +add test 10.10.145.63 +add test 10.10.145.64 +add test 10.10.145.65 +add test 10.10.145.66 +add test 10.10.145.67 +add test 10.10.145.68 +add test 10.10.145.69 +add test 10.10.145.7 +add test 10.10.145.70 +add test 10.10.145.71 +add test 10.10.145.72 +add test 10.10.145.73 +add test 10.10.145.74 +add test 10.10.145.75 +add test 10.10.145.76 +add test 10.10.145.77 +add test 10.10.145.78 +add test 10.10.145.79 +add test 10.10.145.8 +add test 10.10.145.80 +add test 10.10.145.81 +add test 10.10.145.82 +add test 10.10.145.83 +add test 10.10.145.84 +add test 10.10.145.85 +add test 10.10.145.86 +add test 10.10.145.87 +add test 10.10.145.88 +add test 10.10.145.89 +add test 10.10.145.9 +add test 10.10.145.90 +add test 10.10.145.91 +add test 10.10.145.92 +add test 10.10.145.93 +add test 10.10.145.94 +add test 10.10.145.95 +add test 10.10.145.96 +add test 10.10.145.97 +add test 10.10.145.98 +add test 10.10.145.99 +add test 10.10.146.0 +add test 10.10.146.1 +add test 10.10.146.10 +add test 10.10.146.100 +add test 10.10.146.101 +add test 10.10.146.102 +add test 10.10.146.103 +add test 10.10.146.104 +add test 10.10.146.105 +add test 10.10.146.106 +add test 10.10.146.107 +add test 10.10.146.108 +add test 10.10.146.109 +add test 10.10.146.11 +add test 10.10.146.110 +add test 10.10.146.111 +add test 10.10.146.112 +add test 10.10.146.113 +add test 10.10.146.114 +add test 10.10.146.115 +add test 10.10.146.116 +add test 10.10.146.117 +add test 10.10.146.118 +add test 10.10.146.119 +add test 10.10.146.12 +add test 10.10.146.120 +add test 10.10.146.121 +add test 10.10.146.122 +add test 10.10.146.123 +add test 10.10.146.124 +add test 10.10.146.125 +add test 10.10.146.126 +add test 10.10.146.127 +add test 10.10.146.128 +add test 10.10.146.129 +add test 10.10.146.13 +add test 10.10.146.130 +add test 10.10.146.131 +add test 10.10.146.132 +add test 10.10.146.133 +add test 10.10.146.134 +add test 10.10.146.135 +add test 10.10.146.136 +add test 10.10.146.137 +add test 10.10.146.138 +add test 10.10.146.139 +add test 10.10.146.14 +add test 10.10.146.140 +add test 10.10.146.141 +add test 10.10.146.142 +add test 10.10.146.143 +add test 10.10.146.144 +add test 10.10.146.145 +add test 10.10.146.146 +add test 10.10.146.147 +add test 10.10.146.148 +add test 10.10.146.149 +add test 10.10.146.15 +add test 10.10.146.150 +add test 10.10.146.151 +add test 10.10.146.152 +add test 10.10.146.153 +add test 10.10.146.154 +add test 10.10.146.155 +add test 10.10.146.156 +add test 10.10.146.157 +add test 10.10.146.158 +add test 10.10.146.159 +add test 10.10.146.16 +add test 10.10.146.160 +add test 10.10.146.161 +add test 10.10.146.162 +add test 10.10.146.163 +add test 10.10.146.164 +add test 10.10.146.165 +add test 10.10.146.166 +add test 10.10.146.167 +add test 10.10.146.168 +add test 10.10.146.169 +add test 10.10.146.17 +add test 10.10.146.170 +add test 10.10.146.171 +add test 10.10.146.172 +add test 10.10.146.173 +add test 10.10.146.174 +add test 10.10.146.175 +add test 10.10.146.176 +add test 10.10.146.177 +add test 10.10.146.178 +add test 10.10.146.179 +add test 10.10.146.18 +add test 10.10.146.180 +add test 10.10.146.181 +add test 10.10.146.182 +add test 10.10.146.183 +add test 10.10.146.184 +add test 10.10.146.185 +add test 10.10.146.186 +add test 10.10.146.187 +add test 10.10.146.188 +add test 10.10.146.189 +add test 10.10.146.19 +add test 10.10.146.190 +add test 10.10.146.191 +add test 10.10.146.192 +add test 10.10.146.193 +add test 10.10.146.194 +add test 10.10.146.195 +add test 10.10.146.196 +add test 10.10.146.197 +add test 10.10.146.198 +add test 10.10.146.199 +add test 10.10.146.2 +add test 10.10.146.20 +add test 10.10.146.200 +add test 10.10.146.201 +add test 10.10.146.202 +add test 10.10.146.203 +add test 10.10.146.204 +add test 10.10.146.205 +add test 10.10.146.206 +add test 10.10.146.207 +add test 10.10.146.208 +add test 10.10.146.209 +add test 10.10.146.21 +add test 10.10.146.210 +add test 10.10.146.211 +add test 10.10.146.212 +add test 10.10.146.213 +add test 10.10.146.214 +add test 10.10.146.215 +add test 10.10.146.216 +add test 10.10.146.217 +add test 10.10.146.218 +add test 10.10.146.219 +add test 10.10.146.22 +add test 10.10.146.220 +add test 10.10.146.221 +add test 10.10.146.222 +add test 10.10.146.223 +add test 10.10.146.224 +add test 10.10.146.225 +add test 10.10.146.226 +add test 10.10.146.227 +add test 10.10.146.228 +add test 10.10.146.229 +add test 10.10.146.23 +add test 10.10.146.230 +add test 10.10.146.231 +add test 10.10.146.232 +add test 10.10.146.233 +add test 10.10.146.234 +add test 10.10.146.235 +add test 10.10.146.236 +add test 10.10.146.237 +add test 10.10.146.238 +add test 10.10.146.239 +add test 10.10.146.24 +add test 10.10.146.240 +add test 10.10.146.241 +add test 10.10.146.242 +add test 10.10.146.243 +add test 10.10.146.244 +add test 10.10.146.245 +add test 10.10.146.246 +add test 10.10.146.247 +add test 10.10.146.248 +add test 10.10.146.249 +add test 10.10.146.25 +add test 10.10.146.250 +add test 10.10.146.251 +add test 10.10.146.252 +add test 10.10.146.253 +add test 10.10.146.254 +add test 10.10.146.255 +add test 10.10.146.26 +add test 10.10.146.27 +add test 10.10.146.28 +add test 10.10.146.29 +add test 10.10.146.3 +add test 10.10.146.30 +add test 10.10.146.31 +add test 10.10.146.32 +add test 10.10.146.33 +add test 10.10.146.34 +add test 10.10.146.35 +add test 10.10.146.36 +add test 10.10.146.37 +add test 10.10.146.38 +add test 10.10.146.39 +add test 10.10.146.4 +add test 10.10.146.40 +add test 10.10.146.41 +add test 10.10.146.42 +add test 10.10.146.43 +add test 10.10.146.44 +add test 10.10.146.45 +add test 10.10.146.46 +add test 10.10.146.47 +add test 10.10.146.48 +add test 10.10.146.49 +add test 10.10.146.5 +add test 10.10.146.50 +add test 10.10.146.51 +add test 10.10.146.52 +add test 10.10.146.53 +add test 10.10.146.54 +add test 10.10.146.55 +add test 10.10.146.56 +add test 10.10.146.57 +add test 10.10.146.58 +add test 10.10.146.59 +add test 10.10.146.6 +add test 10.10.146.60 +add test 10.10.146.61 +add test 10.10.146.62 +add test 10.10.146.63 +add test 10.10.146.64 +add test 10.10.146.65 +add test 10.10.146.66 +add test 10.10.146.67 +add test 10.10.146.68 +add test 10.10.146.69 +add test 10.10.146.7 +add test 10.10.146.70 +add test 10.10.146.71 +add test 10.10.146.72 +add test 10.10.146.73 +add test 10.10.146.74 +add test 10.10.146.75 +add test 10.10.146.76 +add test 10.10.146.77 +add test 10.10.146.78 +add test 10.10.146.79 +add test 10.10.146.8 +add test 10.10.146.80 +add test 10.10.146.81 +add test 10.10.146.82 +add test 10.10.146.83 +add test 10.10.146.84 +add test 10.10.146.85 +add test 10.10.146.86 +add test 10.10.146.87 +add test 10.10.146.88 +add test 10.10.146.89 +add test 10.10.146.9 +add test 10.10.146.90 +add test 10.10.146.91 +add test 10.10.146.92 +add test 10.10.146.93 +add test 10.10.146.94 +add test 10.10.146.95 +add test 10.10.146.96 +add test 10.10.146.97 +add test 10.10.146.98 +add test 10.10.146.99 +add test 10.10.147.0 +add test 10.10.147.1 +add test 10.10.147.10 +add test 10.10.147.100 +add test 10.10.147.101 +add test 10.10.147.102 +add test 10.10.147.103 +add test 10.10.147.104 +add test 10.10.147.105 +add test 10.10.147.106 +add test 10.10.147.107 +add test 10.10.147.108 +add test 10.10.147.109 +add test 10.10.147.11 +add test 10.10.147.110 +add test 10.10.147.111 +add test 10.10.147.112 +add test 10.10.147.113 +add test 10.10.147.114 +add test 10.10.147.115 +add test 10.10.147.116 +add test 10.10.147.117 +add test 10.10.147.118 +add test 10.10.147.119 +add test 10.10.147.12 +add test 10.10.147.120 +add test 10.10.147.121 +add test 10.10.147.122 +add test 10.10.147.123 +add test 10.10.147.124 +add test 10.10.147.125 +add test 10.10.147.126 +add test 10.10.147.127 +add test 10.10.147.128 +add test 10.10.147.129 +add test 10.10.147.13 +add test 10.10.147.130 +add test 10.10.147.131 +add test 10.10.147.132 +add test 10.10.147.133 +add test 10.10.147.134 +add test 10.10.147.135 +add test 10.10.147.136 +add test 10.10.147.137 +add test 10.10.147.138 +add test 10.10.147.139 +add test 10.10.147.14 +add test 10.10.147.140 +add test 10.10.147.141 +add test 10.10.147.142 +add test 10.10.147.143 +add test 10.10.147.144 +add test 10.10.147.145 +add test 10.10.147.146 +add test 10.10.147.147 +add test 10.10.147.148 +add test 10.10.147.149 +add test 10.10.147.15 +add test 10.10.147.150 +add test 10.10.147.151 +add test 10.10.147.152 +add test 10.10.147.153 +add test 10.10.147.154 +add test 10.10.147.155 +add test 10.10.147.156 +add test 10.10.147.157 +add test 10.10.147.158 +add test 10.10.147.159 +add test 10.10.147.16 +add test 10.10.147.160 +add test 10.10.147.161 +add test 10.10.147.162 +add test 10.10.147.163 +add test 10.10.147.164 +add test 10.10.147.165 +add test 10.10.147.166 +add test 10.10.147.167 +add test 10.10.147.168 +add test 10.10.147.169 +add test 10.10.147.17 +add test 10.10.147.170 +add test 10.10.147.171 +add test 10.10.147.172 +add test 10.10.147.173 +add test 10.10.147.174 +add test 10.10.147.175 +add test 10.10.147.176 +add test 10.10.147.177 +add test 10.10.147.178 +add test 10.10.147.179 +add test 10.10.147.18 +add test 10.10.147.180 +add test 10.10.147.181 +add test 10.10.147.182 +add test 10.10.147.183 +add test 10.10.147.184 +add test 10.10.147.185 +add test 10.10.147.186 +add test 10.10.147.187 +add test 10.10.147.188 +add test 10.10.147.189 +add test 10.10.147.19 +add test 10.10.147.190 +add test 10.10.147.191 +add test 10.10.147.192 +add test 10.10.147.193 +add test 10.10.147.194 +add test 10.10.147.195 +add test 10.10.147.196 +add test 10.10.147.197 +add test 10.10.147.198 +add test 10.10.147.199 +add test 10.10.147.2 +add test 10.10.147.20 +add test 10.10.147.200 +add test 10.10.147.201 +add test 10.10.147.202 +add test 10.10.147.203 +add test 10.10.147.204 +add test 10.10.147.205 +add test 10.10.147.206 +add test 10.10.147.207 +add test 10.10.147.208 +add test 10.10.147.209 +add test 10.10.147.21 +add test 10.10.147.210 +add test 10.10.147.211 +add test 10.10.147.212 +add test 10.10.147.213 +add test 10.10.147.214 +add test 10.10.147.215 +add test 10.10.147.216 +add test 10.10.147.217 +add test 10.10.147.218 +add test 10.10.147.219 +add test 10.10.147.22 +add test 10.10.147.220 +add test 10.10.147.221 +add test 10.10.147.222 +add test 10.10.147.223 +add test 10.10.147.224 +add test 10.10.147.225 +add test 10.10.147.226 +add test 10.10.147.227 +add test 10.10.147.228 +add test 10.10.147.229 +add test 10.10.147.23 +add test 10.10.147.230 +add test 10.10.147.231 +add test 10.10.147.232 +add test 10.10.147.233 +add test 10.10.147.234 +add test 10.10.147.235 +add test 10.10.147.236 +add test 10.10.147.237 +add test 10.10.147.238 +add test 10.10.147.239 +add test 10.10.147.24 +add test 10.10.147.240 +add test 10.10.147.241 +add test 10.10.147.242 +add test 10.10.147.243 +add test 10.10.147.244 +add test 10.10.147.245 +add test 10.10.147.246 +add test 10.10.147.247 +add test 10.10.147.248 +add test 10.10.147.249 +add test 10.10.147.25 +add test 10.10.147.250 +add test 10.10.147.251 +add test 10.10.147.252 +add test 10.10.147.253 +add test 10.10.147.254 +add test 10.10.147.255 +add test 10.10.147.26 +add test 10.10.147.27 +add test 10.10.147.28 +add test 10.10.147.29 +add test 10.10.147.3 +add test 10.10.147.30 +add test 10.10.147.31 +add test 10.10.147.32 +add test 10.10.147.33 +add test 10.10.147.34 +add test 10.10.147.35 +add test 10.10.147.36 +add test 10.10.147.37 +add test 10.10.147.38 +add test 10.10.147.39 +add test 10.10.147.4 +add test 10.10.147.40 +add test 10.10.147.41 +add test 10.10.147.42 +add test 10.10.147.43 +add test 10.10.147.44 +add test 10.10.147.45 +add test 10.10.147.46 +add test 10.10.147.47 +add test 10.10.147.48 +add test 10.10.147.49 +add test 10.10.147.5 +add test 10.10.147.50 +add test 10.10.147.51 +add test 10.10.147.52 +add test 10.10.147.53 +add test 10.10.147.54 +add test 10.10.147.55 +add test 10.10.147.56 +add test 10.10.147.57 +add test 10.10.147.58 +add test 10.10.147.59 +add test 10.10.147.6 +add test 10.10.147.60 +add test 10.10.147.61 +add test 10.10.147.62 +add test 10.10.147.63 +add test 10.10.147.64 +add test 10.10.147.65 +add test 10.10.147.66 +add test 10.10.147.67 +add test 10.10.147.68 +add test 10.10.147.69 +add test 10.10.147.7 +add test 10.10.147.70 +add test 10.10.147.71 +add test 10.10.147.72 +add test 10.10.147.73 +add test 10.10.147.74 +add test 10.10.147.75 +add test 10.10.147.76 +add test 10.10.147.77 +add test 10.10.147.78 +add test 10.10.147.79 +add test 10.10.147.8 +add test 10.10.147.80 +add test 10.10.147.81 +add test 10.10.147.82 +add test 10.10.147.83 +add test 10.10.147.84 +add test 10.10.147.85 +add test 10.10.147.86 +add test 10.10.147.87 +add test 10.10.147.88 +add test 10.10.147.89 +add test 10.10.147.9 +add test 10.10.147.90 +add test 10.10.147.91 +add test 10.10.147.92 +add test 10.10.147.93 +add test 10.10.147.94 +add test 10.10.147.95 +add test 10.10.147.96 +add test 10.10.147.97 +add test 10.10.147.98 +add test 10.10.147.99 +add test 10.10.148.0 +add test 10.10.148.1 +add test 10.10.148.10 +add test 10.10.148.100 +add test 10.10.148.101 +add test 10.10.148.102 +add test 10.10.148.103 +add test 10.10.148.104 +add test 10.10.148.105 +add test 10.10.148.106 +add test 10.10.148.107 +add test 10.10.148.108 +add test 10.10.148.109 +add test 10.10.148.11 +add test 10.10.148.110 +add test 10.10.148.111 +add test 10.10.148.112 +add test 10.10.148.113 +add test 10.10.148.114 +add test 10.10.148.115 +add test 10.10.148.116 +add test 10.10.148.117 +add test 10.10.148.118 +add test 10.10.148.119 +add test 10.10.148.12 +add test 10.10.148.120 +add test 10.10.148.121 +add test 10.10.148.122 +add test 10.10.148.123 +add test 10.10.148.124 +add test 10.10.148.125 +add test 10.10.148.126 +add test 10.10.148.127 +add test 10.10.148.128 +add test 10.10.148.129 +add test 10.10.148.13 +add test 10.10.148.130 +add test 10.10.148.131 +add test 10.10.148.132 +add test 10.10.148.133 +add test 10.10.148.134 +add test 10.10.148.135 +add test 10.10.148.136 +add test 10.10.148.137 +add test 10.10.148.138 +add test 10.10.148.139 +add test 10.10.148.14 +add test 10.10.148.140 +add test 10.10.148.141 +add test 10.10.148.142 +add test 10.10.148.143 +add test 10.10.148.144 +add test 10.10.148.145 +add test 10.10.148.146 +add test 10.10.148.147 +add test 10.10.148.148 +add test 10.10.148.149 +add test 10.10.148.15 +add test 10.10.148.150 +add test 10.10.148.151 +add test 10.10.148.152 +add test 10.10.148.153 +add test 10.10.148.154 +add test 10.10.148.155 +add test 10.10.148.156 +add test 10.10.148.157 +add test 10.10.148.158 +add test 10.10.148.159 +add test 10.10.148.16 +add test 10.10.148.160 +add test 10.10.148.161 +add test 10.10.148.162 +add test 10.10.148.163 +add test 10.10.148.164 +add test 10.10.148.165 +add test 10.10.148.166 +add test 10.10.148.167 +add test 10.10.148.168 +add test 10.10.148.169 +add test 10.10.148.17 +add test 10.10.148.170 +add test 10.10.148.171 +add test 10.10.148.172 +add test 10.10.148.173 +add test 10.10.148.174 +add test 10.10.148.175 +add test 10.10.148.176 +add test 10.10.148.177 +add test 10.10.148.178 +add test 10.10.148.179 +add test 10.10.148.18 +add test 10.10.148.180 +add test 10.10.148.181 +add test 10.10.148.182 +add test 10.10.148.183 +add test 10.10.148.184 +add test 10.10.148.185 +add test 10.10.148.186 +add test 10.10.148.187 +add test 10.10.148.188 +add test 10.10.148.189 +add test 10.10.148.19 +add test 10.10.148.190 +add test 10.10.148.191 +add test 10.10.148.192 +add test 10.10.148.193 +add test 10.10.148.194 +add test 10.10.148.195 +add test 10.10.148.196 +add test 10.10.148.197 +add test 10.10.148.198 +add test 10.10.148.199 +add test 10.10.148.2 +add test 10.10.148.20 +add test 10.10.148.200 +add test 10.10.148.201 +add test 10.10.148.202 +add test 10.10.148.203 +add test 10.10.148.204 +add test 10.10.148.205 +add test 10.10.148.206 +add test 10.10.148.207 +add test 10.10.148.208 +add test 10.10.148.209 +add test 10.10.148.21 +add test 10.10.148.210 +add test 10.10.148.211 +add test 10.10.148.212 +add test 10.10.148.213 +add test 10.10.148.214 +add test 10.10.148.215 +add test 10.10.148.216 +add test 10.10.148.217 +add test 10.10.148.218 +add test 10.10.148.219 +add test 10.10.148.22 +add test 10.10.148.220 +add test 10.10.148.221 +add test 10.10.148.222 +add test 10.10.148.223 +add test 10.10.148.224 +add test 10.10.148.225 +add test 10.10.148.226 +add test 10.10.148.227 +add test 10.10.148.228 +add test 10.10.148.229 +add test 10.10.148.23 +add test 10.10.148.230 +add test 10.10.148.231 +add test 10.10.148.232 +add test 10.10.148.233 +add test 10.10.148.234 +add test 10.10.148.235 +add test 10.10.148.236 +add test 10.10.148.237 +add test 10.10.148.238 +add test 10.10.148.239 +add test 10.10.148.24 +add test 10.10.148.240 +add test 10.10.148.241 +add test 10.10.148.242 +add test 10.10.148.243 +add test 10.10.148.244 +add test 10.10.148.245 +add test 10.10.148.246 +add test 10.10.148.247 +add test 10.10.148.248 +add test 10.10.148.249 +add test 10.10.148.25 +add test 10.10.148.250 +add test 10.10.148.251 +add test 10.10.148.252 +add test 10.10.148.253 +add test 10.10.148.254 +add test 10.10.148.255 +add test 10.10.148.26 +add test 10.10.148.27 +add test 10.10.148.28 +add test 10.10.148.29 +add test 10.10.148.3 +add test 10.10.148.30 +add test 10.10.148.31 +add test 10.10.148.32 +add test 10.10.148.33 +add test 10.10.148.34 +add test 10.10.148.35 +add test 10.10.148.36 +add test 10.10.148.37 +add test 10.10.148.38 +add test 10.10.148.39 +add test 10.10.148.4 +add test 10.10.148.40 +add test 10.10.148.41 +add test 10.10.148.42 +add test 10.10.148.43 +add test 10.10.148.44 +add test 10.10.148.45 +add test 10.10.148.46 +add test 10.10.148.47 +add test 10.10.148.48 +add test 10.10.148.49 +add test 10.10.148.5 +add test 10.10.148.50 +add test 10.10.148.51 +add test 10.10.148.52 +add test 10.10.148.53 +add test 10.10.148.54 +add test 10.10.148.55 +add test 10.10.148.56 +add test 10.10.148.57 +add test 10.10.148.58 +add test 10.10.148.59 +add test 10.10.148.6 +add test 10.10.148.60 +add test 10.10.148.61 +add test 10.10.148.62 +add test 10.10.148.63 +add test 10.10.148.64 +add test 10.10.148.65 +add test 10.10.148.66 +add test 10.10.148.67 +add test 10.10.148.68 +add test 10.10.148.69 +add test 10.10.148.7 +add test 10.10.148.70 +add test 10.10.148.71 +add test 10.10.148.72 +add test 10.10.148.73 +add test 10.10.148.74 +add test 10.10.148.75 +add test 10.10.148.76 +add test 10.10.148.77 +add test 10.10.148.78 +add test 10.10.148.79 +add test 10.10.148.8 +add test 10.10.148.80 +add test 10.10.148.81 +add test 10.10.148.82 +add test 10.10.148.83 +add test 10.10.148.84 +add test 10.10.148.85 +add test 10.10.148.86 +add test 10.10.148.87 +add test 10.10.148.88 +add test 10.10.148.89 +add test 10.10.148.9 +add test 10.10.148.90 +add test 10.10.148.91 +add test 10.10.148.92 +add test 10.10.148.93 +add test 10.10.148.94 +add test 10.10.148.95 +add test 10.10.148.96 +add test 10.10.148.97 +add test 10.10.148.98 +add test 10.10.148.99 +add test 10.10.149.0 +add test 10.10.149.1 +add test 10.10.149.10 +add test 10.10.149.100 +add test 10.10.149.101 +add test 10.10.149.102 +add test 10.10.149.103 +add test 10.10.149.104 +add test 10.10.149.105 +add test 10.10.149.106 +add test 10.10.149.107 +add test 10.10.149.108 +add test 10.10.149.109 +add test 10.10.149.11 +add test 10.10.149.110 +add test 10.10.149.111 +add test 10.10.149.112 +add test 10.10.149.113 +add test 10.10.149.114 +add test 10.10.149.115 +add test 10.10.149.116 +add test 10.10.149.117 +add test 10.10.149.118 +add test 10.10.149.119 +add test 10.10.149.12 +add test 10.10.149.120 +add test 10.10.149.121 +add test 10.10.149.122 +add test 10.10.149.123 +add test 10.10.149.124 +add test 10.10.149.125 +add test 10.10.149.126 +add test 10.10.149.127 +add test 10.10.149.128 +add test 10.10.149.129 +add test 10.10.149.13 +add test 10.10.149.130 +add test 10.10.149.131 +add test 10.10.149.132 +add test 10.10.149.133 +add test 10.10.149.134 +add test 10.10.149.135 +add test 10.10.149.136 +add test 10.10.149.137 +add test 10.10.149.138 +add test 10.10.149.139 +add test 10.10.149.14 +add test 10.10.149.140 +add test 10.10.149.141 +add test 10.10.149.142 +add test 10.10.149.143 +add test 10.10.149.144 +add test 10.10.149.145 +add test 10.10.149.146 +add test 10.10.149.147 +add test 10.10.149.148 +add test 10.10.149.149 +add test 10.10.149.15 +add test 10.10.149.150 +add test 10.10.149.151 +add test 10.10.149.152 +add test 10.10.149.153 +add test 10.10.149.154 +add test 10.10.149.155 +add test 10.10.149.156 +add test 10.10.149.157 +add test 10.10.149.158 +add test 10.10.149.159 +add test 10.10.149.16 +add test 10.10.149.160 +add test 10.10.149.161 +add test 10.10.149.162 +add test 10.10.149.163 +add test 10.10.149.164 +add test 10.10.149.165 +add test 10.10.149.166 +add test 10.10.149.167 +add test 10.10.149.168 +add test 10.10.149.169 +add test 10.10.149.17 +add test 10.10.149.170 +add test 10.10.149.171 +add test 10.10.149.172 +add test 10.10.149.173 +add test 10.10.149.174 +add test 10.10.149.175 +add test 10.10.149.176 +add test 10.10.149.177 +add test 10.10.149.178 +add test 10.10.149.179 +add test 10.10.149.18 +add test 10.10.149.180 +add test 10.10.149.181 +add test 10.10.149.182 +add test 10.10.149.183 +add test 10.10.149.184 +add test 10.10.149.185 +add test 10.10.149.186 +add test 10.10.149.187 +add test 10.10.149.188 +add test 10.10.149.189 +add test 10.10.149.19 +add test 10.10.149.190 +add test 10.10.149.191 +add test 10.10.149.192 +add test 10.10.149.193 +add test 10.10.149.194 +add test 10.10.149.195 +add test 10.10.149.196 +add test 10.10.149.197 +add test 10.10.149.198 +add test 10.10.149.199 +add test 10.10.149.2 +add test 10.10.149.20 +add test 10.10.149.200 +add test 10.10.149.201 +add test 10.10.149.202 +add test 10.10.149.203 +add test 10.10.149.204 +add test 10.10.149.205 +add test 10.10.149.206 +add test 10.10.149.207 +add test 10.10.149.208 +add test 10.10.149.209 +add test 10.10.149.21 +add test 10.10.149.210 +add test 10.10.149.211 +add test 10.10.149.212 +add test 10.10.149.213 +add test 10.10.149.214 +add test 10.10.149.215 +add test 10.10.149.216 +add test 10.10.149.217 +add test 10.10.149.218 +add test 10.10.149.219 +add test 10.10.149.22 +add test 10.10.149.220 +add test 10.10.149.221 +add test 10.10.149.222 +add test 10.10.149.223 +add test 10.10.149.224 +add test 10.10.149.225 +add test 10.10.149.226 +add test 10.10.149.227 +add test 10.10.149.228 +add test 10.10.149.229 +add test 10.10.149.23 +add test 10.10.149.230 +add test 10.10.149.231 +add test 10.10.149.232 +add test 10.10.149.233 +add test 10.10.149.234 +add test 10.10.149.235 +add test 10.10.149.236 +add test 10.10.149.237 +add test 10.10.149.238 +add test 10.10.149.239 +add test 10.10.149.24 +add test 10.10.149.240 +add test 10.10.149.241 +add test 10.10.149.242 +add test 10.10.149.243 +add test 10.10.149.244 +add test 10.10.149.245 +add test 10.10.149.246 +add test 10.10.149.247 +add test 10.10.149.248 +add test 10.10.149.249 +add test 10.10.149.25 +add test 10.10.149.250 +add test 10.10.149.251 +add test 10.10.149.252 +add test 10.10.149.253 +add test 10.10.149.254 +add test 10.10.149.255 +add test 10.10.149.26 +add test 10.10.149.27 +add test 10.10.149.28 +add test 10.10.149.29 +add test 10.10.149.3 +add test 10.10.149.30 +add test 10.10.149.31 +add test 10.10.149.32 +add test 10.10.149.33 +add test 10.10.149.34 +add test 10.10.149.35 +add test 10.10.149.36 +add test 10.10.149.37 +add test 10.10.149.38 +add test 10.10.149.39 +add test 10.10.149.4 +add test 10.10.149.40 +add test 10.10.149.41 +add test 10.10.149.42 +add test 10.10.149.43 +add test 10.10.149.44 +add test 10.10.149.45 +add test 10.10.149.46 +add test 10.10.149.47 +add test 10.10.149.48 +add test 10.10.149.49 +add test 10.10.149.5 +add test 10.10.149.50 +add test 10.10.149.51 +add test 10.10.149.52 +add test 10.10.149.53 +add test 10.10.149.54 +add test 10.10.149.55 +add test 10.10.149.56 +add test 10.10.149.57 +add test 10.10.149.58 +add test 10.10.149.59 +add test 10.10.149.6 +add test 10.10.149.60 +add test 10.10.149.61 +add test 10.10.149.62 +add test 10.10.149.63 +add test 10.10.149.64 +add test 10.10.149.65 +add test 10.10.149.66 +add test 10.10.149.67 +add test 10.10.149.68 +add test 10.10.149.69 +add test 10.10.149.7 +add test 10.10.149.70 +add test 10.10.149.71 +add test 10.10.149.72 +add test 10.10.149.73 +add test 10.10.149.74 +add test 10.10.149.75 +add test 10.10.149.76 +add test 10.10.149.77 +add test 10.10.149.78 +add test 10.10.149.79 +add test 10.10.149.8 +add test 10.10.149.80 +add test 10.10.149.81 +add test 10.10.149.82 +add test 10.10.149.83 +add test 10.10.149.84 +add test 10.10.149.85 +add test 10.10.149.86 +add test 10.10.149.87 +add test 10.10.149.88 +add test 10.10.149.89 +add test 10.10.149.9 +add test 10.10.149.90 +add test 10.10.149.91 +add test 10.10.149.92 +add test 10.10.149.93 +add test 10.10.149.94 +add test 10.10.149.95 +add test 10.10.149.96 +add test 10.10.149.97 +add test 10.10.149.98 +add test 10.10.149.99 +add test 10.10.15.0 +add test 10.10.15.1 +add test 10.10.15.10 +add test 10.10.15.100 +add test 10.10.15.101 +add test 10.10.15.102 +add test 10.10.15.103 +add test 10.10.15.104 +add test 10.10.15.105 +add test 10.10.15.106 +add test 10.10.15.107 +add test 10.10.15.108 +add test 10.10.15.109 +add test 10.10.15.11 +add test 10.10.15.110 +add test 10.10.15.111 +add test 10.10.15.112 +add test 10.10.15.113 +add test 10.10.15.114 +add test 10.10.15.115 +add test 10.10.15.116 +add test 10.10.15.117 +add test 10.10.15.118 +add test 10.10.15.119 +add test 10.10.15.12 +add test 10.10.15.120 +add test 10.10.15.121 +add test 10.10.15.122 +add test 10.10.15.123 +add test 10.10.15.124 +add test 10.10.15.125 +add test 10.10.15.126 +add test 10.10.15.127 +add test 10.10.15.128 +add test 10.10.15.129 +add test 10.10.15.13 +add test 10.10.15.130 +add test 10.10.15.131 +add test 10.10.15.132 +add test 10.10.15.133 +add test 10.10.15.134 +add test 10.10.15.135 +add test 10.10.15.136 +add test 10.10.15.137 +add test 10.10.15.138 +add test 10.10.15.139 +add test 10.10.15.14 +add test 10.10.15.140 +add test 10.10.15.141 +add test 10.10.15.142 +add test 10.10.15.143 +add test 10.10.15.144 +add test 10.10.15.145 +add test 10.10.15.146 +add test 10.10.15.147 +add test 10.10.15.148 +add test 10.10.15.149 +add test 10.10.15.15 +add test 10.10.15.150 +add test 10.10.15.151 +add test 10.10.15.152 +add test 10.10.15.153 +add test 10.10.15.154 +add test 10.10.15.155 +add test 10.10.15.156 +add test 10.10.15.157 +add test 10.10.15.158 +add test 10.10.15.159 +add test 10.10.15.16 +add test 10.10.15.160 +add test 10.10.15.161 +add test 10.10.15.162 +add test 10.10.15.163 +add test 10.10.15.164 +add test 10.10.15.165 +add test 10.10.15.166 +add test 10.10.15.167 +add test 10.10.15.168 +add test 10.10.15.169 +add test 10.10.15.17 +add test 10.10.15.170 +add test 10.10.15.171 +add test 10.10.15.172 +add test 10.10.15.173 +add test 10.10.15.174 +add test 10.10.15.175 +add test 10.10.15.176 +add test 10.10.15.177 +add test 10.10.15.178 +add test 10.10.15.179 +add test 10.10.15.18 +add test 10.10.15.180 +add test 10.10.15.181 +add test 10.10.15.182 +add test 10.10.15.183 +add test 10.10.15.184 +add test 10.10.15.185 +add test 10.10.15.186 +add test 10.10.15.187 +add test 10.10.15.188 +add test 10.10.15.189 +add test 10.10.15.19 +add test 10.10.15.190 +add test 10.10.15.191 +add test 10.10.15.192 +add test 10.10.15.193 +add test 10.10.15.194 +add test 10.10.15.195 +add test 10.10.15.196 +add test 10.10.15.197 +add test 10.10.15.198 +add test 10.10.15.199 +add test 10.10.15.2 +add test 10.10.15.20 +add test 10.10.15.200 +add test 10.10.15.201 +add test 10.10.15.202 +add test 10.10.15.203 +add test 10.10.15.204 +add test 10.10.15.205 +add test 10.10.15.206 +add test 10.10.15.207 +add test 10.10.15.208 +add test 10.10.15.209 +add test 10.10.15.21 +add test 10.10.15.210 +add test 10.10.15.211 +add test 10.10.15.212 +add test 10.10.15.213 +add test 10.10.15.214 +add test 10.10.15.215 +add test 10.10.15.216 +add test 10.10.15.217 +add test 10.10.15.218 +add test 10.10.15.219 +add test 10.10.15.22 +add test 10.10.15.220 +add test 10.10.15.221 +add test 10.10.15.222 +add test 10.10.15.223 +add test 10.10.15.224 +add test 10.10.15.225 +add test 10.10.15.226 +add test 10.10.15.227 +add test 10.10.15.228 +add test 10.10.15.229 +add test 10.10.15.23 +add test 10.10.15.230 +add test 10.10.15.231 +add test 10.10.15.232 +add test 10.10.15.233 +add test 10.10.15.234 +add test 10.10.15.235 +add test 10.10.15.236 +add test 10.10.15.237 +add test 10.10.15.238 +add test 10.10.15.239 +add test 10.10.15.24 +add test 10.10.15.240 +add test 10.10.15.241 +add test 10.10.15.242 +add test 10.10.15.243 +add test 10.10.15.244 +add test 10.10.15.245 +add test 10.10.15.246 +add test 10.10.15.247 +add test 10.10.15.248 +add test 10.10.15.249 +add test 10.10.15.25 +add test 10.10.15.250 +add test 10.10.15.251 +add test 10.10.15.252 +add test 10.10.15.253 +add test 10.10.15.254 +add test 10.10.15.255 +add test 10.10.15.26 +add test 10.10.15.27 +add test 10.10.15.28 +add test 10.10.15.29 +add test 10.10.15.3 +add test 10.10.15.30 +add test 10.10.15.31 +add test 10.10.15.32 +add test 10.10.15.33 +add test 10.10.15.34 +add test 10.10.15.35 +add test 10.10.15.36 +add test 10.10.15.37 +add test 10.10.15.38 +add test 10.10.15.39 +add test 10.10.15.4 +add test 10.10.15.40 +add test 10.10.15.41 +add test 10.10.15.42 +add test 10.10.15.43 +add test 10.10.15.44 +add test 10.10.15.45 +add test 10.10.15.46 +add test 10.10.15.47 +add test 10.10.15.48 +add test 10.10.15.49 +add test 10.10.15.5 +add test 10.10.15.50 +add test 10.10.15.51 +add test 10.10.15.52 +add test 10.10.15.53 +add test 10.10.15.54 +add test 10.10.15.55 +add test 10.10.15.56 +add test 10.10.15.57 +add test 10.10.15.58 +add test 10.10.15.59 +add test 10.10.15.6 +add test 10.10.15.60 +add test 10.10.15.61 +add test 10.10.15.62 +add test 10.10.15.63 +add test 10.10.15.64 +add test 10.10.15.65 +add test 10.10.15.66 +add test 10.10.15.67 +add test 10.10.15.68 +add test 10.10.15.69 +add test 10.10.15.7 +add test 10.10.15.70 +add test 10.10.15.71 +add test 10.10.15.72 +add test 10.10.15.73 +add test 10.10.15.74 +add test 10.10.15.75 +add test 10.10.15.76 +add test 10.10.15.77 +add test 10.10.15.78 +add test 10.10.15.79 +add test 10.10.15.8 +add test 10.10.15.80 +add test 10.10.15.81 +add test 10.10.15.82 +add test 10.10.15.83 +add test 10.10.15.84 +add test 10.10.15.85 +add test 10.10.15.86 +add test 10.10.15.87 +add test 10.10.15.88 +add test 10.10.15.89 +add test 10.10.15.9 +add test 10.10.15.90 +add test 10.10.15.91 +add test 10.10.15.92 +add test 10.10.15.93 +add test 10.10.15.94 +add test 10.10.15.95 +add test 10.10.15.96 +add test 10.10.15.97 +add test 10.10.15.98 +add test 10.10.15.99 +add test 10.10.150.0 +add test 10.10.150.1 +add test 10.10.150.10 +add test 10.10.150.100 +add test 10.10.150.101 +add test 10.10.150.102 +add test 10.10.150.103 +add test 10.10.150.104 +add test 10.10.150.105 +add test 10.10.150.106 +add test 10.10.150.107 +add test 10.10.150.108 +add test 10.10.150.109 +add test 10.10.150.11 +add test 10.10.150.110 +add test 10.10.150.111 +add test 10.10.150.112 +add test 10.10.150.113 +add test 10.10.150.114 +add test 10.10.150.115 +add test 10.10.150.116 +add test 10.10.150.117 +add test 10.10.150.118 +add test 10.10.150.119 +add test 10.10.150.12 +add test 10.10.150.120 +add test 10.10.150.121 +add test 10.10.150.122 +add test 10.10.150.123 +add test 10.10.150.124 +add test 10.10.150.125 +add test 10.10.150.126 +add test 10.10.150.127 +add test 10.10.150.128 +add test 10.10.150.129 +add test 10.10.150.13 +add test 10.10.150.130 +add test 10.10.150.131 +add test 10.10.150.132 +add test 10.10.150.133 +add test 10.10.150.134 +add test 10.10.150.135 +add test 10.10.150.136 +add test 10.10.150.137 +add test 10.10.150.138 +add test 10.10.150.139 +add test 10.10.150.14 +add test 10.10.150.140 +add test 10.10.150.141 +add test 10.10.150.142 +add test 10.10.150.143 +add test 10.10.150.144 +add test 10.10.150.145 +add test 10.10.150.146 +add test 10.10.150.147 +add test 10.10.150.148 +add test 10.10.150.149 +add test 10.10.150.15 +add test 10.10.150.150 +add test 10.10.150.151 +add test 10.10.150.152 +add test 10.10.150.153 +add test 10.10.150.154 +add test 10.10.150.155 +add test 10.10.150.156 +add test 10.10.150.157 +add test 10.10.150.158 +add test 10.10.150.159 +add test 10.10.150.16 +add test 10.10.150.160 +add test 10.10.150.161 +add test 10.10.150.162 +add test 10.10.150.163 +add test 10.10.150.164 +add test 10.10.150.165 +add test 10.10.150.166 +add test 10.10.150.167 +add test 10.10.150.168 +add test 10.10.150.169 +add test 10.10.150.17 +add test 10.10.150.170 +add test 10.10.150.171 +add test 10.10.150.172 +add test 10.10.150.173 +add test 10.10.150.174 +add test 10.10.150.175 +add test 10.10.150.176 +add test 10.10.150.177 +add test 10.10.150.178 +add test 10.10.150.179 +add test 10.10.150.18 +add test 10.10.150.180 +add test 10.10.150.181 +add test 10.10.150.182 +add test 10.10.150.183 +add test 10.10.150.184 +add test 10.10.150.185 +add test 10.10.150.186 +add test 10.10.150.187 +add test 10.10.150.188 +add test 10.10.150.189 +add test 10.10.150.19 +add test 10.10.150.190 +add test 10.10.150.191 +add test 10.10.150.192 +add test 10.10.150.193 +add test 10.10.150.194 +add test 10.10.150.195 +add test 10.10.150.196 +add test 10.10.150.197 +add test 10.10.150.198 +add test 10.10.150.199 +add test 10.10.150.2 +add test 10.10.150.20 +add test 10.10.150.200 +add test 10.10.150.201 +add test 10.10.150.202 +add test 10.10.150.203 +add test 10.10.150.204 +add test 10.10.150.205 +add test 10.10.150.206 +add test 10.10.150.207 +add test 10.10.150.208 +add test 10.10.150.209 +add test 10.10.150.21 +add test 10.10.150.210 +add test 10.10.150.211 +add test 10.10.150.212 +add test 10.10.150.213 +add test 10.10.150.214 +add test 10.10.150.215 +add test 10.10.150.216 +add test 10.10.150.217 +add test 10.10.150.218 +add test 10.10.150.219 +add test 10.10.150.22 +add test 10.10.150.220 +add test 10.10.150.221 +add test 10.10.150.222 +add test 10.10.150.223 +add test 10.10.150.224 +add test 10.10.150.225 +add test 10.10.150.226 +add test 10.10.150.227 +add test 10.10.150.228 +add test 10.10.150.229 +add test 10.10.150.23 +add test 10.10.150.230 +add test 10.10.150.231 +add test 10.10.150.232 +add test 10.10.150.233 +add test 10.10.150.234 +add test 10.10.150.235 +add test 10.10.150.236 +add test 10.10.150.237 +add test 10.10.150.238 +add test 10.10.150.239 +add test 10.10.150.24 +add test 10.10.150.240 +add test 10.10.150.241 +add test 10.10.150.242 +add test 10.10.150.243 +add test 10.10.150.244 +add test 10.10.150.245 +add test 10.10.150.246 +add test 10.10.150.247 +add test 10.10.150.248 +add test 10.10.150.249 +add test 10.10.150.25 +add test 10.10.150.250 +add test 10.10.150.251 +add test 10.10.150.252 +add test 10.10.150.253 +add test 10.10.150.254 +add test 10.10.150.255 +add test 10.10.150.26 +add test 10.10.150.27 +add test 10.10.150.28 +add test 10.10.150.29 +add test 10.10.150.3 +add test 10.10.150.30 +add test 10.10.150.31 +add test 10.10.150.32 +add test 10.10.150.33 +add test 10.10.150.34 +add test 10.10.150.35 +add test 10.10.150.36 +add test 10.10.150.37 +add test 10.10.150.38 +add test 10.10.150.39 +add test 10.10.150.4 +add test 10.10.150.40 +add test 10.10.150.41 +add test 10.10.150.42 +add test 10.10.150.43 +add test 10.10.150.44 +add test 10.10.150.45 +add test 10.10.150.46 +add test 10.10.150.47 +add test 10.10.150.48 +add test 10.10.150.49 +add test 10.10.150.5 +add test 10.10.150.50 +add test 10.10.150.51 +add test 10.10.150.52 +add test 10.10.150.53 +add test 10.10.150.54 +add test 10.10.150.55 +add test 10.10.150.56 +add test 10.10.150.57 +add test 10.10.150.58 +add test 10.10.150.59 +add test 10.10.150.6 +add test 10.10.150.60 +add test 10.10.150.61 +add test 10.10.150.62 +add test 10.10.150.63 +add test 10.10.150.64 +add test 10.10.150.65 +add test 10.10.150.66 +add test 10.10.150.67 +add test 10.10.150.68 +add test 10.10.150.69 +add test 10.10.150.7 +add test 10.10.150.70 +add test 10.10.150.71 +add test 10.10.150.72 +add test 10.10.150.73 +add test 10.10.150.74 +add test 10.10.150.75 +add test 10.10.150.76 +add test 10.10.150.77 +add test 10.10.150.78 +add test 10.10.150.79 +add test 10.10.150.8 +add test 10.10.150.80 +add test 10.10.150.81 +add test 10.10.150.82 +add test 10.10.150.83 +add test 10.10.150.84 +add test 10.10.150.85 +add test 10.10.150.86 +add test 10.10.150.87 +add test 10.10.150.88 +add test 10.10.150.89 +add test 10.10.150.9 +add test 10.10.150.90 +add test 10.10.150.91 +add test 10.10.150.92 +add test 10.10.150.93 +add test 10.10.150.94 +add test 10.10.150.95 +add test 10.10.150.96 +add test 10.10.150.97 +add test 10.10.150.98 +add test 10.10.150.99 +add test 10.10.151.0 +add test 10.10.151.1 +add test 10.10.151.10 +add test 10.10.151.100 +add test 10.10.151.101 +add test 10.10.151.102 +add test 10.10.151.103 +add test 10.10.151.104 +add test 10.10.151.105 +add test 10.10.151.106 +add test 10.10.151.107 +add test 10.10.151.108 +add test 10.10.151.109 +add test 10.10.151.11 +add test 10.10.151.110 +add test 10.10.151.111 +add test 10.10.151.112 +add test 10.10.151.113 +add test 10.10.151.114 +add test 10.10.151.115 +add test 10.10.151.116 +add test 10.10.151.117 +add test 10.10.151.118 +add test 10.10.151.119 +add test 10.10.151.12 +add test 10.10.151.120 +add test 10.10.151.121 +add test 10.10.151.122 +add test 10.10.151.123 +add test 10.10.151.124 +add test 10.10.151.125 +add test 10.10.151.126 +add test 10.10.151.127 +add test 10.10.151.128 +add test 10.10.151.129 +add test 10.10.151.13 +add test 10.10.151.130 +add test 10.10.151.131 +add test 10.10.151.132 +add test 10.10.151.133 +add test 10.10.151.134 +add test 10.10.151.135 +add test 10.10.151.136 +add test 10.10.151.137 +add test 10.10.151.138 +add test 10.10.151.139 +add test 10.10.151.14 +add test 10.10.151.140 +add test 10.10.151.141 +add test 10.10.151.142 +add test 10.10.151.143 +add test 10.10.151.144 +add test 10.10.151.145 +add test 10.10.151.146 +add test 10.10.151.147 +add test 10.10.151.148 +add test 10.10.151.149 +add test 10.10.151.15 +add test 10.10.151.150 +add test 10.10.151.151 +add test 10.10.151.152 +add test 10.10.151.153 +add test 10.10.151.154 +add test 10.10.151.155 +add test 10.10.151.156 +add test 10.10.151.157 +add test 10.10.151.158 +add test 10.10.151.159 +add test 10.10.151.16 +add test 10.10.151.160 +add test 10.10.151.161 +add test 10.10.151.162 +add test 10.10.151.163 +add test 10.10.151.164 +add test 10.10.151.165 +add test 10.10.151.166 +add test 10.10.151.167 +add test 10.10.151.168 +add test 10.10.151.169 +add test 10.10.151.17 +add test 10.10.151.170 +add test 10.10.151.171 +add test 10.10.151.172 +add test 10.10.151.173 +add test 10.10.151.174 +add test 10.10.151.175 +add test 10.10.151.176 +add test 10.10.151.177 +add test 10.10.151.178 +add test 10.10.151.179 +add test 10.10.151.18 +add test 10.10.151.180 +add test 10.10.151.181 +add test 10.10.151.182 +add test 10.10.151.183 +add test 10.10.151.184 +add test 10.10.151.185 +add test 10.10.151.186 +add test 10.10.151.187 +add test 10.10.151.188 +add test 10.10.151.189 +add test 10.10.151.19 +add test 10.10.151.190 +add test 10.10.151.191 +add test 10.10.151.192 +add test 10.10.151.193 +add test 10.10.151.194 +add test 10.10.151.195 +add test 10.10.151.196 +add test 10.10.151.197 +add test 10.10.151.198 +add test 10.10.151.199 +add test 10.10.151.2 +add test 10.10.151.20 +add test 10.10.151.200 +add test 10.10.151.201 +add test 10.10.151.202 +add test 10.10.151.203 +add test 10.10.151.204 +add test 10.10.151.205 +add test 10.10.151.206 +add test 10.10.151.207 +add test 10.10.151.208 +add test 10.10.151.209 +add test 10.10.151.21 +add test 10.10.151.210 +add test 10.10.151.211 +add test 10.10.151.212 +add test 10.10.151.213 +add test 10.10.151.214 +add test 10.10.151.215 +add test 10.10.151.216 +add test 10.10.151.217 +add test 10.10.151.218 +add test 10.10.151.219 +add test 10.10.151.22 +add test 10.10.151.220 +add test 10.10.151.221 +add test 10.10.151.222 +add test 10.10.151.223 +add test 10.10.151.224 +add test 10.10.151.225 +add test 10.10.151.226 +add test 10.10.151.227 +add test 10.10.151.228 +add test 10.10.151.229 +add test 10.10.151.23 +add test 10.10.151.230 +add test 10.10.151.231 +add test 10.10.151.232 +add test 10.10.151.233 +add test 10.10.151.234 +add test 10.10.151.235 +add test 10.10.151.236 +add test 10.10.151.237 +add test 10.10.151.238 +add test 10.10.151.239 +add test 10.10.151.24 +add test 10.10.151.240 +add test 10.10.151.241 +add test 10.10.151.242 +add test 10.10.151.243 +add test 10.10.151.244 +add test 10.10.151.245 +add test 10.10.151.246 +add test 10.10.151.247 +add test 10.10.151.248 +add test 10.10.151.249 +add test 10.10.151.25 +add test 10.10.151.250 +add test 10.10.151.251 +add test 10.10.151.252 +add test 10.10.151.253 +add test 10.10.151.254 +add test 10.10.151.255 +add test 10.10.151.26 +add test 10.10.151.27 +add test 10.10.151.28 +add test 10.10.151.29 +add test 10.10.151.3 +add test 10.10.151.30 +add test 10.10.151.31 +add test 10.10.151.32 +add test 10.10.151.33 +add test 10.10.151.34 +add test 10.10.151.35 +add test 10.10.151.36 +add test 10.10.151.37 +add test 10.10.151.38 +add test 10.10.151.39 +add test 10.10.151.4 +add test 10.10.151.40 +add test 10.10.151.41 +add test 10.10.151.42 +add test 10.10.151.43 +add test 10.10.151.44 +add test 10.10.151.45 +add test 10.10.151.46 +add test 10.10.151.47 +add test 10.10.151.48 +add test 10.10.151.49 +add test 10.10.151.5 +add test 10.10.151.50 +add test 10.10.151.51 +add test 10.10.151.52 +add test 10.10.151.53 +add test 10.10.151.54 +add test 10.10.151.55 +add test 10.10.151.56 +add test 10.10.151.57 +add test 10.10.151.58 +add test 10.10.151.59 +add test 10.10.151.6 +add test 10.10.151.60 +add test 10.10.151.61 +add test 10.10.151.62 +add test 10.10.151.63 +add test 10.10.151.64 +add test 10.10.151.65 +add test 10.10.151.66 +add test 10.10.151.67 +add test 10.10.151.68 +add test 10.10.151.69 +add test 10.10.151.7 +add test 10.10.151.70 +add test 10.10.151.71 +add test 10.10.151.72 +add test 10.10.151.73 +add test 10.10.151.74 +add test 10.10.151.75 +add test 10.10.151.76 +add test 10.10.151.77 +add test 10.10.151.78 +add test 10.10.151.79 +add test 10.10.151.8 +add test 10.10.151.80 +add test 10.10.151.81 +add test 10.10.151.82 +add test 10.10.151.83 +add test 10.10.151.84 +add test 10.10.151.85 +add test 10.10.151.86 +add test 10.10.151.87 +add test 10.10.151.88 +add test 10.10.151.89 +add test 10.10.151.9 +add test 10.10.151.90 +add test 10.10.151.91 +add test 10.10.151.92 +add test 10.10.151.93 +add test 10.10.151.94 +add test 10.10.151.95 +add test 10.10.151.96 +add test 10.10.151.97 +add test 10.10.151.98 +add test 10.10.151.99 +add test 10.10.152.0 +add test 10.10.152.1 +add test 10.10.152.10 +add test 10.10.152.100 +add test 10.10.152.101 +add test 10.10.152.102 +add test 10.10.152.103 +add test 10.10.152.104 +add test 10.10.152.105 +add test 10.10.152.106 +add test 10.10.152.107 +add test 10.10.152.108 +add test 10.10.152.109 +add test 10.10.152.11 +add test 10.10.152.110 +add test 10.10.152.111 +add test 10.10.152.112 +add test 10.10.152.113 +add test 10.10.152.114 +add test 10.10.152.115 +add test 10.10.152.116 +add test 10.10.152.117 +add test 10.10.152.118 +add test 10.10.152.119 +add test 10.10.152.12 +add test 10.10.152.120 +add test 10.10.152.121 +add test 10.10.152.122 +add test 10.10.152.123 +add test 10.10.152.124 +add test 10.10.152.125 +add test 10.10.152.126 +add test 10.10.152.127 +add test 10.10.152.128 +add test 10.10.152.129 +add test 10.10.152.13 +add test 10.10.152.130 +add test 10.10.152.131 +add test 10.10.152.132 +add test 10.10.152.133 +add test 10.10.152.134 +add test 10.10.152.135 +add test 10.10.152.136 +add test 10.10.152.137 +add test 10.10.152.138 +add test 10.10.152.139 +add test 10.10.152.14 +add test 10.10.152.140 +add test 10.10.152.141 +add test 10.10.152.142 +add test 10.10.152.143 +add test 10.10.152.144 +add test 10.10.152.145 +add test 10.10.152.146 +add test 10.10.152.147 +add test 10.10.152.148 +add test 10.10.152.149 +add test 10.10.152.15 +add test 10.10.152.150 +add test 10.10.152.151 +add test 10.10.152.152 +add test 10.10.152.153 +add test 10.10.152.154 +add test 10.10.152.155 +add test 10.10.152.156 +add test 10.10.152.157 +add test 10.10.152.158 +add test 10.10.152.159 +add test 10.10.152.16 +add test 10.10.152.160 +add test 10.10.152.161 +add test 10.10.152.162 +add test 10.10.152.163 +add test 10.10.152.164 +add test 10.10.152.165 +add test 10.10.152.166 +add test 10.10.152.167 +add test 10.10.152.168 +add test 10.10.152.169 +add test 10.10.152.17 +add test 10.10.152.170 +add test 10.10.152.171 +add test 10.10.152.172 +add test 10.10.152.173 +add test 10.10.152.174 +add test 10.10.152.175 +add test 10.10.152.176 +add test 10.10.152.177 +add test 10.10.152.178 +add test 10.10.152.179 +add test 10.10.152.18 +add test 10.10.152.180 +add test 10.10.152.181 +add test 10.10.152.182 +add test 10.10.152.183 +add test 10.10.152.184 +add test 10.10.152.185 +add test 10.10.152.186 +add test 10.10.152.187 +add test 10.10.152.188 +add test 10.10.152.189 +add test 10.10.152.19 +add test 10.10.152.190 +add test 10.10.152.191 +add test 10.10.152.192 +add test 10.10.152.193 +add test 10.10.152.194 +add test 10.10.152.195 +add test 10.10.152.196 +add test 10.10.152.197 +add test 10.10.152.198 +add test 10.10.152.199 +add test 10.10.152.2 +add test 10.10.152.20 +add test 10.10.152.200 +add test 10.10.152.201 +add test 10.10.152.202 +add test 10.10.152.203 +add test 10.10.152.204 +add test 10.10.152.205 +add test 10.10.152.206 +add test 10.10.152.207 +add test 10.10.152.208 +add test 10.10.152.209 +add test 10.10.152.21 +add test 10.10.152.210 +add test 10.10.152.211 +add test 10.10.152.212 +add test 10.10.152.213 +add test 10.10.152.214 +add test 10.10.152.215 +add test 10.10.152.216 +add test 10.10.152.217 +add test 10.10.152.218 +add test 10.10.152.219 +add test 10.10.152.22 +add test 10.10.152.220 +add test 10.10.152.221 +add test 10.10.152.222 +add test 10.10.152.223 +add test 10.10.152.224 +add test 10.10.152.225 +add test 10.10.152.226 +add test 10.10.152.227 +add test 10.10.152.228 +add test 10.10.152.229 +add test 10.10.152.23 +add test 10.10.152.230 +add test 10.10.152.231 +add test 10.10.152.232 +add test 10.10.152.233 +add test 10.10.152.234 +add test 10.10.152.235 +add test 10.10.152.236 +add test 10.10.152.237 +add test 10.10.152.238 +add test 10.10.152.239 +add test 10.10.152.24 +add test 10.10.152.240 +add test 10.10.152.241 +add test 10.10.152.242 +add test 10.10.152.243 +add test 10.10.152.244 +add test 10.10.152.245 +add test 10.10.152.246 +add test 10.10.152.247 +add test 10.10.152.248 +add test 10.10.152.249 +add test 10.10.152.25 +add test 10.10.152.250 +add test 10.10.152.251 +add test 10.10.152.252 +add test 10.10.152.253 +add test 10.10.152.254 +add test 10.10.152.255 +add test 10.10.152.26 +add test 10.10.152.27 +add test 10.10.152.28 +add test 10.10.152.29 +add test 10.10.152.3 +add test 10.10.152.30 +add test 10.10.152.31 +add test 10.10.152.32 +add test 10.10.152.33 +add test 10.10.152.34 +add test 10.10.152.35 +add test 10.10.152.36 +add test 10.10.152.37 +add test 10.10.152.38 +add test 10.10.152.39 +add test 10.10.152.4 +add test 10.10.152.40 +add test 10.10.152.41 +add test 10.10.152.42 +add test 10.10.152.43 +add test 10.10.152.44 +add test 10.10.152.45 +add test 10.10.152.46 +add test 10.10.152.47 +add test 10.10.152.48 +add test 10.10.152.49 +add test 10.10.152.5 +add test 10.10.152.50 +add test 10.10.152.51 +add test 10.10.152.52 +add test 10.10.152.53 +add test 10.10.152.54 +add test 10.10.152.55 +add test 10.10.152.56 +add test 10.10.152.57 +add test 10.10.152.58 +add test 10.10.152.59 +add test 10.10.152.6 +add test 10.10.152.60 +add test 10.10.152.61 +add test 10.10.152.62 +add test 10.10.152.63 +add test 10.10.152.64 +add test 10.10.152.65 +add test 10.10.152.66 +add test 10.10.152.67 +add test 10.10.152.68 +add test 10.10.152.69 +add test 10.10.152.7 +add test 10.10.152.70 +add test 10.10.152.71 +add test 10.10.152.72 +add test 10.10.152.73 +add test 10.10.152.74 +add test 10.10.152.75 +add test 10.10.152.76 +add test 10.10.152.77 +add test 10.10.152.78 +add test 10.10.152.79 +add test 10.10.152.8 +add test 10.10.152.80 +add test 10.10.152.81 +add test 10.10.152.82 +add test 10.10.152.83 +add test 10.10.152.84 +add test 10.10.152.85 +add test 10.10.152.86 +add test 10.10.152.87 +add test 10.10.152.88 +add test 10.10.152.89 +add test 10.10.152.9 +add test 10.10.152.90 +add test 10.10.152.91 +add test 10.10.152.92 +add test 10.10.152.93 +add test 10.10.152.94 +add test 10.10.152.95 +add test 10.10.152.96 +add test 10.10.152.97 +add test 10.10.152.98 +add test 10.10.152.99 +add test 10.10.153.0 +add test 10.10.153.1 +add test 10.10.153.10 +add test 10.10.153.100 +add test 10.10.153.101 +add test 10.10.153.102 +add test 10.10.153.103 +add test 10.10.153.104 +add test 10.10.153.105 +add test 10.10.153.106 +add test 10.10.153.107 +add test 10.10.153.108 +add test 10.10.153.109 +add test 10.10.153.11 +add test 10.10.153.110 +add test 10.10.153.111 +add test 10.10.153.112 +add test 10.10.153.113 +add test 10.10.153.114 +add test 10.10.153.115 +add test 10.10.153.116 +add test 10.10.153.117 +add test 10.10.153.118 +add test 10.10.153.119 +add test 10.10.153.12 +add test 10.10.153.120 +add test 10.10.153.121 +add test 10.10.153.122 +add test 10.10.153.123 +add test 10.10.153.124 +add test 10.10.153.125 +add test 10.10.153.126 +add test 10.10.153.127 +add test 10.10.153.128 +add test 10.10.153.129 +add test 10.10.153.13 +add test 10.10.153.130 +add test 10.10.153.131 +add test 10.10.153.132 +add test 10.10.153.133 +add test 10.10.153.134 +add test 10.10.153.135 +add test 10.10.153.136 +add test 10.10.153.137 +add test 10.10.153.138 +add test 10.10.153.139 +add test 10.10.153.14 +add test 10.10.153.140 +add test 10.10.153.141 +add test 10.10.153.142 +add test 10.10.153.143 +add test 10.10.153.144 +add test 10.10.153.145 +add test 10.10.153.146 +add test 10.10.153.147 +add test 10.10.153.148 +add test 10.10.153.149 +add test 10.10.153.15 +add test 10.10.153.150 +add test 10.10.153.151 +add test 10.10.153.152 +add test 10.10.153.153 +add test 10.10.153.154 +add test 10.10.153.155 +add test 10.10.153.156 +add test 10.10.153.157 +add test 10.10.153.158 +add test 10.10.153.159 +add test 10.10.153.16 +add test 10.10.153.160 +add test 10.10.153.161 +add test 10.10.153.162 +add test 10.10.153.163 +add test 10.10.153.164 +add test 10.10.153.165 +add test 10.10.153.166 +add test 10.10.153.167 +add test 10.10.153.168 +add test 10.10.153.169 +add test 10.10.153.17 +add test 10.10.153.170 +add test 10.10.153.171 +add test 10.10.153.172 +add test 10.10.153.173 +add test 10.10.153.174 +add test 10.10.153.175 +add test 10.10.153.176 +add test 10.10.153.177 +add test 10.10.153.178 +add test 10.10.153.179 +add test 10.10.153.18 +add test 10.10.153.180 +add test 10.10.153.181 +add test 10.10.153.182 +add test 10.10.153.183 +add test 10.10.153.184 +add test 10.10.153.185 +add test 10.10.153.186 +add test 10.10.153.187 +add test 10.10.153.188 +add test 10.10.153.189 +add test 10.10.153.19 +add test 10.10.153.190 +add test 10.10.153.191 +add test 10.10.153.192 +add test 10.10.153.193 +add test 10.10.153.194 +add test 10.10.153.195 +add test 10.10.153.196 +add test 10.10.153.197 +add test 10.10.153.198 +add test 10.10.153.199 +add test 10.10.153.2 +add test 10.10.153.20 +add test 10.10.153.200 +add test 10.10.153.201 +add test 10.10.153.202 +add test 10.10.153.203 +add test 10.10.153.204 +add test 10.10.153.205 +add test 10.10.153.206 +add test 10.10.153.207 +add test 10.10.153.208 +add test 10.10.153.209 +add test 10.10.153.21 +add test 10.10.153.210 +add test 10.10.153.211 +add test 10.10.153.212 +add test 10.10.153.213 +add test 10.10.153.214 +add test 10.10.153.215 +add test 10.10.153.216 +add test 10.10.153.217 +add test 10.10.153.218 +add test 10.10.153.219 +add test 10.10.153.22 +add test 10.10.153.220 +add test 10.10.153.221 +add test 10.10.153.222 +add test 10.10.153.223 +add test 10.10.153.224 +add test 10.10.153.225 +add test 10.10.153.226 +add test 10.10.153.227 +add test 10.10.153.228 +add test 10.10.153.229 +add test 10.10.153.23 +add test 10.10.153.230 +add test 10.10.153.231 +add test 10.10.153.232 +add test 10.10.153.233 +add test 10.10.153.234 +add test 10.10.153.235 +add test 10.10.153.236 +add test 10.10.153.237 +add test 10.10.153.238 +add test 10.10.153.239 +add test 10.10.153.24 +add test 10.10.153.240 +add test 10.10.153.241 +add test 10.10.153.242 +add test 10.10.153.243 +add test 10.10.153.244 +add test 10.10.153.245 +add test 10.10.153.246 +add test 10.10.153.247 +add test 10.10.153.248 +add test 10.10.153.249 +add test 10.10.153.25 +add test 10.10.153.250 +add test 10.10.153.251 +add test 10.10.153.252 +add test 10.10.153.253 +add test 10.10.153.254 +add test 10.10.153.255 +add test 10.10.153.26 +add test 10.10.153.27 +add test 10.10.153.28 +add test 10.10.153.29 +add test 10.10.153.3 +add test 10.10.153.30 +add test 10.10.153.31 +add test 10.10.153.32 +add test 10.10.153.33 +add test 10.10.153.34 +add test 10.10.153.35 +add test 10.10.153.36 +add test 10.10.153.37 +add test 10.10.153.38 +add test 10.10.153.39 +add test 10.10.153.4 +add test 10.10.153.40 +add test 10.10.153.41 +add test 10.10.153.42 +add test 10.10.153.43 +add test 10.10.153.44 +add test 10.10.153.45 +add test 10.10.153.46 +add test 10.10.153.47 +add test 10.10.153.48 +add test 10.10.153.49 +add test 10.10.153.5 +add test 10.10.153.50 +add test 10.10.153.51 +add test 10.10.153.52 +add test 10.10.153.53 +add test 10.10.153.54 +add test 10.10.153.55 +add test 10.10.153.56 +add test 10.10.153.57 +add test 10.10.153.58 +add test 10.10.153.59 +add test 10.10.153.6 +add test 10.10.153.60 +add test 10.10.153.61 +add test 10.10.153.62 +add test 10.10.153.63 +add test 10.10.153.64 +add test 10.10.153.65 +add test 10.10.153.66 +add test 10.10.153.67 +add test 10.10.153.68 +add test 10.10.153.69 +add test 10.10.153.7 +add test 10.10.153.70 +add test 10.10.153.71 +add test 10.10.153.72 +add test 10.10.153.73 +add test 10.10.153.74 +add test 10.10.153.75 +add test 10.10.153.76 +add test 10.10.153.77 +add test 10.10.153.78 +add test 10.10.153.79 +add test 10.10.153.8 +add test 10.10.153.80 +add test 10.10.153.81 +add test 10.10.153.82 +add test 10.10.153.83 +add test 10.10.153.84 +add test 10.10.153.85 +add test 10.10.153.86 +add test 10.10.153.87 +add test 10.10.153.88 +add test 10.10.153.89 +add test 10.10.153.9 +add test 10.10.153.90 +add test 10.10.153.91 +add test 10.10.153.92 +add test 10.10.153.93 +add test 10.10.153.94 +add test 10.10.153.95 +add test 10.10.153.96 +add test 10.10.153.97 +add test 10.10.153.98 +add test 10.10.153.99 +add test 10.10.154.0 +add test 10.10.154.1 +add test 10.10.154.10 +add test 10.10.154.100 +add test 10.10.154.101 +add test 10.10.154.102 +add test 10.10.154.103 +add test 10.10.154.104 +add test 10.10.154.105 +add test 10.10.154.106 +add test 10.10.154.107 +add test 10.10.154.108 +add test 10.10.154.109 +add test 10.10.154.11 +add test 10.10.154.110 +add test 10.10.154.111 +add test 10.10.154.112 +add test 10.10.154.113 +add test 10.10.154.114 +add test 10.10.154.115 +add test 10.10.154.116 +add test 10.10.154.117 +add test 10.10.154.118 +add test 10.10.154.119 +add test 10.10.154.12 +add test 10.10.154.120 +add test 10.10.154.121 +add test 10.10.154.122 +add test 10.10.154.123 +add test 10.10.154.124 +add test 10.10.154.125 +add test 10.10.154.126 +add test 10.10.154.127 +add test 10.10.154.128 +add test 10.10.154.129 +add test 10.10.154.13 +add test 10.10.154.130 +add test 10.10.154.131 +add test 10.10.154.132 +add test 10.10.154.133 +add test 10.10.154.134 +add test 10.10.154.135 +add test 10.10.154.136 +add test 10.10.154.137 +add test 10.10.154.138 +add test 10.10.154.139 +add test 10.10.154.14 +add test 10.10.154.140 +add test 10.10.154.141 +add test 10.10.154.142 +add test 10.10.154.143 +add test 10.10.154.144 +add test 10.10.154.145 +add test 10.10.154.146 +add test 10.10.154.147 +add test 10.10.154.148 +add test 10.10.154.149 +add test 10.10.154.15 +add test 10.10.154.150 +add test 10.10.154.151 +add test 10.10.154.152 +add test 10.10.154.153 +add test 10.10.154.154 +add test 10.10.154.155 +add test 10.10.154.156 +add test 10.10.154.157 +add test 10.10.154.158 +add test 10.10.154.159 +add test 10.10.154.16 +add test 10.10.154.160 +add test 10.10.154.161 +add test 10.10.154.162 +add test 10.10.154.163 +add test 10.10.154.164 +add test 10.10.154.165 +add test 10.10.154.166 +add test 10.10.154.167 +add test 10.10.154.168 +add test 10.10.154.169 +add test 10.10.154.17 +add test 10.10.154.170 +add test 10.10.154.171 +add test 10.10.154.172 +add test 10.10.154.173 +add test 10.10.154.174 +add test 10.10.154.175 +add test 10.10.154.176 +add test 10.10.154.177 +add test 10.10.154.178 +add test 10.10.154.179 +add test 10.10.154.18 +add test 10.10.154.180 +add test 10.10.154.181 +add test 10.10.154.182 +add test 10.10.154.183 +add test 10.10.154.184 +add test 10.10.154.185 +add test 10.10.154.186 +add test 10.10.154.187 +add test 10.10.154.188 +add test 10.10.154.189 +add test 10.10.154.19 +add test 10.10.154.190 +add test 10.10.154.191 +add test 10.10.154.192 +add test 10.10.154.193 +add test 10.10.154.194 +add test 10.10.154.195 +add test 10.10.154.196 +add test 10.10.154.197 +add test 10.10.154.198 +add test 10.10.154.199 +add test 10.10.154.2 +add test 10.10.154.20 +add test 10.10.154.200 +add test 10.10.154.201 +add test 10.10.154.202 +add test 10.10.154.203 +add test 10.10.154.204 +add test 10.10.154.205 +add test 10.10.154.206 +add test 10.10.154.207 +add test 10.10.154.208 +add test 10.10.154.209 +add test 10.10.154.21 +add test 10.10.154.210 +add test 10.10.154.211 +add test 10.10.154.212 +add test 10.10.154.213 +add test 10.10.154.214 +add test 10.10.154.215 +add test 10.10.154.216 +add test 10.10.154.217 +add test 10.10.154.218 +add test 10.10.154.219 +add test 10.10.154.22 +add test 10.10.154.220 +add test 10.10.154.221 +add test 10.10.154.222 +add test 10.10.154.223 +add test 10.10.154.224 +add test 10.10.154.225 +add test 10.10.154.226 +add test 10.10.154.227 +add test 10.10.154.228 +add test 10.10.154.229 +add test 10.10.154.23 +add test 10.10.154.230 +add test 10.10.154.231 +add test 10.10.154.232 +add test 10.10.154.233 +add test 10.10.154.234 +add test 10.10.154.235 +add test 10.10.154.236 +add test 10.10.154.237 +add test 10.10.154.238 +add test 10.10.154.239 +add test 10.10.154.24 +add test 10.10.154.240 +add test 10.10.154.241 +add test 10.10.154.242 +add test 10.10.154.243 +add test 10.10.154.244 +add test 10.10.154.245 +add test 10.10.154.246 +add test 10.10.154.247 +add test 10.10.154.248 +add test 10.10.154.249 +add test 10.10.154.25 +add test 10.10.154.250 +add test 10.10.154.251 +add test 10.10.154.252 +add test 10.10.154.253 +add test 10.10.154.254 +add test 10.10.154.255 +add test 10.10.154.26 +add test 10.10.154.27 +add test 10.10.154.28 +add test 10.10.154.29 +add test 10.10.154.3 +add test 10.10.154.30 +add test 10.10.154.31 +add test 10.10.154.32 +add test 10.10.154.33 +add test 10.10.154.34 +add test 10.10.154.35 +add test 10.10.154.36 +add test 10.10.154.37 +add test 10.10.154.38 +add test 10.10.154.39 +add test 10.10.154.4 +add test 10.10.154.40 +add test 10.10.154.41 +add test 10.10.154.42 +add test 10.10.154.43 +add test 10.10.154.44 +add test 10.10.154.45 +add test 10.10.154.46 +add test 10.10.154.47 +add test 10.10.154.48 +add test 10.10.154.49 +add test 10.10.154.5 +add test 10.10.154.50 +add test 10.10.154.51 +add test 10.10.154.52 +add test 10.10.154.53 +add test 10.10.154.54 +add test 10.10.154.55 +add test 10.10.154.56 +add test 10.10.154.57 +add test 10.10.154.58 +add test 10.10.154.59 +add test 10.10.154.6 +add test 10.10.154.60 +add test 10.10.154.61 +add test 10.10.154.62 +add test 10.10.154.63 +add test 10.10.154.64 +add test 10.10.154.65 +add test 10.10.154.66 +add test 10.10.154.67 +add test 10.10.154.68 +add test 10.10.154.69 +add test 10.10.154.7 +add test 10.10.154.70 +add test 10.10.154.71 +add test 10.10.154.72 +add test 10.10.154.73 +add test 10.10.154.74 +add test 10.10.154.75 +add test 10.10.154.76 +add test 10.10.154.77 +add test 10.10.154.78 +add test 10.10.154.79 +add test 10.10.154.8 +add test 10.10.154.80 +add test 10.10.154.81 +add test 10.10.154.82 +add test 10.10.154.83 +add test 10.10.154.84 +add test 10.10.154.85 +add test 10.10.154.86 +add test 10.10.154.87 +add test 10.10.154.88 +add test 10.10.154.89 +add test 10.10.154.9 +add test 10.10.154.90 +add test 10.10.154.91 +add test 10.10.154.92 +add test 10.10.154.93 +add test 10.10.154.94 +add test 10.10.154.95 +add test 10.10.154.96 +add test 10.10.154.97 +add test 10.10.154.98 +add test 10.10.154.99 +add test 10.10.155.0 +add test 10.10.155.1 +add test 10.10.155.10 +add test 10.10.155.100 +add test 10.10.155.101 +add test 10.10.155.102 +add test 10.10.155.103 +add test 10.10.155.104 +add test 10.10.155.105 +add test 10.10.155.106 +add test 10.10.155.107 +add test 10.10.155.108 +add test 10.10.155.109 +add test 10.10.155.11 +add test 10.10.155.110 +add test 10.10.155.111 +add test 10.10.155.112 +add test 10.10.155.113 +add test 10.10.155.114 +add test 10.10.155.115 +add test 10.10.155.116 +add test 10.10.155.117 +add test 10.10.155.118 +add test 10.10.155.119 +add test 10.10.155.12 +add test 10.10.155.120 +add test 10.10.155.121 +add test 10.10.155.122 +add test 10.10.155.123 +add test 10.10.155.124 +add test 10.10.155.125 +add test 10.10.155.126 +add test 10.10.155.127 +add test 10.10.155.128 +add test 10.10.155.129 +add test 10.10.155.13 +add test 10.10.155.130 +add test 10.10.155.131 +add test 10.10.155.132 +add test 10.10.155.133 +add test 10.10.155.134 +add test 10.10.155.135 +add test 10.10.155.136 +add test 10.10.155.137 +add test 10.10.155.138 +add test 10.10.155.139 +add test 10.10.155.14 +add test 10.10.155.140 +add test 10.10.155.141 +add test 10.10.155.142 +add test 10.10.155.143 +add test 10.10.155.144 +add test 10.10.155.145 +add test 10.10.155.146 +add test 10.10.155.147 +add test 10.10.155.148 +add test 10.10.155.149 +add test 10.10.155.15 +add test 10.10.155.150 +add test 10.10.155.151 +add test 10.10.155.152 +add test 10.10.155.153 +add test 10.10.155.154 +add test 10.10.155.155 +add test 10.10.155.156 +add test 10.10.155.157 +add test 10.10.155.158 +add test 10.10.155.159 +add test 10.10.155.16 +add test 10.10.155.160 +add test 10.10.155.161 +add test 10.10.155.162 +add test 10.10.155.163 +add test 10.10.155.164 +add test 10.10.155.165 +add test 10.10.155.166 +add test 10.10.155.167 +add test 10.10.155.168 +add test 10.10.155.169 +add test 10.10.155.17 +add test 10.10.155.170 +add test 10.10.155.171 +add test 10.10.155.172 +add test 10.10.155.173 +add test 10.10.155.174 +add test 10.10.155.175 +add test 10.10.155.176 +add test 10.10.155.177 +add test 10.10.155.178 +add test 10.10.155.179 +add test 10.10.155.18 +add test 10.10.155.180 +add test 10.10.155.181 +add test 10.10.155.182 +add test 10.10.155.183 +add test 10.10.155.184 +add test 10.10.155.185 +add test 10.10.155.186 +add test 10.10.155.187 +add test 10.10.155.188 +add test 10.10.155.189 +add test 10.10.155.19 +add test 10.10.155.190 +add test 10.10.155.191 +add test 10.10.155.192 +add test 10.10.155.193 +add test 10.10.155.194 +add test 10.10.155.195 +add test 10.10.155.196 +add test 10.10.155.197 +add test 10.10.155.198 +add test 10.10.155.199 +add test 10.10.155.2 +add test 10.10.155.20 +add test 10.10.155.200 +add test 10.10.155.201 +add test 10.10.155.202 +add test 10.10.155.203 +add test 10.10.155.204 +add test 10.10.155.205 +add test 10.10.155.206 +add test 10.10.155.207 +add test 10.10.155.208 +add test 10.10.155.209 +add test 10.10.155.21 +add test 10.10.155.210 +add test 10.10.155.211 +add test 10.10.155.212 +add test 10.10.155.213 +add test 10.10.155.214 +add test 10.10.155.215 +add test 10.10.155.216 +add test 10.10.155.217 +add test 10.10.155.218 +add test 10.10.155.219 +add test 10.10.155.22 +add test 10.10.155.220 +add test 10.10.155.221 +add test 10.10.155.222 +add test 10.10.155.223 +add test 10.10.155.224 +add test 10.10.155.225 +add test 10.10.155.226 +add test 10.10.155.227 +add test 10.10.155.228 +add test 10.10.155.229 +add test 10.10.155.23 +add test 10.10.155.230 +add test 10.10.155.231 +add test 10.10.155.232 +add test 10.10.155.233 +add test 10.10.155.234 +add test 10.10.155.235 +add test 10.10.155.236 +add test 10.10.155.237 +add test 10.10.155.238 +add test 10.10.155.239 +add test 10.10.155.24 +add test 10.10.155.240 +add test 10.10.155.241 +add test 10.10.155.242 +add test 10.10.155.243 +add test 10.10.155.244 +add test 10.10.155.245 +add test 10.10.155.246 +add test 10.10.155.247 +add test 10.10.155.248 +add test 10.10.155.249 +add test 10.10.155.25 +add test 10.10.155.250 +add test 10.10.155.251 +add test 10.10.155.252 +add test 10.10.155.253 +add test 10.10.155.254 +add test 10.10.155.255 +add test 10.10.155.26 +add test 10.10.155.27 +add test 10.10.155.28 +add test 10.10.155.29 +add test 10.10.155.3 +add test 10.10.155.30 +add test 10.10.155.31 +add test 10.10.155.32 +add test 10.10.155.33 +add test 10.10.155.34 +add test 10.10.155.35 +add test 10.10.155.36 +add test 10.10.155.37 +add test 10.10.155.38 +add test 10.10.155.39 +add test 10.10.155.4 +add test 10.10.155.40 +add test 10.10.155.41 +add test 10.10.155.42 +add test 10.10.155.43 +add test 10.10.155.44 +add test 10.10.155.45 +add test 10.10.155.46 +add test 10.10.155.47 +add test 10.10.155.48 +add test 10.10.155.49 +add test 10.10.155.5 +add test 10.10.155.50 +add test 10.10.155.51 +add test 10.10.155.52 +add test 10.10.155.53 +add test 10.10.155.54 +add test 10.10.155.55 +add test 10.10.155.56 +add test 10.10.155.57 +add test 10.10.155.58 +add test 10.10.155.59 +add test 10.10.155.6 +add test 10.10.155.60 +add test 10.10.155.61 +add test 10.10.155.62 +add test 10.10.155.63 +add test 10.10.155.64 +add test 10.10.155.65 +add test 10.10.155.66 +add test 10.10.155.67 +add test 10.10.155.68 +add test 10.10.155.69 +add test 10.10.155.7 +add test 10.10.155.70 +add test 10.10.155.71 +add test 10.10.155.72 +add test 10.10.155.73 +add test 10.10.155.74 +add test 10.10.155.75 +add test 10.10.155.76 +add test 10.10.155.77 +add test 10.10.155.78 +add test 10.10.155.79 +add test 10.10.155.8 +add test 10.10.155.80 +add test 10.10.155.81 +add test 10.10.155.82 +add test 10.10.155.83 +add test 10.10.155.84 +add test 10.10.155.85 +add test 10.10.155.86 +add test 10.10.155.87 +add test 10.10.155.88 +add test 10.10.155.89 +add test 10.10.155.9 +add test 10.10.155.90 +add test 10.10.155.91 +add test 10.10.155.92 +add test 10.10.155.93 +add test 10.10.155.94 +add test 10.10.155.95 +add test 10.10.155.96 +add test 10.10.155.97 +add test 10.10.155.98 +add test 10.10.155.99 +add test 10.10.156.0 +add test 10.10.156.1 +add test 10.10.156.10 +add test 10.10.156.100 +add test 10.10.156.101 +add test 10.10.156.102 +add test 10.10.156.103 +add test 10.10.156.104 +add test 10.10.156.105 +add test 10.10.156.106 +add test 10.10.156.107 +add test 10.10.156.108 +add test 10.10.156.109 +add test 10.10.156.11 +add test 10.10.156.110 +add test 10.10.156.111 +add test 10.10.156.112 +add test 10.10.156.113 +add test 10.10.156.114 +add test 10.10.156.115 +add test 10.10.156.116 +add test 10.10.156.117 +add test 10.10.156.118 +add test 10.10.156.119 +add test 10.10.156.12 +add test 10.10.156.120 +add test 10.10.156.121 +add test 10.10.156.122 +add test 10.10.156.123 +add test 10.10.156.124 +add test 10.10.156.125 +add test 10.10.156.126 +add test 10.10.156.127 +add test 10.10.156.128 +add test 10.10.156.129 +add test 10.10.156.13 +add test 10.10.156.130 +add test 10.10.156.131 +add test 10.10.156.132 +add test 10.10.156.133 +add test 10.10.156.134 +add test 10.10.156.135 +add test 10.10.156.136 +add test 10.10.156.137 +add test 10.10.156.138 +add test 10.10.156.139 +add test 10.10.156.14 +add test 10.10.156.140 +add test 10.10.156.141 +add test 10.10.156.142 +add test 10.10.156.143 +add test 10.10.156.144 +add test 10.10.156.145 +add test 10.10.156.146 +add test 10.10.156.147 +add test 10.10.156.148 +add test 10.10.156.149 +add test 10.10.156.15 +add test 10.10.156.150 +add test 10.10.156.151 +add test 10.10.156.152 +add test 10.10.156.153 +add test 10.10.156.154 +add test 10.10.156.155 +add test 10.10.156.156 +add test 10.10.156.157 +add test 10.10.156.158 +add test 10.10.156.159 +add test 10.10.156.16 +add test 10.10.156.160 +add test 10.10.156.161 +add test 10.10.156.162 +add test 10.10.156.163 +add test 10.10.156.164 +add test 10.10.156.165 +add test 10.10.156.166 +add test 10.10.156.167 +add test 10.10.156.168 +add test 10.10.156.169 +add test 10.10.156.17 +add test 10.10.156.170 +add test 10.10.156.171 +add test 10.10.156.172 +add test 10.10.156.173 +add test 10.10.156.174 +add test 10.10.156.175 +add test 10.10.156.176 +add test 10.10.156.177 +add test 10.10.156.178 +add test 10.10.156.179 +add test 10.10.156.18 +add test 10.10.156.180 +add test 10.10.156.181 +add test 10.10.156.182 +add test 10.10.156.183 +add test 10.10.156.184 +add test 10.10.156.185 +add test 10.10.156.186 +add test 10.10.156.187 +add test 10.10.156.188 +add test 10.10.156.189 +add test 10.10.156.19 +add test 10.10.156.190 +add test 10.10.156.191 +add test 10.10.156.192 +add test 10.10.156.193 +add test 10.10.156.194 +add test 10.10.156.195 +add test 10.10.156.196 +add test 10.10.156.197 +add test 10.10.156.198 +add test 10.10.156.199 +add test 10.10.156.2 +add test 10.10.156.20 +add test 10.10.156.200 +add test 10.10.156.201 +add test 10.10.156.202 +add test 10.10.156.203 +add test 10.10.156.204 +add test 10.10.156.205 +add test 10.10.156.206 +add test 10.10.156.207 +add test 10.10.156.208 +add test 10.10.156.209 +add test 10.10.156.21 +add test 10.10.156.210 +add test 10.10.156.211 +add test 10.10.156.212 +add test 10.10.156.213 +add test 10.10.156.214 +add test 10.10.156.215 +add test 10.10.156.216 +add test 10.10.156.217 +add test 10.10.156.218 +add test 10.10.156.219 +add test 10.10.156.22 +add test 10.10.156.220 +add test 10.10.156.221 +add test 10.10.156.222 +add test 10.10.156.223 +add test 10.10.156.224 +add test 10.10.156.225 +add test 10.10.156.226 +add test 10.10.156.227 +add test 10.10.156.228 +add test 10.10.156.229 +add test 10.10.156.23 +add test 10.10.156.230 +add test 10.10.156.231 +add test 10.10.156.232 +add test 10.10.156.233 +add test 10.10.156.234 +add test 10.10.156.235 +add test 10.10.156.236 +add test 10.10.156.237 +add test 10.10.156.238 +add test 10.10.156.239 +add test 10.10.156.24 +add test 10.10.156.240 +add test 10.10.156.241 +add test 10.10.156.242 +add test 10.10.156.243 +add test 10.10.156.244 +add test 10.10.156.245 +add test 10.10.156.246 +add test 10.10.156.247 +add test 10.10.156.248 +add test 10.10.156.249 +add test 10.10.156.25 +add test 10.10.156.250 +add test 10.10.156.251 +add test 10.10.156.252 +add test 10.10.156.253 +add test 10.10.156.254 +add test 10.10.156.255 +add test 10.10.156.26 +add test 10.10.156.27 +add test 10.10.156.28 +add test 10.10.156.29 +add test 10.10.156.3 +add test 10.10.156.30 +add test 10.10.156.31 +add test 10.10.156.32 +add test 10.10.156.33 +add test 10.10.156.34 +add test 10.10.156.35 +add test 10.10.156.36 +add test 10.10.156.37 +add test 10.10.156.38 +add test 10.10.156.39 +add test 10.10.156.4 +add test 10.10.156.40 +add test 10.10.156.41 +add test 10.10.156.42 +add test 10.10.156.43 +add test 10.10.156.44 +add test 10.10.156.45 +add test 10.10.156.46 +add test 10.10.156.47 +add test 10.10.156.48 +add test 10.10.156.49 +add test 10.10.156.5 +add test 10.10.156.50 +add test 10.10.156.51 +add test 10.10.156.52 +add test 10.10.156.53 +add test 10.10.156.54 +add test 10.10.156.55 +add test 10.10.156.56 +add test 10.10.156.57 +add test 10.10.156.58 +add test 10.10.156.59 +add test 10.10.156.6 +add test 10.10.156.60 +add test 10.10.156.61 +add test 10.10.156.62 +add test 10.10.156.63 +add test 10.10.156.64 +add test 10.10.156.65 +add test 10.10.156.66 +add test 10.10.156.67 +add test 10.10.156.68 +add test 10.10.156.69 +add test 10.10.156.7 +add test 10.10.156.70 +add test 10.10.156.71 +add test 10.10.156.72 +add test 10.10.156.73 +add test 10.10.156.74 +add test 10.10.156.75 +add test 10.10.156.76 +add test 10.10.156.77 +add test 10.10.156.78 +add test 10.10.156.79 +add test 10.10.156.8 +add test 10.10.156.80 +add test 10.10.156.81 +add test 10.10.156.82 +add test 10.10.156.83 +add test 10.10.156.84 +add test 10.10.156.85 +add test 10.10.156.86 +add test 10.10.156.87 +add test 10.10.156.88 +add test 10.10.156.89 +add test 10.10.156.9 +add test 10.10.156.90 +add test 10.10.156.91 +add test 10.10.156.92 +add test 10.10.156.93 +add test 10.10.156.94 +add test 10.10.156.95 +add test 10.10.156.96 +add test 10.10.156.97 +add test 10.10.156.98 +add test 10.10.156.99 +add test 10.10.157.0 +add test 10.10.157.1 +add test 10.10.157.10 +add test 10.10.157.100 +add test 10.10.157.101 +add test 10.10.157.102 +add test 10.10.157.103 +add test 10.10.157.104 +add test 10.10.157.105 +add test 10.10.157.106 +add test 10.10.157.107 +add test 10.10.157.108 +add test 10.10.157.109 +add test 10.10.157.11 +add test 10.10.157.110 +add test 10.10.157.111 +add test 10.10.157.112 +add test 10.10.157.113 +add test 10.10.157.114 +add test 10.10.157.115 +add test 10.10.157.116 +add test 10.10.157.117 +add test 10.10.157.118 +add test 10.10.157.119 +add test 10.10.157.12 +add test 10.10.157.120 +add test 10.10.157.121 +add test 10.10.157.122 +add test 10.10.157.123 +add test 10.10.157.124 +add test 10.10.157.125 +add test 10.10.157.126 +add test 10.10.157.127 +add test 10.10.157.128 +add test 10.10.157.129 +add test 10.10.157.13 +add test 10.10.157.130 +add test 10.10.157.131 +add test 10.10.157.132 +add test 10.10.157.133 +add test 10.10.157.134 +add test 10.10.157.135 +add test 10.10.157.136 +add test 10.10.157.137 +add test 10.10.157.138 +add test 10.10.157.139 +add test 10.10.157.14 +add test 10.10.157.140 +add test 10.10.157.141 +add test 10.10.157.142 +add test 10.10.157.143 +add test 10.10.157.144 +add test 10.10.157.145 +add test 10.10.157.146 +add test 10.10.157.147 +add test 10.10.157.148 +add test 10.10.157.149 +add test 10.10.157.15 +add test 10.10.157.150 +add test 10.10.157.151 +add test 10.10.157.152 +add test 10.10.157.153 +add test 10.10.157.154 +add test 10.10.157.155 +add test 10.10.157.156 +add test 10.10.157.157 +add test 10.10.157.158 +add test 10.10.157.159 +add test 10.10.157.16 +add test 10.10.157.160 +add test 10.10.157.161 +add test 10.10.157.162 +add test 10.10.157.163 +add test 10.10.157.164 +add test 10.10.157.165 +add test 10.10.157.166 +add test 10.10.157.167 +add test 10.10.157.168 +add test 10.10.157.169 +add test 10.10.157.17 +add test 10.10.157.170 +add test 10.10.157.171 +add test 10.10.157.172 +add test 10.10.157.173 +add test 10.10.157.174 +add test 10.10.157.175 +add test 10.10.157.176 +add test 10.10.157.177 +add test 10.10.157.178 +add test 10.10.157.179 +add test 10.10.157.18 +add test 10.10.157.180 +add test 10.10.157.181 +add test 10.10.157.182 +add test 10.10.157.183 +add test 10.10.157.184 +add test 10.10.157.185 +add test 10.10.157.186 +add test 10.10.157.187 +add test 10.10.157.188 +add test 10.10.157.189 +add test 10.10.157.19 +add test 10.10.157.190 +add test 10.10.157.191 +add test 10.10.157.192 +add test 10.10.157.193 +add test 10.10.157.194 +add test 10.10.157.195 +add test 10.10.157.196 +add test 10.10.157.197 +add test 10.10.157.198 +add test 10.10.157.199 +add test 10.10.157.2 +add test 10.10.157.20 +add test 10.10.157.200 +add test 10.10.157.201 +add test 10.10.157.202 +add test 10.10.157.203 +add test 10.10.157.204 +add test 10.10.157.205 +add test 10.10.157.206 +add test 10.10.157.207 +add test 10.10.157.208 +add test 10.10.157.209 +add test 10.10.157.21 +add test 10.10.157.210 +add test 10.10.157.211 +add test 10.10.157.212 +add test 10.10.157.213 +add test 10.10.157.214 +add test 10.10.157.215 +add test 10.10.157.216 +add test 10.10.157.217 +add test 10.10.157.218 +add test 10.10.157.219 +add test 10.10.157.22 +add test 10.10.157.220 +add test 10.10.157.221 +add test 10.10.157.222 +add test 10.10.157.223 +add test 10.10.157.224 +add test 10.10.157.225 +add test 10.10.157.226 +add test 10.10.157.227 +add test 10.10.157.228 +add test 10.10.157.229 +add test 10.10.157.23 +add test 10.10.157.230 +add test 10.10.157.231 +add test 10.10.157.232 +add test 10.10.157.233 +add test 10.10.157.234 +add test 10.10.157.235 +add test 10.10.157.236 +add test 10.10.157.237 +add test 10.10.157.238 +add test 10.10.157.239 +add test 10.10.157.24 +add test 10.10.157.240 +add test 10.10.157.241 +add test 10.10.157.242 +add test 10.10.157.243 +add test 10.10.157.244 +add test 10.10.157.245 +add test 10.10.157.246 +add test 10.10.157.247 +add test 10.10.157.248 +add test 10.10.157.249 +add test 10.10.157.25 +add test 10.10.157.250 +add test 10.10.157.251 +add test 10.10.157.252 +add test 10.10.157.253 +add test 10.10.157.254 +add test 10.10.157.255 +add test 10.10.157.26 +add test 10.10.157.27 +add test 10.10.157.28 +add test 10.10.157.29 +add test 10.10.157.3 +add test 10.10.157.30 +add test 10.10.157.31 +add test 10.10.157.32 +add test 10.10.157.33 +add test 10.10.157.34 +add test 10.10.157.35 +add test 10.10.157.36 +add test 10.10.157.37 +add test 10.10.157.38 +add test 10.10.157.39 +add test 10.10.157.4 +add test 10.10.157.40 +add test 10.10.157.41 +add test 10.10.157.42 +add test 10.10.157.43 +add test 10.10.157.44 +add test 10.10.157.45 +add test 10.10.157.46 +add test 10.10.157.47 +add test 10.10.157.48 +add test 10.10.157.49 +add test 10.10.157.5 +add test 10.10.157.50 +add test 10.10.157.51 +add test 10.10.157.52 +add test 10.10.157.53 +add test 10.10.157.54 +add test 10.10.157.55 +add test 10.10.157.56 +add test 10.10.157.57 +add test 10.10.157.58 +add test 10.10.157.59 +add test 10.10.157.6 +add test 10.10.157.60 +add test 10.10.157.61 +add test 10.10.157.62 +add test 10.10.157.63 +add test 10.10.157.64 +add test 10.10.157.65 +add test 10.10.157.66 +add test 10.10.157.67 +add test 10.10.157.68 +add test 10.10.157.69 +add test 10.10.157.7 +add test 10.10.157.70 +add test 10.10.157.71 +add test 10.10.157.72 +add test 10.10.157.73 +add test 10.10.157.74 +add test 10.10.157.75 +add test 10.10.157.76 +add test 10.10.157.77 +add test 10.10.157.78 +add test 10.10.157.79 +add test 10.10.157.8 +add test 10.10.157.80 +add test 10.10.157.81 +add test 10.10.157.82 +add test 10.10.157.83 +add test 10.10.157.84 +add test 10.10.157.85 +add test 10.10.157.86 +add test 10.10.157.87 +add test 10.10.157.88 +add test 10.10.157.89 +add test 10.10.157.9 +add test 10.10.157.90 +add test 10.10.157.91 +add test 10.10.157.92 +add test 10.10.157.93 +add test 10.10.157.94 +add test 10.10.157.95 +add test 10.10.157.96 +add test 10.10.157.97 +add test 10.10.157.98 +add test 10.10.157.99 +add test 10.10.158.0 +add test 10.10.158.1 +add test 10.10.158.10 +add test 10.10.158.100 +add test 10.10.158.101 +add test 10.10.158.102 +add test 10.10.158.103 +add test 10.10.158.104 +add test 10.10.158.105 +add test 10.10.158.106 +add test 10.10.158.107 +add test 10.10.158.108 +add test 10.10.158.109 +add test 10.10.158.11 +add test 10.10.158.110 +add test 10.10.158.111 +add test 10.10.158.112 +add test 10.10.158.113 +add test 10.10.158.114 +add test 10.10.158.115 +add test 10.10.158.116 +add test 10.10.158.117 +add test 10.10.158.118 +add test 10.10.158.119 +add test 10.10.158.12 +add test 10.10.158.120 +add test 10.10.158.121 +add test 10.10.158.122 +add test 10.10.158.123 +add test 10.10.158.124 +add test 10.10.158.125 +add test 10.10.158.126 +add test 10.10.158.127 +add test 10.10.158.128 +add test 10.10.158.129 +add test 10.10.158.13 +add test 10.10.158.130 +add test 10.10.158.131 +add test 10.10.158.132 +add test 10.10.158.133 +add test 10.10.158.134 +add test 10.10.158.135 +add test 10.10.158.136 +add test 10.10.158.137 +add test 10.10.158.138 +add test 10.10.158.139 +add test 10.10.158.14 +add test 10.10.158.140 +add test 10.10.158.141 +add test 10.10.158.142 +add test 10.10.158.143 +add test 10.10.158.144 +add test 10.10.158.145 +add test 10.10.158.146 +add test 10.10.158.147 +add test 10.10.158.148 +add test 10.10.158.149 +add test 10.10.158.15 +add test 10.10.158.150 +add test 10.10.158.151 +add test 10.10.158.152 +add test 10.10.158.153 +add test 10.10.158.154 +add test 10.10.158.155 +add test 10.10.158.156 +add test 10.10.158.157 +add test 10.10.158.158 +add test 10.10.158.159 +add test 10.10.158.16 +add test 10.10.158.160 +add test 10.10.158.161 +add test 10.10.158.162 +add test 10.10.158.163 +add test 10.10.158.164 +add test 10.10.158.165 +add test 10.10.158.166 +add test 10.10.158.167 +add test 10.10.158.168 +add test 10.10.158.169 +add test 10.10.158.17 +add test 10.10.158.170 +add test 10.10.158.171 +add test 10.10.158.172 +add test 10.10.158.173 +add test 10.10.158.174 +add test 10.10.158.175 +add test 10.10.158.176 +add test 10.10.158.177 +add test 10.10.158.178 +add test 10.10.158.179 +add test 10.10.158.18 +add test 10.10.158.180 +add test 10.10.158.181 +add test 10.10.158.182 +add test 10.10.158.183 +add test 10.10.158.184 +add test 10.10.158.185 +add test 10.10.158.186 +add test 10.10.158.187 +add test 10.10.158.188 +add test 10.10.158.189 +add test 10.10.158.19 +add test 10.10.158.190 +add test 10.10.158.191 +add test 10.10.158.192 +add test 10.10.158.193 +add test 10.10.158.194 +add test 10.10.158.195 +add test 10.10.158.196 +add test 10.10.158.197 +add test 10.10.158.198 +add test 10.10.158.199 +add test 10.10.158.2 +add test 10.10.158.20 +add test 10.10.158.200 +add test 10.10.158.201 +add test 10.10.158.202 +add test 10.10.158.203 +add test 10.10.158.204 +add test 10.10.158.205 +add test 10.10.158.206 +add test 10.10.158.207 +add test 10.10.158.208 +add test 10.10.158.209 +add test 10.10.158.21 +add test 10.10.158.210 +add test 10.10.158.211 +add test 10.10.158.212 +add test 10.10.158.213 +add test 10.10.158.214 +add test 10.10.158.215 +add test 10.10.158.216 +add test 10.10.158.217 +add test 10.10.158.218 +add test 10.10.158.219 +add test 10.10.158.22 +add test 10.10.158.220 +add test 10.10.158.221 +add test 10.10.158.222 +add test 10.10.158.223 +add test 10.10.158.224 +add test 10.10.158.225 +add test 10.10.158.226 +add test 10.10.158.227 +add test 10.10.158.228 +add test 10.10.158.229 +add test 10.10.158.23 +add test 10.10.158.230 +add test 10.10.158.231 +add test 10.10.158.232 +add test 10.10.158.233 +add test 10.10.158.234 +add test 10.10.158.235 +add test 10.10.158.236 +add test 10.10.158.237 +add test 10.10.158.238 +add test 10.10.158.239 +add test 10.10.158.24 +add test 10.10.158.240 +add test 10.10.158.241 +add test 10.10.158.242 +add test 10.10.158.243 +add test 10.10.158.244 +add test 10.10.158.245 +add test 10.10.158.246 +add test 10.10.158.247 +add test 10.10.158.248 +add test 10.10.158.249 +add test 10.10.158.25 +add test 10.10.158.250 +add test 10.10.158.251 +add test 10.10.158.252 +add test 10.10.158.253 +add test 10.10.158.254 +add test 10.10.158.255 +add test 10.10.158.26 +add test 10.10.158.27 +add test 10.10.158.28 +add test 10.10.158.29 +add test 10.10.158.3 +add test 10.10.158.30 +add test 10.10.158.31 +add test 10.10.158.32 +add test 10.10.158.33 +add test 10.10.158.34 +add test 10.10.158.35 +add test 10.10.158.36 +add test 10.10.158.37 +add test 10.10.158.38 +add test 10.10.158.39 +add test 10.10.158.4 +add test 10.10.158.40 +add test 10.10.158.41 +add test 10.10.158.42 +add test 10.10.158.43 +add test 10.10.158.44 +add test 10.10.158.45 +add test 10.10.158.46 +add test 10.10.158.47 +add test 10.10.158.48 +add test 10.10.158.49 +add test 10.10.158.5 +add test 10.10.158.50 +add test 10.10.158.51 +add test 10.10.158.52 +add test 10.10.158.53 +add test 10.10.158.54 +add test 10.10.158.55 +add test 10.10.158.56 +add test 10.10.158.57 +add test 10.10.158.58 +add test 10.10.158.59 +add test 10.10.158.6 +add test 10.10.158.60 +add test 10.10.158.61 +add test 10.10.158.62 +add test 10.10.158.63 +add test 10.10.158.64 +add test 10.10.158.65 +add test 10.10.158.66 +add test 10.10.158.67 +add test 10.10.158.68 +add test 10.10.158.69 +add test 10.10.158.7 +add test 10.10.158.70 +add test 10.10.158.71 +add test 10.10.158.72 +add test 10.10.158.73 +add test 10.10.158.74 +add test 10.10.158.75 +add test 10.10.158.76 +add test 10.10.158.77 +add test 10.10.158.78 +add test 10.10.158.79 +add test 10.10.158.8 +add test 10.10.158.80 +add test 10.10.158.81 +add test 10.10.158.82 +add test 10.10.158.83 +add test 10.10.158.84 +add test 10.10.158.85 +add test 10.10.158.86 +add test 10.10.158.87 +add test 10.10.158.88 +add test 10.10.158.89 +add test 10.10.158.9 +add test 10.10.158.90 +add test 10.10.158.91 +add test 10.10.158.92 +add test 10.10.158.93 +add test 10.10.158.94 +add test 10.10.158.95 +add test 10.10.158.96 +add test 10.10.158.97 +add test 10.10.158.98 +add test 10.10.158.99 +add test 10.10.159.0 +add test 10.10.159.1 +add test 10.10.159.10 +add test 10.10.159.100 +add test 10.10.159.101 +add test 10.10.159.102 +add test 10.10.159.103 +add test 10.10.159.104 +add test 10.10.159.105 +add test 10.10.159.106 +add test 10.10.159.107 +add test 10.10.159.108 +add test 10.10.159.109 +add test 10.10.159.11 +add test 10.10.159.110 +add test 10.10.159.111 +add test 10.10.159.112 +add test 10.10.159.113 +add test 10.10.159.114 +add test 10.10.159.115 +add test 10.10.159.116 +add test 10.10.159.117 +add test 10.10.159.118 +add test 10.10.159.119 +add test 10.10.159.12 +add test 10.10.159.120 +add test 10.10.159.121 +add test 10.10.159.122 +add test 10.10.159.123 +add test 10.10.159.124 +add test 10.10.159.125 +add test 10.10.159.126 +add test 10.10.159.127 +add test 10.10.159.128 +add test 10.10.159.129 +add test 10.10.159.13 +add test 10.10.159.130 +add test 10.10.159.131 +add test 10.10.159.132 +add test 10.10.159.133 +add test 10.10.159.134 +add test 10.10.159.135 +add test 10.10.159.136 +add test 10.10.159.137 +add test 10.10.159.138 +add test 10.10.159.139 +add test 10.10.159.14 +add test 10.10.159.140 +add test 10.10.159.141 +add test 10.10.159.142 +add test 10.10.159.143 +add test 10.10.159.144 +add test 10.10.159.145 +add test 10.10.159.146 +add test 10.10.159.147 +add test 10.10.159.148 +add test 10.10.159.149 +add test 10.10.159.15 +add test 10.10.159.150 +add test 10.10.159.151 +add test 10.10.159.152 +add test 10.10.159.153 +add test 10.10.159.154 +add test 10.10.159.155 +add test 10.10.159.156 +add test 10.10.159.157 +add test 10.10.159.158 +add test 10.10.159.159 +add test 10.10.159.16 +add test 10.10.159.160 +add test 10.10.159.161 +add test 10.10.159.162 +add test 10.10.159.163 +add test 10.10.159.164 +add test 10.10.159.165 +add test 10.10.159.166 +add test 10.10.159.167 +add test 10.10.159.168 +add test 10.10.159.169 +add test 10.10.159.17 +add test 10.10.159.170 +add test 10.10.159.171 +add test 10.10.159.172 +add test 10.10.159.173 +add test 10.10.159.174 +add test 10.10.159.175 +add test 10.10.159.176 +add test 10.10.159.177 +add test 10.10.159.178 +add test 10.10.159.179 +add test 10.10.159.18 +add test 10.10.159.180 +add test 10.10.159.181 +add test 10.10.159.182 +add test 10.10.159.183 +add test 10.10.159.184 +add test 10.10.159.185 +add test 10.10.159.186 +add test 10.10.159.187 +add test 10.10.159.188 +add test 10.10.159.189 +add test 10.10.159.19 +add test 10.10.159.190 +add test 10.10.159.191 +add test 10.10.159.192 +add test 10.10.159.193 +add test 10.10.159.194 +add test 10.10.159.195 +add test 10.10.159.196 +add test 10.10.159.197 +add test 10.10.159.198 +add test 10.10.159.199 +add test 10.10.159.2 +add test 10.10.159.20 +add test 10.10.159.200 +add test 10.10.159.201 +add test 10.10.159.202 +add test 10.10.159.203 +add test 10.10.159.204 +add test 10.10.159.205 +add test 10.10.159.206 +add test 10.10.159.207 +add test 10.10.159.208 +add test 10.10.159.209 +add test 10.10.159.21 +add test 10.10.159.210 +add test 10.10.159.211 +add test 10.10.159.212 +add test 10.10.159.213 +add test 10.10.159.214 +add test 10.10.159.215 +add test 10.10.159.216 +add test 10.10.159.217 +add test 10.10.159.218 +add test 10.10.159.219 +add test 10.10.159.22 +add test 10.10.159.220 +add test 10.10.159.221 +add test 10.10.159.222 +add test 10.10.159.223 +add test 10.10.159.224 +add test 10.10.159.225 +add test 10.10.159.226 +add test 10.10.159.227 +add test 10.10.159.228 +add test 10.10.159.229 +add test 10.10.159.23 +add test 10.10.159.230 +add test 10.10.159.231 +add test 10.10.159.232 +add test 10.10.159.233 +add test 10.10.159.234 +add test 10.10.159.235 +add test 10.10.159.236 +add test 10.10.159.237 +add test 10.10.159.238 +add test 10.10.159.239 +add test 10.10.159.24 +add test 10.10.159.240 +add test 10.10.159.241 +add test 10.10.159.242 +add test 10.10.159.243 +add test 10.10.159.244 +add test 10.10.159.245 +add test 10.10.159.246 +add test 10.10.159.247 +add test 10.10.159.248 +add test 10.10.159.249 +add test 10.10.159.25 +add test 10.10.159.250 +add test 10.10.159.251 +add test 10.10.159.252 +add test 10.10.159.253 +add test 10.10.159.254 +add test 10.10.159.255 +add test 10.10.159.26 +add test 10.10.159.27 +add test 10.10.159.28 +add test 10.10.159.29 +add test 10.10.159.3 +add test 10.10.159.30 +add test 10.10.159.31 +add test 10.10.159.32 +add test 10.10.159.33 +add test 10.10.159.34 +add test 10.10.159.35 +add test 10.10.159.36 +add test 10.10.159.37 +add test 10.10.159.38 +add test 10.10.159.39 +add test 10.10.159.4 +add test 10.10.159.40 +add test 10.10.159.41 +add test 10.10.159.42 +add test 10.10.159.43 +add test 10.10.159.44 +add test 10.10.159.45 +add test 10.10.159.46 +add test 10.10.159.47 +add test 10.10.159.48 +add test 10.10.159.49 +add test 10.10.159.5 +add test 10.10.159.50 +add test 10.10.159.51 +add test 10.10.159.52 +add test 10.10.159.53 +add test 10.10.159.54 +add test 10.10.159.55 +add test 10.10.159.56 +add test 10.10.159.57 +add test 10.10.159.58 +add test 10.10.159.59 +add test 10.10.159.6 +add test 10.10.159.60 +add test 10.10.159.61 +add test 10.10.159.62 +add test 10.10.159.63 +add test 10.10.159.64 +add test 10.10.159.65 +add test 10.10.159.66 +add test 10.10.159.67 +add test 10.10.159.68 +add test 10.10.159.69 +add test 10.10.159.7 +add test 10.10.159.70 +add test 10.10.159.71 +add test 10.10.159.72 +add test 10.10.159.73 +add test 10.10.159.74 +add test 10.10.159.75 +add test 10.10.159.76 +add test 10.10.159.77 +add test 10.10.159.78 +add test 10.10.159.79 +add test 10.10.159.8 +add test 10.10.159.80 +add test 10.10.159.81 +add test 10.10.159.82 +add test 10.10.159.83 +add test 10.10.159.84 +add test 10.10.159.85 +add test 10.10.159.86 +add test 10.10.159.87 +add test 10.10.159.88 +add test 10.10.159.89 +add test 10.10.159.9 +add test 10.10.159.90 +add test 10.10.159.91 +add test 10.10.159.92 +add test 10.10.159.93 +add test 10.10.159.94 +add test 10.10.159.95 +add test 10.10.159.96 +add test 10.10.159.97 +add test 10.10.159.98 +add test 10.10.159.99 +add test 10.10.16.0 +add test 10.10.16.1 +add test 10.10.16.10 +add test 10.10.16.100 +add test 10.10.16.101 +add test 10.10.16.102 +add test 10.10.16.103 +add test 10.10.16.104 +add test 10.10.16.105 +add test 10.10.16.106 +add test 10.10.16.107 +add test 10.10.16.108 +add test 10.10.16.109 +add test 10.10.16.11 +add test 10.10.16.110 +add test 10.10.16.111 +add test 10.10.16.112 +add test 10.10.16.113 +add test 10.10.16.114 +add test 10.10.16.115 +add test 10.10.16.116 +add test 10.10.16.117 +add test 10.10.16.118 +add test 10.10.16.119 +add test 10.10.16.12 +add test 10.10.16.120 +add test 10.10.16.121 +add test 10.10.16.122 +add test 10.10.16.123 +add test 10.10.16.124 +add test 10.10.16.125 +add test 10.10.16.126 +add test 10.10.16.127 +add test 10.10.16.128 +add test 10.10.16.129 +add test 10.10.16.13 +add test 10.10.16.130 +add test 10.10.16.131 +add test 10.10.16.132 +add test 10.10.16.133 +add test 10.10.16.134 +add test 10.10.16.135 +add test 10.10.16.136 +add test 10.10.16.137 +add test 10.10.16.138 +add test 10.10.16.139 +add test 10.10.16.14 +add test 10.10.16.140 +add test 10.10.16.141 +add test 10.10.16.142 +add test 10.10.16.143 +add test 10.10.16.144 +add test 10.10.16.145 +add test 10.10.16.146 +add test 10.10.16.147 +add test 10.10.16.148 +add test 10.10.16.149 +add test 10.10.16.15 +add test 10.10.16.150 +add test 10.10.16.151 +add test 10.10.16.152 +add test 10.10.16.153 +add test 10.10.16.154 +add test 10.10.16.155 +add test 10.10.16.156 +add test 10.10.16.157 +add test 10.10.16.158 +add test 10.10.16.159 +add test 10.10.16.16 +add test 10.10.16.160 +add test 10.10.16.161 +add test 10.10.16.162 +add test 10.10.16.163 +add test 10.10.16.164 +add test 10.10.16.165 +add test 10.10.16.166 +add test 10.10.16.167 +add test 10.10.16.168 +add test 10.10.16.169 +add test 10.10.16.17 +add test 10.10.16.170 +add test 10.10.16.171 +add test 10.10.16.172 +add test 10.10.16.173 +add test 10.10.16.174 +add test 10.10.16.175 +add test 10.10.16.176 +add test 10.10.16.177 +add test 10.10.16.178 +add test 10.10.16.179 +add test 10.10.16.18 +add test 10.10.16.180 +add test 10.10.16.181 +add test 10.10.16.182 +add test 10.10.16.183 +add test 10.10.16.184 +add test 10.10.16.185 +add test 10.10.16.186 +add test 10.10.16.187 +add test 10.10.16.188 +add test 10.10.16.189 +add test 10.10.16.19 +add test 10.10.16.190 +add test 10.10.16.191 +add test 10.10.16.192 +add test 10.10.16.193 +add test 10.10.16.194 +add test 10.10.16.195 +add test 10.10.16.196 +add test 10.10.16.197 +add test 10.10.16.198 +add test 10.10.16.199 +add test 10.10.16.2 +add test 10.10.16.20 +add test 10.10.16.200 +add test 10.10.16.201 +add test 10.10.16.202 +add test 10.10.16.203 +add test 10.10.16.204 +add test 10.10.16.205 +add test 10.10.16.206 +add test 10.10.16.207 +add test 10.10.16.208 +add test 10.10.16.209 +add test 10.10.16.21 +add test 10.10.16.210 +add test 10.10.16.211 +add test 10.10.16.212 +add test 10.10.16.213 +add test 10.10.16.214 +add test 10.10.16.215 +add test 10.10.16.216 +add test 10.10.16.217 +add test 10.10.16.218 +add test 10.10.16.219 +add test 10.10.16.22 +add test 10.10.16.220 +add test 10.10.16.221 +add test 10.10.16.222 +add test 10.10.16.223 +add test 10.10.16.224 +add test 10.10.16.225 +add test 10.10.16.226 +add test 10.10.16.227 +add test 10.10.16.228 +add test 10.10.16.229 +add test 10.10.16.23 +add test 10.10.16.230 +add test 10.10.16.231 +add test 10.10.16.232 +add test 10.10.16.233 +add test 10.10.16.234 +add test 10.10.16.235 +add test 10.10.16.236 +add test 10.10.16.237 +add test 10.10.16.238 +add test 10.10.16.239 +add test 10.10.16.24 +add test 10.10.16.240 +add test 10.10.16.241 +add test 10.10.16.242 +add test 10.10.16.243 +add test 10.10.16.244 +add test 10.10.16.245 +add test 10.10.16.246 +add test 10.10.16.247 +add test 10.10.16.248 +add test 10.10.16.249 +add test 10.10.16.25 +add test 10.10.16.250 +add test 10.10.16.251 +add test 10.10.16.252 +add test 10.10.16.253 +add test 10.10.16.254 +add test 10.10.16.255 +add test 10.10.16.26 +add test 10.10.16.27 +add test 10.10.16.28 +add test 10.10.16.29 +add test 10.10.16.3 +add test 10.10.16.30 +add test 10.10.16.31 +add test 10.10.16.32 +add test 10.10.16.33 +add test 10.10.16.34 +add test 10.10.16.35 +add test 10.10.16.36 +add test 10.10.16.37 +add test 10.10.16.38 +add test 10.10.16.39 +add test 10.10.16.4 +add test 10.10.16.40 +add test 10.10.16.41 +add test 10.10.16.42 +add test 10.10.16.43 +add test 10.10.16.44 +add test 10.10.16.45 +add test 10.10.16.46 +add test 10.10.16.47 +add test 10.10.16.48 +add test 10.10.16.49 +add test 10.10.16.5 +add test 10.10.16.50 +add test 10.10.16.51 +add test 10.10.16.52 +add test 10.10.16.53 +add test 10.10.16.54 +add test 10.10.16.55 +add test 10.10.16.56 +add test 10.10.16.57 +add test 10.10.16.58 +add test 10.10.16.59 +add test 10.10.16.6 +add test 10.10.16.60 +add test 10.10.16.61 +add test 10.10.16.62 +add test 10.10.16.63 +add test 10.10.16.64 +add test 10.10.16.65 +add test 10.10.16.66 +add test 10.10.16.67 +add test 10.10.16.68 +add test 10.10.16.69 +add test 10.10.16.7 +add test 10.10.16.70 +add test 10.10.16.71 +add test 10.10.16.72 +add test 10.10.16.73 +add test 10.10.16.74 +add test 10.10.16.75 +add test 10.10.16.76 +add test 10.10.16.77 +add test 10.10.16.78 +add test 10.10.16.79 +add test 10.10.16.8 +add test 10.10.16.80 +add test 10.10.16.81 +add test 10.10.16.82 +add test 10.10.16.83 +add test 10.10.16.84 +add test 10.10.16.85 +add test 10.10.16.86 +add test 10.10.16.87 +add test 10.10.16.88 +add test 10.10.16.89 +add test 10.10.16.9 +add test 10.10.16.90 +add test 10.10.16.91 +add test 10.10.16.92 +add test 10.10.16.93 +add test 10.10.16.94 +add test 10.10.16.95 +add test 10.10.16.96 +add test 10.10.16.97 +add test 10.10.16.98 +add test 10.10.16.99 +add test 10.10.160.0 +add test 10.10.160.1 +add test 10.10.160.10 +add test 10.10.160.100 +add test 10.10.160.101 +add test 10.10.160.102 +add test 10.10.160.103 +add test 10.10.160.104 +add test 10.10.160.105 +add test 10.10.160.106 +add test 10.10.160.107 +add test 10.10.160.108 +add test 10.10.160.109 +add test 10.10.160.11 +add test 10.10.160.110 +add test 10.10.160.111 +add test 10.10.160.112 +add test 10.10.160.113 +add test 10.10.160.114 +add test 10.10.160.115 +add test 10.10.160.116 +add test 10.10.160.117 +add test 10.10.160.118 +add test 10.10.160.119 +add test 10.10.160.12 +add test 10.10.160.120 +add test 10.10.160.121 +add test 10.10.160.122 +add test 10.10.160.123 +add test 10.10.160.124 +add test 10.10.160.125 +add test 10.10.160.126 +add test 10.10.160.127 +add test 10.10.160.128 +add test 10.10.160.129 +add test 10.10.160.13 +add test 10.10.160.130 +add test 10.10.160.131 +add test 10.10.160.132 +add test 10.10.160.133 +add test 10.10.160.134 +add test 10.10.160.135 +add test 10.10.160.136 +add test 10.10.160.137 +add test 10.10.160.138 +add test 10.10.160.139 +add test 10.10.160.14 +add test 10.10.160.140 +add test 10.10.160.141 +add test 10.10.160.142 +add test 10.10.160.143 +add test 10.10.160.144 +add test 10.10.160.145 +add test 10.10.160.146 +add test 10.10.160.147 +add test 10.10.160.148 +add test 10.10.160.149 +add test 10.10.160.15 +add test 10.10.160.150 +add test 10.10.160.151 +add test 10.10.160.152 +add test 10.10.160.153 +add test 10.10.160.154 +add test 10.10.160.155 +add test 10.10.160.156 +add test 10.10.160.157 +add test 10.10.160.158 +add test 10.10.160.159 +add test 10.10.160.16 +add test 10.10.160.160 +add test 10.10.160.161 +add test 10.10.160.162 +add test 10.10.160.163 +add test 10.10.160.164 +add test 10.10.160.165 +add test 10.10.160.166 +add test 10.10.160.167 +add test 10.10.160.168 +add test 10.10.160.169 +add test 10.10.160.17 +add test 10.10.160.170 +add test 10.10.160.171 +add test 10.10.160.172 +add test 10.10.160.173 +add test 10.10.160.174 +add test 10.10.160.175 +add test 10.10.160.176 +add test 10.10.160.177 +add test 10.10.160.178 +add test 10.10.160.179 +add test 10.10.160.18 +add test 10.10.160.180 +add test 10.10.160.181 +add test 10.10.160.182 +add test 10.10.160.183 +add test 10.10.160.184 +add test 10.10.160.185 +add test 10.10.160.186 +add test 10.10.160.187 +add test 10.10.160.188 +add test 10.10.160.189 +add test 10.10.160.19 +add test 10.10.160.190 +add test 10.10.160.191 +add test 10.10.160.192 +add test 10.10.160.193 +add test 10.10.160.194 +add test 10.10.160.195 +add test 10.10.160.196 +add test 10.10.160.197 +add test 10.10.160.198 +add test 10.10.160.199 +add test 10.10.160.2 +add test 10.10.160.20 +add test 10.10.160.200 +add test 10.10.160.201 +add test 10.10.160.202 +add test 10.10.160.203 +add test 10.10.160.204 +add test 10.10.160.205 +add test 10.10.160.206 +add test 10.10.160.207 +add test 10.10.160.208 +add test 10.10.160.209 +add test 10.10.160.21 +add test 10.10.160.210 +add test 10.10.160.211 +add test 10.10.160.212 +add test 10.10.160.213 +add test 10.10.160.214 +add test 10.10.160.215 +add test 10.10.160.216 +add test 10.10.160.217 +add test 10.10.160.218 +add test 10.10.160.219 +add test 10.10.160.22 +add test 10.10.160.220 +add test 10.10.160.221 +add test 10.10.160.222 +add test 10.10.160.223 +add test 10.10.160.224 +add test 10.10.160.225 +add test 10.10.160.226 +add test 10.10.160.227 +add test 10.10.160.228 +add test 10.10.160.229 +add test 10.10.160.23 +add test 10.10.160.230 +add test 10.10.160.231 +add test 10.10.160.232 +add test 10.10.160.233 +add test 10.10.160.234 +add test 10.10.160.235 +add test 10.10.160.236 +add test 10.10.160.237 +add test 10.10.160.238 +add test 10.10.160.239 +add test 10.10.160.24 +add test 10.10.160.240 +add test 10.10.160.241 +add test 10.10.160.242 +add test 10.10.160.243 +add test 10.10.160.244 +add test 10.10.160.245 +add test 10.10.160.246 +add test 10.10.160.247 +add test 10.10.160.248 +add test 10.10.160.249 +add test 10.10.160.25 +add test 10.10.160.250 +add test 10.10.160.251 +add test 10.10.160.252 +add test 10.10.160.253 +add test 10.10.160.254 +add test 10.10.160.255 +add test 10.10.160.26 +add test 10.10.160.27 +add test 10.10.160.28 +add test 10.10.160.29 +add test 10.10.160.3 +add test 10.10.160.30 +add test 10.10.160.31 +add test 10.10.160.32 +add test 10.10.160.33 +add test 10.10.160.34 +add test 10.10.160.35 +add test 10.10.160.36 +add test 10.10.160.37 +add test 10.10.160.38 +add test 10.10.160.39 +add test 10.10.160.4 +add test 10.10.160.40 +add test 10.10.160.41 +add test 10.10.160.42 +add test 10.10.160.43 +add test 10.10.160.44 +add test 10.10.160.45 +add test 10.10.160.46 +add test 10.10.160.47 +add test 10.10.160.48 +add test 10.10.160.49 +add test 10.10.160.5 +add test 10.10.160.50 +add test 10.10.160.51 +add test 10.10.160.52 +add test 10.10.160.53 +add test 10.10.160.54 +add test 10.10.160.55 +add test 10.10.160.56 +add test 10.10.160.57 +add test 10.10.160.58 +add test 10.10.160.59 +add test 10.10.160.6 +add test 10.10.160.60 +add test 10.10.160.61 +add test 10.10.160.62 +add test 10.10.160.63 +add test 10.10.160.64 +add test 10.10.160.65 +add test 10.10.160.66 +add test 10.10.160.67 +add test 10.10.160.68 +add test 10.10.160.69 +add test 10.10.160.7 +add test 10.10.160.70 +add test 10.10.160.71 +add test 10.10.160.72 +add test 10.10.160.73 +add test 10.10.160.74 +add test 10.10.160.75 +add test 10.10.160.76 +add test 10.10.160.77 +add test 10.10.160.78 +add test 10.10.160.79 +add test 10.10.160.8 +add test 10.10.160.80 +add test 10.10.160.81 +add test 10.10.160.82 +add test 10.10.160.83 +add test 10.10.160.84 +add test 10.10.160.85 +add test 10.10.160.86 +add test 10.10.160.87 +add test 10.10.160.88 +add test 10.10.160.89 +add test 10.10.160.9 +add test 10.10.160.90 +add test 10.10.160.91 +add test 10.10.160.92 +add test 10.10.160.93 +add test 10.10.160.94 +add test 10.10.160.95 +add test 10.10.160.96 +add test 10.10.160.97 +add test 10.10.160.98 +add test 10.10.160.99 +add test 10.10.161.0 +add test 10.10.161.1 +add test 10.10.161.10 +add test 10.10.161.100 +add test 10.10.161.101 +add test 10.10.161.102 +add test 10.10.161.103 +add test 10.10.161.104 +add test 10.10.161.105 +add test 10.10.161.106 +add test 10.10.161.107 +add test 10.10.161.108 +add test 10.10.161.109 +add test 10.10.161.11 +add test 10.10.161.110 +add test 10.10.161.111 +add test 10.10.161.112 +add test 10.10.161.113 +add test 10.10.161.114 +add test 10.10.161.115 +add test 10.10.161.116 +add test 10.10.161.117 +add test 10.10.161.118 +add test 10.10.161.119 +add test 10.10.161.12 +add test 10.10.161.120 +add test 10.10.161.121 +add test 10.10.161.122 +add test 10.10.161.123 +add test 10.10.161.124 +add test 10.10.161.125 +add test 10.10.161.126 +add test 10.10.161.127 +add test 10.10.161.128 +add test 10.10.161.129 +add test 10.10.161.13 +add test 10.10.161.130 +add test 10.10.161.131 +add test 10.10.161.132 +add test 10.10.161.133 +add test 10.10.161.134 +add test 10.10.161.135 +add test 10.10.161.136 +add test 10.10.161.137 +add test 10.10.161.138 +add test 10.10.161.139 +add test 10.10.161.14 +add test 10.10.161.140 +add test 10.10.161.141 +add test 10.10.161.142 +add test 10.10.161.143 +add test 10.10.161.144 +add test 10.10.161.145 +add test 10.10.161.146 +add test 10.10.161.147 +add test 10.10.161.148 +add test 10.10.161.149 +add test 10.10.161.15 +add test 10.10.161.150 +add test 10.10.161.151 +add test 10.10.161.152 +add test 10.10.161.153 +add test 10.10.161.154 +add test 10.10.161.155 +add test 10.10.161.156 +add test 10.10.161.157 +add test 10.10.161.158 +add test 10.10.161.159 +add test 10.10.161.16 +add test 10.10.161.160 +add test 10.10.161.161 +add test 10.10.161.162 +add test 10.10.161.163 +add test 10.10.161.164 +add test 10.10.161.165 +add test 10.10.161.166 +add test 10.10.161.167 +add test 10.10.161.168 +add test 10.10.161.169 +add test 10.10.161.17 +add test 10.10.161.170 +add test 10.10.161.171 +add test 10.10.161.172 +add test 10.10.161.173 +add test 10.10.161.174 +add test 10.10.161.175 +add test 10.10.161.176 +add test 10.10.161.177 +add test 10.10.161.178 +add test 10.10.161.179 +add test 10.10.161.18 +add test 10.10.161.180 +add test 10.10.161.181 +add test 10.10.161.182 +add test 10.10.161.183 +add test 10.10.161.184 +add test 10.10.161.185 +add test 10.10.161.186 +add test 10.10.161.187 +add test 10.10.161.188 +add test 10.10.161.189 +add test 10.10.161.19 +add test 10.10.161.190 +add test 10.10.161.191 +add test 10.10.161.192 +add test 10.10.161.193 +add test 10.10.161.194 +add test 10.10.161.195 +add test 10.10.161.196 +add test 10.10.161.197 +add test 10.10.161.198 +add test 10.10.161.199 +add test 10.10.161.2 +add test 10.10.161.20 +add test 10.10.161.200 +add test 10.10.161.201 +add test 10.10.161.202 +add test 10.10.161.203 +add test 10.10.161.204 +add test 10.10.161.205 +add test 10.10.161.206 +add test 10.10.161.207 +add test 10.10.161.208 +add test 10.10.161.209 +add test 10.10.161.21 +add test 10.10.161.210 +add test 10.10.161.211 +add test 10.10.161.212 +add test 10.10.161.213 +add test 10.10.161.214 +add test 10.10.161.215 +add test 10.10.161.216 +add test 10.10.161.217 +add test 10.10.161.218 +add test 10.10.161.219 +add test 10.10.161.22 +add test 10.10.161.220 +add test 10.10.161.221 +add test 10.10.161.222 +add test 10.10.161.223 +add test 10.10.161.224 +add test 10.10.161.225 +add test 10.10.161.226 +add test 10.10.161.227 +add test 10.10.161.228 +add test 10.10.161.229 +add test 10.10.161.23 +add test 10.10.161.230 +add test 10.10.161.231 +add test 10.10.161.232 +add test 10.10.161.233 +add test 10.10.161.234 +add test 10.10.161.235 +add test 10.10.161.236 +add test 10.10.161.237 +add test 10.10.161.238 +add test 10.10.161.239 +add test 10.10.161.24 +add test 10.10.161.240 +add test 10.10.161.241 +add test 10.10.161.242 +add test 10.10.161.243 +add test 10.10.161.244 +add test 10.10.161.245 +add test 10.10.161.246 +add test 10.10.161.247 +add test 10.10.161.248 +add test 10.10.161.249 +add test 10.10.161.25 +add test 10.10.161.250 +add test 10.10.161.251 +add test 10.10.161.252 +add test 10.10.161.253 +add test 10.10.161.254 +add test 10.10.161.255 +add test 10.10.161.26 +add test 10.10.161.27 +add test 10.10.161.28 +add test 10.10.161.29 +add test 10.10.161.3 +add test 10.10.161.30 +add test 10.10.161.31 +add test 10.10.161.32 +add test 10.10.161.33 +add test 10.10.161.34 +add test 10.10.161.35 +add test 10.10.161.36 +add test 10.10.161.37 +add test 10.10.161.38 +add test 10.10.161.39 +add test 10.10.161.4 +add test 10.10.161.40 +add test 10.10.161.41 +add test 10.10.161.42 +add test 10.10.161.43 +add test 10.10.161.44 +add test 10.10.161.45 +add test 10.10.161.46 +add test 10.10.161.47 +add test 10.10.161.48 +add test 10.10.161.49 +add test 10.10.161.5 +add test 10.10.161.50 +add test 10.10.161.51 +add test 10.10.161.52 +add test 10.10.161.53 +add test 10.10.161.54 +add test 10.10.161.55 +add test 10.10.161.56 +add test 10.10.161.57 +add test 10.10.161.58 +add test 10.10.161.59 +add test 10.10.161.6 +add test 10.10.161.60 +add test 10.10.161.61 +add test 10.10.161.62 +add test 10.10.161.63 +add test 10.10.161.64 +add test 10.10.161.65 +add test 10.10.161.66 +add test 10.10.161.67 +add test 10.10.161.68 +add test 10.10.161.69 +add test 10.10.161.7 +add test 10.10.161.70 +add test 10.10.161.71 +add test 10.10.161.72 +add test 10.10.161.73 +add test 10.10.161.74 +add test 10.10.161.75 +add test 10.10.161.76 +add test 10.10.161.77 +add test 10.10.161.78 +add test 10.10.161.79 +add test 10.10.161.8 +add test 10.10.161.80 +add test 10.10.161.81 +add test 10.10.161.82 +add test 10.10.161.83 +add test 10.10.161.84 +add test 10.10.161.85 +add test 10.10.161.86 +add test 10.10.161.87 +add test 10.10.161.88 +add test 10.10.161.89 +add test 10.10.161.9 +add test 10.10.161.90 +add test 10.10.161.91 +add test 10.10.161.92 +add test 10.10.161.93 +add test 10.10.161.94 +add test 10.10.161.95 +add test 10.10.161.96 +add test 10.10.161.97 +add test 10.10.161.98 +add test 10.10.161.99 +add test 10.10.162.0 +add test 10.10.162.1 +add test 10.10.162.10 +add test 10.10.162.100 +add test 10.10.162.101 +add test 10.10.162.102 +add test 10.10.162.103 +add test 10.10.162.104 +add test 10.10.162.105 +add test 10.10.162.106 +add test 10.10.162.107 +add test 10.10.162.108 +add test 10.10.162.109 +add test 10.10.162.11 +add test 10.10.162.110 +add test 10.10.162.111 +add test 10.10.162.112 +add test 10.10.162.113 +add test 10.10.162.114 +add test 10.10.162.115 +add test 10.10.162.116 +add test 10.10.162.117 +add test 10.10.162.118 +add test 10.10.162.119 +add test 10.10.162.12 +add test 10.10.162.120 +add test 10.10.162.121 +add test 10.10.162.122 +add test 10.10.162.123 +add test 10.10.162.124 +add test 10.10.162.125 +add test 10.10.162.126 +add test 10.10.162.127 +add test 10.10.162.128 +add test 10.10.162.129 +add test 10.10.162.13 +add test 10.10.162.130 +add test 10.10.162.131 +add test 10.10.162.132 +add test 10.10.162.133 +add test 10.10.162.134 +add test 10.10.162.135 +add test 10.10.162.136 +add test 10.10.162.137 +add test 10.10.162.138 +add test 10.10.162.139 +add test 10.10.162.14 +add test 10.10.162.140 +add test 10.10.162.141 +add test 10.10.162.142 +add test 10.10.162.143 +add test 10.10.162.144 +add test 10.10.162.145 +add test 10.10.162.146 +add test 10.10.162.147 +add test 10.10.162.148 +add test 10.10.162.149 +add test 10.10.162.15 +add test 10.10.162.150 +add test 10.10.162.151 +add test 10.10.162.152 +add test 10.10.162.153 +add test 10.10.162.154 +add test 10.10.162.155 +add test 10.10.162.156 +add test 10.10.162.157 +add test 10.10.162.158 +add test 10.10.162.159 +add test 10.10.162.16 +add test 10.10.162.160 +add test 10.10.162.161 +add test 10.10.162.162 +add test 10.10.162.163 +add test 10.10.162.164 +add test 10.10.162.165 +add test 10.10.162.166 +add test 10.10.162.167 +add test 10.10.162.168 +add test 10.10.162.169 +add test 10.10.162.17 +add test 10.10.162.170 +add test 10.10.162.171 +add test 10.10.162.172 +add test 10.10.162.173 +add test 10.10.162.174 +add test 10.10.162.175 +add test 10.10.162.176 +add test 10.10.162.177 +add test 10.10.162.178 +add test 10.10.162.179 +add test 10.10.162.18 +add test 10.10.162.180 +add test 10.10.162.181 +add test 10.10.162.182 +add test 10.10.162.183 +add test 10.10.162.184 +add test 10.10.162.185 +add test 10.10.162.186 +add test 10.10.162.187 +add test 10.10.162.188 +add test 10.10.162.189 +add test 10.10.162.19 +add test 10.10.162.190 +add test 10.10.162.191 +add test 10.10.162.192 +add test 10.10.162.193 +add test 10.10.162.194 +add test 10.10.162.195 +add test 10.10.162.196 +add test 10.10.162.197 +add test 10.10.162.198 +add test 10.10.162.199 +add test 10.10.162.2 +add test 10.10.162.20 +add test 10.10.162.200 +add test 10.10.162.201 +add test 10.10.162.202 +add test 10.10.162.203 +add test 10.10.162.204 +add test 10.10.162.205 +add test 10.10.162.206 +add test 10.10.162.207 +add test 10.10.162.208 +add test 10.10.162.209 +add test 10.10.162.21 +add test 10.10.162.210 +add test 10.10.162.211 +add test 10.10.162.212 +add test 10.10.162.213 +add test 10.10.162.214 +add test 10.10.162.215 +add test 10.10.162.216 +add test 10.10.162.217 +add test 10.10.162.218 +add test 10.10.162.219 +add test 10.10.162.22 +add test 10.10.162.220 +add test 10.10.162.221 +add test 10.10.162.222 +add test 10.10.162.223 +add test 10.10.162.224 +add test 10.10.162.225 +add test 10.10.162.226 +add test 10.10.162.227 +add test 10.10.162.228 +add test 10.10.162.229 +add test 10.10.162.23 +add test 10.10.162.230 +add test 10.10.162.231 +add test 10.10.162.232 +add test 10.10.162.233 +add test 10.10.162.234 +add test 10.10.162.235 +add test 10.10.162.236 +add test 10.10.162.237 +add test 10.10.162.238 +add test 10.10.162.239 +add test 10.10.162.24 +add test 10.10.162.240 +add test 10.10.162.241 +add test 10.10.162.242 +add test 10.10.162.243 +add test 10.10.162.244 +add test 10.10.162.245 +add test 10.10.162.246 +add test 10.10.162.247 +add test 10.10.162.248 +add test 10.10.162.249 +add test 10.10.162.25 +add test 10.10.162.250 +add test 10.10.162.251 +add test 10.10.162.252 +add test 10.10.162.253 +add test 10.10.162.254 +add test 10.10.162.255 +add test 10.10.162.26 +add test 10.10.162.27 +add test 10.10.162.28 +add test 10.10.162.29 +add test 10.10.162.3 +add test 10.10.162.30 +add test 10.10.162.31 +add test 10.10.162.32 +add test 10.10.162.33 +add test 10.10.162.34 +add test 10.10.162.35 +add test 10.10.162.36 +add test 10.10.162.37 +add test 10.10.162.38 +add test 10.10.162.39 +add test 10.10.162.4 +add test 10.10.162.40 +add test 10.10.162.41 +add test 10.10.162.42 +add test 10.10.162.43 +add test 10.10.162.44 +add test 10.10.162.45 +add test 10.10.162.46 +add test 10.10.162.47 +add test 10.10.162.48 +add test 10.10.162.49 +add test 10.10.162.5 +add test 10.10.162.50 +add test 10.10.162.51 +add test 10.10.162.52 +add test 10.10.162.53 +add test 10.10.162.54 +add test 10.10.162.55 +add test 10.10.162.56 +add test 10.10.162.57 +add test 10.10.162.58 +add test 10.10.162.59 +add test 10.10.162.6 +add test 10.10.162.60 +add test 10.10.162.61 +add test 10.10.162.62 +add test 10.10.162.63 +add test 10.10.162.64 +add test 10.10.162.65 +add test 10.10.162.66 +add test 10.10.162.67 +add test 10.10.162.68 +add test 10.10.162.69 +add test 10.10.162.7 +add test 10.10.162.70 +add test 10.10.162.71 +add test 10.10.162.72 +add test 10.10.162.73 +add test 10.10.162.74 +add test 10.10.162.75 +add test 10.10.162.76 +add test 10.10.162.77 +add test 10.10.162.78 +add test 10.10.162.79 +add test 10.10.162.8 +add test 10.10.162.80 +add test 10.10.162.81 +add test 10.10.162.82 +add test 10.10.162.83 +add test 10.10.162.84 +add test 10.10.162.85 +add test 10.10.162.86 +add test 10.10.162.87 +add test 10.10.162.88 +add test 10.10.162.89 +add test 10.10.162.9 +add test 10.10.162.90 +add test 10.10.162.91 +add test 10.10.162.92 +add test 10.10.162.93 +add test 10.10.162.94 +add test 10.10.162.95 +add test 10.10.162.96 +add test 10.10.162.97 +add test 10.10.162.98 +add test 10.10.162.99 +add test 10.10.163.0 +add test 10.10.163.1 +add test 10.10.163.10 +add test 10.10.163.100 +add test 10.10.163.101 +add test 10.10.163.102 +add test 10.10.163.103 +add test 10.10.163.104 +add test 10.10.163.105 +add test 10.10.163.106 +add test 10.10.163.107 +add test 10.10.163.108 +add test 10.10.163.109 +add test 10.10.163.11 +add test 10.10.163.110 +add test 10.10.163.111 +add test 10.10.163.112 +add test 10.10.163.113 +add test 10.10.163.114 +add test 10.10.163.115 +add test 10.10.163.116 +add test 10.10.163.117 +add test 10.10.163.118 +add test 10.10.163.119 +add test 10.10.163.12 +add test 10.10.163.120 +add test 10.10.163.121 +add test 10.10.163.122 +add test 10.10.163.123 +add test 10.10.163.124 +add test 10.10.163.125 +add test 10.10.163.126 +add test 10.10.163.127 +add test 10.10.163.128 +add test 10.10.163.129 +add test 10.10.163.13 +add test 10.10.163.130 +add test 10.10.163.131 +add test 10.10.163.132 +add test 10.10.163.133 +add test 10.10.163.134 +add test 10.10.163.135 +add test 10.10.163.136 +add test 10.10.163.137 +add test 10.10.163.138 +add test 10.10.163.139 +add test 10.10.163.14 +add test 10.10.163.140 +add test 10.10.163.141 +add test 10.10.163.142 +add test 10.10.163.143 +add test 10.10.163.144 +add test 10.10.163.145 +add test 10.10.163.146 +add test 10.10.163.147 +add test 10.10.163.148 +add test 10.10.163.149 +add test 10.10.163.15 +add test 10.10.163.150 +add test 10.10.163.151 +add test 10.10.163.152 +add test 10.10.163.153 +add test 10.10.163.154 +add test 10.10.163.155 +add test 10.10.163.156 +add test 10.10.163.157 +add test 10.10.163.158 +add test 10.10.163.159 +add test 10.10.163.16 +add test 10.10.163.160 +add test 10.10.163.161 +add test 10.10.163.162 +add test 10.10.163.163 +add test 10.10.163.164 +add test 10.10.163.165 +add test 10.10.163.166 +add test 10.10.163.167 +add test 10.10.163.168 +add test 10.10.163.169 +add test 10.10.163.17 +add test 10.10.163.170 +add test 10.10.163.171 +add test 10.10.163.172 +add test 10.10.163.173 +add test 10.10.163.174 +add test 10.10.163.175 +add test 10.10.163.176 +add test 10.10.163.177 +add test 10.10.163.178 +add test 10.10.163.179 +add test 10.10.163.18 +add test 10.10.163.180 +add test 10.10.163.181 +add test 10.10.163.182 +add test 10.10.163.183 +add test 10.10.163.184 +add test 10.10.163.185 +add test 10.10.163.186 +add test 10.10.163.187 +add test 10.10.163.188 +add test 10.10.163.189 +add test 10.10.163.19 +add test 10.10.163.190 +add test 10.10.163.191 +add test 10.10.163.192 +add test 10.10.163.193 +add test 10.10.163.194 +add test 10.10.163.195 +add test 10.10.163.196 +add test 10.10.163.197 +add test 10.10.163.198 +add test 10.10.163.199 +add test 10.10.163.2 +add test 10.10.163.20 +add test 10.10.163.200 +add test 10.10.163.201 +add test 10.10.163.202 +add test 10.10.163.203 +add test 10.10.163.204 +add test 10.10.163.205 +add test 10.10.163.206 +add test 10.10.163.207 +add test 10.10.163.208 +add test 10.10.163.209 +add test 10.10.163.21 +add test 10.10.163.210 +add test 10.10.163.211 +add test 10.10.163.212 +add test 10.10.163.213 +add test 10.10.163.214 +add test 10.10.163.215 +add test 10.10.163.216 +add test 10.10.163.217 +add test 10.10.163.218 +add test 10.10.163.219 +add test 10.10.163.22 +add test 10.10.163.220 +add test 10.10.163.221 +add test 10.10.163.222 +add test 10.10.163.223 +add test 10.10.163.224 +add test 10.10.163.225 +add test 10.10.163.226 +add test 10.10.163.227 +add test 10.10.163.228 +add test 10.10.163.229 +add test 10.10.163.23 +add test 10.10.163.230 +add test 10.10.163.231 +add test 10.10.163.232 +add test 10.10.163.233 +add test 10.10.163.234 +add test 10.10.163.235 +add test 10.10.163.236 +add test 10.10.163.237 +add test 10.10.163.238 +add test 10.10.163.239 +add test 10.10.163.24 +add test 10.10.163.240 +add test 10.10.163.241 +add test 10.10.163.242 +add test 10.10.163.243 +add test 10.10.163.244 +add test 10.10.163.245 +add test 10.10.163.246 +add test 10.10.163.247 +add test 10.10.163.248 +add test 10.10.163.249 +add test 10.10.163.25 +add test 10.10.163.250 +add test 10.10.163.251 +add test 10.10.163.252 +add test 10.10.163.253 +add test 10.10.163.254 +add test 10.10.163.255 +add test 10.10.163.26 +add test 10.10.163.27 +add test 10.10.163.28 +add test 10.10.163.29 +add test 10.10.163.3 +add test 10.10.163.30 +add test 10.10.163.31 +add test 10.10.163.32 +add test 10.10.163.33 +add test 10.10.163.34 +add test 10.10.163.35 +add test 10.10.163.36 +add test 10.10.163.37 +add test 10.10.163.38 +add test 10.10.163.39 +add test 10.10.163.4 +add test 10.10.163.40 +add test 10.10.163.41 +add test 10.10.163.42 +add test 10.10.163.43 +add test 10.10.163.44 +add test 10.10.163.45 +add test 10.10.163.46 +add test 10.10.163.47 +add test 10.10.163.48 +add test 10.10.163.49 +add test 10.10.163.5 +add test 10.10.163.50 +add test 10.10.163.51 +add test 10.10.163.52 +add test 10.10.163.53 +add test 10.10.163.54 +add test 10.10.163.55 +add test 10.10.163.56 +add test 10.10.163.57 +add test 10.10.163.58 +add test 10.10.163.59 +add test 10.10.163.6 +add test 10.10.163.60 +add test 10.10.163.61 +add test 10.10.163.62 +add test 10.10.163.63 +add test 10.10.163.64 +add test 10.10.163.65 +add test 10.10.163.66 +add test 10.10.163.67 +add test 10.10.163.68 +add test 10.10.163.69 +add test 10.10.163.7 +add test 10.10.163.70 +add test 10.10.163.71 +add test 10.10.163.72 +add test 10.10.163.73 +add test 10.10.163.74 +add test 10.10.163.75 +add test 10.10.163.76 +add test 10.10.163.77 +add test 10.10.163.78 +add test 10.10.163.79 +add test 10.10.163.8 +add test 10.10.163.80 +add test 10.10.163.81 +add test 10.10.163.82 +add test 10.10.163.83 +add test 10.10.163.84 +add test 10.10.163.85 +add test 10.10.163.86 +add test 10.10.163.87 +add test 10.10.163.88 +add test 10.10.163.89 +add test 10.10.163.9 +add test 10.10.163.90 +add test 10.10.163.91 +add test 10.10.163.92 +add test 10.10.163.93 +add test 10.10.163.94 +add test 10.10.163.95 +add test 10.10.163.96 +add test 10.10.163.97 +add test 10.10.163.98 +add test 10.10.163.99 +add test 10.10.164.0 +add test 10.10.164.1 +add test 10.10.164.10 +add test 10.10.164.100 +add test 10.10.164.101 +add test 10.10.164.102 +add test 10.10.164.103 +add test 10.10.164.104 +add test 10.10.164.105 +add test 10.10.164.106 +add test 10.10.164.107 +add test 10.10.164.108 +add test 10.10.164.109 +add test 10.10.164.11 +add test 10.10.164.110 +add test 10.10.164.111 +add test 10.10.164.112 +add test 10.10.164.113 +add test 10.10.164.114 +add test 10.10.164.115 +add test 10.10.164.116 +add test 10.10.164.117 +add test 10.10.164.118 +add test 10.10.164.119 +add test 10.10.164.12 +add test 10.10.164.120 +add test 10.10.164.121 +add test 10.10.164.122 +add test 10.10.164.123 +add test 10.10.164.124 +add test 10.10.164.125 +add test 10.10.164.126 +add test 10.10.164.127 +add test 10.10.164.128 +add test 10.10.164.129 +add test 10.10.164.13 +add test 10.10.164.130 +add test 10.10.164.131 +add test 10.10.164.132 +add test 10.10.164.133 +add test 10.10.164.134 +add test 10.10.164.135 +add test 10.10.164.136 +add test 10.10.164.137 +add test 10.10.164.138 +add test 10.10.164.139 +add test 10.10.164.14 +add test 10.10.164.140 +add test 10.10.164.141 +add test 10.10.164.142 +add test 10.10.164.143 +add test 10.10.164.144 +add test 10.10.164.145 +add test 10.10.164.146 +add test 10.10.164.147 +add test 10.10.164.148 +add test 10.10.164.149 +add test 10.10.164.15 +add test 10.10.164.150 +add test 10.10.164.151 +add test 10.10.164.152 +add test 10.10.164.153 +add test 10.10.164.154 +add test 10.10.164.155 +add test 10.10.164.156 +add test 10.10.164.157 +add test 10.10.164.158 +add test 10.10.164.159 +add test 10.10.164.16 +add test 10.10.164.160 +add test 10.10.164.161 +add test 10.10.164.162 +add test 10.10.164.163 +add test 10.10.164.164 +add test 10.10.164.165 +add test 10.10.164.166 +add test 10.10.164.167 +add test 10.10.164.168 +add test 10.10.164.169 +add test 10.10.164.17 +add test 10.10.164.170 +add test 10.10.164.171 +add test 10.10.164.172 +add test 10.10.164.173 +add test 10.10.164.174 +add test 10.10.164.175 +add test 10.10.164.176 +add test 10.10.164.177 +add test 10.10.164.178 +add test 10.10.164.179 +add test 10.10.164.18 +add test 10.10.164.180 +add test 10.10.164.181 +add test 10.10.164.182 +add test 10.10.164.183 +add test 10.10.164.184 +add test 10.10.164.185 +add test 10.10.164.186 +add test 10.10.164.187 +add test 10.10.164.188 +add test 10.10.164.189 +add test 10.10.164.19 +add test 10.10.164.190 +add test 10.10.164.191 +add test 10.10.164.192 +add test 10.10.164.193 +add test 10.10.164.194 +add test 10.10.164.195 +add test 10.10.164.196 +add test 10.10.164.197 +add test 10.10.164.198 +add test 10.10.164.199 +add test 10.10.164.2 +add test 10.10.164.20 +add test 10.10.164.200 +add test 10.10.164.201 +add test 10.10.164.202 +add test 10.10.164.203 +add test 10.10.164.204 +add test 10.10.164.205 +add test 10.10.164.206 +add test 10.10.164.207 +add test 10.10.164.208 +add test 10.10.164.209 +add test 10.10.164.21 +add test 10.10.164.210 +add test 10.10.164.211 +add test 10.10.164.212 +add test 10.10.164.213 +add test 10.10.164.214 +add test 10.10.164.215 +add test 10.10.164.216 +add test 10.10.164.217 +add test 10.10.164.218 +add test 10.10.164.219 +add test 10.10.164.22 +add test 10.10.164.220 +add test 10.10.164.221 +add test 10.10.164.222 +add test 10.10.164.223 +add test 10.10.164.224 +add test 10.10.164.225 +add test 10.10.164.226 +add test 10.10.164.227 +add test 10.10.164.228 +add test 10.10.164.229 +add test 10.10.164.23 +add test 10.10.164.230 +add test 10.10.164.231 +add test 10.10.164.232 +add test 10.10.164.233 +add test 10.10.164.234 +add test 10.10.164.235 +add test 10.10.164.236 +add test 10.10.164.237 +add test 10.10.164.238 +add test 10.10.164.239 +add test 10.10.164.24 +add test 10.10.164.240 +add test 10.10.164.241 +add test 10.10.164.242 +add test 10.10.164.243 +add test 10.10.164.244 +add test 10.10.164.245 +add test 10.10.164.246 +add test 10.10.164.247 +add test 10.10.164.248 +add test 10.10.164.249 +add test 10.10.164.25 +add test 10.10.164.250 +add test 10.10.164.251 +add test 10.10.164.252 +add test 10.10.164.253 +add test 10.10.164.254 +add test 10.10.164.255 +add test 10.10.164.26 +add test 10.10.164.27 +add test 10.10.164.28 +add test 10.10.164.29 +add test 10.10.164.3 +add test 10.10.164.30 +add test 10.10.164.31 +add test 10.10.164.32 +add test 10.10.164.33 +add test 10.10.164.34 +add test 10.10.164.35 +add test 10.10.164.36 +add test 10.10.164.37 +add test 10.10.164.38 +add test 10.10.164.39 +add test 10.10.164.4 +add test 10.10.164.40 +add test 10.10.164.41 +add test 10.10.164.42 +add test 10.10.164.43 +add test 10.10.164.44 +add test 10.10.164.45 +add test 10.10.164.46 +add test 10.10.164.47 +add test 10.10.164.48 +add test 10.10.164.49 +add test 10.10.164.5 +add test 10.10.164.50 +add test 10.10.164.51 +add test 10.10.164.52 +add test 10.10.164.53 +add test 10.10.164.54 +add test 10.10.164.55 +add test 10.10.164.56 +add test 10.10.164.57 +add test 10.10.164.58 +add test 10.10.164.59 +add test 10.10.164.6 +add test 10.10.164.60 +add test 10.10.164.61 +add test 10.10.164.62 +add test 10.10.164.63 +add test 10.10.164.64 +add test 10.10.164.65 +add test 10.10.164.66 +add test 10.10.164.67 +add test 10.10.164.68 +add test 10.10.164.69 +add test 10.10.164.7 +add test 10.10.164.70 +add test 10.10.164.71 +add test 10.10.164.72 +add test 10.10.164.73 +add test 10.10.164.74 +add test 10.10.164.75 +add test 10.10.164.76 +add test 10.10.164.77 +add test 10.10.164.78 +add test 10.10.164.79 +add test 10.10.164.8 +add test 10.10.164.80 +add test 10.10.164.81 +add test 10.10.164.82 +add test 10.10.164.83 +add test 10.10.164.84 +add test 10.10.164.85 +add test 10.10.164.86 +add test 10.10.164.87 +add test 10.10.164.88 +add test 10.10.164.89 +add test 10.10.164.9 +add test 10.10.164.90 +add test 10.10.164.91 +add test 10.10.164.92 +add test 10.10.164.93 +add test 10.10.164.94 +add test 10.10.164.95 +add test 10.10.164.96 +add test 10.10.164.97 +add test 10.10.164.98 +add test 10.10.164.99 +add test 10.10.165.0 +add test 10.10.165.1 +add test 10.10.165.10 +add test 10.10.165.100 +add test 10.10.165.101 +add test 10.10.165.102 +add test 10.10.165.103 +add test 10.10.165.104 +add test 10.10.165.105 +add test 10.10.165.106 +add test 10.10.165.107 +add test 10.10.165.108 +add test 10.10.165.109 +add test 10.10.165.11 +add test 10.10.165.110 +add test 10.10.165.111 +add test 10.10.165.112 +add test 10.10.165.113 +add test 10.10.165.114 +add test 10.10.165.115 +add test 10.10.165.116 +add test 10.10.165.117 +add test 10.10.165.118 +add test 10.10.165.119 +add test 10.10.165.12 +add test 10.10.165.120 +add test 10.10.165.121 +add test 10.10.165.122 +add test 10.10.165.123 +add test 10.10.165.124 +add test 10.10.165.125 +add test 10.10.165.126 +add test 10.10.165.127 +add test 10.10.165.128 +add test 10.10.165.129 +add test 10.10.165.13 +add test 10.10.165.130 +add test 10.10.165.131 +add test 10.10.165.132 +add test 10.10.165.133 +add test 10.10.165.134 +add test 10.10.165.135 +add test 10.10.165.136 +add test 10.10.165.137 +add test 10.10.165.138 +add test 10.10.165.139 +add test 10.10.165.14 +add test 10.10.165.140 +add test 10.10.165.141 +add test 10.10.165.142 +add test 10.10.165.143 +add test 10.10.165.144 +add test 10.10.165.145 +add test 10.10.165.146 +add test 10.10.165.147 +add test 10.10.165.148 +add test 10.10.165.149 +add test 10.10.165.15 +add test 10.10.165.150 +add test 10.10.165.151 +add test 10.10.165.152 +add test 10.10.165.153 +add test 10.10.165.154 +add test 10.10.165.155 +add test 10.10.165.156 +add test 10.10.165.157 +add test 10.10.165.158 +add test 10.10.165.159 +add test 10.10.165.16 +add test 10.10.165.160 +add test 10.10.165.161 +add test 10.10.165.162 +add test 10.10.165.163 +add test 10.10.165.164 +add test 10.10.165.165 +add test 10.10.165.166 +add test 10.10.165.167 +add test 10.10.165.168 +add test 10.10.165.169 +add test 10.10.165.17 +add test 10.10.165.170 +add test 10.10.165.171 +add test 10.10.165.172 +add test 10.10.165.173 +add test 10.10.165.174 +add test 10.10.165.175 +add test 10.10.165.176 +add test 10.10.165.177 +add test 10.10.165.178 +add test 10.10.165.179 +add test 10.10.165.18 +add test 10.10.165.180 +add test 10.10.165.181 +add test 10.10.165.182 +add test 10.10.165.183 +add test 10.10.165.184 +add test 10.10.165.185 +add test 10.10.165.186 +add test 10.10.165.187 +add test 10.10.165.188 +add test 10.10.165.189 +add test 10.10.165.19 +add test 10.10.165.190 +add test 10.10.165.191 +add test 10.10.165.192 +add test 10.10.165.193 +add test 10.10.165.194 +add test 10.10.165.195 +add test 10.10.165.196 +add test 10.10.165.197 +add test 10.10.165.198 +add test 10.10.165.199 +add test 10.10.165.2 +add test 10.10.165.20 +add test 10.10.165.200 +add test 10.10.165.201 +add test 10.10.165.202 +add test 10.10.165.203 +add test 10.10.165.204 +add test 10.10.165.205 +add test 10.10.165.206 +add test 10.10.165.207 +add test 10.10.165.208 +add test 10.10.165.209 +add test 10.10.165.21 +add test 10.10.165.210 +add test 10.10.165.211 +add test 10.10.165.212 +add test 10.10.165.213 +add test 10.10.165.214 +add test 10.10.165.215 +add test 10.10.165.216 +add test 10.10.165.217 +add test 10.10.165.218 +add test 10.10.165.219 +add test 10.10.165.22 +add test 10.10.165.220 +add test 10.10.165.221 +add test 10.10.165.222 +add test 10.10.165.223 +add test 10.10.165.224 +add test 10.10.165.225 +add test 10.10.165.226 +add test 10.10.165.227 +add test 10.10.165.228 +add test 10.10.165.229 +add test 10.10.165.23 +add test 10.10.165.230 +add test 10.10.165.231 +add test 10.10.165.232 +add test 10.10.165.233 +add test 10.10.165.234 +add test 10.10.165.235 +add test 10.10.165.236 +add test 10.10.165.237 +add test 10.10.165.238 +add test 10.10.165.239 +add test 10.10.165.24 +add test 10.10.165.240 +add test 10.10.165.241 +add test 10.10.165.242 +add test 10.10.165.243 +add test 10.10.165.244 +add test 10.10.165.245 +add test 10.10.165.246 +add test 10.10.165.247 +add test 10.10.165.248 +add test 10.10.165.249 +add test 10.10.165.25 +add test 10.10.165.250 +add test 10.10.165.251 +add test 10.10.165.252 +add test 10.10.165.253 +add test 10.10.165.254 +add test 10.10.165.255 +add test 10.10.165.26 +add test 10.10.165.27 +add test 10.10.165.28 +add test 10.10.165.29 +add test 10.10.165.3 +add test 10.10.165.30 +add test 10.10.165.31 +add test 10.10.165.32 +add test 10.10.165.33 +add test 10.10.165.34 +add test 10.10.165.35 +add test 10.10.165.36 +add test 10.10.165.37 +add test 10.10.165.38 +add test 10.10.165.39 +add test 10.10.165.4 +add test 10.10.165.40 +add test 10.10.165.41 +add test 10.10.165.42 +add test 10.10.165.43 +add test 10.10.165.44 +add test 10.10.165.45 +add test 10.10.165.46 +add test 10.10.165.47 +add test 10.10.165.48 +add test 10.10.165.49 +add test 10.10.165.5 +add test 10.10.165.50 +add test 10.10.165.51 +add test 10.10.165.52 +add test 10.10.165.53 +add test 10.10.165.54 +add test 10.10.165.55 +add test 10.10.165.56 +add test 10.10.165.57 +add test 10.10.165.58 +add test 10.10.165.59 +add test 10.10.165.6 +add test 10.10.165.60 +add test 10.10.165.61 +add test 10.10.165.62 +add test 10.10.165.63 +add test 10.10.165.64 +add test 10.10.165.65 +add test 10.10.165.66 +add test 10.10.165.67 +add test 10.10.165.68 +add test 10.10.165.69 +add test 10.10.165.7 +add test 10.10.165.70 +add test 10.10.165.71 +add test 10.10.165.72 +add test 10.10.165.73 +add test 10.10.165.74 +add test 10.10.165.75 +add test 10.10.165.76 +add test 10.10.165.77 +add test 10.10.165.78 +add test 10.10.165.79 +add test 10.10.165.8 +add test 10.10.165.80 +add test 10.10.165.81 +add test 10.10.165.82 +add test 10.10.165.83 +add test 10.10.165.84 +add test 10.10.165.85 +add test 10.10.165.86 +add test 10.10.165.87 +add test 10.10.165.88 +add test 10.10.165.89 +add test 10.10.165.9 +add test 10.10.165.90 +add test 10.10.165.91 +add test 10.10.165.92 +add test 10.10.165.93 +add test 10.10.165.94 +add test 10.10.165.95 +add test 10.10.165.96 +add test 10.10.165.97 +add test 10.10.165.98 +add test 10.10.165.99 +add test 10.10.166.0 +add test 10.10.166.1 +add test 10.10.166.10 +add test 10.10.166.100 +add test 10.10.166.101 +add test 10.10.166.102 +add test 10.10.166.103 +add test 10.10.166.104 +add test 10.10.166.105 +add test 10.10.166.106 +add test 10.10.166.107 +add test 10.10.166.108 +add test 10.10.166.109 +add test 10.10.166.11 +add test 10.10.166.110 +add test 10.10.166.111 +add test 10.10.166.112 +add test 10.10.166.113 +add test 10.10.166.114 +add test 10.10.166.115 +add test 10.10.166.116 +add test 10.10.166.117 +add test 10.10.166.118 +add test 10.10.166.119 +add test 10.10.166.12 +add test 10.10.166.120 +add test 10.10.166.121 +add test 10.10.166.122 +add test 10.10.166.123 +add test 10.10.166.124 +add test 10.10.166.125 +add test 10.10.166.126 +add test 10.10.166.127 +add test 10.10.166.128 +add test 10.10.166.129 +add test 10.10.166.13 +add test 10.10.166.130 +add test 10.10.166.131 +add test 10.10.166.132 +add test 10.10.166.133 +add test 10.10.166.134 +add test 10.10.166.135 +add test 10.10.166.136 +add test 10.10.166.137 +add test 10.10.166.138 +add test 10.10.166.139 +add test 10.10.166.14 +add test 10.10.166.140 +add test 10.10.166.141 +add test 10.10.166.142 +add test 10.10.166.143 +add test 10.10.166.144 +add test 10.10.166.145 +add test 10.10.166.146 +add test 10.10.166.147 +add test 10.10.166.148 +add test 10.10.166.149 +add test 10.10.166.15 +add test 10.10.166.150 +add test 10.10.166.151 +add test 10.10.166.152 +add test 10.10.166.153 +add test 10.10.166.154 +add test 10.10.166.155 +add test 10.10.166.156 +add test 10.10.166.157 +add test 10.10.166.158 +add test 10.10.166.159 +add test 10.10.166.16 +add test 10.10.166.160 +add test 10.10.166.161 +add test 10.10.166.162 +add test 10.10.166.163 +add test 10.10.166.164 +add test 10.10.166.165 +add test 10.10.166.166 +add test 10.10.166.167 +add test 10.10.166.168 +add test 10.10.166.169 +add test 10.10.166.17 +add test 10.10.166.170 +add test 10.10.166.171 +add test 10.10.166.172 +add test 10.10.166.173 +add test 10.10.166.174 +add test 10.10.166.175 +add test 10.10.166.176 +add test 10.10.166.177 +add test 10.10.166.178 +add test 10.10.166.179 +add test 10.10.166.18 +add test 10.10.166.180 +add test 10.10.166.181 +add test 10.10.166.182 +add test 10.10.166.183 +add test 10.10.166.184 +add test 10.10.166.185 +add test 10.10.166.186 +add test 10.10.166.187 +add test 10.10.166.188 +add test 10.10.166.189 +add test 10.10.166.19 +add test 10.10.166.190 +add test 10.10.166.191 +add test 10.10.166.192 +add test 10.10.166.193 +add test 10.10.166.194 +add test 10.10.166.195 +add test 10.10.166.196 +add test 10.10.166.197 +add test 10.10.166.198 +add test 10.10.166.199 +add test 10.10.166.2 +add test 10.10.166.20 +add test 10.10.166.200 +add test 10.10.166.201 +add test 10.10.166.202 +add test 10.10.166.203 +add test 10.10.166.204 +add test 10.10.166.205 +add test 10.10.166.206 +add test 10.10.166.207 +add test 10.10.166.208 +add test 10.10.166.209 +add test 10.10.166.21 +add test 10.10.166.210 +add test 10.10.166.211 +add test 10.10.166.212 +add test 10.10.166.213 +add test 10.10.166.214 +add test 10.10.166.215 +add test 10.10.166.216 +add test 10.10.166.217 +add test 10.10.166.218 +add test 10.10.166.219 +add test 10.10.166.22 +add test 10.10.166.220 +add test 10.10.166.221 +add test 10.10.166.222 +add test 10.10.166.223 +add test 10.10.166.224 +add test 10.10.166.225 +add test 10.10.166.226 +add test 10.10.166.227 +add test 10.10.166.228 +add test 10.10.166.229 +add test 10.10.166.23 +add test 10.10.166.230 +add test 10.10.166.231 +add test 10.10.166.232 +add test 10.10.166.233 +add test 10.10.166.234 +add test 10.10.166.235 +add test 10.10.166.236 +add test 10.10.166.237 +add test 10.10.166.238 +add test 10.10.166.239 +add test 10.10.166.24 +add test 10.10.166.240 +add test 10.10.166.241 +add test 10.10.166.242 +add test 10.10.166.243 +add test 10.10.166.244 +add test 10.10.166.245 +add test 10.10.166.246 +add test 10.10.166.247 +add test 10.10.166.248 +add test 10.10.166.249 +add test 10.10.166.25 +add test 10.10.166.250 +add test 10.10.166.251 +add test 10.10.166.252 +add test 10.10.166.253 +add test 10.10.166.254 +add test 10.10.166.255 +add test 10.10.166.26 +add test 10.10.166.27 +add test 10.10.166.28 +add test 10.10.166.29 +add test 10.10.166.3 +add test 10.10.166.30 +add test 10.10.166.31 +add test 10.10.166.32 +add test 10.10.166.33 +add test 10.10.166.34 +add test 10.10.166.35 +add test 10.10.166.36 +add test 10.10.166.37 +add test 10.10.166.38 +add test 10.10.166.39 +add test 10.10.166.4 +add test 10.10.166.40 +add test 10.10.166.41 +add test 10.10.166.42 +add test 10.10.166.43 +add test 10.10.166.44 +add test 10.10.166.45 +add test 10.10.166.46 +add test 10.10.166.47 +add test 10.10.166.48 +add test 10.10.166.49 +add test 10.10.166.5 +add test 10.10.166.50 +add test 10.10.166.51 +add test 10.10.166.52 +add test 10.10.166.53 +add test 10.10.166.54 +add test 10.10.166.55 +add test 10.10.166.56 +add test 10.10.166.57 +add test 10.10.166.58 +add test 10.10.166.59 +add test 10.10.166.6 +add test 10.10.166.60 +add test 10.10.166.61 +add test 10.10.166.62 +add test 10.10.166.63 +add test 10.10.166.64 +add test 10.10.166.65 +add test 10.10.166.66 +add test 10.10.166.67 +add test 10.10.166.68 +add test 10.10.166.69 +add test 10.10.166.7 +add test 10.10.166.70 +add test 10.10.166.71 +add test 10.10.166.72 +add test 10.10.166.73 +add test 10.10.166.74 +add test 10.10.166.75 +add test 10.10.166.76 +add test 10.10.166.77 +add test 10.10.166.78 +add test 10.10.166.79 +add test 10.10.166.8 +add test 10.10.166.80 +add test 10.10.166.81 +add test 10.10.166.82 +add test 10.10.166.83 +add test 10.10.166.84 +add test 10.10.166.85 +add test 10.10.166.86 +add test 10.10.166.87 +add test 10.10.166.88 +add test 10.10.166.89 +add test 10.10.166.9 +add test 10.10.166.90 +add test 10.10.166.91 +add test 10.10.166.92 +add test 10.10.166.93 +add test 10.10.166.94 +add test 10.10.166.95 +add test 10.10.166.96 +add test 10.10.166.97 +add test 10.10.166.98 +add test 10.10.166.99 +add test 10.10.167.0 +add test 10.10.167.1 +add test 10.10.167.10 +add test 10.10.167.100 +add test 10.10.167.101 +add test 10.10.167.102 +add test 10.10.167.103 +add test 10.10.167.104 +add test 10.10.167.105 +add test 10.10.167.106 +add test 10.10.167.107 +add test 10.10.167.108 +add test 10.10.167.109 +add test 10.10.167.11 +add test 10.10.167.110 +add test 10.10.167.111 +add test 10.10.167.112 +add test 10.10.167.113 +add test 10.10.167.114 +add test 10.10.167.115 +add test 10.10.167.116 +add test 10.10.167.117 +add test 10.10.167.118 +add test 10.10.167.119 +add test 10.10.167.12 +add test 10.10.167.120 +add test 10.10.167.121 +add test 10.10.167.122 +add test 10.10.167.123 +add test 10.10.167.124 +add test 10.10.167.125 +add test 10.10.167.126 +add test 10.10.167.127 +add test 10.10.167.128 +add test 10.10.167.129 +add test 10.10.167.13 +add test 10.10.167.130 +add test 10.10.167.131 +add test 10.10.167.132 +add test 10.10.167.133 +add test 10.10.167.134 +add test 10.10.167.135 +add test 10.10.167.136 +add test 10.10.167.137 +add test 10.10.167.138 +add test 10.10.167.139 +add test 10.10.167.14 +add test 10.10.167.140 +add test 10.10.167.141 +add test 10.10.167.142 +add test 10.10.167.143 +add test 10.10.167.144 +add test 10.10.167.145 +add test 10.10.167.146 +add test 10.10.167.147 +add test 10.10.167.148 +add test 10.10.167.149 +add test 10.10.167.15 +add test 10.10.167.150 +add test 10.10.167.151 +add test 10.10.167.152 +add test 10.10.167.153 +add test 10.10.167.154 +add test 10.10.167.155 +add test 10.10.167.156 +add test 10.10.167.157 +add test 10.10.167.158 +add test 10.10.167.159 +add test 10.10.167.16 +add test 10.10.167.160 +add test 10.10.167.161 +add test 10.10.167.162 +add test 10.10.167.163 +add test 10.10.167.164 +add test 10.10.167.165 +add test 10.10.167.166 +add test 10.10.167.167 +add test 10.10.167.168 +add test 10.10.167.169 +add test 10.10.167.17 +add test 10.10.167.170 +add test 10.10.167.171 +add test 10.10.167.172 +add test 10.10.167.173 +add test 10.10.167.174 +add test 10.10.167.175 +add test 10.10.167.176 +add test 10.10.167.177 +add test 10.10.167.178 +add test 10.10.167.179 +add test 10.10.167.18 +add test 10.10.167.180 +add test 10.10.167.181 +add test 10.10.167.182 +add test 10.10.167.183 +add test 10.10.167.184 +add test 10.10.167.185 +add test 10.10.167.186 +add test 10.10.167.187 +add test 10.10.167.188 +add test 10.10.167.189 +add test 10.10.167.19 +add test 10.10.167.190 +add test 10.10.167.191 +add test 10.10.167.192 +add test 10.10.167.193 +add test 10.10.167.194 +add test 10.10.167.195 +add test 10.10.167.196 +add test 10.10.167.197 +add test 10.10.167.198 +add test 10.10.167.199 +add test 10.10.167.2 +add test 10.10.167.20 +add test 10.10.167.200 +add test 10.10.167.201 +add test 10.10.167.202 +add test 10.10.167.203 +add test 10.10.167.204 +add test 10.10.167.205 +add test 10.10.167.206 +add test 10.10.167.207 +add test 10.10.167.208 +add test 10.10.167.209 +add test 10.10.167.21 +add test 10.10.167.210 +add test 10.10.167.211 +add test 10.10.167.212 +add test 10.10.167.213 +add test 10.10.167.214 +add test 10.10.167.215 +add test 10.10.167.216 +add test 10.10.167.217 +add test 10.10.167.218 +add test 10.10.167.219 +add test 10.10.167.22 +add test 10.10.167.220 +add test 10.10.167.221 +add test 10.10.167.222 +add test 10.10.167.223 +add test 10.10.167.224 +add test 10.10.167.225 +add test 10.10.167.226 +add test 10.10.167.227 +add test 10.10.167.228 +add test 10.10.167.229 +add test 10.10.167.23 +add test 10.10.167.230 +add test 10.10.167.231 +add test 10.10.167.232 +add test 10.10.167.233 +add test 10.10.167.234 +add test 10.10.167.235 +add test 10.10.167.236 +add test 10.10.167.237 +add test 10.10.167.238 +add test 10.10.167.239 +add test 10.10.167.24 +add test 10.10.167.240 +add test 10.10.167.241 +add test 10.10.167.242 +add test 10.10.167.243 +add test 10.10.167.244 +add test 10.10.167.245 +add test 10.10.167.246 +add test 10.10.167.247 +add test 10.10.167.248 +add test 10.10.167.249 +add test 10.10.167.25 +add test 10.10.167.250 +add test 10.10.167.251 +add test 10.10.167.252 +add test 10.10.167.253 +add test 10.10.167.254 +add test 10.10.167.255 +add test 10.10.167.26 +add test 10.10.167.27 +add test 10.10.167.28 +add test 10.10.167.29 +add test 10.10.167.3 +add test 10.10.167.30 +add test 10.10.167.31 +add test 10.10.167.32 +add test 10.10.167.33 +add test 10.10.167.34 +add test 10.10.167.35 +add test 10.10.167.36 +add test 10.10.167.37 +add test 10.10.167.38 +add test 10.10.167.39 +add test 10.10.167.4 +add test 10.10.167.40 +add test 10.10.167.41 +add test 10.10.167.42 +add test 10.10.167.43 +add test 10.10.167.44 +add test 10.10.167.45 +add test 10.10.167.46 +add test 10.10.167.47 +add test 10.10.167.48 +add test 10.10.167.49 +add test 10.10.167.5 +add test 10.10.167.50 +add test 10.10.167.51 +add test 10.10.167.52 +add test 10.10.167.53 +add test 10.10.167.54 +add test 10.10.167.55 +add test 10.10.167.56 +add test 10.10.167.57 +add test 10.10.167.58 +add test 10.10.167.59 +add test 10.10.167.6 +add test 10.10.167.60 +add test 10.10.167.61 +add test 10.10.167.62 +add test 10.10.167.63 +add test 10.10.167.64 +add test 10.10.167.65 +add test 10.10.167.66 +add test 10.10.167.67 +add test 10.10.167.68 +add test 10.10.167.69 +add test 10.10.167.7 +add test 10.10.167.70 +add test 10.10.167.71 +add test 10.10.167.72 +add test 10.10.167.73 +add test 10.10.167.74 +add test 10.10.167.75 +add test 10.10.167.76 +add test 10.10.167.77 +add test 10.10.167.78 +add test 10.10.167.79 +add test 10.10.167.8 +add test 10.10.167.80 +add test 10.10.167.81 +add test 10.10.167.82 +add test 10.10.167.83 +add test 10.10.167.84 +add test 10.10.167.85 +add test 10.10.167.86 +add test 10.10.167.87 +add test 10.10.167.88 +add test 10.10.167.89 +add test 10.10.167.9 +add test 10.10.167.90 +add test 10.10.167.91 +add test 10.10.167.92 +add test 10.10.167.93 +add test 10.10.167.94 +add test 10.10.167.95 +add test 10.10.167.96 +add test 10.10.167.97 +add test 10.10.167.98 +add test 10.10.167.99 +add test 10.10.168.0 +add test 10.10.168.1 +add test 10.10.168.10 +add test 10.10.168.100 +add test 10.10.168.101 +add test 10.10.168.102 +add test 10.10.168.103 +add test 10.10.168.104 +add test 10.10.168.105 +add test 10.10.168.106 +add test 10.10.168.107 +add test 10.10.168.108 +add test 10.10.168.109 +add test 10.10.168.11 +add test 10.10.168.110 +add test 10.10.168.111 +add test 10.10.168.112 +add test 10.10.168.113 +add test 10.10.168.114 +add test 10.10.168.115 +add test 10.10.168.116 +add test 10.10.168.117 +add test 10.10.168.118 +add test 10.10.168.119 +add test 10.10.168.12 +add test 10.10.168.120 +add test 10.10.168.121 +add test 10.10.168.122 +add test 10.10.168.123 +add test 10.10.168.124 +add test 10.10.168.125 +add test 10.10.168.126 +add test 10.10.168.127 +add test 10.10.168.128 +add test 10.10.168.129 +add test 10.10.168.13 +add test 10.10.168.130 +add test 10.10.168.131 +add test 10.10.168.132 +add test 10.10.168.133 +add test 10.10.168.134 +add test 10.10.168.135 +add test 10.10.168.136 +add test 10.10.168.137 +add test 10.10.168.138 +add test 10.10.168.139 +add test 10.10.168.14 +add test 10.10.168.140 +add test 10.10.168.141 +add test 10.10.168.142 +add test 10.10.168.143 +add test 10.10.168.144 +add test 10.10.168.145 +add test 10.10.168.146 +add test 10.10.168.147 +add test 10.10.168.148 +add test 10.10.168.149 +add test 10.10.168.15 +add test 10.10.168.150 +add test 10.10.168.151 +add test 10.10.168.152 +add test 10.10.168.153 +add test 10.10.168.154 +add test 10.10.168.155 +add test 10.10.168.156 +add test 10.10.168.157 +add test 10.10.168.158 +add test 10.10.168.159 +add test 10.10.168.16 +add test 10.10.168.160 +add test 10.10.168.161 +add test 10.10.168.162 +add test 10.10.168.163 +add test 10.10.168.164 +add test 10.10.168.165 +add test 10.10.168.166 +add test 10.10.168.167 +add test 10.10.168.168 +add test 10.10.168.169 +add test 10.10.168.17 +add test 10.10.168.170 +add test 10.10.168.171 +add test 10.10.168.172 +add test 10.10.168.173 +add test 10.10.168.174 +add test 10.10.168.175 +add test 10.10.168.176 +add test 10.10.168.177 +add test 10.10.168.178 +add test 10.10.168.179 +add test 10.10.168.18 +add test 10.10.168.180 +add test 10.10.168.181 +add test 10.10.168.182 +add test 10.10.168.183 +add test 10.10.168.184 +add test 10.10.168.185 +add test 10.10.168.186 +add test 10.10.168.187 +add test 10.10.168.188 +add test 10.10.168.189 +add test 10.10.168.19 +add test 10.10.168.190 +add test 10.10.168.191 +add test 10.10.168.192 +add test 10.10.168.193 +add test 10.10.168.194 +add test 10.10.168.195 +add test 10.10.168.196 +add test 10.10.168.197 +add test 10.10.168.198 +add test 10.10.168.199 +add test 10.10.168.2 +add test 10.10.168.20 +add test 10.10.168.200 +add test 10.10.168.201 +add test 10.10.168.202 +add test 10.10.168.203 +add test 10.10.168.204 +add test 10.10.168.205 +add test 10.10.168.206 +add test 10.10.168.207 +add test 10.10.168.208 +add test 10.10.168.209 +add test 10.10.168.21 +add test 10.10.168.210 +add test 10.10.168.211 +add test 10.10.168.212 +add test 10.10.168.213 +add test 10.10.168.214 +add test 10.10.168.215 +add test 10.10.168.216 +add test 10.10.168.217 +add test 10.10.168.218 +add test 10.10.168.219 +add test 10.10.168.22 +add test 10.10.168.220 +add test 10.10.168.221 +add test 10.10.168.222 +add test 10.10.168.223 +add test 10.10.168.224 +add test 10.10.168.225 +add test 10.10.168.226 +add test 10.10.168.227 +add test 10.10.168.228 +add test 10.10.168.229 +add test 10.10.168.23 +add test 10.10.168.230 +add test 10.10.168.231 +add test 10.10.168.232 +add test 10.10.168.233 +add test 10.10.168.234 +add test 10.10.168.235 +add test 10.10.168.236 +add test 10.10.168.237 +add test 10.10.168.238 +add test 10.10.168.239 +add test 10.10.168.24 +add test 10.10.168.240 +add test 10.10.168.241 +add test 10.10.168.242 +add test 10.10.168.243 +add test 10.10.168.244 +add test 10.10.168.245 +add test 10.10.168.246 +add test 10.10.168.247 +add test 10.10.168.248 +add test 10.10.168.249 +add test 10.10.168.25 +add test 10.10.168.250 +add test 10.10.168.251 +add test 10.10.168.252 +add test 10.10.168.253 +add test 10.10.168.254 +add test 10.10.168.255 +add test 10.10.168.26 +add test 10.10.168.27 +add test 10.10.168.28 +add test 10.10.168.29 +add test 10.10.168.3 +add test 10.10.168.30 +add test 10.10.168.31 +add test 10.10.168.32 +add test 10.10.168.33 +add test 10.10.168.34 +add test 10.10.168.35 +add test 10.10.168.36 +add test 10.10.168.37 +add test 10.10.168.38 +add test 10.10.168.39 +add test 10.10.168.4 +add test 10.10.168.40 +add test 10.10.168.41 +add test 10.10.168.42 +add test 10.10.168.43 +add test 10.10.168.44 +add test 10.10.168.45 +add test 10.10.168.46 +add test 10.10.168.47 +add test 10.10.168.48 +add test 10.10.168.49 +add test 10.10.168.5 +add test 10.10.168.50 +add test 10.10.168.51 +add test 10.10.168.52 +add test 10.10.168.53 +add test 10.10.168.54 +add test 10.10.168.55 +add test 10.10.168.56 +add test 10.10.168.57 +add test 10.10.168.58 +add test 10.10.168.59 +add test 10.10.168.6 +add test 10.10.168.60 +add test 10.10.168.61 +add test 10.10.168.62 +add test 10.10.168.63 +add test 10.10.168.64 +add test 10.10.168.65 +add test 10.10.168.66 +add test 10.10.168.67 +add test 10.10.168.68 +add test 10.10.168.69 +add test 10.10.168.7 +add test 10.10.168.70 +add test 10.10.168.71 +add test 10.10.168.72 +add test 10.10.168.73 +add test 10.10.168.74 +add test 10.10.168.75 +add test 10.10.168.76 +add test 10.10.168.77 +add test 10.10.168.78 +add test 10.10.168.79 +add test 10.10.168.8 +add test 10.10.168.80 +add test 10.10.168.81 +add test 10.10.168.82 +add test 10.10.168.83 +add test 10.10.168.84 +add test 10.10.168.85 +add test 10.10.168.86 +add test 10.10.168.87 +add test 10.10.168.88 +add test 10.10.168.89 +add test 10.10.168.9 +add test 10.10.168.90 +add test 10.10.168.91 +add test 10.10.168.92 +add test 10.10.168.93 +add test 10.10.168.94 +add test 10.10.168.95 +add test 10.10.168.96 +add test 10.10.168.97 +add test 10.10.168.98 +add test 10.10.168.99 +add test 10.10.169.0 +add test 10.10.169.1 +add test 10.10.169.10 +add test 10.10.169.100 +add test 10.10.169.101 +add test 10.10.169.102 +add test 10.10.169.103 +add test 10.10.169.104 +add test 10.10.169.105 +add test 10.10.169.106 +add test 10.10.169.107 +add test 10.10.169.108 +add test 10.10.169.109 +add test 10.10.169.11 +add test 10.10.169.110 +add test 10.10.169.111 +add test 10.10.169.112 +add test 10.10.169.113 +add test 10.10.169.114 +add test 10.10.169.115 +add test 10.10.169.116 +add test 10.10.169.117 +add test 10.10.169.118 +add test 10.10.169.119 +add test 10.10.169.12 +add test 10.10.169.120 +add test 10.10.169.121 +add test 10.10.169.122 +add test 10.10.169.123 +add test 10.10.169.124 +add test 10.10.169.125 +add test 10.10.169.126 +add test 10.10.169.127 +add test 10.10.169.128 +add test 10.10.169.129 +add test 10.10.169.13 +add test 10.10.169.130 +add test 10.10.169.131 +add test 10.10.169.132 +add test 10.10.169.133 +add test 10.10.169.134 +add test 10.10.169.135 +add test 10.10.169.136 +add test 10.10.169.137 +add test 10.10.169.138 +add test 10.10.169.139 +add test 10.10.169.14 +add test 10.10.169.140 +add test 10.10.169.141 +add test 10.10.169.142 +add test 10.10.169.143 +add test 10.10.169.144 +add test 10.10.169.145 +add test 10.10.169.146 +add test 10.10.169.147 +add test 10.10.169.148 +add test 10.10.169.149 +add test 10.10.169.15 +add test 10.10.169.150 +add test 10.10.169.151 +add test 10.10.169.152 +add test 10.10.169.153 +add test 10.10.169.154 +add test 10.10.169.155 +add test 10.10.169.156 +add test 10.10.169.157 +add test 10.10.169.158 +add test 10.10.169.159 +add test 10.10.169.16 +add test 10.10.169.160 +add test 10.10.169.161 +add test 10.10.169.162 +add test 10.10.169.163 +add test 10.10.169.164 +add test 10.10.169.165 +add test 10.10.169.166 +add test 10.10.169.167 +add test 10.10.169.168 +add test 10.10.169.169 +add test 10.10.169.17 +add test 10.10.169.170 +add test 10.10.169.171 +add test 10.10.169.172 +add test 10.10.169.173 +add test 10.10.169.174 +add test 10.10.169.175 +add test 10.10.169.176 +add test 10.10.169.177 +add test 10.10.169.178 +add test 10.10.169.179 +add test 10.10.169.18 +add test 10.10.169.180 +add test 10.10.169.181 +add test 10.10.169.182 +add test 10.10.169.183 +add test 10.10.169.184 +add test 10.10.169.185 +add test 10.10.169.186 +add test 10.10.169.187 +add test 10.10.169.188 +add test 10.10.169.189 +add test 10.10.169.19 +add test 10.10.169.190 +add test 10.10.169.191 +add test 10.10.169.192 +add test 10.10.169.193 +add test 10.10.169.194 +add test 10.10.169.195 +add test 10.10.169.196 +add test 10.10.169.197 +add test 10.10.169.198 +add test 10.10.169.199 +add test 10.10.169.2 +add test 10.10.169.20 +add test 10.10.169.200 +add test 10.10.169.201 +add test 10.10.169.202 +add test 10.10.169.203 +add test 10.10.169.204 +add test 10.10.169.205 +add test 10.10.169.206 +add test 10.10.169.207 +add test 10.10.169.208 +add test 10.10.169.209 +add test 10.10.169.21 +add test 10.10.169.210 +add test 10.10.169.211 +add test 10.10.169.212 +add test 10.10.169.213 +add test 10.10.169.214 +add test 10.10.169.215 +add test 10.10.169.216 +add test 10.10.169.217 +add test 10.10.169.218 +add test 10.10.169.219 +add test 10.10.169.22 +add test 10.10.169.220 +add test 10.10.169.221 +add test 10.10.169.222 +add test 10.10.169.223 +add test 10.10.169.224 +add test 10.10.169.225 +add test 10.10.169.226 +add test 10.10.169.227 +add test 10.10.169.228 +add test 10.10.169.229 +add test 10.10.169.23 +add test 10.10.169.230 +add test 10.10.169.231 +add test 10.10.169.232 +add test 10.10.169.233 +add test 10.10.169.234 +add test 10.10.169.235 +add test 10.10.169.236 +add test 10.10.169.237 +add test 10.10.169.238 +add test 10.10.169.239 +add test 10.10.169.24 +add test 10.10.169.240 +add test 10.10.169.241 +add test 10.10.169.242 +add test 10.10.169.243 +add test 10.10.169.244 +add test 10.10.169.245 +add test 10.10.169.246 +add test 10.10.169.247 +add test 10.10.169.248 +add test 10.10.169.249 +add test 10.10.169.25 +add test 10.10.169.250 +add test 10.10.169.251 +add test 10.10.169.252 +add test 10.10.169.253 +add test 10.10.169.254 +add test 10.10.169.255 +add test 10.10.169.26 +add test 10.10.169.27 +add test 10.10.169.28 +add test 10.10.169.29 +add test 10.10.169.3 +add test 10.10.169.30 +add test 10.10.169.31 +add test 10.10.169.32 +add test 10.10.169.33 +add test 10.10.169.34 +add test 10.10.169.35 +add test 10.10.169.36 +add test 10.10.169.37 +add test 10.10.169.38 +add test 10.10.169.39 +add test 10.10.169.4 +add test 10.10.169.40 +add test 10.10.169.41 +add test 10.10.169.42 +add test 10.10.169.43 +add test 10.10.169.44 +add test 10.10.169.45 +add test 10.10.169.46 +add test 10.10.169.47 +add test 10.10.169.48 +add test 10.10.169.49 +add test 10.10.169.5 +add test 10.10.169.50 +add test 10.10.169.51 +add test 10.10.169.52 +add test 10.10.169.53 +add test 10.10.169.54 +add test 10.10.169.55 +add test 10.10.169.56 +add test 10.10.169.57 +add test 10.10.169.58 +add test 10.10.169.59 +add test 10.10.169.6 +add test 10.10.169.60 +add test 10.10.169.61 +add test 10.10.169.62 +add test 10.10.169.63 +add test 10.10.169.64 +add test 10.10.169.65 +add test 10.10.169.66 +add test 10.10.169.67 +add test 10.10.169.68 +add test 10.10.169.69 +add test 10.10.169.7 +add test 10.10.169.70 +add test 10.10.169.71 +add test 10.10.169.72 +add test 10.10.169.73 +add test 10.10.169.74 +add test 10.10.169.75 +add test 10.10.169.76 +add test 10.10.169.77 +add test 10.10.169.78 +add test 10.10.169.79 +add test 10.10.169.8 +add test 10.10.169.80 +add test 10.10.169.81 +add test 10.10.169.82 +add test 10.10.169.83 +add test 10.10.169.84 +add test 10.10.169.85 +add test 10.10.169.86 +add test 10.10.169.87 +add test 10.10.169.88 +add test 10.10.169.89 +add test 10.10.169.9 +add test 10.10.169.90 +add test 10.10.169.91 +add test 10.10.169.92 +add test 10.10.169.93 +add test 10.10.169.94 +add test 10.10.169.95 +add test 10.10.169.96 +add test 10.10.169.97 +add test 10.10.169.98 +add test 10.10.169.99 +add test 10.10.17.0 +add test 10.10.17.1 +add test 10.10.17.10 +add test 10.10.17.100 +add test 10.10.17.101 +add test 10.10.17.102 +add test 10.10.17.103 +add test 10.10.17.104 +add test 10.10.17.105 +add test 10.10.17.106 +add test 10.10.17.107 +add test 10.10.17.108 +add test 10.10.17.109 +add test 10.10.17.11 +add test 10.10.17.110 +add test 10.10.17.111 +add test 10.10.17.112 +add test 10.10.17.113 +add test 10.10.17.114 +add test 10.10.17.115 +add test 10.10.17.116 +add test 10.10.17.117 +add test 10.10.17.118 +add test 10.10.17.119 +add test 10.10.17.12 +add test 10.10.17.120 +add test 10.10.17.121 +add test 10.10.17.122 +add test 10.10.17.123 +add test 10.10.17.124 +add test 10.10.17.125 +add test 10.10.17.126 +add test 10.10.17.127 +add test 10.10.17.128 +add test 10.10.17.129 +add test 10.10.17.13 +add test 10.10.17.130 +add test 10.10.17.131 +add test 10.10.17.132 +add test 10.10.17.133 +add test 10.10.17.134 +add test 10.10.17.135 +add test 10.10.17.136 +add test 10.10.17.137 +add test 10.10.17.138 +add test 10.10.17.139 +add test 10.10.17.14 +add test 10.10.17.140 +add test 10.10.17.141 +add test 10.10.17.142 +add test 10.10.17.143 +add test 10.10.17.144 +add test 10.10.17.145 +add test 10.10.17.146 +add test 10.10.17.147 +add test 10.10.17.148 +add test 10.10.17.149 +add test 10.10.17.15 +add test 10.10.17.150 +add test 10.10.17.151 +add test 10.10.17.152 +add test 10.10.17.153 +add test 10.10.17.154 +add test 10.10.17.155 +add test 10.10.17.156 +add test 10.10.17.157 +add test 10.10.17.158 +add test 10.10.17.159 +add test 10.10.17.16 +add test 10.10.17.160 +add test 10.10.17.161 +add test 10.10.17.162 +add test 10.10.17.163 +add test 10.10.17.164 +add test 10.10.17.165 +add test 10.10.17.166 +add test 10.10.17.167 +add test 10.10.17.168 +add test 10.10.17.169 +add test 10.10.17.17 +add test 10.10.17.170 +add test 10.10.17.171 +add test 10.10.17.172 +add test 10.10.17.173 +add test 10.10.17.174 +add test 10.10.17.175 +add test 10.10.17.176 +add test 10.10.17.177 +add test 10.10.17.178 +add test 10.10.17.179 +add test 10.10.17.18 +add test 10.10.17.180 +add test 10.10.17.181 +add test 10.10.17.182 +add test 10.10.17.183 +add test 10.10.17.184 +add test 10.10.17.185 +add test 10.10.17.186 +add test 10.10.17.187 +add test 10.10.17.188 +add test 10.10.17.189 +add test 10.10.17.19 +add test 10.10.17.190 +add test 10.10.17.191 +add test 10.10.17.192 +add test 10.10.17.193 +add test 10.10.17.194 +add test 10.10.17.195 +add test 10.10.17.196 +add test 10.10.17.197 +add test 10.10.17.198 +add test 10.10.17.199 +add test 10.10.17.2 +add test 10.10.17.20 +add test 10.10.17.200 +add test 10.10.17.201 +add test 10.10.17.202 +add test 10.10.17.203 +add test 10.10.17.204 +add test 10.10.17.205 +add test 10.10.17.206 +add test 10.10.17.207 +add test 10.10.17.208 +add test 10.10.17.209 +add test 10.10.17.21 +add test 10.10.17.210 +add test 10.10.17.211 +add test 10.10.17.212 +add test 10.10.17.213 +add test 10.10.17.214 +add test 10.10.17.215 +add test 10.10.17.216 +add test 10.10.17.217 +add test 10.10.17.218 +add test 10.10.17.219 +add test 10.10.17.22 +add test 10.10.17.220 +add test 10.10.17.221 +add test 10.10.17.222 +add test 10.10.17.223 +add test 10.10.17.224 +add test 10.10.17.225 +add test 10.10.17.226 +add test 10.10.17.227 +add test 10.10.17.228 +add test 10.10.17.229 +add test 10.10.17.23 +add test 10.10.17.230 +add test 10.10.17.231 +add test 10.10.17.232 +add test 10.10.17.233 +add test 10.10.17.234 +add test 10.10.17.235 +add test 10.10.17.236 +add test 10.10.17.237 +add test 10.10.17.238 +add test 10.10.17.239 +add test 10.10.17.24 +add test 10.10.17.240 +add test 10.10.17.241 +add test 10.10.17.242 +add test 10.10.17.243 +add test 10.10.17.244 +add test 10.10.17.245 +add test 10.10.17.246 +add test 10.10.17.247 +add test 10.10.17.248 +add test 10.10.17.249 +add test 10.10.17.25 +add test 10.10.17.250 +add test 10.10.17.251 +add test 10.10.17.252 +add test 10.10.17.253 +add test 10.10.17.254 +add test 10.10.17.255 +add test 10.10.17.26 +add test 10.10.17.27 +add test 10.10.17.28 +add test 10.10.17.29 +add test 10.10.17.3 +add test 10.10.17.30 +add test 10.10.17.31 +add test 10.10.17.32 +add test 10.10.17.33 +add test 10.10.17.34 +add test 10.10.17.35 +add test 10.10.17.36 +add test 10.10.17.37 +add test 10.10.17.38 +add test 10.10.17.39 +add test 10.10.17.4 +add test 10.10.17.40 +add test 10.10.17.41 +add test 10.10.17.42 +add test 10.10.17.43 +add test 10.10.17.44 +add test 10.10.17.45 +add test 10.10.17.46 +add test 10.10.17.47 +add test 10.10.17.48 +add test 10.10.17.49 +add test 10.10.17.5 +add test 10.10.17.50 +add test 10.10.17.51 +add test 10.10.17.52 +add test 10.10.17.53 +add test 10.10.17.54 +add test 10.10.17.55 +add test 10.10.17.56 +add test 10.10.17.57 +add test 10.10.17.58 +add test 10.10.17.59 +add test 10.10.17.6 +add test 10.10.17.60 +add test 10.10.17.61 +add test 10.10.17.62 +add test 10.10.17.63 +add test 10.10.17.64 +add test 10.10.17.65 +add test 10.10.17.66 +add test 10.10.17.67 +add test 10.10.17.68 +add test 10.10.17.69 +add test 10.10.17.7 +add test 10.10.17.70 +add test 10.10.17.71 +add test 10.10.17.72 +add test 10.10.17.73 +add test 10.10.17.74 +add test 10.10.17.75 +add test 10.10.17.76 +add test 10.10.17.77 +add test 10.10.17.78 +add test 10.10.17.79 +add test 10.10.17.8 +add test 10.10.17.80 +add test 10.10.17.81 +add test 10.10.17.82 +add test 10.10.17.83 +add test 10.10.17.84 +add test 10.10.17.85 +add test 10.10.17.86 +add test 10.10.17.87 +add test 10.10.17.88 +add test 10.10.17.89 +add test 10.10.17.9 +add test 10.10.17.90 +add test 10.10.17.91 +add test 10.10.17.92 +add test 10.10.17.93 +add test 10.10.17.94 +add test 10.10.17.95 +add test 10.10.17.96 +add test 10.10.17.97 +add test 10.10.17.98 +add test 10.10.17.99 +add test 10.10.170.0 +add test 10.10.170.1 +add test 10.10.170.10 +add test 10.10.170.100 +add test 10.10.170.101 +add test 10.10.170.102 +add test 10.10.170.103 +add test 10.10.170.104 +add test 10.10.170.105 +add test 10.10.170.106 +add test 10.10.170.107 +add test 10.10.170.108 +add test 10.10.170.109 +add test 10.10.170.11 +add test 10.10.170.110 +add test 10.10.170.111 +add test 10.10.170.112 +add test 10.10.170.113 +add test 10.10.170.114 +add test 10.10.170.115 +add test 10.10.170.116 +add test 10.10.170.117 +add test 10.10.170.118 +add test 10.10.170.119 +add test 10.10.170.12 +add test 10.10.170.120 +add test 10.10.170.121 +add test 10.10.170.122 +add test 10.10.170.123 +add test 10.10.170.124 +add test 10.10.170.125 +add test 10.10.170.126 +add test 10.10.170.127 +add test 10.10.170.128 +add test 10.10.170.129 +add test 10.10.170.13 +add test 10.10.170.130 +add test 10.10.170.131 +add test 10.10.170.132 +add test 10.10.170.133 +add test 10.10.170.134 +add test 10.10.170.135 +add test 10.10.170.136 +add test 10.10.170.137 +add test 10.10.170.138 +add test 10.10.170.139 +add test 10.10.170.14 +add test 10.10.170.140 +add test 10.10.170.141 +add test 10.10.170.142 +add test 10.10.170.143 +add test 10.10.170.144 +add test 10.10.170.145 +add test 10.10.170.146 +add test 10.10.170.147 +add test 10.10.170.148 +add test 10.10.170.149 +add test 10.10.170.15 +add test 10.10.170.150 +add test 10.10.170.151 +add test 10.10.170.152 +add test 10.10.170.153 +add test 10.10.170.154 +add test 10.10.170.155 +add test 10.10.170.156 +add test 10.10.170.157 +add test 10.10.170.158 +add test 10.10.170.159 +add test 10.10.170.16 +add test 10.10.170.160 +add test 10.10.170.161 +add test 10.10.170.162 +add test 10.10.170.163 +add test 10.10.170.164 +add test 10.10.170.165 +add test 10.10.170.166 +add test 10.10.170.167 +add test 10.10.170.168 +add test 10.10.170.169 +add test 10.10.170.17 +add test 10.10.170.170 +add test 10.10.170.171 +add test 10.10.170.172 +add test 10.10.170.173 +add test 10.10.170.174 +add test 10.10.170.175 +add test 10.10.170.176 +add test 10.10.170.177 +add test 10.10.170.178 +add test 10.10.170.179 +add test 10.10.170.18 +add test 10.10.170.180 +add test 10.10.170.181 +add test 10.10.170.182 +add test 10.10.170.183 +add test 10.10.170.184 +add test 10.10.170.185 +add test 10.10.170.186 +add test 10.10.170.187 +add test 10.10.170.188 +add test 10.10.170.189 +add test 10.10.170.19 +add test 10.10.170.190 +add test 10.10.170.191 +add test 10.10.170.192 +add test 10.10.170.193 +add test 10.10.170.194 +add test 10.10.170.195 +add test 10.10.170.196 +add test 10.10.170.197 +add test 10.10.170.198 +add test 10.10.170.199 +add test 10.10.170.2 +add test 10.10.170.20 +add test 10.10.170.200 +add test 10.10.170.201 +add test 10.10.170.202 +add test 10.10.170.203 +add test 10.10.170.204 +add test 10.10.170.205 +add test 10.10.170.206 +add test 10.10.170.207 +add test 10.10.170.208 +add test 10.10.170.209 +add test 10.10.170.21 +add test 10.10.170.210 +add test 10.10.170.211 +add test 10.10.170.212 +add test 10.10.170.213 +add test 10.10.170.214 +add test 10.10.170.215 +add test 10.10.170.216 +add test 10.10.170.217 +add test 10.10.170.218 +add test 10.10.170.219 +add test 10.10.170.22 +add test 10.10.170.220 +add test 10.10.170.221 +add test 10.10.170.222 +add test 10.10.170.223 +add test 10.10.170.224 +add test 10.10.170.225 +add test 10.10.170.226 +add test 10.10.170.227 +add test 10.10.170.228 +add test 10.10.170.229 +add test 10.10.170.23 +add test 10.10.170.230 +add test 10.10.170.231 +add test 10.10.170.232 +add test 10.10.170.233 +add test 10.10.170.234 +add test 10.10.170.235 +add test 10.10.170.236 +add test 10.10.170.237 +add test 10.10.170.238 +add test 10.10.170.239 +add test 10.10.170.24 +add test 10.10.170.240 +add test 10.10.170.241 +add test 10.10.170.242 +add test 10.10.170.243 +add test 10.10.170.244 +add test 10.10.170.245 +add test 10.10.170.246 +add test 10.10.170.247 +add test 10.10.170.248 +add test 10.10.170.249 +add test 10.10.170.25 +add test 10.10.170.250 +add test 10.10.170.251 +add test 10.10.170.252 +add test 10.10.170.253 +add test 10.10.170.254 +add test 10.10.170.255 +add test 10.10.170.26 +add test 10.10.170.27 +add test 10.10.170.28 +add test 10.10.170.29 +add test 10.10.170.3 +add test 10.10.170.30 +add test 10.10.170.31 +add test 10.10.170.32 +add test 10.10.170.33 +add test 10.10.170.34 +add test 10.10.170.35 +add test 10.10.170.36 +add test 10.10.170.37 +add test 10.10.170.38 +add test 10.10.170.39 +add test 10.10.170.4 +add test 10.10.170.40 +add test 10.10.170.41 +add test 10.10.170.42 +add test 10.10.170.43 +add test 10.10.170.44 +add test 10.10.170.45 +add test 10.10.170.46 +add test 10.10.170.47 +add test 10.10.170.48 +add test 10.10.170.49 +add test 10.10.170.5 +add test 10.10.170.50 +add test 10.10.170.51 +add test 10.10.170.52 +add test 10.10.170.53 +add test 10.10.170.54 +add test 10.10.170.55 +add test 10.10.170.56 +add test 10.10.170.57 +add test 10.10.170.58 +add test 10.10.170.59 +add test 10.10.170.6 +add test 10.10.170.60 +add test 10.10.170.61 +add test 10.10.170.62 +add test 10.10.170.63 +add test 10.10.170.64 +add test 10.10.170.65 +add test 10.10.170.66 +add test 10.10.170.67 +add test 10.10.170.68 +add test 10.10.170.69 +add test 10.10.170.7 +add test 10.10.170.70 +add test 10.10.170.71 +add test 10.10.170.72 +add test 10.10.170.73 +add test 10.10.170.74 +add test 10.10.170.75 +add test 10.10.170.76 +add test 10.10.170.77 +add test 10.10.170.78 +add test 10.10.170.79 +add test 10.10.170.8 +add test 10.10.170.80 +add test 10.10.170.81 +add test 10.10.170.82 +add test 10.10.170.83 +add test 10.10.170.84 +add test 10.10.170.85 +add test 10.10.170.86 +add test 10.10.170.87 +add test 10.10.170.88 +add test 10.10.170.89 +add test 10.10.170.9 +add test 10.10.170.90 +add test 10.10.170.91 +add test 10.10.170.92 +add test 10.10.170.93 +add test 10.10.170.94 +add test 10.10.170.95 +add test 10.10.170.96 +add test 10.10.170.97 +add test 10.10.170.98 +add test 10.10.170.99 +add test 10.10.171.0 +add test 10.10.171.1 +add test 10.10.171.10 +add test 10.10.171.100 +add test 10.10.171.101 +add test 10.10.171.102 +add test 10.10.171.103 +add test 10.10.171.104 +add test 10.10.171.105 +add test 10.10.171.106 +add test 10.10.171.107 +add test 10.10.171.108 +add test 10.10.171.109 +add test 10.10.171.11 +add test 10.10.171.110 +add test 10.10.171.111 +add test 10.10.171.112 +add test 10.10.171.113 +add test 10.10.171.114 +add test 10.10.171.115 +add test 10.10.171.116 +add test 10.10.171.117 +add test 10.10.171.118 +add test 10.10.171.119 +add test 10.10.171.12 +add test 10.10.171.120 +add test 10.10.171.121 +add test 10.10.171.122 +add test 10.10.171.123 +add test 10.10.171.124 +add test 10.10.171.125 +add test 10.10.171.126 +add test 10.10.171.127 +add test 10.10.171.128 +add test 10.10.171.129 +add test 10.10.171.13 +add test 10.10.171.130 +add test 10.10.171.131 +add test 10.10.171.132 +add test 10.10.171.133 +add test 10.10.171.134 +add test 10.10.171.135 +add test 10.10.171.136 +add test 10.10.171.137 +add test 10.10.171.138 +add test 10.10.171.139 +add test 10.10.171.14 +add test 10.10.171.140 +add test 10.10.171.141 +add test 10.10.171.142 +add test 10.10.171.143 +add test 10.10.171.144 +add test 10.10.171.145 +add test 10.10.171.146 +add test 10.10.171.147 +add test 10.10.171.148 +add test 10.10.171.149 +add test 10.10.171.15 +add test 10.10.171.150 +add test 10.10.171.151 +add test 10.10.171.152 +add test 10.10.171.153 +add test 10.10.171.154 +add test 10.10.171.155 +add test 10.10.171.156 +add test 10.10.171.157 +add test 10.10.171.158 +add test 10.10.171.159 +add test 10.10.171.16 +add test 10.10.171.160 +add test 10.10.171.161 +add test 10.10.171.162 +add test 10.10.171.163 +add test 10.10.171.164 +add test 10.10.171.165 +add test 10.10.171.166 +add test 10.10.171.167 +add test 10.10.171.168 +add test 10.10.171.169 +add test 10.10.171.17 +add test 10.10.171.170 +add test 10.10.171.171 +add test 10.10.171.172 +add test 10.10.171.173 +add test 10.10.171.174 +add test 10.10.171.175 +add test 10.10.171.176 +add test 10.10.171.177 +add test 10.10.171.178 +add test 10.10.171.179 +add test 10.10.171.18 +add test 10.10.171.180 +add test 10.10.171.181 +add test 10.10.171.182 +add test 10.10.171.183 +add test 10.10.171.184 +add test 10.10.171.185 +add test 10.10.171.186 +add test 10.10.171.187 +add test 10.10.171.188 +add test 10.10.171.189 +add test 10.10.171.19 +add test 10.10.171.190 +add test 10.10.171.191 +add test 10.10.171.192 +add test 10.10.171.193 +add test 10.10.171.194 +add test 10.10.171.195 +add test 10.10.171.196 +add test 10.10.171.197 +add test 10.10.171.198 +add test 10.10.171.199 +add test 10.10.171.2 +add test 10.10.171.20 +add test 10.10.171.200 +add test 10.10.171.201 +add test 10.10.171.202 +add test 10.10.171.203 +add test 10.10.171.204 +add test 10.10.171.205 +add test 10.10.171.206 +add test 10.10.171.207 +add test 10.10.171.208 +add test 10.10.171.209 +add test 10.10.171.21 +add test 10.10.171.210 +add test 10.10.171.211 +add test 10.10.171.212 +add test 10.10.171.213 +add test 10.10.171.214 +add test 10.10.171.215 +add test 10.10.171.216 +add test 10.10.171.217 +add test 10.10.171.218 +add test 10.10.171.219 +add test 10.10.171.22 +add test 10.10.171.220 +add test 10.10.171.221 +add test 10.10.171.222 +add test 10.10.171.223 +add test 10.10.171.224 +add test 10.10.171.225 +add test 10.10.171.226 +add test 10.10.171.227 +add test 10.10.171.228 +add test 10.10.171.229 +add test 10.10.171.23 +add test 10.10.171.230 +add test 10.10.171.231 +add test 10.10.171.232 +add test 10.10.171.233 +add test 10.10.171.234 +add test 10.10.171.235 +add test 10.10.171.236 +add test 10.10.171.237 +add test 10.10.171.238 +add test 10.10.171.239 +add test 10.10.171.24 +add test 10.10.171.240 +add test 10.10.171.241 +add test 10.10.171.242 +add test 10.10.171.243 +add test 10.10.171.244 +add test 10.10.171.245 +add test 10.10.171.246 +add test 10.10.171.247 +add test 10.10.171.248 +add test 10.10.171.249 +add test 10.10.171.25 +add test 10.10.171.250 +add test 10.10.171.251 +add test 10.10.171.252 +add test 10.10.171.253 +add test 10.10.171.254 +add test 10.10.171.255 +add test 10.10.171.26 +add test 10.10.171.27 +add test 10.10.171.28 +add test 10.10.171.29 +add test 10.10.171.3 +add test 10.10.171.30 +add test 10.10.171.31 +add test 10.10.171.32 +add test 10.10.171.33 +add test 10.10.171.34 +add test 10.10.171.35 +add test 10.10.171.36 +add test 10.10.171.37 +add test 10.10.171.38 +add test 10.10.171.39 +add test 10.10.171.4 +add test 10.10.171.40 +add test 10.10.171.41 +add test 10.10.171.42 +add test 10.10.171.43 +add test 10.10.171.44 +add test 10.10.171.45 +add test 10.10.171.46 +add test 10.10.171.47 +add test 10.10.171.48 +add test 10.10.171.49 +add test 10.10.171.5 +add test 10.10.171.50 +add test 10.10.171.51 +add test 10.10.171.52 +add test 10.10.171.53 +add test 10.10.171.54 +add test 10.10.171.55 +add test 10.10.171.56 +add test 10.10.171.57 +add test 10.10.171.58 +add test 10.10.171.59 +add test 10.10.171.6 +add test 10.10.171.60 +add test 10.10.171.61 +add test 10.10.171.62 +add test 10.10.171.63 +add test 10.10.171.64 +add test 10.10.171.65 +add test 10.10.171.66 +add test 10.10.171.67 +add test 10.10.171.68 +add test 10.10.171.69 +add test 10.10.171.7 +add test 10.10.171.70 +add test 10.10.171.71 +add test 10.10.171.72 +add test 10.10.171.73 +add test 10.10.171.74 +add test 10.10.171.75 +add test 10.10.171.76 +add test 10.10.171.77 +add test 10.10.171.78 +add test 10.10.171.79 +add test 10.10.171.8 +add test 10.10.171.80 +add test 10.10.171.81 +add test 10.10.171.82 +add test 10.10.171.83 +add test 10.10.171.84 +add test 10.10.171.85 +add test 10.10.171.86 +add test 10.10.171.87 +add test 10.10.171.88 +add test 10.10.171.89 +add test 10.10.171.9 +add test 10.10.171.90 +add test 10.10.171.91 +add test 10.10.171.92 +add test 10.10.171.93 +add test 10.10.171.94 +add test 10.10.171.95 +add test 10.10.171.96 +add test 10.10.171.97 +add test 10.10.171.98 +add test 10.10.171.99 +add test 10.10.172.0 +add test 10.10.172.1 +add test 10.10.172.10 +add test 10.10.172.100 +add test 10.10.172.101 +add test 10.10.172.102 +add test 10.10.172.103 +add test 10.10.172.104 +add test 10.10.172.105 +add test 10.10.172.106 +add test 10.10.172.107 +add test 10.10.172.108 +add test 10.10.172.109 +add test 10.10.172.11 +add test 10.10.172.110 +add test 10.10.172.111 +add test 10.10.172.112 +add test 10.10.172.113 +add test 10.10.172.114 +add test 10.10.172.115 +add test 10.10.172.116 +add test 10.10.172.117 +add test 10.10.172.118 +add test 10.10.172.119 +add test 10.10.172.12 +add test 10.10.172.120 +add test 10.10.172.121 +add test 10.10.172.122 +add test 10.10.172.123 +add test 10.10.172.124 +add test 10.10.172.125 +add test 10.10.172.126 +add test 10.10.172.127 +add test 10.10.172.128 +add test 10.10.172.129 +add test 10.10.172.13 +add test 10.10.172.130 +add test 10.10.172.131 +add test 10.10.172.132 +add test 10.10.172.133 +add test 10.10.172.134 +add test 10.10.172.135 +add test 10.10.172.136 +add test 10.10.172.137 +add test 10.10.172.138 +add test 10.10.172.139 +add test 10.10.172.14 +add test 10.10.172.140 +add test 10.10.172.141 +add test 10.10.172.142 +add test 10.10.172.143 +add test 10.10.172.144 +add test 10.10.172.145 +add test 10.10.172.146 +add test 10.10.172.147 +add test 10.10.172.148 +add test 10.10.172.149 +add test 10.10.172.15 +add test 10.10.172.150 +add test 10.10.172.151 +add test 10.10.172.152 +add test 10.10.172.153 +add test 10.10.172.154 +add test 10.10.172.155 +add test 10.10.172.156 +add test 10.10.172.157 +add test 10.10.172.158 +add test 10.10.172.159 +add test 10.10.172.16 +add test 10.10.172.160 +add test 10.10.172.161 +add test 10.10.172.162 +add test 10.10.172.163 +add test 10.10.172.164 +add test 10.10.172.165 +add test 10.10.172.166 +add test 10.10.172.167 +add test 10.10.172.168 +add test 10.10.172.169 +add test 10.10.172.17 +add test 10.10.172.170 +add test 10.10.172.171 +add test 10.10.172.172 +add test 10.10.172.173 +add test 10.10.172.174 +add test 10.10.172.175 +add test 10.10.172.176 +add test 10.10.172.177 +add test 10.10.172.178 +add test 10.10.172.179 +add test 10.10.172.18 +add test 10.10.172.180 +add test 10.10.172.181 +add test 10.10.172.182 +add test 10.10.172.183 +add test 10.10.172.184 +add test 10.10.172.185 +add test 10.10.172.186 +add test 10.10.172.187 +add test 10.10.172.188 +add test 10.10.172.189 +add test 10.10.172.19 +add test 10.10.172.190 +add test 10.10.172.191 +add test 10.10.172.192 +add test 10.10.172.193 +add test 10.10.172.194 +add test 10.10.172.195 +add test 10.10.172.196 +add test 10.10.172.197 +add test 10.10.172.198 +add test 10.10.172.199 +add test 10.10.172.2 +add test 10.10.172.20 +add test 10.10.172.200 +add test 10.10.172.201 +add test 10.10.172.202 +add test 10.10.172.203 +add test 10.10.172.204 +add test 10.10.172.205 +add test 10.10.172.206 +add test 10.10.172.207 +add test 10.10.172.208 +add test 10.10.172.209 +add test 10.10.172.21 +add test 10.10.172.210 +add test 10.10.172.211 +add test 10.10.172.212 +add test 10.10.172.213 +add test 10.10.172.214 +add test 10.10.172.215 +add test 10.10.172.216 +add test 10.10.172.217 +add test 10.10.172.218 +add test 10.10.172.219 +add test 10.10.172.22 +add test 10.10.172.220 +add test 10.10.172.221 +add test 10.10.172.222 +add test 10.10.172.223 +add test 10.10.172.224 +add test 10.10.172.225 +add test 10.10.172.226 +add test 10.10.172.227 +add test 10.10.172.228 +add test 10.10.172.229 +add test 10.10.172.23 +add test 10.10.172.230 +add test 10.10.172.231 +add test 10.10.172.232 +add test 10.10.172.233 +add test 10.10.172.234 +add test 10.10.172.235 +add test 10.10.172.236 +add test 10.10.172.237 +add test 10.10.172.238 +add test 10.10.172.239 +add test 10.10.172.24 +add test 10.10.172.240 +add test 10.10.172.241 +add test 10.10.172.242 +add test 10.10.172.243 +add test 10.10.172.244 +add test 10.10.172.245 +add test 10.10.172.246 +add test 10.10.172.247 +add test 10.10.172.248 +add test 10.10.172.249 +add test 10.10.172.25 +add test 10.10.172.250 +add test 10.10.172.251 +add test 10.10.172.252 +add test 10.10.172.253 +add test 10.10.172.254 +add test 10.10.172.255 +add test 10.10.172.26 +add test 10.10.172.27 +add test 10.10.172.28 +add test 10.10.172.29 +add test 10.10.172.3 +add test 10.10.172.30 +add test 10.10.172.31 +add test 10.10.172.32 +add test 10.10.172.33 +add test 10.10.172.34 +add test 10.10.172.35 +add test 10.10.172.36 +add test 10.10.172.37 +add test 10.10.172.38 +add test 10.10.172.39 +add test 10.10.172.4 +add test 10.10.172.40 +add test 10.10.172.41 +add test 10.10.172.42 +add test 10.10.172.43 +add test 10.10.172.44 +add test 10.10.172.45 +add test 10.10.172.46 +add test 10.10.172.47 +add test 10.10.172.48 +add test 10.10.172.49 +add test 10.10.172.5 +add test 10.10.172.50 +add test 10.10.172.51 +add test 10.10.172.52 +add test 10.10.172.53 +add test 10.10.172.54 +add test 10.10.172.55 +add test 10.10.172.56 +add test 10.10.172.57 +add test 10.10.172.58 +add test 10.10.172.59 +add test 10.10.172.6 +add test 10.10.172.60 +add test 10.10.172.61 +add test 10.10.172.62 +add test 10.10.172.63 +add test 10.10.172.64 +add test 10.10.172.65 +add test 10.10.172.66 +add test 10.10.172.67 +add test 10.10.172.68 +add test 10.10.172.69 +add test 10.10.172.7 +add test 10.10.172.70 +add test 10.10.172.71 +add test 10.10.172.72 +add test 10.10.172.73 +add test 10.10.172.74 +add test 10.10.172.75 +add test 10.10.172.76 +add test 10.10.172.77 +add test 10.10.172.78 +add test 10.10.172.79 +add test 10.10.172.8 +add test 10.10.172.80 +add test 10.10.172.81 +add test 10.10.172.82 +add test 10.10.172.83 +add test 10.10.172.84 +add test 10.10.172.85 +add test 10.10.172.86 +add test 10.10.172.87 +add test 10.10.172.88 +add test 10.10.172.89 +add test 10.10.172.9 +add test 10.10.172.90 +add test 10.10.172.91 +add test 10.10.172.92 +add test 10.10.172.93 +add test 10.10.172.94 +add test 10.10.172.95 +add test 10.10.172.96 +add test 10.10.172.97 +add test 10.10.172.98 +add test 10.10.172.99 +add test 10.10.173.0 +add test 10.10.173.1 +add test 10.10.173.10 +add test 10.10.173.100 +add test 10.10.173.101 +add test 10.10.173.102 +add test 10.10.173.103 +add test 10.10.173.104 +add test 10.10.173.105 +add test 10.10.173.106 +add test 10.10.173.107 +add test 10.10.173.108 +add test 10.10.173.109 +add test 10.10.173.11 +add test 10.10.173.110 +add test 10.10.173.111 +add test 10.10.173.112 +add test 10.10.173.113 +add test 10.10.173.114 +add test 10.10.173.115 +add test 10.10.173.116 +add test 10.10.173.117 +add test 10.10.173.118 +add test 10.10.173.119 +add test 10.10.173.12 +add test 10.10.173.120 +add test 10.10.173.121 +add test 10.10.173.122 +add test 10.10.173.123 +add test 10.10.173.124 +add test 10.10.173.125 +add test 10.10.173.126 +add test 10.10.173.127 +add test 10.10.173.128 +add test 10.10.173.129 +add test 10.10.173.13 +add test 10.10.173.130 +add test 10.10.173.131 +add test 10.10.173.132 +add test 10.10.173.133 +add test 10.10.173.134 +add test 10.10.173.135 +add test 10.10.173.136 +add test 10.10.173.137 +add test 10.10.173.138 +add test 10.10.173.139 +add test 10.10.173.14 +add test 10.10.173.140 +add test 10.10.173.141 +add test 10.10.173.142 +add test 10.10.173.143 +add test 10.10.173.144 +add test 10.10.173.145 +add test 10.10.173.146 +add test 10.10.173.147 +add test 10.10.173.148 +add test 10.10.173.149 +add test 10.10.173.15 +add test 10.10.173.150 +add test 10.10.173.151 +add test 10.10.173.152 +add test 10.10.173.153 +add test 10.10.173.154 +add test 10.10.173.155 +add test 10.10.173.156 +add test 10.10.173.157 +add test 10.10.173.158 +add test 10.10.173.159 +add test 10.10.173.16 +add test 10.10.173.160 +add test 10.10.173.161 +add test 10.10.173.162 +add test 10.10.173.163 +add test 10.10.173.164 +add test 10.10.173.165 +add test 10.10.173.166 +add test 10.10.173.167 +add test 10.10.173.168 +add test 10.10.173.169 +add test 10.10.173.17 +add test 10.10.173.170 +add test 10.10.173.171 +add test 10.10.173.172 +add test 10.10.173.173 +add test 10.10.173.174 +add test 10.10.173.175 +add test 10.10.173.176 +add test 10.10.173.177 +add test 10.10.173.178 +add test 10.10.173.179 +add test 10.10.173.18 +add test 10.10.173.180 +add test 10.10.173.181 +add test 10.10.173.182 +add test 10.10.173.183 +add test 10.10.173.184 +add test 10.10.173.185 +add test 10.10.173.186 +add test 10.10.173.187 +add test 10.10.173.188 +add test 10.10.173.189 +add test 10.10.173.19 +add test 10.10.173.190 +add test 10.10.173.191 +add test 10.10.173.192 +add test 10.10.173.193 +add test 10.10.173.194 +add test 10.10.173.195 +add test 10.10.173.196 +add test 10.10.173.197 +add test 10.10.173.198 +add test 10.10.173.199 +add test 10.10.173.2 +add test 10.10.173.20 +add test 10.10.173.200 +add test 10.10.173.201 +add test 10.10.173.202 +add test 10.10.173.203 +add test 10.10.173.204 +add test 10.10.173.205 +add test 10.10.173.206 +add test 10.10.173.207 +add test 10.10.173.208 +add test 10.10.173.209 +add test 10.10.173.21 +add test 10.10.173.210 +add test 10.10.173.211 +add test 10.10.173.212 +add test 10.10.173.213 +add test 10.10.173.214 +add test 10.10.173.215 +add test 10.10.173.216 +add test 10.10.173.217 +add test 10.10.173.218 +add test 10.10.173.219 +add test 10.10.173.22 +add test 10.10.173.220 +add test 10.10.173.221 +add test 10.10.173.222 +add test 10.10.173.223 +add test 10.10.173.224 +add test 10.10.173.225 +add test 10.10.173.226 +add test 10.10.173.227 +add test 10.10.173.228 +add test 10.10.173.229 +add test 10.10.173.23 +add test 10.10.173.230 +add test 10.10.173.231 +add test 10.10.173.232 +add test 10.10.173.233 +add test 10.10.173.234 +add test 10.10.173.235 +add test 10.10.173.236 +add test 10.10.173.237 +add test 10.10.173.238 +add test 10.10.173.239 +add test 10.10.173.24 +add test 10.10.173.240 +add test 10.10.173.241 +add test 10.10.173.242 +add test 10.10.173.243 +add test 10.10.173.244 +add test 10.10.173.245 +add test 10.10.173.246 +add test 10.10.173.247 +add test 10.10.173.248 +add test 10.10.173.249 +add test 10.10.173.25 +add test 10.10.173.250 +add test 10.10.173.251 +add test 10.10.173.252 +add test 10.10.173.253 +add test 10.10.173.254 +add test 10.10.173.255 +add test 10.10.173.26 +add test 10.10.173.27 +add test 10.10.173.28 +add test 10.10.173.29 +add test 10.10.173.3 +add test 10.10.173.30 +add test 10.10.173.31 +add test 10.10.173.32 +add test 10.10.173.33 +add test 10.10.173.34 +add test 10.10.173.35 +add test 10.10.173.36 +add test 10.10.173.37 +add test 10.10.173.38 +add test 10.10.173.39 +add test 10.10.173.4 +add test 10.10.173.40 +add test 10.10.173.41 +add test 10.10.173.42 +add test 10.10.173.43 +add test 10.10.173.44 +add test 10.10.173.45 +add test 10.10.173.46 +add test 10.10.173.47 +add test 10.10.173.48 +add test 10.10.173.49 +add test 10.10.173.5 +add test 10.10.173.50 +add test 10.10.173.51 +add test 10.10.173.52 +add test 10.10.173.53 +add test 10.10.173.54 +add test 10.10.173.55 +add test 10.10.173.56 +add test 10.10.173.57 +add test 10.10.173.58 +add test 10.10.173.59 +add test 10.10.173.6 +add test 10.10.173.60 +add test 10.10.173.61 +add test 10.10.173.62 +add test 10.10.173.63 +add test 10.10.173.64 +add test 10.10.173.65 +add test 10.10.173.66 +add test 10.10.173.67 +add test 10.10.173.68 +add test 10.10.173.69 +add test 10.10.173.7 +add test 10.10.173.70 +add test 10.10.173.71 +add test 10.10.173.72 +add test 10.10.173.73 +add test 10.10.173.74 +add test 10.10.173.75 +add test 10.10.173.76 +add test 10.10.173.77 +add test 10.10.173.78 +add test 10.10.173.79 +add test 10.10.173.8 +add test 10.10.173.80 +add test 10.10.173.81 +add test 10.10.173.82 +add test 10.10.173.83 +add test 10.10.173.84 +add test 10.10.173.85 +add test 10.10.173.86 +add test 10.10.173.87 +add test 10.10.173.88 +add test 10.10.173.89 +add test 10.10.173.9 +add test 10.10.173.90 +add test 10.10.173.91 +add test 10.10.173.92 +add test 10.10.173.93 +add test 10.10.173.94 +add test 10.10.173.95 +add test 10.10.173.96 +add test 10.10.173.97 +add test 10.10.173.98 +add test 10.10.173.99 +add test 10.10.174.0 +add test 10.10.174.1 +add test 10.10.174.10 +add test 10.10.174.100 +add test 10.10.174.101 +add test 10.10.174.102 +add test 10.10.174.103 +add test 10.10.174.104 +add test 10.10.174.105 +add test 10.10.174.106 +add test 10.10.174.107 +add test 10.10.174.108 +add test 10.10.174.109 +add test 10.10.174.11 +add test 10.10.174.110 +add test 10.10.174.111 +add test 10.10.174.112 +add test 10.10.174.113 +add test 10.10.174.114 +add test 10.10.174.115 +add test 10.10.174.116 +add test 10.10.174.117 +add test 10.10.174.118 +add test 10.10.174.119 +add test 10.10.174.12 +add test 10.10.174.120 +add test 10.10.174.121 +add test 10.10.174.122 +add test 10.10.174.123 +add test 10.10.174.124 +add test 10.10.174.125 +add test 10.10.174.126 +add test 10.10.174.127 +add test 10.10.174.128 +add test 10.10.174.129 +add test 10.10.174.13 +add test 10.10.174.130 +add test 10.10.174.131 +add test 10.10.174.132 +add test 10.10.174.133 +add test 10.10.174.134 +add test 10.10.174.135 +add test 10.10.174.136 +add test 10.10.174.137 +add test 10.10.174.138 +add test 10.10.174.139 +add test 10.10.174.14 +add test 10.10.174.140 +add test 10.10.174.141 +add test 10.10.174.142 +add test 10.10.174.143 +add test 10.10.174.144 +add test 10.10.174.145 +add test 10.10.174.146 +add test 10.10.174.147 +add test 10.10.174.148 +add test 10.10.174.149 +add test 10.10.174.15 +add test 10.10.174.150 +add test 10.10.174.151 +add test 10.10.174.152 +add test 10.10.174.153 +add test 10.10.174.154 +add test 10.10.174.155 +add test 10.10.174.156 +add test 10.10.174.157 +add test 10.10.174.158 +add test 10.10.174.159 +add test 10.10.174.16 +add test 10.10.174.160 +add test 10.10.174.161 +add test 10.10.174.162 +add test 10.10.174.163 +add test 10.10.174.164 +add test 10.10.174.165 +add test 10.10.174.166 +add test 10.10.174.167 +add test 10.10.174.168 +add test 10.10.174.169 +add test 10.10.174.17 +add test 10.10.174.170 +add test 10.10.174.171 +add test 10.10.174.172 +add test 10.10.174.173 +add test 10.10.174.174 +add test 10.10.174.175 +add test 10.10.174.176 +add test 10.10.174.177 +add test 10.10.174.178 +add test 10.10.174.179 +add test 10.10.174.18 +add test 10.10.174.180 +add test 10.10.174.181 +add test 10.10.174.182 +add test 10.10.174.183 +add test 10.10.174.184 +add test 10.10.174.185 +add test 10.10.174.186 +add test 10.10.174.187 +add test 10.10.174.188 +add test 10.10.174.189 +add test 10.10.174.19 +add test 10.10.174.190 +add test 10.10.174.191 +add test 10.10.174.192 +add test 10.10.174.193 +add test 10.10.174.194 +add test 10.10.174.195 +add test 10.10.174.196 +add test 10.10.174.197 +add test 10.10.174.198 +add test 10.10.174.199 +add test 10.10.174.2 +add test 10.10.174.20 +add test 10.10.174.200 +add test 10.10.174.201 +add test 10.10.174.202 +add test 10.10.174.203 +add test 10.10.174.204 +add test 10.10.174.205 +add test 10.10.174.206 +add test 10.10.174.207 +add test 10.10.174.208 +add test 10.10.174.209 +add test 10.10.174.21 +add test 10.10.174.210 +add test 10.10.174.211 +add test 10.10.174.212 +add test 10.10.174.213 +add test 10.10.174.214 +add test 10.10.174.215 +add test 10.10.174.216 +add test 10.10.174.217 +add test 10.10.174.218 +add test 10.10.174.219 +add test 10.10.174.22 +add test 10.10.174.220 +add test 10.10.174.221 +add test 10.10.174.222 +add test 10.10.174.223 +add test 10.10.174.224 +add test 10.10.174.225 +add test 10.10.174.226 +add test 10.10.174.227 +add test 10.10.174.228 +add test 10.10.174.229 +add test 10.10.174.23 +add test 10.10.174.230 +add test 10.10.174.231 +add test 10.10.174.232 +add test 10.10.174.233 +add test 10.10.174.234 +add test 10.10.174.235 +add test 10.10.174.236 +add test 10.10.174.237 +add test 10.10.174.238 +add test 10.10.174.239 +add test 10.10.174.24 +add test 10.10.174.240 +add test 10.10.174.241 +add test 10.10.174.242 +add test 10.10.174.243 +add test 10.10.174.244 +add test 10.10.174.245 +add test 10.10.174.246 +add test 10.10.174.247 +add test 10.10.174.248 +add test 10.10.174.249 +add test 10.10.174.25 +add test 10.10.174.250 +add test 10.10.174.251 +add test 10.10.174.252 +add test 10.10.174.253 +add test 10.10.174.254 +add test 10.10.174.255 +add test 10.10.174.26 +add test 10.10.174.27 +add test 10.10.174.28 +add test 10.10.174.29 +add test 10.10.174.3 +add test 10.10.174.30 +add test 10.10.174.31 +add test 10.10.174.32 +add test 10.10.174.33 +add test 10.10.174.34 +add test 10.10.174.35 +add test 10.10.174.36 +add test 10.10.174.37 +add test 10.10.174.38 +add test 10.10.174.39 +add test 10.10.174.4 +add test 10.10.174.40 +add test 10.10.174.41 +add test 10.10.174.42 +add test 10.10.174.43 +add test 10.10.174.44 +add test 10.10.174.45 +add test 10.10.174.46 +add test 10.10.174.47 +add test 10.10.174.48 +add test 10.10.174.49 +add test 10.10.174.5 +add test 10.10.174.50 +add test 10.10.174.51 +add test 10.10.174.52 +add test 10.10.174.53 +add test 10.10.174.54 +add test 10.10.174.55 +add test 10.10.174.56 +add test 10.10.174.57 +add test 10.10.174.58 +add test 10.10.174.59 +add test 10.10.174.6 +add test 10.10.174.60 +add test 10.10.174.61 +add test 10.10.174.62 +add test 10.10.174.63 +add test 10.10.174.64 +add test 10.10.174.65 +add test 10.10.174.66 +add test 10.10.174.67 +add test 10.10.174.68 +add test 10.10.174.69 +add test 10.10.174.7 +add test 10.10.174.70 +add test 10.10.174.71 +add test 10.10.174.72 +add test 10.10.174.73 +add test 10.10.174.74 +add test 10.10.174.75 +add test 10.10.174.76 +add test 10.10.174.77 +add test 10.10.174.78 +add test 10.10.174.79 +add test 10.10.174.8 +add test 10.10.174.80 +add test 10.10.174.81 +add test 10.10.174.82 +add test 10.10.174.83 +add test 10.10.174.84 +add test 10.10.174.85 +add test 10.10.174.86 +add test 10.10.174.87 +add test 10.10.174.88 +add test 10.10.174.89 +add test 10.10.174.9 +add test 10.10.174.90 +add test 10.10.174.91 +add test 10.10.174.92 +add test 10.10.174.93 +add test 10.10.174.94 +add test 10.10.174.95 +add test 10.10.174.96 +add test 10.10.174.97 +add test 10.10.174.98 +add test 10.10.174.99 +add test 10.10.175.0 +add test 10.10.175.1 +add test 10.10.175.10 +add test 10.10.175.100 +add test 10.10.175.101 +add test 10.10.175.102 +add test 10.10.175.103 +add test 10.10.175.104 +add test 10.10.175.105 +add test 10.10.175.106 +add test 10.10.175.107 +add test 10.10.175.108 +add test 10.10.175.109 +add test 10.10.175.11 +add test 10.10.175.110 +add test 10.10.175.111 +add test 10.10.175.112 +add test 10.10.175.113 +add test 10.10.175.114 +add test 10.10.175.115 +add test 10.10.175.116 +add test 10.10.175.117 +add test 10.10.175.118 +add test 10.10.175.119 +add test 10.10.175.12 +add test 10.10.175.120 +add test 10.10.175.121 +add test 10.10.175.122 +add test 10.10.175.123 +add test 10.10.175.124 +add test 10.10.175.125 +add test 10.10.175.126 +add test 10.10.175.127 +add test 10.10.175.128 +add test 10.10.175.129 +add test 10.10.175.13 +add test 10.10.175.130 +add test 10.10.175.131 +add test 10.10.175.132 +add test 10.10.175.133 +add test 10.10.175.134 +add test 10.10.175.135 +add test 10.10.175.136 +add test 10.10.175.137 +add test 10.10.175.138 +add test 10.10.175.139 +add test 10.10.175.14 +add test 10.10.175.140 +add test 10.10.175.141 +add test 10.10.175.142 +add test 10.10.175.143 +add test 10.10.175.144 +add test 10.10.175.145 +add test 10.10.175.146 +add test 10.10.175.147 +add test 10.10.175.148 +add test 10.10.175.149 +add test 10.10.175.15 +add test 10.10.175.150 +add test 10.10.175.151 +add test 10.10.175.152 +add test 10.10.175.153 +add test 10.10.175.154 +add test 10.10.175.155 +add test 10.10.175.156 +add test 10.10.175.157 +add test 10.10.175.158 +add test 10.10.175.159 +add test 10.10.175.16 +add test 10.10.175.160 +add test 10.10.175.161 +add test 10.10.175.162 +add test 10.10.175.163 +add test 10.10.175.164 +add test 10.10.175.165 +add test 10.10.175.166 +add test 10.10.175.167 +add test 10.10.175.168 +add test 10.10.175.169 +add test 10.10.175.17 +add test 10.10.175.170 +add test 10.10.175.171 +add test 10.10.175.172 +add test 10.10.175.173 +add test 10.10.175.174 +add test 10.10.175.175 +add test 10.10.175.176 +add test 10.10.175.177 +add test 10.10.175.178 +add test 10.10.175.179 +add test 10.10.175.18 +add test 10.10.175.180 +add test 10.10.175.181 +add test 10.10.175.182 +add test 10.10.175.183 +add test 10.10.175.184 +add test 10.10.175.185 +add test 10.10.175.186 +add test 10.10.175.187 +add test 10.10.175.188 +add test 10.10.175.189 +add test 10.10.175.19 +add test 10.10.175.190 +add test 10.10.175.191 +add test 10.10.175.192 +add test 10.10.175.193 +add test 10.10.175.194 +add test 10.10.175.195 +add test 10.10.175.196 +add test 10.10.175.197 +add test 10.10.175.198 +add test 10.10.175.199 +add test 10.10.175.2 +add test 10.10.175.20 +add test 10.10.175.200 +add test 10.10.175.201 +add test 10.10.175.202 +add test 10.10.175.203 +add test 10.10.175.204 +add test 10.10.175.205 +add test 10.10.175.206 +add test 10.10.175.207 +add test 10.10.175.208 +add test 10.10.175.209 +add test 10.10.175.21 +add test 10.10.175.210 +add test 10.10.175.211 +add test 10.10.175.212 +add test 10.10.175.213 +add test 10.10.175.214 +add test 10.10.175.215 +add test 10.10.175.216 +add test 10.10.175.217 +add test 10.10.175.218 +add test 10.10.175.219 +add test 10.10.175.22 +add test 10.10.175.220 +add test 10.10.175.221 +add test 10.10.175.222 +add test 10.10.175.223 +add test 10.10.175.224 +add test 10.10.175.225 +add test 10.10.175.226 +add test 10.10.175.227 +add test 10.10.175.228 +add test 10.10.175.229 +add test 10.10.175.23 +add test 10.10.175.230 +add test 10.10.175.231 +add test 10.10.175.232 +add test 10.10.175.233 +add test 10.10.175.234 +add test 10.10.175.235 +add test 10.10.175.236 +add test 10.10.175.237 +add test 10.10.175.238 +add test 10.10.175.239 +add test 10.10.175.24 +add test 10.10.175.240 +add test 10.10.175.241 +add test 10.10.175.242 +add test 10.10.175.243 +add test 10.10.175.244 +add test 10.10.175.245 +add test 10.10.175.246 +add test 10.10.175.247 +add test 10.10.175.248 +add test 10.10.175.249 +add test 10.10.175.25 +add test 10.10.175.250 +add test 10.10.175.251 +add test 10.10.175.252 +add test 10.10.175.253 +add test 10.10.175.254 +add test 10.10.175.255 +add test 10.10.175.26 +add test 10.10.175.27 +add test 10.10.175.28 +add test 10.10.175.29 +add test 10.10.175.3 +add test 10.10.175.30 +add test 10.10.175.31 +add test 10.10.175.32 +add test 10.10.175.33 +add test 10.10.175.34 +add test 10.10.175.35 +add test 10.10.175.36 +add test 10.10.175.37 +add test 10.10.175.38 +add test 10.10.175.39 +add test 10.10.175.4 +add test 10.10.175.40 +add test 10.10.175.41 +add test 10.10.175.42 +add test 10.10.175.43 +add test 10.10.175.44 +add test 10.10.175.45 +add test 10.10.175.46 +add test 10.10.175.47 +add test 10.10.175.48 +add test 10.10.175.49 +add test 10.10.175.5 +add test 10.10.175.50 +add test 10.10.175.51 +add test 10.10.175.52 +add test 10.10.175.53 +add test 10.10.175.54 +add test 10.10.175.55 +add test 10.10.175.56 +add test 10.10.175.57 +add test 10.10.175.58 +add test 10.10.175.59 +add test 10.10.175.6 +add test 10.10.175.60 +add test 10.10.175.61 +add test 10.10.175.62 +add test 10.10.175.63 +add test 10.10.175.64 +add test 10.10.175.65 +add test 10.10.175.66 +add test 10.10.175.67 +add test 10.10.175.68 +add test 10.10.175.69 +add test 10.10.175.7 +add test 10.10.175.70 +add test 10.10.175.71 +add test 10.10.175.72 +add test 10.10.175.73 +add test 10.10.175.74 +add test 10.10.175.75 +add test 10.10.175.76 +add test 10.10.175.77 +add test 10.10.175.78 +add test 10.10.175.79 +add test 10.10.175.8 +add test 10.10.175.80 +add test 10.10.175.81 +add test 10.10.175.82 +add test 10.10.175.83 +add test 10.10.175.84 +add test 10.10.175.85 +add test 10.10.175.86 +add test 10.10.175.87 +add test 10.10.175.88 +add test 10.10.175.89 +add test 10.10.175.9 +add test 10.10.175.90 +add test 10.10.175.91 +add test 10.10.175.92 +add test 10.10.175.93 +add test 10.10.175.94 +add test 10.10.175.95 +add test 10.10.175.96 +add test 10.10.175.97 +add test 10.10.175.98 +add test 10.10.175.99 +add test 10.10.176.0 +add test 10.10.176.1 +add test 10.10.176.10 +add test 10.10.176.100 +add test 10.10.176.101 +add test 10.10.176.102 +add test 10.10.176.103 +add test 10.10.176.104 +add test 10.10.176.105 +add test 10.10.176.106 +add test 10.10.176.107 +add test 10.10.176.108 +add test 10.10.176.109 +add test 10.10.176.11 +add test 10.10.176.110 +add test 10.10.176.111 +add test 10.10.176.112 +add test 10.10.176.113 +add test 10.10.176.114 +add test 10.10.176.115 +add test 10.10.176.116 +add test 10.10.176.117 +add test 10.10.176.118 +add test 10.10.176.119 +add test 10.10.176.12 +add test 10.10.176.120 +add test 10.10.176.121 +add test 10.10.176.122 +add test 10.10.176.123 +add test 10.10.176.124 +add test 10.10.176.125 +add test 10.10.176.126 +add test 10.10.176.127 +add test 10.10.176.128 +add test 10.10.176.129 +add test 10.10.176.13 +add test 10.10.176.130 +add test 10.10.176.131 +add test 10.10.176.132 +add test 10.10.176.133 +add test 10.10.176.134 +add test 10.10.176.135 +add test 10.10.176.136 +add test 10.10.176.137 +add test 10.10.176.138 +add test 10.10.176.139 +add test 10.10.176.14 +add test 10.10.176.140 +add test 10.10.176.141 +add test 10.10.176.142 +add test 10.10.176.143 +add test 10.10.176.144 +add test 10.10.176.145 +add test 10.10.176.146 +add test 10.10.176.147 +add test 10.10.176.148 +add test 10.10.176.149 +add test 10.10.176.15 +add test 10.10.176.150 +add test 10.10.176.151 +add test 10.10.176.152 +add test 10.10.176.153 +add test 10.10.176.154 +add test 10.10.176.155 +add test 10.10.176.156 +add test 10.10.176.157 +add test 10.10.176.158 +add test 10.10.176.159 +add test 10.10.176.16 +add test 10.10.176.160 +add test 10.10.176.161 +add test 10.10.176.162 +add test 10.10.176.163 +add test 10.10.176.164 +add test 10.10.176.165 +add test 10.10.176.166 +add test 10.10.176.167 +add test 10.10.176.168 +add test 10.10.176.169 +add test 10.10.176.17 +add test 10.10.176.170 +add test 10.10.176.171 +add test 10.10.176.172 +add test 10.10.176.173 +add test 10.10.176.174 +add test 10.10.176.175 +add test 10.10.176.176 +add test 10.10.176.177 +add test 10.10.176.178 +add test 10.10.176.179 +add test 10.10.176.18 +add test 10.10.176.180 +add test 10.10.176.181 +add test 10.10.176.182 +add test 10.10.176.183 +add test 10.10.176.184 +add test 10.10.176.185 +add test 10.10.176.186 +add test 10.10.176.187 +add test 10.10.176.188 +add test 10.10.176.189 +add test 10.10.176.19 +add test 10.10.176.190 +add test 10.10.176.191 +add test 10.10.176.192 +add test 10.10.176.193 +add test 10.10.176.194 +add test 10.10.176.195 +add test 10.10.176.196 +add test 10.10.176.197 +add test 10.10.176.198 +add test 10.10.176.199 +add test 10.10.176.2 +add test 10.10.176.20 +add test 10.10.176.200 +add test 10.10.176.201 +add test 10.10.176.202 +add test 10.10.176.203 +add test 10.10.176.204 +add test 10.10.176.205 +add test 10.10.176.206 +add test 10.10.176.207 +add test 10.10.176.208 +add test 10.10.176.209 +add test 10.10.176.21 +add test 10.10.176.210 +add test 10.10.176.211 +add test 10.10.176.212 +add test 10.10.176.213 +add test 10.10.176.214 +add test 10.10.176.215 +add test 10.10.176.216 +add test 10.10.176.217 +add test 10.10.176.218 +add test 10.10.176.219 +add test 10.10.176.22 +add test 10.10.176.220 +add test 10.10.176.221 +add test 10.10.176.222 +add test 10.10.176.223 +add test 10.10.176.224 +add test 10.10.176.225 +add test 10.10.176.226 +add test 10.10.176.227 +add test 10.10.176.228 +add test 10.10.176.229 +add test 10.10.176.23 +add test 10.10.176.230 +add test 10.10.176.231 +add test 10.10.176.232 +add test 10.10.176.233 +add test 10.10.176.234 +add test 10.10.176.235 +add test 10.10.176.236 +add test 10.10.176.237 +add test 10.10.176.238 +add test 10.10.176.239 +add test 10.10.176.24 +add test 10.10.176.240 +add test 10.10.176.241 +add test 10.10.176.242 +add test 10.10.176.243 +add test 10.10.176.244 +add test 10.10.176.245 +add test 10.10.176.246 +add test 10.10.176.247 +add test 10.10.176.248 +add test 10.10.176.249 +add test 10.10.176.25 +add test 10.10.176.250 +add test 10.10.176.251 +add test 10.10.176.252 +add test 10.10.176.253 +add test 10.10.176.254 +add test 10.10.176.255 +add test 10.10.176.26 +add test 10.10.176.27 +add test 10.10.176.28 +add test 10.10.176.29 +add test 10.10.176.3 +add test 10.10.176.30 +add test 10.10.176.31 +add test 10.10.176.32 +add test 10.10.176.33 +add test 10.10.176.34 +add test 10.10.176.35 +add test 10.10.176.36 +add test 10.10.176.37 +add test 10.10.176.38 +add test 10.10.176.39 +add test 10.10.176.4 +add test 10.10.176.40 +add test 10.10.176.41 +add test 10.10.176.42 +add test 10.10.176.43 +add test 10.10.176.44 +add test 10.10.176.45 +add test 10.10.176.46 +add test 10.10.176.47 +add test 10.10.176.48 +add test 10.10.176.49 +add test 10.10.176.5 +add test 10.10.176.50 +add test 10.10.176.51 +add test 10.10.176.52 +add test 10.10.176.53 +add test 10.10.176.54 +add test 10.10.176.55 +add test 10.10.176.56 +add test 10.10.176.57 +add test 10.10.176.58 +add test 10.10.176.59 +add test 10.10.176.6 +add test 10.10.176.60 +add test 10.10.176.61 +add test 10.10.176.62 +add test 10.10.176.63 +add test 10.10.176.64 +add test 10.10.176.65 +add test 10.10.176.66 +add test 10.10.176.67 +add test 10.10.176.68 +add test 10.10.176.69 +add test 10.10.176.7 +add test 10.10.176.70 +add test 10.10.176.71 +add test 10.10.176.72 +add test 10.10.176.73 +add test 10.10.176.74 +add test 10.10.176.75 +add test 10.10.176.76 +add test 10.10.176.77 +add test 10.10.176.78 +add test 10.10.176.79 +add test 10.10.176.8 +add test 10.10.176.80 +add test 10.10.176.81 +add test 10.10.176.82 +add test 10.10.176.83 +add test 10.10.176.84 +add test 10.10.176.85 +add test 10.10.176.86 +add test 10.10.176.87 +add test 10.10.176.88 +add test 10.10.176.89 +add test 10.10.176.9 +add test 10.10.176.90 +add test 10.10.176.91 +add test 10.10.176.92 +add test 10.10.176.93 +add test 10.10.176.94 +add test 10.10.176.95 +add test 10.10.176.96 +add test 10.10.176.97 +add test 10.10.176.98 +add test 10.10.176.99 +add test 10.10.177.0 +add test 10.10.177.1 +add test 10.10.177.10 +add test 10.10.177.100 +add test 10.10.177.101 +add test 10.10.177.102 +add test 10.10.177.103 +add test 10.10.177.104 +add test 10.10.177.105 +add test 10.10.177.106 +add test 10.10.177.107 +add test 10.10.177.108 +add test 10.10.177.109 +add test 10.10.177.11 +add test 10.10.177.110 +add test 10.10.177.111 +add test 10.10.177.112 +add test 10.10.177.113 +add test 10.10.177.114 +add test 10.10.177.115 +add test 10.10.177.116 +add test 10.10.177.117 +add test 10.10.177.118 +add test 10.10.177.119 +add test 10.10.177.12 +add test 10.10.177.120 +add test 10.10.177.121 +add test 10.10.177.122 +add test 10.10.177.123 +add test 10.10.177.124 +add test 10.10.177.125 +add test 10.10.177.126 +add test 10.10.177.127 +add test 10.10.177.128 +add test 10.10.177.129 +add test 10.10.177.13 +add test 10.10.177.130 +add test 10.10.177.131 +add test 10.10.177.132 +add test 10.10.177.133 +add test 10.10.177.134 +add test 10.10.177.135 +add test 10.10.177.136 +add test 10.10.177.137 +add test 10.10.177.138 +add test 10.10.177.139 +add test 10.10.177.14 +add test 10.10.177.140 +add test 10.10.177.141 +add test 10.10.177.142 +add test 10.10.177.143 +add test 10.10.177.144 +add test 10.10.177.145 +add test 10.10.177.146 +add test 10.10.177.147 +add test 10.10.177.148 +add test 10.10.177.149 +add test 10.10.177.15 +add test 10.10.177.150 +add test 10.10.177.151 +add test 10.10.177.152 +add test 10.10.177.153 +add test 10.10.177.154 +add test 10.10.177.155 +add test 10.10.177.156 +add test 10.10.177.157 +add test 10.10.177.158 +add test 10.10.177.159 +add test 10.10.177.16 +add test 10.10.177.160 +add test 10.10.177.161 +add test 10.10.177.162 +add test 10.10.177.163 +add test 10.10.177.164 +add test 10.10.177.165 +add test 10.10.177.166 +add test 10.10.177.167 +add test 10.10.177.168 +add test 10.10.177.169 +add test 10.10.177.17 +add test 10.10.177.170 +add test 10.10.177.171 +add test 10.10.177.172 +add test 10.10.177.173 +add test 10.10.177.174 +add test 10.10.177.175 +add test 10.10.177.176 +add test 10.10.177.177 +add test 10.10.177.178 +add test 10.10.177.179 +add test 10.10.177.18 +add test 10.10.177.180 +add test 10.10.177.181 +add test 10.10.177.182 +add test 10.10.177.183 +add test 10.10.177.184 +add test 10.10.177.185 +add test 10.10.177.186 +add test 10.10.177.187 +add test 10.10.177.188 +add test 10.10.177.189 +add test 10.10.177.19 +add test 10.10.177.190 +add test 10.10.177.191 +add test 10.10.177.192 +add test 10.10.177.193 +add test 10.10.177.194 +add test 10.10.177.195 +add test 10.10.177.196 +add test 10.10.177.197 +add test 10.10.177.198 +add test 10.10.177.199 +add test 10.10.177.2 +add test 10.10.177.20 +add test 10.10.177.200 +add test 10.10.177.201 +add test 10.10.177.202 +add test 10.10.177.203 +add test 10.10.177.204 +add test 10.10.177.205 +add test 10.10.177.206 +add test 10.10.177.207 +add test 10.10.177.208 +add test 10.10.177.209 +add test 10.10.177.21 +add test 10.10.177.210 +add test 10.10.177.211 +add test 10.10.177.212 +add test 10.10.177.213 +add test 10.10.177.214 +add test 10.10.177.215 +add test 10.10.177.216 +add test 10.10.177.217 +add test 10.10.177.218 +add test 10.10.177.219 +add test 10.10.177.22 +add test 10.10.177.220 +add test 10.10.177.221 +add test 10.10.177.222 +add test 10.10.177.223 +add test 10.10.177.224 +add test 10.10.177.225 +add test 10.10.177.226 +add test 10.10.177.227 +add test 10.10.177.228 +add test 10.10.177.229 +add test 10.10.177.23 +add test 10.10.177.230 +add test 10.10.177.231 +add test 10.10.177.232 +add test 10.10.177.233 +add test 10.10.177.234 +add test 10.10.177.235 +add test 10.10.177.236 +add test 10.10.177.237 +add test 10.10.177.238 +add test 10.10.177.239 +add test 10.10.177.24 +add test 10.10.177.240 +add test 10.10.177.241 +add test 10.10.177.242 +add test 10.10.177.243 +add test 10.10.177.244 +add test 10.10.177.245 +add test 10.10.177.246 +add test 10.10.177.247 +add test 10.10.177.248 +add test 10.10.177.249 +add test 10.10.177.25 +add test 10.10.177.250 +add test 10.10.177.251 +add test 10.10.177.252 +add test 10.10.177.253 +add test 10.10.177.254 +add test 10.10.177.255 +add test 10.10.177.26 +add test 10.10.177.27 +add test 10.10.177.28 +add test 10.10.177.29 +add test 10.10.177.3 +add test 10.10.177.30 +add test 10.10.177.31 +add test 10.10.177.32 +add test 10.10.177.33 +add test 10.10.177.34 +add test 10.10.177.35 +add test 10.10.177.36 +add test 10.10.177.37 +add test 10.10.177.38 +add test 10.10.177.39 +add test 10.10.177.4 +add test 10.10.177.40 +add test 10.10.177.41 +add test 10.10.177.42 +add test 10.10.177.43 +add test 10.10.177.44 +add test 10.10.177.45 +add test 10.10.177.46 +add test 10.10.177.47 +add test 10.10.177.48 +add test 10.10.177.49 +add test 10.10.177.5 +add test 10.10.177.50 +add test 10.10.177.51 +add test 10.10.177.52 +add test 10.10.177.53 +add test 10.10.177.54 +add test 10.10.177.55 +add test 10.10.177.56 +add test 10.10.177.57 +add test 10.10.177.58 +add test 10.10.177.59 +add test 10.10.177.6 +add test 10.10.177.60 +add test 10.10.177.61 +add test 10.10.177.62 +add test 10.10.177.63 +add test 10.10.177.64 +add test 10.10.177.65 +add test 10.10.177.66 +add test 10.10.177.67 +add test 10.10.177.68 +add test 10.10.177.69 +add test 10.10.177.7 +add test 10.10.177.70 +add test 10.10.177.71 +add test 10.10.177.72 +add test 10.10.177.73 +add test 10.10.177.74 +add test 10.10.177.75 +add test 10.10.177.76 +add test 10.10.177.77 +add test 10.10.177.78 +add test 10.10.177.79 +add test 10.10.177.8 +add test 10.10.177.80 +add test 10.10.177.81 +add test 10.10.177.82 +add test 10.10.177.83 +add test 10.10.177.84 +add test 10.10.177.85 +add test 10.10.177.86 +add test 10.10.177.87 +add test 10.10.177.88 +add test 10.10.177.89 +add test 10.10.177.9 +add test 10.10.177.90 +add test 10.10.177.91 +add test 10.10.177.92 +add test 10.10.177.93 +add test 10.10.177.94 +add test 10.10.177.95 +add test 10.10.177.96 +add test 10.10.177.97 +add test 10.10.177.98 +add test 10.10.177.99 +add test 10.10.178.0 +add test 10.10.178.1 +add test 10.10.178.10 +add test 10.10.178.100 +add test 10.10.178.101 +add test 10.10.178.102 +add test 10.10.178.103 +add test 10.10.178.104 +add test 10.10.178.105 +add test 10.10.178.106 +add test 10.10.178.107 +add test 10.10.178.108 +add test 10.10.178.109 +add test 10.10.178.11 +add test 10.10.178.110 +add test 10.10.178.111 +add test 10.10.178.112 +add test 10.10.178.113 +add test 10.10.178.114 +add test 10.10.178.115 +add test 10.10.178.116 +add test 10.10.178.117 +add test 10.10.178.118 +add test 10.10.178.119 +add test 10.10.178.12 +add test 10.10.178.120 +add test 10.10.178.121 +add test 10.10.178.122 +add test 10.10.178.123 +add test 10.10.178.124 +add test 10.10.178.125 +add test 10.10.178.126 +add test 10.10.178.127 +add test 10.10.178.128 +add test 10.10.178.129 +add test 10.10.178.13 +add test 10.10.178.130 +add test 10.10.178.131 +add test 10.10.178.132 +add test 10.10.178.133 +add test 10.10.178.134 +add test 10.10.178.135 +add test 10.10.178.136 +add test 10.10.178.137 +add test 10.10.178.138 +add test 10.10.178.139 +add test 10.10.178.14 +add test 10.10.178.140 +add test 10.10.178.141 +add test 10.10.178.142 +add test 10.10.178.143 +add test 10.10.178.144 +add test 10.10.178.145 +add test 10.10.178.146 +add test 10.10.178.147 +add test 10.10.178.148 +add test 10.10.178.149 +add test 10.10.178.15 +add test 10.10.178.150 +add test 10.10.178.151 +add test 10.10.178.152 +add test 10.10.178.153 +add test 10.10.178.154 +add test 10.10.178.155 +add test 10.10.178.156 +add test 10.10.178.157 +add test 10.10.178.158 +add test 10.10.178.159 +add test 10.10.178.16 +add test 10.10.178.160 +add test 10.10.178.161 +add test 10.10.178.162 +add test 10.10.178.163 +add test 10.10.178.164 +add test 10.10.178.165 +add test 10.10.178.166 +add test 10.10.178.167 +add test 10.10.178.168 +add test 10.10.178.169 +add test 10.10.178.17 +add test 10.10.178.170 +add test 10.10.178.171 +add test 10.10.178.172 +add test 10.10.178.173 +add test 10.10.178.174 +add test 10.10.178.175 +add test 10.10.178.176 +add test 10.10.178.177 +add test 10.10.178.178 +add test 10.10.178.179 +add test 10.10.178.18 +add test 10.10.178.180 +add test 10.10.178.181 +add test 10.10.178.182 +add test 10.10.178.183 +add test 10.10.178.184 +add test 10.10.178.185 +add test 10.10.178.186 +add test 10.10.178.187 +add test 10.10.178.188 +add test 10.10.178.189 +add test 10.10.178.19 +add test 10.10.178.190 +add test 10.10.178.191 +add test 10.10.178.192 +add test 10.10.178.193 +add test 10.10.178.194 +add test 10.10.178.195 +add test 10.10.178.196 +add test 10.10.178.197 +add test 10.10.178.198 +add test 10.10.178.199 +add test 10.10.178.2 +add test 10.10.178.20 +add test 10.10.178.200 +add test 10.10.178.201 +add test 10.10.178.202 +add test 10.10.178.203 +add test 10.10.178.204 +add test 10.10.178.205 +add test 10.10.178.206 +add test 10.10.178.207 +add test 10.10.178.208 +add test 10.10.178.209 +add test 10.10.178.21 +add test 10.10.178.210 +add test 10.10.178.211 +add test 10.10.178.212 +add test 10.10.178.213 +add test 10.10.178.214 +add test 10.10.178.215 +add test 10.10.178.216 +add test 10.10.178.217 +add test 10.10.178.218 +add test 10.10.178.219 +add test 10.10.178.22 +add test 10.10.178.220 +add test 10.10.178.221 +add test 10.10.178.222 +add test 10.10.178.223 +add test 10.10.178.224 +add test 10.10.178.225 +add test 10.10.178.226 +add test 10.10.178.227 +add test 10.10.178.228 +add test 10.10.178.229 +add test 10.10.178.23 +add test 10.10.178.230 +add test 10.10.178.231 +add test 10.10.178.232 +add test 10.10.178.233 +add test 10.10.178.234 +add test 10.10.178.235 +add test 10.10.178.236 +add test 10.10.178.237 +add test 10.10.178.238 +add test 10.10.178.239 +add test 10.10.178.24 +add test 10.10.178.240 +add test 10.10.178.241 +add test 10.10.178.242 +add test 10.10.178.243 +add test 10.10.178.244 +add test 10.10.178.245 +add test 10.10.178.246 +add test 10.10.178.247 +add test 10.10.178.248 +add test 10.10.178.249 +add test 10.10.178.25 +add test 10.10.178.250 +add test 10.10.178.251 +add test 10.10.178.252 +add test 10.10.178.253 +add test 10.10.178.254 +add test 10.10.178.255 +add test 10.10.178.26 +add test 10.10.178.27 +add test 10.10.178.28 +add test 10.10.178.29 +add test 10.10.178.3 +add test 10.10.178.30 +add test 10.10.178.31 +add test 10.10.178.32 +add test 10.10.178.33 +add test 10.10.178.34 +add test 10.10.178.35 +add test 10.10.178.36 +add test 10.10.178.37 +add test 10.10.178.38 +add test 10.10.178.39 +add test 10.10.178.4 +add test 10.10.178.40 +add test 10.10.178.41 +add test 10.10.178.42 +add test 10.10.178.43 +add test 10.10.178.44 +add test 10.10.178.45 +add test 10.10.178.46 +add test 10.10.178.47 +add test 10.10.178.48 +add test 10.10.178.49 +add test 10.10.178.5 +add test 10.10.178.50 +add test 10.10.178.51 +add test 10.10.178.52 +add test 10.10.178.53 +add test 10.10.178.54 +add test 10.10.178.55 +add test 10.10.178.56 +add test 10.10.178.57 +add test 10.10.178.58 +add test 10.10.178.59 +add test 10.10.178.6 +add test 10.10.178.60 +add test 10.10.178.61 +add test 10.10.178.62 +add test 10.10.178.63 +add test 10.10.178.64 +add test 10.10.178.65 +add test 10.10.178.66 +add test 10.10.178.67 +add test 10.10.178.68 +add test 10.10.178.69 +add test 10.10.178.7 +add test 10.10.178.70 +add test 10.10.178.71 +add test 10.10.178.72 +add test 10.10.178.73 +add test 10.10.178.74 +add test 10.10.178.75 +add test 10.10.178.76 +add test 10.10.178.77 +add test 10.10.178.78 +add test 10.10.178.79 +add test 10.10.178.8 +add test 10.10.178.80 +add test 10.10.178.81 +add test 10.10.178.82 +add test 10.10.178.83 +add test 10.10.178.84 +add test 10.10.178.85 +add test 10.10.178.86 +add test 10.10.178.87 +add test 10.10.178.88 +add test 10.10.178.89 +add test 10.10.178.9 +add test 10.10.178.90 +add test 10.10.178.91 +add test 10.10.178.92 +add test 10.10.178.93 +add test 10.10.178.94 +add test 10.10.178.95 +add test 10.10.178.96 +add test 10.10.178.97 +add test 10.10.178.98 +add test 10.10.178.99 +add test 10.10.179.0 +add test 10.10.179.1 +add test 10.10.179.10 +add test 10.10.179.100 +add test 10.10.179.101 +add test 10.10.179.102 +add test 10.10.179.103 +add test 10.10.179.104 +add test 10.10.179.105 +add test 10.10.179.106 +add test 10.10.179.107 +add test 10.10.179.108 +add test 10.10.179.109 +add test 10.10.179.11 +add test 10.10.179.110 +add test 10.10.179.111 +add test 10.10.179.112 +add test 10.10.179.113 +add test 10.10.179.114 +add test 10.10.179.115 +add test 10.10.179.116 +add test 10.10.179.117 +add test 10.10.179.118 +add test 10.10.179.119 +add test 10.10.179.12 +add test 10.10.179.120 +add test 10.10.179.121 +add test 10.10.179.122 +add test 10.10.179.123 +add test 10.10.179.124 +add test 10.10.179.125 +add test 10.10.179.126 +add test 10.10.179.127 +add test 10.10.179.128 +add test 10.10.179.129 +add test 10.10.179.13 +add test 10.10.179.130 +add test 10.10.179.131 +add test 10.10.179.132 +add test 10.10.179.133 +add test 10.10.179.134 +add test 10.10.179.135 +add test 10.10.179.136 +add test 10.10.179.137 +add test 10.10.179.138 +add test 10.10.179.139 +add test 10.10.179.14 +add test 10.10.179.140 +add test 10.10.179.141 +add test 10.10.179.142 +add test 10.10.179.143 +add test 10.10.179.144 +add test 10.10.179.145 +add test 10.10.179.146 +add test 10.10.179.147 +add test 10.10.179.148 +add test 10.10.179.149 +add test 10.10.179.15 +add test 10.10.179.150 +add test 10.10.179.151 +add test 10.10.179.152 +add test 10.10.179.153 +add test 10.10.179.154 +add test 10.10.179.155 +add test 10.10.179.156 +add test 10.10.179.157 +add test 10.10.179.158 +add test 10.10.179.159 +add test 10.10.179.16 +add test 10.10.179.160 +add test 10.10.179.161 +add test 10.10.179.162 +add test 10.10.179.163 +add test 10.10.179.164 +add test 10.10.179.165 +add test 10.10.179.166 +add test 10.10.179.167 +add test 10.10.179.168 +add test 10.10.179.169 +add test 10.10.179.17 +add test 10.10.179.170 +add test 10.10.179.171 +add test 10.10.179.172 +add test 10.10.179.173 +add test 10.10.179.174 +add test 10.10.179.175 +add test 10.10.179.176 +add test 10.10.179.177 +add test 10.10.179.178 +add test 10.10.179.179 +add test 10.10.179.18 +add test 10.10.179.180 +add test 10.10.179.181 +add test 10.10.179.182 +add test 10.10.179.183 +add test 10.10.179.184 +add test 10.10.179.185 +add test 10.10.179.186 +add test 10.10.179.187 +add test 10.10.179.188 +add test 10.10.179.189 +add test 10.10.179.19 +add test 10.10.179.190 +add test 10.10.179.191 +add test 10.10.179.192 +add test 10.10.179.193 +add test 10.10.179.194 +add test 10.10.179.195 +add test 10.10.179.196 +add test 10.10.179.197 +add test 10.10.179.198 +add test 10.10.179.199 +add test 10.10.179.2 +add test 10.10.179.20 +add test 10.10.179.200 +add test 10.10.179.201 +add test 10.10.179.202 +add test 10.10.179.203 +add test 10.10.179.204 +add test 10.10.179.205 +add test 10.10.179.206 +add test 10.10.179.207 +add test 10.10.179.208 +add test 10.10.179.209 +add test 10.10.179.21 +add test 10.10.179.210 +add test 10.10.179.211 +add test 10.10.179.212 +add test 10.10.179.213 +add test 10.10.179.214 +add test 10.10.179.215 +add test 10.10.179.216 +add test 10.10.179.217 +add test 10.10.179.218 +add test 10.10.179.219 +add test 10.10.179.22 +add test 10.10.179.220 +add test 10.10.179.221 +add test 10.10.179.222 +add test 10.10.179.223 +add test 10.10.179.224 +add test 10.10.179.225 +add test 10.10.179.226 +add test 10.10.179.227 +add test 10.10.179.228 +add test 10.10.179.229 +add test 10.10.179.23 +add test 10.10.179.230 +add test 10.10.179.231 +add test 10.10.179.232 +add test 10.10.179.233 +add test 10.10.179.234 +add test 10.10.179.235 +add test 10.10.179.236 +add test 10.10.179.237 +add test 10.10.179.238 +add test 10.10.179.239 +add test 10.10.179.24 +add test 10.10.179.240 +add test 10.10.179.241 +add test 10.10.179.242 +add test 10.10.179.243 +add test 10.10.179.244 +add test 10.10.179.245 +add test 10.10.179.246 +add test 10.10.179.247 +add test 10.10.179.248 +add test 10.10.179.249 +add test 10.10.179.25 +add test 10.10.179.250 +add test 10.10.179.251 +add test 10.10.179.252 +add test 10.10.179.253 +add test 10.10.179.254 +add test 10.10.179.255 +add test 10.10.179.26 +add test 10.10.179.27 +add test 10.10.179.28 +add test 10.10.179.29 +add test 10.10.179.3 +add test 10.10.179.30 +add test 10.10.179.31 +add test 10.10.179.32 +add test 10.10.179.33 +add test 10.10.179.34 +add test 10.10.179.35 +add test 10.10.179.36 +add test 10.10.179.37 +add test 10.10.179.38 +add test 10.10.179.39 +add test 10.10.179.4 +add test 10.10.179.40 +add test 10.10.179.41 +add test 10.10.179.42 +add test 10.10.179.43 +add test 10.10.179.44 +add test 10.10.179.45 +add test 10.10.179.46 +add test 10.10.179.47 +add test 10.10.179.48 +add test 10.10.179.49 +add test 10.10.179.5 +add test 10.10.179.50 +add test 10.10.179.51 +add test 10.10.179.52 +add test 10.10.179.53 +add test 10.10.179.54 +add test 10.10.179.55 +add test 10.10.179.56 +add test 10.10.179.57 +add test 10.10.179.58 +add test 10.10.179.59 +add test 10.10.179.6 +add test 10.10.179.60 +add test 10.10.179.61 +add test 10.10.179.62 +add test 10.10.179.63 +add test 10.10.179.64 +add test 10.10.179.65 +add test 10.10.179.66 +add test 10.10.179.67 +add test 10.10.179.68 +add test 10.10.179.69 +add test 10.10.179.7 +add test 10.10.179.70 +add test 10.10.179.71 +add test 10.10.179.72 +add test 10.10.179.73 +add test 10.10.179.74 +add test 10.10.179.75 +add test 10.10.179.76 +add test 10.10.179.77 +add test 10.10.179.78 +add test 10.10.179.79 +add test 10.10.179.8 +add test 10.10.179.80 +add test 10.10.179.81 +add test 10.10.179.82 +add test 10.10.179.83 +add test 10.10.179.84 +add test 10.10.179.85 +add test 10.10.179.86 +add test 10.10.179.87 +add test 10.10.179.88 +add test 10.10.179.89 +add test 10.10.179.9 +add test 10.10.179.90 +add test 10.10.179.91 +add test 10.10.179.92 +add test 10.10.179.93 +add test 10.10.179.94 +add test 10.10.179.95 +add test 10.10.179.96 +add test 10.10.179.97 +add test 10.10.179.98 +add test 10.10.179.99 +add test 10.10.18.0 +add test 10.10.18.1 +add test 10.10.18.10 +add test 10.10.18.100 +add test 10.10.18.101 +add test 10.10.18.102 +add test 10.10.18.103 +add test 10.10.18.104 +add test 10.10.18.105 +add test 10.10.18.106 +add test 10.10.18.107 +add test 10.10.18.108 +add test 10.10.18.109 +add test 10.10.18.11 +add test 10.10.18.110 +add test 10.10.18.111 +add test 10.10.18.112 +add test 10.10.18.113 +add test 10.10.18.114 +add test 10.10.18.115 +add test 10.10.18.116 +add test 10.10.18.117 +add test 10.10.18.118 +add test 10.10.18.119 +add test 10.10.18.12 +add test 10.10.18.120 +add test 10.10.18.121 +add test 10.10.18.122 +add test 10.10.18.123 +add test 10.10.18.124 +add test 10.10.18.125 +add test 10.10.18.126 +add test 10.10.18.127 +add test 10.10.18.128 +add test 10.10.18.129 +add test 10.10.18.13 +add test 10.10.18.130 +add test 10.10.18.131 +add test 10.10.18.132 +add test 10.10.18.133 +add test 10.10.18.134 +add test 10.10.18.135 +add test 10.10.18.136 +add test 10.10.18.137 +add test 10.10.18.138 +add test 10.10.18.139 +add test 10.10.18.14 +add test 10.10.18.140 +add test 10.10.18.141 +add test 10.10.18.142 +add test 10.10.18.143 +add test 10.10.18.144 +add test 10.10.18.145 +add test 10.10.18.146 +add test 10.10.18.147 +add test 10.10.18.148 +add test 10.10.18.149 +add test 10.10.18.15 +add test 10.10.18.150 +add test 10.10.18.151 +add test 10.10.18.152 +add test 10.10.18.153 +add test 10.10.18.154 +add test 10.10.18.155 +add test 10.10.18.156 +add test 10.10.18.157 +add test 10.10.18.158 +add test 10.10.18.159 +add test 10.10.18.16 +add test 10.10.18.160 +add test 10.10.18.161 +add test 10.10.18.162 +add test 10.10.18.163 +add test 10.10.18.164 +add test 10.10.18.165 +add test 10.10.18.166 +add test 10.10.18.167 +add test 10.10.18.168 +add test 10.10.18.169 +add test 10.10.18.17 +add test 10.10.18.170 +add test 10.10.18.171 +add test 10.10.18.172 +add test 10.10.18.173 +add test 10.10.18.174 +add test 10.10.18.175 +add test 10.10.18.176 +add test 10.10.18.177 +add test 10.10.18.178 +add test 10.10.18.179 +add test 10.10.18.18 +add test 10.10.18.180 +add test 10.10.18.181 +add test 10.10.18.182 +add test 10.10.18.183 +add test 10.10.18.184 +add test 10.10.18.185 +add test 10.10.18.186 +add test 10.10.18.187 +add test 10.10.18.188 +add test 10.10.18.189 +add test 10.10.18.19 +add test 10.10.18.190 +add test 10.10.18.191 +add test 10.10.18.192 +add test 10.10.18.193 +add test 10.10.18.194 +add test 10.10.18.195 +add test 10.10.18.196 +add test 10.10.18.197 +add test 10.10.18.198 +add test 10.10.18.199 +add test 10.10.18.2 +add test 10.10.18.20 +add test 10.10.18.200 +add test 10.10.18.201 +add test 10.10.18.202 +add test 10.10.18.203 +add test 10.10.18.204 +add test 10.10.18.205 +add test 10.10.18.206 +add test 10.10.18.207 +add test 10.10.18.208 +add test 10.10.18.209 +add test 10.10.18.21 +add test 10.10.18.210 +add test 10.10.18.211 +add test 10.10.18.212 +add test 10.10.18.213 +add test 10.10.18.214 +add test 10.10.18.215 +add test 10.10.18.216 +add test 10.10.18.217 +add test 10.10.18.218 +add test 10.10.18.219 +add test 10.10.18.22 +add test 10.10.18.220 +add test 10.10.18.221 +add test 10.10.18.222 +add test 10.10.18.223 +add test 10.10.18.224 +add test 10.10.18.225 +add test 10.10.18.226 +add test 10.10.18.227 +add test 10.10.18.228 +add test 10.10.18.229 +add test 10.10.18.23 +add test 10.10.18.230 +add test 10.10.18.231 +add test 10.10.18.232 +add test 10.10.18.233 +add test 10.10.18.234 +add test 10.10.18.235 +add test 10.10.18.236 +add test 10.10.18.237 +add test 10.10.18.238 +add test 10.10.18.239 +add test 10.10.18.24 +add test 10.10.18.240 +add test 10.10.18.241 +add test 10.10.18.242 +add test 10.10.18.243 +add test 10.10.18.244 +add test 10.10.18.245 +add test 10.10.18.246 +add test 10.10.18.247 +add test 10.10.18.248 +add test 10.10.18.249 +add test 10.10.18.25 +add test 10.10.18.250 +add test 10.10.18.251 +add test 10.10.18.252 +add test 10.10.18.253 +add test 10.10.18.254 +add test 10.10.18.255 +add test 10.10.18.26 +add test 10.10.18.27 +add test 10.10.18.28 +add test 10.10.18.29 +add test 10.10.18.3 +add test 10.10.18.30 +add test 10.10.18.31 +add test 10.10.18.32 +add test 10.10.18.33 +add test 10.10.18.34 +add test 10.10.18.35 +add test 10.10.18.36 +add test 10.10.18.37 +add test 10.10.18.38 +add test 10.10.18.39 +add test 10.10.18.4 +add test 10.10.18.40 +add test 10.10.18.41 +add test 10.10.18.42 +add test 10.10.18.43 +add test 10.10.18.44 +add test 10.10.18.45 +add test 10.10.18.46 +add test 10.10.18.47 +add test 10.10.18.48 +add test 10.10.18.49 +add test 10.10.18.5 +add test 10.10.18.50 +add test 10.10.18.51 +add test 10.10.18.52 +add test 10.10.18.53 +add test 10.10.18.54 +add test 10.10.18.55 +add test 10.10.18.56 +add test 10.10.18.57 +add test 10.10.18.58 +add test 10.10.18.59 +add test 10.10.18.6 +add test 10.10.18.60 +add test 10.10.18.61 +add test 10.10.18.62 +add test 10.10.18.63 +add test 10.10.18.64 +add test 10.10.18.65 +add test 10.10.18.66 +add test 10.10.18.67 +add test 10.10.18.68 +add test 10.10.18.69 +add test 10.10.18.7 +add test 10.10.18.70 +add test 10.10.18.71 +add test 10.10.18.72 +add test 10.10.18.73 +add test 10.10.18.74 +add test 10.10.18.75 +add test 10.10.18.76 +add test 10.10.18.77 +add test 10.10.18.78 +add test 10.10.18.79 +add test 10.10.18.8 +add test 10.10.18.80 +add test 10.10.18.81 +add test 10.10.18.82 +add test 10.10.18.83 +add test 10.10.18.84 +add test 10.10.18.85 +add test 10.10.18.86 +add test 10.10.18.87 +add test 10.10.18.88 +add test 10.10.18.89 +add test 10.10.18.9 +add test 10.10.18.90 +add test 10.10.18.91 +add test 10.10.18.92 +add test 10.10.18.93 +add test 10.10.18.94 +add test 10.10.18.95 +add test 10.10.18.96 +add test 10.10.18.97 +add test 10.10.18.98 +add test 10.10.18.99 +add test 10.10.180.0 +add test 10.10.180.1 +add test 10.10.180.10 +add test 10.10.180.100 +add test 10.10.180.101 +add test 10.10.180.102 +add test 10.10.180.103 +add test 10.10.180.104 +add test 10.10.180.105 +add test 10.10.180.106 +add test 10.10.180.107 +add test 10.10.180.108 +add test 10.10.180.109 +add test 10.10.180.11 +add test 10.10.180.110 +add test 10.10.180.111 +add test 10.10.180.112 +add test 10.10.180.113 +add test 10.10.180.114 +add test 10.10.180.115 +add test 10.10.180.116 +add test 10.10.180.117 +add test 10.10.180.118 +add test 10.10.180.119 +add test 10.10.180.12 +add test 10.10.180.120 +add test 10.10.180.121 +add test 10.10.180.122 +add test 10.10.180.123 +add test 10.10.180.124 +add test 10.10.180.125 +add test 10.10.180.126 +add test 10.10.180.127 +add test 10.10.180.128 +add test 10.10.180.129 +add test 10.10.180.13 +add test 10.10.180.130 +add test 10.10.180.131 +add test 10.10.180.132 +add test 10.10.180.133 +add test 10.10.180.134 +add test 10.10.180.135 +add test 10.10.180.136 +add test 10.10.180.137 +add test 10.10.180.138 +add test 10.10.180.139 +add test 10.10.180.14 +add test 10.10.180.140 +add test 10.10.180.141 +add test 10.10.180.142 +add test 10.10.180.143 +add test 10.10.180.144 +add test 10.10.180.145 +add test 10.10.180.146 +add test 10.10.180.147 +add test 10.10.180.148 +add test 10.10.180.149 +add test 10.10.180.15 +add test 10.10.180.150 +add test 10.10.180.151 +add test 10.10.180.152 +add test 10.10.180.153 +add test 10.10.180.154 +add test 10.10.180.155 +add test 10.10.180.156 +add test 10.10.180.157 +add test 10.10.180.158 +add test 10.10.180.159 +add test 10.10.180.16 +add test 10.10.180.160 +add test 10.10.180.161 +add test 10.10.180.162 +add test 10.10.180.163 +add test 10.10.180.164 +add test 10.10.180.165 +add test 10.10.180.166 +add test 10.10.180.167 +add test 10.10.180.168 +add test 10.10.180.169 +add test 10.10.180.17 +add test 10.10.180.170 +add test 10.10.180.171 +add test 10.10.180.172 +add test 10.10.180.173 +add test 10.10.180.174 +add test 10.10.180.175 +add test 10.10.180.176 +add test 10.10.180.177 +add test 10.10.180.178 +add test 10.10.180.179 +add test 10.10.180.18 +add test 10.10.180.180 +add test 10.10.180.181 +add test 10.10.180.182 +add test 10.10.180.183 +add test 10.10.180.184 +add test 10.10.180.185 +add test 10.10.180.186 +add test 10.10.180.187 +add test 10.10.180.188 +add test 10.10.180.189 +add test 10.10.180.19 +add test 10.10.180.190 +add test 10.10.180.191 +add test 10.10.180.192 +add test 10.10.180.193 +add test 10.10.180.194 +add test 10.10.180.195 +add test 10.10.180.196 +add test 10.10.180.197 +add test 10.10.180.198 +add test 10.10.180.199 +add test 10.10.180.2 +add test 10.10.180.20 +add test 10.10.180.200 +add test 10.10.180.201 +add test 10.10.180.202 +add test 10.10.180.203 +add test 10.10.180.204 +add test 10.10.180.205 +add test 10.10.180.206 +add test 10.10.180.207 +add test 10.10.180.208 +add test 10.10.180.209 +add test 10.10.180.21 +add test 10.10.180.210 +add test 10.10.180.211 +add test 10.10.180.212 +add test 10.10.180.213 +add test 10.10.180.214 +add test 10.10.180.215 +add test 10.10.180.216 +add test 10.10.180.217 +add test 10.10.180.218 +add test 10.10.180.219 +add test 10.10.180.22 +add test 10.10.180.220 +add test 10.10.180.221 +add test 10.10.180.222 +add test 10.10.180.223 +add test 10.10.180.224 +add test 10.10.180.225 +add test 10.10.180.226 +add test 10.10.180.227 +add test 10.10.180.228 +add test 10.10.180.229 +add test 10.10.180.23 +add test 10.10.180.230 +add test 10.10.180.231 +add test 10.10.180.232 +add test 10.10.180.233 +add test 10.10.180.234 +add test 10.10.180.235 +add test 10.10.180.236 +add test 10.10.180.237 +add test 10.10.180.238 +add test 10.10.180.239 +add test 10.10.180.24 +add test 10.10.180.240 +add test 10.10.180.241 +add test 10.10.180.242 +add test 10.10.180.243 +add test 10.10.180.244 +add test 10.10.180.245 +add test 10.10.180.246 +add test 10.10.180.247 +add test 10.10.180.248 +add test 10.10.180.249 +add test 10.10.180.25 +add test 10.10.180.250 +add test 10.10.180.251 +add test 10.10.180.252 +add test 10.10.180.253 +add test 10.10.180.254 +add test 10.10.180.255 +add test 10.10.180.26 +add test 10.10.180.27 +add test 10.10.180.28 +add test 10.10.180.29 +add test 10.10.180.3 +add test 10.10.180.30 +add test 10.10.180.31 +add test 10.10.180.32 +add test 10.10.180.33 +add test 10.10.180.34 +add test 10.10.180.35 +add test 10.10.180.36 +add test 10.10.180.37 +add test 10.10.180.38 +add test 10.10.180.39 +add test 10.10.180.4 +add test 10.10.180.40 +add test 10.10.180.41 +add test 10.10.180.42 +add test 10.10.180.43 +add test 10.10.180.44 +add test 10.10.180.45 +add test 10.10.180.46 +add test 10.10.180.47 +add test 10.10.180.48 +add test 10.10.180.49 +add test 10.10.180.5 +add test 10.10.180.50 +add test 10.10.180.51 +add test 10.10.180.52 +add test 10.10.180.53 +add test 10.10.180.54 +add test 10.10.180.55 +add test 10.10.180.56 +add test 10.10.180.57 +add test 10.10.180.58 +add test 10.10.180.59 +add test 10.10.180.6 +add test 10.10.180.60 +add test 10.10.180.61 +add test 10.10.180.62 +add test 10.10.180.63 +add test 10.10.180.64 +add test 10.10.180.65 +add test 10.10.180.66 +add test 10.10.180.67 +add test 10.10.180.68 +add test 10.10.180.69 +add test 10.10.180.7 +add test 10.10.180.70 +add test 10.10.180.71 +add test 10.10.180.72 +add test 10.10.180.73 +add test 10.10.180.74 +add test 10.10.180.75 +add test 10.10.180.76 +add test 10.10.180.77 +add test 10.10.180.78 +add test 10.10.180.79 +add test 10.10.180.8 +add test 10.10.180.80 +add test 10.10.180.81 +add test 10.10.180.82 +add test 10.10.180.83 +add test 10.10.180.84 +add test 10.10.180.85 +add test 10.10.180.86 +add test 10.10.180.87 +add test 10.10.180.88 +add test 10.10.180.89 +add test 10.10.180.9 +add test 10.10.180.90 +add test 10.10.180.91 +add test 10.10.180.92 +add test 10.10.180.93 +add test 10.10.180.94 +add test 10.10.180.95 +add test 10.10.180.96 +add test 10.10.180.97 +add test 10.10.180.98 +add test 10.10.180.99 +add test 10.10.181.0 +add test 10.10.181.1 +add test 10.10.181.10 +add test 10.10.181.100 +add test 10.10.181.101 +add test 10.10.181.102 +add test 10.10.181.103 +add test 10.10.181.104 +add test 10.10.181.105 +add test 10.10.181.106 +add test 10.10.181.107 +add test 10.10.181.108 +add test 10.10.181.109 +add test 10.10.181.11 +add test 10.10.181.110 +add test 10.10.181.111 +add test 10.10.181.112 +add test 10.10.181.113 +add test 10.10.181.114 +add test 10.10.181.115 +add test 10.10.181.116 +add test 10.10.181.117 +add test 10.10.181.118 +add test 10.10.181.119 +add test 10.10.181.12 +add test 10.10.181.120 +add test 10.10.181.121 +add test 10.10.181.122 +add test 10.10.181.123 +add test 10.10.181.124 +add test 10.10.181.125 +add test 10.10.181.126 +add test 10.10.181.127 +add test 10.10.181.128 +add test 10.10.181.129 +add test 10.10.181.13 +add test 10.10.181.130 +add test 10.10.181.131 +add test 10.10.181.132 +add test 10.10.181.133 +add test 10.10.181.134 +add test 10.10.181.135 +add test 10.10.181.136 +add test 10.10.181.137 +add test 10.10.181.138 +add test 10.10.181.139 +add test 10.10.181.14 +add test 10.10.181.140 +add test 10.10.181.141 +add test 10.10.181.142 +add test 10.10.181.143 +add test 10.10.181.144 +add test 10.10.181.145 +add test 10.10.181.146 +add test 10.10.181.147 +add test 10.10.181.148 +add test 10.10.181.149 +add test 10.10.181.15 +add test 10.10.181.150 +add test 10.10.181.151 +add test 10.10.181.152 +add test 10.10.181.153 +add test 10.10.181.154 +add test 10.10.181.155 +add test 10.10.181.156 +add test 10.10.181.157 +add test 10.10.181.158 +add test 10.10.181.159 +add test 10.10.181.16 +add test 10.10.181.160 +add test 10.10.181.161 +add test 10.10.181.162 +add test 10.10.181.163 +add test 10.10.181.164 +add test 10.10.181.165 +add test 10.10.181.166 +add test 10.10.181.167 +add test 10.10.181.168 +add test 10.10.181.169 +add test 10.10.181.17 +add test 10.10.181.170 +add test 10.10.181.171 +add test 10.10.181.172 +add test 10.10.181.173 +add test 10.10.181.174 +add test 10.10.181.175 +add test 10.10.181.176 +add test 10.10.181.177 +add test 10.10.181.178 +add test 10.10.181.179 +add test 10.10.181.18 +add test 10.10.181.180 +add test 10.10.181.181 +add test 10.10.181.182 +add test 10.10.181.183 +add test 10.10.181.184 +add test 10.10.181.185 +add test 10.10.181.186 +add test 10.10.181.187 +add test 10.10.181.188 +add test 10.10.181.189 +add test 10.10.181.19 +add test 10.10.181.190 +add test 10.10.181.191 +add test 10.10.181.192 +add test 10.10.181.193 +add test 10.10.181.194 +add test 10.10.181.195 +add test 10.10.181.196 +add test 10.10.181.197 +add test 10.10.181.198 +add test 10.10.181.199 +add test 10.10.181.2 +add test 10.10.181.20 +add test 10.10.181.200 +add test 10.10.181.201 +add test 10.10.181.202 +add test 10.10.181.203 +add test 10.10.181.204 +add test 10.10.181.205 +add test 10.10.181.206 +add test 10.10.181.207 +add test 10.10.181.208 +add test 10.10.181.209 +add test 10.10.181.21 +add test 10.10.181.210 +add test 10.10.181.211 +add test 10.10.181.212 +add test 10.10.181.213 +add test 10.10.181.214 +add test 10.10.181.215 +add test 10.10.181.216 +add test 10.10.181.217 +add test 10.10.181.218 +add test 10.10.181.219 +add test 10.10.181.22 +add test 10.10.181.220 +add test 10.10.181.221 +add test 10.10.181.222 +add test 10.10.181.223 +add test 10.10.181.224 +add test 10.10.181.225 +add test 10.10.181.226 +add test 10.10.181.227 +add test 10.10.181.228 +add test 10.10.181.229 +add test 10.10.181.23 +add test 10.10.181.230 +add test 10.10.181.231 +add test 10.10.181.232 +add test 10.10.181.233 +add test 10.10.181.234 +add test 10.10.181.235 +add test 10.10.181.236 +add test 10.10.181.237 +add test 10.10.181.238 +add test 10.10.181.239 +add test 10.10.181.24 +add test 10.10.181.240 +add test 10.10.181.241 +add test 10.10.181.242 +add test 10.10.181.243 +add test 10.10.181.244 +add test 10.10.181.245 +add test 10.10.181.246 +add test 10.10.181.247 +add test 10.10.181.248 +add test 10.10.181.249 +add test 10.10.181.25 +add test 10.10.181.250 +add test 10.10.181.251 +add test 10.10.181.252 +add test 10.10.181.253 +add test 10.10.181.254 +add test 10.10.181.255 +add test 10.10.181.26 +add test 10.10.181.27 +add test 10.10.181.28 +add test 10.10.181.29 +add test 10.10.181.3 +add test 10.10.181.30 +add test 10.10.181.31 +add test 10.10.181.32 +add test 10.10.181.33 +add test 10.10.181.34 +add test 10.10.181.35 +add test 10.10.181.36 +add test 10.10.181.37 +add test 10.10.181.38 +add test 10.10.181.39 +add test 10.10.181.4 +add test 10.10.181.40 +add test 10.10.181.41 +add test 10.10.181.42 +add test 10.10.181.43 +add test 10.10.181.44 +add test 10.10.181.45 +add test 10.10.181.46 +add test 10.10.181.47 +add test 10.10.181.48 +add test 10.10.181.49 +add test 10.10.181.5 +add test 10.10.181.50 +add test 10.10.181.51 +add test 10.10.181.52 +add test 10.10.181.53 +add test 10.10.181.54 +add test 10.10.181.55 +add test 10.10.181.56 +add test 10.10.181.57 +add test 10.10.181.58 +add test 10.10.181.59 +add test 10.10.181.6 +add test 10.10.181.60 +add test 10.10.181.61 +add test 10.10.181.62 +add test 10.10.181.63 +add test 10.10.181.64 +add test 10.10.181.65 +add test 10.10.181.66 +add test 10.10.181.67 +add test 10.10.181.68 +add test 10.10.181.69 +add test 10.10.181.7 +add test 10.10.181.70 +add test 10.10.181.71 +add test 10.10.181.72 +add test 10.10.181.73 +add test 10.10.181.74 +add test 10.10.181.75 +add test 10.10.181.76 +add test 10.10.181.77 +add test 10.10.181.78 +add test 10.10.181.79 +add test 10.10.181.8 +add test 10.10.181.80 +add test 10.10.181.81 +add test 10.10.181.82 +add test 10.10.181.83 +add test 10.10.181.84 +add test 10.10.181.85 +add test 10.10.181.86 +add test 10.10.181.87 +add test 10.10.181.88 +add test 10.10.181.89 +add test 10.10.181.9 +add test 10.10.181.90 +add test 10.10.181.91 +add test 10.10.181.92 +add test 10.10.181.93 +add test 10.10.181.94 +add test 10.10.181.95 +add test 10.10.181.96 +add test 10.10.181.97 +add test 10.10.181.98 +add test 10.10.181.99 +add test 10.10.182.0 +add test 10.10.182.1 +add test 10.10.182.10 +add test 10.10.182.100 +add test 10.10.182.101 +add test 10.10.182.102 +add test 10.10.182.103 +add test 10.10.182.104 +add test 10.10.182.105 +add test 10.10.182.106 +add test 10.10.182.107 +add test 10.10.182.108 +add test 10.10.182.109 +add test 10.10.182.11 +add test 10.10.182.110 +add test 10.10.182.111 +add test 10.10.182.112 +add test 10.10.182.113 +add test 10.10.182.114 +add test 10.10.182.115 +add test 10.10.182.116 +add test 10.10.182.117 +add test 10.10.182.118 +add test 10.10.182.119 +add test 10.10.182.12 +add test 10.10.182.120 +add test 10.10.182.121 +add test 10.10.182.122 +add test 10.10.182.123 +add test 10.10.182.124 +add test 10.10.182.125 +add test 10.10.182.126 +add test 10.10.182.127 +add test 10.10.182.128 +add test 10.10.182.129 +add test 10.10.182.13 +add test 10.10.182.130 +add test 10.10.182.131 +add test 10.10.182.132 +add test 10.10.182.133 +add test 10.10.182.134 +add test 10.10.182.135 +add test 10.10.182.136 +add test 10.10.182.137 +add test 10.10.182.138 +add test 10.10.182.139 +add test 10.10.182.14 +add test 10.10.182.140 +add test 10.10.182.141 +add test 10.10.182.142 +add test 10.10.182.143 +add test 10.10.182.144 +add test 10.10.182.145 +add test 10.10.182.146 +add test 10.10.182.147 +add test 10.10.182.148 +add test 10.10.182.149 +add test 10.10.182.15 +add test 10.10.182.150 +add test 10.10.182.151 +add test 10.10.182.152 +add test 10.10.182.153 +add test 10.10.182.154 +add test 10.10.182.155 +add test 10.10.182.156 +add test 10.10.182.157 +add test 10.10.182.158 +add test 10.10.182.159 +add test 10.10.182.16 +add test 10.10.182.160 +add test 10.10.182.161 +add test 10.10.182.162 +add test 10.10.182.163 +add test 10.10.182.164 +add test 10.10.182.165 +add test 10.10.182.166 +add test 10.10.182.167 +add test 10.10.182.168 +add test 10.10.182.169 +add test 10.10.182.17 +add test 10.10.182.170 +add test 10.10.182.171 +add test 10.10.182.172 +add test 10.10.182.173 +add test 10.10.182.174 +add test 10.10.182.175 +add test 10.10.182.176 +add test 10.10.182.177 +add test 10.10.182.178 +add test 10.10.182.179 +add test 10.10.182.18 +add test 10.10.182.180 +add test 10.10.182.181 +add test 10.10.182.182 +add test 10.10.182.183 +add test 10.10.182.184 +add test 10.10.182.185 +add test 10.10.182.186 +add test 10.10.182.187 +add test 10.10.182.188 +add test 10.10.182.189 +add test 10.10.182.19 +add test 10.10.182.190 +add test 10.10.182.191 +add test 10.10.182.192 +add test 10.10.182.193 +add test 10.10.182.194 +add test 10.10.182.195 +add test 10.10.182.196 +add test 10.10.182.197 +add test 10.10.182.198 +add test 10.10.182.199 +add test 10.10.182.2 +add test 10.10.182.20 +add test 10.10.182.200 +add test 10.10.182.201 +add test 10.10.182.202 +add test 10.10.182.203 +add test 10.10.182.204 +add test 10.10.182.205 +add test 10.10.182.206 +add test 10.10.182.207 +add test 10.10.182.208 +add test 10.10.182.209 +add test 10.10.182.21 +add test 10.10.182.210 +add test 10.10.182.211 +add test 10.10.182.212 +add test 10.10.182.213 +add test 10.10.182.214 +add test 10.10.182.215 +add test 10.10.182.216 +add test 10.10.182.217 +add test 10.10.182.218 +add test 10.10.182.219 +add test 10.10.182.22 +add test 10.10.182.220 +add test 10.10.182.221 +add test 10.10.182.222 +add test 10.10.182.223 +add test 10.10.182.224 +add test 10.10.182.225 +add test 10.10.182.226 +add test 10.10.182.227 +add test 10.10.182.228 +add test 10.10.182.229 +add test 10.10.182.23 +add test 10.10.182.230 +add test 10.10.182.231 +add test 10.10.182.232 +add test 10.10.182.233 +add test 10.10.182.234 +add test 10.10.182.235 +add test 10.10.182.236 +add test 10.10.182.237 +add test 10.10.182.238 +add test 10.10.182.239 +add test 10.10.182.24 +add test 10.10.182.240 +add test 10.10.182.241 +add test 10.10.182.242 +add test 10.10.182.243 +add test 10.10.182.244 +add test 10.10.182.245 +add test 10.10.182.246 +add test 10.10.182.247 +add test 10.10.182.248 +add test 10.10.182.249 +add test 10.10.182.25 +add test 10.10.182.250 +add test 10.10.182.251 +add test 10.10.182.252 +add test 10.10.182.253 +add test 10.10.182.254 +add test 10.10.182.255 +add test 10.10.182.26 +add test 10.10.182.27 +add test 10.10.182.28 +add test 10.10.182.29 +add test 10.10.182.3 +add test 10.10.182.30 +add test 10.10.182.31 +add test 10.10.182.32 +add test 10.10.182.33 +add test 10.10.182.34 +add test 10.10.182.35 +add test 10.10.182.36 +add test 10.10.182.37 +add test 10.10.182.38 +add test 10.10.182.39 +add test 10.10.182.4 +add test 10.10.182.40 +add test 10.10.182.41 +add test 10.10.182.42 +add test 10.10.182.43 +add test 10.10.182.44 +add test 10.10.182.45 +add test 10.10.182.46 +add test 10.10.182.47 +add test 10.10.182.48 +add test 10.10.182.49 +add test 10.10.182.5 +add test 10.10.182.50 +add test 10.10.182.51 +add test 10.10.182.52 +add test 10.10.182.53 +add test 10.10.182.54 +add test 10.10.182.55 +add test 10.10.182.56 +add test 10.10.182.57 +add test 10.10.182.58 +add test 10.10.182.59 +add test 10.10.182.6 +add test 10.10.182.60 +add test 10.10.182.61 +add test 10.10.182.62 +add test 10.10.182.63 +add test 10.10.182.64 +add test 10.10.182.65 +add test 10.10.182.66 +add test 10.10.182.67 +add test 10.10.182.68 +add test 10.10.182.69 +add test 10.10.182.7 +add test 10.10.182.70 +add test 10.10.182.71 +add test 10.10.182.72 +add test 10.10.182.73 +add test 10.10.182.74 +add test 10.10.182.75 +add test 10.10.182.76 +add test 10.10.182.77 +add test 10.10.182.78 +add test 10.10.182.79 +add test 10.10.182.8 +add test 10.10.182.80 +add test 10.10.182.81 +add test 10.10.182.82 +add test 10.10.182.83 +add test 10.10.182.84 +add test 10.10.182.85 +add test 10.10.182.86 +add test 10.10.182.87 +add test 10.10.182.88 +add test 10.10.182.89 +add test 10.10.182.9 +add test 10.10.182.90 +add test 10.10.182.91 +add test 10.10.182.92 +add test 10.10.182.93 +add test 10.10.182.94 +add test 10.10.182.95 +add test 10.10.182.96 +add test 10.10.182.97 +add test 10.10.182.98 +add test 10.10.182.99 +add test 10.10.183.0 +add test 10.10.183.1 +add test 10.10.183.10 +add test 10.10.183.100 +add test 10.10.183.101 +add test 10.10.183.102 +add test 10.10.183.103 +add test 10.10.183.104 +add test 10.10.183.105 +add test 10.10.183.106 +add test 10.10.183.107 +add test 10.10.183.108 +add test 10.10.183.109 +add test 10.10.183.11 +add test 10.10.183.110 +add test 10.10.183.111 +add test 10.10.183.112 +add test 10.10.183.113 +add test 10.10.183.114 +add test 10.10.183.115 +add test 10.10.183.116 +add test 10.10.183.117 +add test 10.10.183.118 +add test 10.10.183.119 +add test 10.10.183.12 +add test 10.10.183.120 +add test 10.10.183.121 +add test 10.10.183.122 +add test 10.10.183.123 +add test 10.10.183.124 +add test 10.10.183.125 +add test 10.10.183.126 +add test 10.10.183.127 +add test 10.10.183.128 +add test 10.10.183.129 +add test 10.10.183.13 +add test 10.10.183.130 +add test 10.10.183.131 +add test 10.10.183.132 +add test 10.10.183.133 +add test 10.10.183.134 +add test 10.10.183.135 +add test 10.10.183.136 +add test 10.10.183.137 +add test 10.10.183.138 +add test 10.10.183.139 +add test 10.10.183.14 +add test 10.10.183.140 +add test 10.10.183.141 +add test 10.10.183.142 +add test 10.10.183.143 +add test 10.10.183.144 +add test 10.10.183.145 +add test 10.10.183.146 +add test 10.10.183.147 +add test 10.10.183.148 +add test 10.10.183.149 +add test 10.10.183.15 +add test 10.10.183.150 +add test 10.10.183.151 +add test 10.10.183.152 +add test 10.10.183.153 +add test 10.10.183.154 +add test 10.10.183.155 +add test 10.10.183.156 +add test 10.10.183.157 +add test 10.10.183.158 +add test 10.10.183.159 +add test 10.10.183.16 +add test 10.10.183.160 +add test 10.10.183.161 +add test 10.10.183.162 +add test 10.10.183.163 +add test 10.10.183.164 +add test 10.10.183.165 +add test 10.10.183.166 +add test 10.10.183.167 +add test 10.10.183.168 +add test 10.10.183.169 +add test 10.10.183.17 +add test 10.10.183.170 +add test 10.10.183.171 +add test 10.10.183.172 +add test 10.10.183.173 +add test 10.10.183.174 +add test 10.10.183.175 +add test 10.10.183.176 +add test 10.10.183.177 +add test 10.10.183.178 +add test 10.10.183.179 +add test 10.10.183.18 +add test 10.10.183.180 +add test 10.10.183.181 +add test 10.10.183.182 +add test 10.10.183.183 +add test 10.10.183.184 +add test 10.10.183.185 +add test 10.10.183.186 +add test 10.10.183.187 +add test 10.10.183.188 +add test 10.10.183.189 +add test 10.10.183.19 +add test 10.10.183.190 +add test 10.10.183.191 +add test 10.10.183.192 +add test 10.10.183.193 +add test 10.10.183.194 +add test 10.10.183.195 +add test 10.10.183.196 +add test 10.10.183.197 +add test 10.10.183.198 +add test 10.10.183.199 +add test 10.10.183.2 +add test 10.10.183.20 +add test 10.10.183.200 +add test 10.10.183.201 +add test 10.10.183.202 +add test 10.10.183.203 +add test 10.10.183.204 +add test 10.10.183.205 +add test 10.10.183.206 +add test 10.10.183.207 +add test 10.10.183.208 +add test 10.10.183.209 +add test 10.10.183.21 +add test 10.10.183.210 +add test 10.10.183.211 +add test 10.10.183.212 +add test 10.10.183.213 +add test 10.10.183.214 +add test 10.10.183.215 +add test 10.10.183.216 +add test 10.10.183.217 +add test 10.10.183.218 +add test 10.10.183.219 +add test 10.10.183.22 +add test 10.10.183.220 +add test 10.10.183.221 +add test 10.10.183.222 +add test 10.10.183.223 +add test 10.10.183.224 +add test 10.10.183.225 +add test 10.10.183.226 +add test 10.10.183.227 +add test 10.10.183.228 +add test 10.10.183.229 +add test 10.10.183.23 +add test 10.10.183.230 +add test 10.10.183.231 +add test 10.10.183.232 +add test 10.10.183.233 +add test 10.10.183.234 +add test 10.10.183.235 +add test 10.10.183.236 +add test 10.10.183.237 +add test 10.10.183.238 +add test 10.10.183.239 +add test 10.10.183.24 +add test 10.10.183.240 +add test 10.10.183.241 +add test 10.10.183.242 +add test 10.10.183.243 +add test 10.10.183.244 +add test 10.10.183.245 +add test 10.10.183.246 +add test 10.10.183.247 +add test 10.10.183.248 +add test 10.10.183.249 +add test 10.10.183.25 +add test 10.10.183.250 +add test 10.10.183.251 +add test 10.10.183.252 +add test 10.10.183.253 +add test 10.10.183.254 +add test 10.10.183.255 +add test 10.10.183.26 +add test 10.10.183.27 +add test 10.10.183.28 +add test 10.10.183.29 +add test 10.10.183.3 +add test 10.10.183.30 +add test 10.10.183.31 +add test 10.10.183.32 +add test 10.10.183.33 +add test 10.10.183.34 +add test 10.10.183.35 +add test 10.10.183.36 +add test 10.10.183.37 +add test 10.10.183.38 +add test 10.10.183.39 +add test 10.10.183.4 +add test 10.10.183.40 +add test 10.10.183.41 +add test 10.10.183.42 +add test 10.10.183.43 +add test 10.10.183.44 +add test 10.10.183.45 +add test 10.10.183.46 +add test 10.10.183.47 +add test 10.10.183.48 +add test 10.10.183.49 +add test 10.10.183.5 +add test 10.10.183.50 +add test 10.10.183.51 +add test 10.10.183.52 +add test 10.10.183.53 +add test 10.10.183.54 +add test 10.10.183.55 +add test 10.10.183.56 +add test 10.10.183.57 +add test 10.10.183.58 +add test 10.10.183.59 +add test 10.10.183.6 +add test 10.10.183.60 +add test 10.10.183.61 +add test 10.10.183.62 +add test 10.10.183.63 +add test 10.10.183.64 +add test 10.10.183.65 +add test 10.10.183.66 +add test 10.10.183.67 +add test 10.10.183.68 +add test 10.10.183.69 +add test 10.10.183.7 +add test 10.10.183.70 +add test 10.10.183.71 +add test 10.10.183.72 +add test 10.10.183.73 +add test 10.10.183.74 +add test 10.10.183.75 +add test 10.10.183.76 +add test 10.10.183.77 +add test 10.10.183.78 +add test 10.10.183.79 +add test 10.10.183.8 +add test 10.10.183.80 +add test 10.10.183.81 +add test 10.10.183.82 +add test 10.10.183.83 +add test 10.10.183.84 +add test 10.10.183.85 +add test 10.10.183.86 +add test 10.10.183.87 +add test 10.10.183.88 +add test 10.10.183.89 +add test 10.10.183.9 +add test 10.10.183.90 +add test 10.10.183.91 +add test 10.10.183.92 +add test 10.10.183.93 +add test 10.10.183.94 +add test 10.10.183.95 +add test 10.10.183.96 +add test 10.10.183.97 +add test 10.10.183.98 +add test 10.10.183.99 +add test 10.10.184.0 +add test 10.10.184.1 +add test 10.10.184.10 +add test 10.10.184.100 +add test 10.10.184.101 +add test 10.10.184.102 +add test 10.10.184.103 +add test 10.10.184.104 +add test 10.10.184.105 +add test 10.10.184.106 +add test 10.10.184.107 +add test 10.10.184.108 +add test 10.10.184.109 +add test 10.10.184.11 +add test 10.10.184.110 +add test 10.10.184.111 +add test 10.10.184.112 +add test 10.10.184.113 +add test 10.10.184.114 +add test 10.10.184.115 +add test 10.10.184.116 +add test 10.10.184.117 +add test 10.10.184.118 +add test 10.10.184.119 +add test 10.10.184.12 +add test 10.10.184.120 +add test 10.10.184.121 +add test 10.10.184.122 +add test 10.10.184.123 +add test 10.10.184.124 +add test 10.10.184.125 +add test 10.10.184.126 +add test 10.10.184.127 +add test 10.10.184.128 +add test 10.10.184.129 +add test 10.10.184.13 +add test 10.10.184.130 +add test 10.10.184.131 +add test 10.10.184.132 +add test 10.10.184.133 +add test 10.10.184.134 +add test 10.10.184.135 +add test 10.10.184.136 +add test 10.10.184.137 +add test 10.10.184.138 +add test 10.10.184.139 +add test 10.10.184.14 +add test 10.10.184.140 +add test 10.10.184.141 +add test 10.10.184.142 +add test 10.10.184.143 +add test 10.10.184.144 +add test 10.10.184.145 +add test 10.10.184.146 +add test 10.10.184.147 +add test 10.10.184.148 +add test 10.10.184.149 +add test 10.10.184.15 +add test 10.10.184.150 +add test 10.10.184.151 +add test 10.10.184.152 +add test 10.10.184.153 +add test 10.10.184.154 +add test 10.10.184.155 +add test 10.10.184.156 +add test 10.10.184.157 +add test 10.10.184.158 +add test 10.10.184.159 +add test 10.10.184.16 +add test 10.10.184.160 +add test 10.10.184.161 +add test 10.10.184.162 +add test 10.10.184.163 +add test 10.10.184.164 +add test 10.10.184.165 +add test 10.10.184.166 +add test 10.10.184.167 +add test 10.10.184.168 +add test 10.10.184.169 +add test 10.10.184.17 +add test 10.10.184.170 +add test 10.10.184.171 +add test 10.10.184.172 +add test 10.10.184.173 +add test 10.10.184.174 +add test 10.10.184.175 +add test 10.10.184.176 +add test 10.10.184.177 +add test 10.10.184.178 +add test 10.10.184.179 +add test 10.10.184.18 +add test 10.10.184.180 +add test 10.10.184.181 +add test 10.10.184.182 +add test 10.10.184.183 +add test 10.10.184.184 +add test 10.10.184.185 +add test 10.10.184.186 +add test 10.10.184.187 +add test 10.10.184.188 +add test 10.10.184.189 +add test 10.10.184.19 +add test 10.10.184.190 +add test 10.10.184.191 +add test 10.10.184.192 +add test 10.10.184.193 +add test 10.10.184.194 +add test 10.10.184.195 +add test 10.10.184.196 +add test 10.10.184.197 +add test 10.10.184.198 +add test 10.10.184.199 +add test 10.10.184.2 +add test 10.10.184.20 +add test 10.10.184.200 +add test 10.10.184.201 +add test 10.10.184.202 +add test 10.10.184.203 +add test 10.10.184.204 +add test 10.10.184.205 +add test 10.10.184.206 +add test 10.10.184.207 +add test 10.10.184.208 +add test 10.10.184.209 +add test 10.10.184.21 +add test 10.10.184.210 +add test 10.10.184.211 +add test 10.10.184.212 +add test 10.10.184.213 +add test 10.10.184.214 +add test 10.10.184.215 +add test 10.10.184.216 +add test 10.10.184.217 +add test 10.10.184.218 +add test 10.10.184.219 +add test 10.10.184.22 +add test 10.10.184.220 +add test 10.10.184.221 +add test 10.10.184.222 +add test 10.10.184.223 +add test 10.10.184.224 +add test 10.10.184.225 +add test 10.10.184.226 +add test 10.10.184.227 +add test 10.10.184.228 +add test 10.10.184.229 +add test 10.10.184.23 +add test 10.10.184.230 +add test 10.10.184.231 +add test 10.10.184.232 +add test 10.10.184.233 +add test 10.10.184.234 +add test 10.10.184.235 +add test 10.10.184.236 +add test 10.10.184.237 +add test 10.10.184.238 +add test 10.10.184.239 +add test 10.10.184.24 +add test 10.10.184.240 +add test 10.10.184.241 +add test 10.10.184.242 +add test 10.10.184.243 +add test 10.10.184.244 +add test 10.10.184.245 +add test 10.10.184.246 +add test 10.10.184.247 +add test 10.10.184.248 +add test 10.10.184.249 +add test 10.10.184.25 +add test 10.10.184.250 +add test 10.10.184.251 +add test 10.10.184.252 +add test 10.10.184.253 +add test 10.10.184.254 +add test 10.10.184.255 +add test 10.10.184.26 +add test 10.10.184.27 +add test 10.10.184.28 +add test 10.10.184.29 +add test 10.10.184.3 +add test 10.10.184.30 +add test 10.10.184.31 +add test 10.10.184.32 +add test 10.10.184.33 +add test 10.10.184.34 +add test 10.10.184.35 +add test 10.10.184.36 +add test 10.10.184.37 +add test 10.10.184.38 +add test 10.10.184.39 +add test 10.10.184.4 +add test 10.10.184.40 +add test 10.10.184.41 +add test 10.10.184.42 +add test 10.10.184.43 +add test 10.10.184.44 +add test 10.10.184.45 +add test 10.10.184.46 +add test 10.10.184.47 +add test 10.10.184.48 +add test 10.10.184.49 +add test 10.10.184.5 +add test 10.10.184.50 +add test 10.10.184.51 +add test 10.10.184.52 +add test 10.10.184.53 +add test 10.10.184.54 +add test 10.10.184.55 +add test 10.10.184.56 +add test 10.10.184.57 +add test 10.10.184.58 +add test 10.10.184.59 +add test 10.10.184.6 +add test 10.10.184.60 +add test 10.10.184.61 +add test 10.10.184.62 +add test 10.10.184.63 +add test 10.10.184.64 +add test 10.10.184.65 +add test 10.10.184.66 +add test 10.10.184.67 +add test 10.10.184.68 +add test 10.10.184.69 +add test 10.10.184.7 +add test 10.10.184.70 +add test 10.10.184.71 +add test 10.10.184.72 +add test 10.10.184.73 +add test 10.10.184.74 +add test 10.10.184.75 +add test 10.10.184.76 +add test 10.10.184.77 +add test 10.10.184.78 +add test 10.10.184.79 +add test 10.10.184.8 +add test 10.10.184.80 +add test 10.10.184.81 +add test 10.10.184.82 +add test 10.10.184.83 +add test 10.10.184.84 +add test 10.10.184.85 +add test 10.10.184.86 +add test 10.10.184.87 +add test 10.10.184.88 +add test 10.10.184.89 +add test 10.10.184.9 +add test 10.10.184.90 +add test 10.10.184.91 +add test 10.10.184.92 +add test 10.10.184.93 +add test 10.10.184.94 +add test 10.10.184.95 +add test 10.10.184.96 +add test 10.10.184.97 +add test 10.10.184.98 +add test 10.10.184.99 +add test 10.10.185.0 +add test 10.10.185.1 +add test 10.10.185.10 +add test 10.10.185.100 +add test 10.10.185.101 +add test 10.10.185.102 +add test 10.10.185.103 +add test 10.10.185.104 +add test 10.10.185.105 +add test 10.10.185.106 +add test 10.10.185.107 +add test 10.10.185.108 +add test 10.10.185.109 +add test 10.10.185.11 +add test 10.10.185.110 +add test 10.10.185.111 +add test 10.10.185.112 +add test 10.10.185.113 +add test 10.10.185.114 +add test 10.10.185.115 +add test 10.10.185.116 +add test 10.10.185.117 +add test 10.10.185.118 +add test 10.10.185.119 +add test 10.10.185.12 +add test 10.10.185.120 +add test 10.10.185.121 +add test 10.10.185.122 +add test 10.10.185.123 +add test 10.10.185.124 +add test 10.10.185.125 +add test 10.10.185.126 +add test 10.10.185.127 +add test 10.10.185.128 +add test 10.10.185.129 +add test 10.10.185.13 +add test 10.10.185.130 +add test 10.10.185.131 +add test 10.10.185.132 +add test 10.10.185.133 +add test 10.10.185.134 +add test 10.10.185.135 +add test 10.10.185.136 +add test 10.10.185.137 +add test 10.10.185.138 +add test 10.10.185.139 +add test 10.10.185.14 +add test 10.10.185.140 +add test 10.10.185.141 +add test 10.10.185.142 +add test 10.10.185.143 +add test 10.10.185.144 +add test 10.10.185.145 +add test 10.10.185.146 +add test 10.10.185.147 +add test 10.10.185.148 +add test 10.10.185.149 +add test 10.10.185.15 +add test 10.10.185.150 +add test 10.10.185.151 +add test 10.10.185.152 +add test 10.10.185.153 +add test 10.10.185.154 +add test 10.10.185.155 +add test 10.10.185.156 +add test 10.10.185.157 +add test 10.10.185.158 +add test 10.10.185.159 +add test 10.10.185.16 +add test 10.10.185.160 +add test 10.10.185.161 +add test 10.10.185.162 +add test 10.10.185.163 +add test 10.10.185.164 +add test 10.10.185.165 +add test 10.10.185.166 +add test 10.10.185.167 +add test 10.10.185.168 +add test 10.10.185.169 +add test 10.10.185.17 +add test 10.10.185.170 +add test 10.10.185.171 +add test 10.10.185.172 +add test 10.10.185.173 +add test 10.10.185.174 +add test 10.10.185.175 +add test 10.10.185.176 +add test 10.10.185.177 +add test 10.10.185.178 +add test 10.10.185.179 +add test 10.10.185.18 +add test 10.10.185.180 +add test 10.10.185.181 +add test 10.10.185.182 +add test 10.10.185.183 +add test 10.10.185.184 +add test 10.10.185.185 +add test 10.10.185.186 +add test 10.10.185.187 +add test 10.10.185.188 +add test 10.10.185.189 +add test 10.10.185.19 +add test 10.10.185.190 +add test 10.10.185.191 +add test 10.10.185.192 +add test 10.10.185.193 +add test 10.10.185.194 +add test 10.10.185.195 +add test 10.10.185.196 +add test 10.10.185.197 +add test 10.10.185.198 +add test 10.10.185.199 +add test 10.10.185.2 +add test 10.10.185.20 +add test 10.10.185.200 +add test 10.10.185.201 +add test 10.10.185.202 +add test 10.10.185.203 +add test 10.10.185.204 +add test 10.10.185.205 +add test 10.10.185.206 +add test 10.10.185.207 +add test 10.10.185.208 +add test 10.10.185.209 +add test 10.10.185.21 +add test 10.10.185.210 +add test 10.10.185.211 +add test 10.10.185.212 +add test 10.10.185.213 +add test 10.10.185.214 +add test 10.10.185.215 +add test 10.10.185.216 +add test 10.10.185.217 +add test 10.10.185.218 +add test 10.10.185.219 +add test 10.10.185.22 +add test 10.10.185.220 +add test 10.10.185.221 +add test 10.10.185.222 +add test 10.10.185.223 +add test 10.10.185.224 +add test 10.10.185.225 +add test 10.10.185.226 +add test 10.10.185.227 +add test 10.10.185.228 +add test 10.10.185.229 +add test 10.10.185.23 +add test 10.10.185.230 +add test 10.10.185.231 +add test 10.10.185.232 +add test 10.10.185.233 +add test 10.10.185.234 +add test 10.10.185.235 +add test 10.10.185.236 +add test 10.10.185.237 +add test 10.10.185.238 +add test 10.10.185.239 +add test 10.10.185.24 +add test 10.10.185.240 +add test 10.10.185.241 +add test 10.10.185.242 +add test 10.10.185.243 +add test 10.10.185.244 +add test 10.10.185.245 +add test 10.10.185.246 +add test 10.10.185.247 +add test 10.10.185.248 +add test 10.10.185.249 +add test 10.10.185.25 +add test 10.10.185.250 +add test 10.10.185.251 +add test 10.10.185.252 +add test 10.10.185.253 +add test 10.10.185.254 +add test 10.10.185.255 +add test 10.10.185.26 +add test 10.10.185.27 +add test 10.10.185.28 +add test 10.10.185.29 +add test 10.10.185.3 +add test 10.10.185.30 +add test 10.10.185.31 +add test 10.10.185.32 +add test 10.10.185.33 +add test 10.10.185.34 +add test 10.10.185.35 +add test 10.10.185.36 +add test 10.10.185.37 +add test 10.10.185.38 +add test 10.10.185.39 +add test 10.10.185.4 +add test 10.10.185.40 +add test 10.10.185.41 +add test 10.10.185.42 +add test 10.10.185.43 +add test 10.10.185.44 +add test 10.10.185.45 +add test 10.10.185.46 +add test 10.10.185.47 +add test 10.10.185.48 +add test 10.10.185.49 +add test 10.10.185.5 +add test 10.10.185.50 +add test 10.10.185.51 +add test 10.10.185.52 +add test 10.10.185.53 +add test 10.10.185.54 +add test 10.10.185.55 +add test 10.10.185.56 +add test 10.10.185.57 +add test 10.10.185.58 +add test 10.10.185.59 +add test 10.10.185.6 +add test 10.10.185.60 +add test 10.10.185.61 +add test 10.10.185.62 +add test 10.10.185.63 +add test 10.10.185.64 +add test 10.10.185.65 +add test 10.10.185.66 +add test 10.10.185.67 +add test 10.10.185.68 +add test 10.10.185.69 +add test 10.10.185.7 +add test 10.10.185.70 +add test 10.10.185.71 +add test 10.10.185.72 +add test 10.10.185.73 +add test 10.10.185.74 +add test 10.10.185.75 +add test 10.10.185.76 +add test 10.10.185.77 +add test 10.10.185.78 +add test 10.10.185.79 +add test 10.10.185.8 +add test 10.10.185.80 +add test 10.10.185.81 +add test 10.10.185.82 +add test 10.10.185.83 +add test 10.10.185.84 +add test 10.10.185.85 +add test 10.10.185.86 +add test 10.10.185.87 +add test 10.10.185.88 +add test 10.10.185.89 +add test 10.10.185.9 +add test 10.10.185.90 +add test 10.10.185.91 +add test 10.10.185.92 +add test 10.10.185.93 +add test 10.10.185.94 +add test 10.10.185.95 +add test 10.10.185.96 +add test 10.10.185.97 +add test 10.10.185.98 +add test 10.10.185.99 +add test 10.10.186.0 +add test 10.10.186.1 +add test 10.10.186.10 +add test 10.10.186.100 +add test 10.10.186.101 +add test 10.10.186.102 +add test 10.10.186.103 +add test 10.10.186.104 +add test 10.10.186.105 +add test 10.10.186.106 +add test 10.10.186.107 +add test 10.10.186.108 +add test 10.10.186.109 +add test 10.10.186.11 +add test 10.10.186.110 +add test 10.10.186.111 +add test 10.10.186.112 +add test 10.10.186.113 +add test 10.10.186.114 +add test 10.10.186.115 +add test 10.10.186.116 +add test 10.10.186.117 +add test 10.10.186.118 +add test 10.10.186.119 +add test 10.10.186.12 +add test 10.10.186.120 +add test 10.10.186.121 +add test 10.10.186.122 +add test 10.10.186.123 +add test 10.10.186.124 +add test 10.10.186.125 +add test 10.10.186.126 +add test 10.10.186.127 +add test 10.10.186.128 +add test 10.10.186.129 +add test 10.10.186.13 +add test 10.10.186.130 +add test 10.10.186.131 +add test 10.10.186.132 +add test 10.10.186.133 +add test 10.10.186.134 +add test 10.10.186.135 +add test 10.10.186.136 +add test 10.10.186.137 +add test 10.10.186.138 +add test 10.10.186.139 +add test 10.10.186.14 +add test 10.10.186.140 +add test 10.10.186.141 +add test 10.10.186.142 +add test 10.10.186.143 +add test 10.10.186.144 +add test 10.10.186.145 +add test 10.10.186.146 +add test 10.10.186.147 +add test 10.10.186.148 +add test 10.10.186.149 +add test 10.10.186.15 +add test 10.10.186.150 +add test 10.10.186.151 +add test 10.10.186.152 +add test 10.10.186.153 +add test 10.10.186.154 +add test 10.10.186.155 +add test 10.10.186.156 +add test 10.10.186.157 +add test 10.10.186.158 +add test 10.10.186.159 +add test 10.10.186.16 +add test 10.10.186.160 +add test 10.10.186.161 +add test 10.10.186.162 +add test 10.10.186.163 +add test 10.10.186.164 +add test 10.10.186.165 +add test 10.10.186.166 +add test 10.10.186.167 +add test 10.10.186.168 +add test 10.10.186.169 +add test 10.10.186.17 +add test 10.10.186.170 +add test 10.10.186.171 +add test 10.10.186.172 +add test 10.10.186.173 +add test 10.10.186.174 +add test 10.10.186.175 +add test 10.10.186.176 +add test 10.10.186.177 +add test 10.10.186.178 +add test 10.10.186.179 +add test 10.10.186.18 +add test 10.10.186.180 +add test 10.10.186.181 +add test 10.10.186.182 +add test 10.10.186.183 +add test 10.10.186.184 +add test 10.10.186.185 +add test 10.10.186.186 +add test 10.10.186.187 +add test 10.10.186.188 +add test 10.10.186.189 +add test 10.10.186.19 +add test 10.10.186.190 +add test 10.10.186.191 +add test 10.10.186.192 +add test 10.10.186.193 +add test 10.10.186.194 +add test 10.10.186.195 +add test 10.10.186.196 +add test 10.10.186.197 +add test 10.10.186.198 +add test 10.10.186.199 +add test 10.10.186.2 +add test 10.10.186.20 +add test 10.10.186.200 +add test 10.10.186.201 +add test 10.10.186.202 +add test 10.10.186.203 +add test 10.10.186.204 +add test 10.10.186.205 +add test 10.10.186.206 +add test 10.10.186.207 +add test 10.10.186.208 +add test 10.10.186.209 +add test 10.10.186.21 +add test 10.10.186.210 +add test 10.10.186.211 +add test 10.10.186.212 +add test 10.10.186.213 +add test 10.10.186.214 +add test 10.10.186.215 +add test 10.10.186.216 +add test 10.10.186.217 +add test 10.10.186.218 +add test 10.10.186.219 +add test 10.10.186.22 +add test 10.10.186.220 +add test 10.10.186.221 +add test 10.10.186.222 +add test 10.10.186.223 +add test 10.10.186.224 +add test 10.10.186.225 +add test 10.10.186.226 +add test 10.10.186.227 +add test 10.10.186.228 +add test 10.10.186.229 +add test 10.10.186.23 +add test 10.10.186.230 +add test 10.10.186.231 +add test 10.10.186.232 +add test 10.10.186.233 +add test 10.10.186.234 +add test 10.10.186.235 +add test 10.10.186.236 +add test 10.10.186.237 +add test 10.10.186.238 +add test 10.10.186.239 +add test 10.10.186.24 +add test 10.10.186.240 +add test 10.10.186.241 +add test 10.10.186.242 +add test 10.10.186.243 +add test 10.10.186.244 +add test 10.10.186.245 +add test 10.10.186.246 +add test 10.10.186.247 +add test 10.10.186.248 +add test 10.10.186.249 +add test 10.10.186.25 +add test 10.10.186.250 +add test 10.10.186.251 +add test 10.10.186.252 +add test 10.10.186.253 +add test 10.10.186.254 +add test 10.10.186.255 +add test 10.10.186.26 +add test 10.10.186.27 +add test 10.10.186.28 +add test 10.10.186.29 +add test 10.10.186.3 +add test 10.10.186.30 +add test 10.10.186.31 +add test 10.10.186.32 +add test 10.10.186.33 +add test 10.10.186.34 +add test 10.10.186.35 +add test 10.10.186.36 +add test 10.10.186.37 +add test 10.10.186.38 +add test 10.10.186.39 +add test 10.10.186.4 +add test 10.10.186.40 +add test 10.10.186.41 +add test 10.10.186.42 +add test 10.10.186.43 +add test 10.10.186.44 +add test 10.10.186.45 +add test 10.10.186.46 +add test 10.10.186.47 +add test 10.10.186.48 +add test 10.10.186.49 +add test 10.10.186.5 +add test 10.10.186.50 +add test 10.10.186.51 +add test 10.10.186.52 +add test 10.10.186.53 +add test 10.10.186.54 +add test 10.10.186.55 +add test 10.10.186.56 +add test 10.10.186.57 +add test 10.10.186.58 +add test 10.10.186.59 +add test 10.10.186.6 +add test 10.10.186.60 +add test 10.10.186.61 +add test 10.10.186.62 +add test 10.10.186.63 +add test 10.10.186.64 +add test 10.10.186.65 +add test 10.10.186.66 +add test 10.10.186.67 +add test 10.10.186.68 +add test 10.10.186.69 +add test 10.10.186.7 +add test 10.10.186.70 +add test 10.10.186.71 +add test 10.10.186.72 +add test 10.10.186.73 +add test 10.10.186.74 +add test 10.10.186.75 +add test 10.10.186.76 +add test 10.10.186.77 +add test 10.10.186.78 +add test 10.10.186.79 +add test 10.10.186.8 +add test 10.10.186.80 +add test 10.10.186.81 +add test 10.10.186.82 +add test 10.10.186.83 +add test 10.10.186.84 +add test 10.10.186.85 +add test 10.10.186.86 +add test 10.10.186.87 +add test 10.10.186.88 +add test 10.10.186.89 +add test 10.10.186.9 +add test 10.10.186.90 +add test 10.10.186.91 +add test 10.10.186.92 +add test 10.10.186.93 +add test 10.10.186.94 +add test 10.10.186.95 +add test 10.10.186.96 +add test 10.10.186.97 +add test 10.10.186.98 +add test 10.10.186.99 +add test 10.10.187.0 +add test 10.10.187.1 +add test 10.10.187.10 +add test 10.10.187.100 +add test 10.10.187.101 +add test 10.10.187.102 +add test 10.10.187.103 +add test 10.10.187.104 +add test 10.10.187.105 +add test 10.10.187.106 +add test 10.10.187.107 +add test 10.10.187.108 +add test 10.10.187.109 +add test 10.10.187.11 +add test 10.10.187.110 +add test 10.10.187.111 +add test 10.10.187.112 +add test 10.10.187.113 +add test 10.10.187.114 +add test 10.10.187.115 +add test 10.10.187.116 +add test 10.10.187.117 +add test 10.10.187.118 +add test 10.10.187.119 +add test 10.10.187.12 +add test 10.10.187.120 +add test 10.10.187.121 +add test 10.10.187.122 +add test 10.10.187.123 +add test 10.10.187.124 +add test 10.10.187.125 +add test 10.10.187.126 +add test 10.10.187.127 +add test 10.10.187.128 +add test 10.10.187.129 +add test 10.10.187.13 +add test 10.10.187.130 +add test 10.10.187.131 +add test 10.10.187.132 +add test 10.10.187.133 +add test 10.10.187.134 +add test 10.10.187.135 +add test 10.10.187.136 +add test 10.10.187.137 +add test 10.10.187.138 +add test 10.10.187.139 +add test 10.10.187.14 +add test 10.10.187.140 +add test 10.10.187.141 +add test 10.10.187.142 +add test 10.10.187.143 +add test 10.10.187.144 +add test 10.10.187.145 +add test 10.10.187.146 +add test 10.10.187.147 +add test 10.10.187.148 +add test 10.10.187.149 +add test 10.10.187.15 +add test 10.10.187.150 +add test 10.10.187.151 +add test 10.10.187.152 +add test 10.10.187.153 +add test 10.10.187.154 +add test 10.10.187.155 +add test 10.10.187.156 +add test 10.10.187.157 +add test 10.10.187.158 +add test 10.10.187.159 +add test 10.10.187.16 +add test 10.10.187.160 +add test 10.10.187.161 +add test 10.10.187.162 +add test 10.10.187.163 +add test 10.10.187.164 +add test 10.10.187.165 +add test 10.10.187.166 +add test 10.10.187.167 +add test 10.10.187.168 +add test 10.10.187.169 +add test 10.10.187.17 +add test 10.10.187.170 +add test 10.10.187.171 +add test 10.10.187.172 +add test 10.10.187.173 +add test 10.10.187.174 +add test 10.10.187.175 +add test 10.10.187.176 +add test 10.10.187.177 +add test 10.10.187.178 +add test 10.10.187.179 +add test 10.10.187.18 +add test 10.10.187.180 +add test 10.10.187.181 +add test 10.10.187.182 +add test 10.10.187.183 +add test 10.10.187.184 +add test 10.10.187.185 +add test 10.10.187.186 +add test 10.10.187.187 +add test 10.10.187.188 +add test 10.10.187.189 +add test 10.10.187.19 +add test 10.10.187.190 +add test 10.10.187.191 +add test 10.10.187.192 +add test 10.10.187.193 +add test 10.10.187.194 +add test 10.10.187.195 +add test 10.10.187.196 +add test 10.10.187.197 +add test 10.10.187.198 +add test 10.10.187.199 +add test 10.10.187.2 +add test 10.10.187.20 +add test 10.10.187.200 +add test 10.10.187.201 +add test 10.10.187.202 +add test 10.10.187.203 +add test 10.10.187.204 +add test 10.10.187.205 +add test 10.10.187.206 +add test 10.10.187.207 +add test 10.10.187.208 +add test 10.10.187.209 +add test 10.10.187.21 +add test 10.10.187.210 +add test 10.10.187.211 +add test 10.10.187.212 +add test 10.10.187.213 +add test 10.10.187.214 +add test 10.10.187.215 +add test 10.10.187.216 +add test 10.10.187.217 +add test 10.10.187.218 +add test 10.10.187.219 +add test 10.10.187.22 +add test 10.10.187.220 +add test 10.10.187.221 +add test 10.10.187.222 +add test 10.10.187.223 +add test 10.10.187.224 +add test 10.10.187.225 +add test 10.10.187.226 +add test 10.10.187.227 +add test 10.10.187.228 +add test 10.10.187.229 +add test 10.10.187.23 +add test 10.10.187.230 +add test 10.10.187.231 +add test 10.10.187.232 +add test 10.10.187.233 +add test 10.10.187.234 +add test 10.10.187.235 +add test 10.10.187.236 +add test 10.10.187.237 +add test 10.10.187.238 +add test 10.10.187.239 +add test 10.10.187.24 +add test 10.10.187.240 +add test 10.10.187.241 +add test 10.10.187.242 +add test 10.10.187.243 +add test 10.10.187.244 +add test 10.10.187.245 +add test 10.10.187.246 +add test 10.10.187.247 +add test 10.10.187.248 +add test 10.10.187.249 +add test 10.10.187.25 +add test 10.10.187.250 +add test 10.10.187.251 +add test 10.10.187.252 +add test 10.10.187.253 +add test 10.10.187.254 +add test 10.10.187.255 +add test 10.10.187.26 +add test 10.10.187.27 +add test 10.10.187.28 +add test 10.10.187.29 +add test 10.10.187.3 +add test 10.10.187.30 +add test 10.10.187.31 +add test 10.10.187.32 +add test 10.10.187.33 +add test 10.10.187.34 +add test 10.10.187.35 +add test 10.10.187.36 +add test 10.10.187.37 +add test 10.10.187.38 +add test 10.10.187.39 +add test 10.10.187.4 +add test 10.10.187.40 +add test 10.10.187.41 +add test 10.10.187.42 +add test 10.10.187.43 +add test 10.10.187.44 +add test 10.10.187.45 +add test 10.10.187.46 +add test 10.10.187.47 +add test 10.10.187.48 +add test 10.10.187.49 +add test 10.10.187.5 +add test 10.10.187.50 +add test 10.10.187.51 +add test 10.10.187.52 +add test 10.10.187.53 +add test 10.10.187.54 +add test 10.10.187.55 +add test 10.10.187.56 +add test 10.10.187.57 +add test 10.10.187.58 +add test 10.10.187.59 +add test 10.10.187.6 +add test 10.10.187.60 +add test 10.10.187.61 +add test 10.10.187.62 +add test 10.10.187.63 +add test 10.10.187.64 +add test 10.10.187.65 +add test 10.10.187.66 +add test 10.10.187.67 +add test 10.10.187.68 +add test 10.10.187.69 +add test 10.10.187.7 +add test 10.10.187.70 +add test 10.10.187.71 +add test 10.10.187.72 +add test 10.10.187.73 +add test 10.10.187.74 +add test 10.10.187.75 +add test 10.10.187.76 +add test 10.10.187.77 +add test 10.10.187.78 +add test 10.10.187.79 +add test 10.10.187.8 +add test 10.10.187.80 +add test 10.10.187.81 +add test 10.10.187.82 +add test 10.10.187.83 +add test 10.10.187.84 +add test 10.10.187.85 +add test 10.10.187.86 +add test 10.10.187.87 +add test 10.10.187.88 +add test 10.10.187.89 +add test 10.10.187.9 +add test 10.10.187.90 +add test 10.10.187.91 +add test 10.10.187.92 +add test 10.10.187.93 +add test 10.10.187.94 +add test 10.10.187.95 +add test 10.10.187.96 +add test 10.10.187.97 +add test 10.10.187.98 +add test 10.10.187.99 +add test 10.10.188.0 +add test 10.10.188.1 +add test 10.10.188.10 +add test 10.10.188.100 +add test 10.10.188.101 +add test 10.10.188.102 +add test 10.10.188.103 +add test 10.10.188.104 +add test 10.10.188.105 +add test 10.10.188.106 +add test 10.10.188.107 +add test 10.10.188.108 +add test 10.10.188.109 +add test 10.10.188.11 +add test 10.10.188.110 +add test 10.10.188.111 +add test 10.10.188.112 +add test 10.10.188.113 +add test 10.10.188.114 +add test 10.10.188.115 +add test 10.10.188.116 +add test 10.10.188.117 +add test 10.10.188.118 +add test 10.10.188.119 +add test 10.10.188.12 +add test 10.10.188.120 +add test 10.10.188.121 +add test 10.10.188.122 +add test 10.10.188.123 +add test 10.10.188.124 +add test 10.10.188.125 +add test 10.10.188.126 +add test 10.10.188.127 +add test 10.10.188.128 +add test 10.10.188.129 +add test 10.10.188.13 +add test 10.10.188.130 +add test 10.10.188.131 +add test 10.10.188.132 +add test 10.10.188.133 +add test 10.10.188.134 +add test 10.10.188.135 +add test 10.10.188.136 +add test 10.10.188.137 +add test 10.10.188.138 +add test 10.10.188.139 +add test 10.10.188.14 +add test 10.10.188.140 +add test 10.10.188.141 +add test 10.10.188.142 +add test 10.10.188.143 +add test 10.10.188.144 +add test 10.10.188.145 +add test 10.10.188.146 +add test 10.10.188.147 +add test 10.10.188.148 +add test 10.10.188.149 +add test 10.10.188.15 +add test 10.10.188.150 +add test 10.10.188.151 +add test 10.10.188.152 +add test 10.10.188.153 +add test 10.10.188.154 +add test 10.10.188.155 +add test 10.10.188.156 +add test 10.10.188.157 +add test 10.10.188.158 +add test 10.10.188.159 +add test 10.10.188.16 +add test 10.10.188.160 +add test 10.10.188.161 +add test 10.10.188.162 +add test 10.10.188.163 +add test 10.10.188.164 +add test 10.10.188.165 +add test 10.10.188.166 +add test 10.10.188.167 +add test 10.10.188.168 +add test 10.10.188.169 +add test 10.10.188.17 +add test 10.10.188.170 +add test 10.10.188.171 +add test 10.10.188.172 +add test 10.10.188.173 +add test 10.10.188.174 +add test 10.10.188.175 +add test 10.10.188.176 +add test 10.10.188.177 +add test 10.10.188.178 +add test 10.10.188.179 +add test 10.10.188.18 +add test 10.10.188.180 +add test 10.10.188.181 +add test 10.10.188.182 +add test 10.10.188.183 +add test 10.10.188.184 +add test 10.10.188.185 +add test 10.10.188.186 +add test 10.10.188.187 +add test 10.10.188.188 +add test 10.10.188.189 +add test 10.10.188.19 +add test 10.10.188.190 +add test 10.10.188.191 +add test 10.10.188.192 +add test 10.10.188.193 +add test 10.10.188.194 +add test 10.10.188.195 +add test 10.10.188.196 +add test 10.10.188.197 +add test 10.10.188.198 +add test 10.10.188.199 +add test 10.10.188.2 +add test 10.10.188.20 +add test 10.10.188.200 +add test 10.10.188.201 +add test 10.10.188.202 +add test 10.10.188.203 +add test 10.10.188.204 +add test 10.10.188.205 +add test 10.10.188.206 +add test 10.10.188.207 +add test 10.10.188.208 +add test 10.10.188.209 +add test 10.10.188.21 +add test 10.10.188.210 +add test 10.10.188.211 +add test 10.10.188.212 +add test 10.10.188.213 +add test 10.10.188.214 +add test 10.10.188.215 +add test 10.10.188.216 +add test 10.10.188.217 +add test 10.10.188.218 +add test 10.10.188.219 +add test 10.10.188.22 +add test 10.10.188.220 +add test 10.10.188.221 +add test 10.10.188.222 +add test 10.10.188.223 +add test 10.10.188.224 +add test 10.10.188.225 +add test 10.10.188.226 +add test 10.10.188.227 +add test 10.10.188.228 +add test 10.10.188.229 +add test 10.10.188.23 +add test 10.10.188.230 +add test 10.10.188.231 +add test 10.10.188.232 +add test 10.10.188.233 +add test 10.10.188.234 +add test 10.10.188.235 +add test 10.10.188.236 +add test 10.10.188.237 +add test 10.10.188.238 +add test 10.10.188.239 +add test 10.10.188.24 +add test 10.10.188.240 +add test 10.10.188.241 +add test 10.10.188.242 +add test 10.10.188.243 +add test 10.10.188.244 +add test 10.10.188.245 +add test 10.10.188.246 +add test 10.10.188.247 +add test 10.10.188.248 +add test 10.10.188.249 +add test 10.10.188.25 +add test 10.10.188.250 +add test 10.10.188.251 +add test 10.10.188.252 +add test 10.10.188.253 +add test 10.10.188.254 +add test 10.10.188.255 +add test 10.10.188.26 +add test 10.10.188.27 +add test 10.10.188.28 +add test 10.10.188.29 +add test 10.10.188.3 +add test 10.10.188.30 +add test 10.10.188.31 +add test 10.10.188.32 +add test 10.10.188.33 +add test 10.10.188.34 +add test 10.10.188.35 +add test 10.10.188.36 +add test 10.10.188.37 +add test 10.10.188.38 +add test 10.10.188.39 +add test 10.10.188.4 +add test 10.10.188.40 +add test 10.10.188.41 +add test 10.10.188.42 +add test 10.10.188.43 +add test 10.10.188.44 +add test 10.10.188.45 +add test 10.10.188.46 +add test 10.10.188.47 +add test 10.10.188.48 +add test 10.10.188.49 +add test 10.10.188.5 +add test 10.10.188.50 +add test 10.10.188.51 +add test 10.10.188.52 +add test 10.10.188.53 +add test 10.10.188.54 +add test 10.10.188.55 +add test 10.10.188.56 +add test 10.10.188.57 +add test 10.10.188.58 +add test 10.10.188.59 +add test 10.10.188.6 +add test 10.10.188.60 +add test 10.10.188.61 +add test 10.10.188.62 +add test 10.10.188.63 +add test 10.10.188.64 +add test 10.10.188.65 +add test 10.10.188.66 +add test 10.10.188.67 +add test 10.10.188.68 +add test 10.10.188.69 +add test 10.10.188.7 +add test 10.10.188.70 +add test 10.10.188.71 +add test 10.10.188.72 +add test 10.10.188.73 +add test 10.10.188.74 +add test 10.10.188.75 +add test 10.10.188.76 +add test 10.10.188.77 +add test 10.10.188.78 +add test 10.10.188.79 +add test 10.10.188.8 +add test 10.10.188.80 +add test 10.10.188.81 +add test 10.10.188.82 +add test 10.10.188.83 +add test 10.10.188.84 +add test 10.10.188.85 +add test 10.10.188.86 +add test 10.10.188.87 +add test 10.10.188.88 +add test 10.10.188.89 +add test 10.10.188.9 +add test 10.10.188.90 +add test 10.10.188.91 +add test 10.10.188.92 +add test 10.10.188.93 +add test 10.10.188.94 +add test 10.10.188.95 +add test 10.10.188.96 +add test 10.10.188.97 +add test 10.10.188.98 +add test 10.10.188.99 +add test 10.10.189.0 +add test 10.10.189.1 +add test 10.10.189.10 +add test 10.10.189.100 +add test 10.10.189.101 +add test 10.10.189.102 +add test 10.10.189.103 +add test 10.10.189.104 +add test 10.10.189.105 +add test 10.10.189.106 +add test 10.10.189.107 +add test 10.10.189.108 +add test 10.10.189.109 +add test 10.10.189.11 +add test 10.10.189.110 +add test 10.10.189.111 +add test 10.10.189.112 +add test 10.10.189.113 +add test 10.10.189.114 +add test 10.10.189.115 +add test 10.10.189.116 +add test 10.10.189.117 +add test 10.10.189.118 +add test 10.10.189.119 +add test 10.10.189.12 +add test 10.10.189.120 +add test 10.10.189.121 +add test 10.10.189.122 +add test 10.10.189.123 +add test 10.10.189.124 +add test 10.10.189.125 +add test 10.10.189.126 +add test 10.10.189.127 +add test 10.10.189.128 +add test 10.10.189.129 +add test 10.10.189.13 +add test 10.10.189.130 +add test 10.10.189.131 +add test 10.10.189.132 +add test 10.10.189.133 +add test 10.10.189.134 +add test 10.10.189.135 +add test 10.10.189.136 +add test 10.10.189.137 +add test 10.10.189.138 +add test 10.10.189.139 +add test 10.10.189.14 +add test 10.10.189.140 +add test 10.10.189.141 +add test 10.10.189.142 +add test 10.10.189.143 +add test 10.10.189.144 +add test 10.10.189.145 +add test 10.10.189.146 +add test 10.10.189.147 +add test 10.10.189.148 +add test 10.10.189.149 +add test 10.10.189.15 +add test 10.10.189.150 +add test 10.10.189.151 +add test 10.10.189.152 +add test 10.10.189.153 +add test 10.10.189.154 +add test 10.10.189.155 +add test 10.10.189.156 +add test 10.10.189.157 +add test 10.10.189.158 +add test 10.10.189.159 +add test 10.10.189.16 +add test 10.10.189.160 +add test 10.10.189.161 +add test 10.10.189.162 +add test 10.10.189.163 +add test 10.10.189.164 +add test 10.10.189.165 +add test 10.10.189.166 +add test 10.10.189.167 +add test 10.10.189.168 +add test 10.10.189.169 +add test 10.10.189.17 +add test 10.10.189.170 +add test 10.10.189.171 +add test 10.10.189.172 +add test 10.10.189.173 +add test 10.10.189.174 +add test 10.10.189.175 +add test 10.10.189.176 +add test 10.10.189.177 +add test 10.10.189.178 +add test 10.10.189.179 +add test 10.10.189.18 +add test 10.10.189.180 +add test 10.10.189.181 +add test 10.10.189.182 +add test 10.10.189.183 +add test 10.10.189.184 +add test 10.10.189.185 +add test 10.10.189.186 +add test 10.10.189.187 +add test 10.10.189.188 +add test 10.10.189.189 +add test 10.10.189.19 +add test 10.10.189.190 +add test 10.10.189.191 +add test 10.10.189.192 +add test 10.10.189.193 +add test 10.10.189.194 +add test 10.10.189.195 +add test 10.10.189.196 +add test 10.10.189.197 +add test 10.10.189.198 +add test 10.10.189.199 +add test 10.10.189.2 +add test 10.10.189.20 +add test 10.10.189.200 +add test 10.10.189.201 +add test 10.10.189.202 +add test 10.10.189.203 +add test 10.10.189.204 +add test 10.10.189.205 +add test 10.10.189.206 +add test 10.10.189.207 +add test 10.10.189.208 +add test 10.10.189.209 +add test 10.10.189.21 +add test 10.10.189.210 +add test 10.10.189.211 +add test 10.10.189.212 +add test 10.10.189.213 +add test 10.10.189.214 +add test 10.10.189.215 +add test 10.10.189.216 +add test 10.10.189.217 +add test 10.10.189.218 +add test 10.10.189.219 +add test 10.10.189.22 +add test 10.10.189.220 +add test 10.10.189.221 +add test 10.10.189.222 +add test 10.10.189.223 +add test 10.10.189.224 +add test 10.10.189.225 +add test 10.10.189.226 +add test 10.10.189.227 +add test 10.10.189.228 +add test 10.10.189.229 +add test 10.10.189.23 +add test 10.10.189.230 +add test 10.10.189.231 +add test 10.10.189.232 +add test 10.10.189.233 +add test 10.10.189.234 +add test 10.10.189.235 +add test 10.10.189.236 +add test 10.10.189.237 +add test 10.10.189.238 +add test 10.10.189.239 +add test 10.10.189.24 +add test 10.10.189.240 +add test 10.10.189.241 +add test 10.10.189.242 +add test 10.10.189.243 +add test 10.10.189.244 +add test 10.10.189.245 +add test 10.10.189.246 +add test 10.10.189.247 +add test 10.10.189.248 +add test 10.10.189.249 +add test 10.10.189.25 +add test 10.10.189.250 +add test 10.10.189.251 +add test 10.10.189.252 +add test 10.10.189.253 +add test 10.10.189.254 +add test 10.10.189.255 +add test 10.10.189.26 +add test 10.10.189.27 +add test 10.10.189.28 +add test 10.10.189.29 +add test 10.10.189.3 +add test 10.10.189.30 +add test 10.10.189.31 +add test 10.10.189.32 +add test 10.10.189.33 +add test 10.10.189.34 +add test 10.10.189.35 +add test 10.10.189.36 +add test 10.10.189.37 +add test 10.10.189.38 +add test 10.10.189.39 +add test 10.10.189.4 +add test 10.10.189.40 +add test 10.10.189.41 +add test 10.10.189.42 +add test 10.10.189.43 +add test 10.10.189.44 +add test 10.10.189.45 +add test 10.10.189.46 +add test 10.10.189.47 +add test 10.10.189.48 +add test 10.10.189.49 +add test 10.10.189.5 +add test 10.10.189.50 +add test 10.10.189.51 +add test 10.10.189.52 +add test 10.10.189.53 +add test 10.10.189.54 +add test 10.10.189.55 +add test 10.10.189.56 +add test 10.10.189.57 +add test 10.10.189.58 +add test 10.10.189.59 +add test 10.10.189.6 +add test 10.10.189.60 +add test 10.10.189.61 +add test 10.10.189.62 +add test 10.10.189.63 +add test 10.10.189.64 +add test 10.10.189.65 +add test 10.10.189.66 +add test 10.10.189.67 +add test 10.10.189.68 +add test 10.10.189.69 +add test 10.10.189.7 +add test 10.10.189.70 +add test 10.10.189.71 +add test 10.10.189.72 +add test 10.10.189.73 +add test 10.10.189.74 +add test 10.10.189.75 +add test 10.10.189.76 +add test 10.10.189.77 +add test 10.10.189.78 +add test 10.10.189.79 +add test 10.10.189.8 +add test 10.10.189.80 +add test 10.10.189.81 +add test 10.10.189.82 +add test 10.10.189.83 +add test 10.10.189.84 +add test 10.10.189.85 +add test 10.10.189.86 +add test 10.10.189.87 +add test 10.10.189.88 +add test 10.10.189.89 +add test 10.10.189.9 +add test 10.10.189.90 +add test 10.10.189.91 +add test 10.10.189.92 +add test 10.10.189.93 +add test 10.10.189.94 +add test 10.10.189.95 +add test 10.10.189.96 +add test 10.10.189.97 +add test 10.10.189.98 +add test 10.10.189.99 +add test 10.10.19.0 +add test 10.10.19.1 +add test 10.10.19.10 +add test 10.10.19.100 +add test 10.10.19.101 +add test 10.10.19.102 +add test 10.10.19.103 +add test 10.10.19.104 +add test 10.10.19.105 +add test 10.10.19.106 +add test 10.10.19.107 +add test 10.10.19.108 +add test 10.10.19.109 +add test 10.10.19.11 +add test 10.10.19.110 +add test 10.10.19.111 +add test 10.10.19.112 +add test 10.10.19.113 +add test 10.10.19.114 +add test 10.10.19.115 +add test 10.10.19.116 +add test 10.10.19.117 +add test 10.10.19.118 +add test 10.10.19.119 +add test 10.10.19.12 +add test 10.10.19.120 +add test 10.10.19.121 +add test 10.10.19.122 +add test 10.10.19.123 +add test 10.10.19.124 +add test 10.10.19.125 +add test 10.10.19.126 +add test 10.10.19.127 +add test 10.10.19.128 +add test 10.10.19.129 +add test 10.10.19.13 +add test 10.10.19.130 +add test 10.10.19.131 +add test 10.10.19.132 +add test 10.10.19.133 +add test 10.10.19.134 +add test 10.10.19.135 +add test 10.10.19.136 +add test 10.10.19.137 +add test 10.10.19.138 +add test 10.10.19.139 +add test 10.10.19.14 +add test 10.10.19.140 +add test 10.10.19.141 +add test 10.10.19.142 +add test 10.10.19.143 +add test 10.10.19.144 +add test 10.10.19.145 +add test 10.10.19.146 +add test 10.10.19.147 +add test 10.10.19.148 +add test 10.10.19.149 +add test 10.10.19.15 +add test 10.10.19.150 +add test 10.10.19.151 +add test 10.10.19.152 +add test 10.10.19.153 +add test 10.10.19.154 +add test 10.10.19.155 +add test 10.10.19.156 +add test 10.10.19.157 +add test 10.10.19.158 +add test 10.10.19.159 +add test 10.10.19.16 +add test 10.10.19.160 +add test 10.10.19.161 +add test 10.10.19.162 +add test 10.10.19.163 +add test 10.10.19.164 +add test 10.10.19.165 +add test 10.10.19.166 +add test 10.10.19.167 +add test 10.10.19.168 +add test 10.10.19.169 +add test 10.10.19.17 +add test 10.10.19.170 +add test 10.10.19.171 +add test 10.10.19.172 +add test 10.10.19.173 +add test 10.10.19.174 +add test 10.10.19.175 +add test 10.10.19.176 +add test 10.10.19.177 +add test 10.10.19.178 +add test 10.10.19.179 +add test 10.10.19.18 +add test 10.10.19.180 +add test 10.10.19.181 +add test 10.10.19.182 +add test 10.10.19.183 +add test 10.10.19.184 +add test 10.10.19.185 +add test 10.10.19.186 +add test 10.10.19.187 +add test 10.10.19.188 +add test 10.10.19.189 +add test 10.10.19.19 +add test 10.10.19.190 +add test 10.10.19.191 +add test 10.10.19.192 +add test 10.10.19.193 +add test 10.10.19.194 +add test 10.10.19.195 +add test 10.10.19.196 +add test 10.10.19.197 +add test 10.10.19.198 +add test 10.10.19.199 +add test 10.10.19.2 +add test 10.10.19.20 +add test 10.10.19.200 +add test 10.10.19.201 +add test 10.10.19.202 +add test 10.10.19.203 +add test 10.10.19.204 +add test 10.10.19.205 +add test 10.10.19.206 +add test 10.10.19.207 +add test 10.10.19.208 +add test 10.10.19.209 +add test 10.10.19.21 +add test 10.10.19.210 +add test 10.10.19.211 +add test 10.10.19.212 +add test 10.10.19.213 +add test 10.10.19.214 +add test 10.10.19.215 +add test 10.10.19.216 +add test 10.10.19.217 +add test 10.10.19.218 +add test 10.10.19.219 +add test 10.10.19.22 +add test 10.10.19.220 +add test 10.10.19.221 +add test 10.10.19.222 +add test 10.10.19.223 +add test 10.10.19.224 +add test 10.10.19.225 +add test 10.10.19.226 +add test 10.10.19.227 +add test 10.10.19.228 +add test 10.10.19.229 +add test 10.10.19.23 +add test 10.10.19.230 +add test 10.10.19.231 +add test 10.10.19.232 +add test 10.10.19.233 +add test 10.10.19.234 +add test 10.10.19.235 +add test 10.10.19.236 +add test 10.10.19.237 +add test 10.10.19.238 +add test 10.10.19.239 +add test 10.10.19.24 +add test 10.10.19.240 +add test 10.10.19.241 +add test 10.10.19.242 +add test 10.10.19.243 +add test 10.10.19.244 +add test 10.10.19.245 +add test 10.10.19.246 +add test 10.10.19.247 +add test 10.10.19.248 +add test 10.10.19.249 +add test 10.10.19.25 +add test 10.10.19.250 +add test 10.10.19.251 +add test 10.10.19.252 +add test 10.10.19.253 +add test 10.10.19.254 +add test 10.10.19.255 +add test 10.10.19.26 +add test 10.10.19.27 +add test 10.10.19.28 +add test 10.10.19.29 +add test 10.10.19.3 +add test 10.10.19.30 +add test 10.10.19.31 +add test 10.10.19.32 +add test 10.10.19.33 +add test 10.10.19.34 +add test 10.10.19.35 +add test 10.10.19.36 +add test 10.10.19.37 +add test 10.10.19.38 +add test 10.10.19.39 +add test 10.10.19.4 +add test 10.10.19.40 +add test 10.10.19.41 +add test 10.10.19.42 +add test 10.10.19.43 +add test 10.10.19.44 +add test 10.10.19.45 +add test 10.10.19.46 +add test 10.10.19.47 +add test 10.10.19.48 +add test 10.10.19.49 +add test 10.10.19.5 +add test 10.10.19.50 +add test 10.10.19.51 +add test 10.10.19.52 +add test 10.10.19.53 +add test 10.10.19.54 +add test 10.10.19.55 +add test 10.10.19.56 +add test 10.10.19.57 +add test 10.10.19.58 +add test 10.10.19.59 +add test 10.10.19.6 +add test 10.10.19.60 +add test 10.10.19.61 +add test 10.10.19.62 +add test 10.10.19.63 +add test 10.10.19.64 +add test 10.10.19.65 +add test 10.10.19.66 +add test 10.10.19.67 +add test 10.10.19.68 +add test 10.10.19.69 +add test 10.10.19.7 +add test 10.10.19.70 +add test 10.10.19.71 +add test 10.10.19.72 +add test 10.10.19.73 +add test 10.10.19.74 +add test 10.10.19.75 +add test 10.10.19.76 +add test 10.10.19.77 +add test 10.10.19.78 +add test 10.10.19.79 +add test 10.10.19.8 +add test 10.10.19.80 +add test 10.10.19.81 +add test 10.10.19.82 +add test 10.10.19.83 +add test 10.10.19.84 +add test 10.10.19.85 +add test 10.10.19.86 +add test 10.10.19.87 +add test 10.10.19.88 +add test 10.10.19.89 +add test 10.10.19.9 +add test 10.10.19.90 +add test 10.10.19.91 +add test 10.10.19.92 +add test 10.10.19.93 +add test 10.10.19.94 +add test 10.10.19.95 +add test 10.10.19.96 +add test 10.10.19.97 +add test 10.10.19.98 +add test 10.10.19.99 +add test 10.10.190.0 +add test 10.10.190.1 +add test 10.10.190.10 +add test 10.10.190.100 +add test 10.10.190.101 +add test 10.10.190.102 +add test 10.10.190.103 +add test 10.10.190.104 +add test 10.10.190.105 +add test 10.10.190.106 +add test 10.10.190.107 +add test 10.10.190.108 +add test 10.10.190.109 +add test 10.10.190.11 +add test 10.10.190.110 +add test 10.10.190.111 +add test 10.10.190.112 +add test 10.10.190.113 +add test 10.10.190.114 +add test 10.10.190.115 +add test 10.10.190.116 +add test 10.10.190.117 +add test 10.10.190.118 +add test 10.10.190.119 +add test 10.10.190.12 +add test 10.10.190.120 +add test 10.10.190.121 +add test 10.10.190.122 +add test 10.10.190.123 +add test 10.10.190.124 +add test 10.10.190.125 +add test 10.10.190.126 +add test 10.10.190.127 +add test 10.10.190.128 +add test 10.10.190.129 +add test 10.10.190.13 +add test 10.10.190.130 +add test 10.10.190.131 +add test 10.10.190.132 +add test 10.10.190.133 +add test 10.10.190.134 +add test 10.10.190.135 +add test 10.10.190.136 +add test 10.10.190.137 +add test 10.10.190.138 +add test 10.10.190.139 +add test 10.10.190.14 +add test 10.10.190.140 +add test 10.10.190.141 +add test 10.10.190.142 +add test 10.10.190.143 +add test 10.10.190.144 +add test 10.10.190.145 +add test 10.10.190.146 +add test 10.10.190.147 +add test 10.10.190.148 +add test 10.10.190.149 +add test 10.10.190.15 +add test 10.10.190.150 +add test 10.10.190.151 +add test 10.10.190.152 +add test 10.10.190.153 +add test 10.10.190.154 +add test 10.10.190.155 +add test 10.10.190.156 +add test 10.10.190.157 +add test 10.10.190.158 +add test 10.10.190.159 +add test 10.10.190.16 +add test 10.10.190.160 +add test 10.10.190.161 +add test 10.10.190.162 +add test 10.10.190.163 +add test 10.10.190.164 +add test 10.10.190.165 +add test 10.10.190.166 +add test 10.10.190.167 +add test 10.10.190.168 +add test 10.10.190.169 +add test 10.10.190.17 +add test 10.10.190.170 +add test 10.10.190.171 +add test 10.10.190.172 +add test 10.10.190.173 +add test 10.10.190.174 +add test 10.10.190.175 +add test 10.10.190.176 +add test 10.10.190.177 +add test 10.10.190.178 +add test 10.10.190.179 +add test 10.10.190.18 +add test 10.10.190.180 +add test 10.10.190.181 +add test 10.10.190.182 +add test 10.10.190.183 +add test 10.10.190.184 +add test 10.10.190.185 +add test 10.10.190.186 +add test 10.10.190.187 +add test 10.10.190.188 +add test 10.10.190.189 +add test 10.10.190.19 +add test 10.10.190.190 +add test 10.10.190.191 +add test 10.10.190.192 +add test 10.10.190.193 +add test 10.10.190.194 +add test 10.10.190.195 +add test 10.10.190.196 +add test 10.10.190.197 +add test 10.10.190.198 +add test 10.10.190.199 +add test 10.10.190.2 +add test 10.10.190.20 +add test 10.10.190.200 +add test 10.10.190.201 +add test 10.10.190.202 +add test 10.10.190.203 +add test 10.10.190.204 +add test 10.10.190.205 +add test 10.10.190.206 +add test 10.10.190.207 +add test 10.10.190.208 +add test 10.10.190.209 +add test 10.10.190.21 +add test 10.10.190.210 +add test 10.10.190.211 +add test 10.10.190.212 +add test 10.10.190.213 +add test 10.10.190.214 +add test 10.10.190.215 +add test 10.10.190.216 +add test 10.10.190.217 +add test 10.10.190.218 +add test 10.10.190.219 +add test 10.10.190.22 +add test 10.10.190.220 +add test 10.10.190.221 +add test 10.10.190.222 +add test 10.10.190.223 +add test 10.10.190.224 +add test 10.10.190.225 +add test 10.10.190.226 +add test 10.10.190.227 +add test 10.10.190.228 +add test 10.10.190.229 +add test 10.10.190.23 +add test 10.10.190.230 +add test 10.10.190.231 +add test 10.10.190.232 +add test 10.10.190.233 +add test 10.10.190.234 +add test 10.10.190.235 +add test 10.10.190.236 +add test 10.10.190.237 +add test 10.10.190.238 +add test 10.10.190.239 +add test 10.10.190.24 +add test 10.10.190.240 +add test 10.10.190.241 +add test 10.10.190.242 +add test 10.10.190.243 +add test 10.10.190.244 +add test 10.10.190.245 +add test 10.10.190.246 +add test 10.10.190.247 +add test 10.10.190.248 +add test 10.10.190.249 +add test 10.10.190.25 +add test 10.10.190.250 +add test 10.10.190.251 +add test 10.10.190.252 +add test 10.10.190.253 +add test 10.10.190.254 +add test 10.10.190.255 +add test 10.10.190.26 +add test 10.10.190.27 +add test 10.10.190.28 +add test 10.10.190.29 +add test 10.10.190.3 +add test 10.10.190.30 +add test 10.10.190.31 +add test 10.10.190.32 +add test 10.10.190.33 +add test 10.10.190.34 +add test 10.10.190.35 +add test 10.10.190.36 +add test 10.10.190.37 +add test 10.10.190.38 +add test 10.10.190.39 +add test 10.10.190.4 +add test 10.10.190.40 +add test 10.10.190.41 +add test 10.10.190.42 +add test 10.10.190.43 +add test 10.10.190.44 +add test 10.10.190.45 +add test 10.10.190.46 +add test 10.10.190.47 +add test 10.10.190.48 +add test 10.10.190.49 +add test 10.10.190.5 +add test 10.10.190.50 +add test 10.10.190.51 +add test 10.10.190.52 +add test 10.10.190.53 +add test 10.10.190.54 +add test 10.10.190.55 +add test 10.10.190.56 +add test 10.10.190.57 +add test 10.10.190.58 +add test 10.10.190.59 +add test 10.10.190.6 +add test 10.10.190.60 +add test 10.10.190.61 +add test 10.10.190.62 +add test 10.10.190.63 +add test 10.10.190.64 +add test 10.10.190.65 +add test 10.10.190.66 +add test 10.10.190.67 +add test 10.10.190.68 +add test 10.10.190.69 +add test 10.10.190.7 +add test 10.10.190.70 +add test 10.10.190.71 +add test 10.10.190.72 +add test 10.10.190.73 +add test 10.10.190.74 +add test 10.10.190.75 +add test 10.10.190.76 +add test 10.10.190.77 +add test 10.10.190.78 +add test 10.10.190.79 +add test 10.10.190.8 +add test 10.10.190.80 +add test 10.10.190.81 +add test 10.10.190.82 +add test 10.10.190.83 +add test 10.10.190.84 +add test 10.10.190.85 +add test 10.10.190.86 +add test 10.10.190.87 +add test 10.10.190.88 +add test 10.10.190.89 +add test 10.10.190.9 +add test 10.10.190.90 +add test 10.10.190.91 +add test 10.10.190.92 +add test 10.10.190.93 +add test 10.10.190.94 +add test 10.10.190.95 +add test 10.10.190.96 +add test 10.10.190.97 +add test 10.10.190.98 +add test 10.10.190.99 +add test 10.10.191.0 +add test 10.10.191.1 +add test 10.10.191.10 +add test 10.10.191.100 +add test 10.10.191.101 +add test 10.10.191.102 +add test 10.10.191.103 +add test 10.10.191.104 +add test 10.10.191.105 +add test 10.10.191.106 +add test 10.10.191.107 +add test 10.10.191.108 +add test 10.10.191.109 +add test 10.10.191.11 +add test 10.10.191.110 +add test 10.10.191.111 +add test 10.10.191.112 +add test 10.10.191.113 +add test 10.10.191.114 +add test 10.10.191.115 +add test 10.10.191.116 +add test 10.10.191.117 +add test 10.10.191.118 +add test 10.10.191.119 +add test 10.10.191.12 +add test 10.10.191.120 +add test 10.10.191.121 +add test 10.10.191.122 +add test 10.10.191.123 +add test 10.10.191.124 +add test 10.10.191.125 +add test 10.10.191.126 +add test 10.10.191.127 +add test 10.10.191.128 +add test 10.10.191.129 +add test 10.10.191.13 +add test 10.10.191.130 +add test 10.10.191.131 +add test 10.10.191.132 +add test 10.10.191.133 +add test 10.10.191.134 +add test 10.10.191.135 +add test 10.10.191.136 +add test 10.10.191.137 +add test 10.10.191.138 +add test 10.10.191.139 +add test 10.10.191.14 +add test 10.10.191.140 +add test 10.10.191.141 +add test 10.10.191.142 +add test 10.10.191.143 +add test 10.10.191.144 +add test 10.10.191.145 +add test 10.10.191.146 +add test 10.10.191.147 +add test 10.10.191.148 +add test 10.10.191.149 +add test 10.10.191.15 +add test 10.10.191.150 +add test 10.10.191.151 +add test 10.10.191.152 +add test 10.10.191.153 +add test 10.10.191.154 +add test 10.10.191.155 +add test 10.10.191.156 +add test 10.10.191.157 +add test 10.10.191.158 +add test 10.10.191.159 +add test 10.10.191.16 +add test 10.10.191.160 +add test 10.10.191.161 +add test 10.10.191.162 +add test 10.10.191.163 +add test 10.10.191.164 +add test 10.10.191.165 +add test 10.10.191.166 +add test 10.10.191.167 +add test 10.10.191.168 +add test 10.10.191.169 +add test 10.10.191.17 +add test 10.10.191.170 +add test 10.10.191.171 +add test 10.10.191.172 +add test 10.10.191.173 +add test 10.10.191.174 +add test 10.10.191.175 +add test 10.10.191.176 +add test 10.10.191.177 +add test 10.10.191.178 +add test 10.10.191.179 +add test 10.10.191.18 +add test 10.10.191.180 +add test 10.10.191.181 +add test 10.10.191.182 +add test 10.10.191.183 +add test 10.10.191.184 +add test 10.10.191.185 +add test 10.10.191.186 +add test 10.10.191.187 +add test 10.10.191.188 +add test 10.10.191.189 +add test 10.10.191.19 +add test 10.10.191.190 +add test 10.10.191.191 +add test 10.10.191.192 +add test 10.10.191.193 +add test 10.10.191.194 +add test 10.10.191.195 +add test 10.10.191.196 +add test 10.10.191.197 +add test 10.10.191.198 +add test 10.10.191.199 +add test 10.10.191.2 +add test 10.10.191.20 +add test 10.10.191.200 +add test 10.10.191.201 +add test 10.10.191.202 +add test 10.10.191.203 +add test 10.10.191.204 +add test 10.10.191.205 +add test 10.10.191.206 +add test 10.10.191.207 +add test 10.10.191.208 +add test 10.10.191.209 +add test 10.10.191.21 +add test 10.10.191.210 +add test 10.10.191.211 +add test 10.10.191.212 +add test 10.10.191.213 +add test 10.10.191.214 +add test 10.10.191.215 +add test 10.10.191.216 +add test 10.10.191.217 +add test 10.10.191.218 +add test 10.10.191.219 +add test 10.10.191.22 +add test 10.10.191.220 +add test 10.10.191.221 +add test 10.10.191.222 +add test 10.10.191.223 +add test 10.10.191.224 +add test 10.10.191.225 +add test 10.10.191.226 +add test 10.10.191.227 +add test 10.10.191.228 +add test 10.10.191.229 +add test 10.10.191.23 +add test 10.10.191.230 +add test 10.10.191.231 +add test 10.10.191.232 +add test 10.10.191.233 +add test 10.10.191.234 +add test 10.10.191.235 +add test 10.10.191.236 +add test 10.10.191.237 +add test 10.10.191.238 +add test 10.10.191.239 +add test 10.10.191.24 +add test 10.10.191.240 +add test 10.10.191.241 +add test 10.10.191.242 +add test 10.10.191.243 +add test 10.10.191.244 +add test 10.10.191.245 +add test 10.10.191.246 +add test 10.10.191.247 +add test 10.10.191.248 +add test 10.10.191.249 +add test 10.10.191.25 +add test 10.10.191.250 +add test 10.10.191.251 +add test 10.10.191.252 +add test 10.10.191.253 +add test 10.10.191.254 +add test 10.10.191.255 +add test 10.10.191.26 +add test 10.10.191.27 +add test 10.10.191.28 +add test 10.10.191.29 +add test 10.10.191.3 +add test 10.10.191.30 +add test 10.10.191.31 +add test 10.10.191.32 +add test 10.10.191.33 +add test 10.10.191.34 +add test 10.10.191.35 +add test 10.10.191.36 +add test 10.10.191.37 +add test 10.10.191.38 +add test 10.10.191.39 +add test 10.10.191.4 +add test 10.10.191.40 +add test 10.10.191.41 +add test 10.10.191.42 +add test 10.10.191.43 +add test 10.10.191.44 +add test 10.10.191.45 +add test 10.10.191.46 +add test 10.10.191.47 +add test 10.10.191.48 +add test 10.10.191.49 +add test 10.10.191.5 +add test 10.10.191.50 +add test 10.10.191.51 +add test 10.10.191.52 +add test 10.10.191.53 +add test 10.10.191.54 +add test 10.10.191.55 +add test 10.10.191.56 +add test 10.10.191.57 +add test 10.10.191.58 +add test 10.10.191.59 +add test 10.10.191.6 +add test 10.10.191.60 +add test 10.10.191.61 +add test 10.10.191.62 +add test 10.10.191.63 +add test 10.10.191.64 +add test 10.10.191.65 +add test 10.10.191.66 +add test 10.10.191.67 +add test 10.10.191.68 +add test 10.10.191.69 +add test 10.10.191.7 +add test 10.10.191.70 +add test 10.10.191.71 +add test 10.10.191.72 +add test 10.10.191.73 +add test 10.10.191.74 +add test 10.10.191.75 +add test 10.10.191.76 +add test 10.10.191.77 +add test 10.10.191.78 +add test 10.10.191.79 +add test 10.10.191.8 +add test 10.10.191.80 +add test 10.10.191.81 +add test 10.10.191.82 +add test 10.10.191.83 +add test 10.10.191.84 +add test 10.10.191.85 +add test 10.10.191.86 +add test 10.10.191.87 +add test 10.10.191.88 +add test 10.10.191.89 +add test 10.10.191.9 +add test 10.10.191.90 +add test 10.10.191.91 +add test 10.10.191.92 +add test 10.10.191.93 +add test 10.10.191.94 +add test 10.10.191.95 +add test 10.10.191.96 +add test 10.10.191.97 +add test 10.10.191.98 +add test 10.10.191.99 +add test 10.10.192.0 +add test 10.10.192.1 +add test 10.10.192.10 +add test 10.10.192.100 +add test 10.10.192.101 +add test 10.10.192.102 +add test 10.10.192.103 +add test 10.10.192.104 +add test 10.10.192.105 +add test 10.10.192.106 +add test 10.10.192.107 +add test 10.10.192.108 +add test 10.10.192.109 +add test 10.10.192.11 +add test 10.10.192.110 +add test 10.10.192.111 +add test 10.10.192.112 +add test 10.10.192.113 +add test 10.10.192.114 +add test 10.10.192.115 +add test 10.10.192.116 +add test 10.10.192.117 +add test 10.10.192.118 +add test 10.10.192.119 +add test 10.10.192.12 +add test 10.10.192.120 +add test 10.10.192.121 +add test 10.10.192.122 +add test 10.10.192.123 +add test 10.10.192.124 +add test 10.10.192.125 +add test 10.10.192.126 +add test 10.10.192.127 +add test 10.10.192.128 +add test 10.10.192.129 +add test 10.10.192.13 +add test 10.10.192.130 +add test 10.10.192.131 +add test 10.10.192.132 +add test 10.10.192.133 +add test 10.10.192.134 +add test 10.10.192.135 +add test 10.10.192.136 +add test 10.10.192.137 +add test 10.10.192.138 +add test 10.10.192.139 +add test 10.10.192.14 +add test 10.10.192.140 +add test 10.10.192.141 +add test 10.10.192.142 +add test 10.10.192.143 +add test 10.10.192.144 +add test 10.10.192.145 +add test 10.10.192.146 +add test 10.10.192.147 +add test 10.10.192.148 +add test 10.10.192.149 +add test 10.10.192.15 +add test 10.10.192.150 +add test 10.10.192.151 +add test 10.10.192.152 +add test 10.10.192.153 +add test 10.10.192.154 +add test 10.10.192.155 +add test 10.10.192.156 +add test 10.10.192.157 +add test 10.10.192.158 +add test 10.10.192.159 +add test 10.10.192.16 +add test 10.10.192.160 +add test 10.10.192.161 +add test 10.10.192.162 +add test 10.10.192.163 +add test 10.10.192.164 +add test 10.10.192.165 +add test 10.10.192.166 +add test 10.10.192.167 +add test 10.10.192.168 +add test 10.10.192.169 +add test 10.10.192.17 +add test 10.10.192.170 +add test 10.10.192.171 +add test 10.10.192.172 +add test 10.10.192.173 +add test 10.10.192.174 +add test 10.10.192.175 +add test 10.10.192.176 +add test 10.10.192.177 +add test 10.10.192.178 +add test 10.10.192.179 +add test 10.10.192.18 +add test 10.10.192.180 +add test 10.10.192.181 +add test 10.10.192.182 +add test 10.10.192.183 +add test 10.10.192.184 +add test 10.10.192.185 +add test 10.10.192.186 +add test 10.10.192.187 +add test 10.10.192.188 +add test 10.10.192.189 +add test 10.10.192.19 +add test 10.10.192.190 +add test 10.10.192.191 +add test 10.10.192.192 +add test 10.10.192.193 +add test 10.10.192.194 +add test 10.10.192.195 +add test 10.10.192.196 +add test 10.10.192.197 +add test 10.10.192.198 +add test 10.10.192.199 +add test 10.10.192.2 +add test 10.10.192.20 +add test 10.10.192.200 +add test 10.10.192.201 +add test 10.10.192.202 +add test 10.10.192.203 +add test 10.10.192.204 +add test 10.10.192.205 +add test 10.10.192.206 +add test 10.10.192.207 +add test 10.10.192.208 +add test 10.10.192.209 +add test 10.10.192.21 +add test 10.10.192.210 +add test 10.10.192.211 +add test 10.10.192.212 +add test 10.10.192.213 +add test 10.10.192.214 +add test 10.10.192.215 +add test 10.10.192.216 +add test 10.10.192.217 +add test 10.10.192.218 +add test 10.10.192.219 +add test 10.10.192.22 +add test 10.10.192.220 +add test 10.10.192.221 +add test 10.10.192.222 +add test 10.10.192.223 +add test 10.10.192.224 +add test 10.10.192.225 +add test 10.10.192.226 +add test 10.10.192.227 +add test 10.10.192.228 +add test 10.10.192.229 +add test 10.10.192.23 +add test 10.10.192.230 +add test 10.10.192.231 +add test 10.10.192.232 +add test 10.10.192.233 +add test 10.10.192.234 +add test 10.10.192.235 +add test 10.10.192.236 +add test 10.10.192.237 +add test 10.10.192.238 +add test 10.10.192.239 +add test 10.10.192.24 +add test 10.10.192.240 +add test 10.10.192.241 +add test 10.10.192.242 +add test 10.10.192.243 +add test 10.10.192.244 +add test 10.10.192.245 +add test 10.10.192.246 +add test 10.10.192.247 +add test 10.10.192.248 +add test 10.10.192.249 +add test 10.10.192.25 +add test 10.10.192.250 +add test 10.10.192.251 +add test 10.10.192.252 +add test 10.10.192.253 +add test 10.10.192.254 +add test 10.10.192.255 +add test 10.10.192.26 +add test 10.10.192.27 +add test 10.10.192.28 +add test 10.10.192.29 +add test 10.10.192.3 +add test 10.10.192.30 +add test 10.10.192.31 +add test 10.10.192.32 +add test 10.10.192.33 +add test 10.10.192.34 +add test 10.10.192.35 +add test 10.10.192.36 +add test 10.10.192.37 +add test 10.10.192.38 +add test 10.10.192.39 +add test 10.10.192.4 +add test 10.10.192.40 +add test 10.10.192.41 +add test 10.10.192.42 +add test 10.10.192.43 +add test 10.10.192.44 +add test 10.10.192.45 +add test 10.10.192.46 +add test 10.10.192.47 +add test 10.10.192.48 +add test 10.10.192.49 +add test 10.10.192.5 +add test 10.10.192.50 +add test 10.10.192.51 +add test 10.10.192.52 +add test 10.10.192.53 +add test 10.10.192.54 +add test 10.10.192.55 +add test 10.10.192.56 +add test 10.10.192.57 +add test 10.10.192.58 +add test 10.10.192.59 +add test 10.10.192.6 +add test 10.10.192.60 +add test 10.10.192.61 +add test 10.10.192.62 +add test 10.10.192.63 +add test 10.10.192.64 +add test 10.10.192.65 +add test 10.10.192.66 +add test 10.10.192.67 +add test 10.10.192.68 +add test 10.10.192.69 +add test 10.10.192.7 +add test 10.10.192.70 +add test 10.10.192.71 +add test 10.10.192.72 +add test 10.10.192.73 +add test 10.10.192.74 +add test 10.10.192.75 +add test 10.10.192.76 +add test 10.10.192.77 +add test 10.10.192.78 +add test 10.10.192.79 +add test 10.10.192.8 +add test 10.10.192.80 +add test 10.10.192.81 +add test 10.10.192.82 +add test 10.10.192.83 +add test 10.10.192.84 +add test 10.10.192.85 +add test 10.10.192.86 +add test 10.10.192.87 +add test 10.10.192.88 +add test 10.10.192.89 +add test 10.10.192.9 +add test 10.10.192.90 +add test 10.10.192.91 +add test 10.10.192.92 +add test 10.10.192.93 +add test 10.10.192.94 +add test 10.10.192.95 +add test 10.10.192.96 +add test 10.10.192.97 +add test 10.10.192.98 +add test 10.10.192.99 +add test 10.10.193.0 +add test 10.10.193.1 +add test 10.10.193.10 +add test 10.10.193.100 +add test 10.10.193.101 +add test 10.10.193.102 +add test 10.10.193.103 +add test 10.10.193.104 +add test 10.10.193.105 +add test 10.10.193.106 +add test 10.10.193.107 +add test 10.10.193.108 +add test 10.10.193.109 +add test 10.10.193.11 +add test 10.10.193.110 +add test 10.10.193.111 +add test 10.10.193.112 +add test 10.10.193.113 +add test 10.10.193.114 +add test 10.10.193.115 +add test 10.10.193.116 +add test 10.10.193.117 +add test 10.10.193.118 +add test 10.10.193.119 +add test 10.10.193.12 +add test 10.10.193.120 +add test 10.10.193.121 +add test 10.10.193.122 +add test 10.10.193.123 +add test 10.10.193.124 +add test 10.10.193.125 +add test 10.10.193.126 +add test 10.10.193.127 +add test 10.10.193.128 +add test 10.10.193.129 +add test 10.10.193.13 +add test 10.10.193.130 +add test 10.10.193.131 +add test 10.10.193.132 +add test 10.10.193.133 +add test 10.10.193.134 +add test 10.10.193.135 +add test 10.10.193.136 +add test 10.10.193.137 +add test 10.10.193.138 +add test 10.10.193.139 +add test 10.10.193.14 +add test 10.10.193.140 +add test 10.10.193.141 +add test 10.10.193.142 +add test 10.10.193.143 +add test 10.10.193.144 +add test 10.10.193.145 +add test 10.10.193.146 +add test 10.10.193.147 +add test 10.10.193.148 +add test 10.10.193.149 +add test 10.10.193.15 +add test 10.10.193.150 +add test 10.10.193.151 +add test 10.10.193.152 +add test 10.10.193.153 +add test 10.10.193.154 +add test 10.10.193.155 +add test 10.10.193.156 +add test 10.10.193.157 +add test 10.10.193.158 +add test 10.10.193.159 +add test 10.10.193.16 +add test 10.10.193.160 +add test 10.10.193.161 +add test 10.10.193.162 +add test 10.10.193.163 +add test 10.10.193.164 +add test 10.10.193.165 +add test 10.10.193.166 +add test 10.10.193.167 +add test 10.10.193.168 +add test 10.10.193.169 +add test 10.10.193.17 +add test 10.10.193.170 +add test 10.10.193.171 +add test 10.10.193.172 +add test 10.10.193.173 +add test 10.10.193.174 +add test 10.10.193.175 +add test 10.10.193.176 +add test 10.10.193.177 +add test 10.10.193.178 +add test 10.10.193.179 +add test 10.10.193.18 +add test 10.10.193.180 +add test 10.10.193.181 +add test 10.10.193.182 +add test 10.10.193.183 +add test 10.10.193.184 +add test 10.10.193.185 +add test 10.10.193.186 +add test 10.10.193.187 +add test 10.10.193.188 +add test 10.10.193.189 +add test 10.10.193.19 +add test 10.10.193.190 +add test 10.10.193.191 +add test 10.10.193.192 +add test 10.10.193.193 +add test 10.10.193.194 +add test 10.10.193.195 +add test 10.10.193.196 +add test 10.10.193.197 +add test 10.10.193.198 +add test 10.10.193.199 +add test 10.10.193.2 +add test 10.10.193.20 +add test 10.10.193.200 +add test 10.10.193.201 +add test 10.10.193.202 +add test 10.10.193.203 +add test 10.10.193.204 +add test 10.10.193.205 +add test 10.10.193.206 +add test 10.10.193.207 +add test 10.10.193.208 +add test 10.10.193.209 +add test 10.10.193.21 +add test 10.10.193.210 +add test 10.10.193.211 +add test 10.10.193.212 +add test 10.10.193.213 +add test 10.10.193.214 +add test 10.10.193.215 +add test 10.10.193.216 +add test 10.10.193.217 +add test 10.10.193.218 +add test 10.10.193.219 +add test 10.10.193.22 +add test 10.10.193.220 +add test 10.10.193.221 +add test 10.10.193.222 +add test 10.10.193.223 +add test 10.10.193.224 +add test 10.10.193.225 +add test 10.10.193.226 +add test 10.10.193.227 +add test 10.10.193.228 +add test 10.10.193.229 +add test 10.10.193.23 +add test 10.10.193.230 +add test 10.10.193.231 +add test 10.10.193.232 +add test 10.10.193.233 +add test 10.10.193.234 +add test 10.10.193.235 +add test 10.10.193.236 +add test 10.10.193.237 +add test 10.10.193.238 +add test 10.10.193.239 +add test 10.10.193.24 +add test 10.10.193.240 +add test 10.10.193.241 +add test 10.10.193.242 +add test 10.10.193.243 +add test 10.10.193.244 +add test 10.10.193.245 +add test 10.10.193.246 +add test 10.10.193.247 +add test 10.10.193.248 +add test 10.10.193.249 +add test 10.10.193.25 +add test 10.10.193.250 +add test 10.10.193.251 +add test 10.10.193.252 +add test 10.10.193.253 +add test 10.10.193.254 +add test 10.10.193.255 +add test 10.10.193.26 +add test 10.10.193.27 +add test 10.10.193.28 +add test 10.10.193.29 +add test 10.10.193.3 +add test 10.10.193.30 +add test 10.10.193.31 +add test 10.10.193.32 +add test 10.10.193.33 +add test 10.10.193.34 +add test 10.10.193.35 +add test 10.10.193.36 +add test 10.10.193.37 +add test 10.10.193.38 +add test 10.10.193.39 +add test 10.10.193.4 +add test 10.10.193.40 +add test 10.10.193.41 +add test 10.10.193.42 +add test 10.10.193.43 +add test 10.10.193.44 +add test 10.10.193.45 +add test 10.10.193.46 +add test 10.10.193.47 +add test 10.10.193.48 +add test 10.10.193.49 +add test 10.10.193.5 +add test 10.10.193.50 +add test 10.10.193.51 +add test 10.10.193.52 +add test 10.10.193.53 +add test 10.10.193.54 +add test 10.10.193.55 +add test 10.10.193.56 +add test 10.10.193.57 +add test 10.10.193.58 +add test 10.10.193.59 +add test 10.10.193.6 +add test 10.10.193.60 +add test 10.10.193.61 +add test 10.10.193.62 +add test 10.10.193.63 +add test 10.10.193.64 +add test 10.10.193.65 +add test 10.10.193.66 +add test 10.10.193.67 +add test 10.10.193.68 +add test 10.10.193.69 +add test 10.10.193.7 +add test 10.10.193.70 +add test 10.10.193.71 +add test 10.10.193.72 +add test 10.10.193.73 +add test 10.10.193.74 +add test 10.10.193.75 +add test 10.10.193.76 +add test 10.10.193.77 +add test 10.10.193.78 +add test 10.10.193.79 +add test 10.10.193.8 +add test 10.10.193.80 +add test 10.10.193.81 +add test 10.10.193.82 +add test 10.10.193.83 +add test 10.10.193.84 +add test 10.10.193.85 +add test 10.10.193.86 +add test 10.10.193.87 +add test 10.10.193.88 +add test 10.10.193.89 +add test 10.10.193.9 +add test 10.10.193.90 +add test 10.10.193.91 +add test 10.10.193.92 +add test 10.10.193.93 +add test 10.10.193.94 +add test 10.10.193.95 +add test 10.10.193.96 +add test 10.10.193.97 +add test 10.10.193.98 +add test 10.10.193.99 +add test 10.10.194.0 +add test 10.10.194.1 +add test 10.10.194.10 +add test 10.10.194.100 +add test 10.10.194.101 +add test 10.10.194.102 +add test 10.10.194.103 +add test 10.10.194.104 +add test 10.10.194.105 +add test 10.10.194.106 +add test 10.10.194.107 +add test 10.10.194.108 +add test 10.10.194.109 +add test 10.10.194.11 +add test 10.10.194.110 +add test 10.10.194.111 +add test 10.10.194.112 +add test 10.10.194.113 +add test 10.10.194.114 +add test 10.10.194.115 +add test 10.10.194.116 +add test 10.10.194.117 +add test 10.10.194.118 +add test 10.10.194.119 +add test 10.10.194.12 +add test 10.10.194.120 +add test 10.10.194.121 +add test 10.10.194.122 +add test 10.10.194.123 +add test 10.10.194.124 +add test 10.10.194.125 +add test 10.10.194.126 +add test 10.10.194.127 +add test 10.10.194.128 +add test 10.10.194.129 +add test 10.10.194.13 +add test 10.10.194.130 +add test 10.10.194.131 +add test 10.10.194.132 +add test 10.10.194.133 +add test 10.10.194.134 +add test 10.10.194.135 +add test 10.10.194.136 +add test 10.10.194.137 +add test 10.10.194.138 +add test 10.10.194.139 +add test 10.10.194.14 +add test 10.10.194.140 +add test 10.10.194.141 +add test 10.10.194.142 +add test 10.10.194.143 +add test 10.10.194.144 +add test 10.10.194.145 +add test 10.10.194.146 +add test 10.10.194.147 +add test 10.10.194.148 +add test 10.10.194.149 +add test 10.10.194.15 +add test 10.10.194.150 +add test 10.10.194.151 +add test 10.10.194.152 +add test 10.10.194.153 +add test 10.10.194.154 +add test 10.10.194.155 +add test 10.10.194.156 +add test 10.10.194.157 +add test 10.10.194.158 +add test 10.10.194.159 +add test 10.10.194.16 +add test 10.10.194.160 +add test 10.10.194.161 +add test 10.10.194.162 +add test 10.10.194.163 +add test 10.10.194.164 +add test 10.10.194.165 +add test 10.10.194.166 +add test 10.10.194.167 +add test 10.10.194.168 +add test 10.10.194.169 +add test 10.10.194.17 +add test 10.10.194.170 +add test 10.10.194.171 +add test 10.10.194.172 +add test 10.10.194.173 +add test 10.10.194.174 +add test 10.10.194.175 +add test 10.10.194.176 +add test 10.10.194.177 +add test 10.10.194.178 +add test 10.10.194.179 +add test 10.10.194.18 +add test 10.10.194.180 +add test 10.10.194.181 +add test 10.10.194.182 +add test 10.10.194.183 +add test 10.10.194.184 +add test 10.10.194.185 +add test 10.10.194.186 +add test 10.10.194.187 +add test 10.10.194.188 +add test 10.10.194.189 +add test 10.10.194.19 +add test 10.10.194.190 +add test 10.10.194.191 +add test 10.10.194.192 +add test 10.10.194.193 +add test 10.10.194.194 +add test 10.10.194.195 +add test 10.10.194.196 +add test 10.10.194.197 +add test 10.10.194.198 +add test 10.10.194.199 +add test 10.10.194.2 +add test 10.10.194.20 +add test 10.10.194.200 +add test 10.10.194.201 +add test 10.10.194.202 +add test 10.10.194.203 +add test 10.10.194.204 +add test 10.10.194.205 +add test 10.10.194.206 +add test 10.10.194.207 +add test 10.10.194.208 +add test 10.10.194.209 +add test 10.10.194.21 +add test 10.10.194.210 +add test 10.10.194.211 +add test 10.10.194.212 +add test 10.10.194.213 +add test 10.10.194.214 +add test 10.10.194.215 +add test 10.10.194.216 +add test 10.10.194.217 +add test 10.10.194.218 +add test 10.10.194.219 +add test 10.10.194.22 +add test 10.10.194.220 +add test 10.10.194.221 +add test 10.10.194.222 +add test 10.10.194.223 +add test 10.10.194.224 +add test 10.10.194.225 +add test 10.10.194.226 +add test 10.10.194.227 +add test 10.10.194.228 +add test 10.10.194.229 +add test 10.10.194.23 +add test 10.10.194.230 +add test 10.10.194.231 +add test 10.10.194.232 +add test 10.10.194.233 +add test 10.10.194.234 +add test 10.10.194.235 +add test 10.10.194.236 +add test 10.10.194.237 +add test 10.10.194.238 +add test 10.10.194.239 +add test 10.10.194.24 +add test 10.10.194.240 +add test 10.10.194.241 +add test 10.10.194.242 +add test 10.10.194.243 +add test 10.10.194.244 +add test 10.10.194.245 +add test 10.10.194.246 +add test 10.10.194.247 +add test 10.10.194.248 +add test 10.10.194.249 +add test 10.10.194.25 +add test 10.10.194.250 +add test 10.10.194.251 +add test 10.10.194.252 +add test 10.10.194.253 +add test 10.10.194.254 +add test 10.10.194.255 +add test 10.10.194.26 +add test 10.10.194.27 +add test 10.10.194.28 +add test 10.10.194.29 +add test 10.10.194.3 +add test 10.10.194.30 +add test 10.10.194.31 +add test 10.10.194.32 +add test 10.10.194.33 +add test 10.10.194.34 +add test 10.10.194.35 +add test 10.10.194.36 +add test 10.10.194.37 +add test 10.10.194.38 +add test 10.10.194.39 +add test 10.10.194.4 +add test 10.10.194.40 +add test 10.10.194.41 +add test 10.10.194.42 +add test 10.10.194.43 +add test 10.10.194.44 +add test 10.10.194.45 +add test 10.10.194.46 +add test 10.10.194.47 +add test 10.10.194.48 +add test 10.10.194.49 +add test 10.10.194.5 +add test 10.10.194.50 +add test 10.10.194.51 +add test 10.10.194.52 +add test 10.10.194.53 +add test 10.10.194.54 +add test 10.10.194.55 +add test 10.10.194.56 +add test 10.10.194.57 +add test 10.10.194.58 +add test 10.10.194.59 +add test 10.10.194.6 +add test 10.10.194.60 +add test 10.10.194.61 +add test 10.10.194.62 +add test 10.10.194.63 +add test 10.10.194.64 +add test 10.10.194.65 +add test 10.10.194.66 +add test 10.10.194.67 +add test 10.10.194.68 +add test 10.10.194.69 +add test 10.10.194.7 +add test 10.10.194.70 +add test 10.10.194.71 +add test 10.10.194.72 +add test 10.10.194.73 +add test 10.10.194.74 +add test 10.10.194.75 +add test 10.10.194.76 +add test 10.10.194.77 +add test 10.10.194.78 +add test 10.10.194.79 +add test 10.10.194.8 +add test 10.10.194.80 +add test 10.10.194.81 +add test 10.10.194.82 +add test 10.10.194.83 +add test 10.10.194.84 +add test 10.10.194.85 +add test 10.10.194.86 +add test 10.10.194.87 +add test 10.10.194.88 +add test 10.10.194.89 +add test 10.10.194.9 +add test 10.10.194.90 +add test 10.10.194.91 +add test 10.10.194.92 +add test 10.10.194.93 +add test 10.10.194.94 +add test 10.10.194.95 +add test 10.10.194.96 +add test 10.10.194.97 +add test 10.10.194.98 +add test 10.10.194.99 +add test 10.10.195.0 +add test 10.10.195.1 +add test 10.10.195.10 +add test 10.10.195.100 +add test 10.10.195.101 +add test 10.10.195.102 +add test 10.10.195.103 +add test 10.10.195.104 +add test 10.10.195.105 +add test 10.10.195.106 +add test 10.10.195.107 +add test 10.10.195.108 +add test 10.10.195.109 +add test 10.10.195.11 +add test 10.10.195.110 +add test 10.10.195.111 +add test 10.10.195.112 +add test 10.10.195.113 +add test 10.10.195.114 +add test 10.10.195.115 +add test 10.10.195.116 +add test 10.10.195.117 +add test 10.10.195.118 +add test 10.10.195.119 +add test 10.10.195.12 +add test 10.10.195.120 +add test 10.10.195.121 +add test 10.10.195.122 +add test 10.10.195.123 +add test 10.10.195.124 +add test 10.10.195.125 +add test 10.10.195.126 +add test 10.10.195.127 +add test 10.10.195.128 +add test 10.10.195.129 +add test 10.10.195.13 +add test 10.10.195.130 +add test 10.10.195.131 +add test 10.10.195.132 +add test 10.10.195.133 +add test 10.10.195.134 +add test 10.10.195.135 +add test 10.10.195.136 +add test 10.10.195.137 +add test 10.10.195.138 +add test 10.10.195.139 +add test 10.10.195.14 +add test 10.10.195.140 +add test 10.10.195.141 +add test 10.10.195.142 +add test 10.10.195.143 +add test 10.10.195.144 +add test 10.10.195.145 +add test 10.10.195.146 +add test 10.10.195.147 +add test 10.10.195.148 +add test 10.10.195.149 +add test 10.10.195.15 +add test 10.10.195.150 +add test 10.10.195.151 +add test 10.10.195.152 +add test 10.10.195.153 +add test 10.10.195.154 +add test 10.10.195.155 +add test 10.10.195.156 +add test 10.10.195.157 +add test 10.10.195.158 +add test 10.10.195.159 +add test 10.10.195.16 +add test 10.10.195.160 +add test 10.10.195.161 +add test 10.10.195.162 +add test 10.10.195.163 +add test 10.10.195.164 +add test 10.10.195.165 +add test 10.10.195.166 +add test 10.10.195.167 +add test 10.10.195.168 +add test 10.10.195.169 +add test 10.10.195.17 +add test 10.10.195.170 +add test 10.10.195.171 +add test 10.10.195.172 +add test 10.10.195.173 +add test 10.10.195.174 +add test 10.10.195.175 +add test 10.10.195.176 +add test 10.10.195.177 +add test 10.10.195.178 +add test 10.10.195.179 +add test 10.10.195.18 +add test 10.10.195.180 +add test 10.10.195.181 +add test 10.10.195.182 +add test 10.10.195.183 +add test 10.10.195.184 +add test 10.10.195.185 +add test 10.10.195.186 +add test 10.10.195.187 +add test 10.10.195.188 +add test 10.10.195.189 +add test 10.10.195.19 +add test 10.10.195.190 +add test 10.10.195.191 +add test 10.10.195.192 +add test 10.10.195.193 +add test 10.10.195.194 +add test 10.10.195.195 +add test 10.10.195.196 +add test 10.10.195.197 +add test 10.10.195.198 +add test 10.10.195.199 +add test 10.10.195.2 +add test 10.10.195.20 +add test 10.10.195.200 +add test 10.10.195.201 +add test 10.10.195.202 +add test 10.10.195.203 +add test 10.10.195.204 +add test 10.10.195.205 +add test 10.10.195.206 +add test 10.10.195.207 +add test 10.10.195.208 +add test 10.10.195.209 +add test 10.10.195.21 +add test 10.10.195.210 +add test 10.10.195.211 +add test 10.10.195.212 +add test 10.10.195.213 +add test 10.10.195.214 +add test 10.10.195.215 +add test 10.10.195.216 +add test 10.10.195.217 +add test 10.10.195.218 +add test 10.10.195.219 +add test 10.10.195.22 +add test 10.10.195.220 +add test 10.10.195.221 +add test 10.10.195.222 +add test 10.10.195.223 +add test 10.10.195.224 +add test 10.10.195.225 +add test 10.10.195.226 +add test 10.10.195.227 +add test 10.10.195.228 +add test 10.10.195.229 +add test 10.10.195.23 +add test 10.10.195.230 +add test 10.10.195.231 +add test 10.10.195.232 +add test 10.10.195.233 +add test 10.10.195.234 +add test 10.10.195.235 +add test 10.10.195.236 +add test 10.10.195.237 +add test 10.10.195.238 +add test 10.10.195.239 +add test 10.10.195.24 +add test 10.10.195.240 +add test 10.10.195.241 +add test 10.10.195.242 +add test 10.10.195.243 +add test 10.10.195.244 +add test 10.10.195.245 +add test 10.10.195.246 +add test 10.10.195.247 +add test 10.10.195.248 +add test 10.10.195.249 +add test 10.10.195.25 +add test 10.10.195.250 +add test 10.10.195.251 +add test 10.10.195.252 +add test 10.10.195.253 +add test 10.10.195.254 +add test 10.10.195.255 +add test 10.10.195.26 +add test 10.10.195.27 +add test 10.10.195.28 +add test 10.10.195.29 +add test 10.10.195.3 +add test 10.10.195.30 +add test 10.10.195.31 +add test 10.10.195.32 +add test 10.10.195.33 +add test 10.10.195.34 +add test 10.10.195.35 +add test 10.10.195.36 +add test 10.10.195.37 +add test 10.10.195.38 +add test 10.10.195.39 +add test 10.10.195.4 +add test 10.10.195.40 +add test 10.10.195.41 +add test 10.10.195.42 +add test 10.10.195.43 +add test 10.10.195.44 +add test 10.10.195.45 +add test 10.10.195.46 +add test 10.10.195.47 +add test 10.10.195.48 +add test 10.10.195.49 +add test 10.10.195.5 +add test 10.10.195.50 +add test 10.10.195.51 +add test 10.10.195.52 +add test 10.10.195.53 +add test 10.10.195.54 +add test 10.10.195.55 +add test 10.10.195.56 +add test 10.10.195.57 +add test 10.10.195.58 +add test 10.10.195.59 +add test 10.10.195.6 +add test 10.10.195.60 +add test 10.10.195.61 +add test 10.10.195.62 +add test 10.10.195.63 +add test 10.10.195.64 +add test 10.10.195.65 +add test 10.10.195.66 +add test 10.10.195.67 +add test 10.10.195.68 +add test 10.10.195.69 +add test 10.10.195.7 +add test 10.10.195.70 +add test 10.10.195.71 +add test 10.10.195.72 +add test 10.10.195.73 +add test 10.10.195.74 +add test 10.10.195.75 +add test 10.10.195.76 +add test 10.10.195.77 +add test 10.10.195.78 +add test 10.10.195.79 +add test 10.10.195.8 +add test 10.10.195.80 +add test 10.10.195.81 +add test 10.10.195.82 +add test 10.10.195.83 +add test 10.10.195.84 +add test 10.10.195.85 +add test 10.10.195.86 +add test 10.10.195.87 +add test 10.10.195.88 +add test 10.10.195.89 +add test 10.10.195.9 +add test 10.10.195.90 +add test 10.10.195.91 +add test 10.10.195.92 +add test 10.10.195.93 +add test 10.10.195.94 +add test 10.10.195.95 +add test 10.10.195.96 +add test 10.10.195.97 +add test 10.10.195.98 +add test 10.10.195.99 +add test 10.10.196.0 +add test 10.10.196.1 +add test 10.10.196.10 +add test 10.10.196.100 +add test 10.10.196.101 +add test 10.10.196.102 +add test 10.10.196.103 +add test 10.10.196.104 +add test 10.10.196.105 +add test 10.10.196.106 +add test 10.10.196.107 +add test 10.10.196.108 +add test 10.10.196.109 +add test 10.10.196.11 +add test 10.10.196.110 +add test 10.10.196.111 +add test 10.10.196.112 +add test 10.10.196.113 +add test 10.10.196.114 +add test 10.10.196.115 +add test 10.10.196.116 +add test 10.10.196.117 +add test 10.10.196.118 +add test 10.10.196.119 +add test 10.10.196.12 +add test 10.10.196.120 +add test 10.10.196.121 +add test 10.10.196.122 +add test 10.10.196.123 +add test 10.10.196.124 +add test 10.10.196.125 +add test 10.10.196.126 +add test 10.10.196.127 +add test 10.10.196.128 +add test 10.10.196.129 +add test 10.10.196.13 +add test 10.10.196.130 +add test 10.10.196.131 +add test 10.10.196.132 +add test 10.10.196.133 +add test 10.10.196.134 +add test 10.10.196.135 +add test 10.10.196.136 +add test 10.10.196.137 +add test 10.10.196.138 +add test 10.10.196.139 +add test 10.10.196.14 +add test 10.10.196.140 +add test 10.10.196.141 +add test 10.10.196.142 +add test 10.10.196.143 +add test 10.10.196.144 +add test 10.10.196.145 +add test 10.10.196.146 +add test 10.10.196.147 +add test 10.10.196.148 +add test 10.10.196.149 +add test 10.10.196.15 +add test 10.10.196.150 +add test 10.10.196.151 +add test 10.10.196.152 +add test 10.10.196.153 +add test 10.10.196.154 +add test 10.10.196.155 +add test 10.10.196.156 +add test 10.10.196.157 +add test 10.10.196.158 +add test 10.10.196.159 +add test 10.10.196.16 +add test 10.10.196.160 +add test 10.10.196.161 +add test 10.10.196.162 +add test 10.10.196.163 +add test 10.10.196.164 +add test 10.10.196.165 +add test 10.10.196.166 +add test 10.10.196.167 +add test 10.10.196.168 +add test 10.10.196.169 +add test 10.10.196.17 +add test 10.10.196.170 +add test 10.10.196.171 +add test 10.10.196.172 +add test 10.10.196.173 +add test 10.10.196.174 +add test 10.10.196.175 +add test 10.10.196.176 +add test 10.10.196.177 +add test 10.10.196.178 +add test 10.10.196.179 +add test 10.10.196.18 +add test 10.10.196.180 +add test 10.10.196.181 +add test 10.10.196.182 +add test 10.10.196.183 +add test 10.10.196.184 +add test 10.10.196.185 +add test 10.10.196.186 +add test 10.10.196.187 +add test 10.10.196.188 +add test 10.10.196.189 +add test 10.10.196.19 +add test 10.10.196.190 +add test 10.10.196.191 +add test 10.10.196.192 +add test 10.10.196.193 +add test 10.10.196.194 +add test 10.10.196.195 +add test 10.10.196.196 +add test 10.10.196.197 +add test 10.10.196.198 +add test 10.10.196.199 +add test 10.10.196.2 +add test 10.10.196.20 +add test 10.10.196.200 +add test 10.10.196.201 +add test 10.10.196.202 +add test 10.10.196.203 +add test 10.10.196.204 +add test 10.10.196.205 +add test 10.10.196.206 +add test 10.10.196.207 +add test 10.10.196.208 +add test 10.10.196.209 +add test 10.10.196.21 +add test 10.10.196.210 +add test 10.10.196.211 +add test 10.10.196.212 +add test 10.10.196.213 +add test 10.10.196.214 +add test 10.10.196.215 +add test 10.10.196.216 +add test 10.10.196.217 +add test 10.10.196.218 +add test 10.10.196.219 +add test 10.10.196.22 +add test 10.10.196.220 +add test 10.10.196.221 +add test 10.10.196.222 +add test 10.10.196.223 +add test 10.10.196.224 +add test 10.10.196.225 +add test 10.10.196.226 +add test 10.10.196.227 +add test 10.10.196.228 +add test 10.10.196.229 +add test 10.10.196.23 +add test 10.10.196.230 +add test 10.10.196.231 +add test 10.10.196.232 +add test 10.10.196.233 +add test 10.10.196.234 +add test 10.10.196.235 +add test 10.10.196.236 +add test 10.10.196.237 +add test 10.10.196.238 +add test 10.10.196.239 +add test 10.10.196.24 +add test 10.10.196.240 +add test 10.10.196.241 +add test 10.10.196.242 +add test 10.10.196.243 +add test 10.10.196.244 +add test 10.10.196.245 +add test 10.10.196.246 +add test 10.10.196.247 +add test 10.10.196.248 +add test 10.10.196.249 +add test 10.10.196.25 +add test 10.10.196.250 +add test 10.10.196.251 +add test 10.10.196.252 +add test 10.10.196.253 +add test 10.10.196.254 +add test 10.10.196.255 +add test 10.10.196.26 +add test 10.10.196.27 +add test 10.10.196.28 +add test 10.10.196.29 +add test 10.10.196.3 +add test 10.10.196.30 +add test 10.10.196.31 +add test 10.10.196.32 +add test 10.10.196.33 +add test 10.10.196.34 +add test 10.10.196.35 +add test 10.10.196.36 +add test 10.10.196.37 +add test 10.10.196.38 +add test 10.10.196.39 +add test 10.10.196.4 +add test 10.10.196.40 +add test 10.10.196.41 +add test 10.10.196.42 +add test 10.10.196.43 +add test 10.10.196.44 +add test 10.10.196.45 +add test 10.10.196.46 +add test 10.10.196.47 +add test 10.10.196.48 +add test 10.10.196.49 +add test 10.10.196.5 +add test 10.10.196.50 +add test 10.10.196.51 +add test 10.10.196.52 +add test 10.10.196.53 +add test 10.10.196.54 +add test 10.10.196.55 +add test 10.10.196.56 +add test 10.10.196.57 +add test 10.10.196.58 +add test 10.10.196.59 +add test 10.10.196.6 +add test 10.10.196.60 +add test 10.10.196.61 +add test 10.10.196.62 +add test 10.10.196.63 +add test 10.10.196.64 +add test 10.10.196.65 +add test 10.10.196.66 +add test 10.10.196.67 +add test 10.10.196.68 +add test 10.10.196.69 +add test 10.10.196.7 +add test 10.10.196.70 +add test 10.10.196.71 +add test 10.10.196.72 +add test 10.10.196.73 +add test 10.10.196.74 +add test 10.10.196.75 +add test 10.10.196.76 +add test 10.10.196.77 +add test 10.10.196.78 +add test 10.10.196.79 +add test 10.10.196.8 +add test 10.10.196.80 +add test 10.10.196.81 +add test 10.10.196.82 +add test 10.10.196.83 +add test 10.10.196.84 +add test 10.10.196.85 +add test 10.10.196.86 +add test 10.10.196.87 +add test 10.10.196.88 +add test 10.10.196.89 +add test 10.10.196.9 +add test 10.10.196.90 +add test 10.10.196.91 +add test 10.10.196.92 +add test 10.10.196.93 +add test 10.10.196.94 +add test 10.10.196.95 +add test 10.10.196.96 +add test 10.10.196.97 +add test 10.10.196.98 +add test 10.10.196.99 +add test 10.10.197.0 +add test 10.10.197.1 +add test 10.10.197.10 +add test 10.10.197.100 +add test 10.10.197.101 +add test 10.10.197.102 +add test 10.10.197.103 +add test 10.10.197.104 +add test 10.10.197.105 +add test 10.10.197.106 +add test 10.10.197.107 +add test 10.10.197.108 +add test 10.10.197.109 +add test 10.10.197.11 +add test 10.10.197.110 +add test 10.10.197.111 +add test 10.10.197.112 +add test 10.10.197.113 +add test 10.10.197.114 +add test 10.10.197.115 +add test 10.10.197.116 +add test 10.10.197.117 +add test 10.10.197.118 +add test 10.10.197.119 +add test 10.10.197.12 +add test 10.10.197.120 +add test 10.10.197.121 +add test 10.10.197.122 +add test 10.10.197.123 +add test 10.10.197.124 +add test 10.10.197.125 +add test 10.10.197.126 +add test 10.10.197.127 +add test 10.10.197.128 +add test 10.10.197.129 +add test 10.10.197.13 +add test 10.10.197.130 +add test 10.10.197.131 +add test 10.10.197.132 +add test 10.10.197.133 +add test 10.10.197.134 +add test 10.10.197.135 +add test 10.10.197.136 +add test 10.10.197.137 +add test 10.10.197.138 +add test 10.10.197.139 +add test 10.10.197.14 +add test 10.10.197.140 +add test 10.10.197.141 +add test 10.10.197.142 +add test 10.10.197.143 +add test 10.10.197.144 +add test 10.10.197.145 +add test 10.10.197.146 +add test 10.10.197.147 +add test 10.10.197.148 +add test 10.10.197.149 +add test 10.10.197.15 +add test 10.10.197.150 +add test 10.10.197.151 +add test 10.10.197.152 +add test 10.10.197.153 +add test 10.10.197.154 +add test 10.10.197.155 +add test 10.10.197.156 +add test 10.10.197.157 +add test 10.10.197.158 +add test 10.10.197.159 +add test 10.10.197.16 +add test 10.10.197.160 +add test 10.10.197.161 +add test 10.10.197.162 +add test 10.10.197.163 +add test 10.10.197.164 +add test 10.10.197.165 +add test 10.10.197.166 +add test 10.10.197.167 +add test 10.10.197.168 +add test 10.10.197.169 +add test 10.10.197.17 +add test 10.10.197.170 +add test 10.10.197.171 +add test 10.10.197.172 +add test 10.10.197.173 +add test 10.10.197.174 +add test 10.10.197.175 +add test 10.10.197.176 +add test 10.10.197.177 +add test 10.10.197.178 +add test 10.10.197.179 +add test 10.10.197.18 +add test 10.10.197.180 +add test 10.10.197.181 +add test 10.10.197.182 +add test 10.10.197.183 +add test 10.10.197.184 +add test 10.10.197.185 +add test 10.10.197.186 +add test 10.10.197.187 +add test 10.10.197.188 +add test 10.10.197.189 +add test 10.10.197.19 +add test 10.10.197.190 +add test 10.10.197.191 +add test 10.10.197.192 +add test 10.10.197.193 +add test 10.10.197.194 +add test 10.10.197.195 +add test 10.10.197.196 +add test 10.10.197.197 +add test 10.10.197.198 +add test 10.10.197.199 +add test 10.10.197.2 +add test 10.10.197.20 +add test 10.10.197.200 +add test 10.10.197.201 +add test 10.10.197.202 +add test 10.10.197.203 +add test 10.10.197.204 +add test 10.10.197.205 +add test 10.10.197.206 +add test 10.10.197.207 +add test 10.10.197.208 +add test 10.10.197.209 +add test 10.10.197.21 +add test 10.10.197.210 +add test 10.10.197.211 +add test 10.10.197.212 +add test 10.10.197.213 +add test 10.10.197.214 +add test 10.10.197.215 +add test 10.10.197.216 +add test 10.10.197.217 +add test 10.10.197.218 +add test 10.10.197.219 +add test 10.10.197.22 +add test 10.10.197.220 +add test 10.10.197.221 +add test 10.10.197.222 +add test 10.10.197.223 +add test 10.10.197.224 +add test 10.10.197.225 +add test 10.10.197.226 +add test 10.10.197.227 +add test 10.10.197.228 +add test 10.10.197.229 +add test 10.10.197.23 +add test 10.10.197.230 +add test 10.10.197.231 +add test 10.10.197.232 +add test 10.10.197.233 +add test 10.10.197.234 +add test 10.10.197.235 +add test 10.10.197.236 +add test 10.10.197.237 +add test 10.10.197.238 +add test 10.10.197.239 +add test 10.10.197.24 +add test 10.10.197.240 +add test 10.10.197.241 +add test 10.10.197.242 +add test 10.10.197.243 +add test 10.10.197.244 +add test 10.10.197.245 +add test 10.10.197.246 +add test 10.10.197.247 +add test 10.10.197.248 +add test 10.10.197.249 +add test 10.10.197.25 +add test 10.10.197.250 +add test 10.10.197.251 +add test 10.10.197.252 +add test 10.10.197.253 +add test 10.10.197.254 +add test 10.10.197.255 +add test 10.10.197.26 +add test 10.10.197.27 +add test 10.10.197.28 +add test 10.10.197.29 +add test 10.10.197.3 +add test 10.10.197.30 +add test 10.10.197.31 +add test 10.10.197.32 +add test 10.10.197.33 +add test 10.10.197.34 +add test 10.10.197.35 +add test 10.10.197.36 +add test 10.10.197.37 +add test 10.10.197.38 +add test 10.10.197.39 +add test 10.10.197.4 +add test 10.10.197.40 +add test 10.10.197.41 +add test 10.10.197.42 +add test 10.10.197.43 +add test 10.10.197.44 +add test 10.10.197.45 +add test 10.10.197.46 +add test 10.10.197.47 +add test 10.10.197.48 +add test 10.10.197.49 +add test 10.10.197.5 +add test 10.10.197.50 +add test 10.10.197.51 +add test 10.10.197.52 +add test 10.10.197.53 +add test 10.10.197.54 +add test 10.10.197.55 +add test 10.10.197.56 +add test 10.10.197.57 +add test 10.10.197.58 +add test 10.10.197.59 +add test 10.10.197.6 +add test 10.10.197.60 +add test 10.10.197.61 +add test 10.10.197.62 +add test 10.10.197.63 +add test 10.10.197.64 +add test 10.10.197.65 +add test 10.10.197.66 +add test 10.10.197.67 +add test 10.10.197.68 +add test 10.10.197.69 +add test 10.10.197.7 +add test 10.10.197.70 +add test 10.10.197.71 +add test 10.10.197.72 +add test 10.10.197.73 +add test 10.10.197.74 +add test 10.10.197.75 +add test 10.10.197.76 +add test 10.10.197.77 +add test 10.10.197.78 +add test 10.10.197.79 +add test 10.10.197.8 +add test 10.10.197.80 +add test 10.10.197.81 +add test 10.10.197.82 +add test 10.10.197.83 +add test 10.10.197.84 +add test 10.10.197.85 +add test 10.10.197.86 +add test 10.10.197.87 +add test 10.10.197.88 +add test 10.10.197.89 +add test 10.10.197.9 +add test 10.10.197.90 +add test 10.10.197.91 +add test 10.10.197.92 +add test 10.10.197.93 +add test 10.10.197.94 +add test 10.10.197.95 +add test 10.10.197.96 +add test 10.10.197.97 +add test 10.10.197.98 +add test 10.10.197.99 +add test 10.10.198.0 +add test 10.10.198.1 +add test 10.10.198.10 +add test 10.10.198.100 +add test 10.10.198.101 +add test 10.10.198.102 +add test 10.10.198.103 +add test 10.10.198.104 +add test 10.10.198.105 +add test 10.10.198.106 +add test 10.10.198.107 +add test 10.10.198.108 +add test 10.10.198.109 +add test 10.10.198.11 +add test 10.10.198.110 +add test 10.10.198.111 +add test 10.10.198.112 +add test 10.10.198.113 +add test 10.10.198.114 +add test 10.10.198.115 +add test 10.10.198.116 +add test 10.10.198.117 +add test 10.10.198.118 +add test 10.10.198.119 +add test 10.10.198.12 +add test 10.10.198.120 +add test 10.10.198.121 +add test 10.10.198.122 +add test 10.10.198.123 +add test 10.10.198.124 +add test 10.10.198.125 +add test 10.10.198.126 +add test 10.10.198.127 +add test 10.10.198.128 +add test 10.10.198.129 +add test 10.10.198.13 +add test 10.10.198.130 +add test 10.10.198.131 +add test 10.10.198.132 +add test 10.10.198.133 +add test 10.10.198.134 +add test 10.10.198.135 +add test 10.10.198.136 +add test 10.10.198.137 +add test 10.10.198.138 +add test 10.10.198.139 +add test 10.10.198.14 +add test 10.10.198.140 +add test 10.10.198.141 +add test 10.10.198.142 +add test 10.10.198.143 +add test 10.10.198.144 +add test 10.10.198.145 +add test 10.10.198.146 +add test 10.10.198.147 +add test 10.10.198.148 +add test 10.10.198.149 +add test 10.10.198.15 +add test 10.10.198.150 +add test 10.10.198.151 +add test 10.10.198.152 +add test 10.10.198.153 +add test 10.10.198.154 +add test 10.10.198.155 +add test 10.10.198.156 +add test 10.10.198.157 +add test 10.10.198.158 +add test 10.10.198.159 +add test 10.10.198.16 +add test 10.10.198.160 +add test 10.10.198.161 +add test 10.10.198.162 +add test 10.10.198.163 +add test 10.10.198.164 +add test 10.10.198.165 +add test 10.10.198.166 +add test 10.10.198.167 +add test 10.10.198.168 +add test 10.10.198.169 +add test 10.10.198.17 +add test 10.10.198.170 +add test 10.10.198.171 +add test 10.10.198.172 +add test 10.10.198.173 +add test 10.10.198.174 +add test 10.10.198.175 +add test 10.10.198.176 +add test 10.10.198.177 +add test 10.10.198.178 +add test 10.10.198.179 +add test 10.10.198.18 +add test 10.10.198.180 +add test 10.10.198.181 +add test 10.10.198.182 +add test 10.10.198.183 +add test 10.10.198.184 +add test 10.10.198.185 +add test 10.10.198.186 +add test 10.10.198.187 +add test 10.10.198.188 +add test 10.10.198.189 +add test 10.10.198.19 +add test 10.10.198.190 +add test 10.10.198.191 +add test 10.10.198.192 +add test 10.10.198.193 +add test 10.10.198.194 +add test 10.10.198.195 +add test 10.10.198.196 +add test 10.10.198.197 +add test 10.10.198.198 +add test 10.10.198.199 +add test 10.10.198.2 +add test 10.10.198.20 +add test 10.10.198.200 +add test 10.10.198.201 +add test 10.10.198.202 +add test 10.10.198.203 +add test 10.10.198.204 +add test 10.10.198.205 +add test 10.10.198.206 +add test 10.10.198.207 +add test 10.10.198.208 +add test 10.10.198.209 +add test 10.10.198.21 +add test 10.10.198.210 +add test 10.10.198.211 +add test 10.10.198.212 +add test 10.10.198.213 +add test 10.10.198.214 +add test 10.10.198.215 +add test 10.10.198.216 +add test 10.10.198.217 +add test 10.10.198.218 +add test 10.10.198.219 +add test 10.10.198.22 +add test 10.10.198.220 +add test 10.10.198.221 +add test 10.10.198.222 +add test 10.10.198.223 +add test 10.10.198.224 +add test 10.10.198.225 +add test 10.10.198.226 +add test 10.10.198.227 +add test 10.10.198.228 +add test 10.10.198.229 +add test 10.10.198.23 +add test 10.10.198.230 +add test 10.10.198.231 +add test 10.10.198.232 +add test 10.10.198.233 +add test 10.10.198.234 +add test 10.10.198.235 +add test 10.10.198.236 +add test 10.10.198.237 +add test 10.10.198.238 +add test 10.10.198.239 +add test 10.10.198.24 +add test 10.10.198.240 +add test 10.10.198.241 +add test 10.10.198.242 +add test 10.10.198.243 +add test 10.10.198.244 +add test 10.10.198.245 +add test 10.10.198.246 +add test 10.10.198.247 +add test 10.10.198.248 +add test 10.10.198.249 +add test 10.10.198.25 +add test 10.10.198.250 +add test 10.10.198.251 +add test 10.10.198.252 +add test 10.10.198.253 +add test 10.10.198.254 +add test 10.10.198.255 +add test 10.10.198.26 +add test 10.10.198.27 +add test 10.10.198.28 +add test 10.10.198.29 +add test 10.10.198.3 +add test 10.10.198.30 +add test 10.10.198.31 +add test 10.10.198.32 +add test 10.10.198.33 +add test 10.10.198.34 +add test 10.10.198.35 +add test 10.10.198.36 +add test 10.10.198.37 +add test 10.10.198.38 +add test 10.10.198.39 +add test 10.10.198.4 +add test 10.10.198.40 +add test 10.10.198.41 +add test 10.10.198.42 +add test 10.10.198.43 +add test 10.10.198.44 +add test 10.10.198.45 +add test 10.10.198.46 +add test 10.10.198.47 +add test 10.10.198.48 +add test 10.10.198.49 +add test 10.10.198.5 +add test 10.10.198.50 +add test 10.10.198.51 +add test 10.10.198.52 +add test 10.10.198.53 +add test 10.10.198.54 +add test 10.10.198.55 +add test 10.10.198.56 +add test 10.10.198.57 +add test 10.10.198.58 +add test 10.10.198.59 +add test 10.10.198.6 +add test 10.10.198.60 +add test 10.10.198.61 +add test 10.10.198.62 +add test 10.10.198.63 +add test 10.10.198.64 +add test 10.10.198.65 +add test 10.10.198.66 +add test 10.10.198.67 +add test 10.10.198.68 +add test 10.10.198.69 +add test 10.10.198.7 +add test 10.10.198.70 +add test 10.10.198.71 +add test 10.10.198.72 +add test 10.10.198.73 +add test 10.10.198.74 +add test 10.10.198.75 +add test 10.10.198.76 +add test 10.10.198.77 +add test 10.10.198.78 +add test 10.10.198.79 +add test 10.10.198.8 +add test 10.10.198.80 +add test 10.10.198.81 +add test 10.10.198.82 +add test 10.10.198.83 +add test 10.10.198.84 +add test 10.10.198.85 +add test 10.10.198.86 +add test 10.10.198.87 +add test 10.10.198.88 +add test 10.10.198.89 +add test 10.10.198.9 +add test 10.10.198.90 +add test 10.10.198.91 +add test 10.10.198.92 +add test 10.10.198.93 +add test 10.10.198.94 +add test 10.10.198.95 +add test 10.10.198.96 +add test 10.10.198.97 +add test 10.10.198.98 +add test 10.10.198.99 +add test 10.10.199.0 +add test 10.10.199.1 +add test 10.10.199.10 +add test 10.10.199.100 +add test 10.10.199.101 +add test 10.10.199.102 +add test 10.10.199.103 +add test 10.10.199.104 +add test 10.10.199.105 +add test 10.10.199.106 +add test 10.10.199.107 +add test 10.10.199.108 +add test 10.10.199.109 +add test 10.10.199.11 +add test 10.10.199.110 +add test 10.10.199.111 +add test 10.10.199.112 +add test 10.10.199.113 +add test 10.10.199.114 +add test 10.10.199.115 +add test 10.10.199.116 +add test 10.10.199.117 +add test 10.10.199.118 +add test 10.10.199.119 +add test 10.10.199.12 +add test 10.10.199.120 +add test 10.10.199.121 +add test 10.10.199.122 +add test 10.10.199.123 +add test 10.10.199.124 +add test 10.10.199.125 +add test 10.10.199.126 +add test 10.10.199.127 +add test 10.10.199.128 +add test 10.10.199.129 +add test 10.10.199.13 +add test 10.10.199.130 +add test 10.10.199.131 +add test 10.10.199.132 +add test 10.10.199.133 +add test 10.10.199.134 +add test 10.10.199.135 +add test 10.10.199.136 +add test 10.10.199.137 +add test 10.10.199.138 +add test 10.10.199.139 +add test 10.10.199.14 +add test 10.10.199.140 +add test 10.10.199.141 +add test 10.10.199.142 +add test 10.10.199.143 +add test 10.10.199.144 +add test 10.10.199.145 +add test 10.10.199.146 +add test 10.10.199.147 +add test 10.10.199.148 +add test 10.10.199.149 +add test 10.10.199.15 +add test 10.10.199.150 +add test 10.10.199.151 +add test 10.10.199.152 +add test 10.10.199.153 +add test 10.10.199.154 +add test 10.10.199.155 +add test 10.10.199.156 +add test 10.10.199.157 +add test 10.10.199.158 +add test 10.10.199.159 +add test 10.10.199.16 +add test 10.10.199.160 +add test 10.10.199.161 +add test 10.10.199.162 +add test 10.10.199.163 +add test 10.10.199.164 +add test 10.10.199.165 +add test 10.10.199.166 +add test 10.10.199.167 +add test 10.10.199.168 +add test 10.10.199.169 +add test 10.10.199.17 +add test 10.10.199.170 +add test 10.10.199.171 +add test 10.10.199.172 +add test 10.10.199.173 +add test 10.10.199.174 +add test 10.10.199.175 +add test 10.10.199.176 +add test 10.10.199.177 +add test 10.10.199.178 +add test 10.10.199.179 +add test 10.10.199.18 +add test 10.10.199.180 +add test 10.10.199.181 +add test 10.10.199.182 +add test 10.10.199.183 +add test 10.10.199.184 +add test 10.10.199.185 +add test 10.10.199.186 +add test 10.10.199.187 +add test 10.10.199.188 +add test 10.10.199.189 +add test 10.10.199.19 +add test 10.10.199.190 +add test 10.10.199.191 +add test 10.10.199.192 +add test 10.10.199.193 +add test 10.10.199.194 +add test 10.10.199.195 +add test 10.10.199.196 +add test 10.10.199.197 +add test 10.10.199.198 +add test 10.10.199.199 +add test 10.10.199.2 +add test 10.10.199.20 +add test 10.10.199.200 +add test 10.10.199.201 +add test 10.10.199.202 +add test 10.10.199.203 +add test 10.10.199.204 +add test 10.10.199.205 +add test 10.10.199.206 +add test 10.10.199.207 +add test 10.10.199.208 +add test 10.10.199.209 +add test 10.10.199.21 +add test 10.10.199.210 +add test 10.10.199.211 +add test 10.10.199.212 +add test 10.10.199.213 +add test 10.10.199.214 +add test 10.10.199.215 +add test 10.10.199.216 +add test 10.10.199.217 +add test 10.10.199.218 +add test 10.10.199.219 +add test 10.10.199.22 +add test 10.10.199.220 +add test 10.10.199.221 +add test 10.10.199.222 +add test 10.10.199.223 +add test 10.10.199.224 +add test 10.10.199.225 +add test 10.10.199.226 +add test 10.10.199.227 +add test 10.10.199.228 +add test 10.10.199.229 +add test 10.10.199.23 +add test 10.10.199.230 +add test 10.10.199.231 +add test 10.10.199.232 +add test 10.10.199.233 +add test 10.10.199.234 +add test 10.10.199.235 +add test 10.10.199.236 +add test 10.10.199.237 +add test 10.10.199.238 +add test 10.10.199.239 +add test 10.10.199.24 +add test 10.10.199.240 +add test 10.10.199.241 +add test 10.10.199.242 +add test 10.10.199.243 +add test 10.10.199.244 +add test 10.10.199.245 +add test 10.10.199.246 +add test 10.10.199.247 +add test 10.10.199.248 +add test 10.10.199.249 +add test 10.10.199.25 +add test 10.10.199.250 +add test 10.10.199.251 +add test 10.10.199.252 +add test 10.10.199.253 +add test 10.10.199.254 +add test 10.10.199.255 +add test 10.10.199.26 +add test 10.10.199.27 +add test 10.10.199.28 +add test 10.10.199.29 +add test 10.10.199.3 +add test 10.10.199.30 +add test 10.10.199.31 +add test 10.10.199.32 +add test 10.10.199.33 +add test 10.10.199.34 +add test 10.10.199.35 +add test 10.10.199.36 +add test 10.10.199.37 +add test 10.10.199.38 +add test 10.10.199.39 +add test 10.10.199.4 +add test 10.10.199.40 +add test 10.10.199.41 +add test 10.10.199.42 +add test 10.10.199.43 +add test 10.10.199.44 +add test 10.10.199.45 +add test 10.10.199.46 +add test 10.10.199.47 +add test 10.10.199.48 +add test 10.10.199.49 +add test 10.10.199.5 +add test 10.10.199.50 +add test 10.10.199.51 +add test 10.10.199.52 +add test 10.10.199.53 +add test 10.10.199.54 +add test 10.10.199.55 +add test 10.10.199.56 +add test 10.10.199.57 +add test 10.10.199.58 +add test 10.10.199.59 +add test 10.10.199.6 +add test 10.10.199.60 +add test 10.10.199.61 +add test 10.10.199.62 +add test 10.10.199.63 +add test 10.10.199.64 +add test 10.10.199.65 +add test 10.10.199.66 +add test 10.10.199.67 +add test 10.10.199.68 +add test 10.10.199.69 +add test 10.10.199.7 +add test 10.10.199.70 +add test 10.10.199.71 +add test 10.10.199.72 +add test 10.10.199.73 +add test 10.10.199.74 +add test 10.10.199.75 +add test 10.10.199.76 +add test 10.10.199.77 +add test 10.10.199.78 +add test 10.10.199.79 +add test 10.10.199.8 +add test 10.10.199.80 +add test 10.10.199.81 +add test 10.10.199.82 +add test 10.10.199.83 +add test 10.10.199.84 +add test 10.10.199.85 +add test 10.10.199.86 +add test 10.10.199.87 +add test 10.10.199.88 +add test 10.10.199.89 +add test 10.10.199.9 +add test 10.10.199.90 +add test 10.10.199.91 +add test 10.10.199.92 +add test 10.10.199.93 +add test 10.10.199.94 +add test 10.10.199.95 +add test 10.10.199.96 +add test 10.10.199.97 +add test 10.10.199.98 +add test 10.10.199.99 +add test 10.10.2.0 +add test 10.10.2.1 +add test 10.10.2.10 +add test 10.10.2.100 +add test 10.10.2.101 +add test 10.10.2.102 +add test 10.10.2.103 +add test 10.10.2.104 +add test 10.10.2.105 +add test 10.10.2.106 +add test 10.10.2.107 +add test 10.10.2.108 +add test 10.10.2.109 +add test 10.10.2.11 +add test 10.10.2.110 +add test 10.10.2.111 +add test 10.10.2.112 +add test 10.10.2.113 +add test 10.10.2.114 +add test 10.10.2.115 +add test 10.10.2.116 +add test 10.10.2.117 +add test 10.10.2.118 +add test 10.10.2.119 +add test 10.10.2.12 +add test 10.10.2.120 +add test 10.10.2.121 +add test 10.10.2.122 +add test 10.10.2.123 +add test 10.10.2.124 +add test 10.10.2.125 +add test 10.10.2.126 +add test 10.10.2.127 +add test 10.10.2.128 +add test 10.10.2.129 +add test 10.10.2.13 +add test 10.10.2.130 +add test 10.10.2.131 +add test 10.10.2.132 +add test 10.10.2.133 +add test 10.10.2.134 +add test 10.10.2.135 +add test 10.10.2.136 +add test 10.10.2.137 +add test 10.10.2.138 +add test 10.10.2.139 +add test 10.10.2.14 +add test 10.10.2.140 +add test 10.10.2.141 +add test 10.10.2.142 +add test 10.10.2.143 +add test 10.10.2.144 +add test 10.10.2.145 +add test 10.10.2.146 +add test 10.10.2.147 +add test 10.10.2.148 +add test 10.10.2.149 +add test 10.10.2.15 +add test 10.10.2.150 +add test 10.10.2.151 +add test 10.10.2.152 +add test 10.10.2.153 +add test 10.10.2.154 +add test 10.10.2.155 +add test 10.10.2.156 +add test 10.10.2.157 +add test 10.10.2.158 +add test 10.10.2.159 +add test 10.10.2.16 +add test 10.10.2.160 +add test 10.10.2.161 +add test 10.10.2.162 +add test 10.10.2.163 +add test 10.10.2.164 +add test 10.10.2.165 +add test 10.10.2.166 +add test 10.10.2.167 +add test 10.10.2.168 +add test 10.10.2.169 +add test 10.10.2.17 +add test 10.10.2.170 +add test 10.10.2.171 +add test 10.10.2.172 +add test 10.10.2.173 +add test 10.10.2.174 +add test 10.10.2.175 +add test 10.10.2.176 +add test 10.10.2.177 +add test 10.10.2.178 +add test 10.10.2.179 +add test 10.10.2.18 +add test 10.10.2.180 +add test 10.10.2.181 +add test 10.10.2.182 +add test 10.10.2.183 +add test 10.10.2.184 +add test 10.10.2.185 +add test 10.10.2.186 +add test 10.10.2.187 +add test 10.10.2.188 +add test 10.10.2.189 +add test 10.10.2.19 +add test 10.10.2.190 +add test 10.10.2.191 +add test 10.10.2.192 +add test 10.10.2.193 +add test 10.10.2.194 +add test 10.10.2.195 +add test 10.10.2.196 +add test 10.10.2.197 +add test 10.10.2.198 +add test 10.10.2.199 +add test 10.10.2.2 +add test 10.10.2.20 +add test 10.10.2.200 +add test 10.10.2.201 +add test 10.10.2.202 +add test 10.10.2.203 +add test 10.10.2.204 +add test 10.10.2.205 +add test 10.10.2.206 +add test 10.10.2.207 +add test 10.10.2.208 +add test 10.10.2.209 +add test 10.10.2.21 +add test 10.10.2.210 +add test 10.10.2.211 +add test 10.10.2.212 +add test 10.10.2.213 +add test 10.10.2.214 +add test 10.10.2.215 +add test 10.10.2.216 +add test 10.10.2.217 +add test 10.10.2.218 +add test 10.10.2.219 +add test 10.10.2.22 +add test 10.10.2.220 +add test 10.10.2.221 +add test 10.10.2.222 +add test 10.10.2.223 +add test 10.10.2.224 +add test 10.10.2.225 +add test 10.10.2.226 +add test 10.10.2.227 +add test 10.10.2.228 +add test 10.10.2.229 +add test 10.10.2.23 +add test 10.10.2.230 +add test 10.10.2.231 +add test 10.10.2.232 +add test 10.10.2.233 +add test 10.10.2.234 +add test 10.10.2.235 +add test 10.10.2.236 +add test 10.10.2.237 +add test 10.10.2.238 +add test 10.10.2.239 +add test 10.10.2.24 +add test 10.10.2.240 +add test 10.10.2.241 +add test 10.10.2.242 +add test 10.10.2.243 +add test 10.10.2.244 +add test 10.10.2.245 +add test 10.10.2.246 +add test 10.10.2.247 +add test 10.10.2.248 +add test 10.10.2.249 +add test 10.10.2.25 +add test 10.10.2.250 +add test 10.10.2.251 +add test 10.10.2.252 +add test 10.10.2.253 +add test 10.10.2.254 +add test 10.10.2.255 +add test 10.10.2.26 +add test 10.10.2.27 +add test 10.10.2.28 +add test 10.10.2.29 +add test 10.10.2.3 +add test 10.10.2.30 +add test 10.10.2.31 +add test 10.10.2.32 +add test 10.10.2.33 +add test 10.10.2.34 +add test 10.10.2.35 +add test 10.10.2.36 +add test 10.10.2.37 +add test 10.10.2.38 +add test 10.10.2.39 +add test 10.10.2.4 +add test 10.10.2.40 +add test 10.10.2.41 +add test 10.10.2.42 +add test 10.10.2.43 +add test 10.10.2.44 +add test 10.10.2.45 +add test 10.10.2.46 +add test 10.10.2.47 +add test 10.10.2.48 +add test 10.10.2.49 +add test 10.10.2.5 +add test 10.10.2.50 +add test 10.10.2.51 +add test 10.10.2.52 +add test 10.10.2.53 +add test 10.10.2.54 +add test 10.10.2.55 +add test 10.10.2.56 +add test 10.10.2.57 +add test 10.10.2.58 +add test 10.10.2.59 +add test 10.10.2.6 +add test 10.10.2.60 +add test 10.10.2.61 +add test 10.10.2.62 +add test 10.10.2.63 +add test 10.10.2.64 +add test 10.10.2.65 +add test 10.10.2.66 +add test 10.10.2.67 +add test 10.10.2.68 +add test 10.10.2.69 +add test 10.10.2.7 +add test 10.10.2.70 +add test 10.10.2.71 +add test 10.10.2.72 +add test 10.10.2.73 +add test 10.10.2.74 +add test 10.10.2.75 +add test 10.10.2.76 +add test 10.10.2.77 +add test 10.10.2.78 +add test 10.10.2.79 +add test 10.10.2.8 +add test 10.10.2.80 +add test 10.10.2.81 +add test 10.10.2.82 +add test 10.10.2.83 +add test 10.10.2.84 +add test 10.10.2.85 +add test 10.10.2.86 +add test 10.10.2.87 +add test 10.10.2.88 +add test 10.10.2.89 +add test 10.10.2.9 +add test 10.10.2.90 +add test 10.10.2.91 +add test 10.10.2.92 +add test 10.10.2.93 +add test 10.10.2.94 +add test 10.10.2.95 +add test 10.10.2.96 +add test 10.10.2.97 +add test 10.10.2.98 +add test 10.10.2.99 +add test 10.10.20.0 +add test 10.10.20.1 +add test 10.10.20.10 +add test 10.10.20.100 +add test 10.10.20.101 +add test 10.10.20.102 +add test 10.10.20.103 +add test 10.10.20.104 +add test 10.10.20.105 +add test 10.10.20.106 +add test 10.10.20.107 +add test 10.10.20.108 +add test 10.10.20.109 +add test 10.10.20.11 +add test 10.10.20.110 +add test 10.10.20.111 +add test 10.10.20.112 +add test 10.10.20.113 +add test 10.10.20.114 +add test 10.10.20.115 +add test 10.10.20.116 +add test 10.10.20.117 +add test 10.10.20.118 +add test 10.10.20.119 +add test 10.10.20.12 +add test 10.10.20.120 +add test 10.10.20.121 +add test 10.10.20.122 +add test 10.10.20.123 +add test 10.10.20.124 +add test 10.10.20.125 +add test 10.10.20.126 +add test 10.10.20.127 +add test 10.10.20.128 +add test 10.10.20.129 +add test 10.10.20.13 +add test 10.10.20.130 +add test 10.10.20.131 +add test 10.10.20.132 +add test 10.10.20.133 +add test 10.10.20.134 +add test 10.10.20.135 +add test 10.10.20.136 +add test 10.10.20.137 +add test 10.10.20.138 +add test 10.10.20.139 +add test 10.10.20.14 +add test 10.10.20.140 +add test 10.10.20.141 +add test 10.10.20.142 +add test 10.10.20.143 +add test 10.10.20.144 +add test 10.10.20.145 +add test 10.10.20.146 +add test 10.10.20.147 +add test 10.10.20.148 +add test 10.10.20.149 +add test 10.10.20.15 +add test 10.10.20.150 +add test 10.10.20.151 +add test 10.10.20.152 +add test 10.10.20.153 +add test 10.10.20.154 +add test 10.10.20.155 +add test 10.10.20.156 +add test 10.10.20.157 +add test 10.10.20.158 +add test 10.10.20.159 +add test 10.10.20.16 +add test 10.10.20.160 +add test 10.10.20.161 +add test 10.10.20.162 +add test 10.10.20.163 +add test 10.10.20.164 +add test 10.10.20.165 +add test 10.10.20.166 +add test 10.10.20.167 +add test 10.10.20.168 +add test 10.10.20.169 +add test 10.10.20.17 +add test 10.10.20.170 +add test 10.10.20.171 +add test 10.10.20.172 +add test 10.10.20.173 +add test 10.10.20.174 +add test 10.10.20.175 +add test 10.10.20.176 +add test 10.10.20.177 +add test 10.10.20.178 +add test 10.10.20.179 +add test 10.10.20.18 +add test 10.10.20.180 +add test 10.10.20.181 +add test 10.10.20.182 +add test 10.10.20.183 +add test 10.10.20.184 +add test 10.10.20.185 +add test 10.10.20.186 +add test 10.10.20.187 +add test 10.10.20.188 +add test 10.10.20.189 +add test 10.10.20.19 +add test 10.10.20.190 +add test 10.10.20.191 +add test 10.10.20.192 +add test 10.10.20.193 +add test 10.10.20.194 +add test 10.10.20.195 +add test 10.10.20.196 +add test 10.10.20.197 +add test 10.10.20.198 +add test 10.10.20.199 +add test 10.10.20.2 +add test 10.10.20.20 +add test 10.10.20.200 +add test 10.10.20.201 +add test 10.10.20.202 +add test 10.10.20.203 +add test 10.10.20.204 +add test 10.10.20.205 +add test 10.10.20.206 +add test 10.10.20.207 +add test 10.10.20.208 +add test 10.10.20.209 +add test 10.10.20.21 +add test 10.10.20.210 +add test 10.10.20.211 +add test 10.10.20.212 +add test 10.10.20.213 +add test 10.10.20.214 +add test 10.10.20.215 +add test 10.10.20.216 +add test 10.10.20.217 +add test 10.10.20.218 +add test 10.10.20.219 +add test 10.10.20.22 +add test 10.10.20.220 +add test 10.10.20.221 +add test 10.10.20.222 +add test 10.10.20.223 +add test 10.10.20.224 +add test 10.10.20.225 +add test 10.10.20.226 +add test 10.10.20.227 +add test 10.10.20.228 +add test 10.10.20.229 +add test 10.10.20.23 +add test 10.10.20.230 +add test 10.10.20.231 +add test 10.10.20.232 +add test 10.10.20.233 +add test 10.10.20.234 +add test 10.10.20.235 +add test 10.10.20.236 +add test 10.10.20.237 +add test 10.10.20.238 +add test 10.10.20.239 +add test 10.10.20.24 +add test 10.10.20.240 +add test 10.10.20.241 +add test 10.10.20.242 +add test 10.10.20.243 +add test 10.10.20.244 +add test 10.10.20.245 +add test 10.10.20.246 +add test 10.10.20.247 +add test 10.10.20.248 +add test 10.10.20.249 +add test 10.10.20.25 +add test 10.10.20.250 +add test 10.10.20.251 +add test 10.10.20.252 +add test 10.10.20.253 +add test 10.10.20.254 +add test 10.10.20.255 +add test 10.10.20.26 +add test 10.10.20.27 +add test 10.10.20.28 +add test 10.10.20.29 +add test 10.10.20.3 +add test 10.10.20.30 +add test 10.10.20.31 +add test 10.10.20.32 +add test 10.10.20.33 +add test 10.10.20.34 +add test 10.10.20.35 +add test 10.10.20.36 +add test 10.10.20.37 +add test 10.10.20.38 +add test 10.10.20.39 +add test 10.10.20.4 +add test 10.10.20.40 +add test 10.10.20.41 +add test 10.10.20.42 +add test 10.10.20.43 +add test 10.10.20.44 +add test 10.10.20.45 +add test 10.10.20.46 +add test 10.10.20.47 +add test 10.10.20.48 +add test 10.10.20.49 +add test 10.10.20.5 +add test 10.10.20.50 +add test 10.10.20.51 +add test 10.10.20.52 +add test 10.10.20.53 +add test 10.10.20.54 +add test 10.10.20.55 +add test 10.10.20.56 +add test 10.10.20.57 +add test 10.10.20.58 +add test 10.10.20.59 +add test 10.10.20.6 +add test 10.10.20.60 +add test 10.10.20.61 +add test 10.10.20.62 +add test 10.10.20.63 +add test 10.10.20.64 +add test 10.10.20.65 +add test 10.10.20.66 +add test 10.10.20.67 +add test 10.10.20.68 +add test 10.10.20.69 +add test 10.10.20.7 +add test 10.10.20.70 +add test 10.10.20.71 +add test 10.10.20.72 +add test 10.10.20.73 +add test 10.10.20.74 +add test 10.10.20.75 +add test 10.10.20.76 +add test 10.10.20.77 +add test 10.10.20.78 +add test 10.10.20.79 +add test 10.10.20.8 +add test 10.10.20.80 +add test 10.10.20.81 +add test 10.10.20.82 +add test 10.10.20.83 +add test 10.10.20.84 +add test 10.10.20.85 +add test 10.10.20.86 +add test 10.10.20.87 +add test 10.10.20.88 +add test 10.10.20.89 +add test 10.10.20.9 +add test 10.10.20.90 +add test 10.10.20.91 +add test 10.10.20.92 +add test 10.10.20.93 +add test 10.10.20.94 +add test 10.10.20.95 +add test 10.10.20.96 +add test 10.10.20.97 +add test 10.10.20.98 +add test 10.10.20.99 +add test 10.10.200.0 +add test 10.10.200.1 +add test 10.10.200.10 +add test 10.10.200.100 +add test 10.10.200.101 +add test 10.10.200.102 +add test 10.10.200.103 +add test 10.10.200.104 +add test 10.10.200.105 +add test 10.10.200.106 +add test 10.10.200.107 +add test 10.10.200.108 +add test 10.10.200.109 +add test 10.10.200.11 +add test 10.10.200.110 +add test 10.10.200.111 +add test 10.10.200.112 +add test 10.10.200.113 +add test 10.10.200.114 +add test 10.10.200.115 +add test 10.10.200.116 +add test 10.10.200.117 +add test 10.10.200.118 +add test 10.10.200.119 +add test 10.10.200.12 +add test 10.10.200.120 +add test 10.10.200.121 +add test 10.10.200.122 +add test 10.10.200.123 +add test 10.10.200.124 +add test 10.10.200.125 +add test 10.10.200.126 +add test 10.10.200.127 +add test 10.10.200.128 +add test 10.10.200.129 +add test 10.10.200.13 +add test 10.10.200.130 +add test 10.10.200.131 +add test 10.10.200.132 +add test 10.10.200.133 +add test 10.10.200.134 +add test 10.10.200.135 +add test 10.10.200.136 +add test 10.10.200.137 +add test 10.10.200.138 +add test 10.10.200.139 +add test 10.10.200.14 +add test 10.10.200.140 +add test 10.10.200.141 +add test 10.10.200.142 +add test 10.10.200.143 +add test 10.10.200.144 +add test 10.10.200.145 +add test 10.10.200.146 +add test 10.10.200.147 +add test 10.10.200.148 +add test 10.10.200.149 +add test 10.10.200.15 +add test 10.10.200.150 +add test 10.10.200.151 +add test 10.10.200.152 +add test 10.10.200.153 +add test 10.10.200.154 +add test 10.10.200.155 +add test 10.10.200.156 +add test 10.10.200.157 +add test 10.10.200.158 +add test 10.10.200.159 +add test 10.10.200.16 +add test 10.10.200.160 +add test 10.10.200.161 +add test 10.10.200.162 +add test 10.10.200.163 +add test 10.10.200.164 +add test 10.10.200.165 +add test 10.10.200.166 +add test 10.10.200.167 +add test 10.10.200.168 +add test 10.10.200.169 +add test 10.10.200.17 +add test 10.10.200.170 +add test 10.10.200.171 +add test 10.10.200.172 +add test 10.10.200.173 +add test 10.10.200.174 +add test 10.10.200.175 +add test 10.10.200.176 +add test 10.10.200.177 +add test 10.10.200.178 +add test 10.10.200.179 +add test 10.10.200.18 +add test 10.10.200.180 +add test 10.10.200.181 +add test 10.10.200.182 +add test 10.10.200.183 +add test 10.10.200.184 +add test 10.10.200.185 +add test 10.10.200.186 +add test 10.10.200.187 +add test 10.10.200.188 +add test 10.10.200.189 +add test 10.10.200.19 +add test 10.10.200.190 +add test 10.10.200.191 +add test 10.10.200.192 +add test 10.10.200.193 +add test 10.10.200.194 +add test 10.10.200.195 +add test 10.10.200.196 +add test 10.10.200.197 +add test 10.10.200.198 +add test 10.10.200.199 +add test 10.10.200.2 +add test 10.10.200.20 +add test 10.10.200.200 +add test 10.10.200.201 +add test 10.10.200.202 +add test 10.10.200.203 +add test 10.10.200.204 +add test 10.10.200.205 +add test 10.10.200.206 +add test 10.10.200.207 +add test 10.10.200.208 +add test 10.10.200.209 +add test 10.10.200.21 +add test 10.10.200.210 +add test 10.10.200.211 +add test 10.10.200.212 +add test 10.10.200.213 +add test 10.10.200.214 +add test 10.10.200.215 +add test 10.10.200.216 +add test 10.10.200.217 +add test 10.10.200.218 +add test 10.10.200.219 +add test 10.10.200.22 +add test 10.10.200.220 +add test 10.10.200.221 +add test 10.10.200.222 +add test 10.10.200.223 +add test 10.10.200.224 +add test 10.10.200.225 +add test 10.10.200.226 +add test 10.10.200.227 +add test 10.10.200.228 +add test 10.10.200.229 +add test 10.10.200.23 +add test 10.10.200.230 +add test 10.10.200.231 +add test 10.10.200.232 +add test 10.10.200.233 +add test 10.10.200.234 +add test 10.10.200.235 +add test 10.10.200.236 +add test 10.10.200.237 +add test 10.10.200.238 +add test 10.10.200.239 +add test 10.10.200.24 +add test 10.10.200.240 +add test 10.10.200.241 +add test 10.10.200.242 +add test 10.10.200.243 +add test 10.10.200.244 +add test 10.10.200.245 +add test 10.10.200.246 +add test 10.10.200.247 +add test 10.10.200.248 +add test 10.10.200.249 +add test 10.10.200.25 +add test 10.10.200.250 +add test 10.10.200.251 +add test 10.10.200.252 +add test 10.10.200.253 +add test 10.10.200.254 +add test 10.10.200.255 +add test 10.10.200.26 +add test 10.10.200.27 +add test 10.10.200.28 +add test 10.10.200.29 +add test 10.10.200.3 +add test 10.10.200.30 +add test 10.10.200.31 +add test 10.10.200.32 +add test 10.10.200.33 +add test 10.10.200.34 +add test 10.10.200.35 +add test 10.10.200.36 +add test 10.10.200.37 +add test 10.10.200.38 +add test 10.10.200.39 +add test 10.10.200.4 +add test 10.10.200.40 +add test 10.10.200.41 +add test 10.10.200.42 +add test 10.10.200.43 +add test 10.10.200.44 +add test 10.10.200.45 +add test 10.10.200.46 +add test 10.10.200.47 +add test 10.10.200.48 +add test 10.10.200.49 +add test 10.10.200.5 +add test 10.10.200.50 +add test 10.10.200.51 +add test 10.10.200.52 +add test 10.10.200.53 +add test 10.10.200.54 +add test 10.10.200.55 +add test 10.10.200.56 +add test 10.10.200.57 +add test 10.10.200.58 +add test 10.10.200.59 +add test 10.10.200.6 +add test 10.10.200.60 +add test 10.10.200.61 +add test 10.10.200.62 +add test 10.10.200.63 +add test 10.10.200.64 +add test 10.10.200.65 +add test 10.10.200.66 +add test 10.10.200.67 +add test 10.10.200.68 +add test 10.10.200.69 +add test 10.10.200.7 +add test 10.10.200.70 +add test 10.10.200.71 +add test 10.10.200.72 +add test 10.10.200.73 +add test 10.10.200.74 +add test 10.10.200.75 +add test 10.10.200.76 +add test 10.10.200.77 +add test 10.10.200.78 +add test 10.10.200.79 +add test 10.10.200.8 +add test 10.10.200.80 +add test 10.10.200.81 +add test 10.10.200.82 +add test 10.10.200.83 +add test 10.10.200.84 +add test 10.10.200.85 +add test 10.10.200.86 +add test 10.10.200.87 +add test 10.10.200.88 +add test 10.10.200.89 +add test 10.10.200.9 +add test 10.10.200.90 +add test 10.10.200.91 +add test 10.10.200.92 +add test 10.10.200.93 +add test 10.10.200.94 +add test 10.10.200.95 +add test 10.10.200.96 +add test 10.10.200.97 +add test 10.10.200.98 +add test 10.10.200.99 +add test 10.10.201.0 +add test 10.10.201.1 +add test 10.10.201.10 +add test 10.10.201.100 +add test 10.10.201.101 +add test 10.10.201.102 +add test 10.10.201.103 +add test 10.10.201.104 +add test 10.10.201.105 +add test 10.10.201.106 +add test 10.10.201.107 +add test 10.10.201.108 +add test 10.10.201.109 +add test 10.10.201.11 +add test 10.10.201.110 +add test 10.10.201.111 +add test 10.10.201.112 +add test 10.10.201.113 +add test 10.10.201.114 +add test 10.10.201.115 +add test 10.10.201.116 +add test 10.10.201.117 +add test 10.10.201.118 +add test 10.10.201.119 +add test 10.10.201.12 +add test 10.10.201.120 +add test 10.10.201.121 +add test 10.10.201.122 +add test 10.10.201.123 +add test 10.10.201.124 +add test 10.10.201.125 +add test 10.10.201.126 +add test 10.10.201.127 +add test 10.10.201.128 +add test 10.10.201.129 +add test 10.10.201.13 +add test 10.10.201.130 +add test 10.10.201.131 +add test 10.10.201.132 +add test 10.10.201.133 +add test 10.10.201.134 +add test 10.10.201.135 +add test 10.10.201.136 +add test 10.10.201.137 +add test 10.10.201.138 +add test 10.10.201.139 +add test 10.10.201.14 +add test 10.10.201.140 +add test 10.10.201.141 +add test 10.10.201.142 +add test 10.10.201.143 +add test 10.10.201.144 +add test 10.10.201.145 +add test 10.10.201.146 +add test 10.10.201.147 +add test 10.10.201.148 +add test 10.10.201.149 +add test 10.10.201.15 +add test 10.10.201.150 +add test 10.10.201.151 +add test 10.10.201.152 +add test 10.10.201.153 +add test 10.10.201.154 +add test 10.10.201.155 +add test 10.10.201.156 +add test 10.10.201.157 +add test 10.10.201.158 +add test 10.10.201.159 +add test 10.10.201.16 +add test 10.10.201.160 +add test 10.10.201.161 +add test 10.10.201.162 +add test 10.10.201.163 +add test 10.10.201.164 +add test 10.10.201.165 +add test 10.10.201.166 +add test 10.10.201.167 +add test 10.10.201.168 +add test 10.10.201.169 +add test 10.10.201.17 +add test 10.10.201.170 +add test 10.10.201.171 +add test 10.10.201.172 +add test 10.10.201.173 +add test 10.10.201.174 +add test 10.10.201.175 +add test 10.10.201.176 +add test 10.10.201.177 +add test 10.10.201.178 +add test 10.10.201.179 +add test 10.10.201.18 +add test 10.10.201.180 +add test 10.10.201.181 +add test 10.10.201.182 +add test 10.10.201.183 +add test 10.10.201.184 +add test 10.10.201.185 +add test 10.10.201.186 +add test 10.10.201.187 +add test 10.10.201.188 +add test 10.10.201.189 +add test 10.10.201.19 +add test 10.10.201.190 +add test 10.10.201.191 +add test 10.10.201.192 +add test 10.10.201.193 +add test 10.10.201.194 +add test 10.10.201.195 +add test 10.10.201.196 +add test 10.10.201.197 +add test 10.10.201.198 +add test 10.10.201.199 +add test 10.10.201.2 +add test 10.10.201.20 +add test 10.10.201.200 +add test 10.10.201.201 +add test 10.10.201.202 +add test 10.10.201.203 +add test 10.10.201.204 +add test 10.10.201.205 +add test 10.10.201.206 +add test 10.10.201.207 +add test 10.10.201.208 +add test 10.10.201.209 +add test 10.10.201.21 +add test 10.10.201.210 +add test 10.10.201.211 +add test 10.10.201.212 +add test 10.10.201.213 +add test 10.10.201.214 +add test 10.10.201.215 +add test 10.10.201.216 +add test 10.10.201.217 +add test 10.10.201.218 +add test 10.10.201.219 +add test 10.10.201.22 +add test 10.10.201.220 +add test 10.10.201.221 +add test 10.10.201.222 +add test 10.10.201.223 +add test 10.10.201.224 +add test 10.10.201.225 +add test 10.10.201.226 +add test 10.10.201.227 +add test 10.10.201.228 +add test 10.10.201.229 +add test 10.10.201.23 +add test 10.10.201.230 +add test 10.10.201.231 +add test 10.10.201.232 +add test 10.10.201.233 +add test 10.10.201.234 +add test 10.10.201.235 +add test 10.10.201.236 +add test 10.10.201.237 +add test 10.10.201.238 +add test 10.10.201.239 +add test 10.10.201.24 +add test 10.10.201.240 +add test 10.10.201.241 +add test 10.10.201.242 +add test 10.10.201.243 +add test 10.10.201.244 +add test 10.10.201.245 +add test 10.10.201.246 +add test 10.10.201.247 +add test 10.10.201.248 +add test 10.10.201.249 +add test 10.10.201.25 +add test 10.10.201.250 +add test 10.10.201.251 +add test 10.10.201.252 +add test 10.10.201.253 +add test 10.10.201.254 +add test 10.10.201.255 +add test 10.10.201.26 +add test 10.10.201.27 +add test 10.10.201.28 +add test 10.10.201.29 +add test 10.10.201.3 +add test 10.10.201.30 +add test 10.10.201.31 +add test 10.10.201.32 +add test 10.10.201.33 +add test 10.10.201.34 +add test 10.10.201.35 +add test 10.10.201.36 +add test 10.10.201.37 +add test 10.10.201.38 +add test 10.10.201.39 +add test 10.10.201.4 +add test 10.10.201.40 +add test 10.10.201.41 +add test 10.10.201.42 +add test 10.10.201.43 +add test 10.10.201.44 +add test 10.10.201.45 +add test 10.10.201.46 +add test 10.10.201.47 +add test 10.10.201.48 +add test 10.10.201.49 +add test 10.10.201.5 +add test 10.10.201.50 +add test 10.10.201.51 +add test 10.10.201.52 +add test 10.10.201.53 +add test 10.10.201.54 +add test 10.10.201.55 +add test 10.10.201.56 +add test 10.10.201.57 +add test 10.10.201.58 +add test 10.10.201.59 +add test 10.10.201.6 +add test 10.10.201.60 +add test 10.10.201.61 +add test 10.10.201.62 +add test 10.10.201.63 +add test 10.10.201.64 +add test 10.10.201.65 +add test 10.10.201.66 +add test 10.10.201.67 +add test 10.10.201.68 +add test 10.10.201.69 +add test 10.10.201.7 +add test 10.10.201.70 +add test 10.10.201.71 +add test 10.10.201.72 +add test 10.10.201.73 +add test 10.10.201.74 +add test 10.10.201.75 +add test 10.10.201.76 +add test 10.10.201.77 +add test 10.10.201.78 +add test 10.10.201.79 +add test 10.10.201.8 +add test 10.10.201.80 +add test 10.10.201.81 +add test 10.10.201.82 +add test 10.10.201.83 +add test 10.10.201.84 +add test 10.10.201.85 +add test 10.10.201.86 +add test 10.10.201.87 +add test 10.10.201.88 +add test 10.10.201.89 +add test 10.10.201.9 +add test 10.10.201.90 +add test 10.10.201.91 +add test 10.10.201.92 +add test 10.10.201.93 +add test 10.10.201.94 +add test 10.10.201.95 +add test 10.10.201.96 +add test 10.10.201.97 +add test 10.10.201.98 +add test 10.10.201.99 +add test 10.10.202.0 +add test 10.10.202.1 +add test 10.10.202.10 +add test 10.10.202.100 +add test 10.10.202.101 +add test 10.10.202.102 +add test 10.10.202.103 +add test 10.10.202.104 +add test 10.10.202.105 +add test 10.10.202.106 +add test 10.10.202.107 +add test 10.10.202.108 +add test 10.10.202.109 +add test 10.10.202.11 +add test 10.10.202.110 +add test 10.10.202.111 +add test 10.10.202.112 +add test 10.10.202.113 +add test 10.10.202.114 +add test 10.10.202.115 +add test 10.10.202.116 +add test 10.10.202.117 +add test 10.10.202.118 +add test 10.10.202.119 +add test 10.10.202.12 +add test 10.10.202.120 +add test 10.10.202.121 +add test 10.10.202.122 +add test 10.10.202.123 +add test 10.10.202.124 +add test 10.10.202.125 +add test 10.10.202.126 +add test 10.10.202.127 +add test 10.10.202.128 +add test 10.10.202.129 +add test 10.10.202.13 +add test 10.10.202.130 +add test 10.10.202.131 +add test 10.10.202.132 +add test 10.10.202.133 +add test 10.10.202.134 +add test 10.10.202.135 +add test 10.10.202.136 +add test 10.10.202.137 +add test 10.10.202.138 +add test 10.10.202.139 +add test 10.10.202.14 +add test 10.10.202.140 +add test 10.10.202.141 +add test 10.10.202.142 +add test 10.10.202.143 +add test 10.10.202.144 +add test 10.10.202.145 +add test 10.10.202.146 +add test 10.10.202.147 +add test 10.10.202.148 +add test 10.10.202.149 +add test 10.10.202.15 +add test 10.10.202.150 +add test 10.10.202.151 +add test 10.10.202.152 +add test 10.10.202.153 +add test 10.10.202.154 +add test 10.10.202.155 +add test 10.10.202.156 +add test 10.10.202.157 +add test 10.10.202.158 +add test 10.10.202.159 +add test 10.10.202.16 +add test 10.10.202.160 +add test 10.10.202.161 +add test 10.10.202.162 +add test 10.10.202.163 +add test 10.10.202.164 +add test 10.10.202.165 +add test 10.10.202.166 +add test 10.10.202.167 +add test 10.10.202.168 +add test 10.10.202.169 +add test 10.10.202.17 +add test 10.10.202.170 +add test 10.10.202.171 +add test 10.10.202.172 +add test 10.10.202.173 +add test 10.10.202.174 +add test 10.10.202.175 +add test 10.10.202.176 +add test 10.10.202.177 +add test 10.10.202.178 +add test 10.10.202.179 +add test 10.10.202.18 +add test 10.10.202.180 +add test 10.10.202.181 +add test 10.10.202.182 +add test 10.10.202.183 +add test 10.10.202.184 +add test 10.10.202.185 +add test 10.10.202.186 +add test 10.10.202.187 +add test 10.10.202.188 +add test 10.10.202.189 +add test 10.10.202.19 +add test 10.10.202.190 +add test 10.10.202.191 +add test 10.10.202.192 +add test 10.10.202.193 +add test 10.10.202.194 +add test 10.10.202.195 +add test 10.10.202.196 +add test 10.10.202.197 +add test 10.10.202.198 +add test 10.10.202.199 +add test 10.10.202.2 +add test 10.10.202.20 +add test 10.10.202.200 +add test 10.10.202.201 +add test 10.10.202.202 +add test 10.10.202.203 +add test 10.10.202.204 +add test 10.10.202.205 +add test 10.10.202.206 +add test 10.10.202.207 +add test 10.10.202.208 +add test 10.10.202.209 +add test 10.10.202.21 +add test 10.10.202.210 +add test 10.10.202.211 +add test 10.10.202.212 +add test 10.10.202.213 +add test 10.10.202.214 +add test 10.10.202.215 +add test 10.10.202.216 +add test 10.10.202.217 +add test 10.10.202.218 +add test 10.10.202.219 +add test 10.10.202.22 +add test 10.10.202.220 +add test 10.10.202.221 +add test 10.10.202.222 +add test 10.10.202.223 +add test 10.10.202.224 +add test 10.10.202.225 +add test 10.10.202.226 +add test 10.10.202.227 +add test 10.10.202.228 +add test 10.10.202.229 +add test 10.10.202.23 +add test 10.10.202.230 +add test 10.10.202.231 +add test 10.10.202.232 +add test 10.10.202.233 +add test 10.10.202.234 +add test 10.10.202.235 +add test 10.10.202.236 +add test 10.10.202.237 +add test 10.10.202.238 +add test 10.10.202.239 +add test 10.10.202.24 +add test 10.10.202.240 +add test 10.10.202.241 +add test 10.10.202.242 +add test 10.10.202.243 +add test 10.10.202.244 +add test 10.10.202.245 +add test 10.10.202.246 +add test 10.10.202.247 +add test 10.10.202.248 +add test 10.10.202.249 +add test 10.10.202.25 +add test 10.10.202.250 +add test 10.10.202.251 +add test 10.10.202.252 +add test 10.10.202.253 +add test 10.10.202.254 +add test 10.10.202.255 +add test 10.10.202.26 +add test 10.10.202.27 +add test 10.10.202.28 +add test 10.10.202.29 +add test 10.10.202.3 +add test 10.10.202.30 +add test 10.10.202.31 +add test 10.10.202.32 +add test 10.10.202.33 +add test 10.10.202.34 +add test 10.10.202.35 +add test 10.10.202.36 +add test 10.10.202.37 +add test 10.10.202.38 +add test 10.10.202.39 +add test 10.10.202.4 +add test 10.10.202.40 +add test 10.10.202.41 +add test 10.10.202.42 +add test 10.10.202.43 +add test 10.10.202.44 +add test 10.10.202.45 +add test 10.10.202.46 +add test 10.10.202.47 +add test 10.10.202.48 +add test 10.10.202.49 +add test 10.10.202.5 +add test 10.10.202.50 +add test 10.10.202.51 +add test 10.10.202.52 +add test 10.10.202.53 +add test 10.10.202.54 +add test 10.10.202.55 +add test 10.10.202.56 +add test 10.10.202.57 +add test 10.10.202.58 +add test 10.10.202.59 +add test 10.10.202.6 +add test 10.10.202.60 +add test 10.10.202.61 +add test 10.10.202.62 +add test 10.10.202.63 +add test 10.10.202.64 +add test 10.10.202.65 +add test 10.10.202.66 +add test 10.10.202.67 +add test 10.10.202.68 +add test 10.10.202.69 +add test 10.10.202.7 +add test 10.10.202.70 +add test 10.10.202.71 +add test 10.10.202.72 +add test 10.10.202.73 +add test 10.10.202.74 +add test 10.10.202.75 +add test 10.10.202.76 +add test 10.10.202.77 +add test 10.10.202.78 +add test 10.10.202.79 +add test 10.10.202.8 +add test 10.10.202.80 +add test 10.10.202.81 +add test 10.10.202.82 +add test 10.10.202.83 +add test 10.10.202.84 +add test 10.10.202.85 +add test 10.10.202.86 +add test 10.10.202.87 +add test 10.10.202.88 +add test 10.10.202.89 +add test 10.10.202.9 +add test 10.10.202.90 +add test 10.10.202.91 +add test 10.10.202.92 +add test 10.10.202.93 +add test 10.10.202.94 +add test 10.10.202.95 +add test 10.10.202.96 +add test 10.10.202.97 +add test 10.10.202.98 +add test 10.10.202.99 +add test 10.10.203.0 +add test 10.10.203.1 +add test 10.10.203.10 +add test 10.10.203.100 +add test 10.10.203.101 +add test 10.10.203.102 +add test 10.10.203.103 +add test 10.10.203.104 +add test 10.10.203.105 +add test 10.10.203.106 +add test 10.10.203.107 +add test 10.10.203.108 +add test 10.10.203.109 +add test 10.10.203.11 +add test 10.10.203.110 +add test 10.10.203.111 +add test 10.10.203.112 +add test 10.10.203.113 +add test 10.10.203.114 +add test 10.10.203.115 +add test 10.10.203.116 +add test 10.10.203.117 +add test 10.10.203.118 +add test 10.10.203.119 +add test 10.10.203.12 +add test 10.10.203.120 +add test 10.10.203.121 +add test 10.10.203.122 +add test 10.10.203.123 +add test 10.10.203.124 +add test 10.10.203.125 +add test 10.10.203.126 +add test 10.10.203.127 +add test 10.10.203.128 +add test 10.10.203.129 +add test 10.10.203.13 +add test 10.10.203.130 +add test 10.10.203.131 +add test 10.10.203.132 +add test 10.10.203.133 +add test 10.10.203.134 +add test 10.10.203.135 +add test 10.10.203.136 +add test 10.10.203.137 +add test 10.10.203.138 +add test 10.10.203.139 +add test 10.10.203.14 +add test 10.10.203.140 +add test 10.10.203.141 +add test 10.10.203.142 +add test 10.10.203.143 +add test 10.10.203.144 +add test 10.10.203.145 +add test 10.10.203.146 +add test 10.10.203.147 +add test 10.10.203.148 +add test 10.10.203.149 +add test 10.10.203.15 +add test 10.10.203.150 +add test 10.10.203.151 +add test 10.10.203.152 +add test 10.10.203.153 +add test 10.10.203.154 +add test 10.10.203.155 +add test 10.10.203.156 +add test 10.10.203.157 +add test 10.10.203.158 +add test 10.10.203.159 +add test 10.10.203.16 +add test 10.10.203.160 +add test 10.10.203.161 +add test 10.10.203.162 +add test 10.10.203.163 +add test 10.10.203.164 +add test 10.10.203.165 +add test 10.10.203.166 +add test 10.10.203.167 +add test 10.10.203.168 +add test 10.10.203.169 +add test 10.10.203.17 +add test 10.10.203.170 +add test 10.10.203.171 +add test 10.10.203.172 +add test 10.10.203.173 +add test 10.10.203.174 +add test 10.10.203.175 +add test 10.10.203.176 +add test 10.10.203.177 +add test 10.10.203.178 +add test 10.10.203.179 +add test 10.10.203.18 +add test 10.10.203.180 +add test 10.10.203.181 +add test 10.10.203.182 +add test 10.10.203.183 +add test 10.10.203.184 +add test 10.10.203.185 +add test 10.10.203.186 +add test 10.10.203.187 +add test 10.10.203.188 +add test 10.10.203.189 +add test 10.10.203.19 +add test 10.10.203.190 +add test 10.10.203.191 +add test 10.10.203.192 +add test 10.10.203.193 +add test 10.10.203.194 +add test 10.10.203.195 +add test 10.10.203.196 +add test 10.10.203.197 +add test 10.10.203.198 +add test 10.10.203.199 +add test 10.10.203.2 +add test 10.10.203.20 +add test 10.10.203.200 +add test 10.10.203.201 +add test 10.10.203.202 +add test 10.10.203.203 +add test 10.10.203.204 +add test 10.10.203.205 +add test 10.10.203.206 +add test 10.10.203.207 +add test 10.10.203.208 +add test 10.10.203.209 +add test 10.10.203.21 +add test 10.10.203.210 +add test 10.10.203.211 +add test 10.10.203.212 +add test 10.10.203.213 +add test 10.10.203.214 +add test 10.10.203.215 +add test 10.10.203.216 +add test 10.10.203.217 +add test 10.10.203.218 +add test 10.10.203.219 +add test 10.10.203.22 +add test 10.10.203.220 +add test 10.10.203.221 +add test 10.10.203.222 +add test 10.10.203.223 +add test 10.10.203.224 +add test 10.10.203.225 +add test 10.10.203.226 +add test 10.10.203.227 +add test 10.10.203.228 +add test 10.10.203.229 +add test 10.10.203.23 +add test 10.10.203.230 +add test 10.10.203.231 +add test 10.10.203.232 +add test 10.10.203.233 +add test 10.10.203.234 +add test 10.10.203.235 +add test 10.10.203.236 +add test 10.10.203.237 +add test 10.10.203.238 +add test 10.10.203.239 +add test 10.10.203.24 +add test 10.10.203.240 +add test 10.10.203.241 +add test 10.10.203.242 +add test 10.10.203.243 +add test 10.10.203.244 +add test 10.10.203.245 +add test 10.10.203.246 +add test 10.10.203.247 +add test 10.10.203.248 +add test 10.10.203.249 +add test 10.10.203.25 +add test 10.10.203.250 +add test 10.10.203.251 +add test 10.10.203.252 +add test 10.10.203.253 +add test 10.10.203.254 +add test 10.10.203.255 +add test 10.10.203.26 +add test 10.10.203.27 +add test 10.10.203.28 +add test 10.10.203.29 +add test 10.10.203.3 +add test 10.10.203.30 +add test 10.10.203.31 +add test 10.10.203.32 +add test 10.10.203.33 +add test 10.10.203.34 +add test 10.10.203.35 +add test 10.10.203.36 +add test 10.10.203.37 +add test 10.10.203.38 +add test 10.10.203.39 +add test 10.10.203.4 +add test 10.10.203.40 +add test 10.10.203.41 +add test 10.10.203.42 +add test 10.10.203.43 +add test 10.10.203.44 +add test 10.10.203.45 +add test 10.10.203.46 +add test 10.10.203.47 +add test 10.10.203.48 +add test 10.10.203.49 +add test 10.10.203.5 +add test 10.10.203.50 +add test 10.10.203.51 +add test 10.10.203.52 +add test 10.10.203.53 +add test 10.10.203.54 +add test 10.10.203.55 +add test 10.10.203.56 +add test 10.10.203.57 +add test 10.10.203.58 +add test 10.10.203.59 +add test 10.10.203.6 +add test 10.10.203.60 +add test 10.10.203.61 +add test 10.10.203.62 +add test 10.10.203.63 +add test 10.10.203.64 +add test 10.10.203.65 +add test 10.10.203.66 +add test 10.10.203.67 +add test 10.10.203.68 +add test 10.10.203.69 +add test 10.10.203.7 +add test 10.10.203.70 +add test 10.10.203.71 +add test 10.10.203.72 +add test 10.10.203.73 +add test 10.10.203.74 +add test 10.10.203.75 +add test 10.10.203.76 +add test 10.10.203.77 +add test 10.10.203.78 +add test 10.10.203.79 +add test 10.10.203.8 +add test 10.10.203.80 +add test 10.10.203.81 +add test 10.10.203.82 +add test 10.10.203.83 +add test 10.10.203.84 +add test 10.10.203.85 +add test 10.10.203.86 +add test 10.10.203.87 +add test 10.10.203.88 +add test 10.10.203.89 +add test 10.10.203.9 +add test 10.10.203.90 +add test 10.10.203.91 +add test 10.10.203.92 +add test 10.10.203.93 +add test 10.10.203.94 +add test 10.10.203.95 +add test 10.10.203.96 +add test 10.10.203.97 +add test 10.10.203.98 +add test 10.10.203.99 +add test 10.10.204.0 +add test 10.10.204.1 +add test 10.10.204.10 +add test 10.10.204.100 +add test 10.10.204.101 +add test 10.10.204.102 +add test 10.10.204.103 +add test 10.10.204.104 +add test 10.10.204.105 +add test 10.10.204.106 +add test 10.10.204.107 +add test 10.10.204.108 +add test 10.10.204.109 +add test 10.10.204.11 +add test 10.10.204.110 +add test 10.10.204.111 +add test 10.10.204.112 +add test 10.10.204.113 +add test 10.10.204.114 +add test 10.10.204.115 +add test 10.10.204.116 +add test 10.10.204.117 +add test 10.10.204.118 +add test 10.10.204.119 +add test 10.10.204.12 +add test 10.10.204.120 +add test 10.10.204.121 +add test 10.10.204.122 +add test 10.10.204.123 +add test 10.10.204.124 +add test 10.10.204.125 +add test 10.10.204.126 +add test 10.10.204.127 +add test 10.10.204.128 +add test 10.10.204.129 +add test 10.10.204.13 +add test 10.10.204.130 +add test 10.10.204.131 +add test 10.10.204.132 +add test 10.10.204.133 +add test 10.10.204.134 +add test 10.10.204.135 +add test 10.10.204.136 +add test 10.10.204.137 +add test 10.10.204.138 +add test 10.10.204.139 +add test 10.10.204.14 +add test 10.10.204.140 +add test 10.10.204.141 +add test 10.10.204.142 +add test 10.10.204.143 +add test 10.10.204.144 +add test 10.10.204.145 +add test 10.10.204.146 +add test 10.10.204.147 +add test 10.10.204.148 +add test 10.10.204.149 +add test 10.10.204.15 +add test 10.10.204.150 +add test 10.10.204.151 +add test 10.10.204.152 +add test 10.10.204.153 +add test 10.10.204.154 +add test 10.10.204.155 +add test 10.10.204.156 +add test 10.10.204.157 +add test 10.10.204.158 +add test 10.10.204.159 +add test 10.10.204.16 +add test 10.10.204.160 +add test 10.10.204.161 +add test 10.10.204.162 +add test 10.10.204.163 +add test 10.10.204.164 +add test 10.10.204.165 +add test 10.10.204.166 +add test 10.10.204.167 +add test 10.10.204.168 +add test 10.10.204.169 +add test 10.10.204.17 +add test 10.10.204.170 +add test 10.10.204.171 +add test 10.10.204.172 +add test 10.10.204.173 +add test 10.10.204.174 +add test 10.10.204.175 +add test 10.10.204.176 +add test 10.10.204.177 +add test 10.10.204.178 +add test 10.10.204.179 +add test 10.10.204.18 +add test 10.10.204.180 +add test 10.10.204.181 +add test 10.10.204.182 +add test 10.10.204.183 +add test 10.10.204.184 +add test 10.10.204.185 +add test 10.10.204.186 +add test 10.10.204.187 +add test 10.10.204.188 +add test 10.10.204.189 +add test 10.10.204.19 +add test 10.10.204.190 +add test 10.10.204.191 +add test 10.10.204.192 +add test 10.10.204.193 +add test 10.10.204.194 +add test 10.10.204.195 +add test 10.10.204.196 +add test 10.10.204.197 +add test 10.10.204.198 +add test 10.10.204.199 +add test 10.10.204.2 +add test 10.10.204.20 +add test 10.10.204.200 +add test 10.10.204.201 +add test 10.10.204.202 +add test 10.10.204.203 +add test 10.10.204.204 +add test 10.10.204.205 +add test 10.10.204.206 +add test 10.10.204.207 +add test 10.10.204.208 +add test 10.10.204.209 +add test 10.10.204.21 +add test 10.10.204.210 +add test 10.10.204.211 +add test 10.10.204.212 +add test 10.10.204.213 +add test 10.10.204.214 +add test 10.10.204.215 +add test 10.10.204.216 +add test 10.10.204.217 +add test 10.10.204.218 +add test 10.10.204.219 +add test 10.10.204.22 +add test 10.10.204.220 +add test 10.10.204.221 +add test 10.10.204.222 +add test 10.10.204.223 +add test 10.10.204.224 +add test 10.10.204.225 +add test 10.10.204.226 +add test 10.10.204.227 +add test 10.10.204.228 +add test 10.10.204.229 +add test 10.10.204.23 +add test 10.10.204.230 +add test 10.10.204.231 +add test 10.10.204.232 +add test 10.10.204.233 +add test 10.10.204.234 +add test 10.10.204.235 +add test 10.10.204.236 +add test 10.10.204.237 +add test 10.10.204.238 +add test 10.10.204.239 +add test 10.10.204.24 +add test 10.10.204.240 +add test 10.10.204.241 +add test 10.10.204.242 +add test 10.10.204.243 +add test 10.10.204.244 +add test 10.10.204.245 +add test 10.10.204.246 +add test 10.10.204.247 +add test 10.10.204.248 +add test 10.10.204.249 +add test 10.10.204.25 +add test 10.10.204.250 +add test 10.10.204.251 +add test 10.10.204.252 +add test 10.10.204.253 +add test 10.10.204.254 +add test 10.10.204.255 +add test 10.10.204.26 +add test 10.10.204.27 +add test 10.10.204.28 +add test 10.10.204.29 +add test 10.10.204.3 +add test 10.10.204.30 +add test 10.10.204.31 +add test 10.10.204.32 +add test 10.10.204.33 +add test 10.10.204.34 +add test 10.10.204.35 +add test 10.10.204.36 +add test 10.10.204.37 +add test 10.10.204.38 +add test 10.10.204.39 +add test 10.10.204.4 +add test 10.10.204.40 +add test 10.10.204.41 +add test 10.10.204.42 +add test 10.10.204.43 +add test 10.10.204.44 +add test 10.10.204.45 +add test 10.10.204.46 +add test 10.10.204.47 +add test 10.10.204.48 +add test 10.10.204.49 +add test 10.10.204.5 +add test 10.10.204.50 +add test 10.10.204.51 +add test 10.10.204.52 +add test 10.10.204.53 +add test 10.10.204.54 +add test 10.10.204.55 +add test 10.10.204.56 +add test 10.10.204.57 +add test 10.10.204.58 +add test 10.10.204.59 +add test 10.10.204.6 +add test 10.10.204.60 +add test 10.10.204.61 +add test 10.10.204.62 +add test 10.10.204.63 +add test 10.10.204.64 +add test 10.10.204.65 +add test 10.10.204.66 +add test 10.10.204.67 +add test 10.10.204.68 +add test 10.10.204.69 +add test 10.10.204.7 +add test 10.10.204.70 +add test 10.10.204.71 +add test 10.10.204.72 +add test 10.10.204.73 +add test 10.10.204.74 +add test 10.10.204.75 +add test 10.10.204.76 +add test 10.10.204.77 +add test 10.10.204.78 +add test 10.10.204.79 +add test 10.10.204.8 +add test 10.10.204.80 +add test 10.10.204.81 +add test 10.10.204.82 +add test 10.10.204.83 +add test 10.10.204.84 +add test 10.10.204.85 +add test 10.10.204.86 +add test 10.10.204.87 +add test 10.10.204.88 +add test 10.10.204.89 +add test 10.10.204.9 +add test 10.10.204.90 +add test 10.10.204.91 +add test 10.10.204.92 +add test 10.10.204.93 +add test 10.10.204.94 +add test 10.10.204.95 +add test 10.10.204.96 +add test 10.10.204.97 +add test 10.10.204.98 +add test 10.10.204.99 +add test 10.10.205.0 +add test 10.10.205.1 +add test 10.10.205.10 +add test 10.10.205.100 +add test 10.10.205.101 +add test 10.10.205.102 +add test 10.10.205.103 +add test 10.10.205.104 +add test 10.10.205.105 +add test 10.10.205.106 +add test 10.10.205.107 +add test 10.10.205.108 +add test 10.10.205.109 +add test 10.10.205.11 +add test 10.10.205.110 +add test 10.10.205.111 +add test 10.10.205.112 +add test 10.10.205.113 +add test 10.10.205.114 +add test 10.10.205.115 +add test 10.10.205.116 +add test 10.10.205.117 +add test 10.10.205.118 +add test 10.10.205.119 +add test 10.10.205.12 +add test 10.10.205.120 +add test 10.10.205.121 +add test 10.10.205.122 +add test 10.10.205.123 +add test 10.10.205.124 +add test 10.10.205.125 +add test 10.10.205.126 +add test 10.10.205.127 +add test 10.10.205.128 +add test 10.10.205.129 +add test 10.10.205.13 +add test 10.10.205.130 +add test 10.10.205.131 +add test 10.10.205.132 +add test 10.10.205.133 +add test 10.10.205.134 +add test 10.10.205.135 +add test 10.10.205.136 +add test 10.10.205.137 +add test 10.10.205.138 +add test 10.10.205.139 +add test 10.10.205.14 +add test 10.10.205.140 +add test 10.10.205.141 +add test 10.10.205.142 +add test 10.10.205.143 +add test 10.10.205.144 +add test 10.10.205.145 +add test 10.10.205.146 +add test 10.10.205.147 +add test 10.10.205.148 +add test 10.10.205.149 +add test 10.10.205.15 +add test 10.10.205.150 +add test 10.10.205.151 +add test 10.10.205.152 +add test 10.10.205.153 +add test 10.10.205.154 +add test 10.10.205.155 +add test 10.10.205.156 +add test 10.10.205.157 +add test 10.10.205.158 +add test 10.10.205.159 +add test 10.10.205.16 +add test 10.10.205.160 +add test 10.10.205.161 +add test 10.10.205.162 +add test 10.10.205.163 +add test 10.10.205.164 +add test 10.10.205.165 +add test 10.10.205.166 +add test 10.10.205.167 +add test 10.10.205.168 +add test 10.10.205.169 +add test 10.10.205.17 +add test 10.10.205.170 +add test 10.10.205.171 +add test 10.10.205.172 +add test 10.10.205.173 +add test 10.10.205.174 +add test 10.10.205.175 +add test 10.10.205.176 +add test 10.10.205.177 +add test 10.10.205.178 +add test 10.10.205.179 +add test 10.10.205.18 +add test 10.10.205.180 +add test 10.10.205.181 +add test 10.10.205.182 +add test 10.10.205.183 +add test 10.10.205.184 +add test 10.10.205.185 +add test 10.10.205.186 +add test 10.10.205.187 +add test 10.10.205.188 +add test 10.10.205.189 +add test 10.10.205.19 +add test 10.10.205.190 +add test 10.10.205.191 +add test 10.10.205.192 +add test 10.10.205.193 +add test 10.10.205.194 +add test 10.10.205.195 +add test 10.10.205.196 +add test 10.10.205.197 +add test 10.10.205.198 +add test 10.10.205.199 +add test 10.10.205.2 +add test 10.10.205.20 +add test 10.10.205.200 +add test 10.10.205.201 +add test 10.10.205.202 +add test 10.10.205.203 +add test 10.10.205.204 +add test 10.10.205.205 +add test 10.10.205.206 +add test 10.10.205.207 +add test 10.10.205.208 +add test 10.10.205.209 +add test 10.10.205.21 +add test 10.10.205.210 +add test 10.10.205.211 +add test 10.10.205.212 +add test 10.10.205.213 +add test 10.10.205.214 +add test 10.10.205.215 +add test 10.10.205.216 +add test 10.10.205.217 +add test 10.10.205.218 +add test 10.10.205.219 +add test 10.10.205.22 +add test 10.10.205.220 +add test 10.10.205.221 +add test 10.10.205.222 +add test 10.10.205.223 +add test 10.10.205.224 +add test 10.10.205.225 +add test 10.10.205.226 +add test 10.10.205.227 +add test 10.10.205.228 +add test 10.10.205.229 +add test 10.10.205.23 +add test 10.10.205.230 +add test 10.10.205.231 +add test 10.10.205.232 +add test 10.10.205.233 +add test 10.10.205.234 +add test 10.10.205.235 +add test 10.10.205.236 +add test 10.10.205.237 +add test 10.10.205.238 +add test 10.10.205.239 +add test 10.10.205.24 +add test 10.10.205.240 +add test 10.10.205.241 +add test 10.10.205.242 +add test 10.10.205.243 +add test 10.10.205.244 +add test 10.10.205.245 +add test 10.10.205.246 +add test 10.10.205.247 +add test 10.10.205.248 +add test 10.10.205.249 +add test 10.10.205.25 +add test 10.10.205.250 +add test 10.10.205.251 +add test 10.10.205.252 +add test 10.10.205.253 +add test 10.10.205.254 +add test 10.10.205.255 +add test 10.10.205.26 +add test 10.10.205.27 +add test 10.10.205.28 +add test 10.10.205.29 +add test 10.10.205.3 +add test 10.10.205.30 +add test 10.10.205.31 +add test 10.10.205.32 +add test 10.10.205.33 +add test 10.10.205.34 +add test 10.10.205.35 +add test 10.10.205.36 +add test 10.10.205.37 +add test 10.10.205.38 +add test 10.10.205.39 +add test 10.10.205.4 +add test 10.10.205.40 +add test 10.10.205.41 +add test 10.10.205.42 +add test 10.10.205.43 +add test 10.10.205.44 +add test 10.10.205.45 +add test 10.10.205.46 +add test 10.10.205.47 +add test 10.10.205.48 +add test 10.10.205.49 +add test 10.10.205.5 +add test 10.10.205.50 +add test 10.10.205.51 +add test 10.10.205.52 +add test 10.10.205.53 +add test 10.10.205.54 +add test 10.10.205.55 +add test 10.10.205.56 +add test 10.10.205.57 +add test 10.10.205.58 +add test 10.10.205.59 +add test 10.10.205.6 +add test 10.10.205.60 +add test 10.10.205.61 +add test 10.10.205.62 +add test 10.10.205.63 +add test 10.10.205.64 +add test 10.10.205.65 +add test 10.10.205.66 +add test 10.10.205.67 +add test 10.10.205.68 +add test 10.10.205.69 +add test 10.10.205.7 +add test 10.10.205.70 +add test 10.10.205.71 +add test 10.10.205.72 +add test 10.10.205.73 +add test 10.10.205.74 +add test 10.10.205.75 +add test 10.10.205.76 +add test 10.10.205.77 +add test 10.10.205.78 +add test 10.10.205.79 +add test 10.10.205.8 +add test 10.10.205.80 +add test 10.10.205.81 +add test 10.10.205.82 +add test 10.10.205.83 +add test 10.10.205.84 +add test 10.10.205.85 +add test 10.10.205.86 +add test 10.10.205.87 +add test 10.10.205.88 +add test 10.10.205.89 +add test 10.10.205.9 +add test 10.10.205.90 +add test 10.10.205.91 +add test 10.10.205.92 +add test 10.10.205.93 +add test 10.10.205.94 +add test 10.10.205.95 +add test 10.10.205.96 +add test 10.10.205.97 +add test 10.10.205.98 +add test 10.10.205.99 +add test 10.10.206.0 +add test 10.10.206.1 +add test 10.10.206.10 +add test 10.10.206.100 +add test 10.10.206.101 +add test 10.10.206.102 +add test 10.10.206.103 +add test 10.10.206.104 +add test 10.10.206.105 +add test 10.10.206.106 +add test 10.10.206.107 +add test 10.10.206.108 +add test 10.10.206.109 +add test 10.10.206.11 +add test 10.10.206.110 +add test 10.10.206.111 +add test 10.10.206.112 +add test 10.10.206.113 +add test 10.10.206.114 +add test 10.10.206.115 +add test 10.10.206.116 +add test 10.10.206.117 +add test 10.10.206.118 +add test 10.10.206.119 +add test 10.10.206.12 +add test 10.10.206.120 +add test 10.10.206.121 +add test 10.10.206.122 +add test 10.10.206.123 +add test 10.10.206.124 +add test 10.10.206.125 +add test 10.10.206.126 +add test 10.10.206.127 +add test 10.10.206.128 +add test 10.10.206.129 +add test 10.10.206.13 +add test 10.10.206.130 +add test 10.10.206.131 +add test 10.10.206.132 +add test 10.10.206.133 +add test 10.10.206.134 +add test 10.10.206.135 +add test 10.10.206.136 +add test 10.10.206.137 +add test 10.10.206.138 +add test 10.10.206.139 +add test 10.10.206.14 +add test 10.10.206.140 +add test 10.10.206.141 +add test 10.10.206.142 +add test 10.10.206.143 +add test 10.10.206.144 +add test 10.10.206.145 +add test 10.10.206.146 +add test 10.10.206.147 +add test 10.10.206.148 +add test 10.10.206.149 +add test 10.10.206.15 +add test 10.10.206.150 +add test 10.10.206.151 +add test 10.10.206.152 +add test 10.10.206.153 +add test 10.10.206.154 +add test 10.10.206.155 +add test 10.10.206.156 +add test 10.10.206.157 +add test 10.10.206.158 +add test 10.10.206.159 +add test 10.10.206.16 +add test 10.10.206.160 +add test 10.10.206.161 +add test 10.10.206.162 +add test 10.10.206.163 +add test 10.10.206.164 +add test 10.10.206.165 +add test 10.10.206.166 +add test 10.10.206.167 +add test 10.10.206.168 +add test 10.10.206.169 +add test 10.10.206.17 +add test 10.10.206.170 +add test 10.10.206.171 +add test 10.10.206.172 +add test 10.10.206.173 +add test 10.10.206.174 +add test 10.10.206.175 +add test 10.10.206.176 +add test 10.10.206.177 +add test 10.10.206.178 +add test 10.10.206.179 +add test 10.10.206.18 +add test 10.10.206.180 +add test 10.10.206.181 +add test 10.10.206.182 +add test 10.10.206.183 +add test 10.10.206.184 +add test 10.10.206.185 +add test 10.10.206.186 +add test 10.10.206.187 +add test 10.10.206.188 +add test 10.10.206.189 +add test 10.10.206.19 +add test 10.10.206.190 +add test 10.10.206.191 +add test 10.10.206.192 +add test 10.10.206.193 +add test 10.10.206.194 +add test 10.10.206.195 +add test 10.10.206.196 +add test 10.10.206.197 +add test 10.10.206.198 +add test 10.10.206.199 +add test 10.10.206.2 +add test 10.10.206.20 +add test 10.10.206.200 +add test 10.10.206.201 +add test 10.10.206.202 +add test 10.10.206.203 +add test 10.10.206.204 +add test 10.10.206.205 +add test 10.10.206.206 +add test 10.10.206.207 +add test 10.10.206.208 +add test 10.10.206.209 +add test 10.10.206.21 +add test 10.10.206.210 +add test 10.10.206.211 +add test 10.10.206.212 +add test 10.10.206.213 +add test 10.10.206.214 +add test 10.10.206.215 +add test 10.10.206.216 +add test 10.10.206.217 +add test 10.10.206.218 +add test 10.10.206.219 +add test 10.10.206.22 +add test 10.10.206.220 +add test 10.10.206.221 +add test 10.10.206.222 +add test 10.10.206.223 +add test 10.10.206.224 +add test 10.10.206.225 +add test 10.10.206.226 +add test 10.10.206.227 +add test 10.10.206.228 +add test 10.10.206.229 +add test 10.10.206.23 +add test 10.10.206.230 +add test 10.10.206.231 +add test 10.10.206.232 +add test 10.10.206.233 +add test 10.10.206.234 +add test 10.10.206.235 +add test 10.10.206.236 +add test 10.10.206.237 +add test 10.10.206.238 +add test 10.10.206.239 +add test 10.10.206.24 +add test 10.10.206.240 +add test 10.10.206.241 +add test 10.10.206.242 +add test 10.10.206.243 +add test 10.10.206.244 +add test 10.10.206.245 +add test 10.10.206.246 +add test 10.10.206.247 +add test 10.10.206.248 +add test 10.10.206.249 +add test 10.10.206.25 +add test 10.10.206.250 +add test 10.10.206.251 +add test 10.10.206.252 +add test 10.10.206.253 +add test 10.10.206.254 +add test 10.10.206.255 +add test 10.10.206.26 +add test 10.10.206.27 +add test 10.10.206.28 +add test 10.10.206.29 +add test 10.10.206.3 +add test 10.10.206.30 +add test 10.10.206.31 +add test 10.10.206.32 +add test 10.10.206.33 +add test 10.10.206.34 +add test 10.10.206.35 +add test 10.10.206.36 +add test 10.10.206.37 +add test 10.10.206.38 +add test 10.10.206.39 +add test 10.10.206.4 +add test 10.10.206.40 +add test 10.10.206.41 +add test 10.10.206.42 +add test 10.10.206.43 +add test 10.10.206.44 +add test 10.10.206.45 +add test 10.10.206.46 +add test 10.10.206.47 +add test 10.10.206.48 +add test 10.10.206.49 +add test 10.10.206.5 +add test 10.10.206.50 +add test 10.10.206.51 +add test 10.10.206.52 +add test 10.10.206.53 +add test 10.10.206.54 +add test 10.10.206.55 +add test 10.10.206.56 +add test 10.10.206.57 +add test 10.10.206.58 +add test 10.10.206.59 +add test 10.10.206.6 +add test 10.10.206.60 +add test 10.10.206.61 +add test 10.10.206.62 +add test 10.10.206.63 +add test 10.10.206.64 +add test 10.10.206.65 +add test 10.10.206.66 +add test 10.10.206.67 +add test 10.10.206.68 +add test 10.10.206.69 +add test 10.10.206.7 +add test 10.10.206.70 +add test 10.10.206.71 +add test 10.10.206.72 +add test 10.10.206.73 +add test 10.10.206.74 +add test 10.10.206.75 +add test 10.10.206.76 +add test 10.10.206.77 +add test 10.10.206.78 +add test 10.10.206.79 +add test 10.10.206.8 +add test 10.10.206.80 +add test 10.10.206.81 +add test 10.10.206.82 +add test 10.10.206.83 +add test 10.10.206.84 +add test 10.10.206.85 +add test 10.10.206.86 +add test 10.10.206.87 +add test 10.10.206.88 +add test 10.10.206.89 +add test 10.10.206.9 +add test 10.10.206.90 +add test 10.10.206.91 +add test 10.10.206.92 +add test 10.10.206.93 +add test 10.10.206.94 +add test 10.10.206.95 +add test 10.10.206.96 +add test 10.10.206.97 +add test 10.10.206.98 +add test 10.10.206.99 +add test 10.10.207.0 +add test 10.10.207.1 +add test 10.10.207.10 +add test 10.10.207.100 +add test 10.10.207.101 +add test 10.10.207.102 +add test 10.10.207.103 +add test 10.10.207.104 +add test 10.10.207.105 +add test 10.10.207.106 +add test 10.10.207.107 +add test 10.10.207.108 +add test 10.10.207.109 +add test 10.10.207.11 +add test 10.10.207.110 +add test 10.10.207.111 +add test 10.10.207.112 +add test 10.10.207.113 +add test 10.10.207.114 +add test 10.10.207.115 +add test 10.10.207.116 +add test 10.10.207.117 +add test 10.10.207.118 +add test 10.10.207.119 +add test 10.10.207.12 +add test 10.10.207.120 +add test 10.10.207.121 +add test 10.10.207.122 +add test 10.10.207.123 +add test 10.10.207.124 +add test 10.10.207.125 +add test 10.10.207.126 +add test 10.10.207.127 +add test 10.10.207.128 +add test 10.10.207.129 +add test 10.10.207.13 +add test 10.10.207.130 +add test 10.10.207.131 +add test 10.10.207.132 +add test 10.10.207.133 +add test 10.10.207.134 +add test 10.10.207.135 +add test 10.10.207.136 +add test 10.10.207.137 +add test 10.10.207.138 +add test 10.10.207.139 +add test 10.10.207.14 +add test 10.10.207.140 +add test 10.10.207.141 +add test 10.10.207.142 +add test 10.10.207.143 +add test 10.10.207.144 +add test 10.10.207.145 +add test 10.10.207.146 +add test 10.10.207.147 +add test 10.10.207.148 +add test 10.10.207.149 +add test 10.10.207.15 +add test 10.10.207.150 +add test 10.10.207.151 +add test 10.10.207.152 +add test 10.10.207.153 +add test 10.10.207.154 +add test 10.10.207.155 +add test 10.10.207.156 +add test 10.10.207.157 +add test 10.10.207.158 +add test 10.10.207.159 +add test 10.10.207.16 +add test 10.10.207.160 +add test 10.10.207.161 +add test 10.10.207.162 +add test 10.10.207.163 +add test 10.10.207.164 +add test 10.10.207.165 +add test 10.10.207.166 +add test 10.10.207.167 +add test 10.10.207.168 +add test 10.10.207.169 +add test 10.10.207.17 +add test 10.10.207.170 +add test 10.10.207.171 +add test 10.10.207.172 +add test 10.10.207.173 +add test 10.10.207.174 +add test 10.10.207.175 +add test 10.10.207.176 +add test 10.10.207.177 +add test 10.10.207.178 +add test 10.10.207.179 +add test 10.10.207.18 +add test 10.10.207.180 +add test 10.10.207.181 +add test 10.10.207.182 +add test 10.10.207.183 +add test 10.10.207.184 +add test 10.10.207.185 +add test 10.10.207.186 +add test 10.10.207.187 +add test 10.10.207.188 +add test 10.10.207.189 +add test 10.10.207.19 +add test 10.10.207.190 +add test 10.10.207.191 +add test 10.10.207.192 +add test 10.10.207.193 +add test 10.10.207.194 +add test 10.10.207.195 +add test 10.10.207.196 +add test 10.10.207.197 +add test 10.10.207.198 +add test 10.10.207.199 +add test 10.10.207.2 +add test 10.10.207.20 +add test 10.10.207.200 +add test 10.10.207.201 +add test 10.10.207.202 +add test 10.10.207.203 +add test 10.10.207.204 +add test 10.10.207.205 +add test 10.10.207.206 +add test 10.10.207.207 +add test 10.10.207.208 +add test 10.10.207.209 +add test 10.10.207.21 +add test 10.10.207.210 +add test 10.10.207.211 +add test 10.10.207.212 +add test 10.10.207.213 +add test 10.10.207.214 +add test 10.10.207.215 +add test 10.10.207.216 +add test 10.10.207.217 +add test 10.10.207.218 +add test 10.10.207.219 +add test 10.10.207.22 +add test 10.10.207.220 +add test 10.10.207.221 +add test 10.10.207.222 +add test 10.10.207.223 +add test 10.10.207.224 +add test 10.10.207.225 +add test 10.10.207.226 +add test 10.10.207.227 +add test 10.10.207.228 +add test 10.10.207.229 +add test 10.10.207.23 +add test 10.10.207.230 +add test 10.10.207.231 +add test 10.10.207.232 +add test 10.10.207.233 +add test 10.10.207.234 +add test 10.10.207.235 +add test 10.10.207.236 +add test 10.10.207.237 +add test 10.10.207.238 +add test 10.10.207.239 +add test 10.10.207.24 +add test 10.10.207.240 +add test 10.10.207.241 +add test 10.10.207.242 +add test 10.10.207.243 +add test 10.10.207.244 +add test 10.10.207.245 +add test 10.10.207.246 +add test 10.10.207.247 +add test 10.10.207.248 +add test 10.10.207.249 +add test 10.10.207.25 +add test 10.10.207.250 +add test 10.10.207.251 +add test 10.10.207.252 +add test 10.10.207.253 +add test 10.10.207.254 +add test 10.10.207.255 +add test 10.10.207.26 +add test 10.10.207.27 +add test 10.10.207.28 +add test 10.10.207.29 +add test 10.10.207.3 +add test 10.10.207.30 +add test 10.10.207.31 +add test 10.10.207.32 +add test 10.10.207.33 +add test 10.10.207.34 +add test 10.10.207.35 +add test 10.10.207.36 +add test 10.10.207.37 +add test 10.10.207.38 +add test 10.10.207.39 +add test 10.10.207.4 +add test 10.10.207.40 +add test 10.10.207.41 +add test 10.10.207.42 +add test 10.10.207.43 +add test 10.10.207.44 +add test 10.10.207.45 +add test 10.10.207.46 +add test 10.10.207.47 +add test 10.10.207.48 +add test 10.10.207.49 +add test 10.10.207.5 +add test 10.10.207.50 +add test 10.10.207.51 +add test 10.10.207.52 +add test 10.10.207.53 +add test 10.10.207.54 +add test 10.10.207.55 +add test 10.10.207.56 +add test 10.10.207.57 +add test 10.10.207.58 +add test 10.10.207.59 +add test 10.10.207.6 +add test 10.10.207.60 +add test 10.10.207.61 +add test 10.10.207.62 +add test 10.10.207.63 +add test 10.10.207.64 +add test 10.10.207.65 +add test 10.10.207.66 +add test 10.10.207.67 +add test 10.10.207.68 +add test 10.10.207.69 +add test 10.10.207.7 +add test 10.10.207.70 +add test 10.10.207.71 +add test 10.10.207.72 +add test 10.10.207.73 +add test 10.10.207.74 +add test 10.10.207.75 +add test 10.10.207.76 +add test 10.10.207.77 +add test 10.10.207.78 +add test 10.10.207.79 +add test 10.10.207.8 +add test 10.10.207.80 +add test 10.10.207.81 +add test 10.10.207.82 +add test 10.10.207.83 +add test 10.10.207.84 +add test 10.10.207.85 +add test 10.10.207.86 +add test 10.10.207.87 +add test 10.10.207.88 +add test 10.10.207.89 +add test 10.10.207.9 +add test 10.10.207.90 +add test 10.10.207.91 +add test 10.10.207.92 +add test 10.10.207.93 +add test 10.10.207.94 +add test 10.10.207.95 +add test 10.10.207.96 +add test 10.10.207.97 +add test 10.10.207.98 +add test 10.10.207.99 +add test 10.10.208.0 +add test 10.10.208.1 +add test 10.10.208.10 +add test 10.10.208.100 +add test 10.10.208.101 +add test 10.10.208.102 +add test 10.10.208.103 +add test 10.10.208.104 +add test 10.10.208.105 +add test 10.10.208.106 +add test 10.10.208.107 +add test 10.10.208.108 +add test 10.10.208.109 +add test 10.10.208.11 +add test 10.10.208.110 +add test 10.10.208.111 +add test 10.10.208.112 +add test 10.10.208.113 +add test 10.10.208.114 +add test 10.10.208.115 +add test 10.10.208.116 +add test 10.10.208.117 +add test 10.10.208.118 +add test 10.10.208.119 +add test 10.10.208.12 +add test 10.10.208.120 +add test 10.10.208.121 +add test 10.10.208.122 +add test 10.10.208.123 +add test 10.10.208.124 +add test 10.10.208.125 +add test 10.10.208.126 +add test 10.10.208.127 +add test 10.10.208.128 +add test 10.10.208.129 +add test 10.10.208.13 +add test 10.10.208.130 +add test 10.10.208.131 +add test 10.10.208.132 +add test 10.10.208.133 +add test 10.10.208.134 +add test 10.10.208.135 +add test 10.10.208.136 +add test 10.10.208.137 +add test 10.10.208.138 +add test 10.10.208.139 +add test 10.10.208.14 +add test 10.10.208.140 +add test 10.10.208.141 +add test 10.10.208.142 +add test 10.10.208.143 +add test 10.10.208.144 +add test 10.10.208.145 +add test 10.10.208.146 +add test 10.10.208.147 +add test 10.10.208.148 +add test 10.10.208.149 +add test 10.10.208.15 +add test 10.10.208.150 +add test 10.10.208.151 +add test 10.10.208.152 +add test 10.10.208.153 +add test 10.10.208.154 +add test 10.10.208.155 +add test 10.10.208.156 +add test 10.10.208.157 +add test 10.10.208.158 +add test 10.10.208.159 +add test 10.10.208.16 +add test 10.10.208.160 +add test 10.10.208.161 +add test 10.10.208.162 +add test 10.10.208.163 +add test 10.10.208.164 +add test 10.10.208.165 +add test 10.10.208.166 +add test 10.10.208.167 +add test 10.10.208.168 +add test 10.10.208.169 +add test 10.10.208.17 +add test 10.10.208.170 +add test 10.10.208.171 +add test 10.10.208.172 +add test 10.10.208.173 +add test 10.10.208.174 +add test 10.10.208.175 +add test 10.10.208.176 +add test 10.10.208.177 +add test 10.10.208.178 +add test 10.10.208.179 +add test 10.10.208.18 +add test 10.10.208.180 +add test 10.10.208.181 +add test 10.10.208.182 +add test 10.10.208.183 +add test 10.10.208.184 +add test 10.10.208.185 +add test 10.10.208.186 +add test 10.10.208.187 +add test 10.10.208.188 +add test 10.10.208.189 +add test 10.10.208.19 +add test 10.10.208.190 +add test 10.10.208.191 +add test 10.10.208.192 +add test 10.10.208.193 +add test 10.10.208.194 +add test 10.10.208.195 +add test 10.10.208.196 +add test 10.10.208.197 +add test 10.10.208.198 +add test 10.10.208.199 +add test 10.10.208.2 +add test 10.10.208.20 +add test 10.10.208.200 +add test 10.10.208.201 +add test 10.10.208.202 +add test 10.10.208.203 +add test 10.10.208.204 +add test 10.10.208.205 +add test 10.10.208.206 +add test 10.10.208.207 +add test 10.10.208.208 +add test 10.10.208.209 +add test 10.10.208.21 +add test 10.10.208.210 +add test 10.10.208.211 +add test 10.10.208.212 +add test 10.10.208.213 +add test 10.10.208.214 +add test 10.10.208.215 +add test 10.10.208.216 +add test 10.10.208.217 +add test 10.10.208.218 +add test 10.10.208.219 +add test 10.10.208.22 +add test 10.10.208.220 +add test 10.10.208.221 +add test 10.10.208.222 +add test 10.10.208.223 +add test 10.10.208.224 +add test 10.10.208.225 +add test 10.10.208.226 +add test 10.10.208.227 +add test 10.10.208.228 +add test 10.10.208.229 +add test 10.10.208.23 +add test 10.10.208.230 +add test 10.10.208.231 +add test 10.10.208.232 +add test 10.10.208.233 +add test 10.10.208.234 +add test 10.10.208.235 +add test 10.10.208.236 +add test 10.10.208.237 +add test 10.10.208.238 +add test 10.10.208.239 +add test 10.10.208.24 +add test 10.10.208.240 +add test 10.10.208.241 +add test 10.10.208.242 +add test 10.10.208.243 +add test 10.10.208.244 +add test 10.10.208.245 +add test 10.10.208.246 +add test 10.10.208.247 +add test 10.10.208.248 +add test 10.10.208.249 +add test 10.10.208.25 +add test 10.10.208.250 +add test 10.10.208.251 +add test 10.10.208.252 +add test 10.10.208.253 +add test 10.10.208.254 +add test 10.10.208.255 +add test 10.10.208.26 +add test 10.10.208.27 +add test 10.10.208.28 +add test 10.10.208.29 +add test 10.10.208.3 +add test 10.10.208.30 +add test 10.10.208.31 +add test 10.10.208.32 +add test 10.10.208.33 +add test 10.10.208.34 +add test 10.10.208.35 +add test 10.10.208.36 +add test 10.10.208.37 +add test 10.10.208.38 +add test 10.10.208.39 +add test 10.10.208.4 +add test 10.10.208.40 +add test 10.10.208.41 +add test 10.10.208.42 +add test 10.10.208.43 +add test 10.10.208.44 +add test 10.10.208.45 +add test 10.10.208.46 +add test 10.10.208.47 +add test 10.10.208.48 +add test 10.10.208.49 +add test 10.10.208.5 +add test 10.10.208.50 +add test 10.10.208.51 +add test 10.10.208.52 +add test 10.10.208.53 +add test 10.10.208.54 +add test 10.10.208.55 +add test 10.10.208.56 +add test 10.10.208.57 +add test 10.10.208.58 +add test 10.10.208.59 +add test 10.10.208.6 +add test 10.10.208.60 +add test 10.10.208.61 +add test 10.10.208.62 +add test 10.10.208.63 +add test 10.10.208.64 +add test 10.10.208.65 +add test 10.10.208.66 +add test 10.10.208.67 +add test 10.10.208.68 +add test 10.10.208.69 +add test 10.10.208.7 +add test 10.10.208.70 +add test 10.10.208.71 +add test 10.10.208.72 +add test 10.10.208.73 +add test 10.10.208.74 +add test 10.10.208.75 +add test 10.10.208.76 +add test 10.10.208.77 +add test 10.10.208.78 +add test 10.10.208.79 +add test 10.10.208.8 +add test 10.10.208.80 +add test 10.10.208.81 +add test 10.10.208.82 +add test 10.10.208.83 +add test 10.10.208.84 +add test 10.10.208.85 +add test 10.10.208.86 +add test 10.10.208.87 +add test 10.10.208.88 +add test 10.10.208.89 +add test 10.10.208.9 +add test 10.10.208.90 +add test 10.10.208.91 +add test 10.10.208.92 +add test 10.10.208.93 +add test 10.10.208.94 +add test 10.10.208.95 +add test 10.10.208.96 +add test 10.10.208.97 +add test 10.10.208.98 +add test 10.10.208.99 +add test 10.10.209.0 +add test 10.10.209.1 +add test 10.10.209.10 +add test 10.10.209.100 +add test 10.10.209.101 +add test 10.10.209.102 +add test 10.10.209.103 +add test 10.10.209.104 +add test 10.10.209.105 +add test 10.10.209.106 +add test 10.10.209.107 +add test 10.10.209.108 +add test 10.10.209.109 +add test 10.10.209.11 +add test 10.10.209.110 +add test 10.10.209.111 +add test 10.10.209.112 +add test 10.10.209.113 +add test 10.10.209.114 +add test 10.10.209.115 +add test 10.10.209.116 +add test 10.10.209.117 +add test 10.10.209.118 +add test 10.10.209.119 +add test 10.10.209.12 +add test 10.10.209.120 +add test 10.10.209.121 +add test 10.10.209.122 +add test 10.10.209.123 +add test 10.10.209.124 +add test 10.10.209.125 +add test 10.10.209.126 +add test 10.10.209.127 +add test 10.10.209.128 +add test 10.10.209.129 +add test 10.10.209.13 +add test 10.10.209.130 +add test 10.10.209.131 +add test 10.10.209.132 +add test 10.10.209.133 +add test 10.10.209.134 +add test 10.10.209.135 +add test 10.10.209.136 +add test 10.10.209.137 +add test 10.10.209.138 +add test 10.10.209.139 +add test 10.10.209.14 +add test 10.10.209.140 +add test 10.10.209.141 +add test 10.10.209.142 +add test 10.10.209.143 +add test 10.10.209.144 +add test 10.10.209.145 +add test 10.10.209.146 +add test 10.10.209.147 +add test 10.10.209.148 +add test 10.10.209.149 +add test 10.10.209.15 +add test 10.10.209.150 +add test 10.10.209.151 +add test 10.10.209.152 +add test 10.10.209.153 +add test 10.10.209.154 +add test 10.10.209.155 +add test 10.10.209.156 +add test 10.10.209.157 +add test 10.10.209.158 +add test 10.10.209.159 +add test 10.10.209.16 +add test 10.10.209.160 +add test 10.10.209.161 +add test 10.10.209.162 +add test 10.10.209.163 +add test 10.10.209.164 +add test 10.10.209.165 +add test 10.10.209.166 +add test 10.10.209.167 +add test 10.10.209.168 +add test 10.10.209.169 +add test 10.10.209.17 +add test 10.10.209.170 +add test 10.10.209.171 +add test 10.10.209.172 +add test 10.10.209.173 +add test 10.10.209.174 +add test 10.10.209.175 +add test 10.10.209.176 +add test 10.10.209.177 +add test 10.10.209.178 +add test 10.10.209.179 +add test 10.10.209.18 +add test 10.10.209.180 +add test 10.10.209.181 +add test 10.10.209.182 +add test 10.10.209.183 +add test 10.10.209.184 +add test 10.10.209.185 +add test 10.10.209.186 +add test 10.10.209.187 +add test 10.10.209.188 +add test 10.10.209.189 +add test 10.10.209.19 +add test 10.10.209.190 +add test 10.10.209.191 +add test 10.10.209.192 +add test 10.10.209.193 +add test 10.10.209.194 +add test 10.10.209.195 +add test 10.10.209.196 +add test 10.10.209.197 +add test 10.10.209.198 +add test 10.10.209.199 +add test 10.10.209.2 +add test 10.10.209.20 +add test 10.10.209.200 +add test 10.10.209.201 +add test 10.10.209.202 +add test 10.10.209.203 +add test 10.10.209.204 +add test 10.10.209.205 +add test 10.10.209.206 +add test 10.10.209.207 +add test 10.10.209.208 +add test 10.10.209.209 +add test 10.10.209.21 +add test 10.10.209.210 +add test 10.10.209.211 +add test 10.10.209.212 +add test 10.10.209.213 +add test 10.10.209.214 +add test 10.10.209.215 +add test 10.10.209.216 +add test 10.10.209.217 +add test 10.10.209.218 +add test 10.10.209.219 +add test 10.10.209.22 +add test 10.10.209.220 +add test 10.10.209.221 +add test 10.10.209.222 +add test 10.10.209.223 +add test 10.10.209.224 +add test 10.10.209.225 +add test 10.10.209.226 +add test 10.10.209.227 +add test 10.10.209.228 +add test 10.10.209.229 +add test 10.10.209.23 +add test 10.10.209.230 +add test 10.10.209.231 +add test 10.10.209.232 +add test 10.10.209.233 +add test 10.10.209.234 +add test 10.10.209.235 +add test 10.10.209.236 +add test 10.10.209.237 +add test 10.10.209.238 +add test 10.10.209.239 +add test 10.10.209.24 +add test 10.10.209.240 +add test 10.10.209.241 +add test 10.10.209.242 +add test 10.10.209.243 +add test 10.10.209.244 +add test 10.10.209.245 +add test 10.10.209.246 +add test 10.10.209.247 +add test 10.10.209.248 +add test 10.10.209.249 +add test 10.10.209.25 +add test 10.10.209.250 +add test 10.10.209.251 +add test 10.10.209.252 +add test 10.10.209.253 +add test 10.10.209.254 +add test 10.10.209.255 +add test 10.10.209.26 +add test 10.10.209.27 +add test 10.10.209.28 +add test 10.10.209.29 +add test 10.10.209.3 +add test 10.10.209.30 +add test 10.10.209.31 +add test 10.10.209.32 +add test 10.10.209.33 +add test 10.10.209.34 +add test 10.10.209.35 +add test 10.10.209.36 +add test 10.10.209.37 +add test 10.10.209.38 +add test 10.10.209.39 +add test 10.10.209.4 +add test 10.10.209.40 +add test 10.10.209.41 +add test 10.10.209.42 +add test 10.10.209.43 +add test 10.10.209.44 +add test 10.10.209.45 +add test 10.10.209.46 +add test 10.10.209.47 +add test 10.10.209.48 +add test 10.10.209.49 +add test 10.10.209.5 +add test 10.10.209.50 +add test 10.10.209.51 +add test 10.10.209.52 +add test 10.10.209.53 +add test 10.10.209.54 +add test 10.10.209.55 +add test 10.10.209.56 +add test 10.10.209.57 +add test 10.10.209.58 +add test 10.10.209.59 +add test 10.10.209.6 +add test 10.10.209.60 +add test 10.10.209.61 +add test 10.10.209.62 +add test 10.10.209.63 +add test 10.10.209.64 +add test 10.10.209.65 +add test 10.10.209.66 +add test 10.10.209.67 +add test 10.10.209.68 +add test 10.10.209.69 +add test 10.10.209.7 +add test 10.10.209.70 +add test 10.10.209.71 +add test 10.10.209.72 +add test 10.10.209.73 +add test 10.10.209.74 +add test 10.10.209.75 +add test 10.10.209.76 +add test 10.10.209.77 +add test 10.10.209.78 +add test 10.10.209.79 +add test 10.10.209.8 +add test 10.10.209.80 +add test 10.10.209.81 +add test 10.10.209.82 +add test 10.10.209.83 +add test 10.10.209.84 +add test 10.10.209.85 +add test 10.10.209.86 +add test 10.10.209.87 +add test 10.10.209.88 +add test 10.10.209.89 +add test 10.10.209.9 +add test 10.10.209.90 +add test 10.10.209.91 +add test 10.10.209.92 +add test 10.10.209.93 +add test 10.10.209.94 +add test 10.10.209.95 +add test 10.10.209.96 +add test 10.10.209.97 +add test 10.10.209.98 +add test 10.10.209.99 +add test 10.10.21.0 +add test 10.10.21.1 +add test 10.10.21.10 +add test 10.10.21.100 +add test 10.10.21.101 +add test 10.10.21.102 +add test 10.10.21.103 +add test 10.10.21.104 +add test 10.10.21.105 +add test 10.10.21.106 +add test 10.10.21.107 +add test 10.10.21.108 +add test 10.10.21.109 +add test 10.10.21.11 +add test 10.10.21.110 +add test 10.10.21.111 +add test 10.10.21.112 +add test 10.10.21.113 +add test 10.10.21.114 +add test 10.10.21.115 +add test 10.10.21.116 +add test 10.10.21.117 +add test 10.10.21.118 +add test 10.10.21.119 +add test 10.10.21.12 +add test 10.10.21.120 +add test 10.10.21.121 +add test 10.10.21.122 +add test 10.10.21.123 +add test 10.10.21.124 +add test 10.10.21.125 +add test 10.10.21.126 +add test 10.10.21.127 +add test 10.10.21.128 +add test 10.10.21.129 +add test 10.10.21.13 +add test 10.10.21.130 +add test 10.10.21.131 +add test 10.10.21.132 +add test 10.10.21.133 +add test 10.10.21.134 +add test 10.10.21.135 +add test 10.10.21.136 +add test 10.10.21.137 +add test 10.10.21.138 +add test 10.10.21.139 +add test 10.10.21.14 +add test 10.10.21.140 +add test 10.10.21.141 +add test 10.10.21.142 +add test 10.10.21.143 +add test 10.10.21.144 +add test 10.10.21.145 +add test 10.10.21.146 +add test 10.10.21.147 +add test 10.10.21.148 +add test 10.10.21.149 +add test 10.10.21.15 +add test 10.10.21.150 +add test 10.10.21.151 +add test 10.10.21.152 +add test 10.10.21.153 +add test 10.10.21.154 +add test 10.10.21.155 +add test 10.10.21.156 +add test 10.10.21.157 +add test 10.10.21.158 +add test 10.10.21.159 +add test 10.10.21.16 +add test 10.10.21.160 +add test 10.10.21.161 +add test 10.10.21.162 +add test 10.10.21.163 +add test 10.10.21.164 +add test 10.10.21.165 +add test 10.10.21.166 +add test 10.10.21.167 +add test 10.10.21.168 +add test 10.10.21.169 +add test 10.10.21.17 +add test 10.10.21.170 +add test 10.10.21.171 +add test 10.10.21.172 +add test 10.10.21.173 +add test 10.10.21.174 +add test 10.10.21.175 +add test 10.10.21.176 +add test 10.10.21.177 +add test 10.10.21.178 +add test 10.10.21.179 +add test 10.10.21.18 +add test 10.10.21.180 +add test 10.10.21.181 +add test 10.10.21.182 +add test 10.10.21.183 +add test 10.10.21.184 +add test 10.10.21.185 +add test 10.10.21.186 +add test 10.10.21.187 +add test 10.10.21.188 +add test 10.10.21.189 +add test 10.10.21.19 +add test 10.10.21.190 +add test 10.10.21.191 +add test 10.10.21.192 +add test 10.10.21.193 +add test 10.10.21.194 +add test 10.10.21.195 +add test 10.10.21.196 +add test 10.10.21.197 +add test 10.10.21.198 +add test 10.10.21.199 +add test 10.10.21.2 +add test 10.10.21.20 +add test 10.10.21.200 +add test 10.10.21.201 +add test 10.10.21.202 +add test 10.10.21.203 +add test 10.10.21.204 +add test 10.10.21.205 +add test 10.10.21.206 +add test 10.10.21.207 +add test 10.10.21.208 +add test 10.10.21.209 +add test 10.10.21.21 +add test 10.10.21.210 +add test 10.10.21.211 +add test 10.10.21.212 +add test 10.10.21.213 +add test 10.10.21.214 +add test 10.10.21.215 +add test 10.10.21.216 +add test 10.10.21.217 +add test 10.10.21.218 +add test 10.10.21.219 +add test 10.10.21.22 +add test 10.10.21.220 +add test 10.10.21.221 +add test 10.10.21.222 +add test 10.10.21.223 +add test 10.10.21.224 +add test 10.10.21.225 +add test 10.10.21.226 +add test 10.10.21.227 +add test 10.10.21.228 +add test 10.10.21.229 +add test 10.10.21.23 +add test 10.10.21.230 +add test 10.10.21.231 +add test 10.10.21.232 +add test 10.10.21.233 +add test 10.10.21.234 +add test 10.10.21.235 +add test 10.10.21.236 +add test 10.10.21.237 +add test 10.10.21.238 +add test 10.10.21.239 +add test 10.10.21.24 +add test 10.10.21.240 +add test 10.10.21.241 +add test 10.10.21.242 +add test 10.10.21.243 +add test 10.10.21.244 +add test 10.10.21.245 +add test 10.10.21.246 +add test 10.10.21.247 +add test 10.10.21.248 +add test 10.10.21.249 +add test 10.10.21.25 +add test 10.10.21.250 +add test 10.10.21.251 +add test 10.10.21.252 +add test 10.10.21.253 +add test 10.10.21.254 +add test 10.10.21.255 +add test 10.10.21.26 +add test 10.10.21.27 +add test 10.10.21.28 +add test 10.10.21.29 +add test 10.10.21.3 +add test 10.10.21.30 +add test 10.10.21.31 +add test 10.10.21.32 +add test 10.10.21.33 +add test 10.10.21.34 +add test 10.10.21.35 +add test 10.10.21.36 +add test 10.10.21.37 +add test 10.10.21.38 +add test 10.10.21.39 +add test 10.10.21.4 +add test 10.10.21.40 +add test 10.10.21.41 +add test 10.10.21.42 +add test 10.10.21.43 +add test 10.10.21.44 +add test 10.10.21.45 +add test 10.10.21.46 +add test 10.10.21.47 +add test 10.10.21.48 +add test 10.10.21.49 +add test 10.10.21.5 +add test 10.10.21.50 +add test 10.10.21.51 +add test 10.10.21.52 +add test 10.10.21.53 +add test 10.10.21.54 +add test 10.10.21.55 +add test 10.10.21.56 +add test 10.10.21.57 +add test 10.10.21.58 +add test 10.10.21.59 +add test 10.10.21.6 +add test 10.10.21.60 +add test 10.10.21.61 +add test 10.10.21.62 +add test 10.10.21.63 +add test 10.10.21.64 +add test 10.10.21.65 +add test 10.10.21.66 +add test 10.10.21.67 +add test 10.10.21.68 +add test 10.10.21.69 +add test 10.10.21.7 +add test 10.10.21.70 +add test 10.10.21.71 +add test 10.10.21.72 +add test 10.10.21.73 +add test 10.10.21.74 +add test 10.10.21.75 +add test 10.10.21.76 +add test 10.10.21.77 +add test 10.10.21.78 +add test 10.10.21.79 +add test 10.10.21.8 +add test 10.10.21.80 +add test 10.10.21.81 +add test 10.10.21.82 +add test 10.10.21.83 +add test 10.10.21.84 +add test 10.10.21.85 +add test 10.10.21.86 +add test 10.10.21.87 +add test 10.10.21.88 +add test 10.10.21.89 +add test 10.10.21.9 +add test 10.10.21.90 +add test 10.10.21.91 +add test 10.10.21.92 +add test 10.10.21.93 +add test 10.10.21.94 +add test 10.10.21.95 +add test 10.10.21.96 +add test 10.10.21.97 +add test 10.10.21.98 +add test 10.10.21.99 +add test 10.10.210.0 +add test 10.10.210.1 +add test 10.10.210.10 +add test 10.10.210.100 +add test 10.10.210.101 +add test 10.10.210.102 +add test 10.10.210.103 +add test 10.10.210.104 +add test 10.10.210.105 +add test 10.10.210.106 +add test 10.10.210.107 +add test 10.10.210.108 +add test 10.10.210.109 +add test 10.10.210.11 +add test 10.10.210.110 +add test 10.10.210.111 +add test 10.10.210.112 +add test 10.10.210.113 +add test 10.10.210.114 +add test 10.10.210.115 +add test 10.10.210.116 +add test 10.10.210.117 +add test 10.10.210.118 +add test 10.10.210.119 +add test 10.10.210.12 +add test 10.10.210.120 +add test 10.10.210.121 +add test 10.10.210.122 +add test 10.10.210.123 +add test 10.10.210.124 +add test 10.10.210.125 +add test 10.10.210.126 +add test 10.10.210.127 +add test 10.10.210.128 +add test 10.10.210.129 +add test 10.10.210.13 +add test 10.10.210.130 +add test 10.10.210.131 +add test 10.10.210.132 +add test 10.10.210.133 +add test 10.10.210.134 +add test 10.10.210.135 +add test 10.10.210.136 +add test 10.10.210.137 +add test 10.10.210.138 +add test 10.10.210.139 +add test 10.10.210.14 +add test 10.10.210.140 +add test 10.10.210.141 +add test 10.10.210.142 +add test 10.10.210.143 +add test 10.10.210.144 +add test 10.10.210.145 +add test 10.10.210.146 +add test 10.10.210.147 +add test 10.10.210.148 +add test 10.10.210.149 +add test 10.10.210.15 +add test 10.10.210.150 +add test 10.10.210.151 +add test 10.10.210.152 +add test 10.10.210.153 +add test 10.10.210.154 +add test 10.10.210.155 +add test 10.10.210.156 +add test 10.10.210.157 +add test 10.10.210.158 +add test 10.10.210.159 +add test 10.10.210.16 +add test 10.10.210.160 +add test 10.10.210.161 +add test 10.10.210.162 +add test 10.10.210.163 +add test 10.10.210.164 +add test 10.10.210.165 +add test 10.10.210.166 +add test 10.10.210.167 +add test 10.10.210.168 +add test 10.10.210.169 +add test 10.10.210.17 +add test 10.10.210.170 +add test 10.10.210.171 +add test 10.10.210.172 +add test 10.10.210.173 +add test 10.10.210.174 +add test 10.10.210.175 +add test 10.10.210.176 +add test 10.10.210.177 +add test 10.10.210.178 +add test 10.10.210.179 +add test 10.10.210.18 +add test 10.10.210.180 +add test 10.10.210.181 +add test 10.10.210.182 +add test 10.10.210.183 +add test 10.10.210.184 +add test 10.10.210.185 +add test 10.10.210.186 +add test 10.10.210.187 +add test 10.10.210.188 +add test 10.10.210.189 +add test 10.10.210.19 +add test 10.10.210.190 +add test 10.10.210.191 +add test 10.10.210.192 +add test 10.10.210.193 +add test 10.10.210.194 +add test 10.10.210.195 +add test 10.10.210.196 +add test 10.10.210.197 +add test 10.10.210.198 +add test 10.10.210.199 +add test 10.10.210.2 +add test 10.10.210.20 +add test 10.10.210.200 +add test 10.10.210.201 +add test 10.10.210.202 +add test 10.10.210.203 +add test 10.10.210.204 +add test 10.10.210.205 +add test 10.10.210.206 +add test 10.10.210.207 +add test 10.10.210.208 +add test 10.10.210.209 +add test 10.10.210.21 +add test 10.10.210.210 +add test 10.10.210.211 +add test 10.10.210.212 +add test 10.10.210.213 +add test 10.10.210.214 +add test 10.10.210.215 +add test 10.10.210.216 +add test 10.10.210.217 +add test 10.10.210.218 +add test 10.10.210.219 +add test 10.10.210.22 +add test 10.10.210.220 +add test 10.10.210.221 +add test 10.10.210.222 +add test 10.10.210.223 +add test 10.10.210.224 +add test 10.10.210.225 +add test 10.10.210.226 +add test 10.10.210.227 +add test 10.10.210.228 +add test 10.10.210.229 +add test 10.10.210.23 +add test 10.10.210.230 +add test 10.10.210.231 +add test 10.10.210.232 +add test 10.10.210.233 +add test 10.10.210.234 +add test 10.10.210.235 +add test 10.10.210.236 +add test 10.10.210.237 +add test 10.10.210.238 +add test 10.10.210.239 +add test 10.10.210.24 +add test 10.10.210.240 +add test 10.10.210.241 +add test 10.10.210.242 +add test 10.10.210.243 +add test 10.10.210.244 +add test 10.10.210.245 +add test 10.10.210.246 +add test 10.10.210.247 +add test 10.10.210.248 +add test 10.10.210.249 +add test 10.10.210.25 +add test 10.10.210.250 +add test 10.10.210.251 +add test 10.10.210.252 +add test 10.10.210.253 +add test 10.10.210.254 +add test 10.10.210.255 +add test 10.10.210.26 +add test 10.10.210.27 +add test 10.10.210.28 +add test 10.10.210.29 +add test 10.10.210.3 +add test 10.10.210.30 +add test 10.10.210.31 +add test 10.10.210.32 +add test 10.10.210.33 +add test 10.10.210.34 +add test 10.10.210.35 +add test 10.10.210.36 +add test 10.10.210.37 +add test 10.10.210.38 +add test 10.10.210.39 +add test 10.10.210.4 +add test 10.10.210.40 +add test 10.10.210.41 +add test 10.10.210.42 +add test 10.10.210.43 +add test 10.10.210.44 +add test 10.10.210.45 +add test 10.10.210.46 +add test 10.10.210.47 +add test 10.10.210.48 +add test 10.10.210.49 +add test 10.10.210.5 +add test 10.10.210.50 +add test 10.10.210.51 +add test 10.10.210.52 +add test 10.10.210.53 +add test 10.10.210.54 +add test 10.10.210.55 +add test 10.10.210.56 +add test 10.10.210.57 +add test 10.10.210.58 +add test 10.10.210.59 +add test 10.10.210.6 +add test 10.10.210.60 +add test 10.10.210.61 +add test 10.10.210.62 +add test 10.10.210.63 +add test 10.10.210.64 +add test 10.10.210.65 +add test 10.10.210.66 +add test 10.10.210.67 +add test 10.10.210.68 +add test 10.10.210.69 +add test 10.10.210.7 +add test 10.10.210.70 +add test 10.10.210.71 +add test 10.10.210.72 +add test 10.10.210.73 +add test 10.10.210.74 +add test 10.10.210.75 +add test 10.10.210.76 +add test 10.10.210.77 +add test 10.10.210.78 +add test 10.10.210.79 +add test 10.10.210.8 +add test 10.10.210.80 +add test 10.10.210.81 +add test 10.10.210.82 +add test 10.10.210.83 +add test 10.10.210.84 +add test 10.10.210.85 +add test 10.10.210.86 +add test 10.10.210.87 +add test 10.10.210.88 +add test 10.10.210.89 +add test 10.10.210.9 +add test 10.10.210.90 +add test 10.10.210.91 +add test 10.10.210.92 +add test 10.10.210.93 +add test 10.10.210.94 +add test 10.10.210.95 +add test 10.10.210.96 +add test 10.10.210.97 +add test 10.10.210.98 +add test 10.10.210.99 +add test 10.10.211.0 +add test 10.10.211.1 +add test 10.10.211.10 +add test 10.10.211.100 +add test 10.10.211.101 +add test 10.10.211.102 +add test 10.10.211.103 +add test 10.10.211.104 +add test 10.10.211.105 +add test 10.10.211.106 +add test 10.10.211.107 +add test 10.10.211.108 +add test 10.10.211.109 +add test 10.10.211.11 +add test 10.10.211.110 +add test 10.10.211.111 +add test 10.10.211.112 +add test 10.10.211.113 +add test 10.10.211.114 +add test 10.10.211.115 +add test 10.10.211.116 +add test 10.10.211.117 +add test 10.10.211.118 +add test 10.10.211.119 +add test 10.10.211.12 +add test 10.10.211.120 +add test 10.10.211.121 +add test 10.10.211.122 +add test 10.10.211.123 +add test 10.10.211.124 +add test 10.10.211.125 +add test 10.10.211.126 +add test 10.10.211.127 +add test 10.10.211.128 +add test 10.10.211.129 +add test 10.10.211.13 +add test 10.10.211.130 +add test 10.10.211.131 +add test 10.10.211.132 +add test 10.10.211.133 +add test 10.10.211.134 +add test 10.10.211.135 +add test 10.10.211.136 +add test 10.10.211.137 +add test 10.10.211.138 +add test 10.10.211.139 +add test 10.10.211.14 +add test 10.10.211.140 +add test 10.10.211.141 +add test 10.10.211.142 +add test 10.10.211.143 +add test 10.10.211.144 +add test 10.10.211.145 +add test 10.10.211.146 +add test 10.10.211.147 +add test 10.10.211.148 +add test 10.10.211.149 +add test 10.10.211.15 +add test 10.10.211.150 +add test 10.10.211.151 +add test 10.10.211.152 +add test 10.10.211.153 +add test 10.10.211.154 +add test 10.10.211.155 +add test 10.10.211.156 +add test 10.10.211.157 +add test 10.10.211.158 +add test 10.10.211.159 +add test 10.10.211.16 +add test 10.10.211.160 +add test 10.10.211.161 +add test 10.10.211.162 +add test 10.10.211.163 +add test 10.10.211.164 +add test 10.10.211.165 +add test 10.10.211.166 +add test 10.10.211.167 +add test 10.10.211.168 +add test 10.10.211.169 +add test 10.10.211.17 +add test 10.10.211.170 +add test 10.10.211.171 +add test 10.10.211.172 +add test 10.10.211.173 +add test 10.10.211.174 +add test 10.10.211.175 +add test 10.10.211.176 +add test 10.10.211.177 +add test 10.10.211.178 +add test 10.10.211.179 +add test 10.10.211.18 +add test 10.10.211.180 +add test 10.10.211.181 +add test 10.10.211.182 +add test 10.10.211.183 +add test 10.10.211.184 +add test 10.10.211.185 +add test 10.10.211.186 +add test 10.10.211.187 +add test 10.10.211.188 +add test 10.10.211.189 +add test 10.10.211.19 +add test 10.10.211.190 +add test 10.10.211.191 +add test 10.10.211.192 +add test 10.10.211.193 +add test 10.10.211.194 +add test 10.10.211.195 +add test 10.10.211.196 +add test 10.10.211.197 +add test 10.10.211.198 +add test 10.10.211.199 +add test 10.10.211.2 +add test 10.10.211.20 +add test 10.10.211.200 +add test 10.10.211.201 +add test 10.10.211.202 +add test 10.10.211.203 +add test 10.10.211.204 +add test 10.10.211.205 +add test 10.10.211.206 +add test 10.10.211.207 +add test 10.10.211.208 +add test 10.10.211.209 +add test 10.10.211.21 +add test 10.10.211.210 +add test 10.10.211.211 +add test 10.10.211.212 +add test 10.10.211.213 +add test 10.10.211.214 +add test 10.10.211.215 +add test 10.10.211.216 +add test 10.10.211.217 +add test 10.10.211.218 +add test 10.10.211.219 +add test 10.10.211.22 +add test 10.10.211.220 +add test 10.10.211.221 +add test 10.10.211.222 +add test 10.10.211.223 +add test 10.10.211.224 +add test 10.10.211.225 +add test 10.10.211.226 +add test 10.10.211.227 +add test 10.10.211.228 +add test 10.10.211.229 +add test 10.10.211.23 +add test 10.10.211.230 +add test 10.10.211.231 +add test 10.10.211.232 +add test 10.10.211.233 +add test 10.10.211.234 +add test 10.10.211.235 +add test 10.10.211.236 +add test 10.10.211.237 +add test 10.10.211.238 +add test 10.10.211.239 +add test 10.10.211.24 +add test 10.10.211.240 +add test 10.10.211.241 +add test 10.10.211.242 +add test 10.10.211.243 +add test 10.10.211.244 +add test 10.10.211.245 +add test 10.10.211.246 +add test 10.10.211.247 +add test 10.10.211.248 +add test 10.10.211.249 +add test 10.10.211.25 +add test 10.10.211.250 +add test 10.10.211.251 +add test 10.10.211.252 +add test 10.10.211.253 +add test 10.10.211.254 +add test 10.10.211.255 +add test 10.10.211.26 +add test 10.10.211.27 +add test 10.10.211.28 +add test 10.10.211.29 +add test 10.10.211.3 +add test 10.10.211.30 +add test 10.10.211.31 +add test 10.10.211.32 +add test 10.10.211.33 +add test 10.10.211.34 +add test 10.10.211.35 +add test 10.10.211.36 +add test 10.10.211.37 +add test 10.10.211.38 +add test 10.10.211.39 +add test 10.10.211.4 +add test 10.10.211.40 +add test 10.10.211.41 +add test 10.10.211.42 +add test 10.10.211.43 +add test 10.10.211.44 +add test 10.10.211.45 +add test 10.10.211.46 +add test 10.10.211.47 +add test 10.10.211.48 +add test 10.10.211.49 +add test 10.10.211.5 +add test 10.10.211.50 +add test 10.10.211.51 +add test 10.10.211.52 +add test 10.10.211.53 +add test 10.10.211.54 +add test 10.10.211.55 +add test 10.10.211.56 +add test 10.10.211.57 +add test 10.10.211.58 +add test 10.10.211.59 +add test 10.10.211.6 +add test 10.10.211.60 +add test 10.10.211.61 +add test 10.10.211.62 +add test 10.10.211.63 +add test 10.10.211.64 +add test 10.10.211.65 +add test 10.10.211.66 +add test 10.10.211.67 +add test 10.10.211.68 +add test 10.10.211.69 +add test 10.10.211.7 +add test 10.10.211.70 +add test 10.10.211.71 +add test 10.10.211.72 +add test 10.10.211.73 +add test 10.10.211.74 +add test 10.10.211.75 +add test 10.10.211.76 +add test 10.10.211.77 +add test 10.10.211.78 +add test 10.10.211.79 +add test 10.10.211.8 +add test 10.10.211.80 +add test 10.10.211.81 +add test 10.10.211.82 +add test 10.10.211.83 +add test 10.10.211.84 +add test 10.10.211.85 +add test 10.10.211.86 +add test 10.10.211.87 +add test 10.10.211.88 +add test 10.10.211.89 +add test 10.10.211.9 +add test 10.10.211.90 +add test 10.10.211.91 +add test 10.10.211.92 +add test 10.10.211.93 +add test 10.10.211.94 +add test 10.10.211.95 +add test 10.10.211.96 +add test 10.10.211.97 +add test 10.10.211.98 +add test 10.10.211.99 +add test 10.10.212.0 +add test 10.10.212.1 +add test 10.10.212.10 +add test 10.10.212.100 +add test 10.10.212.101 +add test 10.10.212.102 +add test 10.10.212.103 +add test 10.10.212.104 +add test 10.10.212.105 +add test 10.10.212.106 +add test 10.10.212.107 +add test 10.10.212.108 +add test 10.10.212.109 +add test 10.10.212.11 +add test 10.10.212.110 +add test 10.10.212.111 +add test 10.10.212.112 +add test 10.10.212.113 +add test 10.10.212.114 +add test 10.10.212.115 +add test 10.10.212.116 +add test 10.10.212.117 +add test 10.10.212.118 +add test 10.10.212.119 +add test 10.10.212.12 +add test 10.10.212.120 +add test 10.10.212.121 +add test 10.10.212.122 +add test 10.10.212.123 +add test 10.10.212.124 +add test 10.10.212.125 +add test 10.10.212.126 +add test 10.10.212.127 +add test 10.10.212.128 +add test 10.10.212.129 +add test 10.10.212.13 +add test 10.10.212.130 +add test 10.10.212.131 +add test 10.10.212.132 +add test 10.10.212.133 +add test 10.10.212.134 +add test 10.10.212.135 +add test 10.10.212.136 +add test 10.10.212.137 +add test 10.10.212.138 +add test 10.10.212.139 +add test 10.10.212.14 +add test 10.10.212.140 +add test 10.10.212.141 +add test 10.10.212.142 +add test 10.10.212.143 +add test 10.10.212.144 +add test 10.10.212.145 +add test 10.10.212.146 +add test 10.10.212.147 +add test 10.10.212.148 +add test 10.10.212.149 +add test 10.10.212.15 +add test 10.10.212.150 +add test 10.10.212.151 +add test 10.10.212.152 +add test 10.10.212.153 +add test 10.10.212.154 +add test 10.10.212.155 +add test 10.10.212.156 +add test 10.10.212.157 +add test 10.10.212.158 +add test 10.10.212.159 +add test 10.10.212.16 +add test 10.10.212.160 +add test 10.10.212.161 +add test 10.10.212.162 +add test 10.10.212.163 +add test 10.10.212.164 +add test 10.10.212.165 +add test 10.10.212.166 +add test 10.10.212.167 +add test 10.10.212.168 +add test 10.10.212.169 +add test 10.10.212.17 +add test 10.10.212.170 +add test 10.10.212.171 +add test 10.10.212.172 +add test 10.10.212.173 +add test 10.10.212.174 +add test 10.10.212.175 +add test 10.10.212.176 +add test 10.10.212.177 +add test 10.10.212.178 +add test 10.10.212.179 +add test 10.10.212.18 +add test 10.10.212.180 +add test 10.10.212.181 +add test 10.10.212.182 +add test 10.10.212.183 +add test 10.10.212.184 +add test 10.10.212.185 +add test 10.10.212.186 +add test 10.10.212.187 +add test 10.10.212.188 +add test 10.10.212.189 +add test 10.10.212.19 +add test 10.10.212.190 +add test 10.10.212.191 +add test 10.10.212.192 +add test 10.10.212.193 +add test 10.10.212.194 +add test 10.10.212.195 +add test 10.10.212.196 +add test 10.10.212.197 +add test 10.10.212.198 +add test 10.10.212.199 +add test 10.10.212.2 +add test 10.10.212.20 +add test 10.10.212.200 +add test 10.10.212.201 +add test 10.10.212.202 +add test 10.10.212.203 +add test 10.10.212.204 +add test 10.10.212.205 +add test 10.10.212.206 +add test 10.10.212.207 +add test 10.10.212.208 +add test 10.10.212.209 +add test 10.10.212.21 +add test 10.10.212.210 +add test 10.10.212.211 +add test 10.10.212.212 +add test 10.10.212.213 +add test 10.10.212.214 +add test 10.10.212.215 +add test 10.10.212.216 +add test 10.10.212.217 +add test 10.10.212.218 +add test 10.10.212.219 +add test 10.10.212.22 +add test 10.10.212.220 +add test 10.10.212.221 +add test 10.10.212.222 +add test 10.10.212.223 +add test 10.10.212.224 +add test 10.10.212.225 +add test 10.10.212.226 +add test 10.10.212.227 +add test 10.10.212.228 +add test 10.10.212.229 +add test 10.10.212.23 +add test 10.10.212.230 +add test 10.10.212.231 +add test 10.10.212.232 +add test 10.10.212.233 +add test 10.10.212.234 +add test 10.10.212.235 +add test 10.10.212.236 +add test 10.10.212.237 +add test 10.10.212.238 +add test 10.10.212.239 +add test 10.10.212.24 +add test 10.10.212.240 +add test 10.10.212.241 +add test 10.10.212.242 +add test 10.10.212.243 +add test 10.10.212.244 +add test 10.10.212.245 +add test 10.10.212.246 +add test 10.10.212.247 +add test 10.10.212.248 +add test 10.10.212.249 +add test 10.10.212.25 +add test 10.10.212.250 +add test 10.10.212.251 +add test 10.10.212.252 +add test 10.10.212.253 +add test 10.10.212.254 +add test 10.10.212.255 +add test 10.10.212.26 +add test 10.10.212.27 +add test 10.10.212.28 +add test 10.10.212.29 +add test 10.10.212.3 +add test 10.10.212.30 +add test 10.10.212.31 +add test 10.10.212.32 +add test 10.10.212.33 +add test 10.10.212.34 +add test 10.10.212.35 +add test 10.10.212.36 +add test 10.10.212.37 +add test 10.10.212.38 +add test 10.10.212.39 +add test 10.10.212.4 +add test 10.10.212.40 +add test 10.10.212.41 +add test 10.10.212.42 +add test 10.10.212.43 +add test 10.10.212.44 +add test 10.10.212.45 +add test 10.10.212.46 +add test 10.10.212.47 +add test 10.10.212.48 +add test 10.10.212.49 +add test 10.10.212.5 +add test 10.10.212.50 +add test 10.10.212.51 +add test 10.10.212.52 +add test 10.10.212.53 +add test 10.10.212.54 +add test 10.10.212.55 +add test 10.10.212.56 +add test 10.10.212.57 +add test 10.10.212.58 +add test 10.10.212.59 +add test 10.10.212.6 +add test 10.10.212.60 +add test 10.10.212.61 +add test 10.10.212.62 +add test 10.10.212.63 +add test 10.10.212.64 +add test 10.10.212.65 +add test 10.10.212.66 +add test 10.10.212.67 +add test 10.10.212.68 +add test 10.10.212.69 +add test 10.10.212.7 +add test 10.10.212.70 +add test 10.10.212.71 +add test 10.10.212.72 +add test 10.10.212.73 +add test 10.10.212.74 +add test 10.10.212.75 +add test 10.10.212.76 +add test 10.10.212.77 +add test 10.10.212.78 +add test 10.10.212.79 +add test 10.10.212.8 +add test 10.10.212.80 +add test 10.10.212.81 +add test 10.10.212.82 +add test 10.10.212.83 +add test 10.10.212.84 +add test 10.10.212.85 +add test 10.10.212.86 +add test 10.10.212.87 +add test 10.10.212.88 +add test 10.10.212.89 +add test 10.10.212.9 +add test 10.10.212.90 +add test 10.10.212.91 +add test 10.10.212.92 +add test 10.10.212.93 +add test 10.10.212.94 +add test 10.10.212.95 +add test 10.10.212.96 +add test 10.10.212.97 +add test 10.10.212.98 +add test 10.10.212.99 +add test 10.10.213.0 +add test 10.10.213.1 +add test 10.10.213.10 +add test 10.10.213.100 +add test 10.10.213.101 +add test 10.10.213.102 +add test 10.10.213.103 +add test 10.10.213.104 +add test 10.10.213.105 +add test 10.10.213.106 +add test 10.10.213.107 +add test 10.10.213.108 +add test 10.10.213.109 +add test 10.10.213.11 +add test 10.10.213.110 +add test 10.10.213.111 +add test 10.10.213.112 +add test 10.10.213.113 +add test 10.10.213.114 +add test 10.10.213.115 +add test 10.10.213.116 +add test 10.10.213.117 +add test 10.10.213.118 +add test 10.10.213.119 +add test 10.10.213.12 +add test 10.10.213.120 +add test 10.10.213.121 +add test 10.10.213.122 +add test 10.10.213.123 +add test 10.10.213.124 +add test 10.10.213.125 +add test 10.10.213.126 +add test 10.10.213.127 +add test 10.10.213.128 +add test 10.10.213.129 +add test 10.10.213.13 +add test 10.10.213.130 +add test 10.10.213.131 +add test 10.10.213.132 +add test 10.10.213.133 +add test 10.10.213.134 +add test 10.10.213.135 +add test 10.10.213.136 +add test 10.10.213.137 +add test 10.10.213.138 +add test 10.10.213.139 +add test 10.10.213.14 +add test 10.10.213.140 +add test 10.10.213.141 +add test 10.10.213.142 +add test 10.10.213.143 +add test 10.10.213.144 +add test 10.10.213.145 +add test 10.10.213.146 +add test 10.10.213.147 +add test 10.10.213.148 +add test 10.10.213.149 +add test 10.10.213.15 +add test 10.10.213.150 +add test 10.10.213.151 +add test 10.10.213.152 +add test 10.10.213.153 +add test 10.10.213.154 +add test 10.10.213.155 +add test 10.10.213.156 +add test 10.10.213.157 +add test 10.10.213.158 +add test 10.10.213.159 +add test 10.10.213.16 +add test 10.10.213.160 +add test 10.10.213.161 +add test 10.10.213.162 +add test 10.10.213.163 +add test 10.10.213.164 +add test 10.10.213.165 +add test 10.10.213.166 +add test 10.10.213.167 +add test 10.10.213.168 +add test 10.10.213.169 +add test 10.10.213.17 +add test 10.10.213.170 +add test 10.10.213.171 +add test 10.10.213.172 +add test 10.10.213.173 +add test 10.10.213.174 +add test 10.10.213.175 +add test 10.10.213.176 +add test 10.10.213.177 +add test 10.10.213.178 +add test 10.10.213.179 +add test 10.10.213.18 +add test 10.10.213.180 +add test 10.10.213.181 +add test 10.10.213.182 +add test 10.10.213.183 +add test 10.10.213.184 +add test 10.10.213.185 +add test 10.10.213.186 +add test 10.10.213.187 +add test 10.10.213.188 +add test 10.10.213.189 +add test 10.10.213.19 +add test 10.10.213.190 +add test 10.10.213.191 +add test 10.10.213.192 +add test 10.10.213.193 +add test 10.10.213.194 +add test 10.10.213.195 +add test 10.10.213.196 +add test 10.10.213.197 +add test 10.10.213.198 +add test 10.10.213.199 +add test 10.10.213.2 +add test 10.10.213.20 +add test 10.10.213.200 +add test 10.10.213.201 +add test 10.10.213.202 +add test 10.10.213.203 +add test 10.10.213.204 +add test 10.10.213.205 +add test 10.10.213.206 +add test 10.10.213.207 +add test 10.10.213.208 +add test 10.10.213.209 +add test 10.10.213.21 +add test 10.10.213.210 +add test 10.10.213.211 +add test 10.10.213.212 +add test 10.10.213.213 +add test 10.10.213.214 +add test 10.10.213.215 +add test 10.10.213.216 +add test 10.10.213.217 +add test 10.10.213.218 +add test 10.10.213.219 +add test 10.10.213.22 +add test 10.10.213.220 +add test 10.10.213.221 +add test 10.10.213.222 +add test 10.10.213.223 +add test 10.10.213.224 +add test 10.10.213.225 +add test 10.10.213.226 +add test 10.10.213.227 +add test 10.10.213.228 +add test 10.10.213.229 +add test 10.10.213.23 +add test 10.10.213.230 +add test 10.10.213.231 +add test 10.10.213.232 +add test 10.10.213.233 +add test 10.10.213.234 +add test 10.10.213.235 +add test 10.10.213.236 +add test 10.10.213.237 +add test 10.10.213.238 +add test 10.10.213.239 +add test 10.10.213.24 +add test 10.10.213.240 +add test 10.10.213.241 +add test 10.10.213.242 +add test 10.10.213.243 +add test 10.10.213.244 +add test 10.10.213.245 +add test 10.10.213.246 +add test 10.10.213.247 +add test 10.10.213.248 +add test 10.10.213.249 +add test 10.10.213.25 +add test 10.10.213.250 +add test 10.10.213.251 +add test 10.10.213.252 +add test 10.10.213.253 +add test 10.10.213.254 +add test 10.10.213.255 +add test 10.10.213.26 +add test 10.10.213.27 +add test 10.10.213.28 +add test 10.10.213.29 +add test 10.10.213.3 +add test 10.10.213.30 +add test 10.10.213.31 +add test 10.10.213.32 +add test 10.10.213.33 +add test 10.10.213.34 +add test 10.10.213.35 +add test 10.10.213.36 +add test 10.10.213.37 +add test 10.10.213.38 +add test 10.10.213.39 +add test 10.10.213.4 +add test 10.10.213.40 +add test 10.10.213.41 +add test 10.10.213.42 +add test 10.10.213.43 +add test 10.10.213.44 +add test 10.10.213.45 +add test 10.10.213.46 +add test 10.10.213.47 +add test 10.10.213.48 +add test 10.10.213.49 +add test 10.10.213.5 +add test 10.10.213.50 +add test 10.10.213.51 +add test 10.10.213.52 +add test 10.10.213.53 +add test 10.10.213.54 +add test 10.10.213.55 +add test 10.10.213.56 +add test 10.10.213.57 +add test 10.10.213.58 +add test 10.10.213.59 +add test 10.10.213.6 +add test 10.10.213.60 +add test 10.10.213.61 +add test 10.10.213.62 +add test 10.10.213.63 +add test 10.10.213.64 +add test 10.10.213.65 +add test 10.10.213.66 +add test 10.10.213.67 +add test 10.10.213.68 +add test 10.10.213.69 +add test 10.10.213.7 +add test 10.10.213.70 +add test 10.10.213.71 +add test 10.10.213.72 +add test 10.10.213.73 +add test 10.10.213.74 +add test 10.10.213.75 +add test 10.10.213.76 +add test 10.10.213.77 +add test 10.10.213.78 +add test 10.10.213.79 +add test 10.10.213.8 +add test 10.10.213.80 +add test 10.10.213.81 +add test 10.10.213.82 +add test 10.10.213.83 +add test 10.10.213.84 +add test 10.10.213.85 +add test 10.10.213.86 +add test 10.10.213.87 +add test 10.10.213.88 +add test 10.10.213.89 +add test 10.10.213.9 +add test 10.10.213.90 +add test 10.10.213.91 +add test 10.10.213.92 +add test 10.10.213.93 +add test 10.10.213.94 +add test 10.10.213.95 +add test 10.10.213.96 +add test 10.10.213.97 +add test 10.10.213.98 +add test 10.10.213.99 +add test 10.10.214.0 +add test 10.10.214.1 +add test 10.10.214.10 +add test 10.10.214.100 +add test 10.10.214.101 +add test 10.10.214.102 +add test 10.10.214.103 +add test 10.10.214.104 +add test 10.10.214.105 +add test 10.10.214.106 +add test 10.10.214.107 +add test 10.10.214.108 +add test 10.10.214.109 +add test 10.10.214.11 +add test 10.10.214.110 +add test 10.10.214.111 +add test 10.10.214.112 +add test 10.10.214.113 +add test 10.10.214.114 +add test 10.10.214.115 +add test 10.10.214.116 +add test 10.10.214.117 +add test 10.10.214.118 +add test 10.10.214.119 +add test 10.10.214.12 +add test 10.10.214.120 +add test 10.10.214.121 +add test 10.10.214.122 +add test 10.10.214.123 +add test 10.10.214.124 +add test 10.10.214.125 +add test 10.10.214.126 +add test 10.10.214.127 +add test 10.10.214.128 +add test 10.10.214.129 +add test 10.10.214.13 +add test 10.10.214.130 +add test 10.10.214.131 +add test 10.10.214.132 +add test 10.10.214.133 +add test 10.10.214.134 +add test 10.10.214.135 +add test 10.10.214.136 +add test 10.10.214.137 +add test 10.10.214.138 +add test 10.10.214.139 +add test 10.10.214.14 +add test 10.10.214.140 +add test 10.10.214.141 +add test 10.10.214.142 +add test 10.10.214.143 +add test 10.10.214.144 +add test 10.10.214.145 +add test 10.10.214.146 +add test 10.10.214.147 +add test 10.10.214.148 +add test 10.10.214.149 +add test 10.10.214.15 +add test 10.10.214.150 +add test 10.10.214.151 +add test 10.10.214.152 +add test 10.10.214.153 +add test 10.10.214.154 +add test 10.10.214.155 +add test 10.10.214.156 +add test 10.10.214.157 +add test 10.10.214.158 +add test 10.10.214.159 +add test 10.10.214.16 +add test 10.10.214.160 +add test 10.10.214.161 +add test 10.10.214.162 +add test 10.10.214.163 +add test 10.10.214.164 +add test 10.10.214.165 +add test 10.10.214.166 +add test 10.10.214.167 +add test 10.10.214.168 +add test 10.10.214.169 +add test 10.10.214.17 +add test 10.10.214.170 +add test 10.10.214.171 +add test 10.10.214.172 +add test 10.10.214.173 +add test 10.10.214.174 +add test 10.10.214.175 +add test 10.10.214.176 +add test 10.10.214.177 +add test 10.10.214.178 +add test 10.10.214.179 +add test 10.10.214.18 +add test 10.10.214.180 +add test 10.10.214.181 +add test 10.10.214.182 +add test 10.10.214.183 +add test 10.10.214.184 +add test 10.10.214.185 +add test 10.10.214.186 +add test 10.10.214.187 +add test 10.10.214.188 +add test 10.10.214.189 +add test 10.10.214.19 +add test 10.10.214.190 +add test 10.10.214.191 +add test 10.10.214.192 +add test 10.10.214.193 +add test 10.10.214.194 +add test 10.10.214.195 +add test 10.10.214.196 +add test 10.10.214.197 +add test 10.10.214.198 +add test 10.10.214.199 +add test 10.10.214.2 +add test 10.10.214.20 +add test 10.10.214.200 +add test 10.10.214.201 +add test 10.10.214.202 +add test 10.10.214.203 +add test 10.10.214.204 +add test 10.10.214.205 +add test 10.10.214.206 +add test 10.10.214.207 +add test 10.10.214.208 +add test 10.10.214.209 +add test 10.10.214.21 +add test 10.10.214.210 +add test 10.10.214.211 +add test 10.10.214.212 +add test 10.10.214.213 +add test 10.10.214.214 +add test 10.10.214.215 +add test 10.10.214.216 +add test 10.10.214.217 +add test 10.10.214.218 +add test 10.10.214.219 +add test 10.10.214.22 +add test 10.10.214.220 +add test 10.10.214.221 +add test 10.10.214.222 +add test 10.10.214.223 +add test 10.10.214.224 +add test 10.10.214.225 +add test 10.10.214.226 +add test 10.10.214.227 +add test 10.10.214.228 +add test 10.10.214.229 +add test 10.10.214.23 +add test 10.10.214.230 +add test 10.10.214.231 +add test 10.10.214.232 +add test 10.10.214.233 +add test 10.10.214.234 +add test 10.10.214.235 +add test 10.10.214.236 +add test 10.10.214.237 +add test 10.10.214.238 +add test 10.10.214.239 +add test 10.10.214.24 +add test 10.10.214.240 +add test 10.10.214.241 +add test 10.10.214.242 +add test 10.10.214.243 +add test 10.10.214.244 +add test 10.10.214.245 +add test 10.10.214.246 +add test 10.10.214.247 +add test 10.10.214.248 +add test 10.10.214.249 +add test 10.10.214.25 +add test 10.10.214.250 +add test 10.10.214.251 +add test 10.10.214.252 +add test 10.10.214.253 +add test 10.10.214.254 +add test 10.10.214.255 +add test 10.10.214.26 +add test 10.10.214.27 +add test 10.10.214.28 +add test 10.10.214.29 +add test 10.10.214.3 +add test 10.10.214.30 +add test 10.10.214.31 +add test 10.10.214.32 +add test 10.10.214.33 +add test 10.10.214.34 +add test 10.10.214.35 +add test 10.10.214.36 +add test 10.10.214.37 +add test 10.10.214.38 +add test 10.10.214.39 +add test 10.10.214.4 +add test 10.10.214.40 +add test 10.10.214.41 +add test 10.10.214.42 +add test 10.10.214.43 +add test 10.10.214.44 +add test 10.10.214.45 +add test 10.10.214.46 +add test 10.10.214.47 +add test 10.10.214.48 +add test 10.10.214.49 +add test 10.10.214.5 +add test 10.10.214.50 +add test 10.10.214.51 +add test 10.10.214.52 +add test 10.10.214.53 +add test 10.10.214.54 +add test 10.10.214.55 +add test 10.10.214.56 +add test 10.10.214.57 +add test 10.10.214.58 +add test 10.10.214.59 +add test 10.10.214.6 +add test 10.10.214.60 +add test 10.10.214.61 +add test 10.10.214.62 +add test 10.10.214.63 +add test 10.10.214.64 +add test 10.10.214.65 +add test 10.10.214.66 +add test 10.10.214.67 +add test 10.10.214.68 +add test 10.10.214.69 +add test 10.10.214.7 +add test 10.10.214.70 +add test 10.10.214.71 +add test 10.10.214.72 +add test 10.10.214.73 +add test 10.10.214.74 +add test 10.10.214.75 +add test 10.10.214.76 +add test 10.10.214.77 +add test 10.10.214.78 +add test 10.10.214.79 +add test 10.10.214.8 +add test 10.10.214.80 +add test 10.10.214.81 +add test 10.10.214.82 +add test 10.10.214.83 +add test 10.10.214.84 +add test 10.10.214.85 +add test 10.10.214.86 +add test 10.10.214.87 +add test 10.10.214.88 +add test 10.10.214.89 +add test 10.10.214.9 +add test 10.10.214.90 +add test 10.10.214.91 +add test 10.10.214.92 +add test 10.10.214.93 +add test 10.10.214.94 +add test 10.10.214.95 +add test 10.10.214.96 +add test 10.10.214.97 +add test 10.10.214.98 +add test 10.10.214.99 +add test 10.10.215.0 +add test 10.10.215.1 +add test 10.10.215.10 +add test 10.10.215.100 +add test 10.10.215.101 +add test 10.10.215.102 +add test 10.10.215.103 +add test 10.10.215.104 +add test 10.10.215.105 +add test 10.10.215.106 +add test 10.10.215.107 +add test 10.10.215.108 +add test 10.10.215.109 +add test 10.10.215.11 +add test 10.10.215.110 +add test 10.10.215.111 +add test 10.10.215.112 +add test 10.10.215.113 +add test 10.10.215.114 +add test 10.10.215.115 +add test 10.10.215.116 +add test 10.10.215.117 +add test 10.10.215.118 +add test 10.10.215.119 +add test 10.10.215.12 +add test 10.10.215.120 +add test 10.10.215.121 +add test 10.10.215.122 +add test 10.10.215.123 +add test 10.10.215.124 +add test 10.10.215.125 +add test 10.10.215.126 +add test 10.10.215.127 +add test 10.10.215.128 +add test 10.10.215.129 +add test 10.10.215.13 +add test 10.10.215.130 +add test 10.10.215.131 +add test 10.10.215.132 +add test 10.10.215.133 +add test 10.10.215.134 +add test 10.10.215.135 +add test 10.10.215.136 +add test 10.10.215.137 +add test 10.10.215.138 +add test 10.10.215.139 +add test 10.10.215.14 +add test 10.10.215.140 +add test 10.10.215.141 +add test 10.10.215.142 +add test 10.10.215.143 +add test 10.10.215.144 +add test 10.10.215.145 +add test 10.10.215.146 +add test 10.10.215.147 +add test 10.10.215.148 +add test 10.10.215.149 +add test 10.10.215.15 +add test 10.10.215.150 +add test 10.10.215.151 +add test 10.10.215.152 +add test 10.10.215.153 +add test 10.10.215.154 +add test 10.10.215.155 +add test 10.10.215.156 +add test 10.10.215.157 +add test 10.10.215.158 +add test 10.10.215.159 +add test 10.10.215.16 +add test 10.10.215.160 +add test 10.10.215.161 +add test 10.10.215.162 +add test 10.10.215.163 +add test 10.10.215.164 +add test 10.10.215.165 +add test 10.10.215.166 +add test 10.10.215.167 +add test 10.10.215.168 +add test 10.10.215.169 +add test 10.10.215.17 +add test 10.10.215.170 +add test 10.10.215.171 +add test 10.10.215.172 +add test 10.10.215.173 +add test 10.10.215.174 +add test 10.10.215.175 +add test 10.10.215.176 +add test 10.10.215.177 +add test 10.10.215.178 +add test 10.10.215.179 +add test 10.10.215.18 +add test 10.10.215.180 +add test 10.10.215.181 +add test 10.10.215.182 +add test 10.10.215.183 +add test 10.10.215.184 +add test 10.10.215.185 +add test 10.10.215.186 +add test 10.10.215.187 +add test 10.10.215.188 +add test 10.10.215.189 +add test 10.10.215.19 +add test 10.10.215.190 +add test 10.10.215.191 +add test 10.10.215.192 +add test 10.10.215.193 +add test 10.10.215.194 +add test 10.10.215.195 +add test 10.10.215.196 +add test 10.10.215.197 +add test 10.10.215.198 +add test 10.10.215.199 +add test 10.10.215.2 +add test 10.10.215.20 +add test 10.10.215.200 +add test 10.10.215.201 +add test 10.10.215.202 +add test 10.10.215.203 +add test 10.10.215.204 +add test 10.10.215.205 +add test 10.10.215.206 +add test 10.10.215.207 +add test 10.10.215.208 +add test 10.10.215.209 +add test 10.10.215.21 +add test 10.10.215.210 +add test 10.10.215.211 +add test 10.10.215.212 +add test 10.10.215.213 +add test 10.10.215.214 +add test 10.10.215.215 +add test 10.10.215.216 +add test 10.10.215.217 +add test 10.10.215.218 +add test 10.10.215.219 +add test 10.10.215.22 +add test 10.10.215.220 +add test 10.10.215.221 +add test 10.10.215.222 +add test 10.10.215.223 +add test 10.10.215.224 +add test 10.10.215.225 +add test 10.10.215.226 +add test 10.10.215.227 +add test 10.10.215.228 +add test 10.10.215.229 +add test 10.10.215.23 +add test 10.10.215.230 +add test 10.10.215.231 +add test 10.10.215.232 +add test 10.10.215.233 +add test 10.10.215.234 +add test 10.10.215.235 +add test 10.10.215.236 +add test 10.10.215.237 +add test 10.10.215.238 +add test 10.10.215.239 +add test 10.10.215.24 +add test 10.10.215.240 +add test 10.10.215.241 +add test 10.10.215.242 +add test 10.10.215.243 +add test 10.10.215.244 +add test 10.10.215.245 +add test 10.10.215.246 +add test 10.10.215.247 +add test 10.10.215.248 +add test 10.10.215.249 +add test 10.10.215.25 +add test 10.10.215.250 +add test 10.10.215.251 +add test 10.10.215.252 +add test 10.10.215.253 +add test 10.10.215.254 +add test 10.10.215.255 +add test 10.10.215.26 +add test 10.10.215.27 +add test 10.10.215.28 +add test 10.10.215.29 +add test 10.10.215.3 +add test 10.10.215.30 +add test 10.10.215.31 +add test 10.10.215.32 +add test 10.10.215.33 +add test 10.10.215.34 +add test 10.10.215.35 +add test 10.10.215.36 +add test 10.10.215.37 +add test 10.10.215.38 +add test 10.10.215.39 +add test 10.10.215.4 +add test 10.10.215.40 +add test 10.10.215.41 +add test 10.10.215.42 +add test 10.10.215.43 +add test 10.10.215.44 +add test 10.10.215.45 +add test 10.10.215.46 +add test 10.10.215.47 +add test 10.10.215.48 +add test 10.10.215.49 +add test 10.10.215.5 +add test 10.10.215.50 +add test 10.10.215.51 +add test 10.10.215.52 +add test 10.10.215.53 +add test 10.10.215.54 +add test 10.10.215.55 +add test 10.10.215.56 +add test 10.10.215.57 +add test 10.10.215.58 +add test 10.10.215.59 +add test 10.10.215.6 +add test 10.10.215.60 +add test 10.10.215.61 +add test 10.10.215.62 +add test 10.10.215.63 +add test 10.10.215.64 +add test 10.10.215.65 +add test 10.10.215.66 +add test 10.10.215.67 +add test 10.10.215.68 +add test 10.10.215.69 +add test 10.10.215.7 +add test 10.10.215.70 +add test 10.10.215.71 +add test 10.10.215.72 +add test 10.10.215.73 +add test 10.10.215.74 +add test 10.10.215.75 +add test 10.10.215.76 +add test 10.10.215.77 +add test 10.10.215.78 +add test 10.10.215.79 +add test 10.10.215.8 +add test 10.10.215.80 +add test 10.10.215.81 +add test 10.10.215.82 +add test 10.10.215.83 +add test 10.10.215.84 +add test 10.10.215.85 +add test 10.10.215.86 +add test 10.10.215.87 +add test 10.10.215.88 +add test 10.10.215.89 +add test 10.10.215.9 +add test 10.10.215.90 +add test 10.10.215.91 +add test 10.10.215.92 +add test 10.10.215.93 +add test 10.10.215.94 +add test 10.10.215.95 +add test 10.10.215.96 +add test 10.10.215.97 +add test 10.10.215.98 +add test 10.10.215.99 +add test 10.10.216.0 +add test 10.10.216.1 +add test 10.10.216.10 +add test 10.10.216.100 +add test 10.10.216.101 +add test 10.10.216.102 +add test 10.10.216.103 +add test 10.10.216.104 +add test 10.10.216.105 +add test 10.10.216.106 +add test 10.10.216.107 +add test 10.10.216.108 +add test 10.10.216.109 +add test 10.10.216.11 +add test 10.10.216.110 +add test 10.10.216.111 +add test 10.10.216.112 +add test 10.10.216.113 +add test 10.10.216.114 +add test 10.10.216.115 +add test 10.10.216.116 +add test 10.10.216.117 +add test 10.10.216.118 +add test 10.10.216.119 +add test 10.10.216.12 +add test 10.10.216.120 +add test 10.10.216.121 +add test 10.10.216.122 +add test 10.10.216.123 +add test 10.10.216.124 +add test 10.10.216.125 +add test 10.10.216.126 +add test 10.10.216.127 +add test 10.10.216.128 +add test 10.10.216.129 +add test 10.10.216.13 +add test 10.10.216.130 +add test 10.10.216.131 +add test 10.10.216.132 +add test 10.10.216.133 +add test 10.10.216.134 +add test 10.10.216.135 +add test 10.10.216.136 +add test 10.10.216.137 +add test 10.10.216.138 +add test 10.10.216.139 +add test 10.10.216.14 +add test 10.10.216.140 +add test 10.10.216.141 +add test 10.10.216.142 +add test 10.10.216.143 +add test 10.10.216.144 +add test 10.10.216.145 +add test 10.10.216.146 +add test 10.10.216.147 +add test 10.10.216.148 +add test 10.10.216.149 +add test 10.10.216.15 +add test 10.10.216.150 +add test 10.10.216.151 +add test 10.10.216.152 +add test 10.10.216.153 +add test 10.10.216.154 +add test 10.10.216.155 +add test 10.10.216.156 +add test 10.10.216.157 +add test 10.10.216.158 +add test 10.10.216.159 +add test 10.10.216.16 +add test 10.10.216.160 +add test 10.10.216.161 +add test 10.10.216.162 +add test 10.10.216.163 +add test 10.10.216.164 +add test 10.10.216.165 +add test 10.10.216.166 +add test 10.10.216.167 +add test 10.10.216.168 +add test 10.10.216.169 +add test 10.10.216.17 +add test 10.10.216.170 +add test 10.10.216.171 +add test 10.10.216.172 +add test 10.10.216.173 +add test 10.10.216.174 +add test 10.10.216.175 +add test 10.10.216.176 +add test 10.10.216.177 +add test 10.10.216.178 +add test 10.10.216.179 +add test 10.10.216.18 +add test 10.10.216.180 +add test 10.10.216.181 +add test 10.10.216.182 +add test 10.10.216.183 +add test 10.10.216.184 +add test 10.10.216.185 +add test 10.10.216.186 +add test 10.10.216.187 +add test 10.10.216.188 +add test 10.10.216.189 +add test 10.10.216.19 +add test 10.10.216.190 +add test 10.10.216.191 +add test 10.10.216.192 +add test 10.10.216.193 +add test 10.10.216.194 +add test 10.10.216.195 +add test 10.10.216.196 +add test 10.10.216.197 +add test 10.10.216.198 +add test 10.10.216.199 +add test 10.10.216.2 +add test 10.10.216.20 +add test 10.10.216.200 +add test 10.10.216.201 +add test 10.10.216.202 +add test 10.10.216.203 +add test 10.10.216.204 +add test 10.10.216.205 +add test 10.10.216.206 +add test 10.10.216.207 +add test 10.10.216.208 +add test 10.10.216.209 +add test 10.10.216.21 +add test 10.10.216.210 +add test 10.10.216.211 +add test 10.10.216.212 +add test 10.10.216.213 +add test 10.10.216.214 +add test 10.10.216.215 +add test 10.10.216.216 +add test 10.10.216.217 +add test 10.10.216.218 +add test 10.10.216.219 +add test 10.10.216.22 +add test 10.10.216.220 +add test 10.10.216.221 +add test 10.10.216.222 +add test 10.10.216.223 +add test 10.10.216.224 +add test 10.10.216.225 +add test 10.10.216.226 +add test 10.10.216.227 +add test 10.10.216.228 +add test 10.10.216.229 +add test 10.10.216.23 +add test 10.10.216.230 +add test 10.10.216.231 +add test 10.10.216.232 +add test 10.10.216.233 +add test 10.10.216.234 +add test 10.10.216.235 +add test 10.10.216.236 +add test 10.10.216.237 +add test 10.10.216.238 +add test 10.10.216.239 +add test 10.10.216.24 +add test 10.10.216.240 +add test 10.10.216.241 +add test 10.10.216.242 +add test 10.10.216.243 +add test 10.10.216.244 +add test 10.10.216.245 +add test 10.10.216.246 +add test 10.10.216.247 +add test 10.10.216.248 +add test 10.10.216.249 +add test 10.10.216.25 +add test 10.10.216.250 +add test 10.10.216.251 +add test 10.10.216.252 +add test 10.10.216.253 +add test 10.10.216.254 +add test 10.10.216.255 +add test 10.10.216.26 +add test 10.10.216.27 +add test 10.10.216.28 +add test 10.10.216.29 +add test 10.10.216.3 +add test 10.10.216.30 +add test 10.10.216.31 +add test 10.10.216.32 +add test 10.10.216.33 +add test 10.10.216.34 +add test 10.10.216.35 +add test 10.10.216.36 +add test 10.10.216.37 +add test 10.10.216.38 +add test 10.10.216.39 +add test 10.10.216.4 +add test 10.10.216.40 +add test 10.10.216.41 +add test 10.10.216.42 +add test 10.10.216.43 +add test 10.10.216.44 +add test 10.10.216.45 +add test 10.10.216.46 +add test 10.10.216.47 +add test 10.10.216.48 +add test 10.10.216.49 +add test 10.10.216.5 +add test 10.10.216.50 +add test 10.10.216.51 +add test 10.10.216.52 +add test 10.10.216.53 +add test 10.10.216.54 +add test 10.10.216.55 +add test 10.10.216.56 +add test 10.10.216.57 +add test 10.10.216.58 +add test 10.10.216.59 +add test 10.10.216.6 +add test 10.10.216.60 +add test 10.10.216.61 +add test 10.10.216.62 +add test 10.10.216.63 +add test 10.10.216.64 +add test 10.10.216.65 +add test 10.10.216.66 +add test 10.10.216.67 +add test 10.10.216.68 +add test 10.10.216.69 +add test 10.10.216.7 +add test 10.10.216.70 +add test 10.10.216.71 +add test 10.10.216.72 +add test 10.10.216.73 +add test 10.10.216.74 +add test 10.10.216.75 +add test 10.10.216.76 +add test 10.10.216.77 +add test 10.10.216.78 +add test 10.10.216.79 +add test 10.10.216.8 +add test 10.10.216.80 +add test 10.10.216.81 +add test 10.10.216.82 +add test 10.10.216.83 +add test 10.10.216.84 +add test 10.10.216.85 +add test 10.10.216.86 +add test 10.10.216.87 +add test 10.10.216.88 +add test 10.10.216.89 +add test 10.10.216.9 +add test 10.10.216.90 +add test 10.10.216.91 +add test 10.10.216.92 +add test 10.10.216.93 +add test 10.10.216.94 +add test 10.10.216.95 +add test 10.10.216.96 +add test 10.10.216.97 +add test 10.10.216.98 +add test 10.10.216.99 +add test 10.10.217.0 +add test 10.10.217.1 +add test 10.10.217.10 +add test 10.10.217.100 +add test 10.10.217.101 +add test 10.10.217.102 +add test 10.10.217.103 +add test 10.10.217.104 +add test 10.10.217.105 +add test 10.10.217.106 +add test 10.10.217.107 +add test 10.10.217.108 +add test 10.10.217.109 +add test 10.10.217.11 +add test 10.10.217.110 +add test 10.10.217.111 +add test 10.10.217.112 +add test 10.10.217.113 +add test 10.10.217.114 +add test 10.10.217.115 +add test 10.10.217.116 +add test 10.10.217.117 +add test 10.10.217.118 +add test 10.10.217.119 +add test 10.10.217.12 +add test 10.10.217.120 +add test 10.10.217.121 +add test 10.10.217.122 +add test 10.10.217.123 +add test 10.10.217.124 +add test 10.10.217.125 +add test 10.10.217.126 +add test 10.10.217.127 +add test 10.10.217.128 +add test 10.10.217.129 +add test 10.10.217.13 +add test 10.10.217.130 +add test 10.10.217.131 +add test 10.10.217.132 +add test 10.10.217.133 +add test 10.10.217.134 +add test 10.10.217.135 +add test 10.10.217.136 +add test 10.10.217.137 +add test 10.10.217.138 +add test 10.10.217.139 +add test 10.10.217.14 +add test 10.10.217.140 +add test 10.10.217.141 +add test 10.10.217.142 +add test 10.10.217.143 +add test 10.10.217.144 +add test 10.10.217.145 +add test 10.10.217.146 +add test 10.10.217.147 +add test 10.10.217.148 +add test 10.10.217.149 +add test 10.10.217.15 +add test 10.10.217.150 +add test 10.10.217.151 +add test 10.10.217.152 +add test 10.10.217.153 +add test 10.10.217.154 +add test 10.10.217.155 +add test 10.10.217.156 +add test 10.10.217.157 +add test 10.10.217.158 +add test 10.10.217.159 +add test 10.10.217.16 +add test 10.10.217.160 +add test 10.10.217.161 +add test 10.10.217.162 +add test 10.10.217.163 +add test 10.10.217.164 +add test 10.10.217.165 +add test 10.10.217.166 +add test 10.10.217.167 +add test 10.10.217.168 +add test 10.10.217.169 +add test 10.10.217.17 +add test 10.10.217.170 +add test 10.10.217.171 +add test 10.10.217.172 +add test 10.10.217.173 +add test 10.10.217.174 +add test 10.10.217.175 +add test 10.10.217.176 +add test 10.10.217.177 +add test 10.10.217.178 +add test 10.10.217.179 +add test 10.10.217.18 +add test 10.10.217.180 +add test 10.10.217.181 +add test 10.10.217.182 +add test 10.10.217.183 +add test 10.10.217.184 +add test 10.10.217.185 +add test 10.10.217.186 +add test 10.10.217.187 +add test 10.10.217.188 +add test 10.10.217.189 +add test 10.10.217.19 +add test 10.10.217.190 +add test 10.10.217.191 +add test 10.10.217.192 +add test 10.10.217.193 +add test 10.10.217.194 +add test 10.10.217.195 +add test 10.10.217.196 +add test 10.10.217.197 +add test 10.10.217.198 +add test 10.10.217.199 +add test 10.10.217.2 +add test 10.10.217.20 +add test 10.10.217.200 +add test 10.10.217.201 +add test 10.10.217.202 +add test 10.10.217.203 +add test 10.10.217.204 +add test 10.10.217.205 +add test 10.10.217.206 +add test 10.10.217.207 +add test 10.10.217.208 +add test 10.10.217.209 +add test 10.10.217.21 +add test 10.10.217.210 +add test 10.10.217.211 +add test 10.10.217.212 +add test 10.10.217.213 +add test 10.10.217.214 +add test 10.10.217.215 +add test 10.10.217.216 +add test 10.10.217.217 +add test 10.10.217.218 +add test 10.10.217.219 +add test 10.10.217.22 +add test 10.10.217.220 +add test 10.10.217.221 +add test 10.10.217.222 +add test 10.10.217.223 +add test 10.10.217.224 +add test 10.10.217.225 +add test 10.10.217.226 +add test 10.10.217.227 +add test 10.10.217.228 +add test 10.10.217.229 +add test 10.10.217.23 +add test 10.10.217.230 +add test 10.10.217.231 +add test 10.10.217.232 +add test 10.10.217.233 +add test 10.10.217.234 +add test 10.10.217.235 +add test 10.10.217.236 +add test 10.10.217.237 +add test 10.10.217.238 +add test 10.10.217.239 +add test 10.10.217.24 +add test 10.10.217.240 +add test 10.10.217.241 +add test 10.10.217.242 +add test 10.10.217.243 +add test 10.10.217.244 +add test 10.10.217.245 +add test 10.10.217.246 +add test 10.10.217.247 +add test 10.10.217.248 +add test 10.10.217.249 +add test 10.10.217.25 +add test 10.10.217.250 +add test 10.10.217.251 +add test 10.10.217.252 +add test 10.10.217.253 +add test 10.10.217.254 +add test 10.10.217.255 +add test 10.10.217.26 +add test 10.10.217.27 +add test 10.10.217.28 +add test 10.10.217.29 +add test 10.10.217.3 +add test 10.10.217.30 +add test 10.10.217.31 +add test 10.10.217.32 +add test 10.10.217.33 +add test 10.10.217.34 +add test 10.10.217.35 +add test 10.10.217.36 +add test 10.10.217.37 +add test 10.10.217.38 +add test 10.10.217.39 +add test 10.10.217.4 +add test 10.10.217.40 +add test 10.10.217.41 +add test 10.10.217.42 +add test 10.10.217.43 +add test 10.10.217.44 +add test 10.10.217.45 +add test 10.10.217.46 +add test 10.10.217.47 +add test 10.10.217.48 +add test 10.10.217.49 +add test 10.10.217.5 +add test 10.10.217.50 +add test 10.10.217.51 +add test 10.10.217.52 +add test 10.10.217.53 +add test 10.10.217.54 +add test 10.10.217.55 +add test 10.10.217.56 +add test 10.10.217.57 +add test 10.10.217.58 +add test 10.10.217.59 +add test 10.10.217.6 +add test 10.10.217.60 +add test 10.10.217.61 +add test 10.10.217.62 +add test 10.10.217.63 +add test 10.10.217.64 +add test 10.10.217.65 +add test 10.10.217.66 +add test 10.10.217.67 +add test 10.10.217.68 +add test 10.10.217.69 +add test 10.10.217.7 +add test 10.10.217.70 +add test 10.10.217.71 +add test 10.10.217.72 +add test 10.10.217.73 +add test 10.10.217.74 +add test 10.10.217.75 +add test 10.10.217.76 +add test 10.10.217.77 +add test 10.10.217.78 +add test 10.10.217.79 +add test 10.10.217.8 +add test 10.10.217.80 +add test 10.10.217.81 +add test 10.10.217.82 +add test 10.10.217.83 +add test 10.10.217.84 +add test 10.10.217.85 +add test 10.10.217.86 +add test 10.10.217.87 +add test 10.10.217.88 +add test 10.10.217.89 +add test 10.10.217.9 +add test 10.10.217.90 +add test 10.10.217.91 +add test 10.10.217.92 +add test 10.10.217.93 +add test 10.10.217.94 +add test 10.10.217.95 +add test 10.10.217.96 +add test 10.10.217.97 +add test 10.10.217.98 +add test 10.10.217.99 +add test 10.10.218.0 +add test 10.10.218.1 +add test 10.10.218.10 +add test 10.10.218.100 +add test 10.10.218.101 +add test 10.10.218.102 +add test 10.10.218.103 +add test 10.10.218.104 +add test 10.10.218.105 +add test 10.10.218.106 +add test 10.10.218.107 +add test 10.10.218.108 +add test 10.10.218.109 +add test 10.10.218.11 +add test 10.10.218.110 +add test 10.10.218.111 +add test 10.10.218.112 +add test 10.10.218.113 +add test 10.10.218.114 +add test 10.10.218.115 +add test 10.10.218.116 +add test 10.10.218.117 +add test 10.10.218.118 +add test 10.10.218.119 +add test 10.10.218.12 +add test 10.10.218.120 +add test 10.10.218.121 +add test 10.10.218.122 +add test 10.10.218.123 +add test 10.10.218.124 +add test 10.10.218.125 +add test 10.10.218.126 +add test 10.10.218.127 +add test 10.10.218.128 +add test 10.10.218.129 +add test 10.10.218.13 +add test 10.10.218.130 +add test 10.10.218.131 +add test 10.10.218.132 +add test 10.10.218.133 +add test 10.10.218.134 +add test 10.10.218.135 +add test 10.10.218.136 +add test 10.10.218.137 +add test 10.10.218.138 +add test 10.10.218.139 +add test 10.10.218.14 +add test 10.10.218.140 +add test 10.10.218.141 +add test 10.10.218.142 +add test 10.10.218.143 +add test 10.10.218.144 +add test 10.10.218.145 +add test 10.10.218.146 +add test 10.10.218.147 +add test 10.10.218.148 +add test 10.10.218.149 +add test 10.10.218.15 +add test 10.10.218.150 +add test 10.10.218.151 +add test 10.10.218.152 +add test 10.10.218.153 +add test 10.10.218.154 +add test 10.10.218.155 +add test 10.10.218.156 +add test 10.10.218.157 +add test 10.10.218.158 +add test 10.10.218.159 +add test 10.10.218.16 +add test 10.10.218.160 +add test 10.10.218.161 +add test 10.10.218.162 +add test 10.10.218.163 +add test 10.10.218.164 +add test 10.10.218.165 +add test 10.10.218.166 +add test 10.10.218.167 +add test 10.10.218.168 +add test 10.10.218.169 +add test 10.10.218.17 +add test 10.10.218.170 +add test 10.10.218.171 +add test 10.10.218.172 +add test 10.10.218.173 +add test 10.10.218.174 +add test 10.10.218.175 +add test 10.10.218.176 +add test 10.10.218.177 +add test 10.10.218.178 +add test 10.10.218.179 +add test 10.10.218.18 +add test 10.10.218.180 +add test 10.10.218.181 +add test 10.10.218.182 +add test 10.10.218.183 +add test 10.10.218.184 +add test 10.10.218.185 +add test 10.10.218.186 +add test 10.10.218.187 +add test 10.10.218.188 +add test 10.10.218.189 +add test 10.10.218.19 +add test 10.10.218.190 +add test 10.10.218.191 +add test 10.10.218.192 +add test 10.10.218.193 +add test 10.10.218.194 +add test 10.10.218.195 +add test 10.10.218.196 +add test 10.10.218.197 +add test 10.10.218.198 +add test 10.10.218.199 +add test 10.10.218.2 +add test 10.10.218.20 +add test 10.10.218.200 +add test 10.10.218.201 +add test 10.10.218.202 +add test 10.10.218.203 +add test 10.10.218.204 +add test 10.10.218.205 +add test 10.10.218.206 +add test 10.10.218.207 +add test 10.10.218.208 +add test 10.10.218.209 +add test 10.10.218.21 +add test 10.10.218.210 +add test 10.10.218.211 +add test 10.10.218.212 +add test 10.10.218.213 +add test 10.10.218.214 +add test 10.10.218.215 +add test 10.10.218.216 +add test 10.10.218.217 +add test 10.10.218.218 +add test 10.10.218.219 +add test 10.10.218.22 +add test 10.10.218.220 +add test 10.10.218.221 +add test 10.10.218.222 +add test 10.10.218.223 +add test 10.10.218.224 +add test 10.10.218.225 +add test 10.10.218.226 +add test 10.10.218.227 +add test 10.10.218.228 +add test 10.10.218.229 +add test 10.10.218.23 +add test 10.10.218.230 +add test 10.10.218.231 +add test 10.10.218.232 +add test 10.10.218.233 +add test 10.10.218.234 +add test 10.10.218.235 +add test 10.10.218.236 +add test 10.10.218.237 +add test 10.10.218.238 +add test 10.10.218.239 +add test 10.10.218.24 +add test 10.10.218.240 +add test 10.10.218.241 +add test 10.10.218.242 +add test 10.10.218.243 +add test 10.10.218.244 +add test 10.10.218.245 +add test 10.10.218.246 +add test 10.10.218.247 +add test 10.10.218.248 +add test 10.10.218.249 +add test 10.10.218.25 +add test 10.10.218.250 +add test 10.10.218.251 +add test 10.10.218.252 +add test 10.10.218.253 +add test 10.10.218.254 +add test 10.10.218.255 +add test 10.10.218.26 +add test 10.10.218.27 +add test 10.10.218.28 +add test 10.10.218.29 +add test 10.10.218.3 +add test 10.10.218.30 +add test 10.10.218.31 +add test 10.10.218.32 +add test 10.10.218.33 +add test 10.10.218.34 +add test 10.10.218.35 +add test 10.10.218.36 +add test 10.10.218.37 +add test 10.10.218.38 +add test 10.10.218.39 +add test 10.10.218.4 +add test 10.10.218.40 +add test 10.10.218.41 +add test 10.10.218.42 +add test 10.10.218.43 +add test 10.10.218.44 +add test 10.10.218.45 +add test 10.10.218.46 +add test 10.10.218.47 +add test 10.10.218.48 +add test 10.10.218.49 +add test 10.10.218.5 +add test 10.10.218.50 +add test 10.10.218.51 +add test 10.10.218.52 +add test 10.10.218.53 +add test 10.10.218.54 +add test 10.10.218.55 +add test 10.10.218.56 +add test 10.10.218.57 +add test 10.10.218.58 +add test 10.10.218.59 +add test 10.10.218.6 +add test 10.10.218.60 +add test 10.10.218.61 +add test 10.10.218.62 +add test 10.10.218.63 +add test 10.10.218.64 +add test 10.10.218.65 +add test 10.10.218.66 +add test 10.10.218.67 +add test 10.10.218.68 +add test 10.10.218.69 +add test 10.10.218.7 +add test 10.10.218.70 +add test 10.10.218.71 +add test 10.10.218.72 +add test 10.10.218.73 +add test 10.10.218.74 +add test 10.10.218.75 +add test 10.10.218.76 +add test 10.10.218.77 +add test 10.10.218.78 +add test 10.10.218.79 +add test 10.10.218.8 +add test 10.10.218.80 +add test 10.10.218.81 +add test 10.10.218.82 +add test 10.10.218.83 +add test 10.10.218.84 +add test 10.10.218.85 +add test 10.10.218.86 +add test 10.10.218.87 +add test 10.10.218.88 +add test 10.10.218.89 +add test 10.10.218.9 +add test 10.10.218.90 +add test 10.10.218.91 +add test 10.10.218.92 +add test 10.10.218.93 +add test 10.10.218.94 +add test 10.10.218.95 +add test 10.10.218.96 +add test 10.10.218.97 +add test 10.10.218.98 +add test 10.10.218.99 +add test 10.10.219.0 +add test 10.10.219.1 +add test 10.10.219.10 +add test 10.10.219.100 +add test 10.10.219.101 +add test 10.10.219.102 +add test 10.10.219.103 +add test 10.10.219.104 +add test 10.10.219.105 +add test 10.10.219.106 +add test 10.10.219.107 +add test 10.10.219.108 +add test 10.10.219.109 +add test 10.10.219.11 +add test 10.10.219.110 +add test 10.10.219.111 +add test 10.10.219.112 +add test 10.10.219.113 +add test 10.10.219.114 +add test 10.10.219.115 +add test 10.10.219.116 +add test 10.10.219.117 +add test 10.10.219.118 +add test 10.10.219.119 +add test 10.10.219.12 +add test 10.10.219.120 +add test 10.10.219.121 +add test 10.10.219.122 +add test 10.10.219.123 +add test 10.10.219.124 +add test 10.10.219.125 +add test 10.10.219.126 +add test 10.10.219.127 +add test 10.10.219.128 +add test 10.10.219.129 +add test 10.10.219.13 +add test 10.10.219.130 +add test 10.10.219.131 +add test 10.10.219.132 +add test 10.10.219.133 +add test 10.10.219.134 +add test 10.10.219.135 +add test 10.10.219.136 +add test 10.10.219.137 +add test 10.10.219.138 +add test 10.10.219.139 +add test 10.10.219.14 +add test 10.10.219.140 +add test 10.10.219.141 +add test 10.10.219.142 +add test 10.10.219.143 +add test 10.10.219.144 +add test 10.10.219.145 +add test 10.10.219.146 +add test 10.10.219.147 +add test 10.10.219.148 +add test 10.10.219.149 +add test 10.10.219.15 +add test 10.10.219.150 +add test 10.10.219.151 +add test 10.10.219.152 +add test 10.10.219.153 +add test 10.10.219.154 +add test 10.10.219.155 +add test 10.10.219.156 +add test 10.10.219.157 +add test 10.10.219.158 +add test 10.10.219.159 +add test 10.10.219.16 +add test 10.10.219.160 +add test 10.10.219.161 +add test 10.10.219.162 +add test 10.10.219.163 +add test 10.10.219.164 +add test 10.10.219.165 +add test 10.10.219.166 +add test 10.10.219.167 +add test 10.10.219.168 +add test 10.10.219.169 +add test 10.10.219.17 +add test 10.10.219.170 +add test 10.10.219.171 +add test 10.10.219.172 +add test 10.10.219.173 +add test 10.10.219.174 +add test 10.10.219.175 +add test 10.10.219.176 +add test 10.10.219.177 +add test 10.10.219.178 +add test 10.10.219.179 +add test 10.10.219.18 +add test 10.10.219.180 +add test 10.10.219.181 +add test 10.10.219.182 +add test 10.10.219.183 +add test 10.10.219.184 +add test 10.10.219.185 +add test 10.10.219.186 +add test 10.10.219.187 +add test 10.10.219.188 +add test 10.10.219.189 +add test 10.10.219.19 +add test 10.10.219.190 +add test 10.10.219.191 +add test 10.10.219.192 +add test 10.10.219.193 +add test 10.10.219.194 +add test 10.10.219.195 +add test 10.10.219.196 +add test 10.10.219.197 +add test 10.10.219.198 +add test 10.10.219.199 +add test 10.10.219.2 +add test 10.10.219.20 +add test 10.10.219.200 +add test 10.10.219.201 +add test 10.10.219.202 +add test 10.10.219.203 +add test 10.10.219.204 +add test 10.10.219.205 +add test 10.10.219.206 +add test 10.10.219.207 +add test 10.10.219.208 +add test 10.10.219.209 +add test 10.10.219.21 +add test 10.10.219.210 +add test 10.10.219.211 +add test 10.10.219.212 +add test 10.10.219.213 +add test 10.10.219.214 +add test 10.10.219.215 +add test 10.10.219.216 +add test 10.10.219.217 +add test 10.10.219.218 +add test 10.10.219.219 +add test 10.10.219.22 +add test 10.10.219.220 +add test 10.10.219.221 +add test 10.10.219.222 +add test 10.10.219.223 +add test 10.10.219.224 +add test 10.10.219.225 +add test 10.10.219.226 +add test 10.10.219.227 +add test 10.10.219.228 +add test 10.10.219.229 +add test 10.10.219.23 +add test 10.10.219.230 +add test 10.10.219.231 +add test 10.10.219.232 +add test 10.10.219.233 +add test 10.10.219.234 +add test 10.10.219.235 +add test 10.10.219.236 +add test 10.10.219.237 +add test 10.10.219.238 +add test 10.10.219.239 +add test 10.10.219.24 +add test 10.10.219.240 +add test 10.10.219.241 +add test 10.10.219.242 +add test 10.10.219.243 +add test 10.10.219.244 +add test 10.10.219.245 +add test 10.10.219.246 +add test 10.10.219.247 +add test 10.10.219.248 +add test 10.10.219.249 +add test 10.10.219.25 +add test 10.10.219.250 +add test 10.10.219.251 +add test 10.10.219.252 +add test 10.10.219.253 +add test 10.10.219.254 +add test 10.10.219.255 +add test 10.10.219.26 +add test 10.10.219.27 +add test 10.10.219.28 +add test 10.10.219.29 +add test 10.10.219.3 +add test 10.10.219.30 +add test 10.10.219.31 +add test 10.10.219.32 +add test 10.10.219.33 +add test 10.10.219.34 +add test 10.10.219.35 +add test 10.10.219.36 +add test 10.10.219.37 +add test 10.10.219.38 +add test 10.10.219.39 +add test 10.10.219.4 +add test 10.10.219.40 +add test 10.10.219.41 +add test 10.10.219.42 +add test 10.10.219.43 +add test 10.10.219.44 +add test 10.10.219.45 +add test 10.10.219.46 +add test 10.10.219.47 +add test 10.10.219.48 +add test 10.10.219.49 +add test 10.10.219.5 +add test 10.10.219.50 +add test 10.10.219.51 +add test 10.10.219.52 +add test 10.10.219.53 +add test 10.10.219.54 +add test 10.10.219.55 +add test 10.10.219.56 +add test 10.10.219.57 +add test 10.10.219.58 +add test 10.10.219.59 +add test 10.10.219.6 +add test 10.10.219.60 +add test 10.10.219.61 +add test 10.10.219.62 +add test 10.10.219.63 +add test 10.10.219.64 +add test 10.10.219.65 +add test 10.10.219.66 +add test 10.10.219.67 +add test 10.10.219.68 +add test 10.10.219.69 +add test 10.10.219.7 +add test 10.10.219.70 +add test 10.10.219.71 +add test 10.10.219.72 +add test 10.10.219.73 +add test 10.10.219.74 +add test 10.10.219.75 +add test 10.10.219.76 +add test 10.10.219.77 +add test 10.10.219.78 +add test 10.10.219.79 +add test 10.10.219.8 +add test 10.10.219.80 +add test 10.10.219.81 +add test 10.10.219.82 +add test 10.10.219.83 +add test 10.10.219.84 +add test 10.10.219.85 +add test 10.10.219.86 +add test 10.10.219.87 +add test 10.10.219.88 +add test 10.10.219.89 +add test 10.10.219.9 +add test 10.10.219.90 +add test 10.10.219.91 +add test 10.10.219.92 +add test 10.10.219.93 +add test 10.10.219.94 +add test 10.10.219.95 +add test 10.10.219.96 +add test 10.10.219.97 +add test 10.10.219.98 +add test 10.10.219.99 +add test 10.10.22.0 +add test 10.10.22.1 +add test 10.10.22.10 +add test 10.10.22.100 +add test 10.10.22.101 +add test 10.10.22.102 +add test 10.10.22.103 +add test 10.10.22.104 +add test 10.10.22.105 +add test 10.10.22.106 +add test 10.10.22.107 +add test 10.10.22.108 +add test 10.10.22.109 +add test 10.10.22.11 +add test 10.10.22.110 +add test 10.10.22.111 +add test 10.10.22.112 +add test 10.10.22.113 +add test 10.10.22.114 +add test 10.10.22.115 +add test 10.10.22.116 +add test 10.10.22.117 +add test 10.10.22.118 +add test 10.10.22.119 +add test 10.10.22.12 +add test 10.10.22.120 +add test 10.10.22.121 +add test 10.10.22.122 +add test 10.10.22.123 +add test 10.10.22.124 +add test 10.10.22.125 +add test 10.10.22.126 +add test 10.10.22.127 +add test 10.10.22.128 +add test 10.10.22.129 +add test 10.10.22.13 +add test 10.10.22.130 +add test 10.10.22.131 +add test 10.10.22.132 +add test 10.10.22.133 +add test 10.10.22.134 +add test 10.10.22.135 +add test 10.10.22.136 +add test 10.10.22.137 +add test 10.10.22.138 +add test 10.10.22.139 +add test 10.10.22.14 +add test 10.10.22.140 +add test 10.10.22.141 +add test 10.10.22.142 +add test 10.10.22.143 +add test 10.10.22.144 +add test 10.10.22.145 +add test 10.10.22.146 +add test 10.10.22.147 +add test 10.10.22.148 +add test 10.10.22.149 +add test 10.10.22.15 +add test 10.10.22.150 +add test 10.10.22.151 +add test 10.10.22.152 +add test 10.10.22.153 +add test 10.10.22.154 +add test 10.10.22.155 +add test 10.10.22.156 +add test 10.10.22.157 +add test 10.10.22.158 +add test 10.10.22.159 +add test 10.10.22.16 +add test 10.10.22.160 +add test 10.10.22.161 +add test 10.10.22.162 +add test 10.10.22.163 +add test 10.10.22.164 +add test 10.10.22.165 +add test 10.10.22.166 +add test 10.10.22.167 +add test 10.10.22.168 +add test 10.10.22.169 +add test 10.10.22.17 +add test 10.10.22.170 +add test 10.10.22.171 +add test 10.10.22.172 +add test 10.10.22.173 +add test 10.10.22.174 +add test 10.10.22.175 +add test 10.10.22.176 +add test 10.10.22.177 +add test 10.10.22.178 +add test 10.10.22.179 +add test 10.10.22.18 +add test 10.10.22.180 +add test 10.10.22.181 +add test 10.10.22.182 +add test 10.10.22.183 +add test 10.10.22.184 +add test 10.10.22.185 +add test 10.10.22.186 +add test 10.10.22.187 +add test 10.10.22.188 +add test 10.10.22.189 +add test 10.10.22.19 +add test 10.10.22.190 +add test 10.10.22.191 +add test 10.10.22.192 +add test 10.10.22.193 +add test 10.10.22.194 +add test 10.10.22.195 +add test 10.10.22.196 +add test 10.10.22.197 +add test 10.10.22.198 +add test 10.10.22.199 +add test 10.10.22.2 +add test 10.10.22.20 +add test 10.10.22.200 +add test 10.10.22.201 +add test 10.10.22.202 +add test 10.10.22.203 +add test 10.10.22.204 +add test 10.10.22.205 +add test 10.10.22.206 +add test 10.10.22.207 +add test 10.10.22.208 +add test 10.10.22.209 +add test 10.10.22.21 +add test 10.10.22.210 +add test 10.10.22.211 +add test 10.10.22.212 +add test 10.10.22.213 +add test 10.10.22.214 +add test 10.10.22.215 +add test 10.10.22.216 +add test 10.10.22.217 +add test 10.10.22.218 +add test 10.10.22.219 +add test 10.10.22.22 +add test 10.10.22.220 +add test 10.10.22.221 +add test 10.10.22.222 +add test 10.10.22.223 +add test 10.10.22.224 +add test 10.10.22.225 +add test 10.10.22.226 +add test 10.10.22.227 +add test 10.10.22.228 +add test 10.10.22.229 +add test 10.10.22.23 +add test 10.10.22.230 +add test 10.10.22.231 +add test 10.10.22.232 +add test 10.10.22.233 +add test 10.10.22.234 +add test 10.10.22.235 +add test 10.10.22.236 +add test 10.10.22.237 +add test 10.10.22.238 +add test 10.10.22.239 +add test 10.10.22.24 +add test 10.10.22.240 +add test 10.10.22.241 +add test 10.10.22.242 +add test 10.10.22.243 +add test 10.10.22.244 +add test 10.10.22.245 +add test 10.10.22.246 +add test 10.10.22.247 +add test 10.10.22.248 +add test 10.10.22.249 +add test 10.10.22.25 +add test 10.10.22.250 +add test 10.10.22.251 +add test 10.10.22.252 +add test 10.10.22.253 +add test 10.10.22.254 +add test 10.10.22.255 +add test 10.10.22.26 +add test 10.10.22.27 +add test 10.10.22.28 +add test 10.10.22.29 +add test 10.10.22.3 +add test 10.10.22.30 +add test 10.10.22.31 +add test 10.10.22.32 +add test 10.10.22.33 +add test 10.10.22.34 +add test 10.10.22.35 +add test 10.10.22.36 +add test 10.10.22.37 +add test 10.10.22.38 +add test 10.10.22.39 +add test 10.10.22.4 +add test 10.10.22.40 +add test 10.10.22.41 +add test 10.10.22.42 +add test 10.10.22.43 +add test 10.10.22.44 +add test 10.10.22.45 +add test 10.10.22.46 +add test 10.10.22.47 +add test 10.10.22.48 +add test 10.10.22.49 +add test 10.10.22.5 +add test 10.10.22.50 +add test 10.10.22.51 +add test 10.10.22.52 +add test 10.10.22.53 +add test 10.10.22.54 +add test 10.10.22.55 +add test 10.10.22.56 +add test 10.10.22.57 +add test 10.10.22.58 +add test 10.10.22.59 +add test 10.10.22.6 +add test 10.10.22.60 +add test 10.10.22.61 +add test 10.10.22.62 +add test 10.10.22.63 +add test 10.10.22.64 +add test 10.10.22.65 +add test 10.10.22.66 +add test 10.10.22.67 +add test 10.10.22.68 +add test 10.10.22.69 +add test 10.10.22.7 +add test 10.10.22.70 +add test 10.10.22.71 +add test 10.10.22.72 +add test 10.10.22.73 +add test 10.10.22.74 +add test 10.10.22.75 +add test 10.10.22.76 +add test 10.10.22.77 +add test 10.10.22.78 +add test 10.10.22.79 +add test 10.10.22.8 +add test 10.10.22.80 +add test 10.10.22.81 +add test 10.10.22.82 +add test 10.10.22.83 +add test 10.10.22.84 +add test 10.10.22.85 +add test 10.10.22.86 +add test 10.10.22.87 +add test 10.10.22.88 +add test 10.10.22.89 +add test 10.10.22.9 +add test 10.10.22.90 +add test 10.10.22.91 +add test 10.10.22.92 +add test 10.10.22.93 +add test 10.10.22.94 +add test 10.10.22.95 +add test 10.10.22.96 +add test 10.10.22.97 +add test 10.10.22.98 +add test 10.10.22.99 +add test 10.10.220.0 +add test 10.10.220.1 +add test 10.10.220.10 +add test 10.10.220.100 +add test 10.10.220.101 +add test 10.10.220.102 +add test 10.10.220.103 +add test 10.10.220.104 +add test 10.10.220.105 +add test 10.10.220.106 +add test 10.10.220.107 +add test 10.10.220.108 +add test 10.10.220.109 +add test 10.10.220.11 +add test 10.10.220.110 +add test 10.10.220.111 +add test 10.10.220.112 +add test 10.10.220.113 +add test 10.10.220.114 +add test 10.10.220.115 +add test 10.10.220.116 +add test 10.10.220.117 +add test 10.10.220.118 +add test 10.10.220.119 +add test 10.10.220.12 +add test 10.10.220.120 +add test 10.10.220.121 +add test 10.10.220.122 +add test 10.10.220.123 +add test 10.10.220.124 +add test 10.10.220.125 +add test 10.10.220.126 +add test 10.10.220.127 +add test 10.10.220.128 +add test 10.10.220.129 +add test 10.10.220.13 +add test 10.10.220.130 +add test 10.10.220.131 +add test 10.10.220.132 +add test 10.10.220.133 +add test 10.10.220.134 +add test 10.10.220.135 +add test 10.10.220.136 +add test 10.10.220.137 +add test 10.10.220.138 +add test 10.10.220.139 +add test 10.10.220.14 +add test 10.10.220.140 +add test 10.10.220.141 +add test 10.10.220.142 +add test 10.10.220.143 +add test 10.10.220.144 +add test 10.10.220.145 +add test 10.10.220.146 +add test 10.10.220.147 +add test 10.10.220.148 +add test 10.10.220.149 +add test 10.10.220.15 +add test 10.10.220.150 +add test 10.10.220.151 +add test 10.10.220.152 +add test 10.10.220.153 +add test 10.10.220.154 +add test 10.10.220.155 +add test 10.10.220.156 +add test 10.10.220.157 +add test 10.10.220.158 +add test 10.10.220.159 +add test 10.10.220.16 +add test 10.10.220.160 +add test 10.10.220.161 +add test 10.10.220.162 +add test 10.10.220.163 +add test 10.10.220.164 +add test 10.10.220.165 +add test 10.10.220.166 +add test 10.10.220.167 +add test 10.10.220.168 +add test 10.10.220.169 +add test 10.10.220.17 +add test 10.10.220.170 +add test 10.10.220.171 +add test 10.10.220.172 +add test 10.10.220.173 +add test 10.10.220.174 +add test 10.10.220.175 +add test 10.10.220.176 +add test 10.10.220.177 +add test 10.10.220.178 +add test 10.10.220.179 +add test 10.10.220.18 +add test 10.10.220.180 +add test 10.10.220.181 +add test 10.10.220.182 +add test 10.10.220.183 +add test 10.10.220.184 +add test 10.10.220.185 +add test 10.10.220.186 +add test 10.10.220.187 +add test 10.10.220.188 +add test 10.10.220.189 +add test 10.10.220.19 +add test 10.10.220.190 +add test 10.10.220.191 +add test 10.10.220.192 +add test 10.10.220.193 +add test 10.10.220.194 +add test 10.10.220.195 +add test 10.10.220.196 +add test 10.10.220.197 +add test 10.10.220.198 +add test 10.10.220.199 +add test 10.10.220.2 +add test 10.10.220.20 +add test 10.10.220.200 +add test 10.10.220.201 +add test 10.10.220.202 +add test 10.10.220.203 +add test 10.10.220.204 +add test 10.10.220.205 +add test 10.10.220.206 +add test 10.10.220.207 +add test 10.10.220.208 +add test 10.10.220.209 +add test 10.10.220.21 +add test 10.10.220.210 +add test 10.10.220.211 +add test 10.10.220.212 +add test 10.10.220.213 +add test 10.10.220.214 +add test 10.10.220.215 +add test 10.10.220.216 +add test 10.10.220.217 +add test 10.10.220.218 +add test 10.10.220.219 +add test 10.10.220.22 +add test 10.10.220.220 +add test 10.10.220.221 +add test 10.10.220.222 +add test 10.10.220.223 +add test 10.10.220.224 +add test 10.10.220.225 +add test 10.10.220.226 +add test 10.10.220.227 +add test 10.10.220.228 +add test 10.10.220.229 +add test 10.10.220.23 +add test 10.10.220.230 +add test 10.10.220.231 +add test 10.10.220.232 +add test 10.10.220.233 +add test 10.10.220.234 +add test 10.10.220.235 +add test 10.10.220.236 +add test 10.10.220.237 +add test 10.10.220.238 +add test 10.10.220.239 +add test 10.10.220.24 +add test 10.10.220.240 +add test 10.10.220.241 +add test 10.10.220.242 +add test 10.10.220.243 +add test 10.10.220.244 +add test 10.10.220.245 +add test 10.10.220.246 +add test 10.10.220.247 +add test 10.10.220.248 +add test 10.10.220.249 +add test 10.10.220.25 +add test 10.10.220.250 +add test 10.10.220.251 +add test 10.10.220.252 +add test 10.10.220.253 +add test 10.10.220.254 +add test 10.10.220.255 +add test 10.10.220.26 +add test 10.10.220.27 +add test 10.10.220.28 +add test 10.10.220.29 +add test 10.10.220.3 +add test 10.10.220.30 +add test 10.10.220.31 +add test 10.10.220.32 +add test 10.10.220.33 +add test 10.10.220.34 +add test 10.10.220.35 +add test 10.10.220.36 +add test 10.10.220.37 +add test 10.10.220.38 +add test 10.10.220.39 +add test 10.10.220.4 +add test 10.10.220.40 +add test 10.10.220.41 +add test 10.10.220.42 +add test 10.10.220.43 +add test 10.10.220.44 +add test 10.10.220.45 +add test 10.10.220.46 +add test 10.10.220.47 +add test 10.10.220.48 +add test 10.10.220.49 +add test 10.10.220.5 +add test 10.10.220.50 +add test 10.10.220.51 +add test 10.10.220.52 +add test 10.10.220.53 +add test 10.10.220.54 +add test 10.10.220.55 +add test 10.10.220.56 +add test 10.10.220.57 +add test 10.10.220.58 +add test 10.10.220.59 +add test 10.10.220.6 +add test 10.10.220.60 +add test 10.10.220.61 +add test 10.10.220.62 +add test 10.10.220.63 +add test 10.10.220.64 +add test 10.10.220.65 +add test 10.10.220.66 +add test 10.10.220.67 +add test 10.10.220.68 +add test 10.10.220.69 +add test 10.10.220.7 +add test 10.10.220.70 +add test 10.10.220.71 +add test 10.10.220.72 +add test 10.10.220.73 +add test 10.10.220.74 +add test 10.10.220.75 +add test 10.10.220.76 +add test 10.10.220.77 +add test 10.10.220.78 +add test 10.10.220.79 +add test 10.10.220.8 +add test 10.10.220.80 +add test 10.10.220.81 +add test 10.10.220.82 +add test 10.10.220.83 +add test 10.10.220.84 +add test 10.10.220.85 +add test 10.10.220.86 +add test 10.10.220.87 +add test 10.10.220.88 +add test 10.10.220.89 +add test 10.10.220.9 +add test 10.10.220.90 +add test 10.10.220.91 +add test 10.10.220.92 +add test 10.10.220.93 +add test 10.10.220.94 +add test 10.10.220.95 +add test 10.10.220.96 +add test 10.10.220.97 +add test 10.10.220.98 +add test 10.10.220.99 +add test 10.10.221.0 +add test 10.10.221.1 +add test 10.10.221.10 +add test 10.10.221.100 +add test 10.10.221.101 +add test 10.10.221.102 +add test 10.10.221.103 +add test 10.10.221.104 +add test 10.10.221.105 +add test 10.10.221.106 +add test 10.10.221.107 +add test 10.10.221.108 +add test 10.10.221.109 +add test 10.10.221.11 +add test 10.10.221.110 +add test 10.10.221.111 +add test 10.10.221.112 +add test 10.10.221.113 +add test 10.10.221.114 +add test 10.10.221.115 +add test 10.10.221.116 +add test 10.10.221.117 +add test 10.10.221.118 +add test 10.10.221.119 +add test 10.10.221.12 +add test 10.10.221.120 +add test 10.10.221.121 +add test 10.10.221.122 +add test 10.10.221.123 +add test 10.10.221.124 +add test 10.10.221.125 +add test 10.10.221.126 +add test 10.10.221.127 +add test 10.10.221.128 +add test 10.10.221.129 +add test 10.10.221.13 +add test 10.10.221.130 +add test 10.10.221.131 +add test 10.10.221.132 +add test 10.10.221.133 +add test 10.10.221.134 +add test 10.10.221.135 +add test 10.10.221.136 +add test 10.10.221.137 +add test 10.10.221.138 +add test 10.10.221.139 +add test 10.10.221.14 +add test 10.10.221.140 +add test 10.10.221.141 +add test 10.10.221.142 +add test 10.10.221.143 +add test 10.10.221.144 +add test 10.10.221.145 +add test 10.10.221.146 +add test 10.10.221.147 +add test 10.10.221.148 +add test 10.10.221.149 +add test 10.10.221.15 +add test 10.10.221.150 +add test 10.10.221.151 +add test 10.10.221.152 +add test 10.10.221.153 +add test 10.10.221.154 +add test 10.10.221.155 +add test 10.10.221.156 +add test 10.10.221.157 +add test 10.10.221.158 +add test 10.10.221.159 +add test 10.10.221.16 +add test 10.10.221.160 +add test 10.10.221.161 +add test 10.10.221.162 +add test 10.10.221.163 +add test 10.10.221.164 +add test 10.10.221.165 +add test 10.10.221.166 +add test 10.10.221.167 +add test 10.10.221.168 +add test 10.10.221.169 +add test 10.10.221.17 +add test 10.10.221.170 +add test 10.10.221.171 +add test 10.10.221.172 +add test 10.10.221.173 +add test 10.10.221.174 +add test 10.10.221.175 +add test 10.10.221.176 +add test 10.10.221.177 +add test 10.10.221.178 +add test 10.10.221.179 +add test 10.10.221.18 +add test 10.10.221.180 +add test 10.10.221.181 +add test 10.10.221.182 +add test 10.10.221.183 +add test 10.10.221.184 +add test 10.10.221.185 +add test 10.10.221.186 +add test 10.10.221.187 +add test 10.10.221.188 +add test 10.10.221.189 +add test 10.10.221.19 +add test 10.10.221.190 +add test 10.10.221.191 +add test 10.10.221.192 +add test 10.10.221.193 +add test 10.10.221.194 +add test 10.10.221.195 +add test 10.10.221.196 +add test 10.10.221.197 +add test 10.10.221.198 +add test 10.10.221.199 +add test 10.10.221.2 +add test 10.10.221.20 +add test 10.10.221.200 +add test 10.10.221.201 +add test 10.10.221.202 +add test 10.10.221.203 +add test 10.10.221.204 +add test 10.10.221.205 +add test 10.10.221.206 +add test 10.10.221.207 +add test 10.10.221.208 +add test 10.10.221.209 +add test 10.10.221.21 +add test 10.10.221.210 +add test 10.10.221.211 +add test 10.10.221.212 +add test 10.10.221.213 +add test 10.10.221.214 +add test 10.10.221.215 +add test 10.10.221.216 +add test 10.10.221.217 +add test 10.10.221.218 +add test 10.10.221.219 +add test 10.10.221.22 +add test 10.10.221.220 +add test 10.10.221.221 +add test 10.10.221.222 +add test 10.10.221.223 +add test 10.10.221.224 +add test 10.10.221.225 +add test 10.10.221.226 +add test 10.10.221.227 +add test 10.10.221.228 +add test 10.10.221.229 +add test 10.10.221.23 +add test 10.10.221.230 +add test 10.10.221.231 +add test 10.10.221.232 +add test 10.10.221.233 +add test 10.10.221.234 +add test 10.10.221.235 +add test 10.10.221.236 +add test 10.10.221.237 +add test 10.10.221.238 +add test 10.10.221.239 +add test 10.10.221.24 +add test 10.10.221.240 +add test 10.10.221.241 +add test 10.10.221.242 +add test 10.10.221.243 +add test 10.10.221.244 +add test 10.10.221.245 +add test 10.10.221.246 +add test 10.10.221.247 +add test 10.10.221.248 +add test 10.10.221.249 +add test 10.10.221.25 +add test 10.10.221.250 +add test 10.10.221.251 +add test 10.10.221.252 +add test 10.10.221.253 +add test 10.10.221.254 +add test 10.10.221.255 +add test 10.10.221.26 +add test 10.10.221.27 +add test 10.10.221.28 +add test 10.10.221.29 +add test 10.10.221.3 +add test 10.10.221.30 +add test 10.10.221.31 +add test 10.10.221.32 +add test 10.10.221.33 +add test 10.10.221.34 +add test 10.10.221.35 +add test 10.10.221.36 +add test 10.10.221.37 +add test 10.10.221.38 +add test 10.10.221.39 +add test 10.10.221.4 +add test 10.10.221.40 +add test 10.10.221.41 +add test 10.10.221.42 +add test 10.10.221.43 +add test 10.10.221.44 +add test 10.10.221.45 +add test 10.10.221.46 +add test 10.10.221.47 +add test 10.10.221.48 +add test 10.10.221.49 +add test 10.10.221.5 +add test 10.10.221.50 +add test 10.10.221.51 +add test 10.10.221.52 +add test 10.10.221.53 +add test 10.10.221.54 +add test 10.10.221.55 +add test 10.10.221.56 +add test 10.10.221.57 +add test 10.10.221.58 +add test 10.10.221.59 +add test 10.10.221.6 +add test 10.10.221.60 +add test 10.10.221.61 +add test 10.10.221.62 +add test 10.10.221.63 +add test 10.10.221.64 +add test 10.10.221.65 +add test 10.10.221.66 +add test 10.10.221.67 +add test 10.10.221.68 +add test 10.10.221.69 +add test 10.10.221.7 +add test 10.10.221.70 +add test 10.10.221.71 +add test 10.10.221.72 +add test 10.10.221.73 +add test 10.10.221.74 +add test 10.10.221.75 +add test 10.10.221.76 +add test 10.10.221.77 +add test 10.10.221.78 +add test 10.10.221.79 +add test 10.10.221.8 +add test 10.10.221.80 +add test 10.10.221.81 +add test 10.10.221.82 +add test 10.10.221.83 +add test 10.10.221.84 +add test 10.10.221.85 +add test 10.10.221.86 +add test 10.10.221.87 +add test 10.10.221.88 +add test 10.10.221.89 +add test 10.10.221.9 +add test 10.10.221.90 +add test 10.10.221.91 +add test 10.10.221.92 +add test 10.10.221.93 +add test 10.10.221.94 +add test 10.10.221.95 +add test 10.10.221.96 +add test 10.10.221.97 +add test 10.10.221.98 +add test 10.10.221.99 +add test 10.10.222.0 +add test 10.10.222.1 +add test 10.10.222.10 +add test 10.10.222.100 +add test 10.10.222.101 +add test 10.10.222.102 +add test 10.10.222.103 +add test 10.10.222.104 +add test 10.10.222.105 +add test 10.10.222.106 +add test 10.10.222.107 +add test 10.10.222.108 +add test 10.10.222.109 +add test 10.10.222.11 +add test 10.10.222.110 +add test 10.10.222.111 +add test 10.10.222.112 +add test 10.10.222.113 +add test 10.10.222.114 +add test 10.10.222.115 +add test 10.10.222.116 +add test 10.10.222.117 +add test 10.10.222.118 +add test 10.10.222.119 +add test 10.10.222.12 +add test 10.10.222.120 +add test 10.10.222.121 +add test 10.10.222.122 +add test 10.10.222.123 +add test 10.10.222.124 +add test 10.10.222.125 +add test 10.10.222.126 +add test 10.10.222.127 +add test 10.10.222.128 +add test 10.10.222.129 +add test 10.10.222.13 +add test 10.10.222.130 +add test 10.10.222.131 +add test 10.10.222.132 +add test 10.10.222.133 +add test 10.10.222.134 +add test 10.10.222.135 +add test 10.10.222.136 +add test 10.10.222.137 +add test 10.10.222.138 +add test 10.10.222.139 +add test 10.10.222.14 +add test 10.10.222.140 +add test 10.10.222.141 +add test 10.10.222.142 +add test 10.10.222.143 +add test 10.10.222.144 +add test 10.10.222.145 +add test 10.10.222.146 +add test 10.10.222.147 +add test 10.10.222.148 +add test 10.10.222.149 +add test 10.10.222.15 +add test 10.10.222.150 +add test 10.10.222.151 +add test 10.10.222.152 +add test 10.10.222.153 +add test 10.10.222.154 +add test 10.10.222.155 +add test 10.10.222.156 +add test 10.10.222.157 +add test 10.10.222.158 +add test 10.10.222.159 +add test 10.10.222.16 +add test 10.10.222.160 +add test 10.10.222.161 +add test 10.10.222.162 +add test 10.10.222.163 +add test 10.10.222.164 +add test 10.10.222.165 +add test 10.10.222.166 +add test 10.10.222.167 +add test 10.10.222.168 +add test 10.10.222.169 +add test 10.10.222.17 +add test 10.10.222.170 +add test 10.10.222.171 +add test 10.10.222.172 +add test 10.10.222.173 +add test 10.10.222.174 +add test 10.10.222.175 +add test 10.10.222.176 +add test 10.10.222.177 +add test 10.10.222.178 +add test 10.10.222.179 +add test 10.10.222.18 +add test 10.10.222.180 +add test 10.10.222.181 +add test 10.10.222.182 +add test 10.10.222.183 +add test 10.10.222.184 +add test 10.10.222.185 +add test 10.10.222.186 +add test 10.10.222.187 +add test 10.10.222.188 +add test 10.10.222.189 +add test 10.10.222.19 +add test 10.10.222.190 +add test 10.10.222.191 +add test 10.10.222.192 +add test 10.10.222.193 +add test 10.10.222.194 +add test 10.10.222.195 +add test 10.10.222.196 +add test 10.10.222.197 +add test 10.10.222.198 +add test 10.10.222.199 +add test 10.10.222.2 +add test 10.10.222.20 +add test 10.10.222.200 +add test 10.10.222.201 +add test 10.10.222.202 +add test 10.10.222.203 +add test 10.10.222.204 +add test 10.10.222.205 +add test 10.10.222.206 +add test 10.10.222.207 +add test 10.10.222.208 +add test 10.10.222.209 +add test 10.10.222.21 +add test 10.10.222.210 +add test 10.10.222.211 +add test 10.10.222.212 +add test 10.10.222.213 +add test 10.10.222.214 +add test 10.10.222.215 +add test 10.10.222.216 +add test 10.10.222.217 +add test 10.10.222.218 +add test 10.10.222.219 +add test 10.10.222.22 +add test 10.10.222.220 +add test 10.10.222.221 +add test 10.10.222.222 +add test 10.10.222.223 +add test 10.10.222.224 +add test 10.10.222.225 +add test 10.10.222.226 +add test 10.10.222.227 +add test 10.10.222.228 +add test 10.10.222.229 +add test 10.10.222.23 +add test 10.10.222.230 +add test 10.10.222.231 +add test 10.10.222.232 +add test 10.10.222.233 +add test 10.10.222.234 +add test 10.10.222.235 +add test 10.10.222.236 +add test 10.10.222.237 +add test 10.10.222.238 +add test 10.10.222.239 +add test 10.10.222.24 +add test 10.10.222.240 +add test 10.10.222.241 +add test 10.10.222.242 +add test 10.10.222.243 +add test 10.10.222.244 +add test 10.10.222.245 +add test 10.10.222.246 +add test 10.10.222.247 +add test 10.10.222.248 +add test 10.10.222.249 +add test 10.10.222.25 +add test 10.10.222.250 +add test 10.10.222.251 +add test 10.10.222.252 +add test 10.10.222.253 +add test 10.10.222.254 +add test 10.10.222.255 +add test 10.10.222.26 +add test 10.10.222.27 +add test 10.10.222.28 +add test 10.10.222.29 +add test 10.10.222.3 +add test 10.10.222.30 +add test 10.10.222.31 +add test 10.10.222.32 +add test 10.10.222.33 +add test 10.10.222.34 +add test 10.10.222.35 +add test 10.10.222.36 +add test 10.10.222.37 +add test 10.10.222.38 +add test 10.10.222.39 +add test 10.10.222.4 +add test 10.10.222.40 +add test 10.10.222.41 +add test 10.10.222.42 +add test 10.10.222.43 +add test 10.10.222.44 +add test 10.10.222.45 +add test 10.10.222.46 +add test 10.10.222.47 +add test 10.10.222.48 +add test 10.10.222.49 +add test 10.10.222.5 +add test 10.10.222.50 +add test 10.10.222.51 +add test 10.10.222.52 +add test 10.10.222.53 +add test 10.10.222.54 +add test 10.10.222.55 +add test 10.10.222.56 +add test 10.10.222.57 +add test 10.10.222.58 +add test 10.10.222.59 +add test 10.10.222.6 +add test 10.10.222.60 +add test 10.10.222.61 +add test 10.10.222.62 +add test 10.10.222.63 +add test 10.10.222.64 +add test 10.10.222.65 +add test 10.10.222.66 +add test 10.10.222.67 +add test 10.10.222.68 +add test 10.10.222.69 +add test 10.10.222.7 +add test 10.10.222.70 +add test 10.10.222.71 +add test 10.10.222.72 +add test 10.10.222.73 +add test 10.10.222.74 +add test 10.10.222.75 +add test 10.10.222.76 +add test 10.10.222.77 +add test 10.10.222.78 +add test 10.10.222.79 +add test 10.10.222.8 +add test 10.10.222.80 +add test 10.10.222.81 +add test 10.10.222.82 +add test 10.10.222.83 +add test 10.10.222.84 +add test 10.10.222.85 +add test 10.10.222.86 +add test 10.10.222.87 +add test 10.10.222.88 +add test 10.10.222.89 +add test 10.10.222.9 +add test 10.10.222.90 +add test 10.10.222.91 +add test 10.10.222.92 +add test 10.10.222.93 +add test 10.10.222.94 +add test 10.10.222.95 +add test 10.10.222.96 +add test 10.10.222.97 +add test 10.10.222.98 +add test 10.10.222.99 +add test 10.10.223.0 +add test 10.10.223.1 +add test 10.10.223.10 +add test 10.10.223.100 +add test 10.10.223.101 +add test 10.10.223.102 +add test 10.10.223.103 +add test 10.10.223.104 +add test 10.10.223.105 +add test 10.10.223.106 +add test 10.10.223.107 +add test 10.10.223.108 +add test 10.10.223.109 +add test 10.10.223.11 +add test 10.10.223.110 +add test 10.10.223.111 +add test 10.10.223.112 +add test 10.10.223.113 +add test 10.10.223.114 +add test 10.10.223.115 +add test 10.10.223.116 +add test 10.10.223.117 +add test 10.10.223.118 +add test 10.10.223.119 +add test 10.10.223.12 +add test 10.10.223.120 +add test 10.10.223.121 +add test 10.10.223.122 +add test 10.10.223.123 +add test 10.10.223.124 +add test 10.10.223.125 +add test 10.10.223.126 +add test 10.10.223.127 +add test 10.10.223.128 +add test 10.10.223.129 +add test 10.10.223.13 +add test 10.10.223.130 +add test 10.10.223.131 +add test 10.10.223.132 +add test 10.10.223.133 +add test 10.10.223.134 +add test 10.10.223.135 +add test 10.10.223.136 +add test 10.10.223.137 +add test 10.10.223.138 +add test 10.10.223.139 +add test 10.10.223.14 +add test 10.10.223.140 +add test 10.10.223.141 +add test 10.10.223.142 +add test 10.10.223.143 +add test 10.10.223.144 +add test 10.10.223.145 +add test 10.10.223.146 +add test 10.10.223.147 +add test 10.10.223.148 +add test 10.10.223.149 +add test 10.10.223.15 +add test 10.10.223.150 +add test 10.10.223.151 +add test 10.10.223.152 +add test 10.10.223.153 +add test 10.10.223.154 +add test 10.10.223.155 +add test 10.10.223.156 +add test 10.10.223.157 +add test 10.10.223.158 +add test 10.10.223.159 +add test 10.10.223.16 +add test 10.10.223.160 +add test 10.10.223.161 +add test 10.10.223.162 +add test 10.10.223.163 +add test 10.10.223.164 +add test 10.10.223.165 +add test 10.10.223.166 +add test 10.10.223.167 +add test 10.10.223.168 +add test 10.10.223.169 +add test 10.10.223.17 +add test 10.10.223.170 +add test 10.10.223.171 +add test 10.10.223.172 +add test 10.10.223.173 +add test 10.10.223.174 +add test 10.10.223.175 +add test 10.10.223.176 +add test 10.10.223.177 +add test 10.10.223.178 +add test 10.10.223.179 +add test 10.10.223.18 +add test 10.10.223.180 +add test 10.10.223.181 +add test 10.10.223.182 +add test 10.10.223.183 +add test 10.10.223.184 +add test 10.10.223.185 +add test 10.10.223.186 +add test 10.10.223.187 +add test 10.10.223.188 +add test 10.10.223.189 +add test 10.10.223.19 +add test 10.10.223.190 +add test 10.10.223.191 +add test 10.10.223.192 +add test 10.10.223.193 +add test 10.10.223.194 +add test 10.10.223.195 +add test 10.10.223.196 +add test 10.10.223.197 +add test 10.10.223.198 +add test 10.10.223.199 +add test 10.10.223.2 +add test 10.10.223.20 +add test 10.10.223.200 +add test 10.10.223.201 +add test 10.10.223.202 +add test 10.10.223.203 +add test 10.10.223.204 +add test 10.10.223.205 +add test 10.10.223.206 +add test 10.10.223.207 +add test 10.10.223.208 +add test 10.10.223.209 +add test 10.10.223.21 +add test 10.10.223.210 +add test 10.10.223.211 +add test 10.10.223.212 +add test 10.10.223.213 +add test 10.10.223.214 +add test 10.10.223.215 +add test 10.10.223.216 +add test 10.10.223.217 +add test 10.10.223.218 +add test 10.10.223.219 +add test 10.10.223.22 +add test 10.10.223.220 +add test 10.10.223.221 +add test 10.10.223.222 +add test 10.10.223.223 +add test 10.10.223.224 +add test 10.10.223.225 +add test 10.10.223.226 +add test 10.10.223.227 +add test 10.10.223.228 +add test 10.10.223.229 +add test 10.10.223.23 +add test 10.10.223.230 +add test 10.10.223.231 +add test 10.10.223.232 +add test 10.10.223.233 +add test 10.10.223.234 +add test 10.10.223.235 +add test 10.10.223.236 +add test 10.10.223.237 +add test 10.10.223.238 +add test 10.10.223.239 +add test 10.10.223.24 +add test 10.10.223.240 +add test 10.10.223.241 +add test 10.10.223.242 +add test 10.10.223.243 +add test 10.10.223.244 +add test 10.10.223.245 +add test 10.10.223.246 +add test 10.10.223.247 +add test 10.10.223.248 +add test 10.10.223.249 +add test 10.10.223.25 +add test 10.10.223.250 +add test 10.10.223.251 +add test 10.10.223.252 +add test 10.10.223.253 +add test 10.10.223.254 +add test 10.10.223.255 +add test 10.10.223.26 +add test 10.10.223.27 +add test 10.10.223.28 +add test 10.10.223.29 +add test 10.10.223.3 +add test 10.10.223.30 +add test 10.10.223.31 +add test 10.10.223.32 +add test 10.10.223.33 +add test 10.10.223.34 +add test 10.10.223.35 +add test 10.10.223.36 +add test 10.10.223.37 +add test 10.10.223.38 +add test 10.10.223.39 +add test 10.10.223.4 +add test 10.10.223.40 +add test 10.10.223.41 +add test 10.10.223.42 +add test 10.10.223.43 +add test 10.10.223.44 +add test 10.10.223.45 +add test 10.10.223.46 +add test 10.10.223.47 +add test 10.10.223.48 +add test 10.10.223.49 +add test 10.10.223.5 +add test 10.10.223.50 +add test 10.10.223.51 +add test 10.10.223.52 +add test 10.10.223.53 +add test 10.10.223.54 +add test 10.10.223.55 +add test 10.10.223.56 +add test 10.10.223.57 +add test 10.10.223.58 +add test 10.10.223.59 +add test 10.10.223.6 +add test 10.10.223.60 +add test 10.10.223.61 +add test 10.10.223.62 +add test 10.10.223.63 +add test 10.10.223.64 +add test 10.10.223.65 +add test 10.10.223.66 +add test 10.10.223.67 +add test 10.10.223.68 +add test 10.10.223.69 +add test 10.10.223.7 +add test 10.10.223.70 +add test 10.10.223.71 +add test 10.10.223.72 +add test 10.10.223.73 +add test 10.10.223.74 +add test 10.10.223.75 +add test 10.10.223.76 +add test 10.10.223.77 +add test 10.10.223.78 +add test 10.10.223.79 +add test 10.10.223.8 +add test 10.10.223.80 +add test 10.10.223.81 +add test 10.10.223.82 +add test 10.10.223.83 +add test 10.10.223.84 +add test 10.10.223.85 +add test 10.10.223.86 +add test 10.10.223.87 +add test 10.10.223.88 +add test 10.10.223.89 +add test 10.10.223.9 +add test 10.10.223.90 +add test 10.10.223.91 +add test 10.10.223.92 +add test 10.10.223.93 +add test 10.10.223.94 +add test 10.10.223.95 +add test 10.10.223.96 +add test 10.10.223.97 +add test 10.10.223.98 +add test 10.10.223.99 +add test 10.10.224.0 +add test 10.10.224.1 +add test 10.10.224.10 +add test 10.10.224.100 +add test 10.10.224.101 +add test 10.10.224.102 +add test 10.10.224.103 +add test 10.10.224.104 +add test 10.10.224.105 +add test 10.10.224.106 +add test 10.10.224.107 +add test 10.10.224.108 +add test 10.10.224.109 +add test 10.10.224.11 +add test 10.10.224.110 +add test 10.10.224.111 +add test 10.10.224.112 +add test 10.10.224.113 +add test 10.10.224.114 +add test 10.10.224.115 +add test 10.10.224.116 +add test 10.10.224.117 +add test 10.10.224.118 +add test 10.10.224.119 +add test 10.10.224.12 +add test 10.10.224.120 +add test 10.10.224.121 +add test 10.10.224.122 +add test 10.10.224.123 +add test 10.10.224.124 +add test 10.10.224.125 +add test 10.10.224.126 +add test 10.10.224.127 +add test 10.10.224.128 +add test 10.10.224.129 +add test 10.10.224.13 +add test 10.10.224.130 +add test 10.10.224.131 +add test 10.10.224.132 +add test 10.10.224.133 +add test 10.10.224.134 +add test 10.10.224.135 +add test 10.10.224.136 +add test 10.10.224.137 +add test 10.10.224.138 +add test 10.10.224.139 +add test 10.10.224.14 +add test 10.10.224.140 +add test 10.10.224.141 +add test 10.10.224.142 +add test 10.10.224.143 +add test 10.10.224.144 +add test 10.10.224.145 +add test 10.10.224.146 +add test 10.10.224.147 +add test 10.10.224.148 +add test 10.10.224.149 +add test 10.10.224.15 +add test 10.10.224.150 +add test 10.10.224.151 +add test 10.10.224.152 +add test 10.10.224.153 +add test 10.10.224.154 +add test 10.10.224.155 +add test 10.10.224.156 +add test 10.10.224.157 +add test 10.10.224.158 +add test 10.10.224.159 +add test 10.10.224.16 +add test 10.10.224.160 +add test 10.10.224.161 +add test 10.10.224.162 +add test 10.10.224.163 +add test 10.10.224.164 +add test 10.10.224.165 +add test 10.10.224.166 +add test 10.10.224.167 +add test 10.10.224.168 +add test 10.10.224.169 +add test 10.10.224.17 +add test 10.10.224.170 +add test 10.10.224.171 +add test 10.10.224.172 +add test 10.10.224.173 +add test 10.10.224.174 +add test 10.10.224.175 +add test 10.10.224.176 +add test 10.10.224.177 +add test 10.10.224.178 +add test 10.10.224.179 +add test 10.10.224.18 +add test 10.10.224.180 +add test 10.10.224.181 +add test 10.10.224.182 +add test 10.10.224.183 +add test 10.10.224.184 +add test 10.10.224.185 +add test 10.10.224.186 +add test 10.10.224.187 +add test 10.10.224.188 +add test 10.10.224.189 +add test 10.10.224.19 +add test 10.10.224.190 +add test 10.10.224.191 +add test 10.10.224.192 +add test 10.10.224.193 +add test 10.10.224.194 +add test 10.10.224.195 +add test 10.10.224.196 +add test 10.10.224.197 +add test 10.10.224.198 +add test 10.10.224.199 +add test 10.10.224.2 +add test 10.10.224.20 +add test 10.10.224.200 +add test 10.10.224.201 +add test 10.10.224.202 +add test 10.10.224.203 +add test 10.10.224.204 +add test 10.10.224.205 +add test 10.10.224.206 +add test 10.10.224.207 +add test 10.10.224.208 +add test 10.10.224.209 +add test 10.10.224.21 +add test 10.10.224.210 +add test 10.10.224.211 +add test 10.10.224.212 +add test 10.10.224.213 +add test 10.10.224.214 +add test 10.10.224.215 +add test 10.10.224.216 +add test 10.10.224.217 +add test 10.10.224.218 +add test 10.10.224.219 +add test 10.10.224.22 +add test 10.10.224.220 +add test 10.10.224.221 +add test 10.10.224.222 +add test 10.10.224.223 +add test 10.10.224.224 +add test 10.10.224.225 +add test 10.10.224.226 +add test 10.10.224.227 +add test 10.10.224.228 +add test 10.10.224.229 +add test 10.10.224.23 +add test 10.10.224.230 +add test 10.10.224.231 +add test 10.10.224.232 +add test 10.10.224.233 +add test 10.10.224.234 +add test 10.10.224.235 +add test 10.10.224.236 +add test 10.10.224.237 +add test 10.10.224.238 +add test 10.10.224.239 +add test 10.10.224.24 +add test 10.10.224.240 +add test 10.10.224.241 +add test 10.10.224.242 +add test 10.10.224.243 +add test 10.10.224.244 +add test 10.10.224.245 +add test 10.10.224.246 +add test 10.10.224.247 +add test 10.10.224.248 +add test 10.10.224.249 +add test 10.10.224.25 +add test 10.10.224.250 +add test 10.10.224.251 +add test 10.10.224.252 +add test 10.10.224.253 +add test 10.10.224.254 +add test 10.10.224.255 +add test 10.10.224.26 +add test 10.10.224.27 +add test 10.10.224.28 +add test 10.10.224.29 +add test 10.10.224.3 +add test 10.10.224.30 +add test 10.10.224.31 +add test 10.10.224.32 +add test 10.10.224.33 +add test 10.10.224.34 +add test 10.10.224.35 +add test 10.10.224.36 +add test 10.10.224.37 +add test 10.10.224.38 +add test 10.10.224.39 +add test 10.10.224.4 +add test 10.10.224.40 +add test 10.10.224.41 +add test 10.10.224.42 +add test 10.10.224.43 +add test 10.10.224.44 +add test 10.10.224.45 +add test 10.10.224.46 +add test 10.10.224.47 +add test 10.10.224.48 +add test 10.10.224.49 +add test 10.10.224.5 +add test 10.10.224.50 +add test 10.10.224.51 +add test 10.10.224.52 +add test 10.10.224.53 +add test 10.10.224.54 +add test 10.10.224.55 +add test 10.10.224.56 +add test 10.10.224.57 +add test 10.10.224.58 +add test 10.10.224.59 +add test 10.10.224.6 +add test 10.10.224.60 +add test 10.10.224.61 +add test 10.10.224.62 +add test 10.10.224.63 +add test 10.10.224.64 +add test 10.10.224.65 +add test 10.10.224.66 +add test 10.10.224.67 +add test 10.10.224.68 +add test 10.10.224.69 +add test 10.10.224.7 +add test 10.10.224.70 +add test 10.10.224.71 +add test 10.10.224.72 +add test 10.10.224.73 +add test 10.10.224.74 +add test 10.10.224.75 +add test 10.10.224.76 +add test 10.10.224.77 +add test 10.10.224.78 +add test 10.10.224.79 +add test 10.10.224.8 +add test 10.10.224.80 +add test 10.10.224.81 +add test 10.10.224.82 +add test 10.10.224.83 +add test 10.10.224.84 +add test 10.10.224.85 +add test 10.10.224.86 +add test 10.10.224.87 +add test 10.10.224.88 +add test 10.10.224.89 +add test 10.10.224.9 +add test 10.10.224.90 +add test 10.10.224.91 +add test 10.10.224.92 +add test 10.10.224.93 +add test 10.10.224.94 +add test 10.10.224.95 +add test 10.10.224.96 +add test 10.10.224.97 +add test 10.10.224.98 +add test 10.10.224.99 +add test 10.10.225.0 +add test 10.10.225.1 +add test 10.10.225.10 +add test 10.10.225.100 +add test 10.10.225.101 +add test 10.10.225.102 +add test 10.10.225.103 +add test 10.10.225.104 +add test 10.10.225.105 +add test 10.10.225.106 +add test 10.10.225.107 +add test 10.10.225.108 +add test 10.10.225.109 +add test 10.10.225.11 +add test 10.10.225.110 +add test 10.10.225.111 +add test 10.10.225.112 +add test 10.10.225.113 +add test 10.10.225.114 +add test 10.10.225.115 +add test 10.10.225.116 +add test 10.10.225.117 +add test 10.10.225.118 +add test 10.10.225.119 +add test 10.10.225.12 +add test 10.10.225.120 +add test 10.10.225.121 +add test 10.10.225.122 +add test 10.10.225.123 +add test 10.10.225.124 +add test 10.10.225.125 +add test 10.10.225.126 +add test 10.10.225.127 +add test 10.10.225.128 +add test 10.10.225.129 +add test 10.10.225.13 +add test 10.10.225.130 +add test 10.10.225.131 +add test 10.10.225.132 +add test 10.10.225.133 +add test 10.10.225.134 +add test 10.10.225.135 +add test 10.10.225.136 +add test 10.10.225.137 +add test 10.10.225.138 +add test 10.10.225.139 +add test 10.10.225.14 +add test 10.10.225.140 +add test 10.10.225.141 +add test 10.10.225.142 +add test 10.10.225.143 +add test 10.10.225.144 +add test 10.10.225.145 +add test 10.10.225.146 +add test 10.10.225.147 +add test 10.10.225.148 +add test 10.10.225.149 +add test 10.10.225.15 +add test 10.10.225.150 +add test 10.10.225.151 +add test 10.10.225.152 +add test 10.10.225.153 +add test 10.10.225.154 +add test 10.10.225.155 +add test 10.10.225.156 +add test 10.10.225.157 +add test 10.10.225.158 +add test 10.10.225.159 +add test 10.10.225.16 +add test 10.10.225.160 +add test 10.10.225.161 +add test 10.10.225.162 +add test 10.10.225.163 +add test 10.10.225.164 +add test 10.10.225.165 +add test 10.10.225.166 +add test 10.10.225.167 +add test 10.10.225.168 +add test 10.10.225.169 +add test 10.10.225.17 +add test 10.10.225.170 +add test 10.10.225.171 +add test 10.10.225.172 +add test 10.10.225.173 +add test 10.10.225.174 +add test 10.10.225.175 +add test 10.10.225.176 +add test 10.10.225.177 +add test 10.10.225.178 +add test 10.10.225.179 +add test 10.10.225.18 +add test 10.10.225.180 +add test 10.10.225.181 +add test 10.10.225.182 +add test 10.10.225.183 +add test 10.10.225.184 +add test 10.10.225.185 +add test 10.10.225.186 +add test 10.10.225.187 +add test 10.10.225.188 +add test 10.10.225.189 +add test 10.10.225.19 +add test 10.10.225.190 +add test 10.10.225.191 +add test 10.10.225.192 +add test 10.10.225.193 +add test 10.10.225.194 +add test 10.10.225.195 +add test 10.10.225.196 +add test 10.10.225.197 +add test 10.10.225.198 +add test 10.10.225.199 +add test 10.10.225.2 +add test 10.10.225.20 +add test 10.10.225.200 +add test 10.10.225.201 +add test 10.10.225.202 +add test 10.10.225.203 +add test 10.10.225.204 +add test 10.10.225.205 +add test 10.10.225.206 +add test 10.10.225.207 +add test 10.10.225.208 +add test 10.10.225.209 +add test 10.10.225.21 +add test 10.10.225.210 +add test 10.10.225.211 +add test 10.10.225.212 +add test 10.10.225.213 +add test 10.10.225.214 +add test 10.10.225.215 +add test 10.10.225.216 +add test 10.10.225.217 +add test 10.10.225.218 +add test 10.10.225.219 +add test 10.10.225.22 +add test 10.10.225.220 +add test 10.10.225.221 +add test 10.10.225.222 +add test 10.10.225.223 +add test 10.10.225.224 +add test 10.10.225.225 +add test 10.10.225.226 +add test 10.10.225.227 +add test 10.10.225.228 +add test 10.10.225.229 +add test 10.10.225.23 +add test 10.10.225.230 +add test 10.10.225.231 +add test 10.10.225.232 +add test 10.10.225.233 +add test 10.10.225.234 +add test 10.10.225.235 +add test 10.10.225.236 +add test 10.10.225.237 +add test 10.10.225.238 +add test 10.10.225.239 +add test 10.10.225.24 +add test 10.10.225.240 +add test 10.10.225.241 +add test 10.10.225.242 +add test 10.10.225.243 +add test 10.10.225.244 +add test 10.10.225.245 +add test 10.10.225.246 +add test 10.10.225.247 +add test 10.10.225.248 +add test 10.10.225.249 +add test 10.10.225.25 +add test 10.10.225.250 +add test 10.10.225.251 +add test 10.10.225.252 +add test 10.10.225.253 +add test 10.10.225.254 +add test 10.10.225.255 +add test 10.10.225.26 +add test 10.10.225.27 +add test 10.10.225.28 +add test 10.10.225.29 +add test 10.10.225.3 +add test 10.10.225.30 +add test 10.10.225.31 +add test 10.10.225.32 +add test 10.10.225.33 +add test 10.10.225.34 +add test 10.10.225.35 +add test 10.10.225.36 +add test 10.10.225.37 +add test 10.10.225.38 +add test 10.10.225.39 +add test 10.10.225.4 +add test 10.10.225.40 +add test 10.10.225.41 +add test 10.10.225.42 +add test 10.10.225.43 +add test 10.10.225.44 +add test 10.10.225.45 +add test 10.10.225.46 +add test 10.10.225.47 +add test 10.10.225.48 +add test 10.10.225.49 +add test 10.10.225.5 +add test 10.10.225.50 +add test 10.10.225.51 +add test 10.10.225.52 +add test 10.10.225.53 +add test 10.10.225.54 +add test 10.10.225.55 +add test 10.10.225.56 +add test 10.10.225.57 +add test 10.10.225.58 +add test 10.10.225.59 +add test 10.10.225.6 +add test 10.10.225.60 +add test 10.10.225.61 +add test 10.10.225.62 +add test 10.10.225.63 +add test 10.10.225.64 +add test 10.10.225.65 +add test 10.10.225.66 +add test 10.10.225.67 +add test 10.10.225.68 +add test 10.10.225.69 +add test 10.10.225.7 +add test 10.10.225.70 +add test 10.10.225.71 +add test 10.10.225.72 +add test 10.10.225.73 +add test 10.10.225.74 +add test 10.10.225.75 +add test 10.10.225.76 +add test 10.10.225.77 +add test 10.10.225.78 +add test 10.10.225.79 +add test 10.10.225.8 +add test 10.10.225.80 +add test 10.10.225.81 +add test 10.10.225.82 +add test 10.10.225.83 +add test 10.10.225.84 +add test 10.10.225.85 +add test 10.10.225.86 +add test 10.10.225.87 +add test 10.10.225.88 +add test 10.10.225.89 +add test 10.10.225.9 +add test 10.10.225.90 +add test 10.10.225.91 +add test 10.10.225.92 +add test 10.10.225.93 +add test 10.10.225.94 +add test 10.10.225.95 +add test 10.10.225.96 +add test 10.10.225.97 +add test 10.10.225.98 +add test 10.10.225.99 +add test 10.10.226.0 +add test 10.10.226.1 +add test 10.10.226.10 +add test 10.10.226.100 +add test 10.10.226.101 +add test 10.10.226.102 +add test 10.10.226.103 +add test 10.10.226.104 +add test 10.10.226.105 +add test 10.10.226.106 +add test 10.10.226.107 +add test 10.10.226.108 +add test 10.10.226.109 +add test 10.10.226.11 +add test 10.10.226.110 +add test 10.10.226.111 +add test 10.10.226.112 +add test 10.10.226.113 +add test 10.10.226.114 +add test 10.10.226.115 +add test 10.10.226.116 +add test 10.10.226.117 +add test 10.10.226.118 +add test 10.10.226.119 +add test 10.10.226.12 +add test 10.10.226.120 +add test 10.10.226.121 +add test 10.10.226.122 +add test 10.10.226.123 +add test 10.10.226.124 +add test 10.10.226.125 +add test 10.10.226.126 +add test 10.10.226.127 +add test 10.10.226.128 +add test 10.10.226.129 +add test 10.10.226.13 +add test 10.10.226.130 +add test 10.10.226.131 +add test 10.10.226.132 +add test 10.10.226.133 +add test 10.10.226.134 +add test 10.10.226.135 +add test 10.10.226.136 +add test 10.10.226.137 +add test 10.10.226.138 +add test 10.10.226.139 +add test 10.10.226.14 +add test 10.10.226.140 +add test 10.10.226.141 +add test 10.10.226.142 +add test 10.10.226.143 +add test 10.10.226.144 +add test 10.10.226.145 +add test 10.10.226.146 +add test 10.10.226.147 +add test 10.10.226.148 +add test 10.10.226.149 +add test 10.10.226.15 +add test 10.10.226.150 +add test 10.10.226.151 +add test 10.10.226.152 +add test 10.10.226.153 +add test 10.10.226.154 +add test 10.10.226.155 +add test 10.10.226.156 +add test 10.10.226.157 +add test 10.10.226.158 +add test 10.10.226.159 +add test 10.10.226.16 +add test 10.10.226.160 +add test 10.10.226.161 +add test 10.10.226.162 +add test 10.10.226.163 +add test 10.10.226.164 +add test 10.10.226.165 +add test 10.10.226.166 +add test 10.10.226.167 +add test 10.10.226.168 +add test 10.10.226.169 +add test 10.10.226.17 +add test 10.10.226.170 +add test 10.10.226.171 +add test 10.10.226.172 +add test 10.10.226.173 +add test 10.10.226.174 +add test 10.10.226.175 +add test 10.10.226.176 +add test 10.10.226.177 +add test 10.10.226.178 +add test 10.10.226.179 +add test 10.10.226.18 +add test 10.10.226.180 +add test 10.10.226.181 +add test 10.10.226.182 +add test 10.10.226.183 +add test 10.10.226.184 +add test 10.10.226.185 +add test 10.10.226.186 +add test 10.10.226.187 +add test 10.10.226.188 +add test 10.10.226.189 +add test 10.10.226.19 +add test 10.10.226.190 +add test 10.10.226.191 +add test 10.10.226.192 +add test 10.10.226.193 +add test 10.10.226.194 +add test 10.10.226.195 +add test 10.10.226.196 +add test 10.10.226.197 +add test 10.10.226.198 +add test 10.10.226.199 +add test 10.10.226.2 +add test 10.10.226.20 +add test 10.10.226.200 +add test 10.10.226.201 +add test 10.10.226.202 +add test 10.10.226.203 +add test 10.10.226.204 +add test 10.10.226.205 +add test 10.10.226.206 +add test 10.10.226.207 +add test 10.10.226.208 +add test 10.10.226.209 +add test 10.10.226.21 +add test 10.10.226.210 +add test 10.10.226.211 +add test 10.10.226.212 +add test 10.10.226.213 +add test 10.10.226.214 +add test 10.10.226.215 +add test 10.10.226.216 +add test 10.10.226.217 +add test 10.10.226.218 +add test 10.10.226.219 +add test 10.10.226.22 +add test 10.10.226.220 +add test 10.10.226.221 +add test 10.10.226.222 +add test 10.10.226.223 +add test 10.10.226.224 +add test 10.10.226.225 +add test 10.10.226.226 +add test 10.10.226.227 +add test 10.10.226.228 +add test 10.10.226.229 +add test 10.10.226.23 +add test 10.10.226.230 +add test 10.10.226.231 +add test 10.10.226.232 +add test 10.10.226.233 +add test 10.10.226.234 +add test 10.10.226.235 +add test 10.10.226.236 +add test 10.10.226.237 +add test 10.10.226.238 +add test 10.10.226.239 +add test 10.10.226.24 +add test 10.10.226.240 +add test 10.10.226.241 +add test 10.10.226.242 +add test 10.10.226.243 +add test 10.10.226.244 +add test 10.10.226.245 +add test 10.10.226.246 +add test 10.10.226.247 +add test 10.10.226.248 +add test 10.10.226.249 +add test 10.10.226.25 +add test 10.10.226.250 +add test 10.10.226.251 +add test 10.10.226.252 +add test 10.10.226.253 +add test 10.10.226.254 +add test 10.10.226.255 +add test 10.10.226.26 +add test 10.10.226.27 +add test 10.10.226.28 +add test 10.10.226.29 +add test 10.10.226.3 +add test 10.10.226.30 +add test 10.10.226.31 +add test 10.10.226.32 +add test 10.10.226.33 +add test 10.10.226.34 +add test 10.10.226.35 +add test 10.10.226.36 +add test 10.10.226.37 +add test 10.10.226.38 +add test 10.10.226.39 +add test 10.10.226.4 +add test 10.10.226.40 +add test 10.10.226.41 +add test 10.10.226.42 +add test 10.10.226.43 +add test 10.10.226.44 +add test 10.10.226.45 +add test 10.10.226.46 +add test 10.10.226.47 +add test 10.10.226.48 +add test 10.10.226.49 +add test 10.10.226.5 +add test 10.10.226.50 +add test 10.10.226.51 +add test 10.10.226.52 +add test 10.10.226.53 +add test 10.10.226.54 +add test 10.10.226.55 +add test 10.10.226.56 +add test 10.10.226.57 +add test 10.10.226.58 +add test 10.10.226.59 +add test 10.10.226.6 +add test 10.10.226.60 +add test 10.10.226.61 +add test 10.10.226.62 +add test 10.10.226.63 +add test 10.10.226.64 +add test 10.10.226.65 +add test 10.10.226.66 +add test 10.10.226.67 +add test 10.10.226.68 +add test 10.10.226.69 +add test 10.10.226.7 +add test 10.10.226.70 +add test 10.10.226.71 +add test 10.10.226.72 +add test 10.10.226.73 +add test 10.10.226.74 +add test 10.10.226.75 +add test 10.10.226.76 +add test 10.10.226.77 +add test 10.10.226.78 +add test 10.10.226.79 +add test 10.10.226.8 +add test 10.10.226.80 +add test 10.10.226.81 +add test 10.10.226.82 +add test 10.10.226.83 +add test 10.10.226.84 +add test 10.10.226.85 +add test 10.10.226.86 +add test 10.10.226.87 +add test 10.10.226.88 +add test 10.10.226.89 +add test 10.10.226.9 +add test 10.10.226.90 +add test 10.10.226.91 +add test 10.10.226.92 +add test 10.10.226.93 +add test 10.10.226.94 +add test 10.10.226.95 +add test 10.10.226.96 +add test 10.10.226.97 +add test 10.10.226.98 +add test 10.10.226.99 +add test 10.10.227.0 +add test 10.10.227.1 +add test 10.10.227.10 +add test 10.10.227.100 +add test 10.10.227.101 +add test 10.10.227.102 +add test 10.10.227.103 +add test 10.10.227.104 +add test 10.10.227.105 +add test 10.10.227.106 +add test 10.10.227.107 +add test 10.10.227.108 +add test 10.10.227.109 +add test 10.10.227.11 +add test 10.10.227.110 +add test 10.10.227.111 +add test 10.10.227.112 +add test 10.10.227.113 +add test 10.10.227.114 +add test 10.10.227.115 +add test 10.10.227.116 +add test 10.10.227.117 +add test 10.10.227.118 +add test 10.10.227.119 +add test 10.10.227.12 +add test 10.10.227.120 +add test 10.10.227.121 +add test 10.10.227.122 +add test 10.10.227.123 +add test 10.10.227.124 +add test 10.10.227.125 +add test 10.10.227.126 +add test 10.10.227.127 +add test 10.10.227.128 +add test 10.10.227.129 +add test 10.10.227.13 +add test 10.10.227.130 +add test 10.10.227.131 +add test 10.10.227.132 +add test 10.10.227.133 +add test 10.10.227.134 +add test 10.10.227.135 +add test 10.10.227.136 +add test 10.10.227.137 +add test 10.10.227.138 +add test 10.10.227.139 +add test 10.10.227.14 +add test 10.10.227.140 +add test 10.10.227.141 +add test 10.10.227.142 +add test 10.10.227.143 +add test 10.10.227.144 +add test 10.10.227.145 +add test 10.10.227.146 +add test 10.10.227.147 +add test 10.10.227.148 +add test 10.10.227.149 +add test 10.10.227.15 +add test 10.10.227.150 +add test 10.10.227.151 +add test 10.10.227.152 +add test 10.10.227.153 +add test 10.10.227.154 +add test 10.10.227.155 +add test 10.10.227.156 +add test 10.10.227.157 +add test 10.10.227.158 +add test 10.10.227.159 +add test 10.10.227.16 +add test 10.10.227.160 +add test 10.10.227.161 +add test 10.10.227.162 +add test 10.10.227.163 +add test 10.10.227.164 +add test 10.10.227.165 +add test 10.10.227.166 +add test 10.10.227.167 +add test 10.10.227.168 +add test 10.10.227.169 +add test 10.10.227.17 +add test 10.10.227.170 +add test 10.10.227.171 +add test 10.10.227.172 +add test 10.10.227.173 +add test 10.10.227.174 +add test 10.10.227.175 +add test 10.10.227.176 +add test 10.10.227.177 +add test 10.10.227.178 +add test 10.10.227.179 +add test 10.10.227.18 +add test 10.10.227.180 +add test 10.10.227.181 +add test 10.10.227.182 +add test 10.10.227.183 +add test 10.10.227.184 +add test 10.10.227.185 +add test 10.10.227.186 +add test 10.10.227.187 +add test 10.10.227.188 +add test 10.10.227.189 +add test 10.10.227.19 +add test 10.10.227.190 +add test 10.10.227.191 +add test 10.10.227.192 +add test 10.10.227.193 +add test 10.10.227.194 +add test 10.10.227.195 +add test 10.10.227.196 +add test 10.10.227.197 +add test 10.10.227.198 +add test 10.10.227.199 +add test 10.10.227.2 +add test 10.10.227.20 +add test 10.10.227.200 +add test 10.10.227.201 +add test 10.10.227.202 +add test 10.10.227.203 +add test 10.10.227.204 +add test 10.10.227.205 +add test 10.10.227.206 +add test 10.10.227.207 +add test 10.10.227.208 +add test 10.10.227.209 +add test 10.10.227.21 +add test 10.10.227.210 +add test 10.10.227.211 +add test 10.10.227.212 +add test 10.10.227.213 +add test 10.10.227.214 +add test 10.10.227.215 +add test 10.10.227.216 +add test 10.10.227.217 +add test 10.10.227.218 +add test 10.10.227.219 +add test 10.10.227.22 +add test 10.10.227.220 +add test 10.10.227.221 +add test 10.10.227.222 +add test 10.10.227.223 +add test 10.10.227.224 +add test 10.10.227.225 +add test 10.10.227.226 +add test 10.10.227.227 +add test 10.10.227.228 +add test 10.10.227.229 +add test 10.10.227.23 +add test 10.10.227.230 +add test 10.10.227.231 +add test 10.10.227.232 +add test 10.10.227.233 +add test 10.10.227.234 +add test 10.10.227.235 +add test 10.10.227.236 +add test 10.10.227.237 +add test 10.10.227.238 +add test 10.10.227.239 +add test 10.10.227.24 +add test 10.10.227.240 +add test 10.10.227.241 +add test 10.10.227.242 +add test 10.10.227.243 +add test 10.10.227.244 +add test 10.10.227.245 +add test 10.10.227.246 +add test 10.10.227.247 +add test 10.10.227.248 +add test 10.10.227.249 +add test 10.10.227.25 +add test 10.10.227.250 +add test 10.10.227.251 +add test 10.10.227.252 +add test 10.10.227.253 +add test 10.10.227.254 +add test 10.10.227.255 +add test 10.10.227.26 +add test 10.10.227.27 +add test 10.10.227.28 +add test 10.10.227.29 +add test 10.10.227.3 +add test 10.10.227.30 +add test 10.10.227.31 +add test 10.10.227.32 +add test 10.10.227.33 +add test 10.10.227.34 +add test 10.10.227.35 +add test 10.10.227.36 +add test 10.10.227.37 +add test 10.10.227.38 +add test 10.10.227.39 +add test 10.10.227.4 +add test 10.10.227.40 +add test 10.10.227.41 +add test 10.10.227.42 +add test 10.10.227.43 +add test 10.10.227.44 +add test 10.10.227.45 +add test 10.10.227.46 +add test 10.10.227.47 +add test 10.10.227.48 +add test 10.10.227.49 +add test 10.10.227.5 +add test 10.10.227.50 +add test 10.10.227.51 +add test 10.10.227.52 +add test 10.10.227.53 +add test 10.10.227.54 +add test 10.10.227.55 +add test 10.10.227.56 +add test 10.10.227.57 +add test 10.10.227.58 +add test 10.10.227.59 +add test 10.10.227.6 +add test 10.10.227.60 +add test 10.10.227.61 +add test 10.10.227.62 +add test 10.10.227.63 +add test 10.10.227.64 +add test 10.10.227.65 +add test 10.10.227.66 +add test 10.10.227.67 +add test 10.10.227.68 +add test 10.10.227.69 +add test 10.10.227.7 +add test 10.10.227.70 +add test 10.10.227.71 +add test 10.10.227.72 +add test 10.10.227.73 +add test 10.10.227.74 +add test 10.10.227.75 +add test 10.10.227.76 +add test 10.10.227.77 +add test 10.10.227.78 +add test 10.10.227.79 +add test 10.10.227.8 +add test 10.10.227.80 +add test 10.10.227.81 +add test 10.10.227.82 +add test 10.10.227.83 +add test 10.10.227.84 +add test 10.10.227.85 +add test 10.10.227.86 +add test 10.10.227.87 +add test 10.10.227.88 +add test 10.10.227.89 +add test 10.10.227.9 +add test 10.10.227.90 +add test 10.10.227.91 +add test 10.10.227.92 +add test 10.10.227.93 +add test 10.10.227.94 +add test 10.10.227.95 +add test 10.10.227.96 +add test 10.10.227.97 +add test 10.10.227.98 +add test 10.10.227.99 +add test 10.10.228.0 +add test 10.10.228.1 +add test 10.10.228.10 +add test 10.10.228.100 +add test 10.10.228.101 +add test 10.10.228.102 +add test 10.10.228.103 +add test 10.10.228.104 +add test 10.10.228.105 +add test 10.10.228.106 +add test 10.10.228.107 +add test 10.10.228.108 +add test 10.10.228.109 +add test 10.10.228.11 +add test 10.10.228.110 +add test 10.10.228.111 +add test 10.10.228.112 +add test 10.10.228.113 +add test 10.10.228.114 +add test 10.10.228.115 +add test 10.10.228.116 +add test 10.10.228.117 +add test 10.10.228.118 +add test 10.10.228.119 +add test 10.10.228.12 +add test 10.10.228.120 +add test 10.10.228.121 +add test 10.10.228.122 +add test 10.10.228.123 +add test 10.10.228.124 +add test 10.10.228.125 +add test 10.10.228.126 +add test 10.10.228.127 +add test 10.10.228.128 +add test 10.10.228.129 +add test 10.10.228.13 +add test 10.10.228.130 +add test 10.10.228.131 +add test 10.10.228.132 +add test 10.10.228.133 +add test 10.10.228.134 +add test 10.10.228.135 +add test 10.10.228.136 +add test 10.10.228.137 +add test 10.10.228.138 +add test 10.10.228.139 +add test 10.10.228.14 +add test 10.10.228.140 +add test 10.10.228.141 +add test 10.10.228.142 +add test 10.10.228.143 +add test 10.10.228.144 +add test 10.10.228.145 +add test 10.10.228.146 +add test 10.10.228.147 +add test 10.10.228.148 +add test 10.10.228.149 +add test 10.10.228.15 +add test 10.10.228.150 +add test 10.10.228.151 +add test 10.10.228.152 +add test 10.10.228.153 +add test 10.10.228.154 +add test 10.10.228.155 +add test 10.10.228.156 +add test 10.10.228.157 +add test 10.10.228.158 +add test 10.10.228.159 +add test 10.10.228.16 +add test 10.10.228.160 +add test 10.10.228.161 +add test 10.10.228.162 +add test 10.10.228.163 +add test 10.10.228.164 +add test 10.10.228.165 +add test 10.10.228.166 +add test 10.10.228.167 +add test 10.10.228.168 +add test 10.10.228.169 +add test 10.10.228.17 +add test 10.10.228.170 +add test 10.10.228.171 +add test 10.10.228.172 +add test 10.10.228.173 +add test 10.10.228.174 +add test 10.10.228.175 +add test 10.10.228.176 +add test 10.10.228.177 +add test 10.10.228.178 +add test 10.10.228.179 +add test 10.10.228.18 +add test 10.10.228.180 +add test 10.10.228.181 +add test 10.10.228.182 +add test 10.10.228.183 +add test 10.10.228.184 +add test 10.10.228.185 +add test 10.10.228.186 +add test 10.10.228.187 +add test 10.10.228.188 +add test 10.10.228.189 +add test 10.10.228.19 +add test 10.10.228.190 +add test 10.10.228.191 +add test 10.10.228.192 +add test 10.10.228.193 +add test 10.10.228.194 +add test 10.10.228.195 +add test 10.10.228.196 +add test 10.10.228.197 +add test 10.10.228.198 +add test 10.10.228.199 +add test 10.10.228.2 +add test 10.10.228.20 +add test 10.10.228.200 +add test 10.10.228.201 +add test 10.10.228.202 +add test 10.10.228.203 +add test 10.10.228.204 +add test 10.10.228.205 +add test 10.10.228.206 +add test 10.10.228.207 +add test 10.10.228.208 +add test 10.10.228.209 +add test 10.10.228.21 +add test 10.10.228.210 +add test 10.10.228.211 +add test 10.10.228.212 +add test 10.10.228.213 +add test 10.10.228.214 +add test 10.10.228.215 +add test 10.10.228.216 +add test 10.10.228.217 +add test 10.10.228.218 +add test 10.10.228.219 +add test 10.10.228.22 +add test 10.10.228.220 +add test 10.10.228.221 +add test 10.10.228.222 +add test 10.10.228.223 +add test 10.10.228.224 +add test 10.10.228.225 +add test 10.10.228.226 +add test 10.10.228.227 +add test 10.10.228.228 +add test 10.10.228.229 +add test 10.10.228.23 +add test 10.10.228.230 +add test 10.10.228.231 +add test 10.10.228.232 +add test 10.10.228.233 +add test 10.10.228.234 +add test 10.10.228.235 +add test 10.10.228.236 +add test 10.10.228.237 +add test 10.10.228.238 +add test 10.10.228.239 +add test 10.10.228.24 +add test 10.10.228.240 +add test 10.10.228.241 +add test 10.10.228.242 +add test 10.10.228.243 +add test 10.10.228.244 +add test 10.10.228.245 +add test 10.10.228.246 +add test 10.10.228.247 +add test 10.10.228.248 +add test 10.10.228.249 +add test 10.10.228.25 +add test 10.10.228.250 +add test 10.10.228.251 +add test 10.10.228.252 +add test 10.10.228.253 +add test 10.10.228.254 +add test 10.10.228.255 +add test 10.10.228.26 +add test 10.10.228.27 +add test 10.10.228.28 +add test 10.10.228.29 +add test 10.10.228.3 +add test 10.10.228.30 +add test 10.10.228.31 +add test 10.10.228.32 +add test 10.10.228.33 +add test 10.10.228.34 +add test 10.10.228.35 +add test 10.10.228.36 +add test 10.10.228.37 +add test 10.10.228.38 +add test 10.10.228.39 +add test 10.10.228.4 +add test 10.10.228.40 +add test 10.10.228.41 +add test 10.10.228.42 +add test 10.10.228.43 +add test 10.10.228.44 +add test 10.10.228.45 +add test 10.10.228.46 +add test 10.10.228.47 +add test 10.10.228.48 +add test 10.10.228.49 +add test 10.10.228.5 +add test 10.10.228.50 +add test 10.10.228.51 +add test 10.10.228.52 +add test 10.10.228.53 +add test 10.10.228.54 +add test 10.10.228.55 +add test 10.10.228.56 +add test 10.10.228.57 +add test 10.10.228.58 +add test 10.10.228.59 +add test 10.10.228.6 +add test 10.10.228.60 +add test 10.10.228.61 +add test 10.10.228.62 +add test 10.10.228.63 +add test 10.10.228.64 +add test 10.10.228.65 +add test 10.10.228.66 +add test 10.10.228.67 +add test 10.10.228.68 +add test 10.10.228.69 +add test 10.10.228.7 +add test 10.10.228.70 +add test 10.10.228.71 +add test 10.10.228.72 +add test 10.10.228.73 +add test 10.10.228.74 +add test 10.10.228.75 +add test 10.10.228.76 +add test 10.10.228.77 +add test 10.10.228.78 +add test 10.10.228.79 +add test 10.10.228.8 +add test 10.10.228.80 +add test 10.10.228.81 +add test 10.10.228.82 +add test 10.10.228.83 +add test 10.10.228.84 +add test 10.10.228.85 +add test 10.10.228.86 +add test 10.10.228.87 +add test 10.10.228.88 +add test 10.10.228.89 +add test 10.10.228.9 +add test 10.10.228.90 +add test 10.10.228.91 +add test 10.10.228.92 +add test 10.10.228.93 +add test 10.10.228.94 +add test 10.10.228.95 +add test 10.10.228.96 +add test 10.10.228.97 +add test 10.10.228.98 +add test 10.10.228.99 +add test 10.10.229.0 +add test 10.10.229.1 +add test 10.10.229.10 +add test 10.10.229.100 +add test 10.10.229.101 +add test 10.10.229.102 +add test 10.10.229.103 +add test 10.10.229.104 +add test 10.10.229.105 +add test 10.10.229.106 +add test 10.10.229.107 +add test 10.10.229.108 +add test 10.10.229.109 +add test 10.10.229.11 +add test 10.10.229.110 +add test 10.10.229.111 +add test 10.10.229.112 +add test 10.10.229.113 +add test 10.10.229.114 +add test 10.10.229.115 +add test 10.10.229.116 +add test 10.10.229.117 +add test 10.10.229.118 +add test 10.10.229.119 +add test 10.10.229.12 +add test 10.10.229.120 +add test 10.10.229.121 +add test 10.10.229.122 +add test 10.10.229.123 +add test 10.10.229.124 +add test 10.10.229.125 +add test 10.10.229.126 +add test 10.10.229.127 +add test 10.10.229.128 +add test 10.10.229.129 +add test 10.10.229.13 +add test 10.10.229.130 +add test 10.10.229.131 +add test 10.10.229.132 +add test 10.10.229.133 +add test 10.10.229.134 +add test 10.10.229.135 +add test 10.10.229.136 +add test 10.10.229.137 +add test 10.10.229.138 +add test 10.10.229.139 +add test 10.10.229.14 +add test 10.10.229.140 +add test 10.10.229.141 +add test 10.10.229.142 +add test 10.10.229.143 +add test 10.10.229.144 +add test 10.10.229.145 +add test 10.10.229.146 +add test 10.10.229.147 +add test 10.10.229.148 +add test 10.10.229.149 +add test 10.10.229.15 +add test 10.10.229.150 +add test 10.10.229.151 +add test 10.10.229.152 +add test 10.10.229.153 +add test 10.10.229.154 +add test 10.10.229.155 +add test 10.10.229.156 +add test 10.10.229.157 +add test 10.10.229.158 +add test 10.10.229.159 +add test 10.10.229.16 +add test 10.10.229.160 +add test 10.10.229.161 +add test 10.10.229.162 +add test 10.10.229.163 +add test 10.10.229.164 +add test 10.10.229.165 +add test 10.10.229.166 +add test 10.10.229.167 +add test 10.10.229.168 +add test 10.10.229.169 +add test 10.10.229.17 +add test 10.10.229.170 +add test 10.10.229.171 +add test 10.10.229.172 +add test 10.10.229.173 +add test 10.10.229.174 +add test 10.10.229.175 +add test 10.10.229.176 +add test 10.10.229.177 +add test 10.10.229.178 +add test 10.10.229.179 +add test 10.10.229.18 +add test 10.10.229.180 +add test 10.10.229.181 +add test 10.10.229.182 +add test 10.10.229.183 +add test 10.10.229.184 +add test 10.10.229.185 +add test 10.10.229.186 +add test 10.10.229.187 +add test 10.10.229.188 +add test 10.10.229.189 +add test 10.10.229.19 +add test 10.10.229.190 +add test 10.10.229.191 +add test 10.10.229.192 +add test 10.10.229.193 +add test 10.10.229.194 +add test 10.10.229.195 +add test 10.10.229.196 +add test 10.10.229.197 +add test 10.10.229.198 +add test 10.10.229.199 +add test 10.10.229.2 +add test 10.10.229.20 +add test 10.10.229.200 +add test 10.10.229.201 +add test 10.10.229.202 +add test 10.10.229.203 +add test 10.10.229.204 +add test 10.10.229.205 +add test 10.10.229.206 +add test 10.10.229.207 +add test 10.10.229.208 +add test 10.10.229.209 +add test 10.10.229.21 +add test 10.10.229.210 +add test 10.10.229.211 +add test 10.10.229.212 +add test 10.10.229.213 +add test 10.10.229.214 +add test 10.10.229.215 +add test 10.10.229.216 +add test 10.10.229.217 +add test 10.10.229.218 +add test 10.10.229.219 +add test 10.10.229.22 +add test 10.10.229.220 +add test 10.10.229.221 +add test 10.10.229.222 +add test 10.10.229.223 +add test 10.10.229.224 +add test 10.10.229.225 +add test 10.10.229.226 +add test 10.10.229.227 +add test 10.10.229.228 +add test 10.10.229.229 +add test 10.10.229.23 +add test 10.10.229.230 +add test 10.10.229.231 +add test 10.10.229.232 +add test 10.10.229.233 +add test 10.10.229.234 +add test 10.10.229.235 +add test 10.10.229.236 +add test 10.10.229.237 +add test 10.10.229.238 +add test 10.10.229.239 +add test 10.10.229.24 +add test 10.10.229.240 +add test 10.10.229.241 +add test 10.10.229.242 +add test 10.10.229.243 +add test 10.10.229.244 +add test 10.10.229.245 +add test 10.10.229.246 +add test 10.10.229.247 +add test 10.10.229.248 +add test 10.10.229.249 +add test 10.10.229.25 +add test 10.10.229.250 +add test 10.10.229.251 +add test 10.10.229.252 +add test 10.10.229.253 +add test 10.10.229.254 +add test 10.10.229.255 +add test 10.10.229.26 +add test 10.10.229.27 +add test 10.10.229.28 +add test 10.10.229.29 +add test 10.10.229.3 +add test 10.10.229.30 +add test 10.10.229.31 +add test 10.10.229.32 +add test 10.10.229.33 +add test 10.10.229.34 +add test 10.10.229.35 +add test 10.10.229.36 +add test 10.10.229.37 +add test 10.10.229.38 +add test 10.10.229.39 +add test 10.10.229.4 +add test 10.10.229.40 +add test 10.10.229.41 +add test 10.10.229.42 +add test 10.10.229.43 +add test 10.10.229.44 +add test 10.10.229.45 +add test 10.10.229.46 +add test 10.10.229.47 +add test 10.10.229.48 +add test 10.10.229.49 +add test 10.10.229.5 +add test 10.10.229.50 +add test 10.10.229.51 +add test 10.10.229.52 +add test 10.10.229.53 +add test 10.10.229.54 +add test 10.10.229.55 +add test 10.10.229.56 +add test 10.10.229.57 +add test 10.10.229.58 +add test 10.10.229.59 +add test 10.10.229.6 +add test 10.10.229.60 +add test 10.10.229.61 +add test 10.10.229.62 +add test 10.10.229.63 +add test 10.10.229.64 +add test 10.10.229.65 +add test 10.10.229.66 +add test 10.10.229.67 +add test 10.10.229.68 +add test 10.10.229.69 +add test 10.10.229.7 +add test 10.10.229.70 +add test 10.10.229.71 +add test 10.10.229.72 +add test 10.10.229.73 +add test 10.10.229.74 +add test 10.10.229.75 +add test 10.10.229.76 +add test 10.10.229.77 +add test 10.10.229.78 +add test 10.10.229.79 +add test 10.10.229.8 +add test 10.10.229.80 +add test 10.10.229.81 +add test 10.10.229.82 +add test 10.10.229.83 +add test 10.10.229.84 +add test 10.10.229.85 +add test 10.10.229.86 +add test 10.10.229.87 +add test 10.10.229.88 +add test 10.10.229.89 +add test 10.10.229.9 +add test 10.10.229.90 +add test 10.10.229.91 +add test 10.10.229.92 +add test 10.10.229.93 +add test 10.10.229.94 +add test 10.10.229.95 +add test 10.10.229.96 +add test 10.10.229.97 +add test 10.10.229.98 +add test 10.10.229.99 +add test 10.10.23.0 +add test 10.10.23.1 +add test 10.10.23.10 +add test 10.10.23.100 +add test 10.10.23.101 +add test 10.10.23.102 +add test 10.10.23.103 +add test 10.10.23.104 +add test 10.10.23.105 +add test 10.10.23.106 +add test 10.10.23.107 +add test 10.10.23.108 +add test 10.10.23.109 +add test 10.10.23.11 +add test 10.10.23.110 +add test 10.10.23.111 +add test 10.10.23.112 +add test 10.10.23.113 +add test 10.10.23.114 +add test 10.10.23.115 +add test 10.10.23.116 +add test 10.10.23.117 +add test 10.10.23.118 +add test 10.10.23.119 +add test 10.10.23.12 +add test 10.10.23.120 +add test 10.10.23.121 +add test 10.10.23.122 +add test 10.10.23.123 +add test 10.10.23.124 +add test 10.10.23.125 +add test 10.10.23.126 +add test 10.10.23.127 +add test 10.10.23.128 +add test 10.10.23.129 +add test 10.10.23.13 +add test 10.10.23.130 +add test 10.10.23.131 +add test 10.10.23.132 +add test 10.10.23.133 +add test 10.10.23.134 +add test 10.10.23.135 +add test 10.10.23.136 +add test 10.10.23.137 +add test 10.10.23.138 +add test 10.10.23.139 +add test 10.10.23.14 +add test 10.10.23.140 +add test 10.10.23.141 +add test 10.10.23.142 +add test 10.10.23.143 +add test 10.10.23.144 +add test 10.10.23.145 +add test 10.10.23.146 +add test 10.10.23.147 +add test 10.10.23.148 +add test 10.10.23.149 +add test 10.10.23.15 +add test 10.10.23.150 +add test 10.10.23.151 +add test 10.10.23.152 +add test 10.10.23.153 +add test 10.10.23.154 +add test 10.10.23.155 +add test 10.10.23.156 +add test 10.10.23.157 +add test 10.10.23.158 +add test 10.10.23.159 +add test 10.10.23.16 +add test 10.10.23.160 +add test 10.10.23.161 +add test 10.10.23.162 +add test 10.10.23.163 +add test 10.10.23.164 +add test 10.10.23.165 +add test 10.10.23.166 +add test 10.10.23.167 +add test 10.10.23.168 +add test 10.10.23.169 +add test 10.10.23.17 +add test 10.10.23.170 +add test 10.10.23.171 +add test 10.10.23.172 +add test 10.10.23.173 +add test 10.10.23.174 +add test 10.10.23.175 +add test 10.10.23.176 +add test 10.10.23.177 +add test 10.10.23.178 +add test 10.10.23.179 +add test 10.10.23.18 +add test 10.10.23.180 +add test 10.10.23.181 +add test 10.10.23.182 +add test 10.10.23.183 +add test 10.10.23.184 +add test 10.10.23.185 +add test 10.10.23.186 +add test 10.10.23.187 +add test 10.10.23.188 +add test 10.10.23.189 +add test 10.10.23.19 +add test 10.10.23.190 +add test 10.10.23.191 +add test 10.10.23.192 +add test 10.10.23.193 +add test 10.10.23.194 +add test 10.10.23.195 +add test 10.10.23.196 +add test 10.10.23.197 +add test 10.10.23.198 +add test 10.10.23.199 +add test 10.10.23.2 +add test 10.10.23.20 +add test 10.10.23.200 +add test 10.10.23.201 +add test 10.10.23.202 +add test 10.10.23.203 +add test 10.10.23.204 +add test 10.10.23.205 +add test 10.10.23.206 +add test 10.10.23.207 +add test 10.10.23.208 +add test 10.10.23.209 +add test 10.10.23.21 +add test 10.10.23.210 +add test 10.10.23.211 +add test 10.10.23.212 +add test 10.10.23.213 +add test 10.10.23.214 +add test 10.10.23.215 +add test 10.10.23.216 +add test 10.10.23.217 +add test 10.10.23.218 +add test 10.10.23.219 +add test 10.10.23.22 +add test 10.10.23.220 +add test 10.10.23.221 +add test 10.10.23.222 +add test 10.10.23.223 +add test 10.10.23.224 +add test 10.10.23.225 +add test 10.10.23.226 +add test 10.10.23.227 +add test 10.10.23.228 +add test 10.10.23.229 +add test 10.10.23.23 +add test 10.10.23.230 +add test 10.10.23.231 +add test 10.10.23.232 +add test 10.10.23.233 +add test 10.10.23.234 +add test 10.10.23.235 +add test 10.10.23.236 +add test 10.10.23.237 +add test 10.10.23.238 +add test 10.10.23.239 +add test 10.10.23.24 +add test 10.10.23.240 +add test 10.10.23.241 +add test 10.10.23.242 +add test 10.10.23.243 +add test 10.10.23.244 +add test 10.10.23.245 +add test 10.10.23.246 +add test 10.10.23.247 +add test 10.10.23.248 +add test 10.10.23.249 +add test 10.10.23.25 +add test 10.10.23.250 +add test 10.10.23.251 +add test 10.10.23.252 +add test 10.10.23.253 +add test 10.10.23.254 +add test 10.10.23.255 +add test 10.10.23.26 +add test 10.10.23.27 +add test 10.10.23.28 +add test 10.10.23.29 +add test 10.10.23.3 +add test 10.10.23.30 +add test 10.10.23.31 +add test 10.10.23.32 +add test 10.10.23.33 +add test 10.10.23.34 +add test 10.10.23.35 +add test 10.10.23.36 +add test 10.10.23.37 +add test 10.10.23.38 +add test 10.10.23.39 +add test 10.10.23.4 +add test 10.10.23.40 +add test 10.10.23.41 +add test 10.10.23.42 +add test 10.10.23.43 +add test 10.10.23.44 +add test 10.10.23.45 +add test 10.10.23.46 +add test 10.10.23.47 +add test 10.10.23.48 +add test 10.10.23.49 +add test 10.10.23.5 +add test 10.10.23.50 +add test 10.10.23.51 +add test 10.10.23.52 +add test 10.10.23.53 +add test 10.10.23.54 +add test 10.10.23.55 +add test 10.10.23.56 +add test 10.10.23.57 +add test 10.10.23.58 +add test 10.10.23.59 +add test 10.10.23.6 +add test 10.10.23.60 +add test 10.10.23.61 +add test 10.10.23.62 +add test 10.10.23.63 +add test 10.10.23.64 +add test 10.10.23.65 +add test 10.10.23.66 +add test 10.10.23.67 +add test 10.10.23.68 +add test 10.10.23.69 +add test 10.10.23.7 +add test 10.10.23.70 +add test 10.10.23.71 +add test 10.10.23.72 +add test 10.10.23.73 +add test 10.10.23.74 +add test 10.10.23.75 +add test 10.10.23.76 +add test 10.10.23.77 +add test 10.10.23.78 +add test 10.10.23.79 +add test 10.10.23.8 +add test 10.10.23.80 +add test 10.10.23.81 +add test 10.10.23.82 +add test 10.10.23.83 +add test 10.10.23.84 +add test 10.10.23.85 +add test 10.10.23.86 +add test 10.10.23.87 +add test 10.10.23.88 +add test 10.10.23.89 +add test 10.10.23.9 +add test 10.10.23.90 +add test 10.10.23.91 +add test 10.10.23.92 +add test 10.10.23.93 +add test 10.10.23.94 +add test 10.10.23.95 +add test 10.10.23.96 +add test 10.10.23.97 +add test 10.10.23.98 +add test 10.10.23.99 +add test 10.10.230.0 +add test 10.10.230.1 +add test 10.10.230.10 +add test 10.10.230.100 +add test 10.10.230.101 +add test 10.10.230.102 +add test 10.10.230.103 +add test 10.10.230.104 +add test 10.10.230.105 +add test 10.10.230.106 +add test 10.10.230.107 +add test 10.10.230.108 +add test 10.10.230.109 +add test 10.10.230.11 +add test 10.10.230.110 +add test 10.10.230.111 +add test 10.10.230.112 +add test 10.10.230.113 +add test 10.10.230.114 +add test 10.10.230.115 +add test 10.10.230.116 +add test 10.10.230.117 +add test 10.10.230.118 +add test 10.10.230.119 +add test 10.10.230.12 +add test 10.10.230.120 +add test 10.10.230.121 +add test 10.10.230.122 +add test 10.10.230.123 +add test 10.10.230.124 +add test 10.10.230.125 +add test 10.10.230.126 +add test 10.10.230.127 +add test 10.10.230.128 +add test 10.10.230.129 +add test 10.10.230.13 +add test 10.10.230.130 +add test 10.10.230.131 +add test 10.10.230.132 +add test 10.10.230.133 +add test 10.10.230.134 +add test 10.10.230.135 +add test 10.10.230.136 +add test 10.10.230.137 +add test 10.10.230.138 +add test 10.10.230.139 +add test 10.10.230.14 +add test 10.10.230.140 +add test 10.10.230.141 +add test 10.10.230.142 +add test 10.10.230.143 +add test 10.10.230.144 +add test 10.10.230.145 +add test 10.10.230.146 +add test 10.10.230.147 +add test 10.10.230.148 +add test 10.10.230.149 +add test 10.10.230.15 +add test 10.10.230.150 +add test 10.10.230.151 +add test 10.10.230.152 +add test 10.10.230.153 +add test 10.10.230.154 +add test 10.10.230.155 +add test 10.10.230.156 +add test 10.10.230.157 +add test 10.10.230.158 +add test 10.10.230.159 +add test 10.10.230.16 +add test 10.10.230.160 +add test 10.10.230.161 +add test 10.10.230.162 +add test 10.10.230.163 +add test 10.10.230.164 +add test 10.10.230.165 +add test 10.10.230.166 +add test 10.10.230.167 +add test 10.10.230.168 +add test 10.10.230.169 +add test 10.10.230.17 +add test 10.10.230.170 +add test 10.10.230.171 +add test 10.10.230.172 +add test 10.10.230.173 +add test 10.10.230.174 +add test 10.10.230.175 +add test 10.10.230.176 +add test 10.10.230.177 +add test 10.10.230.178 +add test 10.10.230.179 +add test 10.10.230.18 +add test 10.10.230.180 +add test 10.10.230.181 +add test 10.10.230.182 +add test 10.10.230.183 +add test 10.10.230.184 +add test 10.10.230.185 +add test 10.10.230.186 +add test 10.10.230.187 +add test 10.10.230.188 +add test 10.10.230.189 +add test 10.10.230.19 +add test 10.10.230.190 +add test 10.10.230.191 +add test 10.10.230.192 +add test 10.10.230.193 +add test 10.10.230.194 +add test 10.10.230.195 +add test 10.10.230.196 +add test 10.10.230.197 +add test 10.10.230.198 +add test 10.10.230.199 +add test 10.10.230.2 +add test 10.10.230.20 +add test 10.10.230.200 +add test 10.10.230.201 +add test 10.10.230.202 +add test 10.10.230.203 +add test 10.10.230.204 +add test 10.10.230.205 +add test 10.10.230.206 +add test 10.10.230.207 +add test 10.10.230.208 +add test 10.10.230.209 +add test 10.10.230.21 +add test 10.10.230.210 +add test 10.10.230.211 +add test 10.10.230.212 +add test 10.10.230.213 +add test 10.10.230.214 +add test 10.10.230.215 +add test 10.10.230.216 +add test 10.10.230.217 +add test 10.10.230.218 +add test 10.10.230.219 +add test 10.10.230.22 +add test 10.10.230.220 +add test 10.10.230.221 +add test 10.10.230.222 +add test 10.10.230.223 +add test 10.10.230.224 +add test 10.10.230.225 +add test 10.10.230.226 +add test 10.10.230.227 +add test 10.10.230.228 +add test 10.10.230.229 +add test 10.10.230.23 +add test 10.10.230.230 +add test 10.10.230.231 +add test 10.10.230.232 +add test 10.10.230.233 +add test 10.10.230.234 +add test 10.10.230.235 +add test 10.10.230.236 +add test 10.10.230.237 +add test 10.10.230.238 +add test 10.10.230.239 +add test 10.10.230.24 +add test 10.10.230.240 +add test 10.10.230.241 +add test 10.10.230.242 +add test 10.10.230.243 +add test 10.10.230.244 +add test 10.10.230.245 +add test 10.10.230.246 +add test 10.10.230.247 +add test 10.10.230.248 +add test 10.10.230.249 +add test 10.10.230.25 +add test 10.10.230.250 +add test 10.10.230.251 +add test 10.10.230.252 +add test 10.10.230.253 +add test 10.10.230.254 +add test 10.10.230.255 +add test 10.10.230.26 +add test 10.10.230.27 +add test 10.10.230.28 +add test 10.10.230.29 +add test 10.10.230.3 +add test 10.10.230.30 +add test 10.10.230.31 +add test 10.10.230.32 +add test 10.10.230.33 +add test 10.10.230.34 +add test 10.10.230.35 +add test 10.10.230.36 +add test 10.10.230.37 +add test 10.10.230.38 +add test 10.10.230.39 +add test 10.10.230.4 +add test 10.10.230.40 +add test 10.10.230.41 +add test 10.10.230.42 +add test 10.10.230.43 +add test 10.10.230.44 +add test 10.10.230.45 +add test 10.10.230.46 +add test 10.10.230.47 +add test 10.10.230.48 +add test 10.10.230.49 +add test 10.10.230.5 +add test 10.10.230.50 +add test 10.10.230.51 +add test 10.10.230.52 +add test 10.10.230.53 +add test 10.10.230.54 +add test 10.10.230.55 +add test 10.10.230.56 +add test 10.10.230.57 +add test 10.10.230.58 +add test 10.10.230.59 +add test 10.10.230.6 +add test 10.10.230.60 +add test 10.10.230.61 +add test 10.10.230.62 +add test 10.10.230.63 +add test 10.10.230.64 +add test 10.10.230.65 +add test 10.10.230.66 +add test 10.10.230.67 +add test 10.10.230.68 +add test 10.10.230.69 +add test 10.10.230.7 +add test 10.10.230.70 +add test 10.10.230.71 +add test 10.10.230.72 +add test 10.10.230.73 +add test 10.10.230.74 +add test 10.10.230.75 +add test 10.10.230.76 +add test 10.10.230.77 +add test 10.10.230.78 +add test 10.10.230.79 +add test 10.10.230.8 +add test 10.10.230.80 +add test 10.10.230.81 +add test 10.10.230.82 +add test 10.10.230.83 +add test 10.10.230.84 +add test 10.10.230.85 +add test 10.10.230.86 +add test 10.10.230.87 +add test 10.10.230.88 +add test 10.10.230.89 +add test 10.10.230.9 +add test 10.10.230.90 +add test 10.10.230.91 +add test 10.10.230.92 +add test 10.10.230.93 +add test 10.10.230.94 +add test 10.10.230.95 +add test 10.10.230.96 +add test 10.10.230.97 +add test 10.10.230.98 +add test 10.10.230.99 +add test 10.10.231.0 +add test 10.10.231.1 +add test 10.10.231.10 +add test 10.10.231.100 +add test 10.10.231.101 +add test 10.10.231.102 +add test 10.10.231.103 +add test 10.10.231.104 +add test 10.10.231.105 +add test 10.10.231.106 +add test 10.10.231.107 +add test 10.10.231.108 +add test 10.10.231.109 +add test 10.10.231.11 +add test 10.10.231.110 +add test 10.10.231.111 +add test 10.10.231.112 +add test 10.10.231.113 +add test 10.10.231.114 +add test 10.10.231.115 +add test 10.10.231.116 +add test 10.10.231.117 +add test 10.10.231.118 +add test 10.10.231.119 +add test 10.10.231.12 +add test 10.10.231.120 +add test 10.10.231.121 +add test 10.10.231.122 +add test 10.10.231.123 +add test 10.10.231.124 +add test 10.10.231.125 +add test 10.10.231.126 +add test 10.10.231.127 +add test 10.10.231.128 +add test 10.10.231.129 +add test 10.10.231.13 +add test 10.10.231.130 +add test 10.10.231.131 +add test 10.10.231.132 +add test 10.10.231.133 +add test 10.10.231.134 +add test 10.10.231.135 +add test 10.10.231.136 +add test 10.10.231.137 +add test 10.10.231.138 +add test 10.10.231.139 +add test 10.10.231.14 +add test 10.10.231.140 +add test 10.10.231.141 +add test 10.10.231.142 +add test 10.10.231.143 +add test 10.10.231.144 +add test 10.10.231.145 +add test 10.10.231.146 +add test 10.10.231.147 +add test 10.10.231.148 +add test 10.10.231.149 +add test 10.10.231.15 +add test 10.10.231.150 +add test 10.10.231.151 +add test 10.10.231.152 +add test 10.10.231.153 +add test 10.10.231.154 +add test 10.10.231.155 +add test 10.10.231.156 +add test 10.10.231.157 +add test 10.10.231.158 +add test 10.10.231.159 +add test 10.10.231.16 +add test 10.10.231.160 +add test 10.10.231.161 +add test 10.10.231.162 +add test 10.10.231.163 +add test 10.10.231.164 +add test 10.10.231.165 +add test 10.10.231.166 +add test 10.10.231.167 +add test 10.10.231.168 +add test 10.10.231.169 +add test 10.10.231.17 +add test 10.10.231.170 +add test 10.10.231.171 +add test 10.10.231.172 +add test 10.10.231.173 +add test 10.10.231.174 +add test 10.10.231.175 +add test 10.10.231.176 +add test 10.10.231.177 +add test 10.10.231.178 +add test 10.10.231.179 +add test 10.10.231.18 +add test 10.10.231.180 +add test 10.10.231.181 +add test 10.10.231.182 +add test 10.10.231.183 +add test 10.10.231.184 +add test 10.10.231.185 +add test 10.10.231.186 +add test 10.10.231.187 +add test 10.10.231.188 +add test 10.10.231.189 +add test 10.10.231.19 +add test 10.10.231.190 +add test 10.10.231.191 +add test 10.10.231.192 +add test 10.10.231.193 +add test 10.10.231.194 +add test 10.10.231.195 +add test 10.10.231.196 +add test 10.10.231.197 +add test 10.10.231.198 +add test 10.10.231.199 +add test 10.10.231.2 +add test 10.10.231.20 +add test 10.10.231.200 +add test 10.10.231.201 +add test 10.10.231.202 +add test 10.10.231.203 +add test 10.10.231.204 +add test 10.10.231.205 +add test 10.10.231.206 +add test 10.10.231.207 +add test 10.10.231.208 +add test 10.10.231.209 +add test 10.10.231.21 +add test 10.10.231.210 +add test 10.10.231.211 +add test 10.10.231.212 +add test 10.10.231.213 +add test 10.10.231.214 +add test 10.10.231.215 +add test 10.10.231.216 +add test 10.10.231.217 +add test 10.10.231.218 +add test 10.10.231.219 +add test 10.10.231.22 +add test 10.10.231.220 +add test 10.10.231.221 +add test 10.10.231.222 +add test 10.10.231.223 +add test 10.10.231.224 +add test 10.10.231.225 +add test 10.10.231.226 +add test 10.10.231.227 +add test 10.10.231.228 +add test 10.10.231.229 +add test 10.10.231.23 +add test 10.10.231.230 +add test 10.10.231.231 +add test 10.10.231.232 +add test 10.10.231.233 +add test 10.10.231.234 +add test 10.10.231.235 +add test 10.10.231.236 +add test 10.10.231.237 +add test 10.10.231.238 +add test 10.10.231.239 +add test 10.10.231.24 +add test 10.10.231.240 +add test 10.10.231.241 +add test 10.10.231.242 +add test 10.10.231.243 +add test 10.10.231.244 +add test 10.10.231.245 +add test 10.10.231.246 +add test 10.10.231.247 +add test 10.10.231.248 +add test 10.10.231.249 +add test 10.10.231.25 +add test 10.10.231.250 +add test 10.10.231.251 +add test 10.10.231.252 +add test 10.10.231.253 +add test 10.10.231.254 +add test 10.10.231.255 +add test 10.10.231.26 +add test 10.10.231.27 +add test 10.10.231.28 +add test 10.10.231.29 +add test 10.10.231.3 +add test 10.10.231.30 +add test 10.10.231.31 +add test 10.10.231.32 +add test 10.10.231.33 +add test 10.10.231.34 +add test 10.10.231.35 +add test 10.10.231.36 +add test 10.10.231.37 +add test 10.10.231.38 +add test 10.10.231.39 +add test 10.10.231.4 +add test 10.10.231.40 +add test 10.10.231.41 +add test 10.10.231.42 +add test 10.10.231.43 +add test 10.10.231.44 +add test 10.10.231.45 +add test 10.10.231.46 +add test 10.10.231.47 +add test 10.10.231.48 +add test 10.10.231.49 +add test 10.10.231.5 +add test 10.10.231.50 +add test 10.10.231.51 +add test 10.10.231.52 +add test 10.10.231.53 +add test 10.10.231.54 +add test 10.10.231.55 +add test 10.10.231.56 +add test 10.10.231.57 +add test 10.10.231.58 +add test 10.10.231.59 +add test 10.10.231.6 +add test 10.10.231.60 +add test 10.10.231.61 +add test 10.10.231.62 +add test 10.10.231.63 +add test 10.10.231.64 +add test 10.10.231.65 +add test 10.10.231.66 +add test 10.10.231.67 +add test 10.10.231.68 +add test 10.10.231.69 +add test 10.10.231.7 +add test 10.10.231.70 +add test 10.10.231.71 +add test 10.10.231.72 +add test 10.10.231.73 +add test 10.10.231.74 +add test 10.10.231.75 +add test 10.10.231.76 +add test 10.10.231.77 +add test 10.10.231.78 +add test 10.10.231.79 +add test 10.10.231.8 +add test 10.10.231.80 +add test 10.10.231.81 +add test 10.10.231.82 +add test 10.10.231.83 +add test 10.10.231.84 +add test 10.10.231.85 +add test 10.10.231.86 +add test 10.10.231.87 +add test 10.10.231.88 +add test 10.10.231.89 +add test 10.10.231.9 +add test 10.10.231.90 +add test 10.10.231.91 +add test 10.10.231.92 +add test 10.10.231.93 +add test 10.10.231.94 +add test 10.10.231.95 +add test 10.10.231.96 +add test 10.10.231.97 +add test 10.10.231.98 +add test 10.10.231.99 +add test 10.10.232.0 +add test 10.10.232.1 +add test 10.10.232.10 +add test 10.10.232.100 +add test 10.10.232.101 +add test 10.10.232.102 +add test 10.10.232.103 +add test 10.10.232.104 +add test 10.10.232.105 +add test 10.10.232.106 +add test 10.10.232.107 +add test 10.10.232.108 +add test 10.10.232.109 +add test 10.10.232.11 +add test 10.10.232.110 +add test 10.10.232.111 +add test 10.10.232.112 +add test 10.10.232.113 +add test 10.10.232.114 +add test 10.10.232.115 +add test 10.10.232.116 +add test 10.10.232.117 +add test 10.10.232.118 +add test 10.10.232.119 +add test 10.10.232.12 +add test 10.10.232.120 +add test 10.10.232.121 +add test 10.10.232.122 +add test 10.10.232.123 +add test 10.10.232.124 +add test 10.10.232.125 +add test 10.10.232.126 +add test 10.10.232.127 +add test 10.10.232.128 +add test 10.10.232.129 +add test 10.10.232.13 +add test 10.10.232.130 +add test 10.10.232.131 +add test 10.10.232.132 +add test 10.10.232.133 +add test 10.10.232.134 +add test 10.10.232.135 +add test 10.10.232.136 +add test 10.10.232.137 +add test 10.10.232.138 +add test 10.10.232.139 +add test 10.10.232.14 +add test 10.10.232.140 +add test 10.10.232.141 +add test 10.10.232.142 +add test 10.10.232.143 +add test 10.10.232.144 +add test 10.10.232.145 +add test 10.10.232.146 +add test 10.10.232.147 +add test 10.10.232.148 +add test 10.10.232.149 +add test 10.10.232.15 +add test 10.10.232.150 +add test 10.10.232.151 +add test 10.10.232.152 +add test 10.10.232.153 +add test 10.10.232.154 +add test 10.10.232.155 +add test 10.10.232.156 +add test 10.10.232.157 +add test 10.10.232.158 +add test 10.10.232.159 +add test 10.10.232.16 +add test 10.10.232.160 +add test 10.10.232.161 +add test 10.10.232.162 +add test 10.10.232.163 +add test 10.10.232.164 +add test 10.10.232.165 +add test 10.10.232.166 +add test 10.10.232.167 +add test 10.10.232.168 +add test 10.10.232.169 +add test 10.10.232.17 +add test 10.10.232.170 +add test 10.10.232.171 +add test 10.10.232.172 +add test 10.10.232.173 +add test 10.10.232.174 +add test 10.10.232.175 +add test 10.10.232.176 +add test 10.10.232.177 +add test 10.10.232.178 +add test 10.10.232.179 +add test 10.10.232.18 +add test 10.10.232.180 +add test 10.10.232.181 +add test 10.10.232.182 +add test 10.10.232.183 +add test 10.10.232.184 +add test 10.10.232.185 +add test 10.10.232.186 +add test 10.10.232.187 +add test 10.10.232.188 +add test 10.10.232.189 +add test 10.10.232.19 +add test 10.10.232.190 +add test 10.10.232.191 +add test 10.10.232.192 +add test 10.10.232.193 +add test 10.10.232.194 +add test 10.10.232.195 +add test 10.10.232.196 +add test 10.10.232.197 +add test 10.10.232.198 +add test 10.10.232.199 +add test 10.10.232.2 +add test 10.10.232.20 +add test 10.10.232.200 +add test 10.10.232.201 +add test 10.10.232.202 +add test 10.10.232.203 +add test 10.10.232.204 +add test 10.10.232.205 +add test 10.10.232.206 +add test 10.10.232.207 +add test 10.10.232.208 +add test 10.10.232.209 +add test 10.10.232.21 +add test 10.10.232.210 +add test 10.10.232.211 +add test 10.10.232.212 +add test 10.10.232.213 +add test 10.10.232.214 +add test 10.10.232.215 +add test 10.10.232.216 +add test 10.10.232.217 +add test 10.10.232.218 +add test 10.10.232.219 +add test 10.10.232.22 +add test 10.10.232.220 +add test 10.10.232.221 +add test 10.10.232.222 +add test 10.10.232.223 +add test 10.10.232.224 +add test 10.10.232.225 +add test 10.10.232.226 +add test 10.10.232.227 +add test 10.10.232.228 +add test 10.10.232.229 +add test 10.10.232.23 +add test 10.10.232.230 +add test 10.10.232.231 +add test 10.10.232.232 +add test 10.10.232.233 +add test 10.10.232.234 +add test 10.10.232.235 +add test 10.10.232.236 +add test 10.10.232.237 +add test 10.10.232.238 +add test 10.10.232.239 +add test 10.10.232.24 +add test 10.10.232.240 +add test 10.10.232.241 +add test 10.10.232.242 +add test 10.10.232.243 +add test 10.10.232.244 +add test 10.10.232.245 +add test 10.10.232.246 +add test 10.10.232.247 +add test 10.10.232.248 +add test 10.10.232.249 +add test 10.10.232.25 +add test 10.10.232.250 +add test 10.10.232.251 +add test 10.10.232.252 +add test 10.10.232.253 +add test 10.10.232.254 +add test 10.10.232.255 +add test 10.10.232.26 +add test 10.10.232.27 +add test 10.10.232.28 +add test 10.10.232.29 +add test 10.10.232.3 +add test 10.10.232.30 +add test 10.10.232.31 +add test 10.10.232.32 +add test 10.10.232.33 +add test 10.10.232.34 +add test 10.10.232.35 +add test 10.10.232.36 +add test 10.10.232.37 +add test 10.10.232.38 +add test 10.10.232.39 +add test 10.10.232.4 +add test 10.10.232.40 +add test 10.10.232.41 +add test 10.10.232.42 +add test 10.10.232.43 +add test 10.10.232.44 +add test 10.10.232.45 +add test 10.10.232.46 +add test 10.10.232.47 +add test 10.10.232.48 +add test 10.10.232.49 +add test 10.10.232.5 +add test 10.10.232.50 +add test 10.10.232.51 +add test 10.10.232.52 +add test 10.10.232.53 +add test 10.10.232.54 +add test 10.10.232.55 +add test 10.10.232.56 +add test 10.10.232.57 +add test 10.10.232.58 +add test 10.10.232.59 +add test 10.10.232.6 +add test 10.10.232.60 +add test 10.10.232.61 +add test 10.10.232.62 +add test 10.10.232.63 +add test 10.10.232.64 +add test 10.10.232.65 +add test 10.10.232.66 +add test 10.10.232.67 +add test 10.10.232.68 +add test 10.10.232.69 +add test 10.10.232.7 +add test 10.10.232.70 +add test 10.10.232.71 +add test 10.10.232.72 +add test 10.10.232.73 +add test 10.10.232.74 +add test 10.10.232.75 +add test 10.10.232.76 +add test 10.10.232.77 +add test 10.10.232.78 +add test 10.10.232.79 +add test 10.10.232.8 +add test 10.10.232.80 +add test 10.10.232.81 +add test 10.10.232.82 +add test 10.10.232.83 +add test 10.10.232.84 +add test 10.10.232.85 +add test 10.10.232.86 +add test 10.10.232.87 +add test 10.10.232.88 +add test 10.10.232.89 +add test 10.10.232.9 +add test 10.10.232.90 +add test 10.10.232.91 +add test 10.10.232.92 +add test 10.10.232.93 +add test 10.10.232.94 +add test 10.10.232.95 +add test 10.10.232.96 +add test 10.10.232.97 +add test 10.10.232.98 +add test 10.10.232.99 +add test 10.10.233.0 +add test 10.10.233.1 +add test 10.10.233.10 +add test 10.10.233.100 +add test 10.10.233.101 +add test 10.10.233.102 +add test 10.10.233.103 +add test 10.10.233.104 +add test 10.10.233.105 +add test 10.10.233.106 +add test 10.10.233.107 +add test 10.10.233.108 +add test 10.10.233.109 +add test 10.10.233.11 +add test 10.10.233.110 +add test 10.10.233.111 +add test 10.10.233.112 +add test 10.10.233.113 +add test 10.10.233.114 +add test 10.10.233.115 +add test 10.10.233.116 +add test 10.10.233.117 +add test 10.10.233.118 +add test 10.10.233.119 +add test 10.10.233.12 +add test 10.10.233.120 +add test 10.10.233.121 +add test 10.10.233.122 +add test 10.10.233.123 +add test 10.10.233.124 +add test 10.10.233.125 +add test 10.10.233.126 +add test 10.10.233.127 +add test 10.10.233.128 +add test 10.10.233.129 +add test 10.10.233.13 +add test 10.10.233.130 +add test 10.10.233.131 +add test 10.10.233.132 +add test 10.10.233.133 +add test 10.10.233.134 +add test 10.10.233.135 +add test 10.10.233.136 +add test 10.10.233.137 +add test 10.10.233.138 +add test 10.10.233.139 +add test 10.10.233.14 +add test 10.10.233.140 +add test 10.10.233.141 +add test 10.10.233.142 +add test 10.10.233.143 +add test 10.10.233.144 +add test 10.10.233.145 +add test 10.10.233.146 +add test 10.10.233.147 +add test 10.10.233.148 +add test 10.10.233.149 +add test 10.10.233.15 +add test 10.10.233.150 +add test 10.10.233.151 +add test 10.10.233.152 +add test 10.10.233.153 +add test 10.10.233.154 +add test 10.10.233.155 +add test 10.10.233.156 +add test 10.10.233.157 +add test 10.10.233.158 +add test 10.10.233.159 +add test 10.10.233.16 +add test 10.10.233.160 +add test 10.10.233.161 +add test 10.10.233.162 +add test 10.10.233.163 +add test 10.10.233.164 +add test 10.10.233.165 +add test 10.10.233.166 +add test 10.10.233.167 +add test 10.10.233.168 +add test 10.10.233.169 +add test 10.10.233.17 +add test 10.10.233.170 +add test 10.10.233.171 +add test 10.10.233.172 +add test 10.10.233.173 +add test 10.10.233.174 +add test 10.10.233.175 +add test 10.10.233.176 +add test 10.10.233.177 +add test 10.10.233.178 +add test 10.10.233.179 +add test 10.10.233.18 +add test 10.10.233.180 +add test 10.10.233.181 +add test 10.10.233.182 +add test 10.10.233.183 +add test 10.10.233.184 +add test 10.10.233.185 +add test 10.10.233.186 +add test 10.10.233.187 +add test 10.10.233.188 +add test 10.10.233.189 +add test 10.10.233.19 +add test 10.10.233.190 +add test 10.10.233.191 +add test 10.10.233.192 +add test 10.10.233.193 +add test 10.10.233.194 +add test 10.10.233.195 +add test 10.10.233.196 +add test 10.10.233.197 +add test 10.10.233.198 +add test 10.10.233.199 +add test 10.10.233.2 +add test 10.10.233.20 +add test 10.10.233.200 +add test 10.10.233.201 +add test 10.10.233.202 +add test 10.10.233.203 +add test 10.10.233.204 +add test 10.10.233.205 +add test 10.10.233.206 +add test 10.10.233.207 +add test 10.10.233.208 +add test 10.10.233.209 +add test 10.10.233.21 +add test 10.10.233.210 +add test 10.10.233.211 +add test 10.10.233.212 +add test 10.10.233.213 +add test 10.10.233.214 +add test 10.10.233.215 +add test 10.10.233.216 +add test 10.10.233.217 +add test 10.10.233.218 +add test 10.10.233.219 +add test 10.10.233.22 +add test 10.10.233.220 +add test 10.10.233.221 +add test 10.10.233.222 +add test 10.10.233.223 +add test 10.10.233.224 +add test 10.10.233.225 +add test 10.10.233.226 +add test 10.10.233.227 +add test 10.10.233.228 +add test 10.10.233.229 +add test 10.10.233.23 +add test 10.10.233.230 +add test 10.10.233.231 +add test 10.10.233.232 +add test 10.10.233.233 +add test 10.10.233.234 +add test 10.10.233.235 +add test 10.10.233.236 +add test 10.10.233.237 +add test 10.10.233.238 +add test 10.10.233.239 +add test 10.10.233.24 +add test 10.10.233.240 +add test 10.10.233.241 +add test 10.10.233.242 +add test 10.10.233.243 +add test 10.10.233.244 +add test 10.10.233.245 +add test 10.10.233.246 +add test 10.10.233.247 +add test 10.10.233.248 +add test 10.10.233.249 +add test 10.10.233.25 +add test 10.10.233.250 +add test 10.10.233.251 +add test 10.10.233.252 +add test 10.10.233.253 +add test 10.10.233.254 +add test 10.10.233.255 +add test 10.10.233.26 +add test 10.10.233.27 +add test 10.10.233.28 +add test 10.10.233.29 +add test 10.10.233.3 +add test 10.10.233.30 +add test 10.10.233.31 +add test 10.10.233.32 +add test 10.10.233.33 +add test 10.10.233.34 +add test 10.10.233.35 +add test 10.10.233.36 +add test 10.10.233.37 +add test 10.10.233.38 +add test 10.10.233.39 +add test 10.10.233.4 +add test 10.10.233.40 +add test 10.10.233.41 +add test 10.10.233.42 +add test 10.10.233.43 +add test 10.10.233.44 +add test 10.10.233.45 +add test 10.10.233.46 +add test 10.10.233.47 +add test 10.10.233.48 +add test 10.10.233.49 +add test 10.10.233.5 +add test 10.10.233.50 +add test 10.10.233.51 +add test 10.10.233.52 +add test 10.10.233.53 +add test 10.10.233.54 +add test 10.10.233.55 +add test 10.10.233.56 +add test 10.10.233.57 +add test 10.10.233.58 +add test 10.10.233.59 +add test 10.10.233.6 +add test 10.10.233.60 +add test 10.10.233.61 +add test 10.10.233.62 +add test 10.10.233.63 +add test 10.10.233.64 +add test 10.10.233.65 +add test 10.10.233.66 +add test 10.10.233.67 +add test 10.10.233.68 +add test 10.10.233.69 +add test 10.10.233.7 +add test 10.10.233.70 +add test 10.10.233.71 +add test 10.10.233.72 +add test 10.10.233.73 +add test 10.10.233.74 +add test 10.10.233.75 +add test 10.10.233.76 +add test 10.10.233.77 +add test 10.10.233.78 +add test 10.10.233.79 +add test 10.10.233.8 +add test 10.10.233.80 +add test 10.10.233.81 +add test 10.10.233.82 +add test 10.10.233.83 +add test 10.10.233.84 +add test 10.10.233.85 +add test 10.10.233.86 +add test 10.10.233.87 +add test 10.10.233.88 +add test 10.10.233.89 +add test 10.10.233.9 +add test 10.10.233.90 +add test 10.10.233.91 +add test 10.10.233.92 +add test 10.10.233.93 +add test 10.10.233.94 +add test 10.10.233.95 +add test 10.10.233.96 +add test 10.10.233.97 +add test 10.10.233.98 +add test 10.10.233.99 +add test 10.10.234.0 +add test 10.10.234.1 +add test 10.10.234.10 +add test 10.10.234.100 +add test 10.10.234.101 +add test 10.10.234.102 +add test 10.10.234.103 +add test 10.10.234.104 +add test 10.10.234.105 +add test 10.10.234.106 +add test 10.10.234.107 +add test 10.10.234.108 +add test 10.10.234.109 +add test 10.10.234.11 +add test 10.10.234.110 +add test 10.10.234.111 +add test 10.10.234.112 +add test 10.10.234.113 +add test 10.10.234.114 +add test 10.10.234.115 +add test 10.10.234.116 +add test 10.10.234.117 +add test 10.10.234.118 +add test 10.10.234.119 +add test 10.10.234.12 +add test 10.10.234.120 +add test 10.10.234.121 +add test 10.10.234.122 +add test 10.10.234.123 +add test 10.10.234.124 +add test 10.10.234.125 +add test 10.10.234.126 +add test 10.10.234.127 +add test 10.10.234.128 +add test 10.10.234.129 +add test 10.10.234.13 +add test 10.10.234.130 +add test 10.10.234.131 +add test 10.10.234.132 +add test 10.10.234.133 +add test 10.10.234.134 +add test 10.10.234.135 +add test 10.10.234.136 +add test 10.10.234.137 +add test 10.10.234.138 +add test 10.10.234.139 +add test 10.10.234.14 +add test 10.10.234.140 +add test 10.10.234.141 +add test 10.10.234.142 +add test 10.10.234.143 +add test 10.10.234.144 +add test 10.10.234.145 +add test 10.10.234.146 +add test 10.10.234.147 +add test 10.10.234.148 +add test 10.10.234.149 +add test 10.10.234.15 +add test 10.10.234.150 +add test 10.10.234.151 +add test 10.10.234.152 +add test 10.10.234.153 +add test 10.10.234.154 +add test 10.10.234.155 +add test 10.10.234.156 +add test 10.10.234.157 +add test 10.10.234.158 +add test 10.10.234.159 +add test 10.10.234.16 +add test 10.10.234.160 +add test 10.10.234.161 +add test 10.10.234.162 +add test 10.10.234.163 +add test 10.10.234.164 +add test 10.10.234.165 +add test 10.10.234.166 +add test 10.10.234.167 +add test 10.10.234.168 +add test 10.10.234.169 +add test 10.10.234.17 +add test 10.10.234.170 +add test 10.10.234.171 +add test 10.10.234.172 +add test 10.10.234.173 +add test 10.10.234.174 +add test 10.10.234.175 +add test 10.10.234.176 +add test 10.10.234.177 +add test 10.10.234.178 +add test 10.10.234.179 +add test 10.10.234.18 +add test 10.10.234.180 +add test 10.10.234.181 +add test 10.10.234.182 +add test 10.10.234.183 +add test 10.10.234.184 +add test 10.10.234.185 +add test 10.10.234.186 +add test 10.10.234.187 +add test 10.10.234.188 +add test 10.10.234.189 +add test 10.10.234.19 +add test 10.10.234.190 +add test 10.10.234.191 +add test 10.10.234.192 +add test 10.10.234.193 +add test 10.10.234.194 +add test 10.10.234.195 +add test 10.10.234.196 +add test 10.10.234.197 +add test 10.10.234.198 +add test 10.10.234.199 +add test 10.10.234.2 +add test 10.10.234.20 +add test 10.10.234.200 +add test 10.10.234.201 +add test 10.10.234.202 +add test 10.10.234.203 +add test 10.10.234.204 +add test 10.10.234.205 +add test 10.10.234.206 +add test 10.10.234.207 +add test 10.10.234.208 +add test 10.10.234.209 +add test 10.10.234.21 +add test 10.10.234.210 +add test 10.10.234.211 +add test 10.10.234.212 +add test 10.10.234.213 +add test 10.10.234.214 +add test 10.10.234.215 +add test 10.10.234.216 +add test 10.10.234.217 +add test 10.10.234.218 +add test 10.10.234.219 +add test 10.10.234.22 +add test 10.10.234.220 +add test 10.10.234.221 +add test 10.10.234.222 +add test 10.10.234.223 +add test 10.10.234.224 +add test 10.10.234.225 +add test 10.10.234.226 +add test 10.10.234.227 +add test 10.10.234.228 +add test 10.10.234.229 +add test 10.10.234.23 +add test 10.10.234.230 +add test 10.10.234.231 +add test 10.10.234.232 +add test 10.10.234.233 +add test 10.10.234.234 +add test 10.10.234.235 +add test 10.10.234.236 +add test 10.10.234.237 +add test 10.10.234.238 +add test 10.10.234.239 +add test 10.10.234.24 +add test 10.10.234.240 +add test 10.10.234.241 +add test 10.10.234.242 +add test 10.10.234.243 +add test 10.10.234.244 +add test 10.10.234.245 +add test 10.10.234.246 +add test 10.10.234.247 +add test 10.10.234.248 +add test 10.10.234.249 +add test 10.10.234.25 +add test 10.10.234.250 +add test 10.10.234.251 +add test 10.10.234.252 +add test 10.10.234.253 +add test 10.10.234.254 +add test 10.10.234.255 +add test 10.10.234.26 +add test 10.10.234.27 +add test 10.10.234.28 +add test 10.10.234.29 +add test 10.10.234.3 +add test 10.10.234.30 +add test 10.10.234.31 +add test 10.10.234.32 +add test 10.10.234.33 +add test 10.10.234.34 +add test 10.10.234.35 +add test 10.10.234.36 +add test 10.10.234.37 +add test 10.10.234.38 +add test 10.10.234.39 +add test 10.10.234.4 +add test 10.10.234.40 +add test 10.10.234.41 +add test 10.10.234.42 +add test 10.10.234.43 +add test 10.10.234.44 +add test 10.10.234.45 +add test 10.10.234.46 +add test 10.10.234.47 +add test 10.10.234.48 +add test 10.10.234.49 +add test 10.10.234.5 +add test 10.10.234.50 +add test 10.10.234.51 +add test 10.10.234.52 +add test 10.10.234.53 +add test 10.10.234.54 +add test 10.10.234.55 +add test 10.10.234.56 +add test 10.10.234.57 +add test 10.10.234.58 +add test 10.10.234.59 +add test 10.10.234.6 +add test 10.10.234.60 +add test 10.10.234.61 +add test 10.10.234.62 +add test 10.10.234.63 +add test 10.10.234.64 +add test 10.10.234.65 +add test 10.10.234.66 +add test 10.10.234.67 +add test 10.10.234.68 +add test 10.10.234.69 +add test 10.10.234.7 +add test 10.10.234.70 +add test 10.10.234.71 +add test 10.10.234.72 +add test 10.10.234.73 +add test 10.10.234.74 +add test 10.10.234.75 +add test 10.10.234.76 +add test 10.10.234.77 +add test 10.10.234.78 +add test 10.10.234.79 +add test 10.10.234.8 +add test 10.10.234.80 +add test 10.10.234.81 +add test 10.10.234.82 +add test 10.10.234.83 +add test 10.10.234.84 +add test 10.10.234.85 +add test 10.10.234.86 +add test 10.10.234.87 +add test 10.10.234.88 +add test 10.10.234.89 +add test 10.10.234.9 +add test 10.10.234.90 +add test 10.10.234.91 +add test 10.10.234.92 +add test 10.10.234.93 +add test 10.10.234.94 +add test 10.10.234.95 +add test 10.10.234.96 +add test 10.10.234.97 +add test 10.10.234.98 +add test 10.10.234.99 +add test 10.10.235.0 +add test 10.10.235.1 +add test 10.10.235.10 +add test 10.10.235.100 +add test 10.10.235.101 +add test 10.10.235.102 +add test 10.10.235.103 +add test 10.10.235.104 +add test 10.10.235.105 +add test 10.10.235.106 +add test 10.10.235.107 +add test 10.10.235.108 +add test 10.10.235.109 +add test 10.10.235.11 +add test 10.10.235.110 +add test 10.10.235.111 +add test 10.10.235.112 +add test 10.10.235.113 +add test 10.10.235.114 +add test 10.10.235.115 +add test 10.10.235.116 +add test 10.10.235.117 +add test 10.10.235.118 +add test 10.10.235.119 +add test 10.10.235.12 +add test 10.10.235.120 +add test 10.10.235.121 +add test 10.10.235.122 +add test 10.10.235.123 +add test 10.10.235.124 +add test 10.10.235.125 +add test 10.10.235.126 +add test 10.10.235.127 +add test 10.10.235.128 +add test 10.10.235.129 +add test 10.10.235.13 +add test 10.10.235.130 +add test 10.10.235.131 +add test 10.10.235.132 +add test 10.10.235.133 +add test 10.10.235.134 +add test 10.10.235.135 +add test 10.10.235.136 +add test 10.10.235.137 +add test 10.10.235.138 +add test 10.10.235.139 +add test 10.10.235.14 +add test 10.10.235.140 +add test 10.10.235.141 +add test 10.10.235.142 +add test 10.10.235.143 +add test 10.10.235.144 +add test 10.10.235.145 +add test 10.10.235.146 +add test 10.10.235.147 +add test 10.10.235.148 +add test 10.10.235.149 +add test 10.10.235.15 +add test 10.10.235.150 +add test 10.10.235.151 +add test 10.10.235.152 +add test 10.10.235.153 +add test 10.10.235.154 +add test 10.10.235.155 +add test 10.10.235.156 +add test 10.10.235.157 +add test 10.10.235.158 +add test 10.10.235.159 +add test 10.10.235.16 +add test 10.10.235.160 +add test 10.10.235.161 +add test 10.10.235.162 +add test 10.10.235.163 +add test 10.10.235.164 +add test 10.10.235.165 +add test 10.10.235.166 +add test 10.10.235.167 +add test 10.10.235.168 +add test 10.10.235.169 +add test 10.10.235.17 +add test 10.10.235.170 +add test 10.10.235.171 +add test 10.10.235.172 +add test 10.10.235.173 +add test 10.10.235.174 +add test 10.10.235.175 +add test 10.10.235.176 +add test 10.10.235.177 +add test 10.10.235.178 +add test 10.10.235.179 +add test 10.10.235.18 +add test 10.10.235.180 +add test 10.10.235.181 +add test 10.10.235.182 +add test 10.10.235.183 +add test 10.10.235.184 +add test 10.10.235.185 +add test 10.10.235.186 +add test 10.10.235.187 +add test 10.10.235.188 +add test 10.10.235.189 +add test 10.10.235.19 +add test 10.10.235.190 +add test 10.10.235.191 +add test 10.10.235.192 +add test 10.10.235.193 +add test 10.10.235.194 +add test 10.10.235.195 +add test 10.10.235.196 +add test 10.10.235.197 +add test 10.10.235.198 +add test 10.10.235.199 +add test 10.10.235.2 +add test 10.10.235.20 +add test 10.10.235.200 +add test 10.10.235.201 +add test 10.10.235.202 +add test 10.10.235.203 +add test 10.10.235.204 +add test 10.10.235.205 +add test 10.10.235.206 +add test 10.10.235.207 +add test 10.10.235.208 +add test 10.10.235.209 +add test 10.10.235.21 +add test 10.10.235.210 +add test 10.10.235.211 +add test 10.10.235.212 +add test 10.10.235.213 +add test 10.10.235.214 +add test 10.10.235.215 +add test 10.10.235.216 +add test 10.10.235.217 +add test 10.10.235.218 +add test 10.10.235.219 +add test 10.10.235.22 +add test 10.10.235.220 +add test 10.10.235.221 +add test 10.10.235.222 +add test 10.10.235.223 +add test 10.10.235.224 +add test 10.10.235.225 +add test 10.10.235.226 +add test 10.10.235.227 +add test 10.10.235.228 +add test 10.10.235.229 +add test 10.10.235.23 +add test 10.10.235.230 +add test 10.10.235.231 +add test 10.10.235.232 +add test 10.10.235.233 +add test 10.10.235.234 +add test 10.10.235.235 +add test 10.10.235.236 +add test 10.10.235.237 +add test 10.10.235.238 +add test 10.10.235.239 +add test 10.10.235.24 +add test 10.10.235.240 +add test 10.10.235.241 +add test 10.10.235.242 +add test 10.10.235.243 +add test 10.10.235.244 +add test 10.10.235.245 +add test 10.10.235.246 +add test 10.10.235.247 +add test 10.10.235.248 +add test 10.10.235.249 +add test 10.10.235.25 +add test 10.10.235.250 +add test 10.10.235.251 +add test 10.10.235.252 +add test 10.10.235.253 +add test 10.10.235.254 +add test 10.10.235.255 +add test 10.10.235.26 +add test 10.10.235.27 +add test 10.10.235.28 +add test 10.10.235.29 +add test 10.10.235.3 +add test 10.10.235.30 +add test 10.10.235.31 +add test 10.10.235.32 +add test 10.10.235.33 +add test 10.10.235.34 +add test 10.10.235.35 +add test 10.10.235.36 +add test 10.10.235.37 +add test 10.10.235.38 +add test 10.10.235.39 +add test 10.10.235.4 +add test 10.10.235.40 +add test 10.10.235.41 +add test 10.10.235.42 +add test 10.10.235.43 +add test 10.10.235.44 +add test 10.10.235.45 +add test 10.10.235.46 +add test 10.10.235.47 +add test 10.10.235.48 +add test 10.10.235.49 +add test 10.10.235.5 +add test 10.10.235.50 +add test 10.10.235.51 +add test 10.10.235.52 +add test 10.10.235.53 +add test 10.10.235.54 +add test 10.10.235.55 +add test 10.10.235.56 +add test 10.10.235.57 +add test 10.10.235.58 +add test 10.10.235.59 +add test 10.10.235.6 +add test 10.10.235.60 +add test 10.10.235.61 +add test 10.10.235.62 +add test 10.10.235.63 +add test 10.10.235.64 +add test 10.10.235.65 +add test 10.10.235.66 +add test 10.10.235.67 +add test 10.10.235.68 +add test 10.10.235.69 +add test 10.10.235.7 +add test 10.10.235.70 +add test 10.10.235.71 +add test 10.10.235.72 +add test 10.10.235.73 +add test 10.10.235.74 +add test 10.10.235.75 +add test 10.10.235.76 +add test 10.10.235.77 +add test 10.10.235.78 +add test 10.10.235.79 +add test 10.10.235.8 +add test 10.10.235.80 +add test 10.10.235.81 +add test 10.10.235.82 +add test 10.10.235.83 +add test 10.10.235.84 +add test 10.10.235.85 +add test 10.10.235.86 +add test 10.10.235.87 +add test 10.10.235.88 +add test 10.10.235.89 +add test 10.10.235.9 +add test 10.10.235.90 +add test 10.10.235.91 +add test 10.10.235.92 +add test 10.10.235.93 +add test 10.10.235.94 +add test 10.10.235.95 +add test 10.10.235.96 +add test 10.10.235.97 +add test 10.10.235.98 +add test 10.10.235.99 +add test 10.10.236.0 +add test 10.10.236.1 +add test 10.10.236.10 +add test 10.10.236.100 +add test 10.10.236.101 +add test 10.10.236.102 +add test 10.10.236.103 +add test 10.10.236.104 +add test 10.10.236.105 +add test 10.10.236.106 +add test 10.10.236.107 +add test 10.10.236.108 +add test 10.10.236.109 +add test 10.10.236.11 +add test 10.10.236.110 +add test 10.10.236.111 +add test 10.10.236.112 +add test 10.10.236.113 +add test 10.10.236.114 +add test 10.10.236.115 +add test 10.10.236.116 +add test 10.10.236.117 +add test 10.10.236.118 +add test 10.10.236.119 +add test 10.10.236.12 +add test 10.10.236.120 +add test 10.10.236.121 +add test 10.10.236.122 +add test 10.10.236.123 +add test 10.10.236.124 +add test 10.10.236.125 +add test 10.10.236.126 +add test 10.10.236.127 +add test 10.10.236.128 +add test 10.10.236.129 +add test 10.10.236.13 +add test 10.10.236.130 +add test 10.10.236.131 +add test 10.10.236.132 +add test 10.10.236.133 +add test 10.10.236.134 +add test 10.10.236.135 +add test 10.10.236.136 +add test 10.10.236.137 +add test 10.10.236.138 +add test 10.10.236.139 +add test 10.10.236.14 +add test 10.10.236.140 +add test 10.10.236.141 +add test 10.10.236.142 +add test 10.10.236.143 +add test 10.10.236.144 +add test 10.10.236.145 +add test 10.10.236.146 +add test 10.10.236.147 +add test 10.10.236.148 +add test 10.10.236.149 +add test 10.10.236.15 +add test 10.10.236.150 +add test 10.10.236.151 +add test 10.10.236.152 +add test 10.10.236.153 +add test 10.10.236.154 +add test 10.10.236.155 +add test 10.10.236.156 +add test 10.10.236.157 +add test 10.10.236.158 +add test 10.10.236.159 +add test 10.10.236.16 +add test 10.10.236.160 +add test 10.10.236.161 +add test 10.10.236.162 +add test 10.10.236.163 +add test 10.10.236.164 +add test 10.10.236.165 +add test 10.10.236.166 +add test 10.10.236.167 +add test 10.10.236.168 +add test 10.10.236.169 +add test 10.10.236.17 +add test 10.10.236.170 +add test 10.10.236.171 +add test 10.10.236.172 +add test 10.10.236.173 +add test 10.10.236.174 +add test 10.10.236.175 +add test 10.10.236.176 +add test 10.10.236.177 +add test 10.10.236.178 +add test 10.10.236.179 +add test 10.10.236.18 +add test 10.10.236.180 +add test 10.10.236.181 +add test 10.10.236.182 +add test 10.10.236.183 +add test 10.10.236.184 +add test 10.10.236.185 +add test 10.10.236.186 +add test 10.10.236.187 +add test 10.10.236.188 +add test 10.10.236.189 +add test 10.10.236.19 +add test 10.10.236.190 +add test 10.10.236.191 +add test 10.10.236.192 +add test 10.10.236.193 +add test 10.10.236.194 +add test 10.10.236.195 +add test 10.10.236.196 +add test 10.10.236.197 +add test 10.10.236.198 +add test 10.10.236.199 +add test 10.10.236.2 +add test 10.10.236.20 +add test 10.10.236.200 +add test 10.10.236.201 +add test 10.10.236.202 +add test 10.10.236.203 +add test 10.10.236.204 +add test 10.10.236.205 +add test 10.10.236.206 +add test 10.10.236.207 +add test 10.10.236.208 +add test 10.10.236.209 +add test 10.10.236.21 +add test 10.10.236.210 +add test 10.10.236.211 +add test 10.10.236.212 +add test 10.10.236.213 +add test 10.10.236.214 +add test 10.10.236.215 +add test 10.10.236.216 +add test 10.10.236.217 +add test 10.10.236.218 +add test 10.10.236.219 +add test 10.10.236.22 +add test 10.10.236.220 +add test 10.10.236.221 +add test 10.10.236.222 +add test 10.10.236.223 +add test 10.10.236.224 +add test 10.10.236.225 +add test 10.10.236.226 +add test 10.10.236.227 +add test 10.10.236.228 +add test 10.10.236.229 +add test 10.10.236.23 +add test 10.10.236.230 +add test 10.10.236.231 +add test 10.10.236.232 +add test 10.10.236.233 +add test 10.10.236.234 +add test 10.10.236.235 +add test 10.10.236.236 +add test 10.10.236.237 +add test 10.10.236.238 +add test 10.10.236.239 +add test 10.10.236.24 +add test 10.10.236.240 +add test 10.10.236.241 +add test 10.10.236.242 +add test 10.10.236.243 +add test 10.10.236.244 +add test 10.10.236.245 +add test 10.10.236.246 +add test 10.10.236.247 +add test 10.10.236.248 +add test 10.10.236.249 +add test 10.10.236.25 +add test 10.10.236.250 +add test 10.10.236.251 +add test 10.10.236.252 +add test 10.10.236.253 +add test 10.10.236.254 +add test 10.10.236.255 +add test 10.10.236.26 +add test 10.10.236.27 +add test 10.10.236.28 +add test 10.10.236.29 +add test 10.10.236.3 +add test 10.10.236.30 +add test 10.10.236.31 +add test 10.10.236.32 +add test 10.10.236.33 +add test 10.10.236.34 +add test 10.10.236.35 +add test 10.10.236.36 +add test 10.10.236.37 +add test 10.10.236.38 +add test 10.10.236.39 +add test 10.10.236.4 +add test 10.10.236.40 +add test 10.10.236.41 +add test 10.10.236.42 +add test 10.10.236.43 +add test 10.10.236.44 +add test 10.10.236.45 +add test 10.10.236.46 +add test 10.10.236.47 +add test 10.10.236.48 +add test 10.10.236.49 +add test 10.10.236.5 +add test 10.10.236.50 +add test 10.10.236.51 +add test 10.10.236.52 +add test 10.10.236.53 +add test 10.10.236.54 +add test 10.10.236.55 +add test 10.10.236.56 +add test 10.10.236.57 +add test 10.10.236.58 +add test 10.10.236.59 +add test 10.10.236.6 +add test 10.10.236.60 +add test 10.10.236.61 +add test 10.10.236.62 +add test 10.10.236.63 +add test 10.10.236.64 +add test 10.10.236.65 +add test 10.10.236.66 +add test 10.10.236.67 +add test 10.10.236.68 +add test 10.10.236.69 +add test 10.10.236.7 +add test 10.10.236.70 +add test 10.10.236.71 +add test 10.10.236.72 +add test 10.10.236.73 +add test 10.10.236.74 +add test 10.10.236.75 +add test 10.10.236.76 +add test 10.10.236.77 +add test 10.10.236.78 +add test 10.10.236.79 +add test 10.10.236.8 +add test 10.10.236.80 +add test 10.10.236.81 +add test 10.10.236.82 +add test 10.10.236.83 +add test 10.10.236.84 +add test 10.10.236.85 +add test 10.10.236.86 +add test 10.10.236.87 +add test 10.10.236.88 +add test 10.10.236.89 +add test 10.10.236.9 +add test 10.10.236.90 +add test 10.10.236.91 +add test 10.10.236.92 +add test 10.10.236.93 +add test 10.10.236.94 +add test 10.10.236.95 +add test 10.10.236.96 +add test 10.10.236.97 +add test 10.10.236.98 +add test 10.10.236.99 +add test 10.10.237.0 +add test 10.10.237.1 +add test 10.10.237.10 +add test 10.10.237.100 +add test 10.10.237.101 +add test 10.10.237.102 +add test 10.10.237.103 +add test 10.10.237.104 +add test 10.10.237.105 +add test 10.10.237.106 +add test 10.10.237.107 +add test 10.10.237.108 +add test 10.10.237.109 +add test 10.10.237.11 +add test 10.10.237.110 +add test 10.10.237.111 +add test 10.10.237.112 +add test 10.10.237.113 +add test 10.10.237.114 +add test 10.10.237.115 +add test 10.10.237.116 +add test 10.10.237.117 +add test 10.10.237.118 +add test 10.10.237.119 +add test 10.10.237.12 +add test 10.10.237.120 +add test 10.10.237.121 +add test 10.10.237.122 +add test 10.10.237.123 +add test 10.10.237.124 +add test 10.10.237.125 +add test 10.10.237.126 +add test 10.10.237.127 +add test 10.10.237.128 +add test 10.10.237.129 +add test 10.10.237.13 +add test 10.10.237.130 +add test 10.10.237.131 +add test 10.10.237.132 +add test 10.10.237.133 +add test 10.10.237.134 +add test 10.10.237.135 +add test 10.10.237.136 +add test 10.10.237.137 +add test 10.10.237.138 +add test 10.10.237.139 +add test 10.10.237.14 +add test 10.10.237.140 +add test 10.10.237.141 +add test 10.10.237.142 +add test 10.10.237.143 +add test 10.10.237.144 +add test 10.10.237.145 +add test 10.10.237.146 +add test 10.10.237.147 +add test 10.10.237.148 +add test 10.10.237.149 +add test 10.10.237.15 +add test 10.10.237.150 +add test 10.10.237.151 +add test 10.10.237.152 +add test 10.10.237.153 +add test 10.10.237.154 +add test 10.10.237.155 +add test 10.10.237.156 +add test 10.10.237.157 +add test 10.10.237.158 +add test 10.10.237.159 +add test 10.10.237.16 +add test 10.10.237.160 +add test 10.10.237.161 +add test 10.10.237.162 +add test 10.10.237.163 +add test 10.10.237.164 +add test 10.10.237.165 +add test 10.10.237.166 +add test 10.10.237.167 +add test 10.10.237.168 +add test 10.10.237.169 +add test 10.10.237.17 +add test 10.10.237.170 +add test 10.10.237.171 +add test 10.10.237.172 +add test 10.10.237.173 +add test 10.10.237.174 +add test 10.10.237.175 +add test 10.10.237.176 +add test 10.10.237.177 +add test 10.10.237.178 +add test 10.10.237.179 +add test 10.10.237.18 +add test 10.10.237.180 +add test 10.10.237.181 +add test 10.10.237.182 +add test 10.10.237.183 +add test 10.10.237.184 +add test 10.10.237.185 +add test 10.10.237.186 +add test 10.10.237.187 +add test 10.10.237.188 +add test 10.10.237.189 +add test 10.10.237.19 +add test 10.10.237.190 +add test 10.10.237.191 +add test 10.10.237.192 +add test 10.10.237.193 +add test 10.10.237.194 +add test 10.10.237.195 +add test 10.10.237.196 +add test 10.10.237.197 +add test 10.10.237.198 +add test 10.10.237.199 +add test 10.10.237.2 +add test 10.10.237.20 +add test 10.10.237.200 +add test 10.10.237.201 +add test 10.10.237.202 +add test 10.10.237.203 +add test 10.10.237.204 +add test 10.10.237.205 +add test 10.10.237.206 +add test 10.10.237.207 +add test 10.10.237.208 +add test 10.10.237.209 +add test 10.10.237.21 +add test 10.10.237.210 +add test 10.10.237.211 +add test 10.10.237.212 +add test 10.10.237.213 +add test 10.10.237.214 +add test 10.10.237.215 +add test 10.10.237.216 +add test 10.10.237.217 +add test 10.10.237.218 +add test 10.10.237.219 +add test 10.10.237.22 +add test 10.10.237.220 +add test 10.10.237.221 +add test 10.10.237.222 +add test 10.10.237.223 +add test 10.10.237.224 +add test 10.10.237.225 +add test 10.10.237.226 +add test 10.10.237.227 +add test 10.10.237.228 +add test 10.10.237.229 +add test 10.10.237.23 +add test 10.10.237.230 +add test 10.10.237.231 +add test 10.10.237.232 +add test 10.10.237.233 +add test 10.10.237.234 +add test 10.10.237.235 +add test 10.10.237.236 +add test 10.10.237.237 +add test 10.10.237.238 +add test 10.10.237.239 +add test 10.10.237.24 +add test 10.10.237.240 +add test 10.10.237.241 +add test 10.10.237.242 +add test 10.10.237.243 +add test 10.10.237.244 +add test 10.10.237.245 +add test 10.10.237.246 +add test 10.10.237.247 +add test 10.10.237.248 +add test 10.10.237.249 +add test 10.10.237.25 +add test 10.10.237.250 +add test 10.10.237.251 +add test 10.10.237.252 +add test 10.10.237.253 +add test 10.10.237.254 +add test 10.10.237.255 +add test 10.10.237.26 +add test 10.10.237.27 +add test 10.10.237.28 +add test 10.10.237.29 +add test 10.10.237.3 +add test 10.10.237.30 +add test 10.10.237.31 +add test 10.10.237.32 +add test 10.10.237.33 +add test 10.10.237.34 +add test 10.10.237.35 +add test 10.10.237.36 +add test 10.10.237.37 +add test 10.10.237.38 +add test 10.10.237.39 +add test 10.10.237.4 +add test 10.10.237.40 +add test 10.10.237.41 +add test 10.10.237.42 +add test 10.10.237.43 +add test 10.10.237.44 +add test 10.10.237.45 +add test 10.10.237.46 +add test 10.10.237.47 +add test 10.10.237.48 +add test 10.10.237.49 +add test 10.10.237.5 +add test 10.10.237.50 +add test 10.10.237.51 +add test 10.10.237.52 +add test 10.10.237.53 +add test 10.10.237.54 +add test 10.10.237.55 +add test 10.10.237.56 +add test 10.10.237.57 +add test 10.10.237.58 +add test 10.10.237.59 +add test 10.10.237.6 +add test 10.10.237.60 +add test 10.10.237.61 +add test 10.10.237.62 +add test 10.10.237.63 +add test 10.10.237.64 +add test 10.10.237.65 +add test 10.10.237.66 +add test 10.10.237.67 +add test 10.10.237.68 +add test 10.10.237.69 +add test 10.10.237.7 +add test 10.10.237.70 +add test 10.10.237.71 +add test 10.10.237.72 +add test 10.10.237.73 +add test 10.10.237.74 +add test 10.10.237.75 +add test 10.10.237.76 +add test 10.10.237.77 +add test 10.10.237.78 +add test 10.10.237.79 +add test 10.10.237.8 +add test 10.10.237.80 +add test 10.10.237.81 +add test 10.10.237.82 +add test 10.10.237.83 +add test 10.10.237.84 +add test 10.10.237.85 +add test 10.10.237.86 +add test 10.10.237.87 +add test 10.10.237.88 +add test 10.10.237.89 +add test 10.10.237.9 +add test 10.10.237.90 +add test 10.10.237.91 +add test 10.10.237.92 +add test 10.10.237.93 +add test 10.10.237.94 +add test 10.10.237.95 +add test 10.10.237.96 +add test 10.10.237.97 +add test 10.10.237.98 +add test 10.10.237.99 +add test 10.10.238.0 +add test 10.10.238.1 +add test 10.10.238.10 +add test 10.10.238.100 +add test 10.10.238.101 +add test 10.10.238.102 +add test 10.10.238.103 +add test 10.10.238.104 +add test 10.10.238.105 +add test 10.10.238.106 +add test 10.10.238.107 +add test 10.10.238.108 +add test 10.10.238.109 +add test 10.10.238.11 +add test 10.10.238.110 +add test 10.10.238.111 +add test 10.10.238.112 +add test 10.10.238.113 +add test 10.10.238.114 +add test 10.10.238.115 +add test 10.10.238.116 +add test 10.10.238.117 +add test 10.10.238.118 +add test 10.10.238.119 +add test 10.10.238.12 +add test 10.10.238.120 +add test 10.10.238.121 +add test 10.10.238.122 +add test 10.10.238.123 +add test 10.10.238.124 +add test 10.10.238.125 +add test 10.10.238.126 +add test 10.10.238.127 +add test 10.10.238.128 +add test 10.10.238.129 +add test 10.10.238.13 +add test 10.10.238.130 +add test 10.10.238.131 +add test 10.10.238.132 +add test 10.10.238.133 +add test 10.10.238.134 +add test 10.10.238.135 +add test 10.10.238.136 +add test 10.10.238.137 +add test 10.10.238.138 +add test 10.10.238.139 +add test 10.10.238.14 +add test 10.10.238.140 +add test 10.10.238.141 +add test 10.10.238.142 +add test 10.10.238.143 +add test 10.10.238.144 +add test 10.10.238.145 +add test 10.10.238.146 +add test 10.10.238.147 +add test 10.10.238.148 +add test 10.10.238.149 +add test 10.10.238.15 +add test 10.10.238.150 +add test 10.10.238.151 +add test 10.10.238.152 +add test 10.10.238.153 +add test 10.10.238.154 +add test 10.10.238.155 +add test 10.10.238.156 +add test 10.10.238.157 +add test 10.10.238.158 +add test 10.10.238.159 +add test 10.10.238.16 +add test 10.10.238.160 +add test 10.10.238.161 +add test 10.10.238.162 +add test 10.10.238.163 +add test 10.10.238.164 +add test 10.10.238.165 +add test 10.10.238.166 +add test 10.10.238.167 +add test 10.10.238.168 +add test 10.10.238.169 +add test 10.10.238.17 +add test 10.10.238.170 +add test 10.10.238.171 +add test 10.10.238.172 +add test 10.10.238.173 +add test 10.10.238.174 +add test 10.10.238.175 +add test 10.10.238.176 +add test 10.10.238.177 +add test 10.10.238.178 +add test 10.10.238.179 +add test 10.10.238.18 +add test 10.10.238.180 +add test 10.10.238.181 +add test 10.10.238.182 +add test 10.10.238.183 +add test 10.10.238.184 +add test 10.10.238.185 +add test 10.10.238.186 +add test 10.10.238.187 +add test 10.10.238.188 +add test 10.10.238.189 +add test 10.10.238.19 +add test 10.10.238.190 +add test 10.10.238.191 +add test 10.10.238.192 +add test 10.10.238.193 +add test 10.10.238.194 +add test 10.10.238.195 +add test 10.10.238.196 +add test 10.10.238.197 +add test 10.10.238.198 +add test 10.10.238.199 +add test 10.10.238.2 +add test 10.10.238.20 +add test 10.10.238.200 +add test 10.10.238.201 +add test 10.10.238.202 +add test 10.10.238.203 +add test 10.10.238.204 +add test 10.10.238.205 +add test 10.10.238.206 +add test 10.10.238.207 +add test 10.10.238.208 +add test 10.10.238.209 +add test 10.10.238.21 +add test 10.10.238.210 +add test 10.10.238.211 +add test 10.10.238.212 +add test 10.10.238.213 +add test 10.10.238.214 +add test 10.10.238.215 +add test 10.10.238.216 +add test 10.10.238.217 +add test 10.10.238.218 +add test 10.10.238.219 +add test 10.10.238.22 +add test 10.10.238.220 +add test 10.10.238.221 +add test 10.10.238.222 +add test 10.10.238.223 +add test 10.10.238.224 +add test 10.10.238.225 +add test 10.10.238.226 +add test 10.10.238.227 +add test 10.10.238.228 +add test 10.10.238.229 +add test 10.10.238.23 +add test 10.10.238.230 +add test 10.10.238.231 +add test 10.10.238.232 +add test 10.10.238.233 +add test 10.10.238.234 +add test 10.10.238.235 +add test 10.10.238.236 +add test 10.10.238.237 +add test 10.10.238.238 +add test 10.10.238.239 +add test 10.10.238.24 +add test 10.10.238.240 +add test 10.10.238.241 +add test 10.10.238.242 +add test 10.10.238.243 +add test 10.10.238.244 +add test 10.10.238.245 +add test 10.10.238.246 +add test 10.10.238.247 +add test 10.10.238.248 +add test 10.10.238.249 +add test 10.10.238.25 +add test 10.10.238.250 +add test 10.10.238.251 +add test 10.10.238.252 +add test 10.10.238.253 +add test 10.10.238.254 +add test 10.10.238.255 +add test 10.10.238.26 +add test 10.10.238.27 +add test 10.10.238.28 +add test 10.10.238.29 +add test 10.10.238.3 +add test 10.10.238.30 +add test 10.10.238.31 +add test 10.10.238.32 +add test 10.10.238.33 +add test 10.10.238.34 +add test 10.10.238.35 +add test 10.10.238.36 +add test 10.10.238.37 +add test 10.10.238.38 +add test 10.10.238.39 +add test 10.10.238.4 +add test 10.10.238.40 +add test 10.10.238.41 +add test 10.10.238.42 +add test 10.10.238.43 +add test 10.10.238.44 +add test 10.10.238.45 +add test 10.10.238.46 +add test 10.10.238.47 +add test 10.10.238.48 +add test 10.10.238.49 +add test 10.10.238.5 +add test 10.10.238.50 +add test 10.10.238.51 +add test 10.10.238.52 +add test 10.10.238.53 +add test 10.10.238.54 +add test 10.10.238.55 +add test 10.10.238.56 +add test 10.10.238.57 +add test 10.10.238.58 +add test 10.10.238.59 +add test 10.10.238.6 +add test 10.10.238.60 +add test 10.10.238.61 +add test 10.10.238.62 +add test 10.10.238.63 +add test 10.10.238.64 +add test 10.10.238.65 +add test 10.10.238.66 +add test 10.10.238.67 +add test 10.10.238.68 +add test 10.10.238.69 +add test 10.10.238.7 +add test 10.10.238.70 +add test 10.10.238.71 +add test 10.10.238.72 +add test 10.10.238.73 +add test 10.10.238.74 +add test 10.10.238.75 +add test 10.10.238.76 +add test 10.10.238.77 +add test 10.10.238.78 +add test 10.10.238.79 +add test 10.10.238.8 +add test 10.10.238.80 +add test 10.10.238.81 +add test 10.10.238.82 +add test 10.10.238.83 +add test 10.10.238.84 +add test 10.10.238.85 +add test 10.10.238.86 +add test 10.10.238.87 +add test 10.10.238.88 +add test 10.10.238.89 +add test 10.10.238.9 +add test 10.10.238.90 +add test 10.10.238.91 +add test 10.10.238.92 +add test 10.10.238.93 +add test 10.10.238.94 +add test 10.10.238.95 +add test 10.10.238.96 +add test 10.10.238.97 +add test 10.10.238.98 +add test 10.10.238.99 +add test 10.10.239.0 +add test 10.10.239.1 +add test 10.10.239.10 +add test 10.10.239.100 +add test 10.10.239.101 +add test 10.10.239.102 +add test 10.10.239.103 +add test 10.10.239.104 +add test 10.10.239.105 +add test 10.10.239.106 +add test 10.10.239.107 +add test 10.10.239.108 +add test 10.10.239.109 +add test 10.10.239.11 +add test 10.10.239.110 +add test 10.10.239.111 +add test 10.10.239.112 +add test 10.10.239.113 +add test 10.10.239.114 +add test 10.10.239.115 +add test 10.10.239.116 +add test 10.10.239.117 +add test 10.10.239.118 +add test 10.10.239.119 +add test 10.10.239.12 +add test 10.10.239.120 +add test 10.10.239.121 +add test 10.10.239.122 +add test 10.10.239.123 +add test 10.10.239.124 +add test 10.10.239.125 +add test 10.10.239.126 +add test 10.10.239.127 +add test 10.10.239.128 +add test 10.10.239.129 +add test 10.10.239.13 +add test 10.10.239.130 +add test 10.10.239.131 +add test 10.10.239.132 +add test 10.10.239.133 +add test 10.10.239.134 +add test 10.10.239.135 +add test 10.10.239.136 +add test 10.10.239.137 +add test 10.10.239.138 +add test 10.10.239.139 +add test 10.10.239.14 +add test 10.10.239.140 +add test 10.10.239.141 +add test 10.10.239.142 +add test 10.10.239.143 +add test 10.10.239.144 +add test 10.10.239.145 +add test 10.10.239.146 +add test 10.10.239.147 +add test 10.10.239.148 +add test 10.10.239.149 +add test 10.10.239.15 +add test 10.10.239.150 +add test 10.10.239.151 +add test 10.10.239.152 +add test 10.10.239.153 +add test 10.10.239.154 +add test 10.10.239.155 +add test 10.10.239.156 +add test 10.10.239.157 +add test 10.10.239.158 +add test 10.10.239.159 +add test 10.10.239.16 +add test 10.10.239.160 +add test 10.10.239.161 +add test 10.10.239.162 +add test 10.10.239.163 +add test 10.10.239.164 +add test 10.10.239.165 +add test 10.10.239.166 +add test 10.10.239.167 +add test 10.10.239.168 +add test 10.10.239.169 +add test 10.10.239.17 +add test 10.10.239.170 +add test 10.10.239.171 +add test 10.10.239.172 +add test 10.10.239.173 +add test 10.10.239.174 +add test 10.10.239.175 +add test 10.10.239.176 +add test 10.10.239.177 +add test 10.10.239.178 +add test 10.10.239.179 +add test 10.10.239.18 +add test 10.10.239.180 +add test 10.10.239.181 +add test 10.10.239.182 +add test 10.10.239.183 +add test 10.10.239.184 +add test 10.10.239.185 +add test 10.10.239.186 +add test 10.10.239.187 +add test 10.10.239.188 +add test 10.10.239.189 +add test 10.10.239.19 +add test 10.10.239.190 +add test 10.10.239.191 +add test 10.10.239.192 +add test 10.10.239.193 +add test 10.10.239.194 +add test 10.10.239.195 +add test 10.10.239.196 +add test 10.10.239.197 +add test 10.10.239.198 +add test 10.10.239.199 +add test 10.10.239.2 +add test 10.10.239.20 +add test 10.10.239.200 +add test 10.10.239.201 +add test 10.10.239.202 +add test 10.10.239.203 +add test 10.10.239.204 +add test 10.10.239.205 +add test 10.10.239.206 +add test 10.10.239.207 +add test 10.10.239.208 +add test 10.10.239.209 +add test 10.10.239.21 +add test 10.10.239.210 +add test 10.10.239.211 +add test 10.10.239.212 +add test 10.10.239.213 +add test 10.10.239.214 +add test 10.10.239.215 +add test 10.10.239.216 +add test 10.10.239.217 +add test 10.10.239.218 +add test 10.10.239.219 +add test 10.10.239.22 +add test 10.10.239.220 +add test 10.10.239.221 +add test 10.10.239.222 +add test 10.10.239.223 +add test 10.10.239.224 +add test 10.10.239.225 +add test 10.10.239.226 +add test 10.10.239.227 +add test 10.10.239.228 +add test 10.10.239.229 +add test 10.10.239.23 +add test 10.10.239.230 +add test 10.10.239.231 +add test 10.10.239.232 +add test 10.10.239.233 +add test 10.10.239.234 +add test 10.10.239.235 +add test 10.10.239.236 +add test 10.10.239.237 +add test 10.10.239.238 +add test 10.10.239.239 +add test 10.10.239.24 +add test 10.10.239.240 +add test 10.10.239.241 +add test 10.10.239.242 +add test 10.10.239.243 +add test 10.10.239.244 +add test 10.10.239.245 +add test 10.10.239.246 +add test 10.10.239.247 +add test 10.10.239.248 +add test 10.10.239.249 +add test 10.10.239.25 +add test 10.10.239.250 +add test 10.10.239.251 +add test 10.10.239.252 +add test 10.10.239.253 +add test 10.10.239.254 +add test 10.10.239.255 +add test 10.10.239.26 +add test 10.10.239.27 +add test 10.10.239.28 +add test 10.10.239.29 +add test 10.10.239.3 +add test 10.10.239.30 +add test 10.10.239.31 +add test 10.10.239.32 +add test 10.10.239.33 +add test 10.10.239.34 +add test 10.10.239.35 +add test 10.10.239.36 +add test 10.10.239.37 +add test 10.10.239.38 +add test 10.10.239.39 +add test 10.10.239.4 +add test 10.10.239.40 +add test 10.10.239.41 +add test 10.10.239.42 +add test 10.10.239.43 +add test 10.10.239.44 +add test 10.10.239.45 +add test 10.10.239.46 +add test 10.10.239.47 +add test 10.10.239.48 +add test 10.10.239.49 +add test 10.10.239.5 +add test 10.10.239.50 +add test 10.10.239.51 +add test 10.10.239.52 +add test 10.10.239.53 +add test 10.10.239.54 +add test 10.10.239.55 +add test 10.10.239.56 +add test 10.10.239.57 +add test 10.10.239.58 +add test 10.10.239.59 +add test 10.10.239.6 +add test 10.10.239.60 +add test 10.10.239.61 +add test 10.10.239.62 +add test 10.10.239.63 +add test 10.10.239.64 +add test 10.10.239.65 +add test 10.10.239.66 +add test 10.10.239.67 +add test 10.10.239.68 +add test 10.10.239.69 +add test 10.10.239.7 +add test 10.10.239.70 +add test 10.10.239.71 +add test 10.10.239.72 +add test 10.10.239.73 +add test 10.10.239.74 +add test 10.10.239.75 +add test 10.10.239.76 +add test 10.10.239.77 +add test 10.10.239.78 +add test 10.10.239.79 +add test 10.10.239.8 +add test 10.10.239.80 +add test 10.10.239.81 +add test 10.10.239.82 +add test 10.10.239.83 +add test 10.10.239.84 +add test 10.10.239.85 +add test 10.10.239.86 +add test 10.10.239.87 +add test 10.10.239.88 +add test 10.10.239.89 +add test 10.10.239.9 +add test 10.10.239.90 +add test 10.10.239.91 +add test 10.10.239.92 +add test 10.10.239.93 +add test 10.10.239.94 +add test 10.10.239.95 +add test 10.10.239.96 +add test 10.10.239.97 +add test 10.10.239.98 +add test 10.10.239.99 +add test 10.10.24.0 +add test 10.10.24.1 +add test 10.10.24.10 +add test 10.10.24.100 +add test 10.10.24.101 +add test 10.10.24.102 +add test 10.10.24.103 +add test 10.10.24.104 +add test 10.10.24.105 +add test 10.10.24.106 +add test 10.10.24.107 +add test 10.10.24.108 +add test 10.10.24.109 +add test 10.10.24.11 +add test 10.10.24.110 +add test 10.10.24.111 +add test 10.10.24.112 +add test 10.10.24.113 +add test 10.10.24.114 +add test 10.10.24.115 +add test 10.10.24.116 +add test 10.10.24.117 +add test 10.10.24.118 +add test 10.10.24.119 +add test 10.10.24.12 +add test 10.10.24.120 +add test 10.10.24.121 +add test 10.10.24.122 +add test 10.10.24.123 +add test 10.10.24.124 +add test 10.10.24.125 +add test 10.10.24.126 +add test 10.10.24.127 +add test 10.10.24.128 +add test 10.10.24.129 +add test 10.10.24.13 +add test 10.10.24.130 +add test 10.10.24.131 +add test 10.10.24.132 +add test 10.10.24.133 +add test 10.10.24.134 +add test 10.10.24.135 +add test 10.10.24.136 +add test 10.10.24.137 +add test 10.10.24.138 +add test 10.10.24.139 +add test 10.10.24.14 +add test 10.10.24.140 +add test 10.10.24.141 +add test 10.10.24.142 +add test 10.10.24.143 +add test 10.10.24.144 +add test 10.10.24.145 +add test 10.10.24.146 +add test 10.10.24.147 +add test 10.10.24.148 +add test 10.10.24.149 +add test 10.10.24.15 +add test 10.10.24.150 +add test 10.10.24.151 +add test 10.10.24.152 +add test 10.10.24.153 +add test 10.10.24.154 +add test 10.10.24.155 +add test 10.10.24.156 +add test 10.10.24.157 +add test 10.10.24.158 +add test 10.10.24.159 +add test 10.10.24.16 +add test 10.10.24.160 +add test 10.10.24.161 +add test 10.10.24.162 +add test 10.10.24.163 +add test 10.10.24.164 +add test 10.10.24.165 +add test 10.10.24.166 +add test 10.10.24.167 +add test 10.10.24.168 +add test 10.10.24.169 +add test 10.10.24.17 +add test 10.10.24.170 +add test 10.10.24.171 +add test 10.10.24.172 +add test 10.10.24.173 +add test 10.10.24.174 +add test 10.10.24.175 +add test 10.10.24.176 +add test 10.10.24.177 +add test 10.10.24.178 +add test 10.10.24.179 +add test 10.10.24.18 +add test 10.10.24.180 +add test 10.10.24.181 +add test 10.10.24.182 +add test 10.10.24.183 +add test 10.10.24.184 +add test 10.10.24.185 +add test 10.10.24.186 +add test 10.10.24.187 +add test 10.10.24.188 +add test 10.10.24.189 +add test 10.10.24.19 +add test 10.10.24.190 +add test 10.10.24.191 +add test 10.10.24.192 +add test 10.10.24.193 +add test 10.10.24.194 +add test 10.10.24.195 +add test 10.10.24.196 +add test 10.10.24.197 +add test 10.10.24.198 +add test 10.10.24.199 +add test 10.10.24.2 +add test 10.10.24.20 +add test 10.10.24.200 +add test 10.10.24.201 +add test 10.10.24.202 +add test 10.10.24.203 +add test 10.10.24.204 +add test 10.10.24.205 +add test 10.10.24.206 +add test 10.10.24.207 +add test 10.10.24.208 +add test 10.10.24.209 +add test 10.10.24.21 +add test 10.10.24.210 +add test 10.10.24.211 +add test 10.10.24.212 +add test 10.10.24.213 +add test 10.10.24.214 +add test 10.10.24.215 +add test 10.10.24.216 +add test 10.10.24.217 +add test 10.10.24.218 +add test 10.10.24.219 +add test 10.10.24.22 +add test 10.10.24.220 +add test 10.10.24.221 +add test 10.10.24.222 +add test 10.10.24.223 +add test 10.10.24.224 +add test 10.10.24.225 +add test 10.10.24.226 +add test 10.10.24.227 +add test 10.10.24.228 +add test 10.10.24.229 +add test 10.10.24.23 +add test 10.10.24.230 +add test 10.10.24.231 +add test 10.10.24.232 +add test 10.10.24.233 +add test 10.10.24.234 +add test 10.10.24.235 +add test 10.10.24.236 +add test 10.10.24.237 +add test 10.10.24.238 +add test 10.10.24.239 +add test 10.10.24.24 +add test 10.10.24.240 +add test 10.10.24.241 +add test 10.10.24.242 +add test 10.10.24.243 +add test 10.10.24.244 +add test 10.10.24.245 +add test 10.10.24.246 +add test 10.10.24.247 +add test 10.10.24.248 +add test 10.10.24.249 +add test 10.10.24.25 +add test 10.10.24.250 +add test 10.10.24.251 +add test 10.10.24.252 +add test 10.10.24.253 +add test 10.10.24.254 +add test 10.10.24.255 +add test 10.10.24.26 +add test 10.10.24.27 +add test 10.10.24.28 +add test 10.10.24.29 +add test 10.10.24.3 +add test 10.10.24.30 +add test 10.10.24.31 +add test 10.10.24.32 +add test 10.10.24.33 +add test 10.10.24.34 +add test 10.10.24.35 +add test 10.10.24.36 +add test 10.10.24.37 +add test 10.10.24.38 +add test 10.10.24.39 +add test 10.10.24.4 +add test 10.10.24.40 +add test 10.10.24.41 +add test 10.10.24.42 +add test 10.10.24.43 +add test 10.10.24.44 +add test 10.10.24.45 +add test 10.10.24.46 +add test 10.10.24.47 +add test 10.10.24.48 +add test 10.10.24.49 +add test 10.10.24.5 +add test 10.10.24.50 +add test 10.10.24.51 +add test 10.10.24.52 +add test 10.10.24.53 +add test 10.10.24.54 +add test 10.10.24.55 +add test 10.10.24.56 +add test 10.10.24.57 +add test 10.10.24.58 +add test 10.10.24.59 +add test 10.10.24.6 +add test 10.10.24.60 +add test 10.10.24.61 +add test 10.10.24.62 +add test 10.10.24.63 +add test 10.10.24.64 +add test 10.10.24.65 +add test 10.10.24.66 +add test 10.10.24.67 +add test 10.10.24.68 +add test 10.10.24.69 +add test 10.10.24.7 +add test 10.10.24.70 +add test 10.10.24.71 +add test 10.10.24.72 +add test 10.10.24.73 +add test 10.10.24.74 +add test 10.10.24.75 +add test 10.10.24.76 +add test 10.10.24.77 +add test 10.10.24.78 +add test 10.10.24.79 +add test 10.10.24.8 +add test 10.10.24.80 +add test 10.10.24.81 +add test 10.10.24.82 +add test 10.10.24.83 +add test 10.10.24.84 +add test 10.10.24.85 +add test 10.10.24.86 +add test 10.10.24.87 +add test 10.10.24.88 +add test 10.10.24.89 +add test 10.10.24.9 +add test 10.10.24.90 +add test 10.10.24.91 +add test 10.10.24.92 +add test 10.10.24.93 +add test 10.10.24.94 +add test 10.10.24.95 +add test 10.10.24.96 +add test 10.10.24.97 +add test 10.10.24.98 +add test 10.10.24.99 +add test 10.10.240.0 +add test 10.10.240.1 +add test 10.10.240.10 +add test 10.10.240.100 +add test 10.10.240.101 +add test 10.10.240.102 +add test 10.10.240.103 +add test 10.10.240.104 +add test 10.10.240.105 +add test 10.10.240.106 +add test 10.10.240.107 +add test 10.10.240.108 +add test 10.10.240.109 +add test 10.10.240.11 +add test 10.10.240.110 +add test 10.10.240.111 +add test 10.10.240.112 +add test 10.10.240.113 +add test 10.10.240.114 +add test 10.10.240.115 +add test 10.10.240.116 +add test 10.10.240.117 +add test 10.10.240.118 +add test 10.10.240.119 +add test 10.10.240.12 +add test 10.10.240.120 +add test 10.10.240.121 +add test 10.10.240.122 +add test 10.10.240.123 +add test 10.10.240.124 +add test 10.10.240.125 +add test 10.10.240.126 +add test 10.10.240.127 +add test 10.10.240.128 +add test 10.10.240.129 +add test 10.10.240.13 +add test 10.10.240.130 +add test 10.10.240.131 +add test 10.10.240.132 +add test 10.10.240.133 +add test 10.10.240.134 +add test 10.10.240.135 +add test 10.10.240.136 +add test 10.10.240.137 +add test 10.10.240.138 +add test 10.10.240.139 +add test 10.10.240.14 +add test 10.10.240.140 +add test 10.10.240.141 +add test 10.10.240.142 +add test 10.10.240.143 +add test 10.10.240.144 +add test 10.10.240.145 +add test 10.10.240.146 +add test 10.10.240.147 +add test 10.10.240.148 +add test 10.10.240.149 +add test 10.10.240.15 +add test 10.10.240.150 +add test 10.10.240.151 +add test 10.10.240.152 +add test 10.10.240.153 +add test 10.10.240.154 +add test 10.10.240.155 +add test 10.10.240.156 +add test 10.10.240.157 +add test 10.10.240.158 +add test 10.10.240.159 +add test 10.10.240.16 +add test 10.10.240.160 +add test 10.10.240.161 +add test 10.10.240.162 +add test 10.10.240.163 +add test 10.10.240.164 +add test 10.10.240.165 +add test 10.10.240.166 +add test 10.10.240.167 +add test 10.10.240.168 +add test 10.10.240.169 +add test 10.10.240.17 +add test 10.10.240.170 +add test 10.10.240.171 +add test 10.10.240.172 +add test 10.10.240.173 +add test 10.10.240.174 +add test 10.10.240.175 +add test 10.10.240.176 +add test 10.10.240.177 +add test 10.10.240.178 +add test 10.10.240.179 +add test 10.10.240.18 +add test 10.10.240.180 +add test 10.10.240.181 +add test 10.10.240.182 +add test 10.10.240.183 +add test 10.10.240.184 +add test 10.10.240.185 +add test 10.10.240.186 +add test 10.10.240.187 +add test 10.10.240.188 +add test 10.10.240.189 +add test 10.10.240.19 +add test 10.10.240.190 +add test 10.10.240.191 +add test 10.10.240.192 +add test 10.10.240.193 +add test 10.10.240.194 +add test 10.10.240.195 +add test 10.10.240.196 +add test 10.10.240.197 +add test 10.10.240.198 +add test 10.10.240.199 +add test 10.10.240.2 +add test 10.10.240.20 +add test 10.10.240.200 +add test 10.10.240.201 +add test 10.10.240.202 +add test 10.10.240.203 +add test 10.10.240.204 +add test 10.10.240.205 +add test 10.10.240.206 +add test 10.10.240.207 +add test 10.10.240.208 +add test 10.10.240.209 +add test 10.10.240.21 +add test 10.10.240.210 +add test 10.10.240.211 +add test 10.10.240.212 +add test 10.10.240.213 +add test 10.10.240.214 +add test 10.10.240.215 +add test 10.10.240.216 +add test 10.10.240.217 +add test 10.10.240.218 +add test 10.10.240.219 +add test 10.10.240.22 +add test 10.10.240.220 +add test 10.10.240.221 +add test 10.10.240.222 +add test 10.10.240.223 +add test 10.10.240.224 +add test 10.10.240.225 +add test 10.10.240.226 +add test 10.10.240.227 +add test 10.10.240.228 +add test 10.10.240.229 +add test 10.10.240.23 +add test 10.10.240.230 +add test 10.10.240.231 +add test 10.10.240.232 +add test 10.10.240.233 +add test 10.10.240.234 +add test 10.10.240.235 +add test 10.10.240.236 +add test 10.10.240.237 +add test 10.10.240.238 +add test 10.10.240.239 +add test 10.10.240.24 +add test 10.10.240.240 +add test 10.10.240.241 +add test 10.10.240.242 +add test 10.10.240.243 +add test 10.10.240.244 +add test 10.10.240.245 +add test 10.10.240.246 +add test 10.10.240.247 +add test 10.10.240.248 +add test 10.10.240.249 +add test 10.10.240.25 +add test 10.10.240.250 +add test 10.10.240.251 +add test 10.10.240.252 +add test 10.10.240.253 +add test 10.10.240.254 +add test 10.10.240.255 +add test 10.10.240.26 +add test 10.10.240.27 +add test 10.10.240.28 +add test 10.10.240.29 +add test 10.10.240.3 +add test 10.10.240.30 +add test 10.10.240.31 +add test 10.10.240.32 +add test 10.10.240.33 +add test 10.10.240.34 +add test 10.10.240.35 +add test 10.10.240.36 +add test 10.10.240.37 +add test 10.10.240.38 +add test 10.10.240.39 +add test 10.10.240.4 +add test 10.10.240.40 +add test 10.10.240.41 +add test 10.10.240.42 +add test 10.10.240.43 +add test 10.10.240.44 +add test 10.10.240.45 +add test 10.10.240.46 +add test 10.10.240.47 +add test 10.10.240.48 +add test 10.10.240.49 +add test 10.10.240.5 +add test 10.10.240.50 +add test 10.10.240.51 +add test 10.10.240.52 +add test 10.10.240.53 +add test 10.10.240.54 +add test 10.10.240.55 +add test 10.10.240.56 +add test 10.10.240.57 +add test 10.10.240.58 +add test 10.10.240.59 +add test 10.10.240.6 +add test 10.10.240.60 +add test 10.10.240.61 +add test 10.10.240.62 +add test 10.10.240.63 +add test 10.10.240.64 +add test 10.10.240.65 +add test 10.10.240.66 +add test 10.10.240.67 +add test 10.10.240.68 +add test 10.10.240.69 +add test 10.10.240.7 +add test 10.10.240.70 +add test 10.10.240.71 +add test 10.10.240.72 +add test 10.10.240.73 +add test 10.10.240.74 +add test 10.10.240.75 +add test 10.10.240.76 +add test 10.10.240.77 +add test 10.10.240.78 +add test 10.10.240.79 +add test 10.10.240.8 +add test 10.10.240.80 +add test 10.10.240.81 +add test 10.10.240.82 +add test 10.10.240.83 +add test 10.10.240.84 +add test 10.10.240.85 +add test 10.10.240.86 +add test 10.10.240.87 +add test 10.10.240.88 +add test 10.10.240.89 +add test 10.10.240.9 +add test 10.10.240.90 +add test 10.10.240.91 +add test 10.10.240.92 +add test 10.10.240.93 +add test 10.10.240.94 +add test 10.10.240.95 +add test 10.10.240.96 +add test 10.10.240.97 +add test 10.10.240.98 +add test 10.10.240.99 +add test 10.10.241.0 +add test 10.10.241.1 +add test 10.10.241.10 +add test 10.10.241.100 +add test 10.10.241.101 +add test 10.10.241.102 +add test 10.10.241.103 +add test 10.10.241.104 +add test 10.10.241.105 +add test 10.10.241.106 +add test 10.10.241.107 +add test 10.10.241.108 +add test 10.10.241.109 +add test 10.10.241.11 +add test 10.10.241.110 +add test 10.10.241.111 +add test 10.10.241.112 +add test 10.10.241.113 +add test 10.10.241.114 +add test 10.10.241.115 +add test 10.10.241.116 +add test 10.10.241.117 +add test 10.10.241.118 +add test 10.10.241.119 +add test 10.10.241.12 +add test 10.10.241.120 +add test 10.10.241.121 +add test 10.10.241.122 +add test 10.10.241.123 +add test 10.10.241.124 +add test 10.10.241.125 +add test 10.10.241.126 +add test 10.10.241.127 +add test 10.10.241.128 +add test 10.10.241.129 +add test 10.10.241.13 +add test 10.10.241.130 +add test 10.10.241.131 +add test 10.10.241.132 +add test 10.10.241.133 +add test 10.10.241.134 +add test 10.10.241.135 +add test 10.10.241.136 +add test 10.10.241.137 +add test 10.10.241.138 +add test 10.10.241.139 +add test 10.10.241.14 +add test 10.10.241.140 +add test 10.10.241.141 +add test 10.10.241.142 +add test 10.10.241.143 +add test 10.10.241.144 +add test 10.10.241.145 +add test 10.10.241.146 +add test 10.10.241.147 +add test 10.10.241.148 +add test 10.10.241.149 +add test 10.10.241.15 +add test 10.10.241.150 +add test 10.10.241.151 +add test 10.10.241.152 +add test 10.10.241.153 +add test 10.10.241.154 +add test 10.10.241.155 +add test 10.10.241.156 +add test 10.10.241.157 +add test 10.10.241.158 +add test 10.10.241.159 +add test 10.10.241.16 +add test 10.10.241.160 +add test 10.10.241.161 +add test 10.10.241.162 +add test 10.10.241.163 +add test 10.10.241.164 +add test 10.10.241.165 +add test 10.10.241.166 +add test 10.10.241.167 +add test 10.10.241.168 +add test 10.10.241.169 +add test 10.10.241.17 +add test 10.10.241.170 +add test 10.10.241.171 +add test 10.10.241.172 +add test 10.10.241.173 +add test 10.10.241.174 +add test 10.10.241.175 +add test 10.10.241.176 +add test 10.10.241.177 +add test 10.10.241.178 +add test 10.10.241.179 +add test 10.10.241.18 +add test 10.10.241.180 +add test 10.10.241.181 +add test 10.10.241.182 +add test 10.10.241.183 +add test 10.10.241.184 +add test 10.10.241.185 +add test 10.10.241.186 +add test 10.10.241.187 +add test 10.10.241.188 +add test 10.10.241.189 +add test 10.10.241.19 +add test 10.10.241.190 +add test 10.10.241.191 +add test 10.10.241.192 +add test 10.10.241.193 +add test 10.10.241.194 +add test 10.10.241.195 +add test 10.10.241.196 +add test 10.10.241.197 +add test 10.10.241.198 +add test 10.10.241.199 +add test 10.10.241.2 +add test 10.10.241.20 +add test 10.10.241.200 +add test 10.10.241.201 +add test 10.10.241.202 +add test 10.10.241.203 +add test 10.10.241.204 +add test 10.10.241.205 +add test 10.10.241.206 +add test 10.10.241.207 +add test 10.10.241.208 +add test 10.10.241.209 +add test 10.10.241.21 +add test 10.10.241.210 +add test 10.10.241.211 +add test 10.10.241.212 +add test 10.10.241.213 +add test 10.10.241.214 +add test 10.10.241.215 +add test 10.10.241.216 +add test 10.10.241.217 +add test 10.10.241.218 +add test 10.10.241.219 +add test 10.10.241.22 +add test 10.10.241.220 +add test 10.10.241.221 +add test 10.10.241.222 +add test 10.10.241.223 +add test 10.10.241.224 +add test 10.10.241.225 +add test 10.10.241.226 +add test 10.10.241.227 +add test 10.10.241.228 +add test 10.10.241.229 +add test 10.10.241.23 +add test 10.10.241.230 +add test 10.10.241.231 +add test 10.10.241.232 +add test 10.10.241.233 +add test 10.10.241.234 +add test 10.10.241.235 +add test 10.10.241.236 +add test 10.10.241.237 +add test 10.10.241.238 +add test 10.10.241.239 +add test 10.10.241.24 +add test 10.10.241.240 +add test 10.10.241.241 +add test 10.10.241.242 +add test 10.10.241.243 +add test 10.10.241.244 +add test 10.10.241.245 +add test 10.10.241.246 +add test 10.10.241.247 +add test 10.10.241.248 +add test 10.10.241.249 +add test 10.10.241.25 +add test 10.10.241.250 +add test 10.10.241.251 +add test 10.10.241.252 +add test 10.10.241.253 +add test 10.10.241.254 +add test 10.10.241.255 +add test 10.10.241.26 +add test 10.10.241.27 +add test 10.10.241.28 +add test 10.10.241.29 +add test 10.10.241.3 +add test 10.10.241.30 +add test 10.10.241.31 +add test 10.10.241.32 +add test 10.10.241.33 +add test 10.10.241.34 +add test 10.10.241.35 +add test 10.10.241.36 +add test 10.10.241.37 +add test 10.10.241.38 +add test 10.10.241.39 +add test 10.10.241.4 +add test 10.10.241.40 +add test 10.10.241.41 +add test 10.10.241.42 +add test 10.10.241.43 +add test 10.10.241.44 +add test 10.10.241.45 +add test 10.10.241.46 +add test 10.10.241.47 +add test 10.10.241.48 +add test 10.10.241.49 +add test 10.10.241.5 +add test 10.10.241.50 +add test 10.10.241.51 +add test 10.10.241.52 +add test 10.10.241.53 +add test 10.10.241.54 +add test 10.10.241.55 +add test 10.10.241.56 +add test 10.10.241.57 +add test 10.10.241.58 +add test 10.10.241.59 +add test 10.10.241.6 +add test 10.10.241.60 +add test 10.10.241.61 +add test 10.10.241.62 +add test 10.10.241.63 +add test 10.10.241.64 +add test 10.10.241.65 +add test 10.10.241.66 +add test 10.10.241.67 +add test 10.10.241.68 +add test 10.10.241.69 +add test 10.10.241.7 +add test 10.10.241.70 +add test 10.10.241.71 +add test 10.10.241.72 +add test 10.10.241.73 +add test 10.10.241.74 +add test 10.10.241.75 +add test 10.10.241.76 +add test 10.10.241.77 +add test 10.10.241.78 +add test 10.10.241.79 +add test 10.10.241.8 +add test 10.10.241.80 +add test 10.10.241.81 +add test 10.10.241.82 +add test 10.10.241.83 +add test 10.10.241.84 +add test 10.10.241.85 +add test 10.10.241.86 +add test 10.10.241.87 +add test 10.10.241.88 +add test 10.10.241.89 +add test 10.10.241.9 +add test 10.10.241.90 +add test 10.10.241.91 +add test 10.10.241.92 +add test 10.10.241.93 +add test 10.10.241.94 +add test 10.10.241.95 +add test 10.10.241.96 +add test 10.10.241.97 +add test 10.10.241.98 +add test 10.10.241.99 +add test 10.10.242.0 +add test 10.10.242.1 +add test 10.10.242.10 +add test 10.10.242.100 +add test 10.10.242.101 +add test 10.10.242.102 +add test 10.10.242.103 +add test 10.10.242.104 +add test 10.10.242.105 +add test 10.10.242.106 +add test 10.10.242.107 +add test 10.10.242.108 +add test 10.10.242.109 +add test 10.10.242.11 +add test 10.10.242.110 +add test 10.10.242.111 +add test 10.10.242.112 +add test 10.10.242.113 +add test 10.10.242.114 +add test 10.10.242.115 +add test 10.10.242.116 +add test 10.10.242.117 +add test 10.10.242.118 +add test 10.10.242.119 +add test 10.10.242.12 +add test 10.10.242.120 +add test 10.10.242.121 +add test 10.10.242.122 +add test 10.10.242.123 +add test 10.10.242.124 +add test 10.10.242.125 +add test 10.10.242.126 +add test 10.10.242.127 +add test 10.10.242.128 +add test 10.10.242.129 +add test 10.10.242.13 +add test 10.10.242.130 +add test 10.10.242.131 +add test 10.10.242.132 +add test 10.10.242.133 +add test 10.10.242.134 +add test 10.10.242.135 +add test 10.10.242.136 +add test 10.10.242.137 +add test 10.10.242.138 +add test 10.10.242.139 +add test 10.10.242.14 +add test 10.10.242.140 +add test 10.10.242.141 +add test 10.10.242.142 +add test 10.10.242.143 +add test 10.10.242.144 +add test 10.10.242.145 +add test 10.10.242.146 +add test 10.10.242.147 +add test 10.10.242.148 +add test 10.10.242.149 +add test 10.10.242.15 +add test 10.10.242.150 +add test 10.10.242.151 +add test 10.10.242.152 +add test 10.10.242.153 +add test 10.10.242.154 +add test 10.10.242.155 +add test 10.10.242.156 +add test 10.10.242.157 +add test 10.10.242.158 +add test 10.10.242.159 +add test 10.10.242.16 +add test 10.10.242.160 +add test 10.10.242.161 +add test 10.10.242.162 +add test 10.10.242.163 +add test 10.10.242.164 +add test 10.10.242.165 +add test 10.10.242.166 +add test 10.10.242.167 +add test 10.10.242.168 +add test 10.10.242.169 +add test 10.10.242.17 +add test 10.10.242.170 +add test 10.10.242.171 +add test 10.10.242.172 +add test 10.10.242.173 +add test 10.10.242.174 +add test 10.10.242.175 +add test 10.10.242.176 +add test 10.10.242.177 +add test 10.10.242.178 +add test 10.10.242.179 +add test 10.10.242.18 +add test 10.10.242.180 +add test 10.10.242.181 +add test 10.10.242.182 +add test 10.10.242.183 +add test 10.10.242.184 +add test 10.10.242.185 +add test 10.10.242.186 +add test 10.10.242.187 +add test 10.10.242.188 +add test 10.10.242.189 +add test 10.10.242.19 +add test 10.10.242.190 +add test 10.10.242.191 +add test 10.10.242.192 +add test 10.10.242.193 +add test 10.10.242.194 +add test 10.10.242.195 +add test 10.10.242.196 +add test 10.10.242.197 +add test 10.10.242.198 +add test 10.10.242.199 +add test 10.10.242.2 +add test 10.10.242.20 +add test 10.10.242.200 +add test 10.10.242.201 +add test 10.10.242.202 +add test 10.10.242.203 +add test 10.10.242.204 +add test 10.10.242.205 +add test 10.10.242.206 +add test 10.10.242.207 +add test 10.10.242.208 +add test 10.10.242.209 +add test 10.10.242.21 +add test 10.10.242.210 +add test 10.10.242.211 +add test 10.10.242.212 +add test 10.10.242.213 +add test 10.10.242.214 +add test 10.10.242.215 +add test 10.10.242.216 +add test 10.10.242.217 +add test 10.10.242.218 +add test 10.10.242.219 +add test 10.10.242.22 +add test 10.10.242.220 +add test 10.10.242.221 +add test 10.10.242.222 +add test 10.10.242.223 +add test 10.10.242.224 +add test 10.10.242.225 +add test 10.10.242.226 +add test 10.10.242.227 +add test 10.10.242.228 +add test 10.10.242.229 +add test 10.10.242.23 +add test 10.10.242.230 +add test 10.10.242.231 +add test 10.10.242.232 +add test 10.10.242.233 +add test 10.10.242.234 +add test 10.10.242.235 +add test 10.10.242.236 +add test 10.10.242.237 +add test 10.10.242.238 +add test 10.10.242.239 +add test 10.10.242.24 +add test 10.10.242.240 +add test 10.10.242.241 +add test 10.10.242.242 +add test 10.10.242.243 +add test 10.10.242.244 +add test 10.10.242.245 +add test 10.10.242.246 +add test 10.10.242.247 +add test 10.10.242.248 +add test 10.10.242.249 +add test 10.10.242.25 +add test 10.10.242.250 +add test 10.10.242.251 +add test 10.10.242.252 +add test 10.10.242.253 +add test 10.10.242.254 +add test 10.10.242.255 +add test 10.10.242.26 +add test 10.10.242.27 +add test 10.10.242.28 +add test 10.10.242.29 +add test 10.10.242.3 +add test 10.10.242.30 +add test 10.10.242.31 +add test 10.10.242.32 +add test 10.10.242.33 +add test 10.10.242.34 +add test 10.10.242.35 +add test 10.10.242.36 +add test 10.10.242.37 +add test 10.10.242.38 +add test 10.10.242.39 +add test 10.10.242.4 +add test 10.10.242.40 +add test 10.10.242.41 +add test 10.10.242.42 +add test 10.10.242.43 +add test 10.10.242.44 +add test 10.10.242.45 +add test 10.10.242.46 +add test 10.10.242.47 +add test 10.10.242.48 +add test 10.10.242.49 +add test 10.10.242.5 +add test 10.10.242.50 +add test 10.10.242.51 +add test 10.10.242.52 +add test 10.10.242.53 +add test 10.10.242.54 +add test 10.10.242.55 +add test 10.10.242.56 +add test 10.10.242.57 +add test 10.10.242.58 +add test 10.10.242.59 +add test 10.10.242.6 +add test 10.10.242.60 +add test 10.10.242.61 +add test 10.10.242.62 +add test 10.10.242.63 +add test 10.10.242.64 +add test 10.10.242.65 +add test 10.10.242.66 +add test 10.10.242.67 +add test 10.10.242.68 +add test 10.10.242.69 +add test 10.10.242.7 +add test 10.10.242.70 +add test 10.10.242.71 +add test 10.10.242.72 +add test 10.10.242.73 +add test 10.10.242.74 +add test 10.10.242.75 +add test 10.10.242.76 +add test 10.10.242.77 +add test 10.10.242.78 +add test 10.10.242.79 +add test 10.10.242.8 +add test 10.10.242.80 +add test 10.10.242.81 +add test 10.10.242.82 +add test 10.10.242.83 +add test 10.10.242.84 +add test 10.10.242.85 +add test 10.10.242.86 +add test 10.10.242.87 +add test 10.10.242.88 +add test 10.10.242.89 +add test 10.10.242.9 +add test 10.10.242.90 +add test 10.10.242.91 +add test 10.10.242.92 +add test 10.10.242.93 +add test 10.10.242.94 +add test 10.10.242.95 +add test 10.10.242.96 +add test 10.10.242.97 +add test 10.10.242.98 +add test 10.10.242.99 +add test 10.10.243.0 +add test 10.10.243.1 +add test 10.10.243.10 +add test 10.10.243.100 +add test 10.10.243.101 +add test 10.10.243.102 +add test 10.10.243.103 +add test 10.10.243.104 +add test 10.10.243.105 +add test 10.10.243.106 +add test 10.10.243.107 +add test 10.10.243.108 +add test 10.10.243.109 +add test 10.10.243.11 +add test 10.10.243.110 +add test 10.10.243.111 +add test 10.10.243.112 +add test 10.10.243.113 +add test 10.10.243.114 +add test 10.10.243.115 +add test 10.10.243.116 +add test 10.10.243.117 +add test 10.10.243.118 +add test 10.10.243.119 +add test 10.10.243.12 +add test 10.10.243.120 +add test 10.10.243.121 +add test 10.10.243.122 +add test 10.10.243.123 +add test 10.10.243.124 +add test 10.10.243.125 +add test 10.10.243.126 +add test 10.10.243.127 +add test 10.10.243.128 +add test 10.10.243.129 +add test 10.10.243.13 +add test 10.10.243.130 +add test 10.10.243.131 +add test 10.10.243.132 +add test 10.10.243.133 +add test 10.10.243.134 +add test 10.10.243.135 +add test 10.10.243.136 +add test 10.10.243.137 +add test 10.10.243.138 +add test 10.10.243.139 +add test 10.10.243.14 +add test 10.10.243.140 +add test 10.10.243.141 +add test 10.10.243.142 +add test 10.10.243.143 +add test 10.10.243.144 +add test 10.10.243.145 +add test 10.10.243.146 +add test 10.10.243.147 +add test 10.10.243.148 +add test 10.10.243.149 +add test 10.10.243.15 +add test 10.10.243.150 +add test 10.10.243.151 +add test 10.10.243.152 +add test 10.10.243.153 +add test 10.10.243.154 +add test 10.10.243.155 +add test 10.10.243.156 +add test 10.10.243.157 +add test 10.10.243.158 +add test 10.10.243.159 +add test 10.10.243.16 +add test 10.10.243.160 +add test 10.10.243.161 +add test 10.10.243.162 +add test 10.10.243.163 +add test 10.10.243.164 +add test 10.10.243.165 +add test 10.10.243.166 +add test 10.10.243.167 +add test 10.10.243.168 +add test 10.10.243.169 +add test 10.10.243.17 +add test 10.10.243.170 +add test 10.10.243.171 +add test 10.10.243.172 +add test 10.10.243.173 +add test 10.10.243.174 +add test 10.10.243.175 +add test 10.10.243.176 +add test 10.10.243.177 +add test 10.10.243.178 +add test 10.10.243.179 +add test 10.10.243.18 +add test 10.10.243.180 +add test 10.10.243.181 +add test 10.10.243.182 +add test 10.10.243.183 +add test 10.10.243.184 +add test 10.10.243.185 +add test 10.10.243.186 +add test 10.10.243.187 +add test 10.10.243.188 +add test 10.10.243.189 +add test 10.10.243.19 +add test 10.10.243.190 +add test 10.10.243.191 +add test 10.10.243.192 +add test 10.10.243.193 +add test 10.10.243.194 +add test 10.10.243.195 +add test 10.10.243.196 +add test 10.10.243.197 +add test 10.10.243.198 +add test 10.10.243.199 +add test 10.10.243.2 +add test 10.10.243.20 +add test 10.10.243.200 +add test 10.10.243.201 +add test 10.10.243.202 +add test 10.10.243.203 +add test 10.10.243.204 +add test 10.10.243.205 +add test 10.10.243.206 +add test 10.10.243.207 +add test 10.10.243.208 +add test 10.10.243.209 +add test 10.10.243.21 +add test 10.10.243.210 +add test 10.10.243.211 +add test 10.10.243.212 +add test 10.10.243.213 +add test 10.10.243.214 +add test 10.10.243.215 +add test 10.10.243.216 +add test 10.10.243.217 +add test 10.10.243.218 +add test 10.10.243.219 +add test 10.10.243.22 +add test 10.10.243.220 +add test 10.10.243.221 +add test 10.10.243.222 +add test 10.10.243.223 +add test 10.10.243.224 +add test 10.10.243.225 +add test 10.10.243.226 +add test 10.10.243.227 +add test 10.10.243.228 +add test 10.10.243.229 +add test 10.10.243.23 +add test 10.10.243.230 +add test 10.10.243.231 +add test 10.10.243.232 +add test 10.10.243.233 +add test 10.10.243.234 +add test 10.10.243.235 +add test 10.10.243.236 +add test 10.10.243.237 +add test 10.10.243.238 +add test 10.10.243.239 +add test 10.10.243.24 +add test 10.10.243.240 +add test 10.10.243.241 +add test 10.10.243.242 +add test 10.10.243.243 +add test 10.10.243.244 +add test 10.10.243.245 +add test 10.10.243.246 +add test 10.10.243.247 +add test 10.10.243.248 +add test 10.10.243.249 +add test 10.10.243.25 +add test 10.10.243.250 +add test 10.10.243.251 +add test 10.10.243.252 +add test 10.10.243.253 +add test 10.10.243.254 +add test 10.10.243.255 +add test 10.10.243.26 +add test 10.10.243.27 +add test 10.10.243.28 +add test 10.10.243.29 +add test 10.10.243.3 +add test 10.10.243.30 +add test 10.10.243.31 +add test 10.10.243.32 +add test 10.10.243.33 +add test 10.10.243.34 +add test 10.10.243.35 +add test 10.10.243.36 +add test 10.10.243.37 +add test 10.10.243.38 +add test 10.10.243.39 +add test 10.10.243.4 +add test 10.10.243.40 +add test 10.10.243.41 +add test 10.10.243.42 +add test 10.10.243.43 +add test 10.10.243.44 +add test 10.10.243.45 +add test 10.10.243.46 +add test 10.10.243.47 +add test 10.10.243.48 +add test 10.10.243.49 +add test 10.10.243.5 +add test 10.10.243.50 +add test 10.10.243.51 +add test 10.10.243.52 +add test 10.10.243.53 +add test 10.10.243.54 +add test 10.10.243.55 +add test 10.10.243.56 +add test 10.10.243.57 +add test 10.10.243.58 +add test 10.10.243.59 +add test 10.10.243.6 +add test 10.10.243.60 +add test 10.10.243.61 +add test 10.10.243.62 +add test 10.10.243.63 +add test 10.10.243.64 +add test 10.10.243.65 +add test 10.10.243.66 +add test 10.10.243.67 +add test 10.10.243.68 +add test 10.10.243.69 +add test 10.10.243.7 +add test 10.10.243.70 +add test 10.10.243.71 +add test 10.10.243.72 +add test 10.10.243.73 +add test 10.10.243.74 +add test 10.10.243.75 +add test 10.10.243.76 +add test 10.10.243.77 +add test 10.10.243.78 +add test 10.10.243.79 +add test 10.10.243.8 +add test 10.10.243.80 +add test 10.10.243.81 +add test 10.10.243.82 +add test 10.10.243.83 +add test 10.10.243.84 +add test 10.10.243.85 +add test 10.10.243.86 +add test 10.10.243.87 +add test 10.10.243.88 +add test 10.10.243.89 +add test 10.10.243.9 +add test 10.10.243.90 +add test 10.10.243.91 +add test 10.10.243.92 +add test 10.10.243.93 +add test 10.10.243.94 +add test 10.10.243.95 +add test 10.10.243.96 +add test 10.10.243.97 +add test 10.10.243.98 +add test 10.10.243.99 +add test 10.10.244.0 +add test 10.10.244.1 +add test 10.10.244.10 +add test 10.10.244.100 +add test 10.10.244.101 +add test 10.10.244.102 +add test 10.10.244.103 +add test 10.10.244.104 +add test 10.10.244.105 +add test 10.10.244.106 +add test 10.10.244.107 +add test 10.10.244.108 +add test 10.10.244.109 +add test 10.10.244.11 +add test 10.10.244.110 +add test 10.10.244.111 +add test 10.10.244.112 +add test 10.10.244.113 +add test 10.10.244.114 +add test 10.10.244.115 +add test 10.10.244.116 +add test 10.10.244.117 +add test 10.10.244.118 +add test 10.10.244.119 +add test 10.10.244.12 +add test 10.10.244.120 +add test 10.10.244.121 +add test 10.10.244.122 +add test 10.10.244.123 +add test 10.10.244.124 +add test 10.10.244.125 +add test 10.10.244.126 +add test 10.10.244.127 +add test 10.10.244.128 +add test 10.10.244.129 +add test 10.10.244.13 +add test 10.10.244.130 +add test 10.10.244.131 +add test 10.10.244.132 +add test 10.10.244.133 +add test 10.10.244.134 +add test 10.10.244.135 +add test 10.10.244.136 +add test 10.10.244.137 +add test 10.10.244.138 +add test 10.10.244.139 +add test 10.10.244.14 +add test 10.10.244.140 +add test 10.10.244.141 +add test 10.10.244.142 +add test 10.10.244.143 +add test 10.10.244.144 +add test 10.10.244.145 +add test 10.10.244.146 +add test 10.10.244.147 +add test 10.10.244.148 +add test 10.10.244.149 +add test 10.10.244.15 +add test 10.10.244.150 +add test 10.10.244.151 +add test 10.10.244.152 +add test 10.10.244.153 +add test 10.10.244.154 +add test 10.10.244.155 +add test 10.10.244.156 +add test 10.10.244.157 +add test 10.10.244.158 +add test 10.10.244.159 +add test 10.10.244.16 +add test 10.10.244.160 +add test 10.10.244.161 +add test 10.10.244.162 +add test 10.10.244.163 +add test 10.10.244.164 +add test 10.10.244.165 +add test 10.10.244.166 +add test 10.10.244.167 +add test 10.10.244.168 +add test 10.10.244.169 +add test 10.10.244.17 +add test 10.10.244.170 +add test 10.10.244.171 +add test 10.10.244.172 +add test 10.10.244.173 +add test 10.10.244.174 +add test 10.10.244.175 +add test 10.10.244.176 +add test 10.10.244.177 +add test 10.10.244.178 +add test 10.10.244.179 +add test 10.10.244.18 +add test 10.10.244.180 +add test 10.10.244.181 +add test 10.10.244.182 +add test 10.10.244.183 +add test 10.10.244.184 +add test 10.10.244.185 +add test 10.10.244.186 +add test 10.10.244.187 +add test 10.10.244.188 +add test 10.10.244.189 +add test 10.10.244.19 +add test 10.10.244.190 +add test 10.10.244.191 +add test 10.10.244.192 +add test 10.10.244.193 +add test 10.10.244.194 +add test 10.10.244.195 +add test 10.10.244.196 +add test 10.10.244.197 +add test 10.10.244.198 +add test 10.10.244.199 +add test 10.10.244.2 +add test 10.10.244.20 +add test 10.10.244.200 +add test 10.10.244.201 +add test 10.10.244.202 +add test 10.10.244.203 +add test 10.10.244.204 +add test 10.10.244.205 +add test 10.10.244.206 +add test 10.10.244.207 +add test 10.10.244.208 +add test 10.10.244.209 +add test 10.10.244.21 +add test 10.10.244.210 +add test 10.10.244.211 +add test 10.10.244.212 +add test 10.10.244.213 +add test 10.10.244.214 +add test 10.10.244.215 +add test 10.10.244.216 +add test 10.10.244.217 +add test 10.10.244.218 +add test 10.10.244.219 +add test 10.10.244.22 +add test 10.10.244.220 +add test 10.10.244.221 +add test 10.10.244.222 +add test 10.10.244.223 +add test 10.10.244.224 +add test 10.10.244.225 +add test 10.10.244.226 +add test 10.10.244.227 +add test 10.10.244.228 +add test 10.10.244.229 +add test 10.10.244.23 +add test 10.10.244.230 +add test 10.10.244.231 +add test 10.10.244.232 +add test 10.10.244.233 +add test 10.10.244.234 +add test 10.10.244.235 +add test 10.10.244.236 +add test 10.10.244.237 +add test 10.10.244.238 +add test 10.10.244.239 +add test 10.10.244.24 +add test 10.10.244.240 +add test 10.10.244.241 +add test 10.10.244.242 +add test 10.10.244.243 +add test 10.10.244.244 +add test 10.10.244.245 +add test 10.10.244.246 +add test 10.10.244.247 +add test 10.10.244.248 +add test 10.10.244.249 +add test 10.10.244.25 +add test 10.10.244.250 +add test 10.10.244.251 +add test 10.10.244.252 +add test 10.10.244.253 +add test 10.10.244.254 +add test 10.10.244.255 +add test 10.10.244.26 +add test 10.10.244.27 +add test 10.10.244.28 +add test 10.10.244.29 +add test 10.10.244.3 +add test 10.10.244.30 +add test 10.10.244.31 +add test 10.10.244.32 +add test 10.10.244.33 +add test 10.10.244.34 +add test 10.10.244.35 +add test 10.10.244.36 +add test 10.10.244.37 +add test 10.10.244.38 +add test 10.10.244.39 +add test 10.10.244.4 +add test 10.10.244.40 +add test 10.10.244.41 +add test 10.10.244.42 +add test 10.10.244.43 +add test 10.10.244.44 +add test 10.10.244.45 +add test 10.10.244.46 +add test 10.10.244.47 +add test 10.10.244.48 +add test 10.10.244.49 +add test 10.10.244.5 +add test 10.10.244.50 +add test 10.10.244.51 +add test 10.10.244.52 +add test 10.10.244.53 +add test 10.10.244.54 +add test 10.10.244.55 +add test 10.10.244.56 +add test 10.10.244.57 +add test 10.10.244.58 +add test 10.10.244.59 +add test 10.10.244.6 +add test 10.10.244.60 +add test 10.10.244.61 +add test 10.10.244.62 +add test 10.10.244.63 +add test 10.10.244.64 +add test 10.10.244.65 +add test 10.10.244.66 +add test 10.10.244.67 +add test 10.10.244.68 +add test 10.10.244.69 +add test 10.10.244.7 +add test 10.10.244.70 +add test 10.10.244.71 +add test 10.10.244.72 +add test 10.10.244.73 +add test 10.10.244.74 +add test 10.10.244.75 +add test 10.10.244.76 +add test 10.10.244.77 +add test 10.10.244.78 +add test 10.10.244.79 +add test 10.10.244.8 +add test 10.10.244.80 +add test 10.10.244.81 +add test 10.10.244.82 +add test 10.10.244.83 +add test 10.10.244.84 +add test 10.10.244.85 +add test 10.10.244.86 +add test 10.10.244.87 +add test 10.10.244.88 +add test 10.10.244.89 +add test 10.10.244.9 +add test 10.10.244.90 +add test 10.10.244.91 +add test 10.10.244.92 +add test 10.10.244.93 +add test 10.10.244.94 +add test 10.10.244.95 +add test 10.10.244.96 +add test 10.10.244.97 +add test 10.10.244.98 +add test 10.10.244.99 +add test 10.10.245.0 +add test 10.10.245.1 +add test 10.10.245.10 +add test 10.10.245.100 +add test 10.10.245.101 +add test 10.10.245.102 +add test 10.10.245.103 +add test 10.10.245.104 +add test 10.10.245.105 +add test 10.10.245.106 +add test 10.10.245.107 +add test 10.10.245.108 +add test 10.10.245.109 +add test 10.10.245.11 +add test 10.10.245.110 +add test 10.10.245.111 +add test 10.10.245.112 +add test 10.10.245.113 +add test 10.10.245.114 +add test 10.10.245.115 +add test 10.10.245.116 +add test 10.10.245.117 +add test 10.10.245.118 +add test 10.10.245.119 +add test 10.10.245.12 +add test 10.10.245.120 +add test 10.10.245.121 +add test 10.10.245.122 +add test 10.10.245.123 +add test 10.10.245.124 +add test 10.10.245.125 +add test 10.10.245.126 +add test 10.10.245.127 +add test 10.10.245.128 +add test 10.10.245.129 +add test 10.10.245.13 +add test 10.10.245.130 +add test 10.10.245.131 +add test 10.10.245.132 +add test 10.10.245.133 +add test 10.10.245.134 +add test 10.10.245.135 +add test 10.10.245.136 +add test 10.10.245.137 +add test 10.10.245.138 +add test 10.10.245.139 +add test 10.10.245.14 +add test 10.10.245.140 +add test 10.10.245.141 +add test 10.10.245.142 +add test 10.10.245.143 +add test 10.10.245.144 +add test 10.10.245.145 +add test 10.10.245.146 +add test 10.10.245.147 +add test 10.10.245.148 +add test 10.10.245.149 +add test 10.10.245.15 +add test 10.10.245.150 +add test 10.10.245.151 +add test 10.10.245.152 +add test 10.10.245.153 +add test 10.10.245.154 +add test 10.10.245.155 +add test 10.10.245.156 +add test 10.10.245.157 +add test 10.10.245.158 +add test 10.10.245.159 +add test 10.10.245.16 +add test 10.10.245.160 +add test 10.10.245.161 +add test 10.10.245.162 +add test 10.10.245.163 +add test 10.10.245.164 +add test 10.10.245.165 +add test 10.10.245.166 +add test 10.10.245.167 +add test 10.10.245.168 +add test 10.10.245.169 +add test 10.10.245.17 +add test 10.10.245.170 +add test 10.10.245.171 +add test 10.10.245.172 +add test 10.10.245.173 +add test 10.10.245.174 +add test 10.10.245.175 +add test 10.10.245.176 +add test 10.10.245.177 +add test 10.10.245.178 +add test 10.10.245.179 +add test 10.10.245.18 +add test 10.10.245.180 +add test 10.10.245.181 +add test 10.10.245.182 +add test 10.10.245.183 +add test 10.10.245.184 +add test 10.10.245.185 +add test 10.10.245.186 +add test 10.10.245.187 +add test 10.10.245.188 +add test 10.10.245.189 +add test 10.10.245.19 +add test 10.10.245.190 +add test 10.10.245.191 +add test 10.10.245.192 +add test 10.10.245.193 +add test 10.10.245.194 +add test 10.10.245.195 +add test 10.10.245.196 +add test 10.10.245.197 +add test 10.10.245.198 +add test 10.10.245.199 +add test 10.10.245.2 +add test 10.10.245.20 +add test 10.10.245.200 +add test 10.10.245.201 +add test 10.10.245.202 +add test 10.10.245.203 +add test 10.10.245.204 +add test 10.10.245.205 +add test 10.10.245.206 +add test 10.10.245.207 +add test 10.10.245.208 +add test 10.10.245.209 +add test 10.10.245.21 +add test 10.10.245.210 +add test 10.10.245.211 +add test 10.10.245.212 +add test 10.10.245.213 +add test 10.10.245.214 +add test 10.10.245.215 +add test 10.10.245.216 +add test 10.10.245.217 +add test 10.10.245.218 +add test 10.10.245.219 +add test 10.10.245.22 +add test 10.10.245.220 +add test 10.10.245.221 +add test 10.10.245.222 +add test 10.10.245.223 +add test 10.10.245.224 +add test 10.10.245.225 +add test 10.10.245.226 +add test 10.10.245.227 +add test 10.10.245.228 +add test 10.10.245.229 +add test 10.10.245.23 +add test 10.10.245.230 +add test 10.10.245.231 +add test 10.10.245.232 +add test 10.10.245.233 +add test 10.10.245.234 +add test 10.10.245.235 +add test 10.10.245.236 +add test 10.10.245.237 +add test 10.10.245.238 +add test 10.10.245.239 +add test 10.10.245.24 +add test 10.10.245.240 +add test 10.10.245.241 +add test 10.10.245.242 +add test 10.10.245.243 +add test 10.10.245.244 +add test 10.10.245.245 +add test 10.10.245.246 +add test 10.10.245.247 +add test 10.10.245.248 +add test 10.10.245.249 +add test 10.10.245.25 +add test 10.10.245.250 +add test 10.10.245.251 +add test 10.10.245.252 +add test 10.10.245.253 +add test 10.10.245.254 +add test 10.10.245.255 +add test 10.10.245.26 +add test 10.10.245.27 +add test 10.10.245.28 +add test 10.10.245.29 +add test 10.10.245.3 +add test 10.10.245.30 +add test 10.10.245.31 +add test 10.10.245.32 +add test 10.10.245.33 +add test 10.10.245.34 +add test 10.10.245.35 +add test 10.10.245.36 +add test 10.10.245.37 +add test 10.10.245.38 +add test 10.10.245.39 +add test 10.10.245.4 +add test 10.10.245.40 +add test 10.10.245.41 +add test 10.10.245.42 +add test 10.10.245.43 +add test 10.10.245.44 +add test 10.10.245.45 +add test 10.10.245.46 +add test 10.10.245.47 +add test 10.10.245.48 +add test 10.10.245.49 +add test 10.10.245.5 +add test 10.10.245.50 +add test 10.10.245.51 +add test 10.10.245.52 +add test 10.10.245.53 +add test 10.10.245.54 +add test 10.10.245.55 +add test 10.10.245.56 +add test 10.10.245.57 +add test 10.10.245.58 +add test 10.10.245.59 +add test 10.10.245.6 +add test 10.10.245.60 +add test 10.10.245.61 +add test 10.10.245.62 +add test 10.10.245.63 +add test 10.10.245.64 +add test 10.10.245.65 +add test 10.10.245.66 +add test 10.10.245.67 +add test 10.10.245.68 +add test 10.10.245.69 +add test 10.10.245.7 +add test 10.10.245.70 +add test 10.10.245.71 +add test 10.10.245.72 +add test 10.10.245.73 +add test 10.10.245.74 +add test 10.10.245.75 +add test 10.10.245.76 +add test 10.10.245.77 +add test 10.10.245.78 +add test 10.10.245.79 +add test 10.10.245.8 +add test 10.10.245.80 +add test 10.10.245.81 +add test 10.10.245.82 +add test 10.10.245.83 +add test 10.10.245.84 +add test 10.10.245.85 +add test 10.10.245.86 +add test 10.10.245.87 +add test 10.10.245.88 +add test 10.10.245.89 +add test 10.10.245.9 +add test 10.10.245.90 +add test 10.10.245.91 +add test 10.10.245.92 +add test 10.10.245.93 +add test 10.10.245.94 +add test 10.10.245.95 +add test 10.10.245.96 +add test 10.10.245.97 +add test 10.10.245.98 +add test 10.10.245.99 +add test 10.10.246.0 +add test 10.10.246.1 +add test 10.10.246.10 +add test 10.10.246.100 +add test 10.10.246.101 +add test 10.10.246.102 +add test 10.10.246.103 +add test 10.10.246.104 +add test 10.10.246.105 +add test 10.10.246.106 +add test 10.10.246.107 +add test 10.10.246.108 +add test 10.10.246.109 +add test 10.10.246.11 +add test 10.10.246.110 +add test 10.10.246.111 +add test 10.10.246.112 +add test 10.10.246.113 +add test 10.10.246.114 +add test 10.10.246.115 +add test 10.10.246.116 +add test 10.10.246.117 +add test 10.10.246.118 +add test 10.10.246.119 +add test 10.10.246.12 +add test 10.10.246.120 +add test 10.10.246.121 +add test 10.10.246.122 +add test 10.10.246.123 +add test 10.10.246.124 +add test 10.10.246.125 +add test 10.10.246.126 +add test 10.10.246.127 +add test 10.10.246.128 +add test 10.10.246.129 +add test 10.10.246.13 +add test 10.10.246.130 +add test 10.10.246.131 +add test 10.10.246.132 +add test 10.10.246.133 +add test 10.10.246.134 +add test 10.10.246.135 +add test 10.10.246.136 +add test 10.10.246.137 +add test 10.10.246.138 +add test 10.10.246.139 +add test 10.10.246.14 +add test 10.10.246.140 +add test 10.10.246.141 +add test 10.10.246.142 +add test 10.10.246.143 +add test 10.10.246.144 +add test 10.10.246.145 +add test 10.10.246.146 +add test 10.10.246.147 +add test 10.10.246.148 +add test 10.10.246.149 +add test 10.10.246.15 +add test 10.10.246.150 +add test 10.10.246.151 +add test 10.10.246.152 +add test 10.10.246.153 +add test 10.10.246.154 +add test 10.10.246.155 +add test 10.10.246.156 +add test 10.10.246.157 +add test 10.10.246.158 +add test 10.10.246.159 +add test 10.10.246.16 +add test 10.10.246.160 +add test 10.10.246.161 +add test 10.10.246.162 +add test 10.10.246.163 +add test 10.10.246.164 +add test 10.10.246.165 +add test 10.10.246.166 +add test 10.10.246.167 +add test 10.10.246.168 +add test 10.10.246.169 +add test 10.10.246.17 +add test 10.10.246.170 +add test 10.10.246.171 +add test 10.10.246.172 +add test 10.10.246.173 +add test 10.10.246.174 +add test 10.10.246.175 +add test 10.10.246.176 +add test 10.10.246.177 +add test 10.10.246.178 +add test 10.10.246.179 +add test 10.10.246.18 +add test 10.10.246.180 +add test 10.10.246.181 +add test 10.10.246.182 +add test 10.10.246.183 +add test 10.10.246.184 +add test 10.10.246.185 +add test 10.10.246.186 +add test 10.10.246.187 +add test 10.10.246.188 +add test 10.10.246.189 +add test 10.10.246.19 +add test 10.10.246.190 +add test 10.10.246.191 +add test 10.10.246.192 +add test 10.10.246.193 +add test 10.10.246.194 +add test 10.10.246.195 +add test 10.10.246.196 +add test 10.10.246.197 +add test 10.10.246.198 +add test 10.10.246.199 +add test 10.10.246.2 +add test 10.10.246.20 +add test 10.10.246.200 +add test 10.10.246.201 +add test 10.10.246.202 +add test 10.10.246.203 +add test 10.10.246.204 +add test 10.10.246.205 +add test 10.10.246.206 +add test 10.10.246.207 +add test 10.10.246.208 +add test 10.10.246.209 +add test 10.10.246.21 +add test 10.10.246.210 +add test 10.10.246.211 +add test 10.10.246.212 +add test 10.10.246.213 +add test 10.10.246.214 +add test 10.10.246.215 +add test 10.10.246.216 +add test 10.10.246.217 +add test 10.10.246.218 +add test 10.10.246.219 +add test 10.10.246.22 +add test 10.10.246.220 +add test 10.10.246.221 +add test 10.10.246.222 +add test 10.10.246.223 +add test 10.10.246.224 +add test 10.10.246.225 +add test 10.10.246.226 +add test 10.10.246.227 +add test 10.10.246.228 +add test 10.10.246.229 +add test 10.10.246.23 +add test 10.10.246.230 +add test 10.10.246.231 +add test 10.10.246.232 +add test 10.10.246.233 +add test 10.10.246.234 +add test 10.10.246.235 +add test 10.10.246.236 +add test 10.10.246.237 +add test 10.10.246.238 +add test 10.10.246.239 +add test 10.10.246.24 +add test 10.10.246.240 +add test 10.10.246.241 +add test 10.10.246.242 +add test 10.10.246.243 +add test 10.10.246.244 +add test 10.10.246.245 +add test 10.10.246.246 +add test 10.10.246.247 +add test 10.10.246.248 +add test 10.10.246.249 +add test 10.10.246.25 +add test 10.10.246.250 +add test 10.10.246.251 +add test 10.10.246.252 +add test 10.10.246.253 +add test 10.10.246.254 +add test 10.10.246.255 +add test 10.10.246.26 +add test 10.10.246.27 +add test 10.10.246.28 +add test 10.10.246.29 +add test 10.10.246.3 +add test 10.10.246.30 +add test 10.10.246.31 +add test 10.10.246.32 +add test 10.10.246.33 +add test 10.10.246.34 +add test 10.10.246.35 +add test 10.10.246.36 +add test 10.10.246.37 +add test 10.10.246.38 +add test 10.10.246.39 +add test 10.10.246.4 +add test 10.10.246.40 +add test 10.10.246.41 +add test 10.10.246.42 +add test 10.10.246.43 +add test 10.10.246.44 +add test 10.10.246.45 +add test 10.10.246.46 +add test 10.10.246.47 +add test 10.10.246.48 +add test 10.10.246.49 +add test 10.10.246.5 +add test 10.10.246.50 +add test 10.10.246.51 +add test 10.10.246.52 +add test 10.10.246.53 +add test 10.10.246.54 +add test 10.10.246.55 +add test 10.10.246.56 +add test 10.10.246.57 +add test 10.10.246.58 +add test 10.10.246.59 +add test 10.10.246.6 +add test 10.10.246.60 +add test 10.10.246.61 +add test 10.10.246.62 +add test 10.10.246.63 +add test 10.10.246.64 +add test 10.10.246.65 +add test 10.10.246.66 +add test 10.10.246.67 +add test 10.10.246.68 +add test 10.10.246.69 +add test 10.10.246.7 +add test 10.10.246.70 +add test 10.10.246.71 +add test 10.10.246.72 +add test 10.10.246.73 +add test 10.10.246.74 +add test 10.10.246.75 +add test 10.10.246.76 +add test 10.10.246.77 +add test 10.10.246.78 +add test 10.10.246.79 +add test 10.10.246.8 +add test 10.10.246.80 +add test 10.10.246.81 +add test 10.10.246.82 +add test 10.10.246.83 +add test 10.10.246.84 +add test 10.10.246.85 +add test 10.10.246.86 +add test 10.10.246.87 +add test 10.10.246.88 +add test 10.10.246.89 +add test 10.10.246.9 +add test 10.10.246.90 +add test 10.10.246.91 +add test 10.10.246.92 +add test 10.10.246.93 +add test 10.10.246.94 +add test 10.10.246.95 +add test 10.10.246.96 +add test 10.10.246.97 +add test 10.10.246.98 +add test 10.10.246.99 +add test 10.10.247.0 +add test 10.10.247.1 +add test 10.10.247.10 +add test 10.10.247.100 +add test 10.10.247.101 +add test 10.10.247.102 +add test 10.10.247.103 +add test 10.10.247.104 +add test 10.10.247.105 +add test 10.10.247.106 +add test 10.10.247.107 +add test 10.10.247.108 +add test 10.10.247.109 +add test 10.10.247.11 +add test 10.10.247.110 +add test 10.10.247.111 +add test 10.10.247.112 +add test 10.10.247.113 +add test 10.10.247.114 +add test 10.10.247.115 +add test 10.10.247.116 +add test 10.10.247.117 +add test 10.10.247.118 +add test 10.10.247.119 +add test 10.10.247.12 +add test 10.10.247.120 +add test 10.10.247.121 +add test 10.10.247.122 +add test 10.10.247.123 +add test 10.10.247.124 +add test 10.10.247.125 +add test 10.10.247.126 +add test 10.10.247.127 +add test 10.10.247.128 +add test 10.10.247.129 +add test 10.10.247.13 +add test 10.10.247.130 +add test 10.10.247.131 +add test 10.10.247.132 +add test 10.10.247.133 +add test 10.10.247.134 +add test 10.10.247.135 +add test 10.10.247.136 +add test 10.10.247.137 +add test 10.10.247.138 +add test 10.10.247.139 +add test 10.10.247.14 +add test 10.10.247.140 +add test 10.10.247.141 +add test 10.10.247.142 +add test 10.10.247.143 +add test 10.10.247.144 +add test 10.10.247.145 +add test 10.10.247.146 +add test 10.10.247.147 +add test 10.10.247.148 +add test 10.10.247.149 +add test 10.10.247.15 +add test 10.10.247.150 +add test 10.10.247.151 +add test 10.10.247.152 +add test 10.10.247.153 +add test 10.10.247.154 +add test 10.10.247.155 +add test 10.10.247.156 +add test 10.10.247.157 +add test 10.10.247.158 +add test 10.10.247.159 +add test 10.10.247.16 +add test 10.10.247.160 +add test 10.10.247.161 +add test 10.10.247.162 +add test 10.10.247.163 +add test 10.10.247.164 +add test 10.10.247.165 +add test 10.10.247.166 +add test 10.10.247.167 +add test 10.10.247.168 +add test 10.10.247.169 +add test 10.10.247.17 +add test 10.10.247.170 +add test 10.10.247.171 +add test 10.10.247.172 +add test 10.10.247.173 +add test 10.10.247.174 +add test 10.10.247.175 +add test 10.10.247.176 +add test 10.10.247.177 +add test 10.10.247.178 +add test 10.10.247.179 +add test 10.10.247.18 +add test 10.10.247.180 +add test 10.10.247.181 +add test 10.10.247.182 +add test 10.10.247.183 +add test 10.10.247.184 +add test 10.10.247.185 +add test 10.10.247.186 +add test 10.10.247.187 +add test 10.10.247.188 +add test 10.10.247.189 +add test 10.10.247.19 +add test 10.10.247.190 +add test 10.10.247.191 +add test 10.10.247.192 +add test 10.10.247.193 +add test 10.10.247.194 +add test 10.10.247.195 +add test 10.10.247.196 +add test 10.10.247.197 +add test 10.10.247.198 +add test 10.10.247.199 +add test 10.10.247.2 +add test 10.10.247.20 +add test 10.10.247.200 +add test 10.10.247.201 +add test 10.10.247.202 +add test 10.10.247.203 +add test 10.10.247.204 +add test 10.10.247.205 +add test 10.10.247.206 +add test 10.10.247.207 +add test 10.10.247.208 +add test 10.10.247.209 +add test 10.10.247.21 +add test 10.10.247.210 +add test 10.10.247.211 +add test 10.10.247.212 +add test 10.10.247.213 +add test 10.10.247.214 +add test 10.10.247.215 +add test 10.10.247.216 +add test 10.10.247.217 +add test 10.10.247.218 +add test 10.10.247.219 +add test 10.10.247.22 +add test 10.10.247.220 +add test 10.10.247.221 +add test 10.10.247.222 +add test 10.10.247.223 +add test 10.10.247.224 +add test 10.10.247.225 +add test 10.10.247.226 +add test 10.10.247.227 +add test 10.10.247.228 +add test 10.10.247.229 +add test 10.10.247.23 +add test 10.10.247.230 +add test 10.10.247.231 +add test 10.10.247.232 +add test 10.10.247.233 +add test 10.10.247.234 +add test 10.10.247.235 +add test 10.10.247.236 +add test 10.10.247.237 +add test 10.10.247.238 +add test 10.10.247.239 +add test 10.10.247.24 +add test 10.10.247.240 +add test 10.10.247.241 +add test 10.10.247.242 +add test 10.10.247.243 +add test 10.10.247.244 +add test 10.10.247.245 +add test 10.10.247.246 +add test 10.10.247.247 +add test 10.10.247.248 +add test 10.10.247.249 +add test 10.10.247.25 +add test 10.10.247.250 +add test 10.10.247.251 +add test 10.10.247.252 +add test 10.10.247.253 +add test 10.10.247.254 +add test 10.10.247.255 +add test 10.10.247.26 +add test 10.10.247.27 +add test 10.10.247.28 +add test 10.10.247.29 +add test 10.10.247.3 +add test 10.10.247.30 +add test 10.10.247.31 +add test 10.10.247.32 +add test 10.10.247.33 +add test 10.10.247.34 +add test 10.10.247.35 +add test 10.10.247.36 +add test 10.10.247.37 +add test 10.10.247.38 +add test 10.10.247.39 +add test 10.10.247.4 +add test 10.10.247.40 +add test 10.10.247.41 +add test 10.10.247.42 +add test 10.10.247.43 +add test 10.10.247.44 +add test 10.10.247.45 +add test 10.10.247.46 +add test 10.10.247.47 +add test 10.10.247.48 +add test 10.10.247.49 +add test 10.10.247.5 +add test 10.10.247.50 +add test 10.10.247.51 +add test 10.10.247.52 +add test 10.10.247.53 +add test 10.10.247.54 +add test 10.10.247.55 +add test 10.10.247.56 +add test 10.10.247.57 +add test 10.10.247.58 +add test 10.10.247.59 +add test 10.10.247.6 +add test 10.10.247.60 +add test 10.10.247.61 +add test 10.10.247.62 +add test 10.10.247.63 +add test 10.10.247.64 +add test 10.10.247.65 +add test 10.10.247.66 +add test 10.10.247.67 +add test 10.10.247.68 +add test 10.10.247.69 +add test 10.10.247.7 +add test 10.10.247.70 +add test 10.10.247.71 +add test 10.10.247.72 +add test 10.10.247.73 +add test 10.10.247.74 +add test 10.10.247.75 +add test 10.10.247.76 +add test 10.10.247.77 +add test 10.10.247.78 +add test 10.10.247.79 +add test 10.10.247.8 +add test 10.10.247.80 +add test 10.10.247.81 +add test 10.10.247.82 +add test 10.10.247.83 +add test 10.10.247.84 +add test 10.10.247.85 +add test 10.10.247.86 +add test 10.10.247.87 +add test 10.10.247.88 +add test 10.10.247.89 +add test 10.10.247.9 +add test 10.10.247.90 +add test 10.10.247.91 +add test 10.10.247.92 +add test 10.10.247.93 +add test 10.10.247.94 +add test 10.10.247.95 +add test 10.10.247.96 +add test 10.10.247.97 +add test 10.10.247.98 +add test 10.10.247.99 +add test 10.10.248.0 +add test 10.10.248.1 +add test 10.10.248.10 +add test 10.10.248.100 +add test 10.10.248.101 +add test 10.10.248.102 +add test 10.10.248.103 +add test 10.10.248.104 +add test 10.10.248.105 +add test 10.10.248.106 +add test 10.10.248.107 +add test 10.10.248.108 +add test 10.10.248.109 +add test 10.10.248.11 +add test 10.10.248.110 +add test 10.10.248.111 +add test 10.10.248.112 +add test 10.10.248.113 +add test 10.10.248.114 +add test 10.10.248.115 +add test 10.10.248.116 +add test 10.10.248.117 +add test 10.10.248.118 +add test 10.10.248.119 +add test 10.10.248.12 +add test 10.10.248.120 +add test 10.10.248.121 +add test 10.10.248.122 +add test 10.10.248.123 +add test 10.10.248.124 +add test 10.10.248.125 +add test 10.10.248.126 +add test 10.10.248.127 +add test 10.10.248.128 +add test 10.10.248.129 +add test 10.10.248.13 +add test 10.10.248.130 +add test 10.10.248.131 +add test 10.10.248.132 +add test 10.10.248.133 +add test 10.10.248.134 +add test 10.10.248.135 +add test 10.10.248.136 +add test 10.10.248.137 +add test 10.10.248.138 +add test 10.10.248.139 +add test 10.10.248.14 +add test 10.10.248.140 +add test 10.10.248.141 +add test 10.10.248.142 +add test 10.10.248.143 +add test 10.10.248.144 +add test 10.10.248.145 +add test 10.10.248.146 +add test 10.10.248.147 +add test 10.10.248.148 +add test 10.10.248.149 +add test 10.10.248.15 +add test 10.10.248.150 +add test 10.10.248.151 +add test 10.10.248.152 +add test 10.10.248.153 +add test 10.10.248.154 +add test 10.10.248.155 +add test 10.10.248.156 +add test 10.10.248.157 +add test 10.10.248.158 +add test 10.10.248.159 +add test 10.10.248.16 +add test 10.10.248.160 +add test 10.10.248.161 +add test 10.10.248.162 +add test 10.10.248.163 +add test 10.10.248.164 +add test 10.10.248.165 +add test 10.10.248.166 +add test 10.10.248.167 +add test 10.10.248.168 +add test 10.10.248.169 +add test 10.10.248.17 +add test 10.10.248.170 +add test 10.10.248.171 +add test 10.10.248.172 +add test 10.10.248.173 +add test 10.10.248.174 +add test 10.10.248.175 +add test 10.10.248.176 +add test 10.10.248.177 +add test 10.10.248.178 +add test 10.10.248.179 +add test 10.10.248.18 +add test 10.10.248.180 +add test 10.10.248.181 +add test 10.10.248.182 +add test 10.10.248.183 +add test 10.10.248.184 +add test 10.10.248.185 +add test 10.10.248.186 +add test 10.10.248.187 +add test 10.10.248.188 +add test 10.10.248.189 +add test 10.10.248.19 +add test 10.10.248.190 +add test 10.10.248.191 +add test 10.10.248.192 +add test 10.10.248.193 +add test 10.10.248.194 +add test 10.10.248.195 +add test 10.10.248.196 +add test 10.10.248.197 +add test 10.10.248.198 +add test 10.10.248.199 +add test 10.10.248.2 +add test 10.10.248.20 +add test 10.10.248.200 +add test 10.10.248.201 +add test 10.10.248.202 +add test 10.10.248.203 +add test 10.10.248.204 +add test 10.10.248.205 +add test 10.10.248.206 +add test 10.10.248.207 +add test 10.10.248.208 +add test 10.10.248.209 +add test 10.10.248.21 +add test 10.10.248.210 +add test 10.10.248.211 +add test 10.10.248.212 +add test 10.10.248.213 +add test 10.10.248.214 +add test 10.10.248.215 +add test 10.10.248.216 +add test 10.10.248.217 +add test 10.10.248.218 +add test 10.10.248.219 +add test 10.10.248.22 +add test 10.10.248.220 +add test 10.10.248.221 +add test 10.10.248.222 +add test 10.10.248.223 +add test 10.10.248.224 +add test 10.10.248.225 +add test 10.10.248.226 +add test 10.10.248.227 +add test 10.10.248.228 +add test 10.10.248.229 +add test 10.10.248.23 +add test 10.10.248.230 +add test 10.10.248.231 +add test 10.10.248.232 +add test 10.10.248.233 +add test 10.10.248.234 +add test 10.10.248.235 +add test 10.10.248.236 +add test 10.10.248.237 +add test 10.10.248.238 +add test 10.10.248.239 +add test 10.10.248.24 +add test 10.10.248.240 +add test 10.10.248.241 +add test 10.10.248.242 +add test 10.10.248.243 +add test 10.10.248.244 +add test 10.10.248.245 +add test 10.10.248.246 +add test 10.10.248.247 +add test 10.10.248.248 +add test 10.10.248.249 +add test 10.10.248.25 +add test 10.10.248.250 +add test 10.10.248.251 +add test 10.10.248.252 +add test 10.10.248.253 +add test 10.10.248.254 +add test 10.10.248.255 +add test 10.10.248.26 +add test 10.10.248.27 +add test 10.10.248.28 +add test 10.10.248.29 +add test 10.10.248.3 +add test 10.10.248.30 +add test 10.10.248.31 +add test 10.10.248.32 +add test 10.10.248.33 +add test 10.10.248.34 +add test 10.10.248.35 +add test 10.10.248.36 +add test 10.10.248.37 +add test 10.10.248.38 +add test 10.10.248.39 +add test 10.10.248.4 +add test 10.10.248.40 +add test 10.10.248.41 +add test 10.10.248.42 +add test 10.10.248.43 +add test 10.10.248.44 +add test 10.10.248.45 +add test 10.10.248.46 +add test 10.10.248.47 +add test 10.10.248.48 +add test 10.10.248.49 +add test 10.10.248.5 +add test 10.10.248.50 +add test 10.10.248.51 +add test 10.10.248.52 +add test 10.10.248.53 +add test 10.10.248.54 +add test 10.10.248.55 +add test 10.10.248.56 +add test 10.10.248.57 +add test 10.10.248.58 +add test 10.10.248.59 +add test 10.10.248.6 +add test 10.10.248.60 +add test 10.10.248.61 +add test 10.10.248.62 +add test 10.10.248.63 +add test 10.10.248.64 +add test 10.10.248.65 +add test 10.10.248.66 +add test 10.10.248.67 +add test 10.10.248.68 +add test 10.10.248.69 +add test 10.10.248.7 +add test 10.10.248.70 +add test 10.10.248.71 +add test 10.10.248.72 +add test 10.10.248.73 +add test 10.10.248.74 +add test 10.10.248.75 +add test 10.10.248.76 +add test 10.10.248.77 +add test 10.10.248.78 +add test 10.10.248.79 +add test 10.10.248.8 +add test 10.10.248.80 +add test 10.10.248.81 +add test 10.10.248.82 +add test 10.10.248.83 +add test 10.10.248.84 +add test 10.10.248.85 +add test 10.10.248.86 +add test 10.10.248.87 +add test 10.10.248.88 +add test 10.10.248.89 +add test 10.10.248.9 +add test 10.10.248.90 +add test 10.10.248.91 +add test 10.10.248.92 +add test 10.10.248.93 +add test 10.10.248.94 +add test 10.10.248.95 +add test 10.10.248.96 +add test 10.10.248.97 +add test 10.10.248.98 +add test 10.10.248.99 +add test 10.10.249.0 +add test 10.10.249.1 +add test 10.10.249.10 +add test 10.10.249.100 +add test 10.10.249.101 +add test 10.10.249.102 +add test 10.10.249.103 +add test 10.10.249.104 +add test 10.10.249.105 +add test 10.10.249.106 +add test 10.10.249.107 +add test 10.10.249.108 +add test 10.10.249.109 +add test 10.10.249.11 +add test 10.10.249.110 +add test 10.10.249.111 +add test 10.10.249.112 +add test 10.10.249.113 +add test 10.10.249.114 +add test 10.10.249.115 +add test 10.10.249.116 +add test 10.10.249.117 +add test 10.10.249.118 +add test 10.10.249.119 +add test 10.10.249.12 +add test 10.10.249.120 +add test 10.10.249.121 +add test 10.10.249.122 +add test 10.10.249.123 +add test 10.10.249.124 +add test 10.10.249.125 +add test 10.10.249.126 +add test 10.10.249.127 +add test 10.10.249.128 +add test 10.10.249.129 +add test 10.10.249.13 +add test 10.10.249.130 +add test 10.10.249.131 +add test 10.10.249.132 +add test 10.10.249.133 +add test 10.10.249.134 +add test 10.10.249.135 +add test 10.10.249.136 +add test 10.10.249.137 +add test 10.10.249.138 +add test 10.10.249.139 +add test 10.10.249.14 +add test 10.10.249.140 +add test 10.10.249.141 +add test 10.10.249.142 +add test 10.10.249.143 +add test 10.10.249.144 +add test 10.10.249.145 +add test 10.10.249.146 +add test 10.10.249.147 +add test 10.10.249.148 +add test 10.10.249.149 +add test 10.10.249.15 +add test 10.10.249.150 +add test 10.10.249.151 +add test 10.10.249.152 +add test 10.10.249.153 +add test 10.10.249.154 +add test 10.10.249.155 +add test 10.10.249.156 +add test 10.10.249.157 +add test 10.10.249.158 +add test 10.10.249.159 +add test 10.10.249.16 +add test 10.10.249.160 +add test 10.10.249.161 +add test 10.10.249.162 +add test 10.10.249.163 +add test 10.10.249.164 +add test 10.10.249.165 +add test 10.10.249.166 +add test 10.10.249.167 +add test 10.10.249.168 +add test 10.10.249.169 +add test 10.10.249.17 +add test 10.10.249.170 +add test 10.10.249.171 +add test 10.10.249.172 +add test 10.10.249.173 +add test 10.10.249.174 +add test 10.10.249.175 +add test 10.10.249.176 +add test 10.10.249.177 +add test 10.10.249.178 +add test 10.10.249.179 +add test 10.10.249.18 +add test 10.10.249.180 +add test 10.10.249.181 +add test 10.10.249.182 +add test 10.10.249.183 +add test 10.10.249.184 +add test 10.10.249.185 +add test 10.10.249.186 +add test 10.10.249.187 +add test 10.10.249.188 +add test 10.10.249.189 +add test 10.10.249.19 +add test 10.10.249.190 +add test 10.10.249.191 +add test 10.10.249.192 +add test 10.10.249.193 +add test 10.10.249.194 +add test 10.10.249.195 +add test 10.10.249.196 +add test 10.10.249.197 +add test 10.10.249.198 +add test 10.10.249.199 +add test 10.10.249.2 +add test 10.10.249.20 +add test 10.10.249.200 +add test 10.10.249.201 +add test 10.10.249.202 +add test 10.10.249.203 +add test 10.10.249.204 +add test 10.10.249.205 +add test 10.10.249.206 +add test 10.10.249.207 +add test 10.10.249.208 +add test 10.10.249.209 +add test 10.10.249.21 +add test 10.10.249.210 +add test 10.10.249.211 +add test 10.10.249.212 +add test 10.10.249.213 +add test 10.10.249.214 +add test 10.10.249.215 +add test 10.10.249.216 +add test 10.10.249.217 +add test 10.10.249.218 +add test 10.10.249.219 +add test 10.10.249.22 +add test 10.10.249.220 +add test 10.10.249.221 +add test 10.10.249.222 +add test 10.10.249.223 +add test 10.10.249.224 +add test 10.10.249.225 +add test 10.10.249.226 +add test 10.10.249.227 +add test 10.10.249.228 +add test 10.10.249.229 +add test 10.10.249.23 +add test 10.10.249.230 +add test 10.10.249.231 +add test 10.10.249.232 +add test 10.10.249.233 +add test 10.10.249.234 +add test 10.10.249.235 +add test 10.10.249.236 +add test 10.10.249.237 +add test 10.10.249.238 +add test 10.10.249.239 +add test 10.10.249.24 +add test 10.10.249.240 +add test 10.10.249.241 +add test 10.10.249.242 +add test 10.10.249.243 +add test 10.10.249.244 +add test 10.10.249.245 +add test 10.10.249.246 +add test 10.10.249.247 +add test 10.10.249.248 +add test 10.10.249.249 +add test 10.10.249.25 +add test 10.10.249.250 +add test 10.10.249.251 +add test 10.10.249.252 +add test 10.10.249.253 +add test 10.10.249.254 +add test 10.10.249.255 +add test 10.10.249.26 +add test 10.10.249.27 +add test 10.10.249.28 +add test 10.10.249.29 +add test 10.10.249.3 +add test 10.10.249.30 +add test 10.10.249.31 +add test 10.10.249.32 +add test 10.10.249.33 +add test 10.10.249.34 +add test 10.10.249.35 +add test 10.10.249.36 +add test 10.10.249.37 +add test 10.10.249.38 +add test 10.10.249.39 +add test 10.10.249.4 +add test 10.10.249.40 +add test 10.10.249.41 +add test 10.10.249.42 +add test 10.10.249.43 +add test 10.10.249.44 +add test 10.10.249.45 +add test 10.10.249.46 +add test 10.10.249.47 +add test 10.10.249.48 +add test 10.10.249.49 +add test 10.10.249.5 +add test 10.10.249.50 +add test 10.10.249.51 +add test 10.10.249.52 +add test 10.10.249.53 +add test 10.10.249.54 +add test 10.10.249.55 +add test 10.10.249.56 +add test 10.10.249.57 +add test 10.10.249.58 +add test 10.10.249.59 +add test 10.10.249.6 +add test 10.10.249.60 +add test 10.10.249.61 +add test 10.10.249.62 +add test 10.10.249.63 +add test 10.10.249.64 +add test 10.10.249.65 +add test 10.10.249.66 +add test 10.10.249.67 +add test 10.10.249.68 +add test 10.10.249.69 +add test 10.10.249.7 +add test 10.10.249.70 +add test 10.10.249.71 +add test 10.10.249.72 +add test 10.10.249.73 +add test 10.10.249.74 +add test 10.10.249.75 +add test 10.10.249.76 +add test 10.10.249.77 +add test 10.10.249.78 +add test 10.10.249.79 +add test 10.10.249.8 +add test 10.10.249.80 +add test 10.10.249.81 +add test 10.10.249.82 +add test 10.10.249.83 +add test 10.10.249.84 +add test 10.10.249.85 +add test 10.10.249.86 +add test 10.10.249.87 +add test 10.10.249.88 +add test 10.10.249.89 +add test 10.10.249.9 +add test 10.10.249.90 +add test 10.10.249.91 +add test 10.10.249.92 +add test 10.10.249.93 +add test 10.10.249.94 +add test 10.10.249.95 +add test 10.10.249.96 +add test 10.10.249.97 +add test 10.10.249.98 +add test 10.10.249.99 +add test 10.10.25.0 +add test 10.10.25.1 +add test 10.10.25.10 +add test 10.10.25.100 +add test 10.10.25.101 +add test 10.10.25.102 +add test 10.10.25.103 +add test 10.10.25.104 +add test 10.10.25.105 +add test 10.10.25.106 +add test 10.10.25.107 +add test 10.10.25.108 +add test 10.10.25.109 +add test 10.10.25.11 +add test 10.10.25.110 +add test 10.10.25.111 +add test 10.10.25.112 +add test 10.10.25.113 +add test 10.10.25.114 +add test 10.10.25.115 +add test 10.10.25.116 +add test 10.10.25.117 +add test 10.10.25.118 +add test 10.10.25.119 +add test 10.10.25.12 +add test 10.10.25.120 +add test 10.10.25.121 +add test 10.10.25.122 +add test 10.10.25.123 +add test 10.10.25.124 +add test 10.10.25.125 +add test 10.10.25.126 +add test 10.10.25.127 +add test 10.10.25.128 +add test 10.10.25.129 +add test 10.10.25.13 +add test 10.10.25.130 +add test 10.10.25.131 +add test 10.10.25.132 +add test 10.10.25.133 +add test 10.10.25.134 +add test 10.10.25.135 +add test 10.10.25.136 +add test 10.10.25.137 +add test 10.10.25.138 +add test 10.10.25.139 +add test 10.10.25.14 +add test 10.10.25.140 +add test 10.10.25.141 +add test 10.10.25.142 +add test 10.10.25.143 +add test 10.10.25.144 +add test 10.10.25.145 +add test 10.10.25.146 +add test 10.10.25.147 +add test 10.10.25.148 +add test 10.10.25.149 +add test 10.10.25.15 +add test 10.10.25.150 +add test 10.10.25.151 +add test 10.10.25.152 +add test 10.10.25.153 +add test 10.10.25.154 +add test 10.10.25.155 +add test 10.10.25.156 +add test 10.10.25.157 +add test 10.10.25.158 +add test 10.10.25.159 +add test 10.10.25.16 +add test 10.10.25.160 +add test 10.10.25.161 +add test 10.10.25.162 +add test 10.10.25.163 +add test 10.10.25.164 +add test 10.10.25.165 +add test 10.10.25.166 +add test 10.10.25.167 +add test 10.10.25.168 +add test 10.10.25.169 +add test 10.10.25.17 +add test 10.10.25.170 +add test 10.10.25.171 +add test 10.10.25.172 +add test 10.10.25.173 +add test 10.10.25.174 +add test 10.10.25.175 +add test 10.10.25.176 +add test 10.10.25.177 +add test 10.10.25.178 +add test 10.10.25.179 +add test 10.10.25.18 +add test 10.10.25.180 +add test 10.10.25.181 +add test 10.10.25.182 +add test 10.10.25.183 +add test 10.10.25.184 +add test 10.10.25.185 +add test 10.10.25.186 +add test 10.10.25.187 +add test 10.10.25.188 +add test 10.10.25.189 +add test 10.10.25.19 +add test 10.10.25.190 +add test 10.10.25.191 +add test 10.10.25.192 +add test 10.10.25.193 +add test 10.10.25.194 +add test 10.10.25.195 +add test 10.10.25.196 +add test 10.10.25.197 +add test 10.10.25.198 +add test 10.10.25.199 +add test 10.10.25.2 +add test 10.10.25.20 +add test 10.10.25.200 +add test 10.10.25.201 +add test 10.10.25.202 +add test 10.10.25.203 +add test 10.10.25.204 +add test 10.10.25.205 +add test 10.10.25.206 +add test 10.10.25.207 +add test 10.10.25.208 +add test 10.10.25.209 +add test 10.10.25.21 +add test 10.10.25.210 +add test 10.10.25.211 +add test 10.10.25.212 +add test 10.10.25.213 +add test 10.10.25.214 +add test 10.10.25.215 +add test 10.10.25.216 +add test 10.10.25.217 +add test 10.10.25.218 +add test 10.10.25.219 +add test 10.10.25.22 +add test 10.10.25.220 +add test 10.10.25.221 +add test 10.10.25.222 +add test 10.10.25.223 +add test 10.10.25.224 +add test 10.10.25.225 +add test 10.10.25.226 +add test 10.10.25.227 +add test 10.10.25.228 +add test 10.10.25.229 +add test 10.10.25.23 +add test 10.10.25.230 +add test 10.10.25.231 +add test 10.10.25.232 +add test 10.10.25.233 +add test 10.10.25.234 +add test 10.10.25.235 +add test 10.10.25.236 +add test 10.10.25.237 +add test 10.10.25.238 +add test 10.10.25.239 +add test 10.10.25.24 +add test 10.10.25.240 +add test 10.10.25.241 +add test 10.10.25.242 +add test 10.10.25.243 +add test 10.10.25.244 +add test 10.10.25.245 +add test 10.10.25.246 +add test 10.10.25.247 +add test 10.10.25.248 +add test 10.10.25.249 +add test 10.10.25.25 +add test 10.10.25.250 +add test 10.10.25.251 +add test 10.10.25.252 +add test 10.10.25.253 +add test 10.10.25.254 +add test 10.10.25.255 +add test 10.10.25.26 +add test 10.10.25.27 +add test 10.10.25.28 +add test 10.10.25.29 +add test 10.10.25.3 +add test 10.10.25.30 +add test 10.10.25.31 +add test 10.10.25.32 +add test 10.10.25.33 +add test 10.10.25.34 +add test 10.10.25.35 +add test 10.10.25.36 +add test 10.10.25.37 +add test 10.10.25.38 +add test 10.10.25.39 +add test 10.10.25.4 +add test 10.10.25.40 +add test 10.10.25.41 +add test 10.10.25.42 +add test 10.10.25.43 +add test 10.10.25.44 +add test 10.10.25.45 +add test 10.10.25.46 +add test 10.10.25.47 +add test 10.10.25.48 +add test 10.10.25.49 +add test 10.10.25.5 +add test 10.10.25.50 +add test 10.10.25.51 +add test 10.10.25.52 +add test 10.10.25.53 +add test 10.10.25.54 +add test 10.10.25.55 +add test 10.10.25.56 +add test 10.10.25.57 +add test 10.10.25.58 +add test 10.10.25.59 +add test 10.10.25.6 +add test 10.10.25.60 +add test 10.10.25.61 +add test 10.10.25.62 +add test 10.10.25.63 +add test 10.10.25.64 +add test 10.10.25.65 +add test 10.10.25.66 +add test 10.10.25.67 +add test 10.10.25.68 +add test 10.10.25.69 +add test 10.10.25.7 +add test 10.10.25.70 +add test 10.10.25.71 +add test 10.10.25.72 +add test 10.10.25.73 +add test 10.10.25.74 +add test 10.10.25.75 +add test 10.10.25.76 +add test 10.10.25.77 +add test 10.10.25.78 +add test 10.10.25.79 +add test 10.10.25.8 +add test 10.10.25.80 +add test 10.10.25.81 +add test 10.10.25.82 +add test 10.10.25.83 +add test 10.10.25.84 +add test 10.10.25.85 +add test 10.10.25.86 +add test 10.10.25.87 +add test 10.10.25.88 +add test 10.10.25.89 +add test 10.10.25.9 +add test 10.10.25.90 +add test 10.10.25.91 +add test 10.10.25.92 +add test 10.10.25.93 +add test 10.10.25.94 +add test 10.10.25.95 +add test 10.10.25.96 +add test 10.10.25.97 +add test 10.10.25.98 +add test 10.10.25.99 +add test 10.10.250.0 +add test 10.10.250.1 +add test 10.10.250.10 +add test 10.10.250.100 +add test 10.10.250.101 +add test 10.10.250.102 +add test 10.10.250.103 +add test 10.10.250.104 +add test 10.10.250.105 +add test 10.10.250.106 +add test 10.10.250.107 +add test 10.10.250.108 +add test 10.10.250.109 +add test 10.10.250.11 +add test 10.10.250.110 +add test 10.10.250.111 +add test 10.10.250.112 +add test 10.10.250.113 +add test 10.10.250.114 +add test 10.10.250.115 +add test 10.10.250.116 +add test 10.10.250.117 +add test 10.10.250.118 +add test 10.10.250.119 +add test 10.10.250.12 +add test 10.10.250.120 +add test 10.10.250.121 +add test 10.10.250.122 +add test 10.10.250.123 +add test 10.10.250.124 +add test 10.10.250.125 +add test 10.10.250.126 +add test 10.10.250.127 +add test 10.10.250.128 +add test 10.10.250.129 +add test 10.10.250.13 +add test 10.10.250.130 +add test 10.10.250.131 +add test 10.10.250.132 +add test 10.10.250.133 +add test 10.10.250.134 +add test 10.10.250.135 +add test 10.10.250.136 +add test 10.10.250.137 +add test 10.10.250.138 +add test 10.10.250.139 +add test 10.10.250.14 +add test 10.10.250.140 +add test 10.10.250.141 +add test 10.10.250.142 +add test 10.10.250.143 +add test 10.10.250.144 +add test 10.10.250.145 +add test 10.10.250.146 +add test 10.10.250.147 +add test 10.10.250.148 +add test 10.10.250.149 +add test 10.10.250.15 +add test 10.10.250.150 +add test 10.10.250.151 +add test 10.10.250.152 +add test 10.10.250.153 +add test 10.10.250.154 +add test 10.10.250.155 +add test 10.10.250.156 +add test 10.10.250.157 +add test 10.10.250.158 +add test 10.10.250.159 +add test 10.10.250.16 +add test 10.10.250.160 +add test 10.10.250.161 +add test 10.10.250.162 +add test 10.10.250.163 +add test 10.10.250.164 +add test 10.10.250.165 +add test 10.10.250.166 +add test 10.10.250.167 +add test 10.10.250.168 +add test 10.10.250.169 +add test 10.10.250.17 +add test 10.10.250.170 +add test 10.10.250.171 +add test 10.10.250.172 +add test 10.10.250.173 +add test 10.10.250.174 +add test 10.10.250.175 +add test 10.10.250.176 +add test 10.10.250.177 +add test 10.10.250.178 +add test 10.10.250.179 +add test 10.10.250.18 +add test 10.10.250.180 +add test 10.10.250.181 +add test 10.10.250.182 +add test 10.10.250.183 +add test 10.10.250.184 +add test 10.10.250.185 +add test 10.10.250.186 +add test 10.10.250.187 +add test 10.10.250.188 +add test 10.10.250.189 +add test 10.10.250.19 +add test 10.10.250.190 +add test 10.10.250.191 +add test 10.10.250.192 +add test 10.10.250.193 +add test 10.10.250.194 +add test 10.10.250.195 +add test 10.10.250.196 +add test 10.10.250.197 +add test 10.10.250.198 +add test 10.10.250.199 +add test 10.10.250.2 +add test 10.10.250.20 +add test 10.10.250.200 +add test 10.10.250.201 +add test 10.10.250.202 +add test 10.10.250.203 +add test 10.10.250.204 +add test 10.10.250.205 +add test 10.10.250.206 +add test 10.10.250.207 +add test 10.10.250.208 +add test 10.10.250.209 +add test 10.10.250.21 +add test 10.10.250.210 +add test 10.10.250.211 +add test 10.10.250.212 +add test 10.10.250.213 +add test 10.10.250.214 +add test 10.10.250.215 +add test 10.10.250.216 +add test 10.10.250.217 +add test 10.10.250.218 +add test 10.10.250.219 +add test 10.10.250.22 +add test 10.10.250.220 +add test 10.10.250.221 +add test 10.10.250.222 +add test 10.10.250.223 +add test 10.10.250.224 +add test 10.10.250.225 +add test 10.10.250.226 +add test 10.10.250.227 +add test 10.10.250.228 +add test 10.10.250.229 +add test 10.10.250.23 +add test 10.10.250.230 +add test 10.10.250.231 +add test 10.10.250.232 +add test 10.10.250.233 +add test 10.10.250.234 +add test 10.10.250.235 +add test 10.10.250.236 +add test 10.10.250.237 +add test 10.10.250.238 +add test 10.10.250.239 +add test 10.10.250.24 +add test 10.10.250.240 +add test 10.10.250.241 +add test 10.10.250.242 +add test 10.10.250.243 +add test 10.10.250.244 +add test 10.10.250.245 +add test 10.10.250.246 +add test 10.10.250.247 +add test 10.10.250.248 +add test 10.10.250.249 +add test 10.10.250.25 +add test 10.10.250.250 +add test 10.10.250.251 +add test 10.10.250.252 +add test 10.10.250.253 +add test 10.10.250.254 +add test 10.10.250.255 +add test 10.10.250.26 +add test 10.10.250.27 +add test 10.10.250.28 +add test 10.10.250.29 +add test 10.10.250.3 +add test 10.10.250.30 +add test 10.10.250.31 +add test 10.10.250.32 +add test 10.10.250.33 +add test 10.10.250.34 +add test 10.10.250.35 +add test 10.10.250.36 +add test 10.10.250.37 +add test 10.10.250.38 +add test 10.10.250.39 +add test 10.10.250.4 +add test 10.10.250.40 +add test 10.10.250.41 +add test 10.10.250.42 +add test 10.10.250.43 +add test 10.10.250.44 +add test 10.10.250.45 +add test 10.10.250.46 +add test 10.10.250.47 +add test 10.10.250.48 +add test 10.10.250.49 +add test 10.10.250.5 +add test 10.10.250.50 +add test 10.10.250.51 +add test 10.10.250.52 +add test 10.10.250.53 +add test 10.10.250.54 +add test 10.10.250.55 +add test 10.10.250.56 +add test 10.10.250.57 +add test 10.10.250.58 +add test 10.10.250.59 +add test 10.10.250.6 +add test 10.10.250.60 +add test 10.10.250.61 +add test 10.10.250.62 +add test 10.10.250.63 +add test 10.10.250.64 +add test 10.10.250.65 +add test 10.10.250.66 +add test 10.10.250.67 +add test 10.10.250.68 +add test 10.10.250.69 +add test 10.10.250.7 +add test 10.10.250.70 +add test 10.10.250.71 +add test 10.10.250.72 +add test 10.10.250.73 +add test 10.10.250.74 +add test 10.10.250.75 +add test 10.10.250.76 +add test 10.10.250.77 +add test 10.10.250.78 +add test 10.10.250.79 +add test 10.10.250.8 +add test 10.10.250.80 +add test 10.10.250.81 +add test 10.10.250.82 +add test 10.10.250.83 +add test 10.10.250.84 +add test 10.10.250.85 +add test 10.10.250.86 +add test 10.10.250.87 +add test 10.10.250.88 +add test 10.10.250.89 +add test 10.10.250.9 +add test 10.10.250.90 +add test 10.10.250.91 +add test 10.10.250.92 +add test 10.10.250.93 +add test 10.10.250.94 +add test 10.10.250.95 +add test 10.10.250.96 +add test 10.10.250.97 +add test 10.10.250.98 +add test 10.10.250.99 +add test 10.10.251.0 +add test 10.10.251.1 +add test 10.10.251.10 +add test 10.10.251.100 +add test 10.10.251.101 +add test 10.10.251.102 +add test 10.10.251.103 +add test 10.10.251.104 +add test 10.10.251.105 +add test 10.10.251.106 +add test 10.10.251.107 +add test 10.10.251.108 +add test 10.10.251.109 +add test 10.10.251.11 +add test 10.10.251.110 +add test 10.10.251.111 +add test 10.10.251.112 +add test 10.10.251.113 +add test 10.10.251.114 +add test 10.10.251.115 +add test 10.10.251.116 +add test 10.10.251.117 +add test 10.10.251.118 +add test 10.10.251.119 +add test 10.10.251.12 +add test 10.10.251.120 +add test 10.10.251.121 +add test 10.10.251.122 +add test 10.10.251.123 +add test 10.10.251.124 +add test 10.10.251.125 +add test 10.10.251.126 +add test 10.10.251.127 +add test 10.10.251.128 +add test 10.10.251.129 +add test 10.10.251.13 +add test 10.10.251.130 +add test 10.10.251.131 +add test 10.10.251.132 +add test 10.10.251.133 +add test 10.10.251.134 +add test 10.10.251.135 +add test 10.10.251.136 +add test 10.10.251.137 +add test 10.10.251.138 +add test 10.10.251.139 +add test 10.10.251.14 +add test 10.10.251.140 +add test 10.10.251.141 +add test 10.10.251.142 +add test 10.10.251.143 +add test 10.10.251.144 +add test 10.10.251.145 +add test 10.10.251.146 +add test 10.10.251.147 +add test 10.10.251.148 +add test 10.10.251.149 +add test 10.10.251.15 +add test 10.10.251.150 +add test 10.10.251.151 +add test 10.10.251.152 +add test 10.10.251.153 +add test 10.10.251.154 +add test 10.10.251.155 +add test 10.10.251.156 +add test 10.10.251.157 +add test 10.10.251.158 +add test 10.10.251.159 +add test 10.10.251.16 +add test 10.10.251.160 +add test 10.10.251.161 +add test 10.10.251.162 +add test 10.10.251.163 +add test 10.10.251.164 +add test 10.10.251.165 +add test 10.10.251.166 +add test 10.10.251.167 +add test 10.10.251.168 +add test 10.10.251.169 +add test 10.10.251.17 +add test 10.10.251.170 +add test 10.10.251.171 +add test 10.10.251.172 +add test 10.10.251.173 +add test 10.10.251.174 +add test 10.10.251.175 +add test 10.10.251.176 +add test 10.10.251.177 +add test 10.10.251.178 +add test 10.10.251.179 +add test 10.10.251.18 +add test 10.10.251.180 +add test 10.10.251.181 +add test 10.10.251.182 +add test 10.10.251.183 +add test 10.10.251.184 +add test 10.10.251.185 +add test 10.10.251.186 +add test 10.10.251.187 +add test 10.10.251.188 +add test 10.10.251.189 +add test 10.10.251.19 +add test 10.10.251.190 +add test 10.10.251.191 +add test 10.10.251.192 +add test 10.10.251.193 +add test 10.10.251.194 +add test 10.10.251.195 +add test 10.10.251.196 +add test 10.10.251.197 +add test 10.10.251.198 +add test 10.10.251.199 +add test 10.10.251.2 +add test 10.10.251.20 +add test 10.10.251.200 +add test 10.10.251.201 +add test 10.10.251.202 +add test 10.10.251.203 +add test 10.10.251.204 +add test 10.10.251.205 +add test 10.10.251.206 +add test 10.10.251.207 +add test 10.10.251.208 +add test 10.10.251.209 +add test 10.10.251.21 +add test 10.10.251.210 +add test 10.10.251.211 +add test 10.10.251.212 +add test 10.10.251.213 +add test 10.10.251.214 +add test 10.10.251.215 +add test 10.10.251.216 +add test 10.10.251.217 +add test 10.10.251.218 +add test 10.10.251.219 +add test 10.10.251.22 +add test 10.10.251.220 +add test 10.10.251.221 +add test 10.10.251.222 +add test 10.10.251.223 +add test 10.10.251.224 +add test 10.10.251.225 +add test 10.10.251.226 +add test 10.10.251.227 +add test 10.10.251.228 +add test 10.10.251.229 +add test 10.10.251.23 +add test 10.10.251.230 +add test 10.10.251.231 +add test 10.10.251.232 +add test 10.10.251.233 +add test 10.10.251.234 +add test 10.10.251.235 +add test 10.10.251.236 +add test 10.10.251.237 +add test 10.10.251.238 +add test 10.10.251.239 +add test 10.10.251.24 +add test 10.10.251.240 +add test 10.10.251.241 +add test 10.10.251.242 +add test 10.10.251.243 +add test 10.10.251.244 +add test 10.10.251.245 +add test 10.10.251.246 +add test 10.10.251.247 +add test 10.10.251.248 +add test 10.10.251.249 +add test 10.10.251.25 +add test 10.10.251.250 +add test 10.10.251.251 +add test 10.10.251.252 +add test 10.10.251.253 +add test 10.10.251.254 +add test 10.10.251.255 +add test 10.10.251.26 +add test 10.10.251.27 +add test 10.10.251.28 +add test 10.10.251.29 +add test 10.10.251.3 +add test 10.10.251.30 +add test 10.10.251.31 +add test 10.10.251.32 +add test 10.10.251.33 +add test 10.10.251.34 +add test 10.10.251.35 +add test 10.10.251.36 +add test 10.10.251.37 +add test 10.10.251.38 +add test 10.10.251.39 +add test 10.10.251.4 +add test 10.10.251.40 +add test 10.10.251.41 +add test 10.10.251.42 +add test 10.10.251.43 +add test 10.10.251.44 +add test 10.10.251.45 +add test 10.10.251.46 +add test 10.10.251.47 +add test 10.10.251.48 +add test 10.10.251.49 +add test 10.10.251.5 +add test 10.10.251.50 +add test 10.10.251.51 +add test 10.10.251.52 +add test 10.10.251.53 +add test 10.10.251.54 +add test 10.10.251.55 +add test 10.10.251.56 +add test 10.10.251.57 +add test 10.10.251.58 +add test 10.10.251.59 +add test 10.10.251.6 +add test 10.10.251.60 +add test 10.10.251.61 +add test 10.10.251.62 +add test 10.10.251.63 +add test 10.10.251.64 +add test 10.10.251.65 +add test 10.10.251.66 +add test 10.10.251.67 +add test 10.10.251.68 +add test 10.10.251.69 +add test 10.10.251.7 +add test 10.10.251.70 +add test 10.10.251.71 +add test 10.10.251.72 +add test 10.10.251.73 +add test 10.10.251.74 +add test 10.10.251.75 +add test 10.10.251.76 +add test 10.10.251.77 +add test 10.10.251.78 +add test 10.10.251.79 +add test 10.10.251.8 +add test 10.10.251.80 +add test 10.10.251.81 +add test 10.10.251.82 +add test 10.10.251.83 +add test 10.10.251.84 +add test 10.10.251.85 +add test 10.10.251.86 +add test 10.10.251.87 +add test 10.10.251.88 +add test 10.10.251.89 +add test 10.10.251.9 +add test 10.10.251.90 +add test 10.10.251.91 +add test 10.10.251.92 +add test 10.10.251.93 +add test 10.10.251.94 +add test 10.10.251.95 +add test 10.10.251.96 +add test 10.10.251.97 +add test 10.10.251.98 +add test 10.10.251.99 +add test 10.10.252.0 +add test 10.10.252.1 +add test 10.10.252.10 +add test 10.10.252.100 +add test 10.10.252.101 +add test 10.10.252.102 +add test 10.10.252.103 +add test 10.10.252.104 +add test 10.10.252.105 +add test 10.10.252.106 +add test 10.10.252.107 +add test 10.10.252.108 +add test 10.10.252.109 +add test 10.10.252.11 +add test 10.10.252.110 +add test 10.10.252.111 +add test 10.10.252.112 +add test 10.10.252.113 +add test 10.10.252.114 +add test 10.10.252.115 +add test 10.10.252.116 +add test 10.10.252.117 +add test 10.10.252.118 +add test 10.10.252.119 +add test 10.10.252.12 +add test 10.10.252.120 +add test 10.10.252.121 +add test 10.10.252.122 +add test 10.10.252.123 +add test 10.10.252.124 +add test 10.10.252.125 +add test 10.10.252.126 +add test 10.10.252.127 +add test 10.10.252.128 +add test 10.10.252.129 +add test 10.10.252.13 +add test 10.10.252.130 +add test 10.10.252.131 +add test 10.10.252.132 +add test 10.10.252.133 +add test 10.10.252.134 +add test 10.10.252.135 +add test 10.10.252.136 +add test 10.10.252.137 +add test 10.10.252.138 +add test 10.10.252.139 +add test 10.10.252.14 +add test 10.10.252.140 +add test 10.10.252.141 +add test 10.10.252.142 +add test 10.10.252.143 +add test 10.10.252.144 +add test 10.10.252.145 +add test 10.10.252.146 +add test 10.10.252.147 +add test 10.10.252.148 +add test 10.10.252.149 +add test 10.10.252.15 +add test 10.10.252.150 +add test 10.10.252.151 +add test 10.10.252.152 +add test 10.10.252.153 +add test 10.10.252.154 +add test 10.10.252.155 +add test 10.10.252.156 +add test 10.10.252.157 +add test 10.10.252.158 +add test 10.10.252.159 +add test 10.10.252.16 +add test 10.10.252.160 +add test 10.10.252.161 +add test 10.10.252.162 +add test 10.10.252.163 +add test 10.10.252.164 +add test 10.10.252.165 +add test 10.10.252.166 +add test 10.10.252.167 +add test 10.10.252.168 +add test 10.10.252.169 +add test 10.10.252.17 +add test 10.10.252.170 +add test 10.10.252.171 +add test 10.10.252.172 +add test 10.10.252.173 +add test 10.10.252.174 +add test 10.10.252.175 +add test 10.10.252.176 +add test 10.10.252.177 +add test 10.10.252.178 +add test 10.10.252.179 +add test 10.10.252.18 +add test 10.10.252.180 +add test 10.10.252.181 +add test 10.10.252.182 +add test 10.10.252.183 +add test 10.10.252.184 +add test 10.10.252.185 +add test 10.10.252.186 +add test 10.10.252.187 +add test 10.10.252.188 +add test 10.10.252.189 +add test 10.10.252.19 +add test 10.10.252.190 +add test 10.10.252.191 +add test 10.10.252.192 +add test 10.10.252.193 +add test 10.10.252.194 +add test 10.10.252.195 +add test 10.10.252.196 +add test 10.10.252.197 +add test 10.10.252.198 +add test 10.10.252.199 +add test 10.10.252.2 +add test 10.10.252.20 +add test 10.10.252.200 +add test 10.10.252.201 +add test 10.10.252.202 +add test 10.10.252.203 +add test 10.10.252.204 +add test 10.10.252.205 +add test 10.10.252.206 +add test 10.10.252.207 +add test 10.10.252.208 +add test 10.10.252.209 +add test 10.10.252.21 +add test 10.10.252.210 +add test 10.10.252.211 +add test 10.10.252.212 +add test 10.10.252.213 +add test 10.10.252.214 +add test 10.10.252.215 +add test 10.10.252.216 +add test 10.10.252.217 +add test 10.10.252.218 +add test 10.10.252.219 +add test 10.10.252.22 +add test 10.10.252.220 +add test 10.10.252.221 +add test 10.10.252.222 +add test 10.10.252.223 +add test 10.10.252.224 +add test 10.10.252.225 +add test 10.10.252.226 +add test 10.10.252.227 +add test 10.10.252.228 +add test 10.10.252.229 +add test 10.10.252.23 +add test 10.10.252.230 +add test 10.10.252.231 +add test 10.10.252.232 +add test 10.10.252.233 +add test 10.10.252.234 +add test 10.10.252.235 +add test 10.10.252.236 +add test 10.10.252.237 +add test 10.10.252.238 +add test 10.10.252.239 +add test 10.10.252.24 +add test 10.10.252.240 +add test 10.10.252.241 +add test 10.10.252.242 +add test 10.10.252.243 +add test 10.10.252.244 +add test 10.10.252.245 +add test 10.10.252.246 +add test 10.10.252.247 +add test 10.10.252.248 +add test 10.10.252.249 +add test 10.10.252.25 +add test 10.10.252.250 +add test 10.10.252.251 +add test 10.10.252.252 +add test 10.10.252.253 +add test 10.10.252.254 +add test 10.10.252.255 +add test 10.10.252.26 +add test 10.10.252.27 +add test 10.10.252.28 +add test 10.10.252.29 +add test 10.10.252.3 +add test 10.10.252.30 +add test 10.10.252.31 +add test 10.10.252.32 +add test 10.10.252.33 +add test 10.10.252.34 +add test 10.10.252.35 +add test 10.10.252.36 +add test 10.10.252.37 +add test 10.10.252.38 +add test 10.10.252.39 +add test 10.10.252.4 +add test 10.10.252.40 +add test 10.10.252.41 +add test 10.10.252.42 +add test 10.10.252.43 +add test 10.10.252.44 +add test 10.10.252.45 +add test 10.10.252.46 +add test 10.10.252.47 +add test 10.10.252.48 +add test 10.10.252.49 +add test 10.10.252.5 +add test 10.10.252.50 +add test 10.10.252.51 +add test 10.10.252.52 +add test 10.10.252.53 +add test 10.10.252.54 +add test 10.10.252.55 +add test 10.10.252.56 +add test 10.10.252.57 +add test 10.10.252.58 +add test 10.10.252.59 +add test 10.10.252.6 +add test 10.10.252.60 +add test 10.10.252.61 +add test 10.10.252.62 +add test 10.10.252.63 +add test 10.10.252.64 +add test 10.10.252.65 +add test 10.10.252.66 +add test 10.10.252.67 +add test 10.10.252.68 +add test 10.10.252.69 +add test 10.10.252.7 +add test 10.10.252.70 +add test 10.10.252.71 +add test 10.10.252.72 +add test 10.10.252.73 +add test 10.10.252.74 +add test 10.10.252.75 +add test 10.10.252.76 +add test 10.10.252.77 +add test 10.10.252.78 +add test 10.10.252.79 +add test 10.10.252.8 +add test 10.10.252.80 +add test 10.10.252.81 +add test 10.10.252.82 +add test 10.10.252.83 +add test 10.10.252.84 +add test 10.10.252.85 +add test 10.10.252.86 +add test 10.10.252.87 +add test 10.10.252.88 +add test 10.10.252.89 +add test 10.10.252.9 +add test 10.10.252.90 +add test 10.10.252.91 +add test 10.10.252.92 +add test 10.10.252.93 +add test 10.10.252.94 +add test 10.10.252.95 +add test 10.10.252.96 +add test 10.10.252.97 +add test 10.10.252.98 +add test 10.10.252.99 +add test 10.10.253.0 +add test 10.10.253.1 +add test 10.10.253.10 +add test 10.10.253.100 +add test 10.10.253.101 +add test 10.10.253.102 +add test 10.10.253.103 +add test 10.10.253.104 +add test 10.10.253.105 +add test 10.10.253.106 +add test 10.10.253.107 +add test 10.10.253.108 +add test 10.10.253.109 +add test 10.10.253.11 +add test 10.10.253.110 +add test 10.10.253.111 +add test 10.10.253.112 +add test 10.10.253.113 +add test 10.10.253.114 +add test 10.10.253.115 +add test 10.10.253.116 +add test 10.10.253.117 +add test 10.10.253.118 +add test 10.10.253.119 +add test 10.10.253.12 +add test 10.10.253.120 +add test 10.10.253.121 +add test 10.10.253.122 +add test 10.10.253.123 +add test 10.10.253.124 +add test 10.10.253.125 +add test 10.10.253.126 +add test 10.10.253.127 +add test 10.10.253.128 +add test 10.10.253.129 +add test 10.10.253.13 +add test 10.10.253.130 +add test 10.10.253.131 +add test 10.10.253.132 +add test 10.10.253.133 +add test 10.10.253.134 +add test 10.10.253.135 +add test 10.10.253.136 +add test 10.10.253.137 +add test 10.10.253.138 +add test 10.10.253.139 +add test 10.10.253.14 +add test 10.10.253.140 +add test 10.10.253.141 +add test 10.10.253.142 +add test 10.10.253.143 +add test 10.10.253.144 +add test 10.10.253.145 +add test 10.10.253.146 +add test 10.10.253.147 +add test 10.10.253.148 +add test 10.10.253.149 +add test 10.10.253.15 +add test 10.10.253.150 +add test 10.10.253.151 +add test 10.10.253.152 +add test 10.10.253.153 +add test 10.10.253.154 +add test 10.10.253.155 +add test 10.10.253.156 +add test 10.10.253.157 +add test 10.10.253.158 +add test 10.10.253.159 +add test 10.10.253.16 +add test 10.10.253.160 +add test 10.10.253.161 +add test 10.10.253.162 +add test 10.10.253.163 +add test 10.10.253.164 +add test 10.10.253.165 +add test 10.10.253.166 +add test 10.10.253.167 +add test 10.10.253.168 +add test 10.10.253.169 +add test 10.10.253.17 +add test 10.10.253.170 +add test 10.10.253.171 +add test 10.10.253.172 +add test 10.10.253.173 +add test 10.10.253.174 +add test 10.10.253.175 +add test 10.10.253.176 +add test 10.10.253.177 +add test 10.10.253.178 +add test 10.10.253.179 +add test 10.10.253.18 +add test 10.10.253.180 +add test 10.10.253.181 +add test 10.10.253.182 +add test 10.10.253.183 +add test 10.10.253.184 +add test 10.10.253.185 +add test 10.10.253.186 +add test 10.10.253.187 +add test 10.10.253.188 +add test 10.10.253.189 +add test 10.10.253.19 +add test 10.10.253.190 +add test 10.10.253.191 +add test 10.10.253.192 +add test 10.10.253.193 +add test 10.10.253.194 +add test 10.10.253.195 +add test 10.10.253.196 +add test 10.10.253.197 +add test 10.10.253.198 +add test 10.10.253.199 +add test 10.10.253.2 +add test 10.10.253.20 +add test 10.10.253.200 +add test 10.10.253.201 +add test 10.10.253.202 +add test 10.10.253.203 +add test 10.10.253.204 +add test 10.10.253.205 +add test 10.10.253.206 +add test 10.10.253.207 +add test 10.10.253.208 +add test 10.10.253.209 +add test 10.10.253.21 +add test 10.10.253.210 +add test 10.10.253.211 +add test 10.10.253.212 +add test 10.10.253.213 +add test 10.10.253.214 +add test 10.10.253.215 +add test 10.10.253.216 +add test 10.10.253.217 +add test 10.10.253.218 +add test 10.10.253.219 +add test 10.10.253.22 +add test 10.10.253.220 +add test 10.10.253.221 +add test 10.10.253.222 +add test 10.10.253.223 +add test 10.10.253.224 +add test 10.10.253.225 +add test 10.10.253.226 +add test 10.10.253.227 +add test 10.10.253.228 +add test 10.10.253.229 +add test 10.10.253.23 +add test 10.10.253.230 +add test 10.10.253.231 +add test 10.10.253.232 +add test 10.10.253.233 +add test 10.10.253.234 +add test 10.10.253.235 +add test 10.10.253.236 +add test 10.10.253.237 +add test 10.10.253.238 +add test 10.10.253.239 +add test 10.10.253.24 +add test 10.10.253.240 +add test 10.10.253.241 +add test 10.10.253.242 +add test 10.10.253.243 +add test 10.10.253.244 +add test 10.10.253.245 +add test 10.10.253.246 +add test 10.10.253.247 +add test 10.10.253.248 +add test 10.10.253.249 +add test 10.10.253.25 +add test 10.10.253.250 +add test 10.10.253.251 +add test 10.10.253.252 +add test 10.10.253.253 +add test 10.10.253.254 +add test 10.10.253.255 +add test 10.10.253.26 +add test 10.10.253.27 +add test 10.10.253.28 +add test 10.10.253.29 +add test 10.10.253.3 +add test 10.10.253.30 +add test 10.10.253.31 +add test 10.10.253.32 +add test 10.10.253.33 +add test 10.10.253.34 +add test 10.10.253.35 +add test 10.10.253.36 +add test 10.10.253.37 +add test 10.10.253.38 +add test 10.10.253.39 +add test 10.10.253.4 +add test 10.10.253.40 +add test 10.10.253.41 +add test 10.10.253.42 +add test 10.10.253.43 +add test 10.10.253.44 +add test 10.10.253.45 +add test 10.10.253.46 +add test 10.10.253.47 +add test 10.10.253.48 +add test 10.10.253.49 +add test 10.10.253.5 +add test 10.10.253.50 +add test 10.10.253.51 +add test 10.10.253.52 +add test 10.10.253.53 +add test 10.10.253.54 +add test 10.10.253.55 +add test 10.10.253.56 +add test 10.10.253.57 +add test 10.10.253.58 +add test 10.10.253.59 +add test 10.10.253.6 +add test 10.10.253.60 +add test 10.10.253.61 +add test 10.10.253.62 +add test 10.10.253.63 +add test 10.10.253.64 +add test 10.10.253.65 +add test 10.10.253.66 +add test 10.10.253.67 +add test 10.10.253.68 +add test 10.10.253.69 +add test 10.10.253.7 +add test 10.10.253.70 +add test 10.10.253.71 +add test 10.10.253.72 +add test 10.10.253.73 +add test 10.10.253.74 +add test 10.10.253.75 +add test 10.10.253.76 +add test 10.10.253.77 +add test 10.10.253.78 +add test 10.10.253.79 +add test 10.10.253.8 +add test 10.10.253.80 +add test 10.10.253.81 +add test 10.10.253.82 +add test 10.10.253.83 +add test 10.10.253.84 +add test 10.10.253.85 +add test 10.10.253.86 +add test 10.10.253.87 +add test 10.10.253.88 +add test 10.10.253.89 +add test 10.10.253.9 +add test 10.10.253.90 +add test 10.10.253.91 +add test 10.10.253.92 +add test 10.10.253.93 +add test 10.10.253.94 +add test 10.10.253.95 +add test 10.10.253.96 +add test 10.10.253.97 +add test 10.10.253.98 +add test 10.10.253.99 +add test 10.10.254.0 +add test 10.10.254.1 +add test 10.10.254.10 +add test 10.10.254.100 +add test 10.10.254.101 +add test 10.10.254.102 +add test 10.10.254.103 +add test 10.10.254.104 +add test 10.10.254.105 +add test 10.10.254.106 +add test 10.10.254.107 +add test 10.10.254.108 +add test 10.10.254.109 +add test 10.10.254.11 +add test 10.10.254.110 +add test 10.10.254.111 +add test 10.10.254.112 +add test 10.10.254.113 +add test 10.10.254.114 +add test 10.10.254.115 +add test 10.10.254.116 +add test 10.10.254.117 +add test 10.10.254.118 +add test 10.10.254.119 +add test 10.10.254.12 +add test 10.10.254.120 +add test 10.10.254.121 +add test 10.10.254.122 +add test 10.10.254.123 +add test 10.10.254.124 +add test 10.10.254.125 +add test 10.10.254.126 +add test 10.10.254.127 +add test 10.10.254.128 +add test 10.10.254.129 +add test 10.10.254.13 +add test 10.10.254.130 +add test 10.10.254.131 +add test 10.10.254.132 +add test 10.10.254.133 +add test 10.10.254.134 +add test 10.10.254.135 +add test 10.10.254.136 +add test 10.10.254.137 +add test 10.10.254.138 +add test 10.10.254.139 +add test 10.10.254.14 +add test 10.10.254.140 +add test 10.10.254.141 +add test 10.10.254.142 +add test 10.10.254.143 +add test 10.10.254.144 +add test 10.10.254.145 +add test 10.10.254.146 +add test 10.10.254.147 +add test 10.10.254.148 +add test 10.10.254.149 +add test 10.10.254.15 +add test 10.10.254.150 +add test 10.10.254.151 +add test 10.10.254.152 +add test 10.10.254.153 +add test 10.10.254.154 +add test 10.10.254.155 +add test 10.10.254.156 +add test 10.10.254.157 +add test 10.10.254.158 +add test 10.10.254.159 +add test 10.10.254.16 +add test 10.10.254.160 +add test 10.10.254.161 +add test 10.10.254.162 +add test 10.10.254.163 +add test 10.10.254.164 +add test 10.10.254.165 +add test 10.10.254.166 +add test 10.10.254.167 +add test 10.10.254.168 +add test 10.10.254.169 +add test 10.10.254.17 +add test 10.10.254.170 +add test 10.10.254.171 +add test 10.10.254.172 +add test 10.10.254.173 +add test 10.10.254.174 +add test 10.10.254.175 +add test 10.10.254.176 +add test 10.10.254.177 +add test 10.10.254.178 +add test 10.10.254.179 +add test 10.10.254.18 +add test 10.10.254.180 +add test 10.10.254.181 +add test 10.10.254.182 +add test 10.10.254.183 +add test 10.10.254.184 +add test 10.10.254.185 +add test 10.10.254.186 +add test 10.10.254.187 +add test 10.10.254.188 +add test 10.10.254.189 +add test 10.10.254.19 +add test 10.10.254.190 +add test 10.10.254.191 +add test 10.10.254.192 +add test 10.10.254.193 +add test 10.10.254.194 +add test 10.10.254.195 +add test 10.10.254.196 +add test 10.10.254.197 +add test 10.10.254.198 +add test 10.10.254.199 +add test 10.10.254.2 +add test 10.10.254.20 +add test 10.10.254.200 +add test 10.10.254.201 +add test 10.10.254.202 +add test 10.10.254.203 +add test 10.10.254.204 +add test 10.10.254.205 +add test 10.10.254.206 +add test 10.10.254.207 +add test 10.10.254.208 +add test 10.10.254.209 +add test 10.10.254.21 +add test 10.10.254.210 +add test 10.10.254.211 +add test 10.10.254.212 +add test 10.10.254.213 +add test 10.10.254.214 +add test 10.10.254.215 +add test 10.10.254.216 +add test 10.10.254.217 +add test 10.10.254.218 +add test 10.10.254.219 +add test 10.10.254.22 +add test 10.10.254.220 +add test 10.10.254.221 +add test 10.10.254.222 +add test 10.10.254.223 +add test 10.10.254.224 +add test 10.10.254.225 +add test 10.10.254.226 +add test 10.10.254.227 +add test 10.10.254.228 +add test 10.10.254.229 +add test 10.10.254.23 +add test 10.10.254.230 +add test 10.10.254.231 +add test 10.10.254.232 +add test 10.10.254.233 +add test 10.10.254.234 +add test 10.10.254.235 +add test 10.10.254.236 +add test 10.10.254.237 +add test 10.10.254.238 +add test 10.10.254.239 +add test 10.10.254.24 +add test 10.10.254.240 +add test 10.10.254.241 +add test 10.10.254.242 +add test 10.10.254.243 +add test 10.10.254.244 +add test 10.10.254.245 +add test 10.10.254.246 +add test 10.10.254.247 +add test 10.10.254.248 +add test 10.10.254.249 +add test 10.10.254.25 +add test 10.10.254.250 +add test 10.10.254.251 +add test 10.10.254.252 +add test 10.10.254.253 +add test 10.10.254.254 +add test 10.10.254.255 +add test 10.10.254.26 +add test 10.10.254.27 +add test 10.10.254.28 +add test 10.10.254.29 +add test 10.10.254.3 +add test 10.10.254.30 +add test 10.10.254.31 +add test 10.10.254.32 +add test 10.10.254.33 +add test 10.10.254.34 +add test 10.10.254.35 +add test 10.10.254.36 +add test 10.10.254.37 +add test 10.10.254.38 +add test 10.10.254.39 +add test 10.10.254.4 +add test 10.10.254.40 +add test 10.10.254.41 +add test 10.10.254.42 +add test 10.10.254.43 +add test 10.10.254.44 +add test 10.10.254.45 +add test 10.10.254.46 +add test 10.10.254.47 +add test 10.10.254.48 +add test 10.10.254.49 +add test 10.10.254.5 +add test 10.10.254.50 +add test 10.10.254.51 +add test 10.10.254.52 +add test 10.10.254.53 +add test 10.10.254.54 +add test 10.10.254.55 +add test 10.10.254.56 +add test 10.10.254.57 +add test 10.10.254.58 +add test 10.10.254.59 +add test 10.10.254.6 +add test 10.10.254.60 +add test 10.10.254.61 +add test 10.10.254.62 +add test 10.10.254.63 +add test 10.10.254.64 +add test 10.10.254.65 +add test 10.10.254.66 +add test 10.10.254.67 +add test 10.10.254.68 +add test 10.10.254.69 +add test 10.10.254.7 +add test 10.10.254.70 +add test 10.10.254.71 +add test 10.10.254.72 +add test 10.10.254.73 +add test 10.10.254.74 +add test 10.10.254.75 +add test 10.10.254.76 +add test 10.10.254.77 +add test 10.10.254.78 +add test 10.10.254.79 +add test 10.10.254.8 +add test 10.10.254.80 +add test 10.10.254.81 +add test 10.10.254.82 +add test 10.10.254.83 +add test 10.10.254.84 +add test 10.10.254.85 +add test 10.10.254.86 +add test 10.10.254.87 +add test 10.10.254.88 +add test 10.10.254.89 +add test 10.10.254.9 +add test 10.10.254.90 +add test 10.10.254.91 +add test 10.10.254.92 +add test 10.10.254.93 +add test 10.10.254.94 +add test 10.10.254.95 +add test 10.10.254.96 +add test 10.10.254.97 +add test 10.10.254.98 +add test 10.10.254.99 +add test 10.10.255.0 +add test 10.10.255.1 +add test 10.10.255.10 +add test 10.10.255.100 +add test 10.10.255.101 +add test 10.10.255.102 +add test 10.10.255.103 +add test 10.10.255.104 +add test 10.10.255.105 +add test 10.10.255.106 +add test 10.10.255.107 +add test 10.10.255.108 +add test 10.10.255.109 +add test 10.10.255.11 +add test 10.10.255.110 +add test 10.10.255.111 +add test 10.10.255.112 +add test 10.10.255.113 +add test 10.10.255.114 +add test 10.10.255.115 +add test 10.10.255.116 +add test 10.10.255.117 +add test 10.10.255.118 +add test 10.10.255.119 +add test 10.10.255.12 +add test 10.10.255.120 +add test 10.10.255.121 +add test 10.10.255.122 +add test 10.10.255.123 +add test 10.10.255.124 +add test 10.10.255.125 +add test 10.10.255.126 +add test 10.10.255.127 +add test 10.10.255.128 +add test 10.10.255.129 +add test 10.10.255.13 +add test 10.10.255.130 +add test 10.10.255.131 +add test 10.10.255.132 +add test 10.10.255.133 +add test 10.10.255.134 +add test 10.10.255.135 +add test 10.10.255.136 +add test 10.10.255.137 +add test 10.10.255.138 +add test 10.10.255.139 +add test 10.10.255.14 +add test 10.10.255.140 +add test 10.10.255.141 +add test 10.10.255.142 +add test 10.10.255.143 +add test 10.10.255.144 +add test 10.10.255.145 +add test 10.10.255.146 +add test 10.10.255.147 +add test 10.10.255.148 +add test 10.10.255.149 +add test 10.10.255.15 +add test 10.10.255.150 +add test 10.10.255.151 +add test 10.10.255.152 +add test 10.10.255.153 +add test 10.10.255.154 +add test 10.10.255.155 +add test 10.10.255.156 +add test 10.10.255.157 +add test 10.10.255.158 +add test 10.10.255.159 +add test 10.10.255.16 +add test 10.10.255.160 +add test 10.10.255.161 +add test 10.10.255.162 +add test 10.10.255.163 +add test 10.10.255.164 +add test 10.10.255.165 +add test 10.10.255.166 +add test 10.10.255.167 +add test 10.10.255.168 +add test 10.10.255.169 +add test 10.10.255.17 +add test 10.10.255.170 +add test 10.10.255.171 +add test 10.10.255.172 +add test 10.10.255.173 +add test 10.10.255.174 +add test 10.10.255.175 +add test 10.10.255.176 +add test 10.10.255.177 +add test 10.10.255.178 +add test 10.10.255.179 +add test 10.10.255.18 +add test 10.10.255.180 +add test 10.10.255.181 +add test 10.10.255.182 +add test 10.10.255.183 +add test 10.10.255.184 +add test 10.10.255.185 +add test 10.10.255.186 +add test 10.10.255.187 +add test 10.10.255.188 +add test 10.10.255.189 +add test 10.10.255.19 +add test 10.10.255.190 +add test 10.10.255.191 +add test 10.10.255.192 +add test 10.10.255.193 +add test 10.10.255.194 +add test 10.10.255.195 +add test 10.10.255.196 +add test 10.10.255.197 +add test 10.10.255.198 +add test 10.10.255.199 +add test 10.10.255.2 +add test 10.10.255.20 +add test 10.10.255.200 +add test 10.10.255.201 +add test 10.10.255.202 +add test 10.10.255.203 +add test 10.10.255.204 +add test 10.10.255.205 +add test 10.10.255.206 +add test 10.10.255.207 +add test 10.10.255.208 +add test 10.10.255.209 +add test 10.10.255.21 +add test 10.10.255.210 +add test 10.10.255.211 +add test 10.10.255.212 +add test 10.10.255.213 +add test 10.10.255.214 +add test 10.10.255.215 +add test 10.10.255.216 +add test 10.10.255.217 +add test 10.10.255.218 +add test 10.10.255.219 +add test 10.10.255.22 +add test 10.10.255.220 +add test 10.10.255.221 +add test 10.10.255.222 +add test 10.10.255.223 +add test 10.10.255.224 +add test 10.10.255.225 +add test 10.10.255.226 +add test 10.10.255.227 +add test 10.10.255.228 +add test 10.10.255.229 +add test 10.10.255.23 +add test 10.10.255.230 +add test 10.10.255.231 +add test 10.10.255.232 +add test 10.10.255.233 +add test 10.10.255.234 +add test 10.10.255.235 +add test 10.10.255.236 +add test 10.10.255.237 +add test 10.10.255.238 +add test 10.10.255.239 +add test 10.10.255.24 +add test 10.10.255.240 +add test 10.10.255.241 +add test 10.10.255.242 +add test 10.10.255.243 +add test 10.10.255.244 +add test 10.10.255.245 +add test 10.10.255.246 +add test 10.10.255.247 +add test 10.10.255.248 +add test 10.10.255.249 +add test 10.10.255.25 +add test 10.10.255.250 +add test 10.10.255.251 +add test 10.10.255.252 +add test 10.10.255.253 +add test 10.10.255.254 +add test 10.10.255.255 +add test 10.10.255.26 +add test 10.10.255.27 +add test 10.10.255.28 +add test 10.10.255.29 +add test 10.10.255.3 +add test 10.10.255.30 +add test 10.10.255.31 +add test 10.10.255.32 +add test 10.10.255.33 +add test 10.10.255.34 +add test 10.10.255.35 +add test 10.10.255.36 +add test 10.10.255.37 +add test 10.10.255.38 +add test 10.10.255.39 +add test 10.10.255.4 +add test 10.10.255.40 +add test 10.10.255.41 +add test 10.10.255.42 +add test 10.10.255.43 +add test 10.10.255.44 +add test 10.10.255.45 +add test 10.10.255.46 +add test 10.10.255.47 +add test 10.10.255.48 +add test 10.10.255.49 +add test 10.10.255.5 +add test 10.10.255.50 +add test 10.10.255.51 +add test 10.10.255.52 +add test 10.10.255.53 +add test 10.10.255.54 +add test 10.10.255.55 +add test 10.10.255.56 +add test 10.10.255.57 +add test 10.10.255.58 +add test 10.10.255.59 +add test 10.10.255.6 +add test 10.10.255.60 +add test 10.10.255.61 +add test 10.10.255.62 +add test 10.10.255.63 +add test 10.10.255.64 +add test 10.10.255.65 +add test 10.10.255.66 +add test 10.10.255.67 +add test 10.10.255.68 +add test 10.10.255.69 +add test 10.10.255.7 +add test 10.10.255.70 +add test 10.10.255.71 +add test 10.10.255.72 +add test 10.10.255.73 +add test 10.10.255.74 +add test 10.10.255.75 +add test 10.10.255.76 +add test 10.10.255.77 +add test 10.10.255.78 +add test 10.10.255.79 +add test 10.10.255.8 +add test 10.10.255.80 +add test 10.10.255.81 +add test 10.10.255.82 +add test 10.10.255.83 +add test 10.10.255.84 +add test 10.10.255.85 +add test 10.10.255.86 +add test 10.10.255.87 +add test 10.10.255.88 +add test 10.10.255.89 +add test 10.10.255.9 +add test 10.10.255.90 +add test 10.10.255.91 +add test 10.10.255.92 +add test 10.10.255.93 +add test 10.10.255.94 +add test 10.10.255.95 +add test 10.10.255.96 +add test 10.10.255.97 +add test 10.10.255.98 +add test 10.10.255.99 +add test 10.10.26.0 +add test 10.10.26.1 +add test 10.10.26.10 +add test 10.10.26.100 +add test 10.10.26.101 +add test 10.10.26.102 +add test 10.10.26.103 +add test 10.10.26.104 +add test 10.10.26.105 +add test 10.10.26.106 +add test 10.10.26.107 +add test 10.10.26.108 +add test 10.10.26.109 +add test 10.10.26.11 +add test 10.10.26.110 +add test 10.10.26.111 +add test 10.10.26.112 +add test 10.10.26.113 +add test 10.10.26.114 +add test 10.10.26.115 +add test 10.10.26.116 +add test 10.10.26.117 +add test 10.10.26.118 +add test 10.10.26.119 +add test 10.10.26.12 +add test 10.10.26.120 +add test 10.10.26.121 +add test 10.10.26.122 +add test 10.10.26.123 +add test 10.10.26.124 +add test 10.10.26.125 +add test 10.10.26.126 +add test 10.10.26.127 +add test 10.10.26.128 +add test 10.10.26.129 +add test 10.10.26.13 +add test 10.10.26.130 +add test 10.10.26.131 +add test 10.10.26.132 +add test 10.10.26.133 +add test 10.10.26.134 +add test 10.10.26.135 +add test 10.10.26.136 +add test 10.10.26.137 +add test 10.10.26.138 +add test 10.10.26.139 +add test 10.10.26.14 +add test 10.10.26.140 +add test 10.10.26.141 +add test 10.10.26.142 +add test 10.10.26.143 +add test 10.10.26.144 +add test 10.10.26.145 +add test 10.10.26.146 +add test 10.10.26.147 +add test 10.10.26.148 +add test 10.10.26.149 +add test 10.10.26.15 +add test 10.10.26.150 +add test 10.10.26.151 +add test 10.10.26.152 +add test 10.10.26.153 +add test 10.10.26.154 +add test 10.10.26.155 +add test 10.10.26.156 +add test 10.10.26.157 +add test 10.10.26.158 +add test 10.10.26.159 +add test 10.10.26.16 +add test 10.10.26.160 +add test 10.10.26.161 +add test 10.10.26.162 +add test 10.10.26.163 +add test 10.10.26.164 +add test 10.10.26.165 +add test 10.10.26.166 +add test 10.10.26.167 +add test 10.10.26.168 +add test 10.10.26.169 +add test 10.10.26.17 +add test 10.10.26.170 +add test 10.10.26.171 +add test 10.10.26.172 +add test 10.10.26.173 +add test 10.10.26.174 +add test 10.10.26.175 +add test 10.10.26.176 +add test 10.10.26.177 +add test 10.10.26.178 +add test 10.10.26.179 +add test 10.10.26.18 +add test 10.10.26.180 +add test 10.10.26.181 +add test 10.10.26.182 +add test 10.10.26.183 +add test 10.10.26.184 +add test 10.10.26.185 +add test 10.10.26.186 +add test 10.10.26.187 +add test 10.10.26.188 +add test 10.10.26.189 +add test 10.10.26.19 +add test 10.10.26.190 +add test 10.10.26.191 +add test 10.10.26.192 +add test 10.10.26.193 +add test 10.10.26.194 +add test 10.10.26.195 +add test 10.10.26.196 +add test 10.10.26.197 +add test 10.10.26.198 +add test 10.10.26.199 +add test 10.10.26.2 +add test 10.10.26.20 +add test 10.10.26.200 +add test 10.10.26.201 +add test 10.10.26.202 +add test 10.10.26.203 +add test 10.10.26.204 +add test 10.10.26.205 +add test 10.10.26.206 +add test 10.10.26.207 +add test 10.10.26.208 +add test 10.10.26.209 +add test 10.10.26.21 +add test 10.10.26.210 +add test 10.10.26.211 +add test 10.10.26.212 +add test 10.10.26.213 +add test 10.10.26.214 +add test 10.10.26.215 +add test 10.10.26.216 +add test 10.10.26.217 +add test 10.10.26.218 +add test 10.10.26.219 +add test 10.10.26.22 +add test 10.10.26.220 +add test 10.10.26.221 +add test 10.10.26.222 +add test 10.10.26.223 +add test 10.10.26.224 +add test 10.10.26.225 +add test 10.10.26.226 +add test 10.10.26.227 +add test 10.10.26.228 +add test 10.10.26.229 +add test 10.10.26.23 +add test 10.10.26.230 +add test 10.10.26.231 +add test 10.10.26.232 +add test 10.10.26.233 +add test 10.10.26.234 +add test 10.10.26.235 +add test 10.10.26.236 +add test 10.10.26.237 +add test 10.10.26.238 +add test 10.10.26.239 +add test 10.10.26.24 +add test 10.10.26.240 +add test 10.10.26.241 +add test 10.10.26.242 +add test 10.10.26.243 +add test 10.10.26.244 +add test 10.10.26.245 +add test 10.10.26.246 +add test 10.10.26.247 +add test 10.10.26.248 +add test 10.10.26.249 +add test 10.10.26.25 +add test 10.10.26.250 +add test 10.10.26.251 +add test 10.10.26.252 +add test 10.10.26.253 +add test 10.10.26.254 +add test 10.10.26.255 +add test 10.10.26.26 +add test 10.10.26.27 +add test 10.10.26.28 +add test 10.10.26.29 +add test 10.10.26.3 +add test 10.10.26.30 +add test 10.10.26.31 +add test 10.10.26.32 +add test 10.10.26.33 +add test 10.10.26.34 +add test 10.10.26.35 +add test 10.10.26.36 +add test 10.10.26.37 +add test 10.10.26.38 +add test 10.10.26.39 +add test 10.10.26.4 +add test 10.10.26.40 +add test 10.10.26.41 +add test 10.10.26.42 +add test 10.10.26.43 +add test 10.10.26.44 +add test 10.10.26.45 +add test 10.10.26.46 +add test 10.10.26.47 +add test 10.10.26.48 +add test 10.10.26.49 +add test 10.10.26.5 +add test 10.10.26.50 +add test 10.10.26.51 +add test 10.10.26.52 +add test 10.10.26.53 +add test 10.10.26.54 +add test 10.10.26.55 +add test 10.10.26.56 +add test 10.10.26.57 +add test 10.10.26.58 +add test 10.10.26.59 +add test 10.10.26.6 +add test 10.10.26.60 +add test 10.10.26.61 +add test 10.10.26.62 +add test 10.10.26.63 +add test 10.10.26.64 +add test 10.10.26.65 +add test 10.10.26.66 +add test 10.10.26.67 +add test 10.10.26.68 +add test 10.10.26.69 +add test 10.10.26.7 +add test 10.10.26.70 +add test 10.10.26.71 +add test 10.10.26.72 +add test 10.10.26.73 +add test 10.10.26.74 +add test 10.10.26.75 +add test 10.10.26.76 +add test 10.10.26.77 +add test 10.10.26.78 +add test 10.10.26.79 +add test 10.10.26.8 +add test 10.10.26.80 +add test 10.10.26.81 +add test 10.10.26.82 +add test 10.10.26.83 +add test 10.10.26.84 +add test 10.10.26.85 +add test 10.10.26.86 +add test 10.10.26.87 +add test 10.10.26.88 +add test 10.10.26.89 +add test 10.10.26.9 +add test 10.10.26.90 +add test 10.10.26.91 +add test 10.10.26.92 +add test 10.10.26.93 +add test 10.10.26.94 +add test 10.10.26.95 +add test 10.10.26.96 +add test 10.10.26.97 +add test 10.10.26.98 +add test 10.10.26.99 +add test 10.10.27.0 +add test 10.10.27.1 +add test 10.10.27.10 +add test 10.10.27.100 +add test 10.10.27.101 +add test 10.10.27.102 +add test 10.10.27.103 +add test 10.10.27.104 +add test 10.10.27.105 +add test 10.10.27.106 +add test 10.10.27.107 +add test 10.10.27.108 +add test 10.10.27.109 +add test 10.10.27.11 +add test 10.10.27.110 +add test 10.10.27.111 +add test 10.10.27.112 +add test 10.10.27.113 +add test 10.10.27.114 +add test 10.10.27.115 +add test 10.10.27.116 +add test 10.10.27.117 +add test 10.10.27.118 +add test 10.10.27.119 +add test 10.10.27.12 +add test 10.10.27.120 +add test 10.10.27.121 +add test 10.10.27.122 +add test 10.10.27.123 +add test 10.10.27.124 +add test 10.10.27.125 +add test 10.10.27.126 +add test 10.10.27.127 +add test 10.10.27.128 +add test 10.10.27.129 +add test 10.10.27.13 +add test 10.10.27.130 +add test 10.10.27.131 +add test 10.10.27.132 +add test 10.10.27.133 +add test 10.10.27.134 +add test 10.10.27.135 +add test 10.10.27.136 +add test 10.10.27.137 +add test 10.10.27.138 +add test 10.10.27.139 +add test 10.10.27.14 +add test 10.10.27.140 +add test 10.10.27.141 +add test 10.10.27.142 +add test 10.10.27.143 +add test 10.10.27.144 +add test 10.10.27.145 +add test 10.10.27.146 +add test 10.10.27.147 +add test 10.10.27.148 +add test 10.10.27.149 +add test 10.10.27.15 +add test 10.10.27.150 +add test 10.10.27.151 +add test 10.10.27.152 +add test 10.10.27.153 +add test 10.10.27.154 +add test 10.10.27.155 +add test 10.10.27.156 +add test 10.10.27.157 +add test 10.10.27.158 +add test 10.10.27.159 +add test 10.10.27.16 +add test 10.10.27.160 +add test 10.10.27.161 +add test 10.10.27.162 +add test 10.10.27.163 +add test 10.10.27.164 +add test 10.10.27.165 +add test 10.10.27.166 +add test 10.10.27.167 +add test 10.10.27.168 +add test 10.10.27.169 +add test 10.10.27.17 +add test 10.10.27.170 +add test 10.10.27.171 +add test 10.10.27.172 +add test 10.10.27.173 +add test 10.10.27.174 +add test 10.10.27.175 +add test 10.10.27.176 +add test 10.10.27.177 +add test 10.10.27.178 +add test 10.10.27.179 +add test 10.10.27.18 +add test 10.10.27.180 +add test 10.10.27.181 +add test 10.10.27.182 +add test 10.10.27.183 +add test 10.10.27.184 +add test 10.10.27.185 +add test 10.10.27.186 +add test 10.10.27.187 +add test 10.10.27.188 +add test 10.10.27.189 +add test 10.10.27.19 +add test 10.10.27.190 +add test 10.10.27.191 +add test 10.10.27.192 +add test 10.10.27.193 +add test 10.10.27.194 +add test 10.10.27.195 +add test 10.10.27.196 +add test 10.10.27.197 +add test 10.10.27.198 +add test 10.10.27.199 +add test 10.10.27.2 +add test 10.10.27.20 +add test 10.10.27.200 +add test 10.10.27.201 +add test 10.10.27.202 +add test 10.10.27.203 +add test 10.10.27.204 +add test 10.10.27.205 +add test 10.10.27.206 +add test 10.10.27.207 +add test 10.10.27.208 +add test 10.10.27.209 +add test 10.10.27.21 +add test 10.10.27.210 +add test 10.10.27.211 +add test 10.10.27.212 +add test 10.10.27.213 +add test 10.10.27.214 +add test 10.10.27.215 +add test 10.10.27.216 +add test 10.10.27.217 +add test 10.10.27.218 +add test 10.10.27.219 +add test 10.10.27.22 +add test 10.10.27.220 +add test 10.10.27.221 +add test 10.10.27.222 +add test 10.10.27.223 +add test 10.10.27.224 +add test 10.10.27.225 +add test 10.10.27.226 +add test 10.10.27.227 +add test 10.10.27.228 +add test 10.10.27.229 +add test 10.10.27.23 +add test 10.10.27.230 +add test 10.10.27.231 +add test 10.10.27.232 +add test 10.10.27.233 +add test 10.10.27.234 +add test 10.10.27.235 +add test 10.10.27.236 +add test 10.10.27.237 +add test 10.10.27.238 +add test 10.10.27.239 +add test 10.10.27.24 +add test 10.10.27.240 +add test 10.10.27.241 +add test 10.10.27.242 +add test 10.10.27.243 +add test 10.10.27.244 +add test 10.10.27.245 +add test 10.10.27.246 +add test 10.10.27.247 +add test 10.10.27.248 +add test 10.10.27.249 +add test 10.10.27.25 +add test 10.10.27.250 +add test 10.10.27.251 +add test 10.10.27.252 +add test 10.10.27.253 +add test 10.10.27.254 +add test 10.10.27.255 +add test 10.10.27.26 +add test 10.10.27.27 +add test 10.10.27.28 +add test 10.10.27.29 +add test 10.10.27.3 +add test 10.10.27.30 +add test 10.10.27.31 +add test 10.10.27.32 +add test 10.10.27.33 +add test 10.10.27.34 +add test 10.10.27.35 +add test 10.10.27.36 +add test 10.10.27.37 +add test 10.10.27.38 +add test 10.10.27.39 +add test 10.10.27.4 +add test 10.10.27.40 +add test 10.10.27.41 +add test 10.10.27.42 +add test 10.10.27.43 +add test 10.10.27.44 +add test 10.10.27.45 +add test 10.10.27.46 +add test 10.10.27.47 +add test 10.10.27.48 +add test 10.10.27.49 +add test 10.10.27.5 +add test 10.10.27.50 +add test 10.10.27.51 +add test 10.10.27.52 +add test 10.10.27.53 +add test 10.10.27.54 +add test 10.10.27.55 +add test 10.10.27.56 +add test 10.10.27.57 +add test 10.10.27.58 +add test 10.10.27.59 +add test 10.10.27.6 +add test 10.10.27.60 +add test 10.10.27.61 +add test 10.10.27.62 +add test 10.10.27.63 +add test 10.10.27.64 +add test 10.10.27.65 +add test 10.10.27.66 +add test 10.10.27.67 +add test 10.10.27.68 +add test 10.10.27.69 +add test 10.10.27.7 +add test 10.10.27.70 +add test 10.10.27.71 +add test 10.10.27.72 +add test 10.10.27.73 +add test 10.10.27.74 +add test 10.10.27.75 +add test 10.10.27.76 +add test 10.10.27.77 +add test 10.10.27.78 +add test 10.10.27.79 +add test 10.10.27.8 +add test 10.10.27.80 +add test 10.10.27.81 +add test 10.10.27.82 +add test 10.10.27.83 +add test 10.10.27.84 +add test 10.10.27.85 +add test 10.10.27.86 +add test 10.10.27.87 +add test 10.10.27.88 +add test 10.10.27.89 +add test 10.10.27.9 +add test 10.10.27.90 +add test 10.10.27.91 +add test 10.10.27.92 +add test 10.10.27.93 +add test 10.10.27.94 +add test 10.10.27.95 +add test 10.10.27.96 +add test 10.10.27.97 +add test 10.10.27.98 +add test 10.10.27.99 +add test 10.10.28.0 +add test 10.10.28.1 +add test 10.10.28.10 +add test 10.10.28.100 +add test 10.10.28.101 +add test 10.10.28.102 +add test 10.10.28.103 +add test 10.10.28.104 +add test 10.10.28.105 +add test 10.10.28.106 +add test 10.10.28.107 +add test 10.10.28.108 +add test 10.10.28.109 +add test 10.10.28.11 +add test 10.10.28.110 +add test 10.10.28.111 +add test 10.10.28.112 +add test 10.10.28.113 +add test 10.10.28.114 +add test 10.10.28.115 +add test 10.10.28.116 +add test 10.10.28.117 +add test 10.10.28.118 +add test 10.10.28.119 +add test 10.10.28.12 +add test 10.10.28.120 +add test 10.10.28.121 +add test 10.10.28.122 +add test 10.10.28.123 +add test 10.10.28.124 +add test 10.10.28.125 +add test 10.10.28.126 +add test 10.10.28.127 +add test 10.10.28.128 +add test 10.10.28.129 +add test 10.10.28.13 +add test 10.10.28.130 +add test 10.10.28.131 +add test 10.10.28.132 +add test 10.10.28.133 +add test 10.10.28.134 +add test 10.10.28.135 +add test 10.10.28.136 +add test 10.10.28.137 +add test 10.10.28.138 +add test 10.10.28.139 +add test 10.10.28.14 +add test 10.10.28.140 +add test 10.10.28.141 +add test 10.10.28.142 +add test 10.10.28.143 +add test 10.10.28.144 +add test 10.10.28.145 +add test 10.10.28.146 +add test 10.10.28.147 +add test 10.10.28.148 +add test 10.10.28.149 +add test 10.10.28.15 +add test 10.10.28.150 +add test 10.10.28.151 +add test 10.10.28.152 +add test 10.10.28.153 +add test 10.10.28.154 +add test 10.10.28.155 +add test 10.10.28.156 +add test 10.10.28.157 +add test 10.10.28.158 +add test 10.10.28.159 +add test 10.10.28.16 +add test 10.10.28.160 +add test 10.10.28.161 +add test 10.10.28.162 +add test 10.10.28.163 +add test 10.10.28.164 +add test 10.10.28.165 +add test 10.10.28.166 +add test 10.10.28.167 +add test 10.10.28.168 +add test 10.10.28.169 +add test 10.10.28.17 +add test 10.10.28.170 +add test 10.10.28.171 +add test 10.10.28.172 +add test 10.10.28.173 +add test 10.10.28.174 +add test 10.10.28.175 +add test 10.10.28.176 +add test 10.10.28.177 +add test 10.10.28.178 +add test 10.10.28.179 +add test 10.10.28.18 +add test 10.10.28.180 +add test 10.10.28.181 +add test 10.10.28.182 +add test 10.10.28.183 +add test 10.10.28.184 +add test 10.10.28.185 +add test 10.10.28.186 +add test 10.10.28.187 +add test 10.10.28.188 +add test 10.10.28.189 +add test 10.10.28.19 +add test 10.10.28.190 +add test 10.10.28.191 +add test 10.10.28.192 +add test 10.10.28.193 +add test 10.10.28.194 +add test 10.10.28.195 +add test 10.10.28.196 +add test 10.10.28.197 +add test 10.10.28.198 +add test 10.10.28.199 +add test 10.10.28.2 +add test 10.10.28.20 +add test 10.10.28.200 +add test 10.10.28.201 +add test 10.10.28.202 +add test 10.10.28.203 +add test 10.10.28.204 +add test 10.10.28.205 +add test 10.10.28.206 +add test 10.10.28.207 +add test 10.10.28.208 +add test 10.10.28.209 +add test 10.10.28.21 +add test 10.10.28.210 +add test 10.10.28.211 +add test 10.10.28.212 +add test 10.10.28.213 +add test 10.10.28.214 +add test 10.10.28.215 +add test 10.10.28.216 +add test 10.10.28.217 +add test 10.10.28.218 +add test 10.10.28.219 +add test 10.10.28.22 +add test 10.10.28.220 +add test 10.10.28.221 +add test 10.10.28.222 +add test 10.10.28.223 +add test 10.10.28.224 +add test 10.10.28.225 +add test 10.10.28.226 +add test 10.10.28.227 +add test 10.10.28.228 +add test 10.10.28.229 +add test 10.10.28.23 +add test 10.10.28.230 +add test 10.10.28.231 +add test 10.10.28.232 +add test 10.10.28.233 +add test 10.10.28.234 +add test 10.10.28.235 +add test 10.10.28.236 +add test 10.10.28.237 +add test 10.10.28.238 +add test 10.10.28.239 +add test 10.10.28.24 +add test 10.10.28.240 +add test 10.10.28.241 +add test 10.10.28.242 +add test 10.10.28.243 +add test 10.10.28.244 +add test 10.10.28.245 +add test 10.10.28.246 +add test 10.10.28.247 +add test 10.10.28.248 +add test 10.10.28.249 +add test 10.10.28.25 +add test 10.10.28.250 +add test 10.10.28.251 +add test 10.10.28.252 +add test 10.10.28.253 +add test 10.10.28.254 +add test 10.10.28.255 +add test 10.10.28.26 +add test 10.10.28.27 +add test 10.10.28.28 +add test 10.10.28.29 +add test 10.10.28.3 +add test 10.10.28.30 +add test 10.10.28.31 +add test 10.10.28.32 +add test 10.10.28.33 +add test 10.10.28.34 +add test 10.10.28.35 +add test 10.10.28.36 +add test 10.10.28.37 +add test 10.10.28.38 +add test 10.10.28.39 +add test 10.10.28.4 +add test 10.10.28.40 +add test 10.10.28.41 +add test 10.10.28.42 +add test 10.10.28.43 +add test 10.10.28.44 +add test 10.10.28.45 +add test 10.10.28.46 +add test 10.10.28.47 +add test 10.10.28.48 +add test 10.10.28.49 +add test 10.10.28.5 +add test 10.10.28.50 +add test 10.10.28.51 +add test 10.10.28.52 +add test 10.10.28.53 +add test 10.10.28.54 +add test 10.10.28.55 +add test 10.10.28.56 +add test 10.10.28.57 +add test 10.10.28.58 +add test 10.10.28.59 +add test 10.10.28.6 +add test 10.10.28.60 +add test 10.10.28.61 +add test 10.10.28.62 +add test 10.10.28.63 +add test 10.10.28.64 +add test 10.10.28.65 +add test 10.10.28.66 +add test 10.10.28.67 +add test 10.10.28.68 +add test 10.10.28.69 +add test 10.10.28.7 +add test 10.10.28.70 +add test 10.10.28.71 +add test 10.10.28.72 +add test 10.10.28.73 +add test 10.10.28.74 +add test 10.10.28.75 +add test 10.10.28.76 +add test 10.10.28.77 +add test 10.10.28.78 +add test 10.10.28.79 +add test 10.10.28.8 +add test 10.10.28.80 +add test 10.10.28.81 +add test 10.10.28.82 +add test 10.10.28.83 +add test 10.10.28.84 +add test 10.10.28.85 +add test 10.10.28.86 +add test 10.10.28.87 +add test 10.10.28.88 +add test 10.10.28.89 +add test 10.10.28.9 +add test 10.10.28.90 +add test 10.10.28.91 +add test 10.10.28.92 +add test 10.10.28.93 +add test 10.10.28.94 +add test 10.10.28.95 +add test 10.10.28.96 +add test 10.10.28.97 +add test 10.10.28.98 +add test 10.10.28.99 +add test 10.10.29.0 +add test 10.10.29.1 +add test 10.10.29.10 +add test 10.10.29.100 +add test 10.10.29.101 +add test 10.10.29.102 +add test 10.10.29.103 +add test 10.10.29.104 +add test 10.10.29.105 +add test 10.10.29.106 +add test 10.10.29.107 +add test 10.10.29.108 +add test 10.10.29.109 +add test 10.10.29.11 +add test 10.10.29.110 +add test 10.10.29.111 +add test 10.10.29.112 +add test 10.10.29.113 +add test 10.10.29.114 +add test 10.10.29.115 +add test 10.10.29.116 +add test 10.10.29.117 +add test 10.10.29.118 +add test 10.10.29.119 +add test 10.10.29.12 +add test 10.10.29.120 +add test 10.10.29.121 +add test 10.10.29.122 +add test 10.10.29.123 +add test 10.10.29.124 +add test 10.10.29.125 +add test 10.10.29.126 +add test 10.10.29.127 +add test 10.10.29.128 +add test 10.10.29.129 +add test 10.10.29.13 +add test 10.10.29.130 +add test 10.10.29.131 +add test 10.10.29.132 +add test 10.10.29.133 +add test 10.10.29.134 +add test 10.10.29.135 +add test 10.10.29.136 +add test 10.10.29.137 +add test 10.10.29.138 +add test 10.10.29.139 +add test 10.10.29.14 +add test 10.10.29.140 +add test 10.10.29.141 +add test 10.10.29.142 +add test 10.10.29.143 +add test 10.10.29.144 +add test 10.10.29.145 +add test 10.10.29.146 +add test 10.10.29.147 +add test 10.10.29.148 +add test 10.10.29.149 +add test 10.10.29.15 +add test 10.10.29.150 +add test 10.10.29.151 +add test 10.10.29.152 +add test 10.10.29.153 +add test 10.10.29.154 +add test 10.10.29.155 +add test 10.10.29.156 +add test 10.10.29.157 +add test 10.10.29.158 +add test 10.10.29.159 +add test 10.10.29.16 +add test 10.10.29.160 +add test 10.10.29.161 +add test 10.10.29.162 +add test 10.10.29.163 +add test 10.10.29.164 +add test 10.10.29.165 +add test 10.10.29.166 +add test 10.10.29.167 +add test 10.10.29.168 +add test 10.10.29.169 +add test 10.10.29.17 +add test 10.10.29.170 +add test 10.10.29.171 +add test 10.10.29.172 +add test 10.10.29.173 +add test 10.10.29.174 +add test 10.10.29.175 +add test 10.10.29.176 +add test 10.10.29.177 +add test 10.10.29.178 +add test 10.10.29.179 +add test 10.10.29.18 +add test 10.10.29.180 +add test 10.10.29.181 +add test 10.10.29.182 +add test 10.10.29.183 +add test 10.10.29.184 +add test 10.10.29.185 +add test 10.10.29.186 +add test 10.10.29.187 +add test 10.10.29.188 +add test 10.10.29.189 +add test 10.10.29.19 +add test 10.10.29.190 +add test 10.10.29.191 +add test 10.10.29.192 +add test 10.10.29.193 +add test 10.10.29.194 +add test 10.10.29.195 +add test 10.10.29.196 +add test 10.10.29.197 +add test 10.10.29.198 +add test 10.10.29.199 +add test 10.10.29.2 +add test 10.10.29.20 +add test 10.10.29.200 +add test 10.10.29.201 +add test 10.10.29.202 +add test 10.10.29.203 +add test 10.10.29.204 +add test 10.10.29.205 +add test 10.10.29.206 +add test 10.10.29.207 +add test 10.10.29.208 +add test 10.10.29.209 +add test 10.10.29.21 +add test 10.10.29.210 +add test 10.10.29.211 +add test 10.10.29.212 +add test 10.10.29.213 +add test 10.10.29.214 +add test 10.10.29.215 +add test 10.10.29.216 +add test 10.10.29.217 +add test 10.10.29.218 +add test 10.10.29.219 +add test 10.10.29.22 +add test 10.10.29.220 +add test 10.10.29.221 +add test 10.10.29.222 +add test 10.10.29.223 +add test 10.10.29.224 +add test 10.10.29.225 +add test 10.10.29.226 +add test 10.10.29.227 +add test 10.10.29.228 +add test 10.10.29.229 +add test 10.10.29.23 +add test 10.10.29.230 +add test 10.10.29.231 +add test 10.10.29.232 +add test 10.10.29.233 +add test 10.10.29.234 +add test 10.10.29.235 +add test 10.10.29.236 +add test 10.10.29.237 +add test 10.10.29.238 +add test 10.10.29.239 +add test 10.10.29.24 +add test 10.10.29.240 +add test 10.10.29.241 +add test 10.10.29.242 +add test 10.10.29.243 +add test 10.10.29.244 +add test 10.10.29.245 +add test 10.10.29.246 +add test 10.10.29.247 +add test 10.10.29.248 +add test 10.10.29.249 +add test 10.10.29.25 +add test 10.10.29.250 +add test 10.10.29.251 +add test 10.10.29.252 +add test 10.10.29.253 +add test 10.10.29.254 +add test 10.10.29.255 +add test 10.10.29.26 +add test 10.10.29.27 +add test 10.10.29.28 +add test 10.10.29.29 +add test 10.10.29.3 +add test 10.10.29.30 +add test 10.10.29.31 +add test 10.10.29.32 +add test 10.10.29.33 +add test 10.10.29.34 +add test 10.10.29.35 +add test 10.10.29.36 +add test 10.10.29.37 +add test 10.10.29.38 +add test 10.10.29.39 +add test 10.10.29.4 +add test 10.10.29.40 +add test 10.10.29.41 +add test 10.10.29.42 +add test 10.10.29.43 +add test 10.10.29.44 +add test 10.10.29.45 +add test 10.10.29.46 +add test 10.10.29.47 +add test 10.10.29.48 +add test 10.10.29.49 +add test 10.10.29.5 +add test 10.10.29.50 +add test 10.10.29.51 +add test 10.10.29.52 +add test 10.10.29.53 +add test 10.10.29.54 +add test 10.10.29.55 +add test 10.10.29.56 +add test 10.10.29.57 +add test 10.10.29.58 +add test 10.10.29.59 +add test 10.10.29.6 +add test 10.10.29.60 +add test 10.10.29.61 +add test 10.10.29.62 +add test 10.10.29.63 +add test 10.10.29.64 +add test 10.10.29.65 +add test 10.10.29.66 +add test 10.10.29.67 +add test 10.10.29.68 +add test 10.10.29.69 +add test 10.10.29.7 +add test 10.10.29.70 +add test 10.10.29.71 +add test 10.10.29.72 +add test 10.10.29.73 +add test 10.10.29.74 +add test 10.10.29.75 +add test 10.10.29.76 +add test 10.10.29.77 +add test 10.10.29.78 +add test 10.10.29.79 +add test 10.10.29.8 +add test 10.10.29.80 +add test 10.10.29.81 +add test 10.10.29.82 +add test 10.10.29.83 +add test 10.10.29.84 +add test 10.10.29.85 +add test 10.10.29.86 +add test 10.10.29.87 +add test 10.10.29.88 +add test 10.10.29.89 +add test 10.10.29.9 +add test 10.10.29.90 +add test 10.10.29.91 +add test 10.10.29.92 +add test 10.10.29.93 +add test 10.10.29.94 +add test 10.10.29.95 +add test 10.10.29.96 +add test 10.10.29.97 +add test 10.10.29.98 +add test 10.10.29.99 +add test 10.10.3.0 +add test 10.10.3.1 +add test 10.10.3.10 +add test 10.10.3.100 +add test 10.10.3.101 +add test 10.10.3.102 +add test 10.10.3.103 +add test 10.10.3.104 +add test 10.10.3.105 +add test 10.10.3.106 +add test 10.10.3.107 +add test 10.10.3.108 +add test 10.10.3.109 +add test 10.10.3.11 +add test 10.10.3.110 +add test 10.10.3.111 +add test 10.10.3.112 +add test 10.10.3.113 +add test 10.10.3.114 +add test 10.10.3.115 +add test 10.10.3.116 +add test 10.10.3.117 +add test 10.10.3.118 +add test 10.10.3.119 +add test 10.10.3.12 +add test 10.10.3.120 +add test 10.10.3.121 +add test 10.10.3.122 +add test 10.10.3.123 +add test 10.10.3.124 +add test 10.10.3.125 +add test 10.10.3.126 +add test 10.10.3.127 +add test 10.10.3.128 +add test 10.10.3.129 +add test 10.10.3.13 +add test 10.10.3.130 +add test 10.10.3.131 +add test 10.10.3.132 +add test 10.10.3.133 +add test 10.10.3.134 +add test 10.10.3.135 +add test 10.10.3.136 +add test 10.10.3.137 +add test 10.10.3.138 +add test 10.10.3.139 +add test 10.10.3.14 +add test 10.10.3.140 +add test 10.10.3.141 +add test 10.10.3.142 +add test 10.10.3.143 +add test 10.10.3.144 +add test 10.10.3.145 +add test 10.10.3.146 +add test 10.10.3.147 +add test 10.10.3.148 +add test 10.10.3.149 +add test 10.10.3.15 +add test 10.10.3.150 +add test 10.10.3.151 +add test 10.10.3.152 +add test 10.10.3.153 +add test 10.10.3.154 +add test 10.10.3.155 +add test 10.10.3.156 +add test 10.10.3.157 +add test 10.10.3.158 +add test 10.10.3.159 +add test 10.10.3.16 +add test 10.10.3.160 +add test 10.10.3.161 +add test 10.10.3.162 +add test 10.10.3.163 +add test 10.10.3.164 +add test 10.10.3.165 +add test 10.10.3.166 +add test 10.10.3.167 +add test 10.10.3.168 +add test 10.10.3.169 +add test 10.10.3.17 +add test 10.10.3.170 +add test 10.10.3.171 +add test 10.10.3.172 +add test 10.10.3.173 +add test 10.10.3.174 +add test 10.10.3.175 +add test 10.10.3.176 +add test 10.10.3.177 +add test 10.10.3.178 +add test 10.10.3.179 +add test 10.10.3.18 +add test 10.10.3.180 +add test 10.10.3.181 +add test 10.10.3.182 +add test 10.10.3.183 +add test 10.10.3.184 +add test 10.10.3.185 +add test 10.10.3.186 +add test 10.10.3.187 +add test 10.10.3.188 +add test 10.10.3.189 +add test 10.10.3.19 +add test 10.10.3.190 +add test 10.10.3.191 +add test 10.10.3.192 +add test 10.10.3.193 +add test 10.10.3.194 +add test 10.10.3.195 +add test 10.10.3.196 +add test 10.10.3.197 +add test 10.10.3.198 +add test 10.10.3.199 +add test 10.10.3.2 +add test 10.10.3.20 +add test 10.10.3.200 +add test 10.10.3.201 +add test 10.10.3.202 +add test 10.10.3.203 +add test 10.10.3.204 +add test 10.10.3.205 +add test 10.10.3.206 +add test 10.10.3.207 +add test 10.10.3.208 +add test 10.10.3.209 +add test 10.10.3.21 +add test 10.10.3.210 +add test 10.10.3.211 +add test 10.10.3.212 +add test 10.10.3.213 +add test 10.10.3.214 +add test 10.10.3.215 +add test 10.10.3.216 +add test 10.10.3.217 +add test 10.10.3.218 +add test 10.10.3.219 +add test 10.10.3.22 +add test 10.10.3.220 +add test 10.10.3.221 +add test 10.10.3.222 +add test 10.10.3.223 +add test 10.10.3.224 +add test 10.10.3.225 +add test 10.10.3.226 +add test 10.10.3.227 +add test 10.10.3.228 +add test 10.10.3.229 +add test 10.10.3.23 +add test 10.10.3.230 +add test 10.10.3.231 +add test 10.10.3.232 +add test 10.10.3.233 +add test 10.10.3.234 +add test 10.10.3.235 +add test 10.10.3.236 +add test 10.10.3.237 +add test 10.10.3.238 +add test 10.10.3.239 +add test 10.10.3.24 +add test 10.10.3.240 +add test 10.10.3.241 +add test 10.10.3.242 +add test 10.10.3.243 +add test 10.10.3.244 +add test 10.10.3.245 +add test 10.10.3.246 +add test 10.10.3.247 +add test 10.10.3.248 +add test 10.10.3.249 +add test 10.10.3.25 +add test 10.10.3.250 +add test 10.10.3.251 +add test 10.10.3.252 +add test 10.10.3.253 +add test 10.10.3.254 +add test 10.10.3.255 +add test 10.10.3.26 +add test 10.10.3.27 +add test 10.10.3.28 +add test 10.10.3.29 +add test 10.10.3.3 +add test 10.10.3.30 +add test 10.10.3.31 +add test 10.10.3.32 +add test 10.10.3.33 +add test 10.10.3.34 +add test 10.10.3.35 +add test 10.10.3.36 +add test 10.10.3.37 +add test 10.10.3.38 +add test 10.10.3.39 +add test 10.10.3.4 +add test 10.10.3.40 +add test 10.10.3.41 +add test 10.10.3.42 +add test 10.10.3.43 +add test 10.10.3.44 +add test 10.10.3.45 +add test 10.10.3.46 +add test 10.10.3.47 +add test 10.10.3.48 +add test 10.10.3.49 +add test 10.10.3.5 +add test 10.10.3.50 +add test 10.10.3.51 +add test 10.10.3.52 +add test 10.10.3.53 +add test 10.10.3.54 +add test 10.10.3.55 +add test 10.10.3.56 +add test 10.10.3.57 +add test 10.10.3.58 +add test 10.10.3.59 +add test 10.10.3.6 +add test 10.10.3.60 +add test 10.10.3.61 +add test 10.10.3.62 +add test 10.10.3.63 +add test 10.10.3.64 +add test 10.10.3.65 +add test 10.10.3.66 +add test 10.10.3.67 +add test 10.10.3.68 +add test 10.10.3.69 +add test 10.10.3.7 +add test 10.10.3.70 +add test 10.10.3.71 +add test 10.10.3.72 +add test 10.10.3.73 +add test 10.10.3.74 +add test 10.10.3.75 +add test 10.10.3.76 +add test 10.10.3.77 +add test 10.10.3.78 +add test 10.10.3.79 +add test 10.10.3.8 +add test 10.10.3.80 +add test 10.10.3.81 +add test 10.10.3.82 +add test 10.10.3.83 +add test 10.10.3.84 +add test 10.10.3.85 +add test 10.10.3.86 +add test 10.10.3.87 +add test 10.10.3.88 +add test 10.10.3.89 +add test 10.10.3.9 +add test 10.10.3.90 +add test 10.10.3.91 +add test 10.10.3.92 +add test 10.10.3.93 +add test 10.10.3.94 +add test 10.10.3.95 +add test 10.10.3.96 +add test 10.10.3.97 +add test 10.10.3.98 +add test 10.10.3.99 +add test 10.10.30.0 +add test 10.10.30.1 +add test 10.10.30.10 +add test 10.10.30.100 +add test 10.10.30.101 +add test 10.10.30.102 +add test 10.10.30.103 +add test 10.10.30.104 +add test 10.10.30.105 +add test 10.10.30.106 +add test 10.10.30.107 +add test 10.10.30.108 +add test 10.10.30.109 +add test 10.10.30.11 +add test 10.10.30.110 +add test 10.10.30.111 +add test 10.10.30.112 +add test 10.10.30.113 +add test 10.10.30.114 +add test 10.10.30.115 +add test 10.10.30.116 +add test 10.10.30.117 +add test 10.10.30.118 +add test 10.10.30.119 +add test 10.10.30.12 +add test 10.10.30.120 +add test 10.10.30.121 +add test 10.10.30.122 +add test 10.10.30.123 +add test 10.10.30.124 +add test 10.10.30.125 +add test 10.10.30.126 +add test 10.10.30.127 +add test 10.10.30.128 +add test 10.10.30.129 +add test 10.10.30.13 +add test 10.10.30.130 +add test 10.10.30.131 +add test 10.10.30.132 +add test 10.10.30.133 +add test 10.10.30.134 +add test 10.10.30.135 +add test 10.10.30.136 +add test 10.10.30.137 +add test 10.10.30.138 +add test 10.10.30.139 +add test 10.10.30.14 +add test 10.10.30.140 +add test 10.10.30.141 +add test 10.10.30.142 +add test 10.10.30.143 +add test 10.10.30.144 +add test 10.10.30.145 +add test 10.10.30.146 +add test 10.10.30.147 +add test 10.10.30.148 +add test 10.10.30.149 +add test 10.10.30.15 +add test 10.10.30.150 +add test 10.10.30.151 +add test 10.10.30.152 +add test 10.10.30.153 +add test 10.10.30.154 +add test 10.10.30.155 +add test 10.10.30.156 +add test 10.10.30.157 +add test 10.10.30.158 +add test 10.10.30.159 +add test 10.10.30.16 +add test 10.10.30.160 +add test 10.10.30.161 +add test 10.10.30.162 +add test 10.10.30.163 +add test 10.10.30.164 +add test 10.10.30.165 +add test 10.10.30.166 +add test 10.10.30.167 +add test 10.10.30.168 +add test 10.10.30.169 +add test 10.10.30.17 +add test 10.10.30.170 +add test 10.10.30.171 +add test 10.10.30.172 +add test 10.10.30.173 +add test 10.10.30.174 +add test 10.10.30.175 +add test 10.10.30.176 +add test 10.10.30.177 +add test 10.10.30.178 +add test 10.10.30.179 +add test 10.10.30.18 +add test 10.10.30.180 +add test 10.10.30.181 +add test 10.10.30.182 +add test 10.10.30.183 +add test 10.10.30.184 +add test 10.10.30.185 +add test 10.10.30.186 +add test 10.10.30.187 +add test 10.10.30.188 +add test 10.10.30.189 +add test 10.10.30.19 +add test 10.10.30.190 +add test 10.10.30.191 +add test 10.10.30.192 +add test 10.10.30.193 +add test 10.10.30.194 +add test 10.10.30.195 +add test 10.10.30.196 +add test 10.10.30.197 +add test 10.10.30.198 +add test 10.10.30.199 +add test 10.10.30.2 +add test 10.10.30.20 +add test 10.10.30.200 +add test 10.10.30.201 +add test 10.10.30.202 +add test 10.10.30.203 +add test 10.10.30.204 +add test 10.10.30.205 +add test 10.10.30.206 +add test 10.10.30.207 +add test 10.10.30.208 +add test 10.10.30.209 +add test 10.10.30.21 +add test 10.10.30.210 +add test 10.10.30.211 +add test 10.10.30.212 +add test 10.10.30.213 +add test 10.10.30.214 +add test 10.10.30.215 +add test 10.10.30.216 +add test 10.10.30.217 +add test 10.10.30.218 +add test 10.10.30.219 +add test 10.10.30.22 +add test 10.10.30.220 +add test 10.10.30.221 +add test 10.10.30.222 +add test 10.10.30.223 +add test 10.10.30.224 +add test 10.10.30.225 +add test 10.10.30.226 +add test 10.10.30.227 +add test 10.10.30.228 +add test 10.10.30.229 +add test 10.10.30.23 +add test 10.10.30.230 +add test 10.10.30.231 +add test 10.10.30.232 +add test 10.10.30.233 +add test 10.10.30.234 +add test 10.10.30.235 +add test 10.10.30.236 +add test 10.10.30.237 +add test 10.10.30.238 +add test 10.10.30.239 +add test 10.10.30.24 +add test 10.10.30.240 +add test 10.10.30.241 +add test 10.10.30.242 +add test 10.10.30.243 +add test 10.10.30.244 +add test 10.10.30.245 +add test 10.10.30.246 +add test 10.10.30.247 +add test 10.10.30.248 +add test 10.10.30.249 +add test 10.10.30.25 +add test 10.10.30.250 +add test 10.10.30.251 +add test 10.10.30.252 +add test 10.10.30.253 +add test 10.10.30.254 +add test 10.10.30.255 +add test 10.10.30.26 +add test 10.10.30.27 +add test 10.10.30.28 +add test 10.10.30.29 +add test 10.10.30.3 +add test 10.10.30.30 +add test 10.10.30.31 +add test 10.10.30.32 +add test 10.10.30.33 +add test 10.10.30.34 +add test 10.10.30.35 +add test 10.10.30.36 +add test 10.10.30.37 +add test 10.10.30.38 +add test 10.10.30.39 +add test 10.10.30.4 +add test 10.10.30.40 +add test 10.10.30.41 +add test 10.10.30.42 +add test 10.10.30.43 +add test 10.10.30.44 +add test 10.10.30.45 +add test 10.10.30.46 +add test 10.10.30.47 +add test 10.10.30.48 +add test 10.10.30.49 +add test 10.10.30.5 +add test 10.10.30.50 +add test 10.10.30.51 +add test 10.10.30.52 +add test 10.10.30.53 +add test 10.10.30.54 +add test 10.10.30.55 +add test 10.10.30.56 +add test 10.10.30.57 +add test 10.10.30.58 +add test 10.10.30.59 +add test 10.10.30.6 +add test 10.10.30.60 +add test 10.10.30.61 +add test 10.10.30.62 +add test 10.10.30.63 +add test 10.10.30.64 +add test 10.10.30.65 +add test 10.10.30.66 +add test 10.10.30.67 +add test 10.10.30.68 +add test 10.10.30.69 +add test 10.10.30.7 +add test 10.10.30.70 +add test 10.10.30.71 +add test 10.10.30.72 +add test 10.10.30.73 +add test 10.10.30.74 +add test 10.10.30.75 +add test 10.10.30.76 +add test 10.10.30.77 +add test 10.10.30.78 +add test 10.10.30.79 +add test 10.10.30.8 +add test 10.10.30.80 +add test 10.10.30.81 +add test 10.10.30.82 +add test 10.10.30.83 +add test 10.10.30.84 +add test 10.10.30.85 +add test 10.10.30.86 +add test 10.10.30.87 +add test 10.10.30.88 +add test 10.10.30.89 +add test 10.10.30.9 +add test 10.10.30.90 +add test 10.10.30.91 +add test 10.10.30.92 +add test 10.10.30.93 +add test 10.10.30.94 +add test 10.10.30.95 +add test 10.10.30.96 +add test 10.10.30.97 +add test 10.10.30.98 +add test 10.10.30.99 +add test 10.10.31.0 +add test 10.10.31.1 +add test 10.10.31.10 +add test 10.10.31.100 +add test 10.10.31.101 +add test 10.10.31.102 +add test 10.10.31.103 +add test 10.10.31.104 +add test 10.10.31.105 +add test 10.10.31.106 +add test 10.10.31.107 +add test 10.10.31.108 +add test 10.10.31.109 +add test 10.10.31.11 +add test 10.10.31.110 +add test 10.10.31.111 +add test 10.10.31.112 +add test 10.10.31.113 +add test 10.10.31.114 +add test 10.10.31.115 +add test 10.10.31.116 +add test 10.10.31.117 +add test 10.10.31.118 +add test 10.10.31.119 +add test 10.10.31.12 +add test 10.10.31.120 +add test 10.10.31.121 +add test 10.10.31.122 +add test 10.10.31.123 +add test 10.10.31.124 +add test 10.10.31.125 +add test 10.10.31.126 +add test 10.10.31.127 +add test 10.10.31.128 +add test 10.10.31.129 +add test 10.10.31.13 +add test 10.10.31.130 +add test 10.10.31.131 +add test 10.10.31.132 +add test 10.10.31.133 +add test 10.10.31.134 +add test 10.10.31.135 +add test 10.10.31.136 +add test 10.10.31.137 +add test 10.10.31.138 +add test 10.10.31.139 +add test 10.10.31.14 +add test 10.10.31.140 +add test 10.10.31.141 +add test 10.10.31.142 +add test 10.10.31.143 +add test 10.10.31.144 +add test 10.10.31.145 +add test 10.10.31.146 +add test 10.10.31.147 +add test 10.10.31.148 +add test 10.10.31.149 +add test 10.10.31.15 +add test 10.10.31.150 +add test 10.10.31.151 +add test 10.10.31.152 +add test 10.10.31.153 +add test 10.10.31.154 +add test 10.10.31.155 +add test 10.10.31.156 +add test 10.10.31.157 +add test 10.10.31.158 +add test 10.10.31.159 +add test 10.10.31.16 +add test 10.10.31.160 +add test 10.10.31.161 +add test 10.10.31.162 +add test 10.10.31.163 +add test 10.10.31.164 +add test 10.10.31.165 +add test 10.10.31.166 +add test 10.10.31.167 +add test 10.10.31.168 +add test 10.10.31.169 +add test 10.10.31.17 +add test 10.10.31.170 +add test 10.10.31.171 +add test 10.10.31.172 +add test 10.10.31.173 +add test 10.10.31.174 +add test 10.10.31.175 +add test 10.10.31.176 +add test 10.10.31.177 +add test 10.10.31.178 +add test 10.10.31.179 +add test 10.10.31.18 +add test 10.10.31.180 +add test 10.10.31.181 +add test 10.10.31.182 +add test 10.10.31.183 +add test 10.10.31.184 +add test 10.10.31.185 +add test 10.10.31.186 +add test 10.10.31.187 +add test 10.10.31.188 +add test 10.10.31.189 +add test 10.10.31.19 +add test 10.10.31.190 +add test 10.10.31.191 +add test 10.10.31.192 +add test 10.10.31.193 +add test 10.10.31.194 +add test 10.10.31.195 +add test 10.10.31.196 +add test 10.10.31.197 +add test 10.10.31.198 +add test 10.10.31.199 +add test 10.10.31.2 +add test 10.10.31.20 +add test 10.10.31.200 +add test 10.10.31.201 +add test 10.10.31.202 +add test 10.10.31.203 +add test 10.10.31.204 +add test 10.10.31.205 +add test 10.10.31.206 +add test 10.10.31.207 +add test 10.10.31.208 +add test 10.10.31.209 +add test 10.10.31.21 +add test 10.10.31.210 +add test 10.10.31.211 +add test 10.10.31.212 +add test 10.10.31.213 +add test 10.10.31.214 +add test 10.10.31.215 +add test 10.10.31.216 +add test 10.10.31.217 +add test 10.10.31.218 +add test 10.10.31.219 +add test 10.10.31.22 +add test 10.10.31.220 +add test 10.10.31.221 +add test 10.10.31.222 +add test 10.10.31.223 +add test 10.10.31.224 +add test 10.10.31.225 +add test 10.10.31.226 +add test 10.10.31.227 +add test 10.10.31.228 +add test 10.10.31.229 +add test 10.10.31.23 +add test 10.10.31.230 +add test 10.10.31.231 +add test 10.10.31.232 +add test 10.10.31.233 +add test 10.10.31.234 +add test 10.10.31.235 +add test 10.10.31.236 +add test 10.10.31.237 +add test 10.10.31.238 +add test 10.10.31.239 +add test 10.10.31.24 +add test 10.10.31.240 +add test 10.10.31.241 +add test 10.10.31.242 +add test 10.10.31.243 +add test 10.10.31.244 +add test 10.10.31.245 +add test 10.10.31.246 +add test 10.10.31.247 +add test 10.10.31.248 +add test 10.10.31.249 +add test 10.10.31.25 +add test 10.10.31.250 +add test 10.10.31.251 +add test 10.10.31.252 +add test 10.10.31.253 +add test 10.10.31.254 +add test 10.10.31.255 +add test 10.10.31.26 +add test 10.10.31.27 +add test 10.10.31.28 +add test 10.10.31.29 +add test 10.10.31.3 +add test 10.10.31.30 +add test 10.10.31.31 +add test 10.10.31.32 +add test 10.10.31.33 +add test 10.10.31.34 +add test 10.10.31.35 +add test 10.10.31.36 +add test 10.10.31.37 +add test 10.10.31.38 +add test 10.10.31.39 +add test 10.10.31.4 +add test 10.10.31.40 +add test 10.10.31.41 +add test 10.10.31.42 +add test 10.10.31.43 +add test 10.10.31.44 +add test 10.10.31.45 +add test 10.10.31.46 +add test 10.10.31.47 +add test 10.10.31.48 +add test 10.10.31.49 +add test 10.10.31.5 +add test 10.10.31.50 +add test 10.10.31.51 +add test 10.10.31.52 +add test 10.10.31.53 +add test 10.10.31.54 +add test 10.10.31.55 +add test 10.10.31.56 +add test 10.10.31.57 +add test 10.10.31.58 +add test 10.10.31.59 +add test 10.10.31.6 +add test 10.10.31.60 +add test 10.10.31.61 +add test 10.10.31.62 +add test 10.10.31.63 +add test 10.10.31.64 +add test 10.10.31.65 +add test 10.10.31.66 +add test 10.10.31.67 +add test 10.10.31.68 +add test 10.10.31.69 +add test 10.10.31.7 +add test 10.10.31.70 +add test 10.10.31.71 +add test 10.10.31.72 +add test 10.10.31.73 +add test 10.10.31.74 +add test 10.10.31.75 +add test 10.10.31.76 +add test 10.10.31.77 +add test 10.10.31.78 +add test 10.10.31.79 +add test 10.10.31.8 +add test 10.10.31.80 +add test 10.10.31.81 +add test 10.10.31.82 +add test 10.10.31.83 +add test 10.10.31.84 +add test 10.10.31.85 +add test 10.10.31.86 +add test 10.10.31.87 +add test 10.10.31.88 +add test 10.10.31.89 +add test 10.10.31.9 +add test 10.10.31.90 +add test 10.10.31.91 +add test 10.10.31.92 +add test 10.10.31.93 +add test 10.10.31.94 +add test 10.10.31.95 +add test 10.10.31.96 +add test 10.10.31.97 +add test 10.10.31.98 +add test 10.10.31.99 +add test 10.10.32.0 +add test 10.10.32.1 +add test 10.10.32.10 +add test 10.10.32.100 +add test 10.10.32.101 +add test 10.10.32.102 +add test 10.10.32.103 +add test 10.10.32.104 +add test 10.10.32.105 +add test 10.10.32.106 +add test 10.10.32.107 +add test 10.10.32.108 +add test 10.10.32.109 +add test 10.10.32.11 +add test 10.10.32.110 +add test 10.10.32.111 +add test 10.10.32.112 +add test 10.10.32.113 +add test 10.10.32.114 +add test 10.10.32.115 +add test 10.10.32.116 +add test 10.10.32.117 +add test 10.10.32.118 +add test 10.10.32.119 +add test 10.10.32.12 +add test 10.10.32.120 +add test 10.10.32.121 +add test 10.10.32.122 +add test 10.10.32.123 +add test 10.10.32.124 +add test 10.10.32.125 +add test 10.10.32.126 +add test 10.10.32.127 +add test 10.10.32.128 +add test 10.10.32.129 +add test 10.10.32.13 +add test 10.10.32.130 +add test 10.10.32.131 +add test 10.10.32.132 +add test 10.10.32.133 +add test 10.10.32.134 +add test 10.10.32.135 +add test 10.10.32.136 +add test 10.10.32.137 +add test 10.10.32.138 +add test 10.10.32.139 +add test 10.10.32.14 +add test 10.10.32.140 +add test 10.10.32.141 +add test 10.10.32.142 +add test 10.10.32.143 +add test 10.10.32.144 +add test 10.10.32.145 +add test 10.10.32.146 +add test 10.10.32.147 +add test 10.10.32.148 +add test 10.10.32.149 +add test 10.10.32.15 +add test 10.10.32.150 +add test 10.10.32.151 +add test 10.10.32.152 +add test 10.10.32.153 +add test 10.10.32.154 +add test 10.10.32.155 +add test 10.10.32.156 +add test 10.10.32.157 +add test 10.10.32.158 +add test 10.10.32.159 +add test 10.10.32.16 +add test 10.10.32.160 +add test 10.10.32.161 +add test 10.10.32.162 +add test 10.10.32.163 +add test 10.10.32.164 +add test 10.10.32.165 +add test 10.10.32.166 +add test 10.10.32.167 +add test 10.10.32.168 +add test 10.10.32.169 +add test 10.10.32.17 +add test 10.10.32.170 +add test 10.10.32.171 +add test 10.10.32.172 +add test 10.10.32.173 +add test 10.10.32.174 +add test 10.10.32.175 +add test 10.10.32.176 +add test 10.10.32.177 +add test 10.10.32.178 +add test 10.10.32.179 +add test 10.10.32.18 +add test 10.10.32.180 +add test 10.10.32.181 +add test 10.10.32.182 +add test 10.10.32.183 +add test 10.10.32.184 +add test 10.10.32.185 +add test 10.10.32.186 +add test 10.10.32.187 +add test 10.10.32.188 +add test 10.10.32.189 +add test 10.10.32.19 +add test 10.10.32.190 +add test 10.10.32.191 +add test 10.10.32.192 +add test 10.10.32.193 +add test 10.10.32.194 +add test 10.10.32.195 +add test 10.10.32.196 +add test 10.10.32.197 +add test 10.10.32.198 +add test 10.10.32.199 +add test 10.10.32.2 +add test 10.10.32.20 +add test 10.10.32.200 +add test 10.10.32.201 +add test 10.10.32.202 +add test 10.10.32.203 +add test 10.10.32.204 +add test 10.10.32.205 +add test 10.10.32.206 +add test 10.10.32.207 +add test 10.10.32.208 +add test 10.10.32.209 +add test 10.10.32.21 +add test 10.10.32.210 +add test 10.10.32.211 +add test 10.10.32.212 +add test 10.10.32.213 +add test 10.10.32.214 +add test 10.10.32.215 +add test 10.10.32.216 +add test 10.10.32.217 +add test 10.10.32.218 +add test 10.10.32.219 +add test 10.10.32.22 +add test 10.10.32.220 +add test 10.10.32.221 +add test 10.10.32.222 +add test 10.10.32.223 +add test 10.10.32.224 +add test 10.10.32.225 +add test 10.10.32.226 +add test 10.10.32.227 +add test 10.10.32.228 +add test 10.10.32.229 +add test 10.10.32.23 +add test 10.10.32.230 +add test 10.10.32.231 +add test 10.10.32.232 +add test 10.10.32.233 +add test 10.10.32.234 +add test 10.10.32.235 +add test 10.10.32.236 +add test 10.10.32.237 +add test 10.10.32.238 +add test 10.10.32.239 +add test 10.10.32.24 +add test 10.10.32.240 +add test 10.10.32.241 +add test 10.10.32.242 +add test 10.10.32.243 +add test 10.10.32.244 +add test 10.10.32.245 +add test 10.10.32.246 +add test 10.10.32.247 +add test 10.10.32.248 +add test 10.10.32.249 +add test 10.10.32.25 +add test 10.10.32.250 +add test 10.10.32.251 +add test 10.10.32.252 +add test 10.10.32.253 +add test 10.10.32.254 +add test 10.10.32.255 +add test 10.10.32.26 +add test 10.10.32.27 +add test 10.10.32.28 +add test 10.10.32.29 +add test 10.10.32.3 +add test 10.10.32.30 +add test 10.10.32.31 +add test 10.10.32.32 +add test 10.10.32.33 +add test 10.10.32.34 +add test 10.10.32.35 +add test 10.10.32.36 +add test 10.10.32.37 +add test 10.10.32.38 +add test 10.10.32.39 +add test 10.10.32.4 +add test 10.10.32.40 +add test 10.10.32.41 +add test 10.10.32.42 +add test 10.10.32.43 +add test 10.10.32.44 +add test 10.10.32.45 +add test 10.10.32.46 +add test 10.10.32.47 +add test 10.10.32.48 +add test 10.10.32.49 +add test 10.10.32.5 +add test 10.10.32.50 +add test 10.10.32.51 +add test 10.10.32.52 +add test 10.10.32.53 +add test 10.10.32.54 +add test 10.10.32.55 +add test 10.10.32.56 +add test 10.10.32.57 +add test 10.10.32.58 +add test 10.10.32.59 +add test 10.10.32.6 +add test 10.10.32.60 +add test 10.10.32.61 +add test 10.10.32.62 +add test 10.10.32.63 +add test 10.10.32.64 +add test 10.10.32.65 +add test 10.10.32.66 +add test 10.10.32.67 +add test 10.10.32.68 +add test 10.10.32.69 +add test 10.10.32.7 +add test 10.10.32.70 +add test 10.10.32.71 +add test 10.10.32.72 +add test 10.10.32.73 +add test 10.10.32.74 +add test 10.10.32.75 +add test 10.10.32.76 +add test 10.10.32.77 +add test 10.10.32.78 +add test 10.10.32.79 +add test 10.10.32.8 +add test 10.10.32.80 +add test 10.10.32.81 +add test 10.10.32.82 +add test 10.10.32.83 +add test 10.10.32.84 +add test 10.10.32.85 +add test 10.10.32.86 +add test 10.10.32.87 +add test 10.10.32.88 +add test 10.10.32.89 +add test 10.10.32.9 +add test 10.10.32.90 +add test 10.10.32.91 +add test 10.10.32.92 +add test 10.10.32.93 +add test 10.10.32.94 +add test 10.10.32.95 +add test 10.10.32.96 +add test 10.10.32.97 +add test 10.10.32.98 +add test 10.10.32.99 +add test 10.10.33.0 +add test 10.10.33.1 +add test 10.10.33.10 +add test 10.10.33.100 +add test 10.10.33.101 +add test 10.10.33.102 +add test 10.10.33.103 +add test 10.10.33.104 +add test 10.10.33.105 +add test 10.10.33.106 +add test 10.10.33.107 +add test 10.10.33.108 +add test 10.10.33.109 +add test 10.10.33.11 +add test 10.10.33.110 +add test 10.10.33.111 +add test 10.10.33.112 +add test 10.10.33.113 +add test 10.10.33.114 +add test 10.10.33.115 +add test 10.10.33.116 +add test 10.10.33.117 +add test 10.10.33.118 +add test 10.10.33.119 +add test 10.10.33.12 +add test 10.10.33.120 +add test 10.10.33.121 +add test 10.10.33.122 +add test 10.10.33.123 +add test 10.10.33.124 +add test 10.10.33.125 +add test 10.10.33.126 +add test 10.10.33.127 +add test 10.10.33.128 +add test 10.10.33.129 +add test 10.10.33.13 +add test 10.10.33.130 +add test 10.10.33.131 +add test 10.10.33.132 +add test 10.10.33.133 +add test 10.10.33.134 +add test 10.10.33.135 +add test 10.10.33.136 +add test 10.10.33.137 +add test 10.10.33.138 +add test 10.10.33.139 +add test 10.10.33.14 +add test 10.10.33.140 +add test 10.10.33.141 +add test 10.10.33.142 +add test 10.10.33.143 +add test 10.10.33.144 +add test 10.10.33.145 +add test 10.10.33.146 +add test 10.10.33.147 +add test 10.10.33.148 +add test 10.10.33.149 +add test 10.10.33.15 +add test 10.10.33.150 +add test 10.10.33.151 +add test 10.10.33.152 +add test 10.10.33.153 +add test 10.10.33.154 +add test 10.10.33.155 +add test 10.10.33.156 +add test 10.10.33.157 +add test 10.10.33.158 +add test 10.10.33.159 +add test 10.10.33.16 +add test 10.10.33.160 +add test 10.10.33.161 +add test 10.10.33.162 +add test 10.10.33.163 +add test 10.10.33.164 +add test 10.10.33.165 +add test 10.10.33.166 +add test 10.10.33.167 +add test 10.10.33.168 +add test 10.10.33.169 +add test 10.10.33.17 +add test 10.10.33.170 +add test 10.10.33.171 +add test 10.10.33.172 +add test 10.10.33.173 +add test 10.10.33.174 +add test 10.10.33.175 +add test 10.10.33.176 +add test 10.10.33.177 +add test 10.10.33.178 +add test 10.10.33.179 +add test 10.10.33.18 +add test 10.10.33.180 +add test 10.10.33.181 +add test 10.10.33.182 +add test 10.10.33.183 +add test 10.10.33.184 +add test 10.10.33.185 +add test 10.10.33.186 +add test 10.10.33.187 +add test 10.10.33.188 +add test 10.10.33.189 +add test 10.10.33.19 +add test 10.10.33.190 +add test 10.10.33.191 +add test 10.10.33.192 +add test 10.10.33.193 +add test 10.10.33.194 +add test 10.10.33.195 +add test 10.10.33.196 +add test 10.10.33.197 +add test 10.10.33.198 +add test 10.10.33.199 +add test 10.10.33.2 +add test 10.10.33.20 +add test 10.10.33.200 +add test 10.10.33.201 +add test 10.10.33.202 +add test 10.10.33.203 +add test 10.10.33.204 +add test 10.10.33.205 +add test 10.10.33.206 +add test 10.10.33.207 +add test 10.10.33.208 +add test 10.10.33.209 +add test 10.10.33.21 +add test 10.10.33.210 +add test 10.10.33.211 +add test 10.10.33.212 +add test 10.10.33.213 +add test 10.10.33.214 +add test 10.10.33.215 +add test 10.10.33.216 +add test 10.10.33.217 +add test 10.10.33.218 +add test 10.10.33.219 +add test 10.10.33.22 +add test 10.10.33.220 +add test 10.10.33.221 +add test 10.10.33.222 +add test 10.10.33.223 +add test 10.10.33.224 +add test 10.10.33.225 +add test 10.10.33.226 +add test 10.10.33.227 +add test 10.10.33.228 +add test 10.10.33.229 +add test 10.10.33.23 +add test 10.10.33.230 +add test 10.10.33.231 +add test 10.10.33.232 +add test 10.10.33.233 +add test 10.10.33.234 +add test 10.10.33.235 +add test 10.10.33.236 +add test 10.10.33.237 +add test 10.10.33.238 +add test 10.10.33.239 +add test 10.10.33.24 +add test 10.10.33.240 +add test 10.10.33.241 +add test 10.10.33.242 +add test 10.10.33.243 +add test 10.10.33.244 +add test 10.10.33.245 +add test 10.10.33.246 +add test 10.10.33.247 +add test 10.10.33.248 +add test 10.10.33.249 +add test 10.10.33.25 +add test 10.10.33.250 +add test 10.10.33.251 +add test 10.10.33.252 +add test 10.10.33.253 +add test 10.10.33.254 +add test 10.10.33.255 +add test 10.10.33.26 +add test 10.10.33.27 +add test 10.10.33.28 +add test 10.10.33.29 +add test 10.10.33.3 +add test 10.10.33.30 +add test 10.10.33.31 +add test 10.10.33.32 +add test 10.10.33.33 +add test 10.10.33.34 +add test 10.10.33.35 +add test 10.10.33.36 +add test 10.10.33.37 +add test 10.10.33.38 +add test 10.10.33.39 +add test 10.10.33.4 +add test 10.10.33.40 +add test 10.10.33.41 +add test 10.10.33.42 +add test 10.10.33.43 +add test 10.10.33.44 +add test 10.10.33.45 +add test 10.10.33.46 +add test 10.10.33.47 +add test 10.10.33.48 +add test 10.10.33.49 +add test 10.10.33.5 +add test 10.10.33.50 +add test 10.10.33.51 +add test 10.10.33.52 +add test 10.10.33.53 +add test 10.10.33.54 +add test 10.10.33.55 +add test 10.10.33.56 +add test 10.10.33.57 +add test 10.10.33.58 +add test 10.10.33.59 +add test 10.10.33.6 +add test 10.10.33.60 +add test 10.10.33.61 +add test 10.10.33.62 +add test 10.10.33.63 +add test 10.10.33.64 +add test 10.10.33.65 +add test 10.10.33.66 +add test 10.10.33.67 +add test 10.10.33.68 +add test 10.10.33.69 +add test 10.10.33.7 +add test 10.10.33.70 +add test 10.10.33.71 +add test 10.10.33.72 +add test 10.10.33.73 +add test 10.10.33.74 +add test 10.10.33.75 +add test 10.10.33.76 +add test 10.10.33.77 +add test 10.10.33.78 +add test 10.10.33.79 +add test 10.10.33.8 +add test 10.10.33.80 +add test 10.10.33.81 +add test 10.10.33.82 +add test 10.10.33.83 +add test 10.10.33.84 +add test 10.10.33.85 +add test 10.10.33.86 +add test 10.10.33.87 +add test 10.10.33.88 +add test 10.10.33.89 +add test 10.10.33.9 +add test 10.10.33.90 +add test 10.10.33.91 +add test 10.10.33.92 +add test 10.10.33.93 +add test 10.10.33.94 +add test 10.10.33.95 +add test 10.10.33.96 +add test 10.10.33.97 +add test 10.10.33.98 +add test 10.10.33.99 +add test 10.10.34.0 +add test 10.10.34.1 +add test 10.10.34.10 +add test 10.10.34.100 +add test 10.10.34.101 +add test 10.10.34.102 +add test 10.10.34.103 +add test 10.10.34.104 +add test 10.10.34.105 +add test 10.10.34.106 +add test 10.10.34.107 +add test 10.10.34.108 +add test 10.10.34.109 +add test 10.10.34.11 +add test 10.10.34.110 +add test 10.10.34.111 +add test 10.10.34.112 +add test 10.10.34.113 +add test 10.10.34.114 +add test 10.10.34.115 +add test 10.10.34.116 +add test 10.10.34.117 +add test 10.10.34.118 +add test 10.10.34.119 +add test 10.10.34.12 +add test 10.10.34.120 +add test 10.10.34.121 +add test 10.10.34.122 +add test 10.10.34.123 +add test 10.10.34.124 +add test 10.10.34.125 +add test 10.10.34.126 +add test 10.10.34.127 +add test 10.10.34.128 +add test 10.10.34.129 +add test 10.10.34.13 +add test 10.10.34.130 +add test 10.10.34.131 +add test 10.10.34.132 +add test 10.10.34.133 +add test 10.10.34.134 +add test 10.10.34.135 +add test 10.10.34.136 +add test 10.10.34.137 +add test 10.10.34.138 +add test 10.10.34.139 +add test 10.10.34.14 +add test 10.10.34.140 +add test 10.10.34.141 +add test 10.10.34.142 +add test 10.10.34.143 +add test 10.10.34.144 +add test 10.10.34.145 +add test 10.10.34.146 +add test 10.10.34.147 +add test 10.10.34.148 +add test 10.10.34.149 +add test 10.10.34.15 +add test 10.10.34.150 +add test 10.10.34.151 +add test 10.10.34.152 +add test 10.10.34.153 +add test 10.10.34.154 +add test 10.10.34.155 +add test 10.10.34.156 +add test 10.10.34.157 +add test 10.10.34.158 +add test 10.10.34.159 +add test 10.10.34.16 +add test 10.10.34.160 +add test 10.10.34.161 +add test 10.10.34.162 +add test 10.10.34.163 +add test 10.10.34.164 +add test 10.10.34.165 +add test 10.10.34.166 +add test 10.10.34.167 +add test 10.10.34.168 +add test 10.10.34.169 +add test 10.10.34.17 +add test 10.10.34.170 +add test 10.10.34.171 +add test 10.10.34.172 +add test 10.10.34.173 +add test 10.10.34.174 +add test 10.10.34.175 +add test 10.10.34.176 +add test 10.10.34.177 +add test 10.10.34.178 +add test 10.10.34.179 +add test 10.10.34.18 +add test 10.10.34.180 +add test 10.10.34.181 +add test 10.10.34.182 +add test 10.10.34.183 +add test 10.10.34.184 +add test 10.10.34.185 +add test 10.10.34.186 +add test 10.10.34.187 +add test 10.10.34.188 +add test 10.10.34.189 +add test 10.10.34.19 +add test 10.10.34.190 +add test 10.10.34.191 +add test 10.10.34.192 +add test 10.10.34.193 +add test 10.10.34.194 +add test 10.10.34.195 +add test 10.10.34.196 +add test 10.10.34.197 +add test 10.10.34.198 +add test 10.10.34.199 +add test 10.10.34.2 +add test 10.10.34.20 +add test 10.10.34.200 +add test 10.10.34.201 +add test 10.10.34.202 +add test 10.10.34.203 +add test 10.10.34.204 +add test 10.10.34.205 +add test 10.10.34.206 +add test 10.10.34.207 +add test 10.10.34.208 +add test 10.10.34.209 +add test 10.10.34.21 +add test 10.10.34.210 +add test 10.10.34.211 +add test 10.10.34.212 +add test 10.10.34.213 +add test 10.10.34.214 +add test 10.10.34.215 +add test 10.10.34.216 +add test 10.10.34.217 +add test 10.10.34.218 +add test 10.10.34.219 +add test 10.10.34.22 +add test 10.10.34.220 +add test 10.10.34.221 +add test 10.10.34.222 +add test 10.10.34.223 +add test 10.10.34.224 +add test 10.10.34.225 +add test 10.10.34.226 +add test 10.10.34.227 +add test 10.10.34.228 +add test 10.10.34.229 +add test 10.10.34.23 +add test 10.10.34.230 +add test 10.10.34.231 +add test 10.10.34.232 +add test 10.10.34.233 +add test 10.10.34.234 +add test 10.10.34.235 +add test 10.10.34.236 +add test 10.10.34.237 +add test 10.10.34.238 +add test 10.10.34.239 +add test 10.10.34.24 +add test 10.10.34.240 +add test 10.10.34.241 +add test 10.10.34.242 +add test 10.10.34.243 +add test 10.10.34.244 +add test 10.10.34.245 +add test 10.10.34.246 +add test 10.10.34.247 +add test 10.10.34.248 +add test 10.10.34.249 +add test 10.10.34.25 +add test 10.10.34.250 +add test 10.10.34.251 +add test 10.10.34.252 +add test 10.10.34.253 +add test 10.10.34.254 +add test 10.10.34.255 +add test 10.10.34.26 +add test 10.10.34.27 +add test 10.10.34.28 +add test 10.10.34.29 +add test 10.10.34.3 +add test 10.10.34.30 +add test 10.10.34.31 +add test 10.10.34.32 +add test 10.10.34.33 +add test 10.10.34.34 +add test 10.10.34.35 +add test 10.10.34.36 +add test 10.10.34.37 +add test 10.10.34.38 +add test 10.10.34.39 +add test 10.10.34.4 +add test 10.10.34.40 +add test 10.10.34.41 +add test 10.10.34.42 +add test 10.10.34.43 +add test 10.10.34.44 +add test 10.10.34.45 +add test 10.10.34.46 +add test 10.10.34.47 +add test 10.10.34.48 +add test 10.10.34.49 +add test 10.10.34.5 +add test 10.10.34.50 +add test 10.10.34.51 +add test 10.10.34.52 +add test 10.10.34.53 +add test 10.10.34.54 +add test 10.10.34.55 +add test 10.10.34.56 +add test 10.10.34.57 +add test 10.10.34.58 +add test 10.10.34.59 +add test 10.10.34.6 +add test 10.10.34.60 +add test 10.10.34.61 +add test 10.10.34.62 +add test 10.10.34.63 +add test 10.10.34.64 +add test 10.10.34.65 +add test 10.10.34.66 +add test 10.10.34.67 +add test 10.10.34.68 +add test 10.10.34.69 +add test 10.10.34.7 +add test 10.10.34.70 +add test 10.10.34.71 +add test 10.10.34.72 +add test 10.10.34.73 +add test 10.10.34.74 +add test 10.10.34.75 +add test 10.10.34.76 +add test 10.10.34.77 +add test 10.10.34.78 +add test 10.10.34.79 +add test 10.10.34.8 +add test 10.10.34.80 +add test 10.10.34.81 +add test 10.10.34.82 +add test 10.10.34.83 +add test 10.10.34.84 +add test 10.10.34.85 +add test 10.10.34.86 +add test 10.10.34.87 +add test 10.10.34.88 +add test 10.10.34.89 +add test 10.10.34.9 +add test 10.10.34.90 +add test 10.10.34.91 +add test 10.10.34.92 +add test 10.10.34.93 +add test 10.10.34.94 +add test 10.10.34.95 +add test 10.10.34.96 +add test 10.10.34.97 +add test 10.10.34.98 +add test 10.10.34.99 +add test 10.10.35.0 +add test 10.10.35.1 +add test 10.10.35.10 +add test 10.10.35.100 +add test 10.10.35.101 +add test 10.10.35.102 +add test 10.10.35.103 +add test 10.10.35.104 +add test 10.10.35.105 +add test 10.10.35.106 +add test 10.10.35.107 +add test 10.10.35.108 +add test 10.10.35.109 +add test 10.10.35.11 +add test 10.10.35.110 +add test 10.10.35.111 +add test 10.10.35.112 +add test 10.10.35.113 +add test 10.10.35.114 +add test 10.10.35.115 +add test 10.10.35.116 +add test 10.10.35.117 +add test 10.10.35.118 +add test 10.10.35.119 +add test 10.10.35.12 +add test 10.10.35.120 +add test 10.10.35.121 +add test 10.10.35.122 +add test 10.10.35.123 +add test 10.10.35.124 +add test 10.10.35.125 +add test 10.10.35.126 +add test 10.10.35.127 +add test 10.10.35.128 +add test 10.10.35.129 +add test 10.10.35.13 +add test 10.10.35.130 +add test 10.10.35.131 +add test 10.10.35.132 +add test 10.10.35.133 +add test 10.10.35.134 +add test 10.10.35.135 +add test 10.10.35.136 +add test 10.10.35.137 +add test 10.10.35.138 +add test 10.10.35.139 +add test 10.10.35.14 +add test 10.10.35.140 +add test 10.10.35.141 +add test 10.10.35.142 +add test 10.10.35.143 +add test 10.10.35.144 +add test 10.10.35.145 +add test 10.10.35.146 +add test 10.10.35.147 +add test 10.10.35.148 +add test 10.10.35.149 +add test 10.10.35.15 +add test 10.10.35.150 +add test 10.10.35.151 +add test 10.10.35.152 +add test 10.10.35.153 +add test 10.10.35.154 +add test 10.10.35.155 +add test 10.10.35.156 +add test 10.10.35.157 +add test 10.10.35.158 +add test 10.10.35.159 +add test 10.10.35.16 +add test 10.10.35.160 +add test 10.10.35.161 +add test 10.10.35.162 +add test 10.10.35.163 +add test 10.10.35.164 +add test 10.10.35.165 +add test 10.10.35.166 +add test 10.10.35.167 +add test 10.10.35.168 +add test 10.10.35.169 +add test 10.10.35.17 +add test 10.10.35.170 +add test 10.10.35.171 +add test 10.10.35.172 +add test 10.10.35.173 +add test 10.10.35.174 +add test 10.10.35.175 +add test 10.10.35.176 +add test 10.10.35.177 +add test 10.10.35.178 +add test 10.10.35.179 +add test 10.10.35.18 +add test 10.10.35.180 +add test 10.10.35.181 +add test 10.10.35.182 +add test 10.10.35.183 +add test 10.10.35.184 +add test 10.10.35.185 +add test 10.10.35.186 +add test 10.10.35.187 +add test 10.10.35.188 +add test 10.10.35.189 +add test 10.10.35.19 +add test 10.10.35.190 +add test 10.10.35.191 +add test 10.10.35.192 +add test 10.10.35.193 +add test 10.10.35.194 +add test 10.10.35.195 +add test 10.10.35.196 +add test 10.10.35.197 +add test 10.10.35.198 +add test 10.10.35.199 +add test 10.10.35.2 +add test 10.10.35.20 +add test 10.10.35.200 +add test 10.10.35.201 +add test 10.10.35.202 +add test 10.10.35.203 +add test 10.10.35.204 +add test 10.10.35.205 +add test 10.10.35.206 +add test 10.10.35.207 +add test 10.10.35.208 +add test 10.10.35.209 +add test 10.10.35.21 +add test 10.10.35.210 +add test 10.10.35.211 +add test 10.10.35.212 +add test 10.10.35.213 +add test 10.10.35.214 +add test 10.10.35.215 +add test 10.10.35.216 +add test 10.10.35.217 +add test 10.10.35.218 +add test 10.10.35.219 +add test 10.10.35.22 +add test 10.10.35.220 +add test 10.10.35.221 +add test 10.10.35.222 +add test 10.10.35.223 +add test 10.10.35.224 +add test 10.10.35.225 +add test 10.10.35.226 +add test 10.10.35.227 +add test 10.10.35.228 +add test 10.10.35.229 +add test 10.10.35.23 +add test 10.10.35.230 +add test 10.10.35.231 +add test 10.10.35.232 +add test 10.10.35.233 +add test 10.10.35.234 +add test 10.10.35.235 +add test 10.10.35.236 +add test 10.10.35.237 +add test 10.10.35.238 +add test 10.10.35.239 +add test 10.10.35.24 +add test 10.10.35.240 +add test 10.10.35.241 +add test 10.10.35.242 +add test 10.10.35.243 +add test 10.10.35.244 +add test 10.10.35.245 +add test 10.10.35.246 +add test 10.10.35.247 +add test 10.10.35.248 +add test 10.10.35.249 +add test 10.10.35.25 +add test 10.10.35.250 +add test 10.10.35.251 +add test 10.10.35.252 +add test 10.10.35.253 +add test 10.10.35.254 +add test 10.10.35.255 +add test 10.10.35.26 +add test 10.10.35.27 +add test 10.10.35.28 +add test 10.10.35.29 +add test 10.10.35.3 +add test 10.10.35.30 +add test 10.10.35.31 +add test 10.10.35.32 +add test 10.10.35.33 +add test 10.10.35.34 +add test 10.10.35.35 +add test 10.10.35.36 +add test 10.10.35.37 +add test 10.10.35.38 +add test 10.10.35.39 +add test 10.10.35.4 +add test 10.10.35.40 +add test 10.10.35.41 +add test 10.10.35.42 +add test 10.10.35.43 +add test 10.10.35.44 +add test 10.10.35.45 +add test 10.10.35.46 +add test 10.10.35.47 +add test 10.10.35.48 +add test 10.10.35.49 +add test 10.10.35.5 +add test 10.10.35.50 +add test 10.10.35.51 +add test 10.10.35.52 +add test 10.10.35.53 +add test 10.10.35.54 +add test 10.10.35.55 +add test 10.10.35.56 +add test 10.10.35.57 +add test 10.10.35.58 +add test 10.10.35.59 +add test 10.10.35.6 +add test 10.10.35.60 +add test 10.10.35.61 +add test 10.10.35.62 +add test 10.10.35.63 +add test 10.10.35.64 +add test 10.10.35.65 +add test 10.10.35.66 +add test 10.10.35.67 +add test 10.10.35.68 +add test 10.10.35.69 +add test 10.10.35.7 +add test 10.10.35.70 +add test 10.10.35.71 +add test 10.10.35.72 +add test 10.10.35.73 +add test 10.10.35.74 +add test 10.10.35.75 +add test 10.10.35.76 +add test 10.10.35.77 +add test 10.10.35.78 +add test 10.10.35.79 +add test 10.10.35.8 +add test 10.10.35.80 +add test 10.10.35.81 +add test 10.10.35.82 +add test 10.10.35.83 +add test 10.10.35.84 +add test 10.10.35.85 +add test 10.10.35.86 +add test 10.10.35.87 +add test 10.10.35.88 +add test 10.10.35.89 +add test 10.10.35.9 +add test 10.10.35.90 +add test 10.10.35.91 +add test 10.10.35.92 +add test 10.10.35.93 +add test 10.10.35.94 +add test 10.10.35.95 +add test 10.10.35.96 +add test 10.10.35.97 +add test 10.10.35.98 +add test 10.10.35.99 +add test 10.10.36.0 +add test 10.10.36.1 +add test 10.10.36.10 +add test 10.10.36.100 +add test 10.10.36.101 +add test 10.10.36.102 +add test 10.10.36.103 +add test 10.10.36.104 +add test 10.10.36.105 +add test 10.10.36.106 +add test 10.10.36.107 +add test 10.10.36.108 +add test 10.10.36.109 +add test 10.10.36.11 +add test 10.10.36.110 +add test 10.10.36.111 +add test 10.10.36.112 +add test 10.10.36.113 +add test 10.10.36.114 +add test 10.10.36.115 +add test 10.10.36.116 +add test 10.10.36.117 +add test 10.10.36.118 +add test 10.10.36.119 +add test 10.10.36.12 +add test 10.10.36.120 +add test 10.10.36.121 +add test 10.10.36.122 +add test 10.10.36.123 +add test 10.10.36.124 +add test 10.10.36.125 +add test 10.10.36.126 +add test 10.10.36.127 +add test 10.10.36.128 +add test 10.10.36.129 +add test 10.10.36.13 +add test 10.10.36.130 +add test 10.10.36.131 +add test 10.10.36.132 +add test 10.10.36.133 +add test 10.10.36.134 +add test 10.10.36.135 +add test 10.10.36.136 +add test 10.10.36.137 +add test 10.10.36.138 +add test 10.10.36.139 +add test 10.10.36.14 +add test 10.10.36.140 +add test 10.10.36.141 +add test 10.10.36.142 +add test 10.10.36.143 +add test 10.10.36.144 +add test 10.10.36.145 +add test 10.10.36.146 +add test 10.10.36.147 +add test 10.10.36.148 +add test 10.10.36.149 +add test 10.10.36.15 +add test 10.10.36.150 +add test 10.10.36.151 +add test 10.10.36.152 +add test 10.10.36.153 +add test 10.10.36.154 +add test 10.10.36.155 +add test 10.10.36.156 +add test 10.10.36.157 +add test 10.10.36.158 +add test 10.10.36.159 +add test 10.10.36.16 +add test 10.10.36.160 +add test 10.10.36.161 +add test 10.10.36.162 +add test 10.10.36.163 +add test 10.10.36.164 +add test 10.10.36.165 +add test 10.10.36.166 +add test 10.10.36.167 +add test 10.10.36.168 +add test 10.10.36.169 +add test 10.10.36.17 +add test 10.10.36.170 +add test 10.10.36.171 +add test 10.10.36.172 +add test 10.10.36.173 +add test 10.10.36.174 +add test 10.10.36.175 +add test 10.10.36.176 +add test 10.10.36.177 +add test 10.10.36.178 +add test 10.10.36.179 +add test 10.10.36.18 +add test 10.10.36.180 +add test 10.10.36.181 +add test 10.10.36.182 +add test 10.10.36.183 +add test 10.10.36.184 +add test 10.10.36.185 +add test 10.10.36.186 +add test 10.10.36.187 +add test 10.10.36.188 +add test 10.10.36.189 +add test 10.10.36.19 +add test 10.10.36.190 +add test 10.10.36.191 +add test 10.10.36.192 +add test 10.10.36.193 +add test 10.10.36.194 +add test 10.10.36.195 +add test 10.10.36.196 +add test 10.10.36.197 +add test 10.10.36.198 +add test 10.10.36.199 +add test 10.10.36.2 +add test 10.10.36.20 +add test 10.10.36.200 +add test 10.10.36.201 +add test 10.10.36.202 +add test 10.10.36.203 +add test 10.10.36.204 +add test 10.10.36.205 +add test 10.10.36.206 +add test 10.10.36.207 +add test 10.10.36.208 +add test 10.10.36.209 +add test 10.10.36.21 +add test 10.10.36.210 +add test 10.10.36.211 +add test 10.10.36.212 +add test 10.10.36.213 +add test 10.10.36.214 +add test 10.10.36.215 +add test 10.10.36.216 +add test 10.10.36.217 +add test 10.10.36.218 +add test 10.10.36.219 +add test 10.10.36.22 +add test 10.10.36.220 +add test 10.10.36.221 +add test 10.10.36.222 +add test 10.10.36.223 +add test 10.10.36.224 +add test 10.10.36.225 +add test 10.10.36.226 +add test 10.10.36.227 +add test 10.10.36.228 +add test 10.10.36.229 +add test 10.10.36.23 +add test 10.10.36.230 +add test 10.10.36.231 +add test 10.10.36.232 +add test 10.10.36.233 +add test 10.10.36.234 +add test 10.10.36.235 +add test 10.10.36.236 +add test 10.10.36.237 +add test 10.10.36.238 +add test 10.10.36.239 +add test 10.10.36.24 +add test 10.10.36.240 +add test 10.10.36.241 +add test 10.10.36.242 +add test 10.10.36.243 +add test 10.10.36.244 +add test 10.10.36.245 +add test 10.10.36.246 +add test 10.10.36.247 +add test 10.10.36.248 +add test 10.10.36.249 +add test 10.10.36.25 +add test 10.10.36.250 +add test 10.10.36.251 +add test 10.10.36.252 +add test 10.10.36.253 +add test 10.10.36.254 +add test 10.10.36.255 +add test 10.10.36.26 +add test 10.10.36.27 +add test 10.10.36.28 +add test 10.10.36.29 +add test 10.10.36.3 +add test 10.10.36.30 +add test 10.10.36.31 +add test 10.10.36.32 +add test 10.10.36.33 +add test 10.10.36.34 +add test 10.10.36.35 +add test 10.10.36.36 +add test 10.10.36.37 +add test 10.10.36.38 +add test 10.10.36.39 +add test 10.10.36.4 +add test 10.10.36.40 +add test 10.10.36.41 +add test 10.10.36.42 +add test 10.10.36.43 +add test 10.10.36.44 +add test 10.10.36.45 +add test 10.10.36.46 +add test 10.10.36.47 +add test 10.10.36.48 +add test 10.10.36.49 +add test 10.10.36.5 +add test 10.10.36.50 +add test 10.10.36.51 +add test 10.10.36.52 +add test 10.10.36.53 +add test 10.10.36.54 +add test 10.10.36.55 +add test 10.10.36.56 +add test 10.10.36.57 +add test 10.10.36.58 +add test 10.10.36.59 +add test 10.10.36.6 +add test 10.10.36.60 +add test 10.10.36.61 +add test 10.10.36.62 +add test 10.10.36.63 +add test 10.10.36.64 +add test 10.10.36.65 +add test 10.10.36.66 +add test 10.10.36.67 +add test 10.10.36.68 +add test 10.10.36.69 +add test 10.10.36.7 +add test 10.10.36.70 +add test 10.10.36.71 +add test 10.10.36.72 +add test 10.10.36.73 +add test 10.10.36.74 +add test 10.10.36.75 +add test 10.10.36.76 +add test 10.10.36.77 +add test 10.10.36.78 +add test 10.10.36.79 +add test 10.10.36.8 +add test 10.10.36.80 +add test 10.10.36.81 +add test 10.10.36.82 +add test 10.10.36.83 +add test 10.10.36.84 +add test 10.10.36.85 +add test 10.10.36.86 +add test 10.10.36.87 +add test 10.10.36.88 +add test 10.10.36.89 +add test 10.10.36.9 +add test 10.10.36.90 +add test 10.10.36.91 +add test 10.10.36.92 +add test 10.10.36.93 +add test 10.10.36.94 +add test 10.10.36.95 +add test 10.10.36.96 +add test 10.10.36.97 +add test 10.10.36.98 +add test 10.10.36.99 +add test 10.10.37.0 +add test 10.10.37.1 +add test 10.10.37.10 +add test 10.10.37.100 +add test 10.10.37.101 +add test 10.10.37.102 +add test 10.10.37.103 +add test 10.10.37.104 +add test 10.10.37.105 +add test 10.10.37.106 +add test 10.10.37.107 +add test 10.10.37.108 +add test 10.10.37.109 +add test 10.10.37.11 +add test 10.10.37.110 +add test 10.10.37.111 +add test 10.10.37.112 +add test 10.10.37.113 +add test 10.10.37.114 +add test 10.10.37.115 +add test 10.10.37.116 +add test 10.10.37.117 +add test 10.10.37.118 +add test 10.10.37.119 +add test 10.10.37.12 +add test 10.10.37.120 +add test 10.10.37.121 +add test 10.10.37.122 +add test 10.10.37.123 +add test 10.10.37.124 +add test 10.10.37.125 +add test 10.10.37.126 +add test 10.10.37.127 +add test 10.10.37.128 +add test 10.10.37.129 +add test 10.10.37.13 +add test 10.10.37.130 +add test 10.10.37.131 +add test 10.10.37.132 +add test 10.10.37.133 +add test 10.10.37.134 +add test 10.10.37.135 +add test 10.10.37.136 +add test 10.10.37.137 +add test 10.10.37.138 +add test 10.10.37.139 +add test 10.10.37.14 +add test 10.10.37.140 +add test 10.10.37.141 +add test 10.10.37.142 +add test 10.10.37.143 +add test 10.10.37.144 +add test 10.10.37.145 +add test 10.10.37.146 +add test 10.10.37.147 +add test 10.10.37.148 +add test 10.10.37.149 +add test 10.10.37.15 +add test 10.10.37.150 +add test 10.10.37.151 +add test 10.10.37.152 +add test 10.10.37.153 +add test 10.10.37.154 +add test 10.10.37.155 +add test 10.10.37.156 +add test 10.10.37.157 +add test 10.10.37.158 +add test 10.10.37.159 +add test 10.10.37.16 +add test 10.10.37.160 +add test 10.10.37.161 +add test 10.10.37.162 +add test 10.10.37.163 +add test 10.10.37.164 +add test 10.10.37.165 +add test 10.10.37.166 +add test 10.10.37.167 +add test 10.10.37.168 +add test 10.10.37.169 +add test 10.10.37.17 +add test 10.10.37.170 +add test 10.10.37.171 +add test 10.10.37.172 +add test 10.10.37.173 +add test 10.10.37.174 +add test 10.10.37.175 +add test 10.10.37.176 +add test 10.10.37.177 +add test 10.10.37.178 +add test 10.10.37.179 +add test 10.10.37.18 +add test 10.10.37.180 +add test 10.10.37.181 +add test 10.10.37.182 +add test 10.10.37.183 +add test 10.10.37.184 +add test 10.10.37.185 +add test 10.10.37.186 +add test 10.10.37.187 +add test 10.10.37.188 +add test 10.10.37.189 +add test 10.10.37.19 +add test 10.10.37.190 +add test 10.10.37.191 +add test 10.10.37.192 +add test 10.10.37.193 +add test 10.10.37.194 +add test 10.10.37.195 +add test 10.10.37.196 +add test 10.10.37.197 +add test 10.10.37.198 +add test 10.10.37.199 +add test 10.10.37.2 +add test 10.10.37.20 +add test 10.10.37.200 +add test 10.10.37.201 +add test 10.10.37.202 +add test 10.10.37.203 +add test 10.10.37.204 +add test 10.10.37.205 +add test 10.10.37.206 +add test 10.10.37.207 +add test 10.10.37.208 +add test 10.10.37.209 +add test 10.10.37.21 +add test 10.10.37.210 +add test 10.10.37.211 +add test 10.10.37.212 +add test 10.10.37.213 +add test 10.10.37.214 +add test 10.10.37.215 +add test 10.10.37.216 +add test 10.10.37.217 +add test 10.10.37.218 +add test 10.10.37.219 +add test 10.10.37.22 +add test 10.10.37.220 +add test 10.10.37.221 +add test 10.10.37.222 +add test 10.10.37.223 +add test 10.10.37.224 +add test 10.10.37.225 +add test 10.10.37.226 +add test 10.10.37.227 +add test 10.10.37.228 +add test 10.10.37.229 +add test 10.10.37.23 +add test 10.10.37.230 +add test 10.10.37.231 +add test 10.10.37.232 +add test 10.10.37.233 +add test 10.10.37.234 +add test 10.10.37.235 +add test 10.10.37.236 +add test 10.10.37.237 +add test 10.10.37.238 +add test 10.10.37.239 +add test 10.10.37.24 +add test 10.10.37.240 +add test 10.10.37.241 +add test 10.10.37.242 +add test 10.10.37.243 +add test 10.10.37.244 +add test 10.10.37.245 +add test 10.10.37.246 +add test 10.10.37.247 +add test 10.10.37.248 +add test 10.10.37.249 +add test 10.10.37.25 +add test 10.10.37.250 +add test 10.10.37.251 +add test 10.10.37.252 +add test 10.10.37.253 +add test 10.10.37.254 +add test 10.10.37.255 +add test 10.10.37.26 +add test 10.10.37.27 +add test 10.10.37.28 +add test 10.10.37.29 +add test 10.10.37.3 +add test 10.10.37.30 +add test 10.10.37.31 +add test 10.10.37.32 +add test 10.10.37.33 +add test 10.10.37.34 +add test 10.10.37.35 +add test 10.10.37.36 +add test 10.10.37.37 +add test 10.10.37.38 +add test 10.10.37.39 +add test 10.10.37.4 +add test 10.10.37.40 +add test 10.10.37.41 +add test 10.10.37.42 +add test 10.10.37.43 +add test 10.10.37.44 +add test 10.10.37.45 +add test 10.10.37.46 +add test 10.10.37.47 +add test 10.10.37.48 +add test 10.10.37.49 +add test 10.10.37.5 +add test 10.10.37.50 +add test 10.10.37.51 +add test 10.10.37.52 +add test 10.10.37.53 +add test 10.10.37.54 +add test 10.10.37.55 +add test 10.10.37.56 +add test 10.10.37.57 +add test 10.10.37.58 +add test 10.10.37.59 +add test 10.10.37.6 +add test 10.10.37.60 +add test 10.10.37.61 +add test 10.10.37.62 +add test 10.10.37.63 +add test 10.10.37.64 +add test 10.10.37.65 +add test 10.10.37.66 +add test 10.10.37.67 +add test 10.10.37.68 +add test 10.10.37.69 +add test 10.10.37.7 +add test 10.10.37.70 +add test 10.10.37.71 +add test 10.10.37.72 +add test 10.10.37.73 +add test 10.10.37.74 +add test 10.10.37.75 +add test 10.10.37.76 +add test 10.10.37.77 +add test 10.10.37.78 +add test 10.10.37.79 +add test 10.10.37.8 +add test 10.10.37.80 +add test 10.10.37.81 +add test 10.10.37.82 +add test 10.10.37.83 +add test 10.10.37.84 +add test 10.10.37.85 +add test 10.10.37.86 +add test 10.10.37.87 +add test 10.10.37.88 +add test 10.10.37.89 +add test 10.10.37.9 +add test 10.10.37.90 +add test 10.10.37.91 +add test 10.10.37.92 +add test 10.10.37.93 +add test 10.10.37.94 +add test 10.10.37.95 +add test 10.10.37.96 +add test 10.10.37.97 +add test 10.10.37.98 +add test 10.10.37.99 +add test 10.10.38.0 +add test 10.10.38.1 +add test 10.10.38.10 +add test 10.10.38.100 +add test 10.10.38.101 +add test 10.10.38.102 +add test 10.10.38.103 +add test 10.10.38.104 +add test 10.10.38.105 +add test 10.10.38.106 +add test 10.10.38.107 +add test 10.10.38.108 +add test 10.10.38.109 +add test 10.10.38.11 +add test 10.10.38.110 +add test 10.10.38.111 +add test 10.10.38.112 +add test 10.10.38.113 +add test 10.10.38.114 +add test 10.10.38.115 +add test 10.10.38.116 +add test 10.10.38.117 +add test 10.10.38.118 +add test 10.10.38.119 +add test 10.10.38.12 +add test 10.10.38.120 +add test 10.10.38.121 +add test 10.10.38.122 +add test 10.10.38.123 +add test 10.10.38.124 +add test 10.10.38.125 +add test 10.10.38.126 +add test 10.10.38.127 +add test 10.10.38.128 +add test 10.10.38.129 +add test 10.10.38.13 +add test 10.10.38.130 +add test 10.10.38.131 +add test 10.10.38.132 +add test 10.10.38.133 +add test 10.10.38.134 +add test 10.10.38.135 +add test 10.10.38.136 +add test 10.10.38.137 +add test 10.10.38.138 +add test 10.10.38.139 +add test 10.10.38.14 +add test 10.10.38.140 +add test 10.10.38.141 +add test 10.10.38.142 +add test 10.10.38.143 +add test 10.10.38.144 +add test 10.10.38.145 +add test 10.10.38.146 +add test 10.10.38.147 +add test 10.10.38.148 +add test 10.10.38.149 +add test 10.10.38.15 +add test 10.10.38.150 +add test 10.10.38.151 +add test 10.10.38.152 +add test 10.10.38.153 +add test 10.10.38.154 +add test 10.10.38.155 +add test 10.10.38.156 +add test 10.10.38.157 +add test 10.10.38.158 +add test 10.10.38.159 +add test 10.10.38.16 +add test 10.10.38.160 +add test 10.10.38.161 +add test 10.10.38.162 +add test 10.10.38.163 +add test 10.10.38.164 +add test 10.10.38.165 +add test 10.10.38.166 +add test 10.10.38.167 +add test 10.10.38.168 +add test 10.10.38.169 +add test 10.10.38.17 +add test 10.10.38.170 +add test 10.10.38.171 +add test 10.10.38.172 +add test 10.10.38.173 +add test 10.10.38.174 +add test 10.10.38.175 +add test 10.10.38.176 +add test 10.10.38.177 +add test 10.10.38.178 +add test 10.10.38.179 +add test 10.10.38.18 +add test 10.10.38.180 +add test 10.10.38.181 +add test 10.10.38.182 +add test 10.10.38.183 +add test 10.10.38.184 +add test 10.10.38.185 +add test 10.10.38.186 +add test 10.10.38.187 +add test 10.10.38.188 +add test 10.10.38.189 +add test 10.10.38.19 +add test 10.10.38.190 +add test 10.10.38.191 +add test 10.10.38.192 +add test 10.10.38.193 +add test 10.10.38.194 +add test 10.10.38.195 +add test 10.10.38.196 +add test 10.10.38.197 +add test 10.10.38.198 +add test 10.10.38.199 +add test 10.10.38.2 +add test 10.10.38.20 +add test 10.10.38.200 +add test 10.10.38.201 +add test 10.10.38.202 +add test 10.10.38.203 +add test 10.10.38.204 +add test 10.10.38.205 +add test 10.10.38.206 +add test 10.10.38.207 +add test 10.10.38.208 +add test 10.10.38.209 +add test 10.10.38.21 +add test 10.10.38.210 +add test 10.10.38.211 +add test 10.10.38.212 +add test 10.10.38.213 +add test 10.10.38.214 +add test 10.10.38.215 +add test 10.10.38.216 +add test 10.10.38.217 +add test 10.10.38.218 +add test 10.10.38.219 +add test 10.10.38.22 +add test 10.10.38.220 +add test 10.10.38.221 +add test 10.10.38.222 +add test 10.10.38.223 +add test 10.10.38.224 +add test 10.10.38.225 +add test 10.10.38.226 +add test 10.10.38.227 +add test 10.10.38.228 +add test 10.10.38.229 +add test 10.10.38.23 +add test 10.10.38.230 +add test 10.10.38.231 +add test 10.10.38.232 +add test 10.10.38.233 +add test 10.10.38.234 +add test 10.10.38.235 +add test 10.10.38.236 +add test 10.10.38.237 +add test 10.10.38.238 +add test 10.10.38.239 +add test 10.10.38.24 +add test 10.10.38.240 +add test 10.10.38.241 +add test 10.10.38.242 +add test 10.10.38.243 +add test 10.10.38.244 +add test 10.10.38.245 +add test 10.10.38.246 +add test 10.10.38.247 +add test 10.10.38.248 +add test 10.10.38.249 +add test 10.10.38.25 +add test 10.10.38.250 +add test 10.10.38.251 +add test 10.10.38.252 +add test 10.10.38.253 +add test 10.10.38.254 +add test 10.10.38.255 +add test 10.10.38.26 +add test 10.10.38.27 +add test 10.10.38.28 +add test 10.10.38.29 +add test 10.10.38.3 +add test 10.10.38.30 +add test 10.10.38.31 +add test 10.10.38.32 +add test 10.10.38.33 +add test 10.10.38.34 +add test 10.10.38.35 +add test 10.10.38.36 +add test 10.10.38.37 +add test 10.10.38.38 +add test 10.10.38.39 +add test 10.10.38.4 +add test 10.10.38.40 +add test 10.10.38.41 +add test 10.10.38.42 +add test 10.10.38.43 +add test 10.10.38.44 +add test 10.10.38.45 +add test 10.10.38.46 +add test 10.10.38.47 +add test 10.10.38.48 +add test 10.10.38.49 +add test 10.10.38.5 +add test 10.10.38.50 +add test 10.10.38.51 +add test 10.10.38.52 +add test 10.10.38.53 +add test 10.10.38.54 +add test 10.10.38.55 +add test 10.10.38.56 +add test 10.10.38.57 +add test 10.10.38.58 +add test 10.10.38.59 +add test 10.10.38.6 +add test 10.10.38.60 +add test 10.10.38.61 +add test 10.10.38.62 +add test 10.10.38.63 +add test 10.10.38.64 +add test 10.10.38.65 +add test 10.10.38.66 +add test 10.10.38.67 +add test 10.10.38.68 +add test 10.10.38.69 +add test 10.10.38.7 +add test 10.10.38.70 +add test 10.10.38.71 +add test 10.10.38.72 +add test 10.10.38.73 +add test 10.10.38.74 +add test 10.10.38.75 +add test 10.10.38.76 +add test 10.10.38.77 +add test 10.10.38.78 +add test 10.10.38.79 +add test 10.10.38.8 +add test 10.10.38.80 +add test 10.10.38.81 +add test 10.10.38.82 +add test 10.10.38.83 +add test 10.10.38.84 +add test 10.10.38.85 +add test 10.10.38.86 +add test 10.10.38.87 +add test 10.10.38.88 +add test 10.10.38.89 +add test 10.10.38.9 +add test 10.10.38.90 +add test 10.10.38.91 +add test 10.10.38.92 +add test 10.10.38.93 +add test 10.10.38.94 +add test 10.10.38.95 +add test 10.10.38.96 +add test 10.10.38.97 +add test 10.10.38.98 +add test 10.10.38.99 +add test 10.10.39.0 +add test 10.10.39.1 +add test 10.10.39.10 +add test 10.10.39.100 +add test 10.10.39.101 +add test 10.10.39.102 +add test 10.10.39.103 +add test 10.10.39.104 +add test 10.10.39.105 +add test 10.10.39.106 +add test 10.10.39.107 +add test 10.10.39.108 +add test 10.10.39.109 +add test 10.10.39.11 +add test 10.10.39.110 +add test 10.10.39.111 +add test 10.10.39.112 +add test 10.10.39.113 +add test 10.10.39.114 +add test 10.10.39.115 +add test 10.10.39.116 +add test 10.10.39.117 +add test 10.10.39.118 +add test 10.10.39.119 +add test 10.10.39.12 +add test 10.10.39.120 +add test 10.10.39.121 +add test 10.10.39.122 +add test 10.10.39.123 +add test 10.10.39.124 +add test 10.10.39.125 +add test 10.10.39.126 +add test 10.10.39.127 +add test 10.10.39.128 +add test 10.10.39.129 +add test 10.10.39.13 +add test 10.10.39.130 +add test 10.10.39.131 +add test 10.10.39.132 +add test 10.10.39.133 +add test 10.10.39.134 +add test 10.10.39.135 +add test 10.10.39.136 +add test 10.10.39.137 +add test 10.10.39.138 +add test 10.10.39.139 +add test 10.10.39.14 +add test 10.10.39.140 +add test 10.10.39.141 +add test 10.10.39.142 +add test 10.10.39.143 +add test 10.10.39.144 +add test 10.10.39.145 +add test 10.10.39.146 +add test 10.10.39.147 +add test 10.10.39.148 +add test 10.10.39.149 +add test 10.10.39.15 +add test 10.10.39.150 +add test 10.10.39.151 +add test 10.10.39.152 +add test 10.10.39.153 +add test 10.10.39.154 +add test 10.10.39.155 +add test 10.10.39.156 +add test 10.10.39.157 +add test 10.10.39.158 +add test 10.10.39.159 +add test 10.10.39.16 +add test 10.10.39.160 +add test 10.10.39.161 +add test 10.10.39.162 +add test 10.10.39.163 +add test 10.10.39.164 +add test 10.10.39.165 +add test 10.10.39.166 +add test 10.10.39.167 +add test 10.10.39.168 +add test 10.10.39.169 +add test 10.10.39.17 +add test 10.10.39.170 +add test 10.10.39.171 +add test 10.10.39.172 +add test 10.10.39.173 +add test 10.10.39.174 +add test 10.10.39.175 +add test 10.10.39.176 +add test 10.10.39.177 +add test 10.10.39.178 +add test 10.10.39.179 +add test 10.10.39.18 +add test 10.10.39.180 +add test 10.10.39.181 +add test 10.10.39.182 +add test 10.10.39.183 +add test 10.10.39.184 +add test 10.10.39.185 +add test 10.10.39.186 +add test 10.10.39.187 +add test 10.10.39.188 +add test 10.10.39.189 +add test 10.10.39.19 +add test 10.10.39.190 +add test 10.10.39.191 +add test 10.10.39.192 +add test 10.10.39.193 +add test 10.10.39.194 +add test 10.10.39.195 +add test 10.10.39.196 +add test 10.10.39.197 +add test 10.10.39.198 +add test 10.10.39.199 +add test 10.10.39.2 +add test 10.10.39.20 +add test 10.10.39.200 +add test 10.10.39.201 +add test 10.10.39.202 +add test 10.10.39.203 +add test 10.10.39.204 +add test 10.10.39.205 +add test 10.10.39.206 +add test 10.10.39.207 +add test 10.10.39.208 +add test 10.10.39.209 +add test 10.10.39.21 +add test 10.10.39.210 +add test 10.10.39.211 +add test 10.10.39.212 +add test 10.10.39.213 +add test 10.10.39.214 +add test 10.10.39.215 +add test 10.10.39.216 +add test 10.10.39.217 +add test 10.10.39.218 +add test 10.10.39.219 +add test 10.10.39.22 +add test 10.10.39.220 +add test 10.10.39.221 +add test 10.10.39.222 +add test 10.10.39.223 +add test 10.10.39.224 +add test 10.10.39.225 +add test 10.10.39.226 +add test 10.10.39.227 +add test 10.10.39.228 +add test 10.10.39.229 +add test 10.10.39.23 +add test 10.10.39.230 +add test 10.10.39.231 +add test 10.10.39.232 +add test 10.10.39.233 +add test 10.10.39.234 +add test 10.10.39.235 +add test 10.10.39.236 +add test 10.10.39.237 +add test 10.10.39.238 +add test 10.10.39.239 +add test 10.10.39.24 +add test 10.10.39.240 +add test 10.10.39.241 +add test 10.10.39.242 +add test 10.10.39.243 +add test 10.10.39.244 +add test 10.10.39.245 +add test 10.10.39.246 +add test 10.10.39.247 +add test 10.10.39.248 +add test 10.10.39.249 +add test 10.10.39.25 +add test 10.10.39.250 +add test 10.10.39.251 +add test 10.10.39.252 +add test 10.10.39.253 +add test 10.10.39.254 +add test 10.10.39.255 +add test 10.10.39.26 +add test 10.10.39.27 +add test 10.10.39.28 +add test 10.10.39.29 +add test 10.10.39.3 +add test 10.10.39.30 +add test 10.10.39.31 +add test 10.10.39.32 +add test 10.10.39.33 +add test 10.10.39.34 +add test 10.10.39.35 +add test 10.10.39.36 +add test 10.10.39.37 +add test 10.10.39.38 +add test 10.10.39.39 +add test 10.10.39.4 +add test 10.10.39.40 +add test 10.10.39.41 +add test 10.10.39.42 +add test 10.10.39.43 +add test 10.10.39.44 +add test 10.10.39.45 +add test 10.10.39.46 +add test 10.10.39.47 +add test 10.10.39.48 +add test 10.10.39.49 +add test 10.10.39.5 +add test 10.10.39.50 +add test 10.10.39.51 +add test 10.10.39.52 +add test 10.10.39.53 +add test 10.10.39.54 +add test 10.10.39.55 +add test 10.10.39.56 +add test 10.10.39.57 +add test 10.10.39.58 +add test 10.10.39.59 +add test 10.10.39.6 +add test 10.10.39.60 +add test 10.10.39.61 +add test 10.10.39.62 +add test 10.10.39.63 +add test 10.10.39.64 +add test 10.10.39.65 +add test 10.10.39.66 +add test 10.10.39.67 +add test 10.10.39.68 +add test 10.10.39.69 +add test 10.10.39.7 +add test 10.10.39.70 +add test 10.10.39.71 +add test 10.10.39.72 +add test 10.10.39.73 +add test 10.10.39.74 +add test 10.10.39.75 +add test 10.10.39.76 +add test 10.10.39.77 +add test 10.10.39.78 +add test 10.10.39.79 +add test 10.10.39.8 +add test 10.10.39.80 +add test 10.10.39.81 +add test 10.10.39.82 +add test 10.10.39.83 +add test 10.10.39.84 +add test 10.10.39.85 +add test 10.10.39.86 +add test 10.10.39.87 +add test 10.10.39.88 +add test 10.10.39.89 +add test 10.10.39.9 +add test 10.10.39.90 +add test 10.10.39.91 +add test 10.10.39.92 +add test 10.10.39.93 +add test 10.10.39.94 +add test 10.10.39.95 +add test 10.10.39.96 +add test 10.10.39.97 +add test 10.10.39.98 +add test 10.10.39.99 +add test 10.10.4.0 +add test 10.10.4.1 +add test 10.10.4.10 +add test 10.10.4.100 +add test 10.10.4.101 +add test 10.10.4.102 +add test 10.10.4.103 +add test 10.10.4.104 +add test 10.10.4.105 +add test 10.10.4.106 +add test 10.10.4.107 +add test 10.10.4.108 +add test 10.10.4.109 +add test 10.10.4.11 +add test 10.10.4.110 +add test 10.10.4.111 +add test 10.10.4.112 +add test 10.10.4.113 +add test 10.10.4.114 +add test 10.10.4.115 +add test 10.10.4.116 +add test 10.10.4.117 +add test 10.10.4.118 +add test 10.10.4.119 +add test 10.10.4.12 +add test 10.10.4.120 +add test 10.10.4.121 +add test 10.10.4.122 +add test 10.10.4.123 +add test 10.10.4.124 +add test 10.10.4.125 +add test 10.10.4.126 +add test 10.10.4.127 +add test 10.10.4.128 +add test 10.10.4.129 +add test 10.10.4.13 +add test 10.10.4.130 +add test 10.10.4.131 +add test 10.10.4.132 +add test 10.10.4.133 +add test 10.10.4.134 +add test 10.10.4.135 +add test 10.10.4.136 +add test 10.10.4.137 +add test 10.10.4.138 +add test 10.10.4.139 +add test 10.10.4.14 +add test 10.10.4.140 +add test 10.10.4.141 +add test 10.10.4.142 +add test 10.10.4.143 +add test 10.10.4.144 +add test 10.10.4.145 +add test 10.10.4.146 +add test 10.10.4.147 +add test 10.10.4.148 +add test 10.10.4.149 +add test 10.10.4.15 +add test 10.10.4.150 +add test 10.10.4.151 +add test 10.10.4.152 +add test 10.10.4.153 +add test 10.10.4.154 +add test 10.10.4.155 +add test 10.10.4.156 +add test 10.10.4.157 +add test 10.10.4.158 +add test 10.10.4.159 +add test 10.10.4.16 +add test 10.10.4.160 +add test 10.10.4.161 +add test 10.10.4.162 +add test 10.10.4.163 +add test 10.10.4.164 +add test 10.10.4.165 +add test 10.10.4.166 +add test 10.10.4.167 +add test 10.10.4.168 +add test 10.10.4.169 +add test 10.10.4.17 +add test 10.10.4.170 +add test 10.10.4.171 +add test 10.10.4.172 +add test 10.10.4.173 +add test 10.10.4.174 +add test 10.10.4.175 +add test 10.10.4.176 +add test 10.10.4.177 +add test 10.10.4.178 +add test 10.10.4.179 +add test 10.10.4.18 +add test 10.10.4.180 +add test 10.10.4.181 +add test 10.10.4.182 +add test 10.10.4.183 +add test 10.10.4.184 +add test 10.10.4.185 +add test 10.10.4.186 +add test 10.10.4.187 +add test 10.10.4.188 +add test 10.10.4.189 +add test 10.10.4.19 +add test 10.10.4.190 +add test 10.10.4.191 +add test 10.10.4.192 +add test 10.10.4.193 +add test 10.10.4.194 +add test 10.10.4.195 +add test 10.10.4.196 +add test 10.10.4.197 +add test 10.10.4.198 +add test 10.10.4.199 +add test 10.10.4.2 +add test 10.10.4.20 +add test 10.10.4.200 +add test 10.10.4.201 +add test 10.10.4.202 +add test 10.10.4.203 +add test 10.10.4.204 +add test 10.10.4.205 +add test 10.10.4.206 +add test 10.10.4.207 +add test 10.10.4.208 +add test 10.10.4.209 +add test 10.10.4.21 +add test 10.10.4.210 +add test 10.10.4.211 +add test 10.10.4.212 +add test 10.10.4.213 +add test 10.10.4.214 +add test 10.10.4.215 +add test 10.10.4.216 +add test 10.10.4.217 +add test 10.10.4.218 +add test 10.10.4.219 +add test 10.10.4.22 +add test 10.10.4.220 +add test 10.10.4.221 +add test 10.10.4.222 +add test 10.10.4.223 +add test 10.10.4.224 +add test 10.10.4.225 +add test 10.10.4.226 +add test 10.10.4.227 +add test 10.10.4.228 +add test 10.10.4.229 +add test 10.10.4.23 +add test 10.10.4.230 +add test 10.10.4.231 +add test 10.10.4.232 +add test 10.10.4.233 +add test 10.10.4.234 +add test 10.10.4.235 +add test 10.10.4.236 +add test 10.10.4.237 +add test 10.10.4.238 +add test 10.10.4.239 +add test 10.10.4.24 +add test 10.10.4.240 +add test 10.10.4.241 +add test 10.10.4.242 +add test 10.10.4.243 +add test 10.10.4.244 +add test 10.10.4.245 +add test 10.10.4.246 +add test 10.10.4.247 +add test 10.10.4.248 +add test 10.10.4.249 +add test 10.10.4.25 +add test 10.10.4.250 +add test 10.10.4.251 +add test 10.10.4.252 +add test 10.10.4.253 +add test 10.10.4.254 +add test 10.10.4.255 +add test 10.10.4.26 +add test 10.10.4.27 +add test 10.10.4.28 +add test 10.10.4.29 +add test 10.10.4.3 +add test 10.10.4.30 +add test 10.10.4.31 +add test 10.10.4.32 +add test 10.10.4.33 +add test 10.10.4.34 +add test 10.10.4.35 +add test 10.10.4.36 +add test 10.10.4.37 +add test 10.10.4.38 +add test 10.10.4.39 +add test 10.10.4.4 +add test 10.10.4.40 +add test 10.10.4.41 +add test 10.10.4.42 +add test 10.10.4.43 +add test 10.10.4.44 +add test 10.10.4.45 +add test 10.10.4.46 +add test 10.10.4.47 +add test 10.10.4.48 +add test 10.10.4.49 +add test 10.10.4.5 +add test 10.10.4.50 +add test 10.10.4.51 +add test 10.10.4.52 +add test 10.10.4.53 +add test 10.10.4.54 +add test 10.10.4.55 +add test 10.10.4.56 +add test 10.10.4.57 +add test 10.10.4.58 +add test 10.10.4.59 +add test 10.10.4.6 +add test 10.10.4.60 +add test 10.10.4.61 +add test 10.10.4.62 +add test 10.10.4.63 +add test 10.10.4.64 +add test 10.10.4.65 +add test 10.10.4.66 +add test 10.10.4.67 +add test 10.10.4.68 +add test 10.10.4.69 +add test 10.10.4.7 +add test 10.10.4.70 +add test 10.10.4.71 +add test 10.10.4.72 +add test 10.10.4.73 +add test 10.10.4.74 +add test 10.10.4.75 +add test 10.10.4.76 +add test 10.10.4.77 +add test 10.10.4.78 +add test 10.10.4.79 +add test 10.10.4.8 +add test 10.10.4.80 +add test 10.10.4.81 +add test 10.10.4.82 +add test 10.10.4.83 +add test 10.10.4.84 +add test 10.10.4.85 +add test 10.10.4.86 +add test 10.10.4.87 +add test 10.10.4.88 +add test 10.10.4.89 +add test 10.10.4.9 +add test 10.10.4.90 +add test 10.10.4.91 +add test 10.10.4.92 +add test 10.10.4.93 +add test 10.10.4.94 +add test 10.10.4.95 +add test 10.10.4.96 +add test 10.10.4.97 +add test 10.10.4.98 +add test 10.10.4.99 +add test 10.10.40.0 +add test 10.10.40.1 +add test 10.10.40.10 +add test 10.10.40.100 +add test 10.10.40.101 +add test 10.10.40.102 +add test 10.10.40.103 +add test 10.10.40.104 +add test 10.10.40.105 +add test 10.10.40.106 +add test 10.10.40.107 +add test 10.10.40.108 +add test 10.10.40.109 +add test 10.10.40.11 +add test 10.10.40.110 +add test 10.10.40.111 +add test 10.10.40.112 +add test 10.10.40.113 +add test 10.10.40.114 +add test 10.10.40.115 +add test 10.10.40.116 +add test 10.10.40.117 +add test 10.10.40.118 +add test 10.10.40.119 +add test 10.10.40.12 +add test 10.10.40.120 +add test 10.10.40.121 +add test 10.10.40.122 +add test 10.10.40.123 +add test 10.10.40.124 +add test 10.10.40.125 +add test 10.10.40.126 +add test 10.10.40.127 +add test 10.10.40.128 +add test 10.10.40.129 +add test 10.10.40.13 +add test 10.10.40.130 +add test 10.10.40.131 +add test 10.10.40.132 +add test 10.10.40.133 +add test 10.10.40.134 +add test 10.10.40.135 +add test 10.10.40.136 +add test 10.10.40.137 +add test 10.10.40.138 +add test 10.10.40.139 +add test 10.10.40.14 +add test 10.10.40.140 +add test 10.10.40.141 +add test 10.10.40.142 +add test 10.10.40.143 +add test 10.10.40.144 +add test 10.10.40.145 +add test 10.10.40.146 +add test 10.10.40.147 +add test 10.10.40.148 +add test 10.10.40.149 +add test 10.10.40.15 +add test 10.10.40.150 +add test 10.10.40.151 +add test 10.10.40.152 +add test 10.10.40.153 +add test 10.10.40.154 +add test 10.10.40.155 +add test 10.10.40.156 +add test 10.10.40.157 +add test 10.10.40.158 +add test 10.10.40.159 +add test 10.10.40.16 +add test 10.10.40.160 +add test 10.10.40.161 +add test 10.10.40.162 +add test 10.10.40.163 +add test 10.10.40.164 +add test 10.10.40.165 +add test 10.10.40.166 +add test 10.10.40.167 +add test 10.10.40.168 +add test 10.10.40.169 +add test 10.10.40.17 +add test 10.10.40.170 +add test 10.10.40.171 +add test 10.10.40.172 +add test 10.10.40.173 +add test 10.10.40.174 +add test 10.10.40.175 +add test 10.10.40.176 +add test 10.10.40.177 +add test 10.10.40.178 +add test 10.10.40.179 +add test 10.10.40.18 +add test 10.10.40.180 +add test 10.10.40.181 +add test 10.10.40.182 +add test 10.10.40.183 +add test 10.10.40.184 +add test 10.10.40.185 +add test 10.10.40.186 +add test 10.10.40.187 +add test 10.10.40.188 +add test 10.10.40.189 +add test 10.10.40.19 +add test 10.10.40.190 +add test 10.10.40.191 +add test 10.10.40.192 +add test 10.10.40.193 +add test 10.10.40.194 +add test 10.10.40.195 +add test 10.10.40.196 +add test 10.10.40.197 +add test 10.10.40.198 +add test 10.10.40.199 +add test 10.10.40.2 +add test 10.10.40.20 +add test 10.10.40.200 +add test 10.10.40.201 +add test 10.10.40.202 +add test 10.10.40.203 +add test 10.10.40.204 +add test 10.10.40.205 +add test 10.10.40.206 +add test 10.10.40.207 +add test 10.10.40.208 +add test 10.10.40.209 +add test 10.10.40.21 +add test 10.10.40.210 +add test 10.10.40.211 +add test 10.10.40.212 +add test 10.10.40.213 +add test 10.10.40.214 +add test 10.10.40.215 +add test 10.10.40.216 +add test 10.10.40.217 +add test 10.10.40.218 +add test 10.10.40.219 +add test 10.10.40.22 +add test 10.10.40.220 +add test 10.10.40.221 +add test 10.10.40.222 +add test 10.10.40.223 +add test 10.10.40.224 +add test 10.10.40.225 +add test 10.10.40.226 +add test 10.10.40.227 +add test 10.10.40.228 +add test 10.10.40.229 +add test 10.10.40.23 +add test 10.10.40.230 +add test 10.10.40.231 +add test 10.10.40.232 +add test 10.10.40.233 +add test 10.10.40.234 +add test 10.10.40.235 +add test 10.10.40.236 +add test 10.10.40.237 +add test 10.10.40.238 +add test 10.10.40.239 +add test 10.10.40.24 +add test 10.10.40.240 +add test 10.10.40.241 +add test 10.10.40.242 +add test 10.10.40.243 +add test 10.10.40.244 +add test 10.10.40.245 +add test 10.10.40.246 +add test 10.10.40.247 +add test 10.10.40.248 +add test 10.10.40.249 +add test 10.10.40.25 +add test 10.10.40.250 +add test 10.10.40.251 +add test 10.10.40.252 +add test 10.10.40.253 +add test 10.10.40.254 +add test 10.10.40.255 +add test 10.10.40.26 +add test 10.10.40.27 +add test 10.10.40.28 +add test 10.10.40.29 +add test 10.10.40.3 +add test 10.10.40.30 +add test 10.10.40.31 +add test 10.10.40.32 +add test 10.10.40.33 +add test 10.10.40.34 +add test 10.10.40.35 +add test 10.10.40.36 +add test 10.10.40.37 +add test 10.10.40.38 +add test 10.10.40.39 +add test 10.10.40.4 +add test 10.10.40.40 +add test 10.10.40.41 +add test 10.10.40.42 +add test 10.10.40.43 +add test 10.10.40.44 +add test 10.10.40.45 +add test 10.10.40.46 +add test 10.10.40.47 +add test 10.10.40.48 +add test 10.10.40.49 +add test 10.10.40.5 +add test 10.10.40.50 +add test 10.10.40.51 +add test 10.10.40.52 +add test 10.10.40.53 +add test 10.10.40.54 +add test 10.10.40.55 +add test 10.10.40.56 +add test 10.10.40.57 +add test 10.10.40.58 +add test 10.10.40.59 +add test 10.10.40.6 +add test 10.10.40.60 +add test 10.10.40.61 +add test 10.10.40.62 +add test 10.10.40.63 +add test 10.10.40.64 +add test 10.10.40.65 +add test 10.10.40.66 +add test 10.10.40.67 +add test 10.10.40.68 +add test 10.10.40.69 +add test 10.10.40.7 +add test 10.10.40.70 +add test 10.10.40.71 +add test 10.10.40.72 +add test 10.10.40.73 +add test 10.10.40.74 +add test 10.10.40.75 +add test 10.10.40.76 +add test 10.10.40.77 +add test 10.10.40.78 +add test 10.10.40.79 +add test 10.10.40.8 +add test 10.10.40.80 +add test 10.10.40.81 +add test 10.10.40.82 +add test 10.10.40.83 +add test 10.10.40.84 +add test 10.10.40.85 +add test 10.10.40.86 +add test 10.10.40.87 +add test 10.10.40.88 +add test 10.10.40.89 +add test 10.10.40.9 +add test 10.10.40.90 +add test 10.10.40.91 +add test 10.10.40.92 +add test 10.10.40.93 +add test 10.10.40.94 +add test 10.10.40.95 +add test 10.10.40.96 +add test 10.10.40.97 +add test 10.10.40.98 +add test 10.10.40.99 +add test 10.10.41.0 +add test 10.10.41.1 +add test 10.10.41.10 +add test 10.10.41.100 +add test 10.10.41.101 +add test 10.10.41.102 +add test 10.10.41.103 +add test 10.10.41.104 +add test 10.10.41.105 +add test 10.10.41.106 +add test 10.10.41.107 +add test 10.10.41.108 +add test 10.10.41.109 +add test 10.10.41.11 +add test 10.10.41.110 +add test 10.10.41.111 +add test 10.10.41.112 +add test 10.10.41.113 +add test 10.10.41.114 +add test 10.10.41.115 +add test 10.10.41.116 +add test 10.10.41.117 +add test 10.10.41.118 +add test 10.10.41.119 +add test 10.10.41.12 +add test 10.10.41.120 +add test 10.10.41.121 +add test 10.10.41.122 +add test 10.10.41.123 +add test 10.10.41.124 +add test 10.10.41.125 +add test 10.10.41.126 +add test 10.10.41.127 +add test 10.10.41.128 +add test 10.10.41.129 +add test 10.10.41.13 +add test 10.10.41.130 +add test 10.10.41.131 +add test 10.10.41.132 +add test 10.10.41.133 +add test 10.10.41.134 +add test 10.10.41.135 +add test 10.10.41.136 +add test 10.10.41.137 +add test 10.10.41.138 +add test 10.10.41.139 +add test 10.10.41.14 +add test 10.10.41.140 +add test 10.10.41.141 +add test 10.10.41.142 +add test 10.10.41.143 +add test 10.10.41.144 +add test 10.10.41.145 +add test 10.10.41.146 +add test 10.10.41.147 +add test 10.10.41.148 +add test 10.10.41.149 +add test 10.10.41.15 +add test 10.10.41.150 +add test 10.10.41.151 +add test 10.10.41.152 +add test 10.10.41.153 +add test 10.10.41.154 +add test 10.10.41.155 +add test 10.10.41.156 +add test 10.10.41.157 +add test 10.10.41.158 +add test 10.10.41.159 +add test 10.10.41.16 +add test 10.10.41.160 +add test 10.10.41.161 +add test 10.10.41.162 +add test 10.10.41.163 +add test 10.10.41.164 +add test 10.10.41.165 +add test 10.10.41.166 +add test 10.10.41.167 +add test 10.10.41.168 +add test 10.10.41.169 +add test 10.10.41.17 +add test 10.10.41.170 +add test 10.10.41.171 +add test 10.10.41.172 +add test 10.10.41.173 +add test 10.10.41.174 +add test 10.10.41.175 +add test 10.10.41.176 +add test 10.10.41.177 +add test 10.10.41.178 +add test 10.10.41.179 +add test 10.10.41.18 +add test 10.10.41.180 +add test 10.10.41.181 +add test 10.10.41.182 +add test 10.10.41.183 +add test 10.10.41.184 +add test 10.10.41.185 +add test 10.10.41.186 +add test 10.10.41.187 +add test 10.10.41.188 +add test 10.10.41.189 +add test 10.10.41.19 +add test 10.10.41.190 +add test 10.10.41.191 +add test 10.10.41.192 +add test 10.10.41.193 +add test 10.10.41.194 +add test 10.10.41.195 +add test 10.10.41.196 +add test 10.10.41.197 +add test 10.10.41.198 +add test 10.10.41.199 +add test 10.10.41.2 +add test 10.10.41.20 +add test 10.10.41.200 +add test 10.10.41.201 +add test 10.10.41.202 +add test 10.10.41.203 +add test 10.10.41.204 +add test 10.10.41.205 +add test 10.10.41.206 +add test 10.10.41.207 +add test 10.10.41.208 +add test 10.10.41.209 +add test 10.10.41.21 +add test 10.10.41.210 +add test 10.10.41.211 +add test 10.10.41.212 +add test 10.10.41.213 +add test 10.10.41.214 +add test 10.10.41.215 +add test 10.10.41.216 +add test 10.10.41.217 +add test 10.10.41.218 +add test 10.10.41.219 +add test 10.10.41.22 +add test 10.10.41.220 +add test 10.10.41.221 +add test 10.10.41.222 +add test 10.10.41.223 +add test 10.10.41.224 +add test 10.10.41.225 +add test 10.10.41.226 +add test 10.10.41.227 +add test 10.10.41.228 +add test 10.10.41.229 +add test 10.10.41.23 +add test 10.10.41.230 +add test 10.10.41.231 +add test 10.10.41.232 +add test 10.10.41.233 +add test 10.10.41.234 +add test 10.10.41.235 +add test 10.10.41.236 +add test 10.10.41.237 +add test 10.10.41.238 +add test 10.10.41.239 +add test 10.10.41.24 +add test 10.10.41.240 +add test 10.10.41.241 +add test 10.10.41.242 +add test 10.10.41.243 +add test 10.10.41.244 +add test 10.10.41.245 +add test 10.10.41.246 +add test 10.10.41.247 +add test 10.10.41.248 +add test 10.10.41.249 +add test 10.10.41.25 +add test 10.10.41.250 +add test 10.10.41.251 +add test 10.10.41.252 +add test 10.10.41.253 +add test 10.10.41.254 +add test 10.10.41.255 +add test 10.10.41.26 +add test 10.10.41.27 +add test 10.10.41.28 +add test 10.10.41.29 +add test 10.10.41.3 +add test 10.10.41.30 +add test 10.10.41.31 +add test 10.10.41.32 +add test 10.10.41.33 +add test 10.10.41.34 +add test 10.10.41.35 +add test 10.10.41.36 +add test 10.10.41.37 +add test 10.10.41.38 +add test 10.10.41.39 +add test 10.10.41.4 +add test 10.10.41.40 +add test 10.10.41.41 +add test 10.10.41.42 +add test 10.10.41.43 +add test 10.10.41.44 +add test 10.10.41.45 +add test 10.10.41.46 +add test 10.10.41.47 +add test 10.10.41.48 +add test 10.10.41.49 +add test 10.10.41.5 +add test 10.10.41.50 +add test 10.10.41.51 +add test 10.10.41.52 +add test 10.10.41.53 +add test 10.10.41.54 +add test 10.10.41.55 +add test 10.10.41.56 +add test 10.10.41.57 +add test 10.10.41.58 +add test 10.10.41.59 +add test 10.10.41.6 +add test 10.10.41.60 +add test 10.10.41.61 +add test 10.10.41.62 +add test 10.10.41.63 +add test 10.10.41.64 +add test 10.10.41.65 +add test 10.10.41.66 +add test 10.10.41.67 +add test 10.10.41.68 +add test 10.10.41.69 +add test 10.10.41.7 +add test 10.10.41.70 +add test 10.10.41.71 +add test 10.10.41.72 +add test 10.10.41.73 +add test 10.10.41.74 +add test 10.10.41.75 +add test 10.10.41.76 +add test 10.10.41.77 +add test 10.10.41.78 +add test 10.10.41.79 +add test 10.10.41.8 +add test 10.10.41.80 +add test 10.10.41.81 +add test 10.10.41.82 +add test 10.10.41.83 +add test 10.10.41.84 +add test 10.10.41.85 +add test 10.10.41.86 +add test 10.10.41.87 +add test 10.10.41.88 +add test 10.10.41.89 +add test 10.10.41.9 +add test 10.10.41.90 +add test 10.10.41.91 +add test 10.10.41.92 +add test 10.10.41.93 +add test 10.10.41.94 +add test 10.10.41.95 +add test 10.10.41.96 +add test 10.10.41.97 +add test 10.10.41.98 +add test 10.10.41.99 +add test 10.10.42.0 +add test 10.10.42.1 +add test 10.10.42.10 +add test 10.10.42.100 +add test 10.10.42.101 +add test 10.10.42.102 +add test 10.10.42.103 +add test 10.10.42.104 +add test 10.10.42.105 +add test 10.10.42.106 +add test 10.10.42.107 +add test 10.10.42.108 +add test 10.10.42.109 +add test 10.10.42.11 +add test 10.10.42.110 +add test 10.10.42.111 +add test 10.10.42.112 +add test 10.10.42.113 +add test 10.10.42.114 +add test 10.10.42.115 +add test 10.10.42.116 +add test 10.10.42.117 +add test 10.10.42.118 +add test 10.10.42.119 +add test 10.10.42.12 +add test 10.10.42.120 +add test 10.10.42.121 +add test 10.10.42.122 +add test 10.10.42.123 +add test 10.10.42.124 +add test 10.10.42.125 +add test 10.10.42.126 +add test 10.10.42.127 +add test 10.10.42.128 +add test 10.10.42.129 +add test 10.10.42.13 +add test 10.10.42.130 +add test 10.10.42.131 +add test 10.10.42.132 +add test 10.10.42.133 +add test 10.10.42.134 +add test 10.10.42.135 +add test 10.10.42.136 +add test 10.10.42.137 +add test 10.10.42.138 +add test 10.10.42.139 +add test 10.10.42.14 +add test 10.10.42.140 +add test 10.10.42.141 +add test 10.10.42.142 +add test 10.10.42.143 +add test 10.10.42.144 +add test 10.10.42.145 +add test 10.10.42.146 +add test 10.10.42.147 +add test 10.10.42.148 +add test 10.10.42.149 +add test 10.10.42.15 +add test 10.10.42.150 +add test 10.10.42.151 +add test 10.10.42.152 +add test 10.10.42.153 +add test 10.10.42.154 +add test 10.10.42.155 +add test 10.10.42.156 +add test 10.10.42.157 +add test 10.10.42.158 +add test 10.10.42.159 +add test 10.10.42.16 +add test 10.10.42.160 +add test 10.10.42.161 +add test 10.10.42.162 +add test 10.10.42.163 +add test 10.10.42.164 +add test 10.10.42.165 +add test 10.10.42.166 +add test 10.10.42.167 +add test 10.10.42.168 +add test 10.10.42.169 +add test 10.10.42.17 +add test 10.10.42.170 +add test 10.10.42.171 +add test 10.10.42.172 +add test 10.10.42.173 +add test 10.10.42.174 +add test 10.10.42.175 +add test 10.10.42.176 +add test 10.10.42.177 +add test 10.10.42.178 +add test 10.10.42.179 +add test 10.10.42.18 +add test 10.10.42.180 +add test 10.10.42.181 +add test 10.10.42.182 +add test 10.10.42.183 +add test 10.10.42.184 +add test 10.10.42.185 +add test 10.10.42.186 +add test 10.10.42.187 +add test 10.10.42.188 +add test 10.10.42.189 +add test 10.10.42.19 +add test 10.10.42.190 +add test 10.10.42.191 +add test 10.10.42.192 +add test 10.10.42.193 +add test 10.10.42.194 +add test 10.10.42.195 +add test 10.10.42.196 +add test 10.10.42.197 +add test 10.10.42.198 +add test 10.10.42.199 +add test 10.10.42.2 +add test 10.10.42.20 +add test 10.10.42.200 +add test 10.10.42.201 +add test 10.10.42.202 +add test 10.10.42.203 +add test 10.10.42.204 +add test 10.10.42.205 +add test 10.10.42.206 +add test 10.10.42.207 +add test 10.10.42.208 +add test 10.10.42.209 +add test 10.10.42.21 +add test 10.10.42.210 +add test 10.10.42.211 +add test 10.10.42.212 +add test 10.10.42.213 +add test 10.10.42.214 +add test 10.10.42.215 +add test 10.10.42.216 +add test 10.10.42.217 +add test 10.10.42.218 +add test 10.10.42.219 +add test 10.10.42.22 +add test 10.10.42.220 +add test 10.10.42.221 +add test 10.10.42.222 +add test 10.10.42.223 +add test 10.10.42.224 +add test 10.10.42.225 +add test 10.10.42.226 +add test 10.10.42.227 +add test 10.10.42.228 +add test 10.10.42.229 +add test 10.10.42.23 +add test 10.10.42.230 +add test 10.10.42.231 +add test 10.10.42.232 +add test 10.10.42.233 +add test 10.10.42.234 +add test 10.10.42.235 +add test 10.10.42.236 +add test 10.10.42.237 +add test 10.10.42.238 +add test 10.10.42.239 +add test 10.10.42.24 +add test 10.10.42.240 +add test 10.10.42.241 +add test 10.10.42.242 +add test 10.10.42.243 +add test 10.10.42.244 +add test 10.10.42.245 +add test 10.10.42.246 +add test 10.10.42.247 +add test 10.10.42.248 +add test 10.10.42.249 +add test 10.10.42.25 +add test 10.10.42.250 +add test 10.10.42.251 +add test 10.10.42.252 +add test 10.10.42.253 +add test 10.10.42.254 +add test 10.10.42.255 +add test 10.10.42.26 +add test 10.10.42.27 +add test 10.10.42.28 +add test 10.10.42.29 +add test 10.10.42.3 +add test 10.10.42.30 +add test 10.10.42.31 +add test 10.10.42.32 +add test 10.10.42.33 +add test 10.10.42.34 +add test 10.10.42.35 +add test 10.10.42.36 +add test 10.10.42.37 +add test 10.10.42.38 +add test 10.10.42.39 +add test 10.10.42.4 +add test 10.10.42.40 +add test 10.10.42.41 +add test 10.10.42.42 +add test 10.10.42.43 +add test 10.10.42.44 +add test 10.10.42.45 +add test 10.10.42.46 +add test 10.10.42.47 +add test 10.10.42.48 +add test 10.10.42.49 +add test 10.10.42.5 +add test 10.10.42.50 +add test 10.10.42.51 +add test 10.10.42.52 +add test 10.10.42.53 +add test 10.10.42.54 +add test 10.10.42.55 +add test 10.10.42.56 +add test 10.10.42.57 +add test 10.10.42.58 +add test 10.10.42.59 +add test 10.10.42.6 +add test 10.10.42.60 +add test 10.10.42.61 +add test 10.10.42.62 +add test 10.10.42.63 +add test 10.10.42.64 +add test 10.10.42.65 +add test 10.10.42.66 +add test 10.10.42.67 +add test 10.10.42.68 +add test 10.10.42.69 +add test 10.10.42.7 +add test 10.10.42.70 +add test 10.10.42.71 +add test 10.10.42.72 +add test 10.10.42.73 +add test 10.10.42.74 +add test 10.10.42.75 +add test 10.10.42.76 +add test 10.10.42.77 +add test 10.10.42.78 +add test 10.10.42.79 +add test 10.10.42.8 +add test 10.10.42.80 +add test 10.10.42.81 +add test 10.10.42.82 +add test 10.10.42.83 +add test 10.10.42.84 +add test 10.10.42.85 +add test 10.10.42.86 +add test 10.10.42.87 +add test 10.10.42.88 +add test 10.10.42.89 +add test 10.10.42.9 +add test 10.10.42.90 +add test 10.10.42.91 +add test 10.10.42.92 +add test 10.10.42.93 +add test 10.10.42.94 +add test 10.10.42.95 +add test 10.10.42.96 +add test 10.10.42.97 +add test 10.10.42.98 +add test 10.10.42.99 +add test 10.10.43.0 +add test 10.10.43.1 +add test 10.10.43.10 +add test 10.10.43.100 +add test 10.10.43.101 +add test 10.10.43.102 +add test 10.10.43.103 +add test 10.10.43.104 +add test 10.10.43.105 +add test 10.10.43.106 +add test 10.10.43.107 +add test 10.10.43.108 +add test 10.10.43.109 +add test 10.10.43.11 +add test 10.10.43.110 +add test 10.10.43.111 +add test 10.10.43.112 +add test 10.10.43.113 +add test 10.10.43.114 +add test 10.10.43.115 +add test 10.10.43.116 +add test 10.10.43.117 +add test 10.10.43.118 +add test 10.10.43.119 +add test 10.10.43.12 +add test 10.10.43.120 +add test 10.10.43.121 +add test 10.10.43.122 +add test 10.10.43.123 +add test 10.10.43.124 +add test 10.10.43.125 +add test 10.10.43.126 +add test 10.10.43.127 +add test 10.10.43.128 +add test 10.10.43.129 +add test 10.10.43.13 +add test 10.10.43.130 +add test 10.10.43.131 +add test 10.10.43.132 +add test 10.10.43.133 +add test 10.10.43.134 +add test 10.10.43.135 +add test 10.10.43.136 +add test 10.10.43.137 +add test 10.10.43.138 +add test 10.10.43.139 +add test 10.10.43.14 +add test 10.10.43.140 +add test 10.10.43.141 +add test 10.10.43.142 +add test 10.10.43.143 +add test 10.10.43.144 +add test 10.10.43.145 +add test 10.10.43.146 +add test 10.10.43.147 +add test 10.10.43.148 +add test 10.10.43.149 +add test 10.10.43.15 +add test 10.10.43.150 +add test 10.10.43.151 +add test 10.10.43.152 +add test 10.10.43.153 +add test 10.10.43.154 +add test 10.10.43.155 +add test 10.10.43.156 +add test 10.10.43.157 +add test 10.10.43.158 +add test 10.10.43.159 +add test 10.10.43.16 +add test 10.10.43.160 +add test 10.10.43.161 +add test 10.10.43.162 +add test 10.10.43.163 +add test 10.10.43.164 +add test 10.10.43.165 +add test 10.10.43.166 +add test 10.10.43.167 +add test 10.10.43.168 +add test 10.10.43.169 +add test 10.10.43.17 +add test 10.10.43.170 +add test 10.10.43.171 +add test 10.10.43.172 +add test 10.10.43.173 +add test 10.10.43.174 +add test 10.10.43.175 +add test 10.10.43.176 +add test 10.10.43.177 +add test 10.10.43.178 +add test 10.10.43.179 +add test 10.10.43.18 +add test 10.10.43.180 +add test 10.10.43.181 +add test 10.10.43.182 +add test 10.10.43.183 +add test 10.10.43.184 +add test 10.10.43.185 +add test 10.10.43.186 +add test 10.10.43.187 +add test 10.10.43.188 +add test 10.10.43.189 +add test 10.10.43.19 +add test 10.10.43.190 +add test 10.10.43.191 +add test 10.10.43.192 +add test 10.10.43.193 +add test 10.10.43.194 +add test 10.10.43.195 +add test 10.10.43.196 +add test 10.10.43.197 +add test 10.10.43.198 +add test 10.10.43.199 +add test 10.10.43.2 +add test 10.10.43.20 +add test 10.10.43.200 +add test 10.10.43.201 +add test 10.10.43.202 +add test 10.10.43.203 +add test 10.10.43.204 +add test 10.10.43.205 +add test 10.10.43.206 +add test 10.10.43.207 +add test 10.10.43.208 +add test 10.10.43.209 +add test 10.10.43.21 +add test 10.10.43.210 +add test 10.10.43.211 +add test 10.10.43.212 +add test 10.10.43.213 +add test 10.10.43.214 +add test 10.10.43.215 +add test 10.10.43.216 +add test 10.10.43.217 +add test 10.10.43.218 +add test 10.10.43.219 +add test 10.10.43.22 +add test 10.10.43.220 +add test 10.10.43.221 +add test 10.10.43.222 +add test 10.10.43.223 +add test 10.10.43.224 +add test 10.10.43.225 +add test 10.10.43.226 +add test 10.10.43.227 +add test 10.10.43.228 +add test 10.10.43.229 +add test 10.10.43.23 +add test 10.10.43.230 +add test 10.10.43.231 +add test 10.10.43.232 +add test 10.10.43.233 +add test 10.10.43.234 +add test 10.10.43.235 +add test 10.10.43.236 +add test 10.10.43.237 +add test 10.10.43.238 +add test 10.10.43.239 +add test 10.10.43.24 +add test 10.10.43.240 +add test 10.10.43.241 +add test 10.10.43.242 +add test 10.10.43.243 +add test 10.10.43.244 +add test 10.10.43.245 +add test 10.10.43.246 +add test 10.10.43.247 +add test 10.10.43.248 +add test 10.10.43.249 +add test 10.10.43.25 +add test 10.10.43.250 +add test 10.10.43.251 +add test 10.10.43.252 +add test 10.10.43.253 +add test 10.10.43.254 +add test 10.10.43.255 +add test 10.10.43.26 +add test 10.10.43.27 +add test 10.10.43.28 +add test 10.10.43.29 +add test 10.10.43.3 +add test 10.10.43.30 +add test 10.10.43.31 +add test 10.10.43.32 +add test 10.10.43.33 +add test 10.10.43.34 +add test 10.10.43.35 +add test 10.10.43.36 +add test 10.10.43.37 +add test 10.10.43.38 +add test 10.10.43.39 +add test 10.10.43.4 +add test 10.10.43.40 +add test 10.10.43.41 +add test 10.10.43.42 +add test 10.10.43.43 +add test 10.10.43.44 +add test 10.10.43.45 +add test 10.10.43.46 +add test 10.10.43.47 +add test 10.10.43.48 +add test 10.10.43.49 +add test 10.10.43.5 +add test 10.10.43.50 +add test 10.10.43.51 +add test 10.10.43.52 +add test 10.10.43.53 +add test 10.10.43.54 +add test 10.10.43.55 +add test 10.10.43.56 +add test 10.10.43.57 +add test 10.10.43.58 +add test 10.10.43.59 +add test 10.10.43.6 +add test 10.10.43.60 +add test 10.10.43.61 +add test 10.10.43.62 +add test 10.10.43.63 +add test 10.10.43.64 +add test 10.10.43.65 +add test 10.10.43.66 +add test 10.10.43.67 +add test 10.10.43.68 +add test 10.10.43.69 +add test 10.10.43.7 +add test 10.10.43.70 +add test 10.10.43.71 +add test 10.10.43.72 +add test 10.10.43.73 +add test 10.10.43.74 +add test 10.10.43.75 +add test 10.10.43.76 +add test 10.10.43.77 +add test 10.10.43.78 +add test 10.10.43.79 +add test 10.10.43.8 +add test 10.10.43.80 +add test 10.10.43.81 +add test 10.10.43.82 +add test 10.10.43.83 +add test 10.10.43.84 +add test 10.10.43.85 +add test 10.10.43.86 +add test 10.10.43.87 +add test 10.10.43.88 +add test 10.10.43.89 +add test 10.10.43.9 +add test 10.10.43.90 +add test 10.10.43.91 +add test 10.10.43.92 +add test 10.10.43.93 +add test 10.10.43.94 +add test 10.10.43.95 +add test 10.10.43.96 +add test 10.10.43.97 +add test 10.10.43.98 +add test 10.10.43.99 +add test 10.10.44.0 +add test 10.10.44.1 +add test 10.10.44.10 +add test 10.10.44.100 +add test 10.10.44.101 +add test 10.10.44.102 +add test 10.10.44.103 +add test 10.10.44.104 +add test 10.10.44.105 +add test 10.10.44.106 +add test 10.10.44.107 +add test 10.10.44.108 +add test 10.10.44.109 +add test 10.10.44.11 +add test 10.10.44.110 +add test 10.10.44.111 +add test 10.10.44.112 +add test 10.10.44.113 +add test 10.10.44.114 +add test 10.10.44.115 +add test 10.10.44.116 +add test 10.10.44.117 +add test 10.10.44.118 +add test 10.10.44.119 +add test 10.10.44.12 +add test 10.10.44.120 +add test 10.10.44.121 +add test 10.10.44.122 +add test 10.10.44.123 +add test 10.10.44.124 +add test 10.10.44.125 +add test 10.10.44.126 +add test 10.10.44.127 +add test 10.10.44.128 +add test 10.10.44.129 +add test 10.10.44.13 +add test 10.10.44.130 +add test 10.10.44.131 +add test 10.10.44.132 +add test 10.10.44.133 +add test 10.10.44.134 +add test 10.10.44.135 +add test 10.10.44.136 +add test 10.10.44.137 +add test 10.10.44.138 +add test 10.10.44.139 +add test 10.10.44.14 +add test 10.10.44.140 +add test 10.10.44.141 +add test 10.10.44.142 +add test 10.10.44.143 +add test 10.10.44.144 +add test 10.10.44.145 +add test 10.10.44.146 +add test 10.10.44.147 +add test 10.10.44.148 +add test 10.10.44.149 +add test 10.10.44.15 +add test 10.10.44.150 +add test 10.10.44.151 +add test 10.10.44.152 +add test 10.10.44.153 +add test 10.10.44.154 +add test 10.10.44.155 +add test 10.10.44.156 +add test 10.10.44.157 +add test 10.10.44.158 +add test 10.10.44.159 +add test 10.10.44.16 +add test 10.10.44.160 +add test 10.10.44.161 +add test 10.10.44.162 +add test 10.10.44.163 +add test 10.10.44.164 +add test 10.10.44.165 +add test 10.10.44.166 +add test 10.10.44.167 +add test 10.10.44.168 +add test 10.10.44.169 +add test 10.10.44.17 +add test 10.10.44.170 +add test 10.10.44.171 +add test 10.10.44.172 +add test 10.10.44.173 +add test 10.10.44.174 +add test 10.10.44.175 +add test 10.10.44.176 +add test 10.10.44.177 +add test 10.10.44.178 +add test 10.10.44.179 +add test 10.10.44.18 +add test 10.10.44.180 +add test 10.10.44.181 +add test 10.10.44.182 +add test 10.10.44.183 +add test 10.10.44.184 +add test 10.10.44.185 +add test 10.10.44.186 +add test 10.10.44.187 +add test 10.10.44.188 +add test 10.10.44.189 +add test 10.10.44.19 +add test 10.10.44.190 +add test 10.10.44.191 +add test 10.10.44.192 +add test 10.10.44.193 +add test 10.10.44.194 +add test 10.10.44.195 +add test 10.10.44.196 +add test 10.10.44.197 +add test 10.10.44.198 +add test 10.10.44.199 +add test 10.10.44.2 +add test 10.10.44.20 +add test 10.10.44.200 +add test 10.10.44.201 +add test 10.10.44.202 +add test 10.10.44.203 +add test 10.10.44.204 +add test 10.10.44.205 +add test 10.10.44.206 +add test 10.10.44.207 +add test 10.10.44.208 +add test 10.10.44.209 +add test 10.10.44.21 +add test 10.10.44.210 +add test 10.10.44.211 +add test 10.10.44.212 +add test 10.10.44.213 +add test 10.10.44.214 +add test 10.10.44.215 +add test 10.10.44.216 +add test 10.10.44.217 +add test 10.10.44.218 +add test 10.10.44.219 +add test 10.10.44.22 +add test 10.10.44.220 +add test 10.10.44.221 +add test 10.10.44.222 +add test 10.10.44.223 +add test 10.10.44.224 +add test 10.10.44.225 +add test 10.10.44.226 +add test 10.10.44.227 +add test 10.10.44.228 +add test 10.10.44.229 +add test 10.10.44.23 +add test 10.10.44.230 +add test 10.10.44.231 +add test 10.10.44.232 +add test 10.10.44.233 +add test 10.10.44.234 +add test 10.10.44.235 +add test 10.10.44.236 +add test 10.10.44.237 +add test 10.10.44.238 +add test 10.10.44.239 +add test 10.10.44.24 +add test 10.10.44.240 +add test 10.10.44.241 +add test 10.10.44.242 +add test 10.10.44.243 +add test 10.10.44.244 +add test 10.10.44.245 +add test 10.10.44.246 +add test 10.10.44.247 +add test 10.10.44.248 +add test 10.10.44.249 +add test 10.10.44.25 +add test 10.10.44.250 +add test 10.10.44.251 +add test 10.10.44.252 +add test 10.10.44.253 +add test 10.10.44.254 +add test 10.10.44.255 +add test 10.10.44.26 +add test 10.10.44.27 +add test 10.10.44.28 +add test 10.10.44.29 +add test 10.10.44.3 +add test 10.10.44.30 +add test 10.10.44.31 +add test 10.10.44.32 +add test 10.10.44.33 +add test 10.10.44.34 +add test 10.10.44.35 +add test 10.10.44.36 +add test 10.10.44.37 +add test 10.10.44.38 +add test 10.10.44.39 +add test 10.10.44.4 +add test 10.10.44.40 +add test 10.10.44.41 +add test 10.10.44.42 +add test 10.10.44.43 +add test 10.10.44.44 +add test 10.10.44.45 +add test 10.10.44.46 +add test 10.10.44.47 +add test 10.10.44.48 +add test 10.10.44.49 +add test 10.10.44.5 +add test 10.10.44.50 +add test 10.10.44.51 +add test 10.10.44.52 +add test 10.10.44.53 +add test 10.10.44.54 +add test 10.10.44.55 +add test 10.10.44.56 +add test 10.10.44.57 +add test 10.10.44.58 +add test 10.10.44.59 +add test 10.10.44.6 +add test 10.10.44.60 +add test 10.10.44.61 +add test 10.10.44.62 +add test 10.10.44.63 +add test 10.10.44.64 +add test 10.10.44.65 +add test 10.10.44.66 +add test 10.10.44.67 +add test 10.10.44.68 +add test 10.10.44.69 +add test 10.10.44.7 +add test 10.10.44.70 +add test 10.10.44.71 +add test 10.10.44.72 +add test 10.10.44.73 +add test 10.10.44.74 +add test 10.10.44.75 +add test 10.10.44.76 +add test 10.10.44.77 +add test 10.10.44.78 +add test 10.10.44.79 +add test 10.10.44.8 +add test 10.10.44.80 +add test 10.10.44.81 +add test 10.10.44.82 +add test 10.10.44.83 +add test 10.10.44.84 +add test 10.10.44.85 +add test 10.10.44.86 +add test 10.10.44.87 +add test 10.10.44.88 +add test 10.10.44.89 +add test 10.10.44.9 +add test 10.10.44.90 +add test 10.10.44.91 +add test 10.10.44.92 +add test 10.10.44.93 +add test 10.10.44.94 +add test 10.10.44.95 +add test 10.10.44.96 +add test 10.10.44.97 +add test 10.10.44.98 +add test 10.10.44.99 +add test 10.10.45.0 +add test 10.10.45.1 +add test 10.10.45.10 +add test 10.10.45.100 +add test 10.10.45.101 +add test 10.10.45.102 +add test 10.10.45.103 +add test 10.10.45.104 +add test 10.10.45.105 +add test 10.10.45.106 +add test 10.10.45.107 +add test 10.10.45.108 +add test 10.10.45.109 +add test 10.10.45.11 +add test 10.10.45.110 +add test 10.10.45.111 +add test 10.10.45.112 +add test 10.10.45.113 +add test 10.10.45.114 +add test 10.10.45.115 +add test 10.10.45.116 +add test 10.10.45.117 +add test 10.10.45.118 +add test 10.10.45.119 +add test 10.10.45.12 +add test 10.10.45.120 +add test 10.10.45.121 +add test 10.10.45.122 +add test 10.10.45.123 +add test 10.10.45.124 +add test 10.10.45.125 +add test 10.10.45.126 +add test 10.10.45.127 +add test 10.10.45.128 +add test 10.10.45.129 +add test 10.10.45.13 +add test 10.10.45.130 +add test 10.10.45.131 +add test 10.10.45.132 +add test 10.10.45.133 +add test 10.10.45.134 +add test 10.10.45.135 +add test 10.10.45.136 +add test 10.10.45.137 +add test 10.10.45.138 +add test 10.10.45.139 +add test 10.10.45.14 +add test 10.10.45.140 +add test 10.10.45.141 +add test 10.10.45.142 +add test 10.10.45.143 +add test 10.10.45.144 +add test 10.10.45.145 +add test 10.10.45.146 +add test 10.10.45.147 +add test 10.10.45.148 +add test 10.10.45.149 +add test 10.10.45.15 +add test 10.10.45.150 +add test 10.10.45.151 +add test 10.10.45.152 +add test 10.10.45.153 +add test 10.10.45.154 +add test 10.10.45.155 +add test 10.10.45.156 +add test 10.10.45.157 +add test 10.10.45.158 +add test 10.10.45.159 +add test 10.10.45.16 +add test 10.10.45.160 +add test 10.10.45.161 +add test 10.10.45.162 +add test 10.10.45.163 +add test 10.10.45.164 +add test 10.10.45.165 +add test 10.10.45.166 +add test 10.10.45.167 +add test 10.10.45.168 +add test 10.10.45.169 +add test 10.10.45.17 +add test 10.10.45.170 +add test 10.10.45.171 +add test 10.10.45.172 +add test 10.10.45.173 +add test 10.10.45.174 +add test 10.10.45.175 +add test 10.10.45.176 +add test 10.10.45.177 +add test 10.10.45.178 +add test 10.10.45.179 +add test 10.10.45.18 +add test 10.10.45.180 +add test 10.10.45.181 +add test 10.10.45.182 +add test 10.10.45.183 +add test 10.10.45.184 +add test 10.10.45.185 +add test 10.10.45.186 +add test 10.10.45.187 +add test 10.10.45.188 +add test 10.10.45.189 +add test 10.10.45.19 +add test 10.10.45.190 +add test 10.10.45.191 +add test 10.10.45.192 +add test 10.10.45.193 +add test 10.10.45.194 +add test 10.10.45.195 +add test 10.10.45.196 +add test 10.10.45.197 +add test 10.10.45.198 +add test 10.10.45.199 +add test 10.10.45.2 +add test 10.10.45.20 +add test 10.10.45.200 +add test 10.10.45.201 +add test 10.10.45.202 +add test 10.10.45.203 +add test 10.10.45.204 +add test 10.10.45.205 +add test 10.10.45.206 +add test 10.10.45.207 +add test 10.10.45.208 +add test 10.10.45.209 +add test 10.10.45.21 +add test 10.10.45.210 +add test 10.10.45.211 +add test 10.10.45.212 +add test 10.10.45.213 +add test 10.10.45.214 +add test 10.10.45.215 +add test 10.10.45.216 +add test 10.10.45.217 +add test 10.10.45.218 +add test 10.10.45.219 +add test 10.10.45.22 +add test 10.10.45.220 +add test 10.10.45.221 +add test 10.10.45.222 +add test 10.10.45.223 +add test 10.10.45.224 +add test 10.10.45.225 +add test 10.10.45.226 +add test 10.10.45.227 +add test 10.10.45.228 +add test 10.10.45.229 +add test 10.10.45.23 +add test 10.10.45.230 +add test 10.10.45.231 +add test 10.10.45.232 +add test 10.10.45.233 +add test 10.10.45.234 +add test 10.10.45.235 +add test 10.10.45.236 +add test 10.10.45.237 +add test 10.10.45.238 +add test 10.10.45.239 +add test 10.10.45.24 +add test 10.10.45.240 +add test 10.10.45.241 +add test 10.10.45.242 +add test 10.10.45.243 +add test 10.10.45.244 +add test 10.10.45.245 +add test 10.10.45.246 +add test 10.10.45.247 +add test 10.10.45.248 +add test 10.10.45.249 +add test 10.10.45.25 +add test 10.10.45.250 +add test 10.10.45.251 +add test 10.10.45.252 +add test 10.10.45.253 +add test 10.10.45.254 +add test 10.10.45.255 +add test 10.10.45.26 +add test 10.10.45.27 +add test 10.10.45.28 +add test 10.10.45.29 +add test 10.10.45.3 +add test 10.10.45.30 +add test 10.10.45.31 +add test 10.10.45.32 +add test 10.10.45.33 +add test 10.10.45.34 +add test 10.10.45.35 +add test 10.10.45.36 +add test 10.10.45.37 +add test 10.10.45.38 +add test 10.10.45.39 +add test 10.10.45.4 +add test 10.10.45.40 +add test 10.10.45.41 +add test 10.10.45.42 +add test 10.10.45.43 +add test 10.10.45.44 +add test 10.10.45.45 +add test 10.10.45.46 +add test 10.10.45.47 +add test 10.10.45.48 +add test 10.10.45.49 +add test 10.10.45.5 +add test 10.10.45.50 +add test 10.10.45.51 +add test 10.10.45.52 +add test 10.10.45.53 +add test 10.10.45.54 +add test 10.10.45.55 +add test 10.10.45.56 +add test 10.10.45.57 +add test 10.10.45.58 +add test 10.10.45.59 +add test 10.10.45.6 +add test 10.10.45.60 +add test 10.10.45.61 +add test 10.10.45.62 +add test 10.10.45.63 +add test 10.10.45.64 +add test 10.10.45.65 +add test 10.10.45.66 +add test 10.10.45.67 +add test 10.10.45.68 +add test 10.10.45.69 +add test 10.10.45.7 +add test 10.10.45.70 +add test 10.10.45.71 +add test 10.10.45.72 +add test 10.10.45.73 +add test 10.10.45.74 +add test 10.10.45.75 +add test 10.10.45.76 +add test 10.10.45.77 +add test 10.10.45.78 +add test 10.10.45.79 +add test 10.10.45.8 +add test 10.10.45.80 +add test 10.10.45.81 +add test 10.10.45.82 +add test 10.10.45.83 +add test 10.10.45.84 +add test 10.10.45.85 +add test 10.10.45.86 +add test 10.10.45.87 +add test 10.10.45.88 +add test 10.10.45.89 +add test 10.10.45.9 +add test 10.10.45.90 +add test 10.10.45.91 +add test 10.10.45.92 +add test 10.10.45.93 +add test 10.10.45.94 +add test 10.10.45.95 +add test 10.10.45.96 +add test 10.10.45.97 +add test 10.10.45.98 +add test 10.10.45.99 +add test 10.10.46.0 +add test 10.10.46.1 +add test 10.10.46.10 +add test 10.10.46.100 +add test 10.10.46.101 +add test 10.10.46.102 +add test 10.10.46.103 +add test 10.10.46.104 +add test 10.10.46.105 +add test 10.10.46.106 +add test 10.10.46.107 +add test 10.10.46.108 +add test 10.10.46.109 +add test 10.10.46.11 +add test 10.10.46.110 +add test 10.10.46.111 +add test 10.10.46.112 +add test 10.10.46.113 +add test 10.10.46.114 +add test 10.10.46.115 +add test 10.10.46.116 +add test 10.10.46.117 +add test 10.10.46.118 +add test 10.10.46.119 +add test 10.10.46.12 +add test 10.10.46.120 +add test 10.10.46.121 +add test 10.10.46.122 +add test 10.10.46.123 +add test 10.10.46.124 +add test 10.10.46.125 +add test 10.10.46.126 +add test 10.10.46.127 +add test 10.10.46.128 +add test 10.10.46.129 +add test 10.10.46.13 +add test 10.10.46.130 +add test 10.10.46.131 +add test 10.10.46.132 +add test 10.10.46.133 +add test 10.10.46.134 +add test 10.10.46.135 +add test 10.10.46.136 +add test 10.10.46.137 +add test 10.10.46.138 +add test 10.10.46.139 +add test 10.10.46.14 +add test 10.10.46.140 +add test 10.10.46.141 +add test 10.10.46.142 +add test 10.10.46.143 +add test 10.10.46.144 +add test 10.10.46.145 +add test 10.10.46.146 +add test 10.10.46.147 +add test 10.10.46.148 +add test 10.10.46.149 +add test 10.10.46.15 +add test 10.10.46.150 +add test 10.10.46.151 +add test 10.10.46.152 +add test 10.10.46.153 +add test 10.10.46.154 +add test 10.10.46.155 +add test 10.10.46.156 +add test 10.10.46.157 +add test 10.10.46.158 +add test 10.10.46.159 +add test 10.10.46.16 +add test 10.10.46.160 +add test 10.10.46.161 +add test 10.10.46.162 +add test 10.10.46.163 +add test 10.10.46.164 +add test 10.10.46.165 +add test 10.10.46.166 +add test 10.10.46.167 +add test 10.10.46.168 +add test 10.10.46.169 +add test 10.10.46.17 +add test 10.10.46.170 +add test 10.10.46.171 +add test 10.10.46.172 +add test 10.10.46.173 +add test 10.10.46.174 +add test 10.10.46.175 +add test 10.10.46.176 +add test 10.10.46.177 +add test 10.10.46.178 +add test 10.10.46.179 +add test 10.10.46.18 +add test 10.10.46.180 +add test 10.10.46.181 +add test 10.10.46.182 +add test 10.10.46.183 +add test 10.10.46.184 +add test 10.10.46.185 +add test 10.10.46.186 +add test 10.10.46.187 +add test 10.10.46.188 +add test 10.10.46.189 +add test 10.10.46.19 +add test 10.10.46.190 +add test 10.10.46.191 +add test 10.10.46.192 +add test 10.10.46.193 +add test 10.10.46.194 +add test 10.10.46.195 +add test 10.10.46.196 +add test 10.10.46.197 +add test 10.10.46.198 +add test 10.10.46.199 +add test 10.10.46.2 +add test 10.10.46.20 +add test 10.10.46.200 +add test 10.10.46.201 +add test 10.10.46.202 +add test 10.10.46.203 +add test 10.10.46.204 +add test 10.10.46.205 +add test 10.10.46.206 +add test 10.10.46.207 +add test 10.10.46.208 +add test 10.10.46.209 +add test 10.10.46.21 +add test 10.10.46.210 +add test 10.10.46.211 +add test 10.10.46.212 +add test 10.10.46.213 +add test 10.10.46.214 +add test 10.10.46.215 +add test 10.10.46.216 +add test 10.10.46.217 +add test 10.10.46.218 +add test 10.10.46.219 +add test 10.10.46.22 +add test 10.10.46.220 +add test 10.10.46.221 +add test 10.10.46.222 +add test 10.10.46.223 +add test 10.10.46.224 +add test 10.10.46.225 +add test 10.10.46.226 +add test 10.10.46.227 +add test 10.10.46.228 +add test 10.10.46.229 +add test 10.10.46.23 +add test 10.10.46.230 +add test 10.10.46.231 +add test 10.10.46.232 +add test 10.10.46.233 +add test 10.10.46.234 +add test 10.10.46.235 +add test 10.10.46.236 +add test 10.10.46.237 +add test 10.10.46.238 +add test 10.10.46.239 +add test 10.10.46.24 +add test 10.10.46.240 +add test 10.10.46.241 +add test 10.10.46.242 +add test 10.10.46.243 +add test 10.10.46.244 +add test 10.10.46.245 +add test 10.10.46.246 +add test 10.10.46.247 +add test 10.10.46.248 +add test 10.10.46.249 +add test 10.10.46.25 +add test 10.10.46.250 +add test 10.10.46.251 +add test 10.10.46.252 +add test 10.10.46.253 +add test 10.10.46.254 +add test 10.10.46.255 +add test 10.10.46.26 +add test 10.10.46.27 +add test 10.10.46.28 +add test 10.10.46.29 +add test 10.10.46.3 +add test 10.10.46.30 +add test 10.10.46.31 +add test 10.10.46.32 +add test 10.10.46.33 +add test 10.10.46.34 +add test 10.10.46.35 +add test 10.10.46.36 +add test 10.10.46.37 +add test 10.10.46.38 +add test 10.10.46.39 +add test 10.10.46.4 +add test 10.10.46.40 +add test 10.10.46.41 +add test 10.10.46.42 +add test 10.10.46.43 +add test 10.10.46.44 +add test 10.10.46.45 +add test 10.10.46.46 +add test 10.10.46.47 +add test 10.10.46.48 +add test 10.10.46.49 +add test 10.10.46.5 +add test 10.10.46.50 +add test 10.10.46.51 +add test 10.10.46.52 +add test 10.10.46.53 +add test 10.10.46.54 +add test 10.10.46.55 +add test 10.10.46.56 +add test 10.10.46.57 +add test 10.10.46.58 +add test 10.10.46.59 +add test 10.10.46.6 +add test 10.10.46.60 +add test 10.10.46.61 +add test 10.10.46.62 +add test 10.10.46.63 +add test 10.10.46.64 +add test 10.10.46.65 +add test 10.10.46.66 +add test 10.10.46.67 +add test 10.10.46.68 +add test 10.10.46.69 +add test 10.10.46.7 +add test 10.10.46.70 +add test 10.10.46.71 +add test 10.10.46.72 +add test 10.10.46.73 +add test 10.10.46.74 +add test 10.10.46.75 +add test 10.10.46.76 +add test 10.10.46.77 +add test 10.10.46.78 +add test 10.10.46.79 +add test 10.10.46.8 +add test 10.10.46.80 +add test 10.10.46.81 +add test 10.10.46.82 +add test 10.10.46.83 +add test 10.10.46.84 +add test 10.10.46.85 +add test 10.10.46.86 +add test 10.10.46.87 +add test 10.10.46.88 +add test 10.10.46.89 +add test 10.10.46.9 +add test 10.10.46.90 +add test 10.10.46.91 +add test 10.10.46.92 +add test 10.10.46.93 +add test 10.10.46.94 +add test 10.10.46.95 +add test 10.10.46.96 +add test 10.10.46.97 +add test 10.10.46.98 +add test 10.10.46.99 +add test 10.10.47.0 +add test 10.10.47.1 +add test 10.10.47.10 +add test 10.10.47.100 +add test 10.10.47.101 +add test 10.10.47.102 +add test 10.10.47.103 +add test 10.10.47.104 +add test 10.10.47.105 +add test 10.10.47.106 +add test 10.10.47.107 +add test 10.10.47.108 +add test 10.10.47.109 +add test 10.10.47.11 +add test 10.10.47.110 +add test 10.10.47.111 +add test 10.10.47.112 +add test 10.10.47.113 +add test 10.10.47.114 +add test 10.10.47.115 +add test 10.10.47.116 +add test 10.10.47.117 +add test 10.10.47.118 +add test 10.10.47.119 +add test 10.10.47.12 +add test 10.10.47.120 +add test 10.10.47.121 +add test 10.10.47.122 +add test 10.10.47.123 +add test 10.10.47.124 +add test 10.10.47.125 +add test 10.10.47.126 +add test 10.10.47.127 +add test 10.10.47.128 +add test 10.10.47.129 +add test 10.10.47.13 +add test 10.10.47.130 +add test 10.10.47.131 +add test 10.10.47.132 +add test 10.10.47.133 +add test 10.10.47.134 +add test 10.10.47.135 +add test 10.10.47.136 +add test 10.10.47.137 +add test 10.10.47.138 +add test 10.10.47.139 +add test 10.10.47.14 +add test 10.10.47.140 +add test 10.10.47.141 +add test 10.10.47.142 +add test 10.10.47.143 +add test 10.10.47.144 +add test 10.10.47.145 +add test 10.10.47.146 +add test 10.10.47.147 +add test 10.10.47.148 +add test 10.10.47.149 +add test 10.10.47.15 +add test 10.10.47.150 +add test 10.10.47.151 +add test 10.10.47.152 +add test 10.10.47.153 +add test 10.10.47.154 +add test 10.10.47.155 +add test 10.10.47.156 +add test 10.10.47.157 +add test 10.10.47.158 +add test 10.10.47.159 +add test 10.10.47.16 +add test 10.10.47.160 +add test 10.10.47.161 +add test 10.10.47.162 +add test 10.10.47.163 +add test 10.10.47.164 +add test 10.10.47.165 +add test 10.10.47.166 +add test 10.10.47.167 +add test 10.10.47.168 +add test 10.10.47.169 +add test 10.10.47.17 +add test 10.10.47.170 +add test 10.10.47.171 +add test 10.10.47.172 +add test 10.10.47.173 +add test 10.10.47.174 +add test 10.10.47.175 +add test 10.10.47.176 +add test 10.10.47.177 +add test 10.10.47.178 +add test 10.10.47.179 +add test 10.10.47.18 +add test 10.10.47.180 +add test 10.10.47.181 +add test 10.10.47.182 +add test 10.10.47.183 +add test 10.10.47.184 +add test 10.10.47.185 +add test 10.10.47.186 +add test 10.10.47.187 +add test 10.10.47.188 +add test 10.10.47.189 +add test 10.10.47.19 +add test 10.10.47.190 +add test 10.10.47.191 +add test 10.10.47.192 +add test 10.10.47.193 +add test 10.10.47.194 +add test 10.10.47.195 +add test 10.10.47.196 +add test 10.10.47.197 +add test 10.10.47.198 +add test 10.10.47.199 +add test 10.10.47.2 +add test 10.10.47.20 +add test 10.10.47.200 +add test 10.10.47.201 +add test 10.10.47.202 +add test 10.10.47.203 +add test 10.10.47.204 +add test 10.10.47.205 +add test 10.10.47.206 +add test 10.10.47.207 +add test 10.10.47.208 +add test 10.10.47.209 +add test 10.10.47.21 +add test 10.10.47.210 +add test 10.10.47.211 +add test 10.10.47.212 +add test 10.10.47.213 +add test 10.10.47.214 +add test 10.10.47.215 +add test 10.10.47.216 +add test 10.10.47.217 +add test 10.10.47.218 +add test 10.10.47.219 +add test 10.10.47.22 +add test 10.10.47.220 +add test 10.10.47.221 +add test 10.10.47.222 +add test 10.10.47.223 +add test 10.10.47.224 +add test 10.10.47.225 +add test 10.10.47.226 +add test 10.10.47.227 +add test 10.10.47.228 +add test 10.10.47.229 +add test 10.10.47.23 +add test 10.10.47.230 +add test 10.10.47.231 +add test 10.10.47.232 +add test 10.10.47.233 +add test 10.10.47.234 +add test 10.10.47.235 +add test 10.10.47.236 +add test 10.10.47.237 +add test 10.10.47.238 +add test 10.10.47.239 +add test 10.10.47.24 +add test 10.10.47.240 +add test 10.10.47.241 +add test 10.10.47.242 +add test 10.10.47.243 +add test 10.10.47.244 +add test 10.10.47.245 +add test 10.10.47.246 +add test 10.10.47.247 +add test 10.10.47.248 +add test 10.10.47.249 +add test 10.10.47.25 +add test 10.10.47.250 +add test 10.10.47.251 +add test 10.10.47.252 +add test 10.10.47.253 +add test 10.10.47.254 +add test 10.10.47.255 +add test 10.10.47.26 +add test 10.10.47.27 +add test 10.10.47.28 +add test 10.10.47.29 +add test 10.10.47.3 +add test 10.10.47.30 +add test 10.10.47.31 +add test 10.10.47.32 +add test 10.10.47.33 +add test 10.10.47.34 +add test 10.10.47.35 +add test 10.10.47.36 +add test 10.10.47.37 +add test 10.10.47.38 +add test 10.10.47.39 +add test 10.10.47.4 +add test 10.10.47.40 +add test 10.10.47.41 +add test 10.10.47.42 +add test 10.10.47.43 +add test 10.10.47.44 +add test 10.10.47.45 +add test 10.10.47.46 +add test 10.10.47.47 +add test 10.10.47.48 +add test 10.10.47.49 +add test 10.10.47.5 +add test 10.10.47.50 +add test 10.10.47.51 +add test 10.10.47.52 +add test 10.10.47.53 +add test 10.10.47.54 +add test 10.10.47.55 +add test 10.10.47.56 +add test 10.10.47.57 +add test 10.10.47.58 +add test 10.10.47.59 +add test 10.10.47.6 +add test 10.10.47.60 +add test 10.10.47.61 +add test 10.10.47.62 +add test 10.10.47.63 +add test 10.10.47.64 +add test 10.10.47.65 +add test 10.10.47.66 +add test 10.10.47.67 +add test 10.10.47.68 +add test 10.10.47.69 +add test 10.10.47.7 +add test 10.10.47.70 +add test 10.10.47.71 +add test 10.10.47.72 +add test 10.10.47.73 +add test 10.10.47.74 +add test 10.10.47.75 +add test 10.10.47.76 +add test 10.10.47.77 +add test 10.10.47.78 +add test 10.10.47.79 +add test 10.10.47.8 +add test 10.10.47.80 +add test 10.10.47.81 +add test 10.10.47.82 +add test 10.10.47.83 +add test 10.10.47.84 +add test 10.10.47.85 +add test 10.10.47.86 +add test 10.10.47.87 +add test 10.10.47.88 +add test 10.10.47.89 +add test 10.10.47.9 +add test 10.10.47.90 +add test 10.10.47.91 +add test 10.10.47.92 +add test 10.10.47.93 +add test 10.10.47.94 +add test 10.10.47.95 +add test 10.10.47.96 +add test 10.10.47.97 +add test 10.10.47.98 +add test 10.10.47.99 +add test 10.10.48.0 +add test 10.10.48.1 +add test 10.10.48.10 +add test 10.10.48.100 +add test 10.10.48.101 +add test 10.10.48.102 +add test 10.10.48.103 +add test 10.10.48.104 +add test 10.10.48.105 +add test 10.10.48.106 +add test 10.10.48.107 +add test 10.10.48.108 +add test 10.10.48.109 +add test 10.10.48.11 +add test 10.10.48.110 +add test 10.10.48.111 +add test 10.10.48.112 +add test 10.10.48.113 +add test 10.10.48.114 +add test 10.10.48.115 +add test 10.10.48.116 +add test 10.10.48.117 +add test 10.10.48.118 +add test 10.10.48.119 +add test 10.10.48.12 +add test 10.10.48.120 +add test 10.10.48.121 +add test 10.10.48.122 +add test 10.10.48.123 +add test 10.10.48.124 +add test 10.10.48.125 +add test 10.10.48.126 +add test 10.10.48.127 +add test 10.10.48.128 +add test 10.10.48.129 +add test 10.10.48.13 +add test 10.10.48.130 +add test 10.10.48.131 +add test 10.10.48.132 +add test 10.10.48.133 +add test 10.10.48.134 +add test 10.10.48.135 +add test 10.10.48.136 +add test 10.10.48.137 +add test 10.10.48.138 +add test 10.10.48.139 +add test 10.10.48.14 +add test 10.10.48.140 +add test 10.10.48.141 +add test 10.10.48.142 +add test 10.10.48.143 +add test 10.10.48.144 +add test 10.10.48.145 +add test 10.10.48.146 +add test 10.10.48.147 +add test 10.10.48.148 +add test 10.10.48.149 +add test 10.10.48.15 +add test 10.10.48.150 +add test 10.10.48.151 +add test 10.10.48.152 +add test 10.10.48.153 +add test 10.10.48.154 +add test 10.10.48.155 +add test 10.10.48.156 +add test 10.10.48.157 +add test 10.10.48.158 +add test 10.10.48.159 +add test 10.10.48.16 +add test 10.10.48.160 +add test 10.10.48.161 +add test 10.10.48.162 +add test 10.10.48.163 +add test 10.10.48.164 +add test 10.10.48.165 +add test 10.10.48.166 +add test 10.10.48.167 +add test 10.10.48.168 +add test 10.10.48.169 +add test 10.10.48.17 +add test 10.10.48.170 +add test 10.10.48.171 +add test 10.10.48.172 +add test 10.10.48.173 +add test 10.10.48.174 +add test 10.10.48.175 +add test 10.10.48.176 +add test 10.10.48.177 +add test 10.10.48.178 +add test 10.10.48.179 +add test 10.10.48.18 +add test 10.10.48.180 +add test 10.10.48.181 +add test 10.10.48.182 +add test 10.10.48.183 +add test 10.10.48.184 +add test 10.10.48.185 +add test 10.10.48.186 +add test 10.10.48.187 +add test 10.10.48.188 +add test 10.10.48.189 +add test 10.10.48.19 +add test 10.10.48.190 +add test 10.10.48.191 +add test 10.10.48.192 +add test 10.10.48.193 +add test 10.10.48.194 +add test 10.10.48.195 +add test 10.10.48.196 +add test 10.10.48.197 +add test 10.10.48.198 +add test 10.10.48.199 +add test 10.10.48.2 +add test 10.10.48.20 +add test 10.10.48.200 +add test 10.10.48.201 +add test 10.10.48.202 +add test 10.10.48.203 +add test 10.10.48.204 +add test 10.10.48.205 +add test 10.10.48.206 +add test 10.10.48.207 +add test 10.10.48.208 +add test 10.10.48.209 +add test 10.10.48.21 +add test 10.10.48.210 +add test 10.10.48.211 +add test 10.10.48.212 +add test 10.10.48.213 +add test 10.10.48.214 +add test 10.10.48.215 +add test 10.10.48.216 +add test 10.10.48.217 +add test 10.10.48.218 +add test 10.10.48.219 +add test 10.10.48.22 +add test 10.10.48.220 +add test 10.10.48.221 +add test 10.10.48.222 +add test 10.10.48.223 +add test 10.10.48.224 +add test 10.10.48.225 +add test 10.10.48.226 +add test 10.10.48.227 +add test 10.10.48.228 +add test 10.10.48.229 +add test 10.10.48.23 +add test 10.10.48.230 +add test 10.10.48.231 +add test 10.10.48.232 +add test 10.10.48.233 +add test 10.10.48.234 +add test 10.10.48.235 +add test 10.10.48.236 +add test 10.10.48.237 +add test 10.10.48.238 +add test 10.10.48.239 +add test 10.10.48.24 +add test 10.10.48.240 +add test 10.10.48.241 +add test 10.10.48.242 +add test 10.10.48.243 +add test 10.10.48.244 +add test 10.10.48.245 +add test 10.10.48.246 +add test 10.10.48.247 +add test 10.10.48.248 +add test 10.10.48.249 +add test 10.10.48.25 +add test 10.10.48.250 +add test 10.10.48.251 +add test 10.10.48.252 +add test 10.10.48.253 +add test 10.10.48.254 +add test 10.10.48.255 +add test 10.10.48.26 +add test 10.10.48.27 +add test 10.10.48.28 +add test 10.10.48.29 +add test 10.10.48.3 +add test 10.10.48.30 +add test 10.10.48.31 +add test 10.10.48.32 +add test 10.10.48.33 +add test 10.10.48.34 +add test 10.10.48.35 +add test 10.10.48.36 +add test 10.10.48.37 +add test 10.10.48.38 +add test 10.10.48.39 +add test 10.10.48.4 +add test 10.10.48.40 +add test 10.10.48.41 +add test 10.10.48.42 +add test 10.10.48.43 +add test 10.10.48.44 +add test 10.10.48.45 +add test 10.10.48.46 +add test 10.10.48.47 +add test 10.10.48.48 +add test 10.10.48.49 +add test 10.10.48.5 +add test 10.10.48.50 +add test 10.10.48.51 +add test 10.10.48.52 +add test 10.10.48.53 +add test 10.10.48.54 +add test 10.10.48.55 +add test 10.10.48.56 +add test 10.10.48.57 +add test 10.10.48.58 +add test 10.10.48.59 +add test 10.10.48.6 +add test 10.10.48.60 +add test 10.10.48.61 +add test 10.10.48.62 +add test 10.10.48.63 +add test 10.10.48.64 +add test 10.10.48.65 +add test 10.10.48.66 +add test 10.10.48.67 +add test 10.10.48.68 +add test 10.10.48.69 +add test 10.10.48.7 +add test 10.10.48.70 +add test 10.10.48.71 +add test 10.10.48.72 +add test 10.10.48.73 +add test 10.10.48.74 +add test 10.10.48.75 +add test 10.10.48.76 +add test 10.10.48.77 +add test 10.10.48.78 +add test 10.10.48.79 +add test 10.10.48.8 +add test 10.10.48.80 +add test 10.10.48.81 +add test 10.10.48.82 +add test 10.10.48.83 +add test 10.10.48.84 +add test 10.10.48.85 +add test 10.10.48.86 +add test 10.10.48.87 +add test 10.10.48.88 +add test 10.10.48.89 +add test 10.10.48.9 +add test 10.10.48.90 +add test 10.10.48.91 +add test 10.10.48.92 +add test 10.10.48.93 +add test 10.10.48.94 +add test 10.10.48.95 +add test 10.10.48.96 +add test 10.10.48.97 +add test 10.10.48.98 +add test 10.10.48.99 +add test 10.10.49.0 +add test 10.10.49.1 +add test 10.10.49.10 +add test 10.10.49.100 +add test 10.10.49.101 +add test 10.10.49.102 +add test 10.10.49.103 +add test 10.10.49.104 +add test 10.10.49.105 +add test 10.10.49.106 +add test 10.10.49.107 +add test 10.10.49.108 +add test 10.10.49.109 +add test 10.10.49.11 +add test 10.10.49.110 +add test 10.10.49.111 +add test 10.10.49.112 +add test 10.10.49.113 +add test 10.10.49.114 +add test 10.10.49.115 +add test 10.10.49.116 +add test 10.10.49.117 +add test 10.10.49.118 +add test 10.10.49.119 +add test 10.10.49.12 +add test 10.10.49.120 +add test 10.10.49.121 +add test 10.10.49.122 +add test 10.10.49.123 +add test 10.10.49.124 +add test 10.10.49.125 +add test 10.10.49.126 +add test 10.10.49.127 +add test 10.10.49.128 +add test 10.10.49.129 +add test 10.10.49.13 +add test 10.10.49.130 +add test 10.10.49.131 +add test 10.10.49.132 +add test 10.10.49.133 +add test 10.10.49.134 +add test 10.10.49.135 +add test 10.10.49.136 +add test 10.10.49.137 +add test 10.10.49.138 +add test 10.10.49.139 +add test 10.10.49.14 +add test 10.10.49.140 +add test 10.10.49.141 +add test 10.10.49.142 +add test 10.10.49.143 +add test 10.10.49.144 +add test 10.10.49.145 +add test 10.10.49.146 +add test 10.10.49.147 +add test 10.10.49.148 +add test 10.10.49.149 +add test 10.10.49.15 +add test 10.10.49.150 +add test 10.10.49.151 +add test 10.10.49.152 +add test 10.10.49.153 +add test 10.10.49.154 +add test 10.10.49.155 +add test 10.10.49.156 +add test 10.10.49.157 +add test 10.10.49.158 +add test 10.10.49.159 +add test 10.10.49.16 +add test 10.10.49.160 +add test 10.10.49.161 +add test 10.10.49.162 +add test 10.10.49.163 +add test 10.10.49.164 +add test 10.10.49.165 +add test 10.10.49.166 +add test 10.10.49.167 +add test 10.10.49.168 +add test 10.10.49.169 +add test 10.10.49.17 +add test 10.10.49.170 +add test 10.10.49.171 +add test 10.10.49.172 +add test 10.10.49.173 +add test 10.10.49.174 +add test 10.10.49.175 +add test 10.10.49.176 +add test 10.10.49.177 +add test 10.10.49.178 +add test 10.10.49.179 +add test 10.10.49.18 +add test 10.10.49.180 +add test 10.10.49.181 +add test 10.10.49.182 +add test 10.10.49.183 +add test 10.10.49.184 +add test 10.10.49.185 +add test 10.10.49.186 +add test 10.10.49.187 +add test 10.10.49.188 +add test 10.10.49.189 +add test 10.10.49.19 +add test 10.10.49.190 +add test 10.10.49.191 +add test 10.10.49.192 +add test 10.10.49.193 +add test 10.10.49.194 +add test 10.10.49.195 +add test 10.10.49.196 +add test 10.10.49.197 +add test 10.10.49.198 +add test 10.10.49.199 +add test 10.10.49.2 +add test 10.10.49.20 +add test 10.10.49.200 +add test 10.10.49.201 +add test 10.10.49.202 +add test 10.10.49.203 +add test 10.10.49.204 +add test 10.10.49.205 +add test 10.10.49.206 +add test 10.10.49.207 +add test 10.10.49.208 +add test 10.10.49.209 +add test 10.10.49.21 +add test 10.10.49.210 +add test 10.10.49.211 +add test 10.10.49.212 +add test 10.10.49.213 +add test 10.10.49.214 +add test 10.10.49.215 +add test 10.10.49.216 +add test 10.10.49.217 +add test 10.10.49.218 +add test 10.10.49.219 +add test 10.10.49.22 +add test 10.10.49.220 +add test 10.10.49.221 +add test 10.10.49.222 +add test 10.10.49.223 +add test 10.10.49.224 +add test 10.10.49.225 +add test 10.10.49.226 +add test 10.10.49.227 +add test 10.10.49.228 +add test 10.10.49.229 +add test 10.10.49.23 +add test 10.10.49.230 +add test 10.10.49.231 +add test 10.10.49.232 +add test 10.10.49.233 +add test 10.10.49.234 +add test 10.10.49.235 +add test 10.10.49.236 +add test 10.10.49.237 +add test 10.10.49.238 +add test 10.10.49.239 +add test 10.10.49.24 +add test 10.10.49.240 +add test 10.10.49.241 +add test 10.10.49.242 +add test 10.10.49.243 +add test 10.10.49.244 +add test 10.10.49.245 +add test 10.10.49.246 +add test 10.10.49.247 +add test 10.10.49.248 +add test 10.10.49.249 +add test 10.10.49.25 +add test 10.10.49.250 +add test 10.10.49.251 +add test 10.10.49.252 +add test 10.10.49.253 +add test 10.10.49.254 +add test 10.10.49.255 +add test 10.10.49.26 +add test 10.10.49.27 +add test 10.10.49.28 +add test 10.10.49.29 +add test 10.10.49.3 +add test 10.10.49.30 +add test 10.10.49.31 +add test 10.10.49.32 +add test 10.10.49.33 +add test 10.10.49.34 +add test 10.10.49.35 +add test 10.10.49.36 +add test 10.10.49.37 +add test 10.10.49.38 +add test 10.10.49.39 +add test 10.10.49.4 +add test 10.10.49.40 +add test 10.10.49.41 +add test 10.10.49.42 +add test 10.10.49.43 +add test 10.10.49.44 +add test 10.10.49.45 +add test 10.10.49.46 +add test 10.10.49.47 +add test 10.10.49.48 +add test 10.10.49.49 +add test 10.10.49.5 +add test 10.10.49.50 +add test 10.10.49.51 +add test 10.10.49.52 +add test 10.10.49.53 +add test 10.10.49.54 +add test 10.10.49.55 +add test 10.10.49.56 +add test 10.10.49.57 +add test 10.10.49.58 +add test 10.10.49.59 +add test 10.10.49.6 +add test 10.10.49.60 +add test 10.10.49.61 +add test 10.10.49.62 +add test 10.10.49.63 +add test 10.10.49.64 +add test 10.10.49.65 +add test 10.10.49.66 +add test 10.10.49.67 +add test 10.10.49.68 +add test 10.10.49.69 +add test 10.10.49.7 +add test 10.10.49.70 +add test 10.10.49.71 +add test 10.10.49.72 +add test 10.10.49.73 +add test 10.10.49.74 +add test 10.10.49.75 +add test 10.10.49.76 +add test 10.10.49.77 +add test 10.10.49.78 +add test 10.10.49.79 +add test 10.10.49.8 +add test 10.10.49.80 +add test 10.10.49.81 +add test 10.10.49.82 +add test 10.10.49.83 +add test 10.10.49.84 +add test 10.10.49.85 +add test 10.10.49.86 +add test 10.10.49.87 +add test 10.10.49.88 +add test 10.10.49.89 +add test 10.10.49.9 +add test 10.10.49.90 +add test 10.10.49.91 +add test 10.10.49.92 +add test 10.10.49.93 +add test 10.10.49.94 +add test 10.10.49.95 +add test 10.10.49.96 +add test 10.10.49.97 +add test 10.10.49.98 +add test 10.10.49.99 +add test 10.10.5.0 +add test 10.10.5.1 +add test 10.10.5.10 +add test 10.10.5.100 +add test 10.10.5.101 +add test 10.10.5.102 +add test 10.10.5.103 +add test 10.10.5.104 +add test 10.10.5.105 +add test 10.10.5.106 +add test 10.10.5.107 +add test 10.10.5.108 +add test 10.10.5.109 +add test 10.10.5.11 +add test 10.10.5.110 +add test 10.10.5.111 +add test 10.10.5.112 +add test 10.10.5.113 +add test 10.10.5.114 +add test 10.10.5.115 +add test 10.10.5.116 +add test 10.10.5.117 +add test 10.10.5.118 +add test 10.10.5.119 +add test 10.10.5.12 +add test 10.10.5.120 +add test 10.10.5.121 +add test 10.10.5.122 +add test 10.10.5.123 +add test 10.10.5.124 +add test 10.10.5.125 +add test 10.10.5.126 +add test 10.10.5.127 +add test 10.10.5.128 +add test 10.10.5.129 +add test 10.10.5.13 +add test 10.10.5.130 +add test 10.10.5.131 +add test 10.10.5.132 +add test 10.10.5.133 +add test 10.10.5.134 +add test 10.10.5.135 +add test 10.10.5.136 +add test 10.10.5.137 +add test 10.10.5.138 +add test 10.10.5.139 +add test 10.10.5.14 +add test 10.10.5.140 +add test 10.10.5.141 +add test 10.10.5.142 +add test 10.10.5.143 +add test 10.10.5.144 +add test 10.10.5.145 +add test 10.10.5.146 +add test 10.10.5.147 +add test 10.10.5.148 +add test 10.10.5.149 +add test 10.10.5.15 +add test 10.10.5.150 +add test 10.10.5.151 +add test 10.10.5.152 +add test 10.10.5.153 +add test 10.10.5.154 +add test 10.10.5.155 +add test 10.10.5.156 +add test 10.10.5.157 +add test 10.10.5.158 +add test 10.10.5.159 +add test 10.10.5.16 +add test 10.10.5.160 +add test 10.10.5.161 +add test 10.10.5.162 +add test 10.10.5.163 +add test 10.10.5.164 +add test 10.10.5.165 +add test 10.10.5.166 +add test 10.10.5.167 +add test 10.10.5.168 +add test 10.10.5.169 +add test 10.10.5.17 +add test 10.10.5.170 +add test 10.10.5.171 +add test 10.10.5.172 +add test 10.10.5.173 +add test 10.10.5.174 +add test 10.10.5.175 +add test 10.10.5.176 +add test 10.10.5.177 +add test 10.10.5.178 +add test 10.10.5.179 +add test 10.10.5.18 +add test 10.10.5.180 +add test 10.10.5.181 +add test 10.10.5.182 +add test 10.10.5.183 +add test 10.10.5.184 +add test 10.10.5.185 +add test 10.10.5.186 +add test 10.10.5.187 +add test 10.10.5.188 +add test 10.10.5.189 +add test 10.10.5.19 +add test 10.10.5.190 +add test 10.10.5.191 +add test 10.10.5.192 +add test 10.10.5.193 +add test 10.10.5.194 +add test 10.10.5.195 +add test 10.10.5.196 +add test 10.10.5.197 +add test 10.10.5.198 +add test 10.10.5.199 +add test 10.10.5.2 +add test 10.10.5.20 +add test 10.10.5.200 +add test 10.10.5.201 +add test 10.10.5.202 +add test 10.10.5.203 +add test 10.10.5.204 +add test 10.10.5.205 +add test 10.10.5.206 +add test 10.10.5.207 +add test 10.10.5.208 +add test 10.10.5.209 +add test 10.10.5.21 +add test 10.10.5.210 +add test 10.10.5.211 +add test 10.10.5.212 +add test 10.10.5.213 +add test 10.10.5.214 +add test 10.10.5.215 +add test 10.10.5.216 +add test 10.10.5.217 +add test 10.10.5.218 +add test 10.10.5.219 +add test 10.10.5.22 +add test 10.10.5.220 +add test 10.10.5.221 +add test 10.10.5.222 +add test 10.10.5.223 +add test 10.10.5.224 +add test 10.10.5.225 +add test 10.10.5.226 +add test 10.10.5.227 +add test 10.10.5.228 +add test 10.10.5.229 +add test 10.10.5.23 +add test 10.10.5.230 +add test 10.10.5.231 +add test 10.10.5.232 +add test 10.10.5.233 +add test 10.10.5.234 +add test 10.10.5.235 +add test 10.10.5.236 +add test 10.10.5.237 +add test 10.10.5.238 +add test 10.10.5.239 +add test 10.10.5.24 +add test 10.10.5.240 +add test 10.10.5.241 +add test 10.10.5.242 +add test 10.10.5.243 +add test 10.10.5.244 +add test 10.10.5.245 +add test 10.10.5.246 +add test 10.10.5.247 +add test 10.10.5.248 +add test 10.10.5.249 +add test 10.10.5.25 +add test 10.10.5.250 +add test 10.10.5.251 +add test 10.10.5.252 +add test 10.10.5.253 +add test 10.10.5.254 +add test 10.10.5.255 +add test 10.10.5.26 +add test 10.10.5.27 +add test 10.10.5.28 +add test 10.10.5.29 +add test 10.10.5.3 +add test 10.10.5.30 +add test 10.10.5.31 +add test 10.10.5.32 +add test 10.10.5.33 +add test 10.10.5.34 +add test 10.10.5.35 +add test 10.10.5.36 +add test 10.10.5.37 +add test 10.10.5.38 +add test 10.10.5.39 +add test 10.10.5.4 +add test 10.10.5.40 +add test 10.10.5.41 +add test 10.10.5.42 +add test 10.10.5.43 +add test 10.10.5.44 +add test 10.10.5.45 +add test 10.10.5.46 +add test 10.10.5.47 +add test 10.10.5.48 +add test 10.10.5.49 +add test 10.10.5.5 +add test 10.10.5.50 +add test 10.10.5.51 +add test 10.10.5.52 +add test 10.10.5.53 +add test 10.10.5.54 +add test 10.10.5.55 +add test 10.10.5.56 +add test 10.10.5.57 +add test 10.10.5.58 +add test 10.10.5.59 +add test 10.10.5.6 +add test 10.10.5.60 +add test 10.10.5.61 +add test 10.10.5.62 +add test 10.10.5.63 +add test 10.10.5.64 +add test 10.10.5.65 +add test 10.10.5.66 +add test 10.10.5.67 +add test 10.10.5.68 +add test 10.10.5.69 +add test 10.10.5.7 +add test 10.10.5.70 +add test 10.10.5.71 +add test 10.10.5.72 +add test 10.10.5.73 +add test 10.10.5.74 +add test 10.10.5.75 +add test 10.10.5.76 +add test 10.10.5.77 +add test 10.10.5.78 +add test 10.10.5.79 +add test 10.10.5.8 +add test 10.10.5.80 +add test 10.10.5.81 +add test 10.10.5.82 +add test 10.10.5.83 +add test 10.10.5.84 +add test 10.10.5.85 +add test 10.10.5.86 +add test 10.10.5.87 +add test 10.10.5.88 +add test 10.10.5.89 +add test 10.10.5.9 +add test 10.10.5.90 +add test 10.10.5.91 +add test 10.10.5.92 +add test 10.10.5.93 +add test 10.10.5.94 +add test 10.10.5.95 +add test 10.10.5.96 +add test 10.10.5.97 +add test 10.10.5.98 +add test 10.10.5.99 +add test 10.10.50.0 +add test 10.10.50.1 +add test 10.10.50.10 +add test 10.10.50.100 +add test 10.10.50.101 +add test 10.10.50.102 +add test 10.10.50.103 +add test 10.10.50.104 +add test 10.10.50.105 +add test 10.10.50.106 +add test 10.10.50.107 +add test 10.10.50.108 +add test 10.10.50.109 +add test 10.10.50.11 +add test 10.10.50.110 +add test 10.10.50.111 +add test 10.10.50.112 +add test 10.10.50.113 +add test 10.10.50.114 +add test 10.10.50.115 +add test 10.10.50.116 +add test 10.10.50.117 +add test 10.10.50.118 +add test 10.10.50.119 +add test 10.10.50.12 +add test 10.10.50.120 +add test 10.10.50.121 +add test 10.10.50.122 +add test 10.10.50.123 +add test 10.10.50.124 +add test 10.10.50.125 +add test 10.10.50.126 +add test 10.10.50.127 +add test 10.10.50.128 +add test 10.10.50.129 +add test 10.10.50.13 +add test 10.10.50.130 +add test 10.10.50.131 +add test 10.10.50.132 +add test 10.10.50.133 +add test 10.10.50.134 +add test 10.10.50.135 +add test 10.10.50.136 +add test 10.10.50.137 +add test 10.10.50.138 +add test 10.10.50.139 +add test 10.10.50.14 +add test 10.10.50.140 +add test 10.10.50.141 +add test 10.10.50.142 +add test 10.10.50.143 +add test 10.10.50.144 +add test 10.10.50.145 +add test 10.10.50.146 +add test 10.10.50.147 +add test 10.10.50.148 +add test 10.10.50.149 +add test 10.10.50.15 +add test 10.10.50.150 +add test 10.10.50.151 +add test 10.10.50.152 +add test 10.10.50.153 +add test 10.10.50.154 +add test 10.10.50.155 +add test 10.10.50.156 +add test 10.10.50.157 +add test 10.10.50.158 +add test 10.10.50.159 +add test 10.10.50.16 +add test 10.10.50.160 +add test 10.10.50.161 +add test 10.10.50.162 +add test 10.10.50.163 +add test 10.10.50.164 +add test 10.10.50.165 +add test 10.10.50.166 +add test 10.10.50.167 +add test 10.10.50.168 +add test 10.10.50.169 +add test 10.10.50.17 +add test 10.10.50.170 +add test 10.10.50.171 +add test 10.10.50.172 +add test 10.10.50.173 +add test 10.10.50.174 +add test 10.10.50.175 +add test 10.10.50.176 +add test 10.10.50.177 +add test 10.10.50.178 +add test 10.10.50.179 +add test 10.10.50.18 +add test 10.10.50.180 +add test 10.10.50.181 +add test 10.10.50.182 +add test 10.10.50.183 +add test 10.10.50.184 +add test 10.10.50.185 +add test 10.10.50.186 +add test 10.10.50.187 +add test 10.10.50.188 +add test 10.10.50.189 +add test 10.10.50.19 +add test 10.10.50.190 +add test 10.10.50.191 +add test 10.10.50.192 +add test 10.10.50.193 +add test 10.10.50.194 +add test 10.10.50.195 +add test 10.10.50.196 +add test 10.10.50.197 +add test 10.10.50.198 +add test 10.10.50.199 +add test 10.10.50.2 +add test 10.10.50.20 +add test 10.10.50.200 +add test 10.10.50.201 +add test 10.10.50.202 +add test 10.10.50.203 +add test 10.10.50.204 +add test 10.10.50.205 +add test 10.10.50.206 +add test 10.10.50.207 +add test 10.10.50.208 +add test 10.10.50.209 +add test 10.10.50.21 +add test 10.10.50.210 +add test 10.10.50.211 +add test 10.10.50.212 +add test 10.10.50.213 +add test 10.10.50.214 +add test 10.10.50.215 +add test 10.10.50.216 +add test 10.10.50.217 +add test 10.10.50.218 +add test 10.10.50.219 +add test 10.10.50.22 +add test 10.10.50.220 +add test 10.10.50.221 +add test 10.10.50.222 +add test 10.10.50.223 +add test 10.10.50.224 +add test 10.10.50.225 +add test 10.10.50.226 +add test 10.10.50.227 +add test 10.10.50.228 +add test 10.10.50.229 +add test 10.10.50.23 +add test 10.10.50.230 +add test 10.10.50.231 +add test 10.10.50.232 +add test 10.10.50.233 +add test 10.10.50.234 +add test 10.10.50.235 +add test 10.10.50.236 +add test 10.10.50.237 +add test 10.10.50.238 +add test 10.10.50.239 +add test 10.10.50.24 +add test 10.10.50.240 +add test 10.10.50.241 +add test 10.10.50.242 +add test 10.10.50.243 +add test 10.10.50.244 +add test 10.10.50.245 +add test 10.10.50.246 +add test 10.10.50.247 +add test 10.10.50.248 +add test 10.10.50.249 +add test 10.10.50.25 +add test 10.10.50.250 +add test 10.10.50.251 +add test 10.10.50.252 +add test 10.10.50.253 +add test 10.10.50.254 +add test 10.10.50.255 +add test 10.10.50.26 +add test 10.10.50.27 +add test 10.10.50.28 +add test 10.10.50.29 +add test 10.10.50.3 +add test 10.10.50.30 +add test 10.10.50.31 +add test 10.10.50.32 +add test 10.10.50.33 +add test 10.10.50.34 +add test 10.10.50.35 +add test 10.10.50.36 +add test 10.10.50.37 +add test 10.10.50.38 +add test 10.10.50.39 +add test 10.10.50.4 +add test 10.10.50.40 +add test 10.10.50.41 +add test 10.10.50.42 +add test 10.10.50.43 +add test 10.10.50.44 +add test 10.10.50.45 +add test 10.10.50.46 +add test 10.10.50.47 +add test 10.10.50.48 +add test 10.10.50.49 +add test 10.10.50.5 +add test 10.10.50.50 +add test 10.10.50.51 +add test 10.10.50.52 +add test 10.10.50.53 +add test 10.10.50.54 +add test 10.10.50.55 +add test 10.10.50.56 +add test 10.10.50.57 +add test 10.10.50.58 +add test 10.10.50.59 +add test 10.10.50.6 +add test 10.10.50.60 +add test 10.10.50.61 +add test 10.10.50.62 +add test 10.10.50.63 +add test 10.10.50.64 +add test 10.10.50.65 +add test 10.10.50.66 +add test 10.10.50.67 +add test 10.10.50.68 +add test 10.10.50.69 +add test 10.10.50.7 +add test 10.10.50.70 +add test 10.10.50.71 +add test 10.10.50.72 +add test 10.10.50.73 +add test 10.10.50.74 +add test 10.10.50.75 +add test 10.10.50.76 +add test 10.10.50.77 +add test 10.10.50.78 +add test 10.10.50.79 +add test 10.10.50.8 +add test 10.10.50.80 +add test 10.10.50.81 +add test 10.10.50.82 +add test 10.10.50.83 +add test 10.10.50.84 +add test 10.10.50.85 +add test 10.10.50.86 +add test 10.10.50.87 +add test 10.10.50.88 +add test 10.10.50.89 +add test 10.10.50.9 +add test 10.10.50.90 +add test 10.10.50.91 +add test 10.10.50.92 +add test 10.10.50.93 +add test 10.10.50.94 +add test 10.10.50.95 +add test 10.10.50.96 +add test 10.10.50.97 +add test 10.10.50.98 +add test 10.10.50.99 +add test 10.10.51.0 +add test 10.10.51.1 +add test 10.10.51.10 +add test 10.10.51.100 +add test 10.10.51.101 +add test 10.10.51.102 +add test 10.10.51.103 +add test 10.10.51.104 +add test 10.10.51.105 +add test 10.10.51.106 +add test 10.10.51.107 +add test 10.10.51.108 +add test 10.10.51.109 +add test 10.10.51.11 +add test 10.10.51.110 +add test 10.10.51.111 +add test 10.10.51.112 +add test 10.10.51.113 +add test 10.10.51.114 +add test 10.10.51.115 +add test 10.10.51.116 +add test 10.10.51.117 +add test 10.10.51.118 +add test 10.10.51.119 +add test 10.10.51.12 +add test 10.10.51.120 +add test 10.10.51.121 +add test 10.10.51.122 +add test 10.10.51.123 +add test 10.10.51.124 +add test 10.10.51.125 +add test 10.10.51.126 +add test 10.10.51.127 +add test 10.10.51.128 +add test 10.10.51.129 +add test 10.10.51.13 +add test 10.10.51.130 +add test 10.10.51.131 +add test 10.10.51.132 +add test 10.10.51.133 +add test 10.10.51.134 +add test 10.10.51.135 +add test 10.10.51.136 +add test 10.10.51.137 +add test 10.10.51.138 +add test 10.10.51.139 +add test 10.10.51.14 +add test 10.10.51.140 +add test 10.10.51.141 +add test 10.10.51.142 +add test 10.10.51.143 +add test 10.10.51.144 +add test 10.10.51.145 +add test 10.10.51.146 +add test 10.10.51.147 +add test 10.10.51.148 +add test 10.10.51.149 +add test 10.10.51.15 +add test 10.10.51.150 +add test 10.10.51.151 +add test 10.10.51.152 +add test 10.10.51.153 +add test 10.10.51.154 +add test 10.10.51.155 +add test 10.10.51.156 +add test 10.10.51.157 +add test 10.10.51.158 +add test 10.10.51.159 +add test 10.10.51.16 +add test 10.10.51.160 +add test 10.10.51.161 +add test 10.10.51.162 +add test 10.10.51.163 +add test 10.10.51.164 +add test 10.10.51.165 +add test 10.10.51.166 +add test 10.10.51.167 +add test 10.10.51.168 +add test 10.10.51.169 +add test 10.10.51.17 +add test 10.10.51.170 +add test 10.10.51.171 +add test 10.10.51.172 +add test 10.10.51.173 +add test 10.10.51.174 +add test 10.10.51.175 +add test 10.10.51.176 +add test 10.10.51.177 +add test 10.10.51.178 +add test 10.10.51.179 +add test 10.10.51.18 +add test 10.10.51.180 +add test 10.10.51.181 +add test 10.10.51.182 +add test 10.10.51.183 +add test 10.10.51.184 +add test 10.10.51.185 +add test 10.10.51.186 +add test 10.10.51.187 +add test 10.10.51.188 +add test 10.10.51.189 +add test 10.10.51.19 +add test 10.10.51.190 +add test 10.10.51.191 +add test 10.10.51.192 +add test 10.10.51.193 +add test 10.10.51.194 +add test 10.10.51.195 +add test 10.10.51.196 +add test 10.10.51.197 +add test 10.10.51.198 +add test 10.10.51.199 +add test 10.10.51.2 +add test 10.10.51.20 +add test 10.10.51.200 +add test 10.10.51.201 +add test 10.10.51.202 +add test 10.10.51.203 +add test 10.10.51.204 +add test 10.10.51.205 +add test 10.10.51.206 +add test 10.10.51.207 +add test 10.10.51.208 +add test 10.10.51.209 +add test 10.10.51.21 +add test 10.10.51.210 +add test 10.10.51.211 +add test 10.10.51.212 +add test 10.10.51.213 +add test 10.10.51.214 +add test 10.10.51.215 +add test 10.10.51.216 +add test 10.10.51.217 +add test 10.10.51.218 +add test 10.10.51.219 +add test 10.10.51.22 +add test 10.10.51.220 +add test 10.10.51.221 +add test 10.10.51.222 +add test 10.10.51.223 +add test 10.10.51.224 +add test 10.10.51.225 +add test 10.10.51.226 +add test 10.10.51.227 +add test 10.10.51.228 +add test 10.10.51.229 +add test 10.10.51.23 +add test 10.10.51.230 +add test 10.10.51.231 +add test 10.10.51.232 +add test 10.10.51.233 +add test 10.10.51.234 +add test 10.10.51.235 +add test 10.10.51.236 +add test 10.10.51.237 +add test 10.10.51.238 +add test 10.10.51.239 +add test 10.10.51.24 +add test 10.10.51.240 +add test 10.10.51.241 +add test 10.10.51.242 +add test 10.10.51.243 +add test 10.10.51.244 +add test 10.10.51.245 +add test 10.10.51.246 +add test 10.10.51.247 +add test 10.10.51.248 +add test 10.10.51.249 +add test 10.10.51.25 +add test 10.10.51.250 +add test 10.10.51.251 +add test 10.10.51.252 +add test 10.10.51.253 +add test 10.10.51.254 +add test 10.10.51.255 +add test 10.10.51.26 +add test 10.10.51.27 +add test 10.10.51.28 +add test 10.10.51.29 +add test 10.10.51.3 +add test 10.10.51.30 +add test 10.10.51.31 +add test 10.10.51.32 +add test 10.10.51.33 +add test 10.10.51.34 +add test 10.10.51.35 +add test 10.10.51.36 +add test 10.10.51.37 +add test 10.10.51.38 +add test 10.10.51.39 +add test 10.10.51.4 +add test 10.10.51.40 +add test 10.10.51.41 +add test 10.10.51.42 +add test 10.10.51.43 +add test 10.10.51.44 +add test 10.10.51.45 +add test 10.10.51.46 +add test 10.10.51.47 +add test 10.10.51.48 +add test 10.10.51.49 +add test 10.10.51.5 +add test 10.10.51.50 +add test 10.10.51.51 +add test 10.10.51.52 +add test 10.10.51.53 +add test 10.10.51.54 +add test 10.10.51.55 +add test 10.10.51.56 +add test 10.10.51.57 +add test 10.10.51.58 +add test 10.10.51.59 +add test 10.10.51.6 +add test 10.10.51.60 +add test 10.10.51.61 +add test 10.10.51.62 +add test 10.10.51.63 +add test 10.10.51.64 +add test 10.10.51.65 +add test 10.10.51.66 +add test 10.10.51.67 +add test 10.10.51.68 +add test 10.10.51.69 +add test 10.10.51.7 +add test 10.10.51.70 +add test 10.10.51.71 +add test 10.10.51.72 +add test 10.10.51.73 +add test 10.10.51.74 +add test 10.10.51.75 +add test 10.10.51.76 +add test 10.10.51.77 +add test 10.10.51.78 +add test 10.10.51.79 +add test 10.10.51.8 +add test 10.10.51.80 +add test 10.10.51.81 +add test 10.10.51.82 +add test 10.10.51.83 +add test 10.10.51.84 +add test 10.10.51.85 +add test 10.10.51.86 +add test 10.10.51.87 +add test 10.10.51.88 +add test 10.10.51.89 +add test 10.10.51.9 +add test 10.10.51.90 +add test 10.10.51.91 +add test 10.10.51.92 +add test 10.10.51.93 +add test 10.10.51.94 +add test 10.10.51.95 +add test 10.10.51.96 +add test 10.10.51.97 +add test 10.10.51.98 +add test 10.10.51.99 +add test 10.10.52.0 +add test 10.10.52.1 +add test 10.10.52.10 +add test 10.10.52.100 +add test 10.10.52.101 +add test 10.10.52.102 +add test 10.10.52.103 +add test 10.10.52.104 +add test 10.10.52.105 +add test 10.10.52.106 +add test 10.10.52.107 +add test 10.10.52.108 +add test 10.10.52.109 +add test 10.10.52.11 +add test 10.10.52.110 +add test 10.10.52.111 +add test 10.10.52.112 +add test 10.10.52.113 +add test 10.10.52.114 +add test 10.10.52.115 +add test 10.10.52.116 +add test 10.10.52.117 +add test 10.10.52.118 +add test 10.10.52.119 +add test 10.10.52.12 +add test 10.10.52.120 +add test 10.10.52.121 +add test 10.10.52.122 +add test 10.10.52.123 +add test 10.10.52.124 +add test 10.10.52.125 +add test 10.10.52.126 +add test 10.10.52.127 +add test 10.10.52.128 +add test 10.10.52.129 +add test 10.10.52.13 +add test 10.10.52.130 +add test 10.10.52.131 +add test 10.10.52.132 +add test 10.10.52.133 +add test 10.10.52.134 +add test 10.10.52.135 +add test 10.10.52.136 +add test 10.10.52.137 +add test 10.10.52.138 +add test 10.10.52.139 +add test 10.10.52.14 +add test 10.10.52.140 +add test 10.10.52.141 +add test 10.10.52.142 +add test 10.10.52.143 +add test 10.10.52.144 +add test 10.10.52.145 +add test 10.10.52.146 +add test 10.10.52.147 +add test 10.10.52.148 +add test 10.10.52.149 +add test 10.10.52.15 +add test 10.10.52.150 +add test 10.10.52.151 +add test 10.10.52.152 +add test 10.10.52.153 +add test 10.10.52.154 +add test 10.10.52.155 +add test 10.10.52.156 +add test 10.10.52.157 +add test 10.10.52.158 +add test 10.10.52.159 +add test 10.10.52.16 +add test 10.10.52.160 +add test 10.10.52.161 +add test 10.10.52.162 +add test 10.10.52.163 +add test 10.10.52.164 +add test 10.10.52.165 +add test 10.10.52.166 +add test 10.10.52.167 +add test 10.10.52.168 +add test 10.10.52.169 +add test 10.10.52.17 +add test 10.10.52.170 +add test 10.10.52.171 +add test 10.10.52.172 +add test 10.10.52.173 +add test 10.10.52.174 +add test 10.10.52.175 +add test 10.10.52.176 +add test 10.10.52.177 +add test 10.10.52.178 +add test 10.10.52.179 +add test 10.10.52.18 +add test 10.10.52.180 +add test 10.10.52.181 +add test 10.10.52.182 +add test 10.10.52.183 +add test 10.10.52.184 +add test 10.10.52.185 +add test 10.10.52.186 +add test 10.10.52.187 +add test 10.10.52.188 +add test 10.10.52.189 +add test 10.10.52.19 +add test 10.10.52.190 +add test 10.10.52.191 +add test 10.10.52.192 +add test 10.10.52.193 +add test 10.10.52.194 +add test 10.10.52.195 +add test 10.10.52.196 +add test 10.10.52.197 +add test 10.10.52.198 +add test 10.10.52.199 +add test 10.10.52.2 +add test 10.10.52.20 +add test 10.10.52.200 +add test 10.10.52.201 +add test 10.10.52.202 +add test 10.10.52.203 +add test 10.10.52.204 +add test 10.10.52.205 +add test 10.10.52.206 +add test 10.10.52.207 +add test 10.10.52.208 +add test 10.10.52.209 +add test 10.10.52.21 +add test 10.10.52.210 +add test 10.10.52.211 +add test 10.10.52.212 +add test 10.10.52.213 +add test 10.10.52.214 +add test 10.10.52.215 +add test 10.10.52.216 +add test 10.10.52.217 +add test 10.10.52.218 +add test 10.10.52.219 +add test 10.10.52.22 +add test 10.10.52.220 +add test 10.10.52.221 +add test 10.10.52.222 +add test 10.10.52.223 +add test 10.10.52.224 +add test 10.10.52.225 +add test 10.10.52.226 +add test 10.10.52.227 +add test 10.10.52.228 +add test 10.10.52.229 +add test 10.10.52.23 +add test 10.10.52.230 +add test 10.10.52.231 +add test 10.10.52.232 +add test 10.10.52.233 +add test 10.10.52.234 +add test 10.10.52.235 +add test 10.10.52.236 +add test 10.10.52.237 +add test 10.10.52.238 +add test 10.10.52.239 +add test 10.10.52.24 +add test 10.10.52.240 +add test 10.10.52.241 +add test 10.10.52.242 +add test 10.10.52.243 +add test 10.10.52.244 +add test 10.10.52.245 +add test 10.10.52.246 +add test 10.10.52.247 +add test 10.10.52.248 +add test 10.10.52.249 +add test 10.10.52.25 +add test 10.10.52.250 +add test 10.10.52.251 +add test 10.10.52.252 +add test 10.10.52.253 +add test 10.10.52.254 +add test 10.10.52.255 +add test 10.10.52.26 +add test 10.10.52.27 +add test 10.10.52.28 +add test 10.10.52.29 +add test 10.10.52.3 +add test 10.10.52.30 +add test 10.10.52.31 +add test 10.10.52.32 +add test 10.10.52.33 +add test 10.10.52.34 +add test 10.10.52.35 +add test 10.10.52.36 +add test 10.10.52.37 +add test 10.10.52.38 +add test 10.10.52.39 +add test 10.10.52.4 +add test 10.10.52.40 +add test 10.10.52.41 +add test 10.10.52.42 +add test 10.10.52.43 +add test 10.10.52.44 +add test 10.10.52.45 +add test 10.10.52.46 +add test 10.10.52.47 +add test 10.10.52.48 +add test 10.10.52.49 +add test 10.10.52.5 +add test 10.10.52.50 +add test 10.10.52.51 +add test 10.10.52.52 +add test 10.10.52.53 +add test 10.10.52.54 +add test 10.10.52.55 +add test 10.10.52.56 +add test 10.10.52.57 +add test 10.10.52.58 +add test 10.10.52.59 +add test 10.10.52.6 +add test 10.10.52.60 +add test 10.10.52.61 +add test 10.10.52.62 +add test 10.10.52.63 +add test 10.10.52.64 +add test 10.10.52.65 +add test 10.10.52.66 +add test 10.10.52.67 +add test 10.10.52.68 +add test 10.10.52.69 +add test 10.10.52.7 +add test 10.10.52.70 +add test 10.10.52.71 +add test 10.10.52.72 +add test 10.10.52.73 +add test 10.10.52.74 +add test 10.10.52.75 +add test 10.10.52.76 +add test 10.10.52.77 +add test 10.10.52.78 +add test 10.10.52.79 +add test 10.10.52.8 +add test 10.10.52.80 +add test 10.10.52.81 +add test 10.10.52.82 +add test 10.10.52.83 +add test 10.10.52.84 +add test 10.10.52.85 +add test 10.10.52.86 +add test 10.10.52.87 +add test 10.10.52.88 +add test 10.10.52.89 +add test 10.10.52.9 +add test 10.10.52.90 +add test 10.10.52.91 +add test 10.10.52.92 +add test 10.10.52.93 +add test 10.10.52.94 +add test 10.10.52.95 +add test 10.10.52.96 +add test 10.10.52.97 +add test 10.10.52.98 +add test 10.10.52.99 +add test 10.10.53.0 +add test 10.10.53.1 +add test 10.10.53.10 +add test 10.10.53.100 +add test 10.10.53.101 +add test 10.10.53.102 +add test 10.10.53.103 +add test 10.10.53.104 +add test 10.10.53.105 +add test 10.10.53.106 +add test 10.10.53.107 +add test 10.10.53.108 +add test 10.10.53.109 +add test 10.10.53.11 +add test 10.10.53.110 +add test 10.10.53.111 +add test 10.10.53.112 +add test 10.10.53.113 +add test 10.10.53.114 +add test 10.10.53.115 +add test 10.10.53.116 +add test 10.10.53.117 +add test 10.10.53.118 +add test 10.10.53.119 +add test 10.10.53.12 +add test 10.10.53.120 +add test 10.10.53.121 +add test 10.10.53.122 +add test 10.10.53.123 +add test 10.10.53.124 +add test 10.10.53.125 +add test 10.10.53.126 +add test 10.10.53.127 +add test 10.10.53.128 +add test 10.10.53.129 +add test 10.10.53.13 +add test 10.10.53.130 +add test 10.10.53.131 +add test 10.10.53.132 +add test 10.10.53.133 +add test 10.10.53.134 +add test 10.10.53.135 +add test 10.10.53.136 +add test 10.10.53.137 +add test 10.10.53.138 +add test 10.10.53.139 +add test 10.10.53.14 +add test 10.10.53.140 +add test 10.10.53.141 +add test 10.10.53.142 +add test 10.10.53.143 +add test 10.10.53.144 +add test 10.10.53.145 +add test 10.10.53.146 +add test 10.10.53.147 +add test 10.10.53.148 +add test 10.10.53.149 +add test 10.10.53.15 +add test 10.10.53.150 +add test 10.10.53.151 +add test 10.10.53.152 +add test 10.10.53.153 +add test 10.10.53.154 +add test 10.10.53.155 +add test 10.10.53.156 +add test 10.10.53.157 +add test 10.10.53.158 +add test 10.10.53.159 +add test 10.10.53.16 +add test 10.10.53.160 +add test 10.10.53.161 +add test 10.10.53.162 +add test 10.10.53.163 +add test 10.10.53.164 +add test 10.10.53.165 +add test 10.10.53.166 +add test 10.10.53.167 +add test 10.10.53.168 +add test 10.10.53.169 +add test 10.10.53.17 +add test 10.10.53.170 +add test 10.10.53.171 +add test 10.10.53.172 +add test 10.10.53.173 +add test 10.10.53.174 +add test 10.10.53.175 +add test 10.10.53.176 +add test 10.10.53.177 +add test 10.10.53.178 +add test 10.10.53.179 +add test 10.10.53.18 +add test 10.10.53.180 +add test 10.10.53.181 +add test 10.10.53.182 +add test 10.10.53.183 +add test 10.10.53.184 +add test 10.10.53.185 +add test 10.10.53.186 +add test 10.10.53.187 +add test 10.10.53.188 +add test 10.10.53.189 +add test 10.10.53.19 +add test 10.10.53.190 +add test 10.10.53.191 +add test 10.10.53.192 +add test 10.10.53.193 +add test 10.10.53.194 +add test 10.10.53.195 +add test 10.10.53.196 +add test 10.10.53.197 +add test 10.10.53.198 +add test 10.10.53.199 +add test 10.10.53.2 +add test 10.10.53.20 +add test 10.10.53.200 +add test 10.10.53.201 +add test 10.10.53.202 +add test 10.10.53.203 +add test 10.10.53.204 +add test 10.10.53.205 +add test 10.10.53.206 +add test 10.10.53.207 +add test 10.10.53.208 +add test 10.10.53.209 +add test 10.10.53.21 +add test 10.10.53.210 +add test 10.10.53.211 +add test 10.10.53.212 +add test 10.10.53.213 +add test 10.10.53.214 +add test 10.10.53.215 +add test 10.10.53.216 +add test 10.10.53.217 +add test 10.10.53.218 +add test 10.10.53.219 +add test 10.10.53.22 +add test 10.10.53.220 +add test 10.10.53.221 +add test 10.10.53.222 +add test 10.10.53.223 +add test 10.10.53.224 +add test 10.10.53.225 +add test 10.10.53.226 +add test 10.10.53.227 +add test 10.10.53.228 +add test 10.10.53.229 +add test 10.10.53.23 +add test 10.10.53.230 +add test 10.10.53.231 +add test 10.10.53.232 +add test 10.10.53.233 +add test 10.10.53.234 +add test 10.10.53.235 +add test 10.10.53.236 +add test 10.10.53.237 +add test 10.10.53.238 +add test 10.10.53.239 +add test 10.10.53.24 +add test 10.10.53.240 +add test 10.10.53.241 +add test 10.10.53.242 +add test 10.10.53.243 +add test 10.10.53.244 +add test 10.10.53.245 +add test 10.10.53.246 +add test 10.10.53.247 +add test 10.10.53.248 +add test 10.10.53.249 +add test 10.10.53.25 +add test 10.10.53.250 +add test 10.10.53.251 +add test 10.10.53.252 +add test 10.10.53.253 +add test 10.10.53.254 +add test 10.10.53.255 +add test 10.10.53.26 +add test 10.10.53.27 +add test 10.10.53.28 +add test 10.10.53.29 +add test 10.10.53.3 +add test 10.10.53.30 +add test 10.10.53.31 +add test 10.10.53.32 +add test 10.10.53.33 +add test 10.10.53.34 +add test 10.10.53.35 +add test 10.10.53.36 +add test 10.10.53.37 +add test 10.10.53.38 +add test 10.10.53.39 +add test 10.10.53.4 +add test 10.10.53.40 +add test 10.10.53.41 +add test 10.10.53.42 +add test 10.10.53.43 +add test 10.10.53.44 +add test 10.10.53.45 +add test 10.10.53.46 +add test 10.10.53.47 +add test 10.10.53.48 +add test 10.10.53.49 +add test 10.10.53.5 +add test 10.10.53.50 +add test 10.10.53.51 +add test 10.10.53.52 +add test 10.10.53.53 +add test 10.10.53.54 +add test 10.10.53.55 +add test 10.10.53.56 +add test 10.10.53.57 +add test 10.10.53.58 +add test 10.10.53.59 +add test 10.10.53.6 +add test 10.10.53.60 +add test 10.10.53.61 +add test 10.10.53.62 +add test 10.10.53.63 +add test 10.10.53.64 +add test 10.10.53.65 +add test 10.10.53.66 +add test 10.10.53.67 +add test 10.10.53.68 +add test 10.10.53.69 +add test 10.10.53.7 +add test 10.10.53.70 +add test 10.10.53.71 +add test 10.10.53.72 +add test 10.10.53.73 +add test 10.10.53.74 +add test 10.10.53.75 +add test 10.10.53.76 +add test 10.10.53.77 +add test 10.10.53.78 +add test 10.10.53.79 +add test 10.10.53.8 +add test 10.10.53.80 +add test 10.10.53.81 +add test 10.10.53.82 +add test 10.10.53.83 +add test 10.10.53.84 +add test 10.10.53.85 +add test 10.10.53.86 +add test 10.10.53.87 +add test 10.10.53.88 +add test 10.10.53.89 +add test 10.10.53.9 +add test 10.10.53.90 +add test 10.10.53.91 +add test 10.10.53.92 +add test 10.10.53.93 +add test 10.10.53.94 +add test 10.10.53.95 +add test 10.10.53.96 +add test 10.10.53.97 +add test 10.10.53.98 +add test 10.10.53.99 +add test 10.10.54.0 +add test 10.10.54.1 +add test 10.10.54.10 +add test 10.10.54.100 +add test 10.10.54.101 +add test 10.10.54.102 +add test 10.10.54.103 +add test 10.10.54.104 +add test 10.10.54.105 +add test 10.10.54.106 +add test 10.10.54.107 +add test 10.10.54.108 +add test 10.10.54.109 +add test 10.10.54.11 +add test 10.10.54.110 +add test 10.10.54.111 +add test 10.10.54.112 +add test 10.10.54.113 +add test 10.10.54.114 +add test 10.10.54.115 +add test 10.10.54.116 +add test 10.10.54.117 +add test 10.10.54.118 +add test 10.10.54.119 +add test 10.10.54.12 +add test 10.10.54.120 +add test 10.10.54.121 +add test 10.10.54.122 +add test 10.10.54.123 +add test 10.10.54.124 +add test 10.10.54.125 +add test 10.10.54.126 +add test 10.10.54.127 +add test 10.10.54.128 +add test 10.10.54.129 +add test 10.10.54.13 +add test 10.10.54.130 +add test 10.10.54.131 +add test 10.10.54.132 +add test 10.10.54.133 +add test 10.10.54.134 +add test 10.10.54.135 +add test 10.10.54.136 +add test 10.10.54.137 +add test 10.10.54.138 +add test 10.10.54.139 +add test 10.10.54.14 +add test 10.10.54.140 +add test 10.10.54.141 +add test 10.10.54.142 +add test 10.10.54.143 +add test 10.10.54.144 +add test 10.10.54.145 +add test 10.10.54.146 +add test 10.10.54.147 +add test 10.10.54.148 +add test 10.10.54.149 +add test 10.10.54.15 +add test 10.10.54.150 +add test 10.10.54.151 +add test 10.10.54.152 +add test 10.10.54.153 +add test 10.10.54.154 +add test 10.10.54.155 +add test 10.10.54.156 +add test 10.10.54.157 +add test 10.10.54.158 +add test 10.10.54.159 +add test 10.10.54.16 +add test 10.10.54.160 +add test 10.10.54.161 +add test 10.10.54.162 +add test 10.10.54.163 +add test 10.10.54.164 +add test 10.10.54.165 +add test 10.10.54.166 +add test 10.10.54.167 +add test 10.10.54.168 +add test 10.10.54.169 +add test 10.10.54.17 +add test 10.10.54.170 +add test 10.10.54.171 +add test 10.10.54.172 +add test 10.10.54.173 +add test 10.10.54.174 +add test 10.10.54.175 +add test 10.10.54.176 +add test 10.10.54.177 +add test 10.10.54.178 +add test 10.10.54.179 +add test 10.10.54.18 +add test 10.10.54.180 +add test 10.10.54.181 +add test 10.10.54.182 +add test 10.10.54.183 +add test 10.10.54.184 +add test 10.10.54.185 +add test 10.10.54.186 +add test 10.10.54.187 +add test 10.10.54.188 +add test 10.10.54.189 +add test 10.10.54.19 +add test 10.10.54.190 +add test 10.10.54.191 +add test 10.10.54.192 +add test 10.10.54.193 +add test 10.10.54.194 +add test 10.10.54.195 +add test 10.10.54.196 +add test 10.10.54.197 +add test 10.10.54.198 +add test 10.10.54.199 +add test 10.10.54.2 +add test 10.10.54.20 +add test 10.10.54.200 +add test 10.10.54.201 +add test 10.10.54.202 +add test 10.10.54.203 +add test 10.10.54.204 +add test 10.10.54.205 +add test 10.10.54.206 +add test 10.10.54.207 +add test 10.10.54.208 +add test 10.10.54.209 +add test 10.10.54.21 +add test 10.10.54.210 +add test 10.10.54.211 +add test 10.10.54.212 +add test 10.10.54.213 +add test 10.10.54.214 +add test 10.10.54.215 +add test 10.10.54.216 +add test 10.10.54.217 +add test 10.10.54.218 +add test 10.10.54.219 +add test 10.10.54.22 +add test 10.10.54.220 +add test 10.10.54.221 +add test 10.10.54.222 +add test 10.10.54.223 +add test 10.10.54.224 +add test 10.10.54.225 +add test 10.10.54.226 +add test 10.10.54.227 +add test 10.10.54.228 +add test 10.10.54.229 +add test 10.10.54.23 +add test 10.10.54.230 +add test 10.10.54.231 +add test 10.10.54.232 +add test 10.10.54.233 +add test 10.10.54.234 +add test 10.10.54.235 +add test 10.10.54.236 +add test 10.10.54.237 +add test 10.10.54.238 +add test 10.10.54.239 +add test 10.10.54.24 +add test 10.10.54.240 +add test 10.10.54.241 +add test 10.10.54.242 +add test 10.10.54.243 +add test 10.10.54.244 +add test 10.10.54.245 +add test 10.10.54.246 +add test 10.10.54.247 +add test 10.10.54.248 +add test 10.10.54.249 +add test 10.10.54.25 +add test 10.10.54.250 +add test 10.10.54.251 +add test 10.10.54.252 +add test 10.10.54.253 +add test 10.10.54.254 +add test 10.10.54.255 +add test 10.10.54.26 +add test 10.10.54.27 +add test 10.10.54.28 +add test 10.10.54.29 +add test 10.10.54.3 +add test 10.10.54.30 +add test 10.10.54.31 +add test 10.10.54.32 +add test 10.10.54.33 +add test 10.10.54.34 +add test 10.10.54.35 +add test 10.10.54.36 +add test 10.10.54.37 +add test 10.10.54.38 +add test 10.10.54.39 +add test 10.10.54.4 +add test 10.10.54.40 +add test 10.10.54.41 +add test 10.10.54.42 +add test 10.10.54.43 +add test 10.10.54.44 +add test 10.10.54.45 +add test 10.10.54.46 +add test 10.10.54.47 +add test 10.10.54.48 +add test 10.10.54.49 +add test 10.10.54.5 +add test 10.10.54.50 +add test 10.10.54.51 +add test 10.10.54.52 +add test 10.10.54.53 +add test 10.10.54.54 +add test 10.10.54.55 +add test 10.10.54.56 +add test 10.10.54.57 +add test 10.10.54.58 +add test 10.10.54.59 +add test 10.10.54.6 +add test 10.10.54.60 +add test 10.10.54.61 +add test 10.10.54.62 +add test 10.10.54.63 +add test 10.10.54.64 +add test 10.10.54.65 +add test 10.10.54.66 +add test 10.10.54.67 +add test 10.10.54.68 +add test 10.10.54.69 +add test 10.10.54.7 +add test 10.10.54.70 +add test 10.10.54.71 +add test 10.10.54.72 +add test 10.10.54.73 +add test 10.10.54.74 +add test 10.10.54.75 +add test 10.10.54.76 +add test 10.10.54.77 +add test 10.10.54.78 +add test 10.10.54.79 +add test 10.10.54.8 +add test 10.10.54.80 +add test 10.10.54.81 +add test 10.10.54.82 +add test 10.10.54.83 +add test 10.10.54.84 +add test 10.10.54.85 +add test 10.10.54.86 +add test 10.10.54.87 +add test 10.10.54.88 +add test 10.10.54.89 +add test 10.10.54.9 +add test 10.10.54.90 +add test 10.10.54.91 +add test 10.10.54.92 +add test 10.10.54.93 +add test 10.10.54.94 +add test 10.10.54.95 +add test 10.10.54.96 +add test 10.10.54.97 +add test 10.10.54.98 +add test 10.10.54.99 +add test 10.10.55.0 +add test 10.10.55.1 +add test 10.10.55.10 +add test 10.10.55.100 +add test 10.10.55.101 +add test 10.10.55.102 +add test 10.10.55.103 +add test 10.10.55.104 +add test 10.10.55.105 +add test 10.10.55.106 +add test 10.10.55.107 +add test 10.10.55.108 +add test 10.10.55.109 +add test 10.10.55.11 +add test 10.10.55.110 +add test 10.10.55.111 +add test 10.10.55.112 +add test 10.10.55.113 +add test 10.10.55.114 +add test 10.10.55.115 +add test 10.10.55.116 +add test 10.10.55.117 +add test 10.10.55.118 +add test 10.10.55.119 +add test 10.10.55.12 +add test 10.10.55.120 +add test 10.10.55.121 +add test 10.10.55.122 +add test 10.10.55.123 +add test 10.10.55.124 +add test 10.10.55.125 +add test 10.10.55.126 +add test 10.10.55.127 +add test 10.10.55.128 +add test 10.10.55.129 +add test 10.10.55.13 +add test 10.10.55.130 +add test 10.10.55.131 +add test 10.10.55.132 +add test 10.10.55.133 +add test 10.10.55.134 +add test 10.10.55.135 +add test 10.10.55.136 +add test 10.10.55.137 +add test 10.10.55.138 +add test 10.10.55.139 +add test 10.10.55.14 +add test 10.10.55.140 +add test 10.10.55.141 +add test 10.10.55.142 +add test 10.10.55.143 +add test 10.10.55.144 +add test 10.10.55.145 +add test 10.10.55.146 +add test 10.10.55.147 +add test 10.10.55.148 +add test 10.10.55.149 +add test 10.10.55.15 +add test 10.10.55.150 +add test 10.10.55.151 +add test 10.10.55.152 +add test 10.10.55.153 +add test 10.10.55.154 +add test 10.10.55.155 +add test 10.10.55.156 +add test 10.10.55.157 +add test 10.10.55.158 +add test 10.10.55.159 +add test 10.10.55.16 +add test 10.10.55.160 +add test 10.10.55.161 +add test 10.10.55.162 +add test 10.10.55.163 +add test 10.10.55.164 +add test 10.10.55.165 +add test 10.10.55.166 +add test 10.10.55.167 +add test 10.10.55.168 +add test 10.10.55.169 +add test 10.10.55.17 +add test 10.10.55.170 +add test 10.10.55.171 +add test 10.10.55.172 +add test 10.10.55.173 +add test 10.10.55.174 +add test 10.10.55.175 +add test 10.10.55.176 +add test 10.10.55.177 +add test 10.10.55.178 +add test 10.10.55.179 +add test 10.10.55.18 +add test 10.10.55.180 +add test 10.10.55.181 +add test 10.10.55.182 +add test 10.10.55.183 +add test 10.10.55.184 +add test 10.10.55.185 +add test 10.10.55.186 +add test 10.10.55.187 +add test 10.10.55.188 +add test 10.10.55.189 +add test 10.10.55.19 +add test 10.10.55.190 +add test 10.10.55.191 +add test 10.10.55.192 +add test 10.10.55.193 +add test 10.10.55.194 +add test 10.10.55.195 +add test 10.10.55.196 +add test 10.10.55.197 +add test 10.10.55.198 +add test 10.10.55.199 +add test 10.10.55.2 +add test 10.10.55.20 +add test 10.10.55.200 +add test 10.10.55.201 +add test 10.10.55.202 +add test 10.10.55.203 +add test 10.10.55.204 +add test 10.10.55.205 +add test 10.10.55.206 +add test 10.10.55.207 +add test 10.10.55.208 +add test 10.10.55.209 +add test 10.10.55.21 +add test 10.10.55.210 +add test 10.10.55.211 +add test 10.10.55.212 +add test 10.10.55.213 +add test 10.10.55.214 +add test 10.10.55.215 +add test 10.10.55.216 +add test 10.10.55.217 +add test 10.10.55.218 +add test 10.10.55.219 +add test 10.10.55.22 +add test 10.10.55.220 +add test 10.10.55.221 +add test 10.10.55.222 +add test 10.10.55.223 +add test 10.10.55.224 +add test 10.10.55.225 +add test 10.10.55.226 +add test 10.10.55.227 +add test 10.10.55.228 +add test 10.10.55.229 +add test 10.10.55.23 +add test 10.10.55.230 +add test 10.10.55.231 +add test 10.10.55.232 +add test 10.10.55.233 +add test 10.10.55.234 +add test 10.10.55.235 +add test 10.10.55.236 +add test 10.10.55.237 +add test 10.10.55.238 +add test 10.10.55.239 +add test 10.10.55.24 +add test 10.10.55.240 +add test 10.10.55.241 +add test 10.10.55.242 +add test 10.10.55.243 +add test 10.10.55.244 +add test 10.10.55.245 +add test 10.10.55.246 +add test 10.10.55.247 +add test 10.10.55.248 +add test 10.10.55.249 +add test 10.10.55.25 +add test 10.10.55.250 +add test 10.10.55.251 +add test 10.10.55.252 +add test 10.10.55.253 +add test 10.10.55.254 +add test 10.10.55.255 +add test 10.10.55.26 +add test 10.10.55.27 +add test 10.10.55.28 +add test 10.10.55.29 +add test 10.10.55.3 +add test 10.10.55.30 +add test 10.10.55.31 +add test 10.10.55.32 +add test 10.10.55.33 +add test 10.10.55.34 +add test 10.10.55.35 +add test 10.10.55.36 +add test 10.10.55.37 +add test 10.10.55.38 +add test 10.10.55.39 +add test 10.10.55.4 +add test 10.10.55.40 +add test 10.10.55.41 +add test 10.10.55.42 +add test 10.10.55.43 +add test 10.10.55.44 +add test 10.10.55.45 +add test 10.10.55.46 +add test 10.10.55.47 +add test 10.10.55.48 +add test 10.10.55.49 +add test 10.10.55.5 +add test 10.10.55.50 +add test 10.10.55.51 +add test 10.10.55.52 +add test 10.10.55.53 +add test 10.10.55.54 +add test 10.10.55.55 +add test 10.10.55.56 +add test 10.10.55.57 +add test 10.10.55.58 +add test 10.10.55.59 +add test 10.10.55.6 +add test 10.10.55.60 +add test 10.10.55.61 +add test 10.10.55.62 +add test 10.10.55.63 +add test 10.10.55.64 +add test 10.10.55.65 +add test 10.10.55.66 +add test 10.10.55.67 +add test 10.10.55.68 +add test 10.10.55.69 +add test 10.10.55.7 +add test 10.10.55.70 +add test 10.10.55.71 +add test 10.10.55.72 +add test 10.10.55.73 +add test 10.10.55.74 +add test 10.10.55.75 +add test 10.10.55.76 +add test 10.10.55.77 +add test 10.10.55.78 +add test 10.10.55.79 +add test 10.10.55.8 +add test 10.10.55.80 +add test 10.10.55.81 +add test 10.10.55.82 +add test 10.10.55.83 +add test 10.10.55.84 +add test 10.10.55.85 +add test 10.10.55.86 +add test 10.10.55.87 +add test 10.10.55.88 +add test 10.10.55.89 +add test 10.10.55.9 +add test 10.10.55.90 +add test 10.10.55.91 +add test 10.10.55.92 +add test 10.10.55.93 +add test 10.10.55.94 +add test 10.10.55.95 +add test 10.10.55.96 +add test 10.10.55.97 +add test 10.10.55.98 +add test 10.10.55.99 +add test 10.10.56.0 +add test 10.10.56.1 +add test 10.10.56.10 +add test 10.10.56.100 +add test 10.10.56.101 +add test 10.10.56.102 +add test 10.10.56.103 +add test 10.10.56.104 +add test 10.10.56.105 +add test 10.10.56.106 +add test 10.10.56.107 +add test 10.10.56.108 +add test 10.10.56.109 +add test 10.10.56.11 +add test 10.10.56.110 +add test 10.10.56.111 +add test 10.10.56.112 +add test 10.10.56.113 +add test 10.10.56.114 +add test 10.10.56.115 +add test 10.10.56.116 +add test 10.10.56.117 +add test 10.10.56.118 +add test 10.10.56.119 +add test 10.10.56.12 +add test 10.10.56.120 +add test 10.10.56.121 +add test 10.10.56.122 +add test 10.10.56.123 +add test 10.10.56.124 +add test 10.10.56.125 +add test 10.10.56.126 +add test 10.10.56.127 +add test 10.10.56.128 +add test 10.10.56.129 +add test 10.10.56.13 +add test 10.10.56.130 +add test 10.10.56.131 +add test 10.10.56.132 +add test 10.10.56.133 +add test 10.10.56.134 +add test 10.10.56.135 +add test 10.10.56.136 +add test 10.10.56.137 +add test 10.10.56.138 +add test 10.10.56.139 +add test 10.10.56.14 +add test 10.10.56.140 +add test 10.10.56.141 +add test 10.10.56.142 +add test 10.10.56.143 +add test 10.10.56.144 +add test 10.10.56.145 +add test 10.10.56.146 +add test 10.10.56.147 +add test 10.10.56.148 +add test 10.10.56.149 +add test 10.10.56.15 +add test 10.10.56.150 +add test 10.10.56.151 +add test 10.10.56.152 +add test 10.10.56.153 +add test 10.10.56.154 +add test 10.10.56.155 +add test 10.10.56.156 +add test 10.10.56.157 +add test 10.10.56.158 +add test 10.10.56.159 +add test 10.10.56.16 +add test 10.10.56.160 +add test 10.10.56.161 +add test 10.10.56.162 +add test 10.10.56.163 +add test 10.10.56.164 +add test 10.10.56.165 +add test 10.10.56.166 +add test 10.10.56.167 +add test 10.10.56.168 +add test 10.10.56.169 +add test 10.10.56.17 +add test 10.10.56.170 +add test 10.10.56.171 +add test 10.10.56.172 +add test 10.10.56.173 +add test 10.10.56.174 +add test 10.10.56.175 +add test 10.10.56.176 +add test 10.10.56.177 +add test 10.10.56.178 +add test 10.10.56.179 +add test 10.10.56.18 +add test 10.10.56.180 +add test 10.10.56.181 +add test 10.10.56.182 +add test 10.10.56.183 +add test 10.10.56.184 +add test 10.10.56.185 +add test 10.10.56.186 +add test 10.10.56.187 +add test 10.10.56.188 +add test 10.10.56.189 +add test 10.10.56.19 +add test 10.10.56.190 +add test 10.10.56.191 +add test 10.10.56.192 +add test 10.10.56.193 +add test 10.10.56.194 +add test 10.10.56.195 +add test 10.10.56.196 +add test 10.10.56.197 +add test 10.10.56.198 +add test 10.10.56.199 +add test 10.10.56.2 +add test 10.10.56.20 +add test 10.10.56.200 +add test 10.10.56.201 +add test 10.10.56.202 +add test 10.10.56.203 +add test 10.10.56.204 +add test 10.10.56.205 +add test 10.10.56.206 +add test 10.10.56.207 +add test 10.10.56.208 +add test 10.10.56.209 +add test 10.10.56.21 +add test 10.10.56.210 +add test 10.10.56.211 +add test 10.10.56.212 +add test 10.10.56.213 +add test 10.10.56.214 +add test 10.10.56.215 +add test 10.10.56.216 +add test 10.10.56.217 +add test 10.10.56.218 +add test 10.10.56.219 +add test 10.10.56.22 +add test 10.10.56.220 +add test 10.10.56.221 +add test 10.10.56.222 +add test 10.10.56.223 +add test 10.10.56.224 +add test 10.10.56.225 +add test 10.10.56.226 +add test 10.10.56.227 +add test 10.10.56.228 +add test 10.10.56.229 +add test 10.10.56.23 +add test 10.10.56.230 +add test 10.10.56.231 +add test 10.10.56.232 +add test 10.10.56.233 +add test 10.10.56.234 +add test 10.10.56.235 +add test 10.10.56.236 +add test 10.10.56.237 +add test 10.10.56.238 +add test 10.10.56.239 +add test 10.10.56.24 +add test 10.10.56.240 +add test 10.10.56.241 +add test 10.10.56.242 +add test 10.10.56.243 +add test 10.10.56.244 +add test 10.10.56.245 +add test 10.10.56.246 +add test 10.10.56.247 +add test 10.10.56.248 +add test 10.10.56.249 +add test 10.10.56.25 +add test 10.10.56.250 +add test 10.10.56.251 +add test 10.10.56.252 +add test 10.10.56.253 +add test 10.10.56.254 +add test 10.10.56.255 +add test 10.10.56.26 +add test 10.10.56.27 +add test 10.10.56.28 +add test 10.10.56.29 +add test 10.10.56.3 +add test 10.10.56.30 +add test 10.10.56.31 +add test 10.10.56.32 +add test 10.10.56.33 +add test 10.10.56.34 +add test 10.10.56.35 +add test 10.10.56.36 +add test 10.10.56.37 +add test 10.10.56.38 +add test 10.10.56.39 +add test 10.10.56.4 +add test 10.10.56.40 +add test 10.10.56.41 +add test 10.10.56.42 +add test 10.10.56.43 +add test 10.10.56.44 +add test 10.10.56.45 +add test 10.10.56.46 +add test 10.10.56.47 +add test 10.10.56.48 +add test 10.10.56.49 +add test 10.10.56.5 +add test 10.10.56.50 +add test 10.10.56.51 +add test 10.10.56.52 +add test 10.10.56.53 +add test 10.10.56.54 +add test 10.10.56.55 +add test 10.10.56.56 +add test 10.10.56.57 +add test 10.10.56.58 +add test 10.10.56.59 +add test 10.10.56.6 +add test 10.10.56.60 +add test 10.10.56.61 +add test 10.10.56.62 +add test 10.10.56.63 +add test 10.10.56.64 +add test 10.10.56.65 +add test 10.10.56.66 +add test 10.10.56.67 +add test 10.10.56.68 +add test 10.10.56.69 +add test 10.10.56.7 +add test 10.10.56.70 +add test 10.10.56.71 +add test 10.10.56.72 +add test 10.10.56.73 +add test 10.10.56.74 +add test 10.10.56.75 +add test 10.10.56.76 +add test 10.10.56.77 +add test 10.10.56.78 +add test 10.10.56.79 +add test 10.10.56.8 +add test 10.10.56.80 +add test 10.10.56.81 +add test 10.10.56.82 +add test 10.10.56.83 +add test 10.10.56.84 +add test 10.10.56.85 +add test 10.10.56.86 +add test 10.10.56.87 +add test 10.10.56.88 +add test 10.10.56.89 +add test 10.10.56.9 +add test 10.10.56.90 +add test 10.10.56.91 +add test 10.10.56.92 +add test 10.10.56.93 +add test 10.10.56.94 +add test 10.10.56.95 +add test 10.10.56.96 +add test 10.10.56.97 +add test 10.10.56.98 +add test 10.10.56.99 +add test 10.10.57.0 +add test 10.10.57.1 +add test 10.10.57.10 +add test 10.10.57.100 +add test 10.10.57.101 +add test 10.10.57.102 +add test 10.10.57.103 +add test 10.10.57.104 +add test 10.10.57.105 +add test 10.10.57.106 +add test 10.10.57.107 +add test 10.10.57.108 +add test 10.10.57.109 +add test 10.10.57.11 +add test 10.10.57.110 +add test 10.10.57.111 +add test 10.10.57.112 +add test 10.10.57.113 +add test 10.10.57.114 +add test 10.10.57.115 +add test 10.10.57.116 +add test 10.10.57.117 +add test 10.10.57.118 +add test 10.10.57.119 +add test 10.10.57.12 +add test 10.10.57.120 +add test 10.10.57.121 +add test 10.10.57.122 +add test 10.10.57.123 +add test 10.10.57.124 +add test 10.10.57.125 +add test 10.10.57.126 +add test 10.10.57.127 +add test 10.10.57.128 +add test 10.10.57.129 +add test 10.10.57.13 +add test 10.10.57.130 +add test 10.10.57.131 +add test 10.10.57.132 +add test 10.10.57.133 +add test 10.10.57.134 +add test 10.10.57.135 +add test 10.10.57.136 +add test 10.10.57.137 +add test 10.10.57.138 +add test 10.10.57.139 +add test 10.10.57.14 +add test 10.10.57.140 +add test 10.10.57.141 +add test 10.10.57.142 +add test 10.10.57.143 +add test 10.10.57.144 +add test 10.10.57.145 +add test 10.10.57.146 +add test 10.10.57.147 +add test 10.10.57.148 +add test 10.10.57.149 +add test 10.10.57.15 +add test 10.10.57.150 +add test 10.10.57.151 +add test 10.10.57.152 +add test 10.10.57.153 +add test 10.10.57.154 +add test 10.10.57.155 +add test 10.10.57.156 +add test 10.10.57.157 +add test 10.10.57.158 +add test 10.10.57.159 +add test 10.10.57.16 +add test 10.10.57.160 +add test 10.10.57.161 +add test 10.10.57.162 +add test 10.10.57.163 +add test 10.10.57.164 +add test 10.10.57.165 +add test 10.10.57.166 +add test 10.10.57.167 +add test 10.10.57.168 +add test 10.10.57.169 +add test 10.10.57.17 +add test 10.10.57.170 +add test 10.10.57.171 +add test 10.10.57.172 +add test 10.10.57.173 +add test 10.10.57.174 +add test 10.10.57.175 +add test 10.10.57.176 +add test 10.10.57.177 +add test 10.10.57.178 +add test 10.10.57.179 +add test 10.10.57.18 +add test 10.10.57.180 +add test 10.10.57.181 +add test 10.10.57.182 +add test 10.10.57.183 +add test 10.10.57.184 +add test 10.10.57.185 +add test 10.10.57.186 +add test 10.10.57.187 +add test 10.10.57.188 +add test 10.10.57.189 +add test 10.10.57.19 +add test 10.10.57.190 +add test 10.10.57.191 +add test 10.10.57.192 +add test 10.10.57.193 +add test 10.10.57.194 +add test 10.10.57.195 +add test 10.10.57.196 +add test 10.10.57.197 +add test 10.10.57.198 +add test 10.10.57.199 +add test 10.10.57.2 +add test 10.10.57.20 +add test 10.10.57.200 +add test 10.10.57.201 +add test 10.10.57.202 +add test 10.10.57.203 +add test 10.10.57.204 +add test 10.10.57.205 +add test 10.10.57.206 +add test 10.10.57.207 +add test 10.10.57.208 +add test 10.10.57.209 +add test 10.10.57.21 +add test 10.10.57.210 +add test 10.10.57.211 +add test 10.10.57.212 +add test 10.10.57.213 +add test 10.10.57.214 +add test 10.10.57.215 +add test 10.10.57.216 +add test 10.10.57.217 +add test 10.10.57.218 +add test 10.10.57.219 +add test 10.10.57.22 +add test 10.10.57.220 +add test 10.10.57.221 +add test 10.10.57.222 +add test 10.10.57.223 +add test 10.10.57.224 +add test 10.10.57.225 +add test 10.10.57.226 +add test 10.10.57.227 +add test 10.10.57.228 +add test 10.10.57.229 +add test 10.10.57.23 +add test 10.10.57.230 +add test 10.10.57.231 +add test 10.10.57.232 +add test 10.10.57.233 +add test 10.10.57.234 +add test 10.10.57.235 +add test 10.10.57.236 +add test 10.10.57.237 +add test 10.10.57.238 +add test 10.10.57.239 +add test 10.10.57.24 +add test 10.10.57.240 +add test 10.10.57.241 +add test 10.10.57.242 +add test 10.10.57.243 +add test 10.10.57.244 +add test 10.10.57.245 +add test 10.10.57.246 +add test 10.10.57.247 +add test 10.10.57.248 +add test 10.10.57.249 +add test 10.10.57.25 +add test 10.10.57.250 +add test 10.10.57.251 +add test 10.10.57.252 +add test 10.10.57.253 +add test 10.10.57.254 +add test 10.10.57.255 +add test 10.10.57.26 +add test 10.10.57.27 +add test 10.10.57.28 +add test 10.10.57.29 +add test 10.10.57.3 +add test 10.10.57.30 +add test 10.10.57.31 +add test 10.10.57.32 +add test 10.10.57.33 +add test 10.10.57.34 +add test 10.10.57.35 +add test 10.10.57.36 +add test 10.10.57.37 +add test 10.10.57.38 +add test 10.10.57.39 +add test 10.10.57.4 +add test 10.10.57.40 +add test 10.10.57.41 +add test 10.10.57.42 +add test 10.10.57.43 +add test 10.10.57.44 +add test 10.10.57.45 +add test 10.10.57.46 +add test 10.10.57.47 +add test 10.10.57.48 +add test 10.10.57.49 +add test 10.10.57.5 +add test 10.10.57.50 +add test 10.10.57.51 +add test 10.10.57.52 +add test 10.10.57.53 +add test 10.10.57.54 +add test 10.10.57.55 +add test 10.10.57.56 +add test 10.10.57.57 +add test 10.10.57.58 +add test 10.10.57.59 +add test 10.10.57.6 +add test 10.10.57.60 +add test 10.10.57.61 +add test 10.10.57.62 +add test 10.10.57.63 +add test 10.10.57.64 +add test 10.10.57.65 +add test 10.10.57.66 +add test 10.10.57.67 +add test 10.10.57.68 +add test 10.10.57.69 +add test 10.10.57.7 +add test 10.10.57.70 +add test 10.10.57.71 +add test 10.10.57.72 +add test 10.10.57.73 +add test 10.10.57.74 +add test 10.10.57.75 +add test 10.10.57.76 +add test 10.10.57.77 +add test 10.10.57.78 +add test 10.10.57.79 +add test 10.10.57.8 +add test 10.10.57.80 +add test 10.10.57.81 +add test 10.10.57.82 +add test 10.10.57.83 +add test 10.10.57.84 +add test 10.10.57.85 +add test 10.10.57.86 +add test 10.10.57.87 +add test 10.10.57.88 +add test 10.10.57.89 +add test 10.10.57.9 +add test 10.10.57.90 +add test 10.10.57.91 +add test 10.10.57.92 +add test 10.10.57.93 +add test 10.10.57.94 +add test 10.10.57.95 +add test 10.10.57.96 +add test 10.10.57.97 +add test 10.10.57.98 +add test 10.10.57.99 +add test 10.10.58.0 +add test 10.10.58.1 +add test 10.10.58.10 +add test 10.10.58.100 +add test 10.10.58.101 +add test 10.10.58.102 +add test 10.10.58.103 +add test 10.10.58.104 +add test 10.10.58.105 +add test 10.10.58.106 +add test 10.10.58.107 +add test 10.10.58.108 +add test 10.10.58.109 +add test 10.10.58.11 +add test 10.10.58.110 +add test 10.10.58.111 +add test 10.10.58.112 +add test 10.10.58.113 +add test 10.10.58.114 +add test 10.10.58.115 +add test 10.10.58.116 +add test 10.10.58.117 +add test 10.10.58.118 +add test 10.10.58.119 +add test 10.10.58.12 +add test 10.10.58.120 +add test 10.10.58.121 +add test 10.10.58.122 +add test 10.10.58.123 +add test 10.10.58.124 +add test 10.10.58.125 +add test 10.10.58.126 +add test 10.10.58.127 +add test 10.10.58.128 +add test 10.10.58.129 +add test 10.10.58.13 +add test 10.10.58.130 +add test 10.10.58.131 +add test 10.10.58.132 +add test 10.10.58.133 +add test 10.10.58.134 +add test 10.10.58.135 +add test 10.10.58.136 +add test 10.10.58.137 +add test 10.10.58.138 +add test 10.10.58.139 +add test 10.10.58.14 +add test 10.10.58.140 +add test 10.10.58.141 +add test 10.10.58.142 +add test 10.10.58.143 +add test 10.10.58.144 +add test 10.10.58.145 +add test 10.10.58.146 +add test 10.10.58.147 +add test 10.10.58.148 +add test 10.10.58.149 +add test 10.10.58.15 +add test 10.10.58.150 +add test 10.10.58.151 +add test 10.10.58.152 +add test 10.10.58.153 +add test 10.10.58.154 +add test 10.10.58.155 +add test 10.10.58.156 +add test 10.10.58.157 +add test 10.10.58.158 +add test 10.10.58.159 +add test 10.10.58.16 +add test 10.10.58.160 +add test 10.10.58.161 +add test 10.10.58.162 +add test 10.10.58.163 +add test 10.10.58.164 +add test 10.10.58.165 +add test 10.10.58.166 +add test 10.10.58.167 +add test 10.10.58.168 +add test 10.10.58.169 +add test 10.10.58.17 +add test 10.10.58.170 +add test 10.10.58.171 +add test 10.10.58.172 +add test 10.10.58.173 +add test 10.10.58.174 +add test 10.10.58.175 +add test 10.10.58.176 +add test 10.10.58.177 +add test 10.10.58.178 +add test 10.10.58.179 +add test 10.10.58.18 +add test 10.10.58.180 +add test 10.10.58.181 +add test 10.10.58.182 +add test 10.10.58.183 +add test 10.10.58.184 +add test 10.10.58.185 +add test 10.10.58.186 +add test 10.10.58.187 +add test 10.10.58.188 +add test 10.10.58.189 +add test 10.10.58.19 +add test 10.10.58.190 +add test 10.10.58.191 +add test 10.10.58.192 +add test 10.10.58.193 +add test 10.10.58.194 +add test 10.10.58.195 +add test 10.10.58.196 +add test 10.10.58.197 +add test 10.10.58.198 +add test 10.10.58.199 +add test 10.10.58.2 +add test 10.10.58.20 +add test 10.10.58.200 +add test 10.10.58.201 +add test 10.10.58.202 +add test 10.10.58.203 +add test 10.10.58.204 +add test 10.10.58.205 +add test 10.10.58.206 +add test 10.10.58.207 +add test 10.10.58.208 +add test 10.10.58.209 +add test 10.10.58.21 +add test 10.10.58.210 +add test 10.10.58.211 +add test 10.10.58.212 +add test 10.10.58.213 +add test 10.10.58.214 +add test 10.10.58.215 +add test 10.10.58.216 +add test 10.10.58.217 +add test 10.10.58.218 +add test 10.10.58.219 +add test 10.10.58.22 +add test 10.10.58.220 +add test 10.10.58.221 +add test 10.10.58.222 +add test 10.10.58.223 +add test 10.10.58.224 +add test 10.10.58.225 +add test 10.10.58.226 +add test 10.10.58.227 +add test 10.10.58.228 +add test 10.10.58.229 +add test 10.10.58.23 +add test 10.10.58.230 +add test 10.10.58.231 +add test 10.10.58.232 +add test 10.10.58.233 +add test 10.10.58.234 +add test 10.10.58.235 +add test 10.10.58.236 +add test 10.10.58.237 +add test 10.10.58.238 +add test 10.10.58.239 +add test 10.10.58.24 +add test 10.10.58.240 +add test 10.10.58.241 +add test 10.10.58.242 +add test 10.10.58.243 +add test 10.10.58.244 +add test 10.10.58.245 +add test 10.10.58.246 +add test 10.10.58.247 +add test 10.10.58.248 +add test 10.10.58.249 +add test 10.10.58.25 +add test 10.10.58.250 +add test 10.10.58.251 +add test 10.10.58.252 +add test 10.10.58.253 +add test 10.10.58.254 +add test 10.10.58.255 +add test 10.10.58.26 +add test 10.10.58.27 +add test 10.10.58.28 +add test 10.10.58.29 +add test 10.10.58.3 +add test 10.10.58.30 +add test 10.10.58.31 +add test 10.10.58.32 +add test 10.10.58.33 +add test 10.10.58.34 +add test 10.10.58.35 +add test 10.10.58.36 +add test 10.10.58.37 +add test 10.10.58.38 +add test 10.10.58.39 +add test 10.10.58.4 +add test 10.10.58.40 +add test 10.10.58.41 +add test 10.10.58.42 +add test 10.10.58.43 +add test 10.10.58.44 +add test 10.10.58.45 +add test 10.10.58.46 +add test 10.10.58.47 +add test 10.10.58.48 +add test 10.10.58.49 +add test 10.10.58.5 +add test 10.10.58.50 +add test 10.10.58.51 +add test 10.10.58.52 +add test 10.10.58.53 +add test 10.10.58.54 +add test 10.10.58.55 +add test 10.10.58.56 +add test 10.10.58.57 +add test 10.10.58.58 +add test 10.10.58.59 +add test 10.10.58.6 +add test 10.10.58.60 +add test 10.10.58.61 +add test 10.10.58.62 +add test 10.10.58.63 +add test 10.10.58.64 +add test 10.10.58.65 +add test 10.10.58.66 +add test 10.10.58.67 +add test 10.10.58.68 +add test 10.10.58.69 +add test 10.10.58.7 +add test 10.10.58.70 +add test 10.10.58.71 +add test 10.10.58.72 +add test 10.10.58.73 +add test 10.10.58.74 +add test 10.10.58.75 +add test 10.10.58.76 +add test 10.10.58.77 +add test 10.10.58.78 +add test 10.10.58.79 +add test 10.10.58.8 +add test 10.10.58.80 +add test 10.10.58.81 +add test 10.10.58.82 +add test 10.10.58.83 +add test 10.10.58.84 +add test 10.10.58.85 +add test 10.10.58.86 +add test 10.10.58.87 +add test 10.10.58.88 +add test 10.10.58.89 +add test 10.10.58.9 +add test 10.10.58.90 +add test 10.10.58.91 +add test 10.10.58.92 +add test 10.10.58.93 +add test 10.10.58.94 +add test 10.10.58.95 +add test 10.10.58.96 +add test 10.10.58.97 +add test 10.10.58.98 +add test 10.10.58.99 +add test 10.10.59.0 +add test 10.10.59.1 +add test 10.10.59.10 +add test 10.10.59.100 +add test 10.10.59.101 +add test 10.10.59.102 +add test 10.10.59.103 +add test 10.10.59.104 +add test 10.10.59.105 +add test 10.10.59.106 +add test 10.10.59.107 +add test 10.10.59.108 +add test 10.10.59.109 +add test 10.10.59.11 +add test 10.10.59.110 +add test 10.10.59.111 +add test 10.10.59.112 +add test 10.10.59.113 +add test 10.10.59.114 +add test 10.10.59.115 +add test 10.10.59.116 +add test 10.10.59.117 +add test 10.10.59.118 +add test 10.10.59.119 +add test 10.10.59.12 +add test 10.10.59.120 +add test 10.10.59.121 +add test 10.10.59.122 +add test 10.10.59.123 +add test 10.10.59.124 +add test 10.10.59.125 +add test 10.10.59.126 +add test 10.10.59.127 +add test 10.10.59.128 +add test 10.10.59.129 +add test 10.10.59.13 +add test 10.10.59.130 +add test 10.10.59.131 +add test 10.10.59.132 +add test 10.10.59.133 +add test 10.10.59.134 +add test 10.10.59.135 +add test 10.10.59.136 +add test 10.10.59.137 +add test 10.10.59.138 +add test 10.10.59.139 +add test 10.10.59.14 +add test 10.10.59.140 +add test 10.10.59.141 +add test 10.10.59.142 +add test 10.10.59.143 +add test 10.10.59.144 +add test 10.10.59.145 +add test 10.10.59.146 +add test 10.10.59.147 +add test 10.10.59.148 +add test 10.10.59.149 +add test 10.10.59.15 +add test 10.10.59.150 +add test 10.10.59.151 +add test 10.10.59.152 +add test 10.10.59.153 +add test 10.10.59.154 +add test 10.10.59.155 +add test 10.10.59.156 +add test 10.10.59.157 +add test 10.10.59.158 +add test 10.10.59.159 +add test 10.10.59.16 +add test 10.10.59.160 +add test 10.10.59.161 +add test 10.10.59.162 +add test 10.10.59.163 +add test 10.10.59.164 +add test 10.10.59.165 +add test 10.10.59.166 +add test 10.10.59.167 +add test 10.10.59.168 +add test 10.10.59.169 +add test 10.10.59.17 +add test 10.10.59.170 +add test 10.10.59.171 +add test 10.10.59.172 +add test 10.10.59.173 +add test 10.10.59.174 +add test 10.10.59.175 +add test 10.10.59.176 +add test 10.10.59.177 +add test 10.10.59.178 +add test 10.10.59.179 +add test 10.10.59.18 +add test 10.10.59.180 +add test 10.10.59.181 +add test 10.10.59.182 +add test 10.10.59.183 +add test 10.10.59.184 +add test 10.10.59.185 +add test 10.10.59.186 +add test 10.10.59.187 +add test 10.10.59.188 +add test 10.10.59.189 +add test 10.10.59.19 +add test 10.10.59.190 +add test 10.10.59.191 +add test 10.10.59.192 +add test 10.10.59.193 +add test 10.10.59.194 +add test 10.10.59.195 +add test 10.10.59.196 +add test 10.10.59.197 +add test 10.10.59.198 +add test 10.10.59.199 +add test 10.10.59.2 +add test 10.10.59.20 +add test 10.10.59.200 +add test 10.10.59.201 +add test 10.10.59.202 +add test 10.10.59.203 +add test 10.10.59.204 +add test 10.10.59.205 +add test 10.10.59.206 +add test 10.10.59.207 +add test 10.10.59.208 +add test 10.10.59.209 +add test 10.10.59.21 +add test 10.10.59.210 +add test 10.10.59.211 +add test 10.10.59.212 +add test 10.10.59.213 +add test 10.10.59.214 +add test 10.10.59.215 +add test 10.10.59.216 +add test 10.10.59.217 +add test 10.10.59.218 +add test 10.10.59.219 +add test 10.10.59.22 +add test 10.10.59.220 +add test 10.10.59.221 +add test 10.10.59.222 +add test 10.10.59.223 +add test 10.10.59.224 +add test 10.10.59.225 +add test 10.10.59.226 +add test 10.10.59.227 +add test 10.10.59.228 +add test 10.10.59.229 +add test 10.10.59.23 +add test 10.10.59.230 +add test 10.10.59.231 +add test 10.10.59.232 +add test 10.10.59.233 +add test 10.10.59.234 +add test 10.10.59.235 +add test 10.10.59.236 +add test 10.10.59.237 +add test 10.10.59.238 +add test 10.10.59.239 +add test 10.10.59.24 +add test 10.10.59.240 +add test 10.10.59.241 +add test 10.10.59.242 +add test 10.10.59.243 +add test 10.10.59.244 +add test 10.10.59.245 +add test 10.10.59.246 +add test 10.10.59.247 +add test 10.10.59.248 +add test 10.10.59.249 +add test 10.10.59.25 +add test 10.10.59.250 +add test 10.10.59.251 +add test 10.10.59.252 +add test 10.10.59.253 +add test 10.10.59.254 +add test 10.10.59.255 +add test 10.10.59.26 +add test 10.10.59.27 +add test 10.10.59.28 +add test 10.10.59.29 +add test 10.10.59.3 +add test 10.10.59.30 +add test 10.10.59.31 +add test 10.10.59.32 +add test 10.10.59.33 +add test 10.10.59.34 +add test 10.10.59.35 +add test 10.10.59.36 +add test 10.10.59.37 +add test 10.10.59.38 +add test 10.10.59.39 +add test 10.10.59.4 +add test 10.10.59.40 +add test 10.10.59.41 +add test 10.10.59.42 +add test 10.10.59.43 +add test 10.10.59.44 +add test 10.10.59.45 +add test 10.10.59.46 +add test 10.10.59.47 +add test 10.10.59.48 +add test 10.10.59.49 +add test 10.10.59.5 +add test 10.10.59.50 +add test 10.10.59.51 +add test 10.10.59.52 +add test 10.10.59.53 +add test 10.10.59.54 +add test 10.10.59.55 +add test 10.10.59.56 +add test 10.10.59.57 +add test 10.10.59.58 +add test 10.10.59.59 +add test 10.10.59.6 +add test 10.10.59.60 +add test 10.10.59.61 +add test 10.10.59.62 +add test 10.10.59.63 +add test 10.10.59.64 +add test 10.10.59.65 +add test 10.10.59.66 +add test 10.10.59.67 +add test 10.10.59.68 +add test 10.10.59.69 +add test 10.10.59.7 +add test 10.10.59.70 +add test 10.10.59.71 +add test 10.10.59.72 +add test 10.10.59.73 +add test 10.10.59.74 +add test 10.10.59.75 +add test 10.10.59.76 +add test 10.10.59.77 +add test 10.10.59.78 +add test 10.10.59.79 +add test 10.10.59.8 +add test 10.10.59.80 +add test 10.10.59.81 +add test 10.10.59.82 +add test 10.10.59.83 +add test 10.10.59.84 +add test 10.10.59.85 +add test 10.10.59.86 +add test 10.10.59.87 +add test 10.10.59.88 +add test 10.10.59.89 +add test 10.10.59.9 +add test 10.10.59.90 +add test 10.10.59.91 +add test 10.10.59.92 +add test 10.10.59.93 +add test 10.10.59.94 +add test 10.10.59.95 +add test 10.10.59.96 +add test 10.10.59.97 +add test 10.10.59.98 +add test 10.10.59.99 +add test 10.10.6.0 +add test 10.10.6.1 +add test 10.10.6.10 +add test 10.10.6.100 +add test 10.10.6.101 +add test 10.10.6.102 +add test 10.10.6.103 +add test 10.10.6.104 +add test 10.10.6.105 +add test 10.10.6.106 +add test 10.10.6.107 +add test 10.10.6.108 +add test 10.10.6.109 +add test 10.10.6.11 +add test 10.10.6.110 +add test 10.10.6.111 +add test 10.10.6.112 +add test 10.10.6.113 +add test 10.10.6.114 +add test 10.10.6.115 +add test 10.10.6.116 +add test 10.10.6.117 +add test 10.10.6.118 +add test 10.10.6.119 +add test 10.10.6.12 +add test 10.10.6.120 +add test 10.10.6.121 +add test 10.10.6.122 +add test 10.10.6.123 +add test 10.10.6.124 +add test 10.10.6.125 +add test 10.10.6.126 +add test 10.10.6.127 +add test 10.10.6.128 +add test 10.10.6.129 +add test 10.10.6.13 +add test 10.10.6.130 +add test 10.10.6.131 +add test 10.10.6.132 +add test 10.10.6.133 +add test 10.10.6.134 +add test 10.10.6.135 +add test 10.10.6.136 +add test 10.10.6.137 +add test 10.10.6.138 +add test 10.10.6.139 +add test 10.10.6.14 +add test 10.10.6.140 +add test 10.10.6.141 +add test 10.10.6.142 +add test 10.10.6.143 +add test 10.10.6.144 +add test 10.10.6.145 +add test 10.10.6.146 +add test 10.10.6.147 +add test 10.10.6.148 +add test 10.10.6.149 +add test 10.10.6.15 +add test 10.10.6.150 +add test 10.10.6.151 +add test 10.10.6.152 +add test 10.10.6.153 +add test 10.10.6.154 +add test 10.10.6.155 +add test 10.10.6.156 +add test 10.10.6.157 +add test 10.10.6.158 +add test 10.10.6.159 +add test 10.10.6.16 +add test 10.10.6.160 +add test 10.10.6.161 +add test 10.10.6.162 +add test 10.10.6.163 +add test 10.10.6.164 +add test 10.10.6.165 +add test 10.10.6.166 +add test 10.10.6.167 +add test 10.10.6.168 +add test 10.10.6.169 +add test 10.10.6.17 +add test 10.10.6.170 +add test 10.10.6.171 +add test 10.10.6.172 +add test 10.10.6.173 +add test 10.10.6.174 +add test 10.10.6.175 +add test 10.10.6.176 +add test 10.10.6.177 +add test 10.10.6.178 +add test 10.10.6.179 +add test 10.10.6.18 +add test 10.10.6.180 +add test 10.10.6.181 +add test 10.10.6.182 +add test 10.10.6.183 +add test 10.10.6.184 +add test 10.10.6.185 +add test 10.10.6.186 +add test 10.10.6.187 +add test 10.10.6.188 +add test 10.10.6.189 +add test 10.10.6.19 +add test 10.10.6.190 +add test 10.10.6.191 +add test 10.10.6.192 +add test 10.10.6.193 +add test 10.10.6.194 +add test 10.10.6.195 +add test 10.10.6.196 +add test 10.10.6.197 +add test 10.10.6.198 +add test 10.10.6.199 +add test 10.10.6.2 +add test 10.10.6.20 +add test 10.10.6.200 +add test 10.10.6.201 +add test 10.10.6.202 +add test 10.10.6.203 +add test 10.10.6.204 +add test 10.10.6.205 +add test 10.10.6.206 +add test 10.10.6.207 +add test 10.10.6.208 +add test 10.10.6.209 +add test 10.10.6.21 +add test 10.10.6.210 +add test 10.10.6.211 +add test 10.10.6.212 +add test 10.10.6.213 +add test 10.10.6.214 +add test 10.10.6.215 +add test 10.10.6.216 +add test 10.10.6.217 +add test 10.10.6.218 +add test 10.10.6.219 +add test 10.10.6.22 +add test 10.10.6.220 +add test 10.10.6.221 +add test 10.10.6.222 +add test 10.10.6.223 +add test 10.10.6.224 +add test 10.10.6.225 +add test 10.10.6.226 +add test 10.10.6.227 +add test 10.10.6.228 +add test 10.10.6.229 +add test 10.10.6.23 +add test 10.10.6.230 +add test 10.10.6.231 +add test 10.10.6.232 +add test 10.10.6.233 +add test 10.10.6.234 +add test 10.10.6.235 +add test 10.10.6.236 +add test 10.10.6.237 +add test 10.10.6.238 +add test 10.10.6.239 +add test 10.10.6.24 +add test 10.10.6.240 +add test 10.10.6.241 +add test 10.10.6.242 +add test 10.10.6.243 +add test 10.10.6.244 +add test 10.10.6.245 +add test 10.10.6.246 +add test 10.10.6.247 +add test 10.10.6.248 +add test 10.10.6.249 +add test 10.10.6.25 +add test 10.10.6.250 +add test 10.10.6.251 +add test 10.10.6.252 +add test 10.10.6.253 +add test 10.10.6.254 +add test 10.10.6.255 +add test 10.10.6.26 +add test 10.10.6.27 +add test 10.10.6.28 +add test 10.10.6.29 +add test 10.10.6.3 +add test 10.10.6.30 +add test 10.10.6.31 +add test 10.10.6.32 +add test 10.10.6.33 +add test 10.10.6.34 +add test 10.10.6.35 +add test 10.10.6.36 +add test 10.10.6.37 +add test 10.10.6.38 +add test 10.10.6.39 +add test 10.10.6.4 +add test 10.10.6.40 +add test 10.10.6.41 +add test 10.10.6.42 +add test 10.10.6.43 +add test 10.10.6.44 +add test 10.10.6.45 +add test 10.10.6.46 +add test 10.10.6.47 +add test 10.10.6.48 +add test 10.10.6.49 +add test 10.10.6.5 +add test 10.10.6.50 +add test 10.10.6.51 +add test 10.10.6.52 +add test 10.10.6.53 +add test 10.10.6.54 +add test 10.10.6.55 +add test 10.10.6.56 +add test 10.10.6.57 +add test 10.10.6.58 +add test 10.10.6.59 +add test 10.10.6.6 +add test 10.10.6.60 +add test 10.10.6.61 +add test 10.10.6.62 +add test 10.10.6.63 +add test 10.10.6.64 +add test 10.10.6.65 +add test 10.10.6.66 +add test 10.10.6.67 +add test 10.10.6.68 +add test 10.10.6.69 +add test 10.10.6.7 +add test 10.10.6.70 +add test 10.10.6.71 +add test 10.10.6.72 +add test 10.10.6.73 +add test 10.10.6.74 +add test 10.10.6.75 +add test 10.10.6.76 +add test 10.10.6.77 +add test 10.10.6.78 +add test 10.10.6.79 +add test 10.10.6.8 +add test 10.10.6.80 +add test 10.10.6.81 +add test 10.10.6.82 +add test 10.10.6.83 +add test 10.10.6.84 +add test 10.10.6.85 +add test 10.10.6.86 +add test 10.10.6.87 +add test 10.10.6.88 +add test 10.10.6.89 +add test 10.10.6.9 +add test 10.10.6.90 +add test 10.10.6.91 +add test 10.10.6.92 +add test 10.10.6.93 +add test 10.10.6.94 +add test 10.10.6.95 +add test 10.10.6.96 +add test 10.10.6.97 +add test 10.10.6.98 +add test 10.10.6.99 +add test 10.10.60.0 +add test 10.10.60.1 +add test 10.10.60.10 +add test 10.10.60.100 +add test 10.10.60.101 +add test 10.10.60.102 +add test 10.10.60.103 +add test 10.10.60.104 +add test 10.10.60.105 +add test 10.10.60.106 +add test 10.10.60.107 +add test 10.10.60.108 +add test 10.10.60.109 +add test 10.10.60.11 +add test 10.10.60.110 +add test 10.10.60.111 +add test 10.10.60.112 +add test 10.10.60.113 +add test 10.10.60.114 +add test 10.10.60.115 +add test 10.10.60.116 +add test 10.10.60.117 +add test 10.10.60.118 +add test 10.10.60.119 +add test 10.10.60.12 +add test 10.10.60.120 +add test 10.10.60.121 +add test 10.10.60.122 +add test 10.10.60.123 +add test 10.10.60.124 +add test 10.10.60.125 +add test 10.10.60.126 +add test 10.10.60.127 +add test 10.10.60.128 +add test 10.10.60.129 +add test 10.10.60.13 +add test 10.10.60.130 +add test 10.10.60.131 +add test 10.10.60.132 +add test 10.10.60.133 +add test 10.10.60.134 +add test 10.10.60.135 +add test 10.10.60.136 +add test 10.10.60.137 +add test 10.10.60.138 +add test 10.10.60.139 +add test 10.10.60.14 +add test 10.10.60.140 +add test 10.10.60.141 +add test 10.10.60.142 +add test 10.10.60.143 +add test 10.10.60.144 +add test 10.10.60.145 +add test 10.10.60.146 +add test 10.10.60.147 +add test 10.10.60.148 +add test 10.10.60.149 +add test 10.10.60.15 +add test 10.10.60.150 +add test 10.10.60.151 +add test 10.10.60.152 +add test 10.10.60.153 +add test 10.10.60.154 +add test 10.10.60.155 +add test 10.10.60.156 +add test 10.10.60.157 +add test 10.10.60.158 +add test 10.10.60.159 +add test 10.10.60.16 +add test 10.10.60.160 +add test 10.10.60.161 +add test 10.10.60.162 +add test 10.10.60.163 +add test 10.10.60.164 +add test 10.10.60.165 +add test 10.10.60.166 +add test 10.10.60.167 +add test 10.10.60.168 +add test 10.10.60.169 +add test 10.10.60.17 +add test 10.10.60.170 +add test 10.10.60.171 +add test 10.10.60.172 +add test 10.10.60.173 +add test 10.10.60.174 +add test 10.10.60.175 +add test 10.10.60.176 +add test 10.10.60.177 +add test 10.10.60.178 +add test 10.10.60.179 +add test 10.10.60.18 +add test 10.10.60.180 +add test 10.10.60.181 +add test 10.10.60.182 +add test 10.10.60.183 +add test 10.10.60.184 +add test 10.10.60.185 +add test 10.10.60.186 +add test 10.10.60.187 +add test 10.10.60.188 +add test 10.10.60.189 +add test 10.10.60.19 +add test 10.10.60.190 +add test 10.10.60.191 +add test 10.10.60.192 +add test 10.10.60.193 +add test 10.10.60.194 +add test 10.10.60.195 +add test 10.10.60.196 +add test 10.10.60.197 +add test 10.10.60.198 +add test 10.10.60.199 +add test 10.10.60.2 +add test 10.10.60.20 +add test 10.10.60.200 +add test 10.10.60.201 +add test 10.10.60.202 +add test 10.10.60.203 +add test 10.10.60.204 +add test 10.10.60.205 +add test 10.10.60.206 +add test 10.10.60.207 +add test 10.10.60.208 +add test 10.10.60.209 +add test 10.10.60.21 +add test 10.10.60.210 +add test 10.10.60.211 +add test 10.10.60.212 +add test 10.10.60.213 +add test 10.10.60.214 +add test 10.10.60.215 +add test 10.10.60.216 +add test 10.10.60.217 +add test 10.10.60.218 +add test 10.10.60.219 +add test 10.10.60.22 +add test 10.10.60.220 +add test 10.10.60.221 +add test 10.10.60.222 +add test 10.10.60.223 +add test 10.10.60.224 +add test 10.10.60.225 +add test 10.10.60.226 +add test 10.10.60.227 +add test 10.10.60.228 +add test 10.10.60.229 +add test 10.10.60.23 +add test 10.10.60.230 +add test 10.10.60.231 +add test 10.10.60.232 +add test 10.10.60.233 +add test 10.10.60.234 +add test 10.10.60.235 +add test 10.10.60.236 +add test 10.10.60.237 +add test 10.10.60.238 +add test 10.10.60.239 +add test 10.10.60.24 +add test 10.10.60.240 +add test 10.10.60.241 +add test 10.10.60.242 +add test 10.10.60.243 +add test 10.10.60.244 +add test 10.10.60.245 +add test 10.10.60.246 +add test 10.10.60.247 +add test 10.10.60.248 +add test 10.10.60.249 +add test 10.10.60.25 +add test 10.10.60.250 +add test 10.10.60.251 +add test 10.10.60.252 +add test 10.10.60.253 +add test 10.10.60.254 +add test 10.10.60.255 +add test 10.10.60.26 +add test 10.10.60.27 +add test 10.10.60.28 +add test 10.10.60.29 +add test 10.10.60.3 +add test 10.10.60.30 +add test 10.10.60.31 +add test 10.10.60.32 +add test 10.10.60.33 +add test 10.10.60.34 +add test 10.10.60.35 +add test 10.10.60.36 +add test 10.10.60.37 +add test 10.10.60.38 +add test 10.10.60.39 +add test 10.10.60.4 +add test 10.10.60.40 +add test 10.10.60.41 +add test 10.10.60.42 +add test 10.10.60.43 +add test 10.10.60.44 +add test 10.10.60.45 +add test 10.10.60.46 +add test 10.10.60.47 +add test 10.10.60.48 +add test 10.10.60.49 +add test 10.10.60.5 +add test 10.10.60.50 +add test 10.10.60.51 +add test 10.10.60.52 +add test 10.10.60.53 +add test 10.10.60.54 +add test 10.10.60.55 +add test 10.10.60.56 +add test 10.10.60.57 +add test 10.10.60.58 +add test 10.10.60.59 +add test 10.10.60.6 +add test 10.10.60.60 +add test 10.10.60.61 +add test 10.10.60.62 +add test 10.10.60.63 +add test 10.10.60.64 +add test 10.10.60.65 +add test 10.10.60.66 +add test 10.10.60.67 +add test 10.10.60.68 +add test 10.10.60.69 +add test 10.10.60.7 +add test 10.10.60.70 +add test 10.10.60.71 +add test 10.10.60.72 +add test 10.10.60.73 +add test 10.10.60.74 +add test 10.10.60.75 +add test 10.10.60.76 +add test 10.10.60.77 +add test 10.10.60.78 +add test 10.10.60.79 +add test 10.10.60.8 +add test 10.10.60.80 +add test 10.10.60.81 +add test 10.10.60.82 +add test 10.10.60.83 +add test 10.10.60.84 +add test 10.10.60.85 +add test 10.10.60.86 +add test 10.10.60.87 +add test 10.10.60.88 +add test 10.10.60.89 +add test 10.10.60.9 +add test 10.10.60.90 +add test 10.10.60.91 +add test 10.10.60.92 +add test 10.10.60.93 +add test 10.10.60.94 +add test 10.10.60.95 +add test 10.10.60.96 +add test 10.10.60.97 +add test 10.10.60.98 +add test 10.10.60.99 +add test 10.10.61.0 +add test 10.10.61.1 +add test 10.10.61.10 +add test 10.10.61.100 +add test 10.10.61.101 +add test 10.10.61.102 +add test 10.10.61.103 +add test 10.10.61.104 +add test 10.10.61.105 +add test 10.10.61.106 +add test 10.10.61.107 +add test 10.10.61.108 +add test 10.10.61.109 +add test 10.10.61.11 +add test 10.10.61.110 +add test 10.10.61.111 +add test 10.10.61.112 +add test 10.10.61.113 +add test 10.10.61.114 +add test 10.10.61.115 +add test 10.10.61.116 +add test 10.10.61.117 +add test 10.10.61.118 +add test 10.10.61.119 +add test 10.10.61.12 +add test 10.10.61.120 +add test 10.10.61.121 +add test 10.10.61.122 +add test 10.10.61.123 +add test 10.10.61.124 +add test 10.10.61.125 +add test 10.10.61.126 +add test 10.10.61.127 +add test 10.10.61.128 +add test 10.10.61.129 +add test 10.10.61.13 +add test 10.10.61.130 +add test 10.10.61.131 +add test 10.10.61.132 +add test 10.10.61.133 +add test 10.10.61.134 +add test 10.10.61.135 +add test 10.10.61.136 +add test 10.10.61.137 +add test 10.10.61.138 +add test 10.10.61.139 +add test 10.10.61.14 +add test 10.10.61.140 +add test 10.10.61.141 +add test 10.10.61.142 +add test 10.10.61.143 +add test 10.10.61.144 +add test 10.10.61.145 +add test 10.10.61.146 +add test 10.10.61.147 +add test 10.10.61.148 +add test 10.10.61.149 +add test 10.10.61.15 +add test 10.10.61.150 +add test 10.10.61.151 +add test 10.10.61.152 +add test 10.10.61.153 +add test 10.10.61.154 +add test 10.10.61.155 +add test 10.10.61.156 +add test 10.10.61.157 +add test 10.10.61.158 +add test 10.10.61.159 +add test 10.10.61.16 +add test 10.10.61.160 +add test 10.10.61.161 +add test 10.10.61.162 +add test 10.10.61.163 +add test 10.10.61.164 +add test 10.10.61.165 +add test 10.10.61.166 +add test 10.10.61.167 +add test 10.10.61.168 +add test 10.10.61.169 +add test 10.10.61.17 +add test 10.10.61.170 +add test 10.10.61.171 +add test 10.10.61.172 +add test 10.10.61.173 +add test 10.10.61.174 +add test 10.10.61.175 +add test 10.10.61.176 +add test 10.10.61.177 +add test 10.10.61.178 +add test 10.10.61.179 +add test 10.10.61.18 +add test 10.10.61.180 +add test 10.10.61.181 +add test 10.10.61.182 +add test 10.10.61.183 +add test 10.10.61.184 +add test 10.10.61.185 +add test 10.10.61.186 +add test 10.10.61.187 +add test 10.10.61.188 +add test 10.10.61.189 +add test 10.10.61.19 +add test 10.10.61.190 +add test 10.10.61.191 +add test 10.10.61.192 +add test 10.10.61.193 +add test 10.10.61.194 +add test 10.10.61.195 +add test 10.10.61.196 +add test 10.10.61.197 +add test 10.10.61.198 +add test 10.10.61.199 +add test 10.10.61.2 +add test 10.10.61.20 +add test 10.10.61.200 +add test 10.10.61.201 +add test 10.10.61.202 +add test 10.10.61.203 +add test 10.10.61.204 +add test 10.10.61.205 +add test 10.10.61.206 +add test 10.10.61.207 +add test 10.10.61.208 +add test 10.10.61.209 +add test 10.10.61.21 +add test 10.10.61.210 +add test 10.10.61.211 +add test 10.10.61.212 +add test 10.10.61.213 +add test 10.10.61.214 +add test 10.10.61.215 +add test 10.10.61.216 +add test 10.10.61.217 +add test 10.10.61.218 +add test 10.10.61.219 +add test 10.10.61.22 +add test 10.10.61.220 +add test 10.10.61.221 +add test 10.10.61.222 +add test 10.10.61.223 +add test 10.10.61.224 +add test 10.10.61.225 +add test 10.10.61.226 +add test 10.10.61.227 +add test 10.10.61.228 +add test 10.10.61.229 +add test 10.10.61.23 +add test 10.10.61.230 +add test 10.10.61.231 +add test 10.10.61.232 +add test 10.10.61.233 +add test 10.10.61.234 +add test 10.10.61.235 +add test 10.10.61.236 +add test 10.10.61.237 +add test 10.10.61.238 +add test 10.10.61.239 +add test 10.10.61.24 +add test 10.10.61.240 +add test 10.10.61.241 +add test 10.10.61.242 +add test 10.10.61.243 +add test 10.10.61.244 +add test 10.10.61.245 +add test 10.10.61.246 +add test 10.10.61.247 +add test 10.10.61.248 +add test 10.10.61.249 +add test 10.10.61.25 +add test 10.10.61.250 +add test 10.10.61.251 +add test 10.10.61.252 +add test 10.10.61.253 +add test 10.10.61.254 +add test 10.10.61.255 +add test 10.10.61.26 +add test 10.10.61.27 +add test 10.10.61.28 +add test 10.10.61.29 +add test 10.10.61.3 +add test 10.10.61.30 +add test 10.10.61.31 +add test 10.10.61.32 +add test 10.10.61.33 +add test 10.10.61.34 +add test 10.10.61.35 +add test 10.10.61.36 +add test 10.10.61.37 +add test 10.10.61.38 +add test 10.10.61.39 +add test 10.10.61.4 +add test 10.10.61.40 +add test 10.10.61.41 +add test 10.10.61.42 +add test 10.10.61.43 +add test 10.10.61.44 +add test 10.10.61.45 +add test 10.10.61.46 +add test 10.10.61.47 +add test 10.10.61.48 +add test 10.10.61.49 +add test 10.10.61.5 +add test 10.10.61.50 +add test 10.10.61.51 +add test 10.10.61.52 +add test 10.10.61.53 +add test 10.10.61.54 +add test 10.10.61.55 +add test 10.10.61.56 +add test 10.10.61.57 +add test 10.10.61.58 +add test 10.10.61.59 +add test 10.10.61.6 +add test 10.10.61.60 +add test 10.10.61.61 +add test 10.10.61.62 +add test 10.10.61.63 +add test 10.10.61.64 +add test 10.10.61.65 +add test 10.10.61.66 +add test 10.10.61.67 +add test 10.10.61.68 +add test 10.10.61.69 +add test 10.10.61.7 +add test 10.10.61.70 +add test 10.10.61.71 +add test 10.10.61.72 +add test 10.10.61.73 +add test 10.10.61.74 +add test 10.10.61.75 +add test 10.10.61.76 +add test 10.10.61.77 +add test 10.10.61.78 +add test 10.10.61.79 +add test 10.10.61.8 +add test 10.10.61.80 +add test 10.10.61.81 +add test 10.10.61.82 +add test 10.10.61.83 +add test 10.10.61.84 +add test 10.10.61.85 +add test 10.10.61.86 +add test 10.10.61.87 +add test 10.10.61.88 +add test 10.10.61.89 +add test 10.10.61.9 +add test 10.10.61.90 +add test 10.10.61.91 +add test 10.10.61.92 +add test 10.10.61.93 +add test 10.10.61.94 +add test 10.10.61.95 +add test 10.10.61.96 +add test 10.10.61.97 +add test 10.10.61.98 +add test 10.10.61.99 +add test 10.10.62.0 +add test 10.10.62.1 +add test 10.10.62.10 +add test 10.10.62.100 +add test 10.10.62.101 +add test 10.10.62.102 +add test 10.10.62.103 +add test 10.10.62.104 +add test 10.10.62.105 +add test 10.10.62.106 +add test 10.10.62.107 +add test 10.10.62.108 +add test 10.10.62.109 +add test 10.10.62.11 +add test 10.10.62.110 +add test 10.10.62.111 +add test 10.10.62.112 +add test 10.10.62.113 +add test 10.10.62.114 +add test 10.10.62.115 +add test 10.10.62.116 +add test 10.10.62.117 +add test 10.10.62.118 +add test 10.10.62.119 +add test 10.10.62.12 +add test 10.10.62.120 +add test 10.10.62.121 +add test 10.10.62.122 +add test 10.10.62.123 +add test 10.10.62.124 +add test 10.10.62.125 +add test 10.10.62.126 +add test 10.10.62.127 +add test 10.10.62.128 +add test 10.10.62.129 +add test 10.10.62.13 +add test 10.10.62.130 +add test 10.10.62.131 +add test 10.10.62.132 +add test 10.10.62.133 +add test 10.10.62.134 +add test 10.10.62.135 +add test 10.10.62.136 +add test 10.10.62.137 +add test 10.10.62.138 +add test 10.10.62.139 +add test 10.10.62.14 +add test 10.10.62.140 +add test 10.10.62.141 +add test 10.10.62.142 +add test 10.10.62.143 +add test 10.10.62.144 +add test 10.10.62.145 +add test 10.10.62.146 +add test 10.10.62.147 +add test 10.10.62.148 +add test 10.10.62.149 +add test 10.10.62.15 +add test 10.10.62.150 +add test 10.10.62.151 +add test 10.10.62.152 +add test 10.10.62.153 +add test 10.10.62.154 +add test 10.10.62.155 +add test 10.10.62.156 +add test 10.10.62.157 +add test 10.10.62.158 +add test 10.10.62.159 +add test 10.10.62.16 +add test 10.10.62.160 +add test 10.10.62.161 +add test 10.10.62.162 +add test 10.10.62.163 +add test 10.10.62.164 +add test 10.10.62.165 +add test 10.10.62.166 +add test 10.10.62.167 +add test 10.10.62.168 +add test 10.10.62.169 +add test 10.10.62.17 +add test 10.10.62.170 +add test 10.10.62.171 +add test 10.10.62.172 +add test 10.10.62.173 +add test 10.10.62.174 +add test 10.10.62.175 +add test 10.10.62.176 +add test 10.10.62.177 +add test 10.10.62.178 +add test 10.10.62.179 +add test 10.10.62.18 +add test 10.10.62.180 +add test 10.10.62.181 +add test 10.10.62.182 +add test 10.10.62.183 +add test 10.10.62.184 +add test 10.10.62.185 +add test 10.10.62.186 +add test 10.10.62.187 +add test 10.10.62.188 +add test 10.10.62.189 +add test 10.10.62.19 +add test 10.10.62.190 +add test 10.10.62.191 +add test 10.10.62.192 +add test 10.10.62.193 +add test 10.10.62.194 +add test 10.10.62.195 +add test 10.10.62.196 +add test 10.10.62.197 +add test 10.10.62.198 +add test 10.10.62.199 +add test 10.10.62.2 +add test 10.10.62.20 +add test 10.10.62.200 +add test 10.10.62.201 +add test 10.10.62.202 +add test 10.10.62.203 +add test 10.10.62.204 +add test 10.10.62.205 +add test 10.10.62.206 +add test 10.10.62.207 +add test 10.10.62.208 +add test 10.10.62.209 +add test 10.10.62.21 +add test 10.10.62.210 +add test 10.10.62.211 +add test 10.10.62.212 +add test 10.10.62.213 +add test 10.10.62.214 +add test 10.10.62.215 +add test 10.10.62.216 +add test 10.10.62.217 +add test 10.10.62.218 +add test 10.10.62.219 +add test 10.10.62.22 +add test 10.10.62.220 +add test 10.10.62.221 +add test 10.10.62.222 +add test 10.10.62.223 +add test 10.10.62.224 +add test 10.10.62.225 +add test 10.10.62.226 +add test 10.10.62.227 +add test 10.10.62.228 +add test 10.10.62.229 +add test 10.10.62.23 +add test 10.10.62.230 +add test 10.10.62.231 +add test 10.10.62.232 +add test 10.10.62.233 +add test 10.10.62.234 +add test 10.10.62.235 +add test 10.10.62.236 +add test 10.10.62.237 +add test 10.10.62.238 +add test 10.10.62.239 +add test 10.10.62.24 +add test 10.10.62.240 +add test 10.10.62.241 +add test 10.10.62.242 +add test 10.10.62.243 +add test 10.10.62.244 +add test 10.10.62.245 +add test 10.10.62.246 +add test 10.10.62.247 +add test 10.10.62.248 +add test 10.10.62.249 +add test 10.10.62.25 +add test 10.10.62.250 +add test 10.10.62.251 +add test 10.10.62.252 +add test 10.10.62.253 +add test 10.10.62.254 +add test 10.10.62.255 +add test 10.10.62.26 +add test 10.10.62.27 +add test 10.10.62.28 +add test 10.10.62.29 +add test 10.10.62.3 +add test 10.10.62.30 +add test 10.10.62.31 +add test 10.10.62.32 +add test 10.10.62.33 +add test 10.10.62.34 +add test 10.10.62.35 +add test 10.10.62.36 +add test 10.10.62.37 +add test 10.10.62.38 +add test 10.10.62.39 +add test 10.10.62.4 +add test 10.10.62.40 +add test 10.10.62.41 +add test 10.10.62.42 +add test 10.10.62.43 +add test 10.10.62.44 +add test 10.10.62.45 +add test 10.10.62.46 +add test 10.10.62.47 +add test 10.10.62.48 +add test 10.10.62.49 +add test 10.10.62.5 +add test 10.10.62.50 +add test 10.10.62.51 +add test 10.10.62.52 +add test 10.10.62.53 +add test 10.10.62.54 +add test 10.10.62.55 +add test 10.10.62.56 +add test 10.10.62.57 +add test 10.10.62.58 +add test 10.10.62.59 +add test 10.10.62.6 +add test 10.10.62.60 +add test 10.10.62.61 +add test 10.10.62.62 +add test 10.10.62.63 +add test 10.10.62.64 +add test 10.10.62.65 +add test 10.10.62.66 +add test 10.10.62.67 +add test 10.10.62.68 +add test 10.10.62.69 +add test 10.10.62.7 +add test 10.10.62.70 +add test 10.10.62.71 +add test 10.10.62.72 +add test 10.10.62.73 +add test 10.10.62.74 +add test 10.10.62.75 +add test 10.10.62.76 +add test 10.10.62.77 +add test 10.10.62.78 +add test 10.10.62.79 +add test 10.10.62.8 +add test 10.10.62.80 +add test 10.10.62.81 +add test 10.10.62.82 +add test 10.10.62.83 +add test 10.10.62.84 +add test 10.10.62.85 +add test 10.10.62.86 +add test 10.10.62.87 +add test 10.10.62.88 +add test 10.10.62.89 +add test 10.10.62.9 +add test 10.10.62.90 +add test 10.10.62.91 +add test 10.10.62.92 +add test 10.10.62.93 +add test 10.10.62.94 +add test 10.10.62.95 +add test 10.10.62.96 +add test 10.10.62.97 +add test 10.10.62.98 +add test 10.10.62.99 +add test 10.10.63.0 +add test 10.10.63.1 +add test 10.10.63.10 +add test 10.10.63.100 +add test 10.10.63.101 +add test 10.10.63.102 +add test 10.10.63.103 +add test 10.10.63.104 +add test 10.10.63.105 +add test 10.10.63.106 +add test 10.10.63.107 +add test 10.10.63.108 +add test 10.10.63.109 +add test 10.10.63.11 +add test 10.10.63.110 +add test 10.10.63.111 +add test 10.10.63.112 +add test 10.10.63.113 +add test 10.10.63.114 +add test 10.10.63.115 +add test 10.10.63.116 +add test 10.10.63.117 +add test 10.10.63.118 +add test 10.10.63.119 +add test 10.10.63.12 +add test 10.10.63.120 +add test 10.10.63.121 +add test 10.10.63.122 +add test 10.10.63.123 +add test 10.10.63.124 +add test 10.10.63.125 +add test 10.10.63.126 +add test 10.10.63.127 +add test 10.10.63.128 +add test 10.10.63.129 +add test 10.10.63.13 +add test 10.10.63.130 +add test 10.10.63.131 +add test 10.10.63.132 +add test 10.10.63.133 +add test 10.10.63.134 +add test 10.10.63.135 +add test 10.10.63.136 +add test 10.10.63.137 +add test 10.10.63.138 +add test 10.10.63.139 +add test 10.10.63.14 +add test 10.10.63.140 +add test 10.10.63.141 +add test 10.10.63.142 +add test 10.10.63.143 +add test 10.10.63.144 +add test 10.10.63.145 +add test 10.10.63.146 +add test 10.10.63.147 +add test 10.10.63.148 +add test 10.10.63.149 +add test 10.10.63.15 +add test 10.10.63.150 +add test 10.10.63.151 +add test 10.10.63.152 +add test 10.10.63.153 +add test 10.10.63.154 +add test 10.10.63.155 +add test 10.10.63.156 +add test 10.10.63.157 +add test 10.10.63.158 +add test 10.10.63.159 +add test 10.10.63.16 +add test 10.10.63.160 +add test 10.10.63.161 +add test 10.10.63.162 +add test 10.10.63.163 +add test 10.10.63.164 +add test 10.10.63.165 +add test 10.10.63.166 +add test 10.10.63.167 +add test 10.10.63.168 +add test 10.10.63.169 +add test 10.10.63.17 +add test 10.10.63.170 +add test 10.10.63.171 +add test 10.10.63.172 +add test 10.10.63.173 +add test 10.10.63.174 +add test 10.10.63.175 +add test 10.10.63.176 +add test 10.10.63.177 +add test 10.10.63.178 +add test 10.10.63.179 +add test 10.10.63.18 +add test 10.10.63.180 +add test 10.10.63.181 +add test 10.10.63.182 +add test 10.10.63.183 +add test 10.10.63.184 +add test 10.10.63.185 +add test 10.10.63.186 +add test 10.10.63.187 +add test 10.10.63.188 +add test 10.10.63.189 +add test 10.10.63.19 +add test 10.10.63.190 +add test 10.10.63.191 +add test 10.10.63.192 +add test 10.10.63.193 +add test 10.10.63.194 +add test 10.10.63.195 +add test 10.10.63.196 +add test 10.10.63.197 +add test 10.10.63.198 +add test 10.10.63.199 +add test 10.10.63.2 +add test 10.10.63.20 +add test 10.10.63.200 +add test 10.10.63.201 +add test 10.10.63.202 +add test 10.10.63.203 +add test 10.10.63.204 +add test 10.10.63.205 +add test 10.10.63.206 +add test 10.10.63.207 +add test 10.10.63.208 +add test 10.10.63.209 +add test 10.10.63.21 +add test 10.10.63.210 +add test 10.10.63.211 +add test 10.10.63.212 +add test 10.10.63.213 +add test 10.10.63.214 +add test 10.10.63.215 +add test 10.10.63.216 +add test 10.10.63.217 +add test 10.10.63.218 +add test 10.10.63.219 +add test 10.10.63.22 +add test 10.10.63.220 +add test 10.10.63.221 +add test 10.10.63.222 +add test 10.10.63.223 +add test 10.10.63.224 +add test 10.10.63.225 +add test 10.10.63.226 +add test 10.10.63.227 +add test 10.10.63.228 +add test 10.10.63.229 +add test 10.10.63.23 +add test 10.10.63.230 +add test 10.10.63.231 +add test 10.10.63.232 +add test 10.10.63.233 +add test 10.10.63.234 +add test 10.10.63.235 +add test 10.10.63.236 +add test 10.10.63.237 +add test 10.10.63.238 +add test 10.10.63.239 +add test 10.10.63.24 +add test 10.10.63.240 +add test 10.10.63.241 +add test 10.10.63.242 +add test 10.10.63.243 +add test 10.10.63.244 +add test 10.10.63.245 +add test 10.10.63.246 +add test 10.10.63.247 +add test 10.10.63.248 +add test 10.10.63.249 +add test 10.10.63.25 +add test 10.10.63.250 +add test 10.10.63.251 +add test 10.10.63.252 +add test 10.10.63.253 +add test 10.10.63.254 +add test 10.10.63.255 +add test 10.10.63.26 +add test 10.10.63.27 +add test 10.10.63.28 +add test 10.10.63.29 +add test 10.10.63.3 +add test 10.10.63.30 +add test 10.10.63.31 +add test 10.10.63.32 +add test 10.10.63.33 +add test 10.10.63.34 +add test 10.10.63.35 +add test 10.10.63.36 +add test 10.10.63.37 +add test 10.10.63.38 +add test 10.10.63.39 +add test 10.10.63.4 +add test 10.10.63.40 +add test 10.10.63.41 +add test 10.10.63.42 +add test 10.10.63.43 +add test 10.10.63.44 +add test 10.10.63.45 +add test 10.10.63.46 +add test 10.10.63.47 +add test 10.10.63.48 +add test 10.10.63.49 +add test 10.10.63.5 +add test 10.10.63.50 +add test 10.10.63.51 +add test 10.10.63.52 +add test 10.10.63.53 +add test 10.10.63.54 +add test 10.10.63.55 +add test 10.10.63.56 +add test 10.10.63.57 +add test 10.10.63.58 +add test 10.10.63.59 +add test 10.10.63.6 +add test 10.10.63.60 +add test 10.10.63.61 +add test 10.10.63.62 +add test 10.10.63.63 +add test 10.10.63.64 +add test 10.10.63.65 +add test 10.10.63.66 +add test 10.10.63.67 +add test 10.10.63.68 +add test 10.10.63.69 +add test 10.10.63.7 +add test 10.10.63.70 +add test 10.10.63.71 +add test 10.10.63.72 +add test 10.10.63.73 +add test 10.10.63.74 +add test 10.10.63.75 +add test 10.10.63.76 +add test 10.10.63.77 +add test 10.10.63.78 +add test 10.10.63.79 +add test 10.10.63.8 +add test 10.10.63.80 +add test 10.10.63.81 +add test 10.10.63.82 +add test 10.10.63.83 +add test 10.10.63.84 +add test 10.10.63.85 +add test 10.10.63.86 +add test 10.10.63.87 +add test 10.10.63.88 +add test 10.10.63.89 +add test 10.10.63.9 +add test 10.10.63.90 +add test 10.10.63.91 +add test 10.10.63.92 +add test 10.10.63.93 +add test 10.10.63.94 +add test 10.10.63.95 +add test 10.10.63.96 +add test 10.10.63.97 +add test 10.10.63.98 +add test 10.10.63.99 +add test 10.10.64.0 +add test 10.10.64.1 +add test 10.10.64.10 +add test 10.10.64.100 +add test 10.10.64.101 +add test 10.10.64.102 +add test 10.10.64.103 +add test 10.10.64.104 +add test 10.10.64.105 +add test 10.10.64.106 +add test 10.10.64.107 +add test 10.10.64.108 +add test 10.10.64.109 +add test 10.10.64.11 +add test 10.10.64.110 +add test 10.10.64.111 +add test 10.10.64.112 +add test 10.10.64.113 +add test 10.10.64.114 +add test 10.10.64.115 +add test 10.10.64.116 +add test 10.10.64.117 +add test 10.10.64.118 +add test 10.10.64.119 +add test 10.10.64.12 +add test 10.10.64.120 +add test 10.10.64.121 +add test 10.10.64.122 +add test 10.10.64.123 +add test 10.10.64.124 +add test 10.10.64.125 +add test 10.10.64.126 +add test 10.10.64.127 +add test 10.10.64.128 +add test 10.10.64.129 +add test 10.10.64.13 +add test 10.10.64.130 +add test 10.10.64.131 +add test 10.10.64.132 +add test 10.10.64.133 +add test 10.10.64.134 +add test 10.10.64.135 +add test 10.10.64.136 +add test 10.10.64.137 +add test 10.10.64.138 +add test 10.10.64.139 +add test 10.10.64.14 +add test 10.10.64.140 +add test 10.10.64.141 +add test 10.10.64.142 +add test 10.10.64.143 +add test 10.10.64.144 +add test 10.10.64.145 +add test 10.10.64.146 +add test 10.10.64.147 +add test 10.10.64.148 +add test 10.10.64.149 +add test 10.10.64.15 +add test 10.10.64.150 +add test 10.10.64.151 +add test 10.10.64.152 +add test 10.10.64.153 +add test 10.10.64.154 +add test 10.10.64.155 +add test 10.10.64.156 +add test 10.10.64.157 +add test 10.10.64.158 +add test 10.10.64.159 +add test 10.10.64.16 +add test 10.10.64.160 +add test 10.10.64.161 +add test 10.10.64.162 +add test 10.10.64.163 +add test 10.10.64.164 +add test 10.10.64.165 +add test 10.10.64.166 +add test 10.10.64.167 +add test 10.10.64.168 +add test 10.10.64.169 +add test 10.10.64.17 +add test 10.10.64.170 +add test 10.10.64.171 +add test 10.10.64.172 +add test 10.10.64.173 +add test 10.10.64.174 +add test 10.10.64.175 +add test 10.10.64.176 +add test 10.10.64.177 +add test 10.10.64.178 +add test 10.10.64.179 +add test 10.10.64.18 +add test 10.10.64.180 +add test 10.10.64.181 +add test 10.10.64.182 +add test 10.10.64.183 +add test 10.10.64.184 +add test 10.10.64.185 +add test 10.10.64.186 +add test 10.10.64.187 +add test 10.10.64.188 +add test 10.10.64.189 +add test 10.10.64.19 +add test 10.10.64.190 +add test 10.10.64.191 +add test 10.10.64.192 +add test 10.10.64.193 +add test 10.10.64.194 +add test 10.10.64.195 +add test 10.10.64.196 +add test 10.10.64.197 +add test 10.10.64.198 +add test 10.10.64.199 +add test 10.10.64.2 +add test 10.10.64.20 +add test 10.10.64.200 +add test 10.10.64.201 +add test 10.10.64.202 +add test 10.10.64.203 +add test 10.10.64.204 +add test 10.10.64.205 +add test 10.10.64.206 +add test 10.10.64.207 +add test 10.10.64.208 +add test 10.10.64.209 +add test 10.10.64.21 +add test 10.10.64.210 +add test 10.10.64.211 +add test 10.10.64.212 +add test 10.10.64.213 +add test 10.10.64.214 +add test 10.10.64.215 +add test 10.10.64.216 +add test 10.10.64.217 +add test 10.10.64.218 +add test 10.10.64.219 +add test 10.10.64.22 +add test 10.10.64.220 +add test 10.10.64.221 +add test 10.10.64.222 +add test 10.10.64.223 +add test 10.10.64.224 +add test 10.10.64.225 +add test 10.10.64.226 +add test 10.10.64.227 +add test 10.10.64.228 +add test 10.10.64.229 +add test 10.10.64.23 +add test 10.10.64.230 +add test 10.10.64.231 +add test 10.10.64.232 +add test 10.10.64.233 +add test 10.10.64.234 +add test 10.10.64.235 +add test 10.10.64.236 +add test 10.10.64.237 +add test 10.10.64.238 +add test 10.10.64.239 +add test 10.10.64.24 +add test 10.10.64.240 +add test 10.10.64.241 +add test 10.10.64.242 +add test 10.10.64.243 +add test 10.10.64.244 +add test 10.10.64.245 +add test 10.10.64.246 +add test 10.10.64.247 +add test 10.10.64.248 +add test 10.10.64.249 +add test 10.10.64.25 +add test 10.10.64.250 +add test 10.10.64.251 +add test 10.10.64.252 +add test 10.10.64.253 +add test 10.10.64.254 +add test 10.10.64.255 +add test 10.10.64.26 +add test 10.10.64.27 +add test 10.10.64.28 +add test 10.10.64.29 +add test 10.10.64.3 +add test 10.10.64.30 +add test 10.10.64.31 +add test 10.10.64.32 +add test 10.10.64.33 +add test 10.10.64.34 +add test 10.10.64.35 +add test 10.10.64.36 +add test 10.10.64.37 +add test 10.10.64.38 +add test 10.10.64.39 +add test 10.10.64.4 +add test 10.10.64.40 +add test 10.10.64.41 +add test 10.10.64.42 +add test 10.10.64.43 +add test 10.10.64.44 +add test 10.10.64.45 +add test 10.10.64.46 +add test 10.10.64.47 +add test 10.10.64.48 +add test 10.10.64.49 +add test 10.10.64.5 +add test 10.10.64.50 +add test 10.10.64.51 +add test 10.10.64.52 +add test 10.10.64.53 +add test 10.10.64.54 +add test 10.10.64.55 +add test 10.10.64.56 +add test 10.10.64.57 +add test 10.10.64.58 +add test 10.10.64.59 +add test 10.10.64.6 +add test 10.10.64.60 +add test 10.10.64.61 +add test 10.10.64.62 +add test 10.10.64.63 +add test 10.10.64.64 +add test 10.10.64.65 +add test 10.10.64.66 +add test 10.10.64.67 +add test 10.10.64.68 +add test 10.10.64.69 +add test 10.10.64.7 +add test 10.10.64.70 +add test 10.10.64.71 +add test 10.10.64.72 +add test 10.10.64.73 +add test 10.10.64.74 +add test 10.10.64.75 +add test 10.10.64.76 +add test 10.10.64.77 +add test 10.10.64.78 +add test 10.10.64.79 +add test 10.10.64.8 +add test 10.10.64.80 +add test 10.10.64.81 +add test 10.10.64.82 +add test 10.10.64.83 +add test 10.10.64.84 +add test 10.10.64.85 +add test 10.10.64.86 +add test 10.10.64.87 +add test 10.10.64.88 +add test 10.10.64.89 +add test 10.10.64.9 +add test 10.10.64.90 +add test 10.10.64.91 +add test 10.10.64.92 +add test 10.10.64.93 +add test 10.10.64.94 +add test 10.10.64.95 +add test 10.10.64.96 +add test 10.10.64.97 +add test 10.10.64.98 +add test 10.10.64.99 +add test 10.10.65.0 +add test 10.10.65.1 +add test 10.10.65.10 +add test 10.10.65.100 +add test 10.10.65.101 +add test 10.10.65.102 +add test 10.10.65.103 +add test 10.10.65.104 +add test 10.10.65.105 +add test 10.10.65.106 +add test 10.10.65.107 +add test 10.10.65.108 +add test 10.10.65.109 +add test 10.10.65.11 +add test 10.10.65.110 +add test 10.10.65.111 +add test 10.10.65.112 +add test 10.10.65.113 +add test 10.10.65.114 +add test 10.10.65.115 +add test 10.10.65.116 +add test 10.10.65.117 +add test 10.10.65.118 +add test 10.10.65.119 +add test 10.10.65.12 +add test 10.10.65.120 +add test 10.10.65.121 +add test 10.10.65.122 +add test 10.10.65.123 +add test 10.10.65.124 +add test 10.10.65.125 +add test 10.10.65.126 +add test 10.10.65.127 +add test 10.10.65.128 +add test 10.10.65.129 +add test 10.10.65.13 +add test 10.10.65.130 +add test 10.10.65.131 +add test 10.10.65.132 +add test 10.10.65.133 +add test 10.10.65.134 +add test 10.10.65.135 +add test 10.10.65.136 +add test 10.10.65.137 +add test 10.10.65.138 +add test 10.10.65.139 +add test 10.10.65.14 +add test 10.10.65.140 +add test 10.10.65.141 +add test 10.10.65.142 +add test 10.10.65.143 +add test 10.10.65.144 +add test 10.10.65.145 +add test 10.10.65.146 +add test 10.10.65.147 +add test 10.10.65.148 +add test 10.10.65.149 +add test 10.10.65.15 +add test 10.10.65.150 +add test 10.10.65.151 +add test 10.10.65.152 +add test 10.10.65.153 +add test 10.10.65.154 +add test 10.10.65.155 +add test 10.10.65.156 +add test 10.10.65.157 +add test 10.10.65.158 +add test 10.10.65.159 +add test 10.10.65.16 +add test 10.10.65.160 +add test 10.10.65.161 +add test 10.10.65.162 +add test 10.10.65.163 +add test 10.10.65.164 +add test 10.10.65.165 +add test 10.10.65.166 +add test 10.10.65.167 +add test 10.10.65.168 +add test 10.10.65.169 +add test 10.10.65.17 +add test 10.10.65.170 +add test 10.10.65.171 +add test 10.10.65.172 +add test 10.10.65.173 +add test 10.10.65.174 +add test 10.10.65.175 +add test 10.10.65.176 +add test 10.10.65.177 +add test 10.10.65.178 +add test 10.10.65.179 +add test 10.10.65.18 +add test 10.10.65.180 +add test 10.10.65.181 +add test 10.10.65.182 +add test 10.10.65.183 +add test 10.10.65.184 +add test 10.10.65.185 +add test 10.10.65.186 +add test 10.10.65.187 +add test 10.10.65.188 +add test 10.10.65.189 +add test 10.10.65.19 +add test 10.10.65.190 +add test 10.10.65.191 +add test 10.10.65.192 +add test 10.10.65.193 +add test 10.10.65.194 +add test 10.10.65.195 +add test 10.10.65.196 +add test 10.10.65.197 +add test 10.10.65.198 +add test 10.10.65.199 +add test 10.10.65.2 +add test 10.10.65.20 +add test 10.10.65.200 +add test 10.10.65.201 +add test 10.10.65.202 +add test 10.10.65.203 +add test 10.10.65.204 +add test 10.10.65.205 +add test 10.10.65.206 +add test 10.10.65.207 +add test 10.10.65.208 +add test 10.10.65.209 +add test 10.10.65.21 +add test 10.10.65.210 +add test 10.10.65.211 +add test 10.10.65.212 +add test 10.10.65.213 +add test 10.10.65.214 +add test 10.10.65.215 +add test 10.10.65.216 +add test 10.10.65.217 +add test 10.10.65.218 +add test 10.10.65.219 +add test 10.10.65.22 +add test 10.10.65.220 +add test 10.10.65.221 +add test 10.10.65.222 +add test 10.10.65.223 +add test 10.10.65.224 +add test 10.10.65.225 +add test 10.10.65.226 +add test 10.10.65.227 +add test 10.10.65.228 +add test 10.10.65.229 +add test 10.10.65.23 +add test 10.10.65.230 +add test 10.10.65.231 +add test 10.10.65.232 +add test 10.10.65.233 +add test 10.10.65.234 +add test 10.10.65.235 +add test 10.10.65.236 +add test 10.10.65.237 +add test 10.10.65.238 +add test 10.10.65.239 +add test 10.10.65.24 +add test 10.10.65.240 +add test 10.10.65.241 +add test 10.10.65.242 +add test 10.10.65.243 +add test 10.10.65.244 +add test 10.10.65.245 +add test 10.10.65.246 +add test 10.10.65.247 +add test 10.10.65.248 +add test 10.10.65.249 +add test 10.10.65.25 +add test 10.10.65.250 +add test 10.10.65.251 +add test 10.10.65.252 +add test 10.10.65.253 +add test 10.10.65.254 +add test 10.10.65.255 +add test 10.10.65.26 +add test 10.10.65.27 +add test 10.10.65.28 +add test 10.10.65.29 +add test 10.10.65.3 +add test 10.10.65.30 +add test 10.10.65.31 +add test 10.10.65.32 +add test 10.10.65.33 +add test 10.10.65.34 +add test 10.10.65.35 +add test 10.10.65.36 +add test 10.10.65.37 +add test 10.10.65.38 +add test 10.10.65.39 +add test 10.10.65.4 +add test 10.10.65.40 +add test 10.10.65.41 +add test 10.10.65.42 +add test 10.10.65.43 +add test 10.10.65.44 +add test 10.10.65.45 +add test 10.10.65.46 +add test 10.10.65.47 +add test 10.10.65.48 +add test 10.10.65.49 +add test 10.10.65.5 +add test 10.10.65.50 +add test 10.10.65.51 +add test 10.10.65.52 +add test 10.10.65.53 +add test 10.10.65.54 +add test 10.10.65.55 +add test 10.10.65.56 +add test 10.10.65.57 +add test 10.10.65.58 +add test 10.10.65.59 +add test 10.10.65.6 +add test 10.10.65.60 +add test 10.10.65.61 +add test 10.10.65.62 +add test 10.10.65.63 +add test 10.10.65.64 +add test 10.10.65.65 +add test 10.10.65.66 +add test 10.10.65.67 +add test 10.10.65.68 +add test 10.10.65.69 +add test 10.10.65.7 +add test 10.10.65.70 +add test 10.10.65.71 +add test 10.10.65.72 +add test 10.10.65.73 +add test 10.10.65.74 +add test 10.10.65.75 +add test 10.10.65.76 +add test 10.10.65.77 +add test 10.10.65.78 +add test 10.10.65.79 +add test 10.10.65.8 +add test 10.10.65.80 +add test 10.10.65.81 +add test 10.10.65.82 +add test 10.10.65.83 +add test 10.10.65.84 +add test 10.10.65.85 +add test 10.10.65.86 +add test 10.10.65.87 +add test 10.10.65.88 +add test 10.10.65.89 +add test 10.10.65.9 +add test 10.10.65.90 +add test 10.10.65.91 +add test 10.10.65.92 +add test 10.10.65.93 +add test 10.10.65.94 +add test 10.10.65.95 +add test 10.10.65.96 +add test 10.10.65.97 +add test 10.10.65.98 +add test 10.10.65.99 +add test 10.10.66.0 +add test 10.10.66.1 +add test 10.10.66.10 +add test 10.10.66.100 +add test 10.10.66.101 +add test 10.10.66.102 +add test 10.10.66.103 +add test 10.10.66.104 +add test 10.10.66.105 +add test 10.10.66.106 +add test 10.10.66.107 +add test 10.10.66.108 +add test 10.10.66.109 +add test 10.10.66.11 +add test 10.10.66.110 +add test 10.10.66.111 +add test 10.10.66.112 +add test 10.10.66.113 +add test 10.10.66.114 +add test 10.10.66.115 +add test 10.10.66.116 +add test 10.10.66.117 +add test 10.10.66.118 +add test 10.10.66.119 +add test 10.10.66.12 +add test 10.10.66.120 +add test 10.10.66.121 +add test 10.10.66.122 +add test 10.10.66.123 +add test 10.10.66.124 +add test 10.10.66.125 +add test 10.10.66.126 +add test 10.10.66.127 +add test 10.10.66.128 +add test 10.10.66.129 +add test 10.10.66.13 +add test 10.10.66.130 +add test 10.10.66.131 +add test 10.10.66.132 +add test 10.10.66.133 +add test 10.10.66.134 +add test 10.10.66.135 +add test 10.10.66.136 +add test 10.10.66.137 +add test 10.10.66.138 +add test 10.10.66.139 +add test 10.10.66.14 +add test 10.10.66.140 +add test 10.10.66.141 +add test 10.10.66.142 +add test 10.10.66.143 +add test 10.10.66.144 +add test 10.10.66.145 +add test 10.10.66.146 +add test 10.10.66.147 +add test 10.10.66.148 +add test 10.10.66.149 +add test 10.10.66.15 +add test 10.10.66.150 +add test 10.10.66.151 +add test 10.10.66.152 +add test 10.10.66.153 +add test 10.10.66.154 +add test 10.10.66.155 +add test 10.10.66.156 +add test 10.10.66.157 +add test 10.10.66.158 +add test 10.10.66.159 +add test 10.10.66.16 +add test 10.10.66.160 +add test 10.10.66.161 +add test 10.10.66.162 +add test 10.10.66.163 +add test 10.10.66.164 +add test 10.10.66.165 +add test 10.10.66.166 +add test 10.10.66.167 +add test 10.10.66.168 +add test 10.10.66.169 +add test 10.10.66.17 +add test 10.10.66.170 +add test 10.10.66.171 +add test 10.10.66.172 +add test 10.10.66.173 +add test 10.10.66.174 +add test 10.10.66.175 +add test 10.10.66.176 +add test 10.10.66.177 +add test 10.10.66.178 +add test 10.10.66.179 +add test 10.10.66.18 +add test 10.10.66.180 +add test 10.10.66.181 +add test 10.10.66.182 +add test 10.10.66.183 +add test 10.10.66.184 +add test 10.10.66.185 +add test 10.10.66.186 +add test 10.10.66.187 +add test 10.10.66.188 +add test 10.10.66.189 +add test 10.10.66.19 +add test 10.10.66.190 +add test 10.10.66.191 +add test 10.10.66.192 +add test 10.10.66.193 +add test 10.10.66.194 +add test 10.10.66.195 +add test 10.10.66.196 +add test 10.10.66.197 +add test 10.10.66.198 +add test 10.10.66.199 +add test 10.10.66.2 +add test 10.10.66.20 +add test 10.10.66.200 +add test 10.10.66.201 +add test 10.10.66.202 +add test 10.10.66.203 +add test 10.10.66.204 +add test 10.10.66.205 +add test 10.10.66.206 +add test 10.10.66.207 +add test 10.10.66.208 +add test 10.10.66.209 +add test 10.10.66.21 +add test 10.10.66.210 +add test 10.10.66.211 +add test 10.10.66.212 +add test 10.10.66.213 +add test 10.10.66.214 +add test 10.10.66.215 +add test 10.10.66.216 +add test 10.10.66.217 +add test 10.10.66.218 +add test 10.10.66.219 +add test 10.10.66.22 +add test 10.10.66.220 +add test 10.10.66.221 +add test 10.10.66.222 +add test 10.10.66.223 +add test 10.10.66.224 +add test 10.10.66.225 +add test 10.10.66.226 +add test 10.10.66.227 +add test 10.10.66.228 +add test 10.10.66.229 +add test 10.10.66.23 +add test 10.10.66.230 +add test 10.10.66.231 +add test 10.10.66.232 +add test 10.10.66.233 +add test 10.10.66.234 +add test 10.10.66.235 +add test 10.10.66.236 +add test 10.10.66.237 +add test 10.10.66.238 +add test 10.10.66.239 +add test 10.10.66.24 +add test 10.10.66.240 +add test 10.10.66.241 +add test 10.10.66.242 +add test 10.10.66.243 +add test 10.10.66.244 +add test 10.10.66.245 +add test 10.10.66.246 +add test 10.10.66.247 +add test 10.10.66.248 +add test 10.10.66.249 +add test 10.10.66.25 +add test 10.10.66.250 +add test 10.10.66.251 +add test 10.10.66.252 +add test 10.10.66.253 +add test 10.10.66.254 +add test 10.10.66.255 +add test 10.10.66.26 +add test 10.10.66.27 +add test 10.10.66.28 +add test 10.10.66.29 +add test 10.10.66.3 +add test 10.10.66.30 +add test 10.10.66.31 +add test 10.10.66.32 +add test 10.10.66.33 +add test 10.10.66.34 +add test 10.10.66.35 +add test 10.10.66.36 +add test 10.10.66.37 +add test 10.10.66.38 +add test 10.10.66.39 +add test 10.10.66.4 +add test 10.10.66.40 +add test 10.10.66.41 +add test 10.10.66.42 +add test 10.10.66.43 +add test 10.10.66.44 +add test 10.10.66.45 +add test 10.10.66.46 +add test 10.10.66.47 +add test 10.10.66.48 +add test 10.10.66.49 +add test 10.10.66.5 +add test 10.10.66.50 +add test 10.10.66.51 +add test 10.10.66.52 +add test 10.10.66.53 +add test 10.10.66.54 +add test 10.10.66.55 +add test 10.10.66.56 +add test 10.10.66.57 +add test 10.10.66.58 +add test 10.10.66.59 +add test 10.10.66.6 +add test 10.10.66.60 +add test 10.10.66.61 +add test 10.10.66.62 +add test 10.10.66.63 +add test 10.10.66.64 +add test 10.10.66.65 +add test 10.10.66.66 +add test 10.10.66.67 +add test 10.10.66.68 +add test 10.10.66.69 +add test 10.10.66.7 +add test 10.10.66.70 +add test 10.10.66.71 +add test 10.10.66.72 +add test 10.10.66.73 +add test 10.10.66.74 +add test 10.10.66.75 +add test 10.10.66.76 +add test 10.10.66.77 +add test 10.10.66.78 +add test 10.10.66.79 +add test 10.10.66.8 +add test 10.10.66.80 +add test 10.10.66.81 +add test 10.10.66.82 +add test 10.10.66.83 +add test 10.10.66.84 +add test 10.10.66.85 +add test 10.10.66.86 +add test 10.10.66.87 +add test 10.10.66.88 +add test 10.10.66.89 +add test 10.10.66.9 +add test 10.10.66.90 +add test 10.10.66.91 +add test 10.10.66.92 +add test 10.10.66.93 +add test 10.10.66.94 +add test 10.10.66.95 +add test 10.10.66.96 +add test 10.10.66.97 +add test 10.10.66.98 +add test 10.10.66.99 +add test 10.10.67.0 +add test 10.10.67.1 +add test 10.10.67.10 +add test 10.10.67.100 +add test 10.10.67.101 +add test 10.10.67.102 +add test 10.10.67.103 +add test 10.10.67.104 +add test 10.10.67.105 +add test 10.10.67.106 +add test 10.10.67.107 +add test 10.10.67.108 +add test 10.10.67.109 +add test 10.10.67.11 +add test 10.10.67.110 +add test 10.10.67.111 +add test 10.10.67.112 +add test 10.10.67.113 +add test 10.10.67.114 +add test 10.10.67.115 +add test 10.10.67.116 +add test 10.10.67.117 +add test 10.10.67.118 +add test 10.10.67.119 +add test 10.10.67.12 +add test 10.10.67.120 +add test 10.10.67.121 +add test 10.10.67.122 +add test 10.10.67.123 +add test 10.10.67.124 +add test 10.10.67.125 +add test 10.10.67.126 +add test 10.10.67.127 +add test 10.10.67.128 +add test 10.10.67.129 +add test 10.10.67.13 +add test 10.10.67.130 +add test 10.10.67.131 +add test 10.10.67.132 +add test 10.10.67.133 +add test 10.10.67.134 +add test 10.10.67.135 +add test 10.10.67.136 +add test 10.10.67.137 +add test 10.10.67.138 +add test 10.10.67.139 +add test 10.10.67.14 +add test 10.10.67.140 +add test 10.10.67.141 +add test 10.10.67.142 +add test 10.10.67.143 +add test 10.10.67.144 +add test 10.10.67.145 +add test 10.10.67.146 +add test 10.10.67.147 +add test 10.10.67.148 +add test 10.10.67.149 +add test 10.10.67.15 +add test 10.10.67.150 +add test 10.10.67.151 +add test 10.10.67.152 +add test 10.10.67.153 +add test 10.10.67.154 +add test 10.10.67.155 +add test 10.10.67.156 +add test 10.10.67.157 +add test 10.10.67.158 +add test 10.10.67.159 +add test 10.10.67.16 +add test 10.10.67.160 +add test 10.10.67.161 +add test 10.10.67.162 +add test 10.10.67.163 +add test 10.10.67.164 +add test 10.10.67.165 +add test 10.10.67.166 +add test 10.10.67.167 +add test 10.10.67.168 +add test 10.10.67.169 +add test 10.10.67.17 +add test 10.10.67.170 +add test 10.10.67.171 +add test 10.10.67.172 +add test 10.10.67.173 +add test 10.10.67.174 +add test 10.10.67.175 +add test 10.10.67.176 +add test 10.10.67.177 +add test 10.10.67.178 +add test 10.10.67.179 +add test 10.10.67.18 +add test 10.10.67.180 +add test 10.10.67.181 +add test 10.10.67.182 +add test 10.10.67.183 +add test 10.10.67.184 +add test 10.10.67.185 +add test 10.10.67.186 +add test 10.10.67.187 +add test 10.10.67.188 +add test 10.10.67.189 +add test 10.10.67.19 +add test 10.10.67.190 +add test 10.10.67.191 +add test 10.10.67.192 +add test 10.10.67.193 +add test 10.10.67.194 +add test 10.10.67.195 +add test 10.10.67.196 +add test 10.10.67.197 +add test 10.10.67.198 +add test 10.10.67.199 +add test 10.10.67.2 +add test 10.10.67.20 +add test 10.10.67.200 +add test 10.10.67.201 +add test 10.10.67.202 +add test 10.10.67.203 +add test 10.10.67.204 +add test 10.10.67.205 +add test 10.10.67.206 +add test 10.10.67.207 +add test 10.10.67.208 +add test 10.10.67.209 +add test 10.10.67.21 +add test 10.10.67.210 +add test 10.10.67.211 +add test 10.10.67.212 +add test 10.10.67.213 +add test 10.10.67.214 +add test 10.10.67.215 +add test 10.10.67.216 +add test 10.10.67.217 +add test 10.10.67.218 +add test 10.10.67.219 +add test 10.10.67.22 +add test 10.10.67.220 +add test 10.10.67.221 +add test 10.10.67.222 +add test 10.10.67.223 +add test 10.10.67.224 +add test 10.10.67.225 +add test 10.10.67.226 +add test 10.10.67.227 +add test 10.10.67.228 +add test 10.10.67.229 +add test 10.10.67.23 +add test 10.10.67.230 +add test 10.10.67.231 +add test 10.10.67.232 +add test 10.10.67.233 +add test 10.10.67.234 +add test 10.10.67.235 +add test 10.10.67.236 +add test 10.10.67.237 +add test 10.10.67.238 +add test 10.10.67.239 +add test 10.10.67.24 +add test 10.10.67.240 +add test 10.10.67.241 +add test 10.10.67.242 +add test 10.10.67.243 +add test 10.10.67.244 +add test 10.10.67.245 +add test 10.10.67.246 +add test 10.10.67.247 +add test 10.10.67.248 +add test 10.10.67.249 +add test 10.10.67.25 +add test 10.10.67.250 +add test 10.10.67.251 +add test 10.10.67.252 +add test 10.10.67.253 +add test 10.10.67.254 +add test 10.10.67.255 +add test 10.10.67.26 +add test 10.10.67.27 +add test 10.10.67.28 +add test 10.10.67.29 +add test 10.10.67.3 +add test 10.10.67.30 +add test 10.10.67.31 +add test 10.10.67.32 +add test 10.10.67.33 +add test 10.10.67.34 +add test 10.10.67.35 +add test 10.10.67.36 +add test 10.10.67.37 +add test 10.10.67.38 +add test 10.10.67.39 +add test 10.10.67.4 +add test 10.10.67.40 +add test 10.10.67.41 +add test 10.10.67.42 +add test 10.10.67.43 +add test 10.10.67.44 +add test 10.10.67.45 +add test 10.10.67.46 +add test 10.10.67.47 +add test 10.10.67.48 +add test 10.10.67.49 +add test 10.10.67.5 +add test 10.10.67.50 +add test 10.10.67.51 +add test 10.10.67.52 +add test 10.10.67.53 +add test 10.10.67.54 +add test 10.10.67.55 +add test 10.10.67.56 +add test 10.10.67.57 +add test 10.10.67.58 +add test 10.10.67.59 +add test 10.10.67.6 +add test 10.10.67.60 +add test 10.10.67.61 +add test 10.10.67.62 +add test 10.10.67.63 +add test 10.10.67.64 +add test 10.10.67.65 +add test 10.10.67.66 +add test 10.10.67.67 +add test 10.10.67.68 +add test 10.10.67.69 +add test 10.10.67.7 +add test 10.10.67.70 +add test 10.10.67.71 +add test 10.10.67.72 +add test 10.10.67.73 +add test 10.10.67.74 +add test 10.10.67.75 +add test 10.10.67.76 +add test 10.10.67.77 +add test 10.10.67.78 +add test 10.10.67.79 +add test 10.10.67.8 +add test 10.10.67.80 +add test 10.10.67.81 +add test 10.10.67.82 +add test 10.10.67.83 +add test 10.10.67.84 +add test 10.10.67.85 +add test 10.10.67.86 +add test 10.10.67.87 +add test 10.10.67.88 +add test 10.10.67.89 +add test 10.10.67.9 +add test 10.10.67.90 +add test 10.10.67.91 +add test 10.10.67.92 +add test 10.10.67.93 +add test 10.10.67.94 +add test 10.10.67.95 +add test 10.10.67.96 +add test 10.10.67.97 +add test 10.10.67.98 +add test 10.10.67.99 +add test 10.10.68.0 +add test 10.10.68.1 +add test 10.10.68.10 +add test 10.10.68.100 +add test 10.10.68.101 +add test 10.10.68.102 +add test 10.10.68.103 +add test 10.10.68.104 +add test 10.10.68.105 +add test 10.10.68.106 +add test 10.10.68.107 +add test 10.10.68.108 +add test 10.10.68.109 +add test 10.10.68.11 +add test 10.10.68.110 +add test 10.10.68.111 +add test 10.10.68.112 +add test 10.10.68.113 +add test 10.10.68.114 +add test 10.10.68.115 +add test 10.10.68.116 +add test 10.10.68.117 +add test 10.10.68.118 +add test 10.10.68.119 +add test 10.10.68.12 +add test 10.10.68.120 +add test 10.10.68.121 +add test 10.10.68.122 +add test 10.10.68.123 +add test 10.10.68.124 +add test 10.10.68.125 +add test 10.10.68.126 +add test 10.10.68.127 +add test 10.10.68.128 +add test 10.10.68.129 +add test 10.10.68.13 +add test 10.10.68.130 +add test 10.10.68.131 +add test 10.10.68.132 +add test 10.10.68.133 +add test 10.10.68.134 +add test 10.10.68.135 +add test 10.10.68.136 +add test 10.10.68.137 +add test 10.10.68.138 +add test 10.10.68.139 +add test 10.10.68.14 +add test 10.10.68.140 +add test 10.10.68.141 +add test 10.10.68.142 +add test 10.10.68.143 +add test 10.10.68.144 +add test 10.10.68.145 +add test 10.10.68.146 +add test 10.10.68.147 +add test 10.10.68.148 +add test 10.10.68.149 +add test 10.10.68.15 +add test 10.10.68.150 +add test 10.10.68.151 +add test 10.10.68.152 +add test 10.10.68.153 +add test 10.10.68.154 +add test 10.10.68.155 +add test 10.10.68.156 +add test 10.10.68.157 +add test 10.10.68.158 +add test 10.10.68.159 +add test 10.10.68.16 +add test 10.10.68.160 +add test 10.10.68.161 +add test 10.10.68.162 +add test 10.10.68.163 +add test 10.10.68.164 +add test 10.10.68.165 +add test 10.10.68.166 +add test 10.10.68.167 +add test 10.10.68.168 +add test 10.10.68.169 +add test 10.10.68.17 +add test 10.10.68.170 +add test 10.10.68.171 +add test 10.10.68.172 +add test 10.10.68.173 +add test 10.10.68.174 +add test 10.10.68.175 +add test 10.10.68.176 +add test 10.10.68.177 +add test 10.10.68.178 +add test 10.10.68.179 +add test 10.10.68.18 +add test 10.10.68.180 +add test 10.10.68.181 +add test 10.10.68.182 +add test 10.10.68.183 +add test 10.10.68.184 +add test 10.10.68.185 +add test 10.10.68.186 +add test 10.10.68.187 +add test 10.10.68.188 +add test 10.10.68.189 +add test 10.10.68.19 +add test 10.10.68.190 +add test 10.10.68.191 +add test 10.10.68.192 +add test 10.10.68.193 +add test 10.10.68.194 +add test 10.10.68.195 +add test 10.10.68.196 +add test 10.10.68.197 +add test 10.10.68.198 +add test 10.10.68.199 +add test 10.10.68.2 +add test 10.10.68.20 +add test 10.10.68.200 +add test 10.10.68.201 +add test 10.10.68.202 +add test 10.10.68.203 +add test 10.10.68.204 +add test 10.10.68.205 +add test 10.10.68.206 +add test 10.10.68.207 +add test 10.10.68.208 +add test 10.10.68.209 +add test 10.10.68.21 +add test 10.10.68.210 +add test 10.10.68.211 +add test 10.10.68.212 +add test 10.10.68.213 +add test 10.10.68.214 +add test 10.10.68.215 +add test 10.10.68.216 +add test 10.10.68.217 +add test 10.10.68.218 +add test 10.10.68.219 +add test 10.10.68.22 +add test 10.10.68.220 +add test 10.10.68.221 +add test 10.10.68.222 +add test 10.10.68.223 +add test 10.10.68.224 +add test 10.10.68.225 +add test 10.10.68.226 +add test 10.10.68.227 +add test 10.10.68.228 +add test 10.10.68.229 +add test 10.10.68.23 +add test 10.10.68.230 +add test 10.10.68.231 +add test 10.10.68.232 +add test 10.10.68.233 +add test 10.10.68.234 +add test 10.10.68.235 +add test 10.10.68.236 +add test 10.10.68.237 +add test 10.10.68.238 +add test 10.10.68.239 +add test 10.10.68.24 +add test 10.10.68.240 +add test 10.10.68.241 +add test 10.10.68.242 +add test 10.10.68.243 +add test 10.10.68.244 +add test 10.10.68.245 +add test 10.10.68.246 +add test 10.10.68.247 +add test 10.10.68.248 +add test 10.10.68.249 +add test 10.10.68.25 +add test 10.10.68.250 +add test 10.10.68.251 +add test 10.10.68.252 +add test 10.10.68.253 +add test 10.10.68.254 +add test 10.10.68.255 +add test 10.10.68.26 +add test 10.10.68.27 +add test 10.10.68.28 +add test 10.10.68.29 +add test 10.10.68.3 +add test 10.10.68.30 +add test 10.10.68.31 +add test 10.10.68.32 +add test 10.10.68.33 +add test 10.10.68.34 +add test 10.10.68.35 +add test 10.10.68.36 +add test 10.10.68.37 +add test 10.10.68.38 +add test 10.10.68.39 +add test 10.10.68.4 +add test 10.10.68.40 +add test 10.10.68.41 +add test 10.10.68.42 +add test 10.10.68.43 +add test 10.10.68.44 +add test 10.10.68.45 +add test 10.10.68.46 +add test 10.10.68.47 +add test 10.10.68.48 +add test 10.10.68.49 +add test 10.10.68.5 +add test 10.10.68.50 +add test 10.10.68.51 +add test 10.10.68.52 +add test 10.10.68.53 +add test 10.10.68.54 +add test 10.10.68.55 +add test 10.10.68.56 +add test 10.10.68.57 +add test 10.10.68.58 +add test 10.10.68.59 +add test 10.10.68.6 +add test 10.10.68.60 +add test 10.10.68.61 +add test 10.10.68.62 +add test 10.10.68.63 +add test 10.10.68.64 +add test 10.10.68.65 +add test 10.10.68.66 +add test 10.10.68.67 +add test 10.10.68.68 +add test 10.10.68.69 +add test 10.10.68.7 +add test 10.10.68.70 +add test 10.10.68.71 +add test 10.10.68.72 +add test 10.10.68.73 +add test 10.10.68.74 +add test 10.10.68.75 +add test 10.10.68.76 +add test 10.10.68.77 +add test 10.10.68.78 +add test 10.10.68.79 +add test 10.10.68.8 +add test 10.10.68.80 +add test 10.10.68.81 +add test 10.10.68.82 +add test 10.10.68.83 +add test 10.10.68.84 +add test 10.10.68.85 +add test 10.10.68.86 +add test 10.10.68.87 +add test 10.10.68.88 +add test 10.10.68.89 +add test 10.10.68.9 +add test 10.10.68.90 +add test 10.10.68.91 +add test 10.10.68.92 +add test 10.10.68.93 +add test 10.10.68.94 +add test 10.10.68.95 +add test 10.10.68.96 +add test 10.10.68.97 +add test 10.10.68.98 +add test 10.10.68.99 +add test 10.10.69.0 +add test 10.10.69.1 +add test 10.10.69.10 +add test 10.10.69.100 +add test 10.10.69.101 +add test 10.10.69.102 +add test 10.10.69.103 +add test 10.10.69.104 +add test 10.10.69.105 +add test 10.10.69.106 +add test 10.10.69.107 +add test 10.10.69.108 +add test 10.10.69.109 +add test 10.10.69.11 +add test 10.10.69.110 +add test 10.10.69.111 +add test 10.10.69.112 +add test 10.10.69.113 +add test 10.10.69.114 +add test 10.10.69.115 +add test 10.10.69.116 +add test 10.10.69.117 +add test 10.10.69.118 +add test 10.10.69.119 +add test 10.10.69.12 +add test 10.10.69.120 +add test 10.10.69.121 +add test 10.10.69.122 +add test 10.10.69.123 +add test 10.10.69.124 +add test 10.10.69.125 +add test 10.10.69.126 +add test 10.10.69.127 +add test 10.10.69.128 +add test 10.10.69.129 +add test 10.10.69.13 +add test 10.10.69.130 +add test 10.10.69.131 +add test 10.10.69.132 +add test 10.10.69.133 +add test 10.10.69.134 +add test 10.10.69.135 +add test 10.10.69.136 +add test 10.10.69.137 +add test 10.10.69.138 +add test 10.10.69.139 +add test 10.10.69.14 +add test 10.10.69.140 +add test 10.10.69.141 +add test 10.10.69.142 +add test 10.10.69.143 +add test 10.10.69.144 +add test 10.10.69.145 +add test 10.10.69.146 +add test 10.10.69.147 +add test 10.10.69.148 +add test 10.10.69.149 +add test 10.10.69.15 +add test 10.10.69.150 +add test 10.10.69.151 +add test 10.10.69.152 +add test 10.10.69.153 +add test 10.10.69.154 +add test 10.10.69.155 +add test 10.10.69.156 +add test 10.10.69.157 +add test 10.10.69.158 +add test 10.10.69.159 +add test 10.10.69.16 +add test 10.10.69.160 +add test 10.10.69.161 +add test 10.10.69.162 +add test 10.10.69.163 +add test 10.10.69.164 +add test 10.10.69.165 +add test 10.10.69.166 +add test 10.10.69.167 +add test 10.10.69.168 +add test 10.10.69.169 +add test 10.10.69.17 +add test 10.10.69.170 +add test 10.10.69.171 +add test 10.10.69.172 +add test 10.10.69.173 +add test 10.10.69.174 +add test 10.10.69.175 +add test 10.10.69.176 +add test 10.10.69.177 +add test 10.10.69.178 +add test 10.10.69.179 +add test 10.10.69.18 +add test 10.10.69.180 +add test 10.10.69.181 +add test 10.10.69.182 +add test 10.10.69.183 +add test 10.10.69.184 +add test 10.10.69.185 +add test 10.10.69.186 +add test 10.10.69.187 +add test 10.10.69.188 +add test 10.10.69.189 +add test 10.10.69.19 +add test 10.10.69.190 +add test 10.10.69.191 +add test 10.10.69.192 +add test 10.10.69.193 +add test 10.10.69.194 +add test 10.10.69.195 +add test 10.10.69.196 +add test 10.10.69.197 +add test 10.10.69.198 +add test 10.10.69.199 +add test 10.10.69.2 +add test 10.10.69.20 +add test 10.10.69.200 +add test 10.10.69.201 +add test 10.10.69.202 +add test 10.10.69.203 +add test 10.10.69.204 +add test 10.10.69.205 +add test 10.10.69.206 +add test 10.10.69.207 +add test 10.10.69.208 +add test 10.10.69.209 +add test 10.10.69.21 +add test 10.10.69.210 +add test 10.10.69.211 +add test 10.10.69.212 +add test 10.10.69.213 +add test 10.10.69.214 +add test 10.10.69.215 +add test 10.10.69.216 +add test 10.10.69.217 +add test 10.10.69.218 +add test 10.10.69.219 +add test 10.10.69.22 +add test 10.10.69.220 +add test 10.10.69.221 +add test 10.10.69.222 +add test 10.10.69.223 +add test 10.10.69.224 +add test 10.10.69.225 +add test 10.10.69.226 +add test 10.10.69.227 +add test 10.10.69.228 +add test 10.10.69.229 +add test 10.10.69.23 +add test 10.10.69.230 +add test 10.10.69.231 +add test 10.10.69.232 +add test 10.10.69.233 +add test 10.10.69.234 +add test 10.10.69.235 +add test 10.10.69.236 +add test 10.10.69.237 +add test 10.10.69.238 +add test 10.10.69.239 +add test 10.10.69.24 +add test 10.10.69.240 +add test 10.10.69.241 +add test 10.10.69.242 +add test 10.10.69.243 +add test 10.10.69.244 +add test 10.10.69.245 +add test 10.10.69.246 +add test 10.10.69.247 +add test 10.10.69.248 +add test 10.10.69.249 +add test 10.10.69.25 +add test 10.10.69.250 +add test 10.10.69.251 +add test 10.10.69.252 +add test 10.10.69.253 +add test 10.10.69.254 +add test 10.10.69.255 +add test 10.10.69.26 +add test 10.10.69.27 +add test 10.10.69.28 +add test 10.10.69.29 +add test 10.10.69.3 +add test 10.10.69.30 +add test 10.10.69.31 +add test 10.10.69.32 +add test 10.10.69.33 +add test 10.10.69.34 +add test 10.10.69.35 +add test 10.10.69.36 +add test 10.10.69.37 +add test 10.10.69.38 +add test 10.10.69.39 +add test 10.10.69.4 +add test 10.10.69.40 +add test 10.10.69.41 +add test 10.10.69.42 +add test 10.10.69.43 +add test 10.10.69.44 +add test 10.10.69.45 +add test 10.10.69.46 +add test 10.10.69.47 +add test 10.10.69.48 +add test 10.10.69.49 +add test 10.10.69.5 +add test 10.10.69.50 +add test 10.10.69.51 +add test 10.10.69.52 +add test 10.10.69.53 +add test 10.10.69.54 +add test 10.10.69.55 +add test 10.10.69.56 +add test 10.10.69.57 +add test 10.10.69.58 +add test 10.10.69.59 +add test 10.10.69.6 +add test 10.10.69.60 +add test 10.10.69.61 +add test 10.10.69.62 +add test 10.10.69.63 +add test 10.10.69.64 +add test 10.10.69.65 +add test 10.10.69.66 +add test 10.10.69.67 +add test 10.10.69.68 +add test 10.10.69.69 +add test 10.10.69.7 +add test 10.10.69.70 +add test 10.10.69.71 +add test 10.10.69.72 +add test 10.10.69.73 +add test 10.10.69.74 +add test 10.10.69.75 +add test 10.10.69.76 +add test 10.10.69.77 +add test 10.10.69.78 +add test 10.10.69.79 +add test 10.10.69.8 +add test 10.10.69.80 +add test 10.10.69.81 +add test 10.10.69.82 +add test 10.10.69.83 +add test 10.10.69.84 +add test 10.10.69.85 +add test 10.10.69.86 +add test 10.10.69.87 +add test 10.10.69.88 +add test 10.10.69.89 +add test 10.10.69.9 +add test 10.10.69.90 +add test 10.10.69.91 +add test 10.10.69.92 +add test 10.10.69.93 +add test 10.10.69.94 +add test 10.10.69.95 +add test 10.10.69.96 +add test 10.10.69.97 +add test 10.10.69.98 +add test 10.10.69.99 +add test 10.10.7.0 +add test 10.10.7.1 +add test 10.10.7.10 +add test 10.10.7.100 +add test 10.10.7.101 +add test 10.10.7.102 +add test 10.10.7.103 +add test 10.10.7.104 +add test 10.10.7.105 +add test 10.10.7.106 +add test 10.10.7.107 +add test 10.10.7.108 +add test 10.10.7.109 +add test 10.10.7.11 +add test 10.10.7.110 +add test 10.10.7.111 +add test 10.10.7.112 +add test 10.10.7.113 +add test 10.10.7.114 +add test 10.10.7.115 +add test 10.10.7.116 +add test 10.10.7.117 +add test 10.10.7.118 +add test 10.10.7.119 +add test 10.10.7.12 +add test 10.10.7.120 +add test 10.10.7.121 +add test 10.10.7.122 +add test 10.10.7.123 +add test 10.10.7.124 +add test 10.10.7.125 +add test 10.10.7.126 +add test 10.10.7.127 +add test 10.10.7.128 +add test 10.10.7.129 +add test 10.10.7.13 +add test 10.10.7.130 +add test 10.10.7.131 +add test 10.10.7.132 +add test 10.10.7.133 +add test 10.10.7.134 +add test 10.10.7.135 +add test 10.10.7.136 +add test 10.10.7.137 +add test 10.10.7.138 +add test 10.10.7.139 +add test 10.10.7.14 +add test 10.10.7.140 +add test 10.10.7.141 +add test 10.10.7.142 +add test 10.10.7.143 +add test 10.10.7.144 +add test 10.10.7.145 +add test 10.10.7.146 +add test 10.10.7.147 +add test 10.10.7.148 +add test 10.10.7.149 +add test 10.10.7.15 +add test 10.10.7.150 +add test 10.10.7.151 +add test 10.10.7.152 +add test 10.10.7.153 +add test 10.10.7.154 +add test 10.10.7.155 +add test 10.10.7.156 +add test 10.10.7.157 +add test 10.10.7.158 +add test 10.10.7.159 +add test 10.10.7.16 +add test 10.10.7.160 +add test 10.10.7.161 +add test 10.10.7.162 +add test 10.10.7.163 +add test 10.10.7.164 +add test 10.10.7.165 +add test 10.10.7.166 +add test 10.10.7.167 +add test 10.10.7.168 +add test 10.10.7.169 +add test 10.10.7.17 +add test 10.10.7.170 +add test 10.10.7.171 +add test 10.10.7.172 +add test 10.10.7.173 +add test 10.10.7.174 +add test 10.10.7.175 +add test 10.10.7.176 +add test 10.10.7.177 +add test 10.10.7.178 +add test 10.10.7.179 +add test 10.10.7.18 +add test 10.10.7.180 +add test 10.10.7.181 +add test 10.10.7.182 +add test 10.10.7.183 +add test 10.10.7.184 +add test 10.10.7.185 +add test 10.10.7.186 +add test 10.10.7.187 +add test 10.10.7.188 +add test 10.10.7.189 +add test 10.10.7.19 +add test 10.10.7.190 +add test 10.10.7.191 +add test 10.10.7.192 +add test 10.10.7.193 +add test 10.10.7.194 +add test 10.10.7.195 +add test 10.10.7.196 +add test 10.10.7.197 +add test 10.10.7.198 +add test 10.10.7.199 +add test 10.10.7.2 +add test 10.10.7.20 +add test 10.10.7.200 +add test 10.10.7.201 +add test 10.10.7.202 +add test 10.10.7.203 +add test 10.10.7.204 +add test 10.10.7.205 +add test 10.10.7.206 +add test 10.10.7.207 +add test 10.10.7.208 +add test 10.10.7.209 +add test 10.10.7.21 +add test 10.10.7.210 +add test 10.10.7.211 +add test 10.10.7.212 +add test 10.10.7.213 +add test 10.10.7.214 +add test 10.10.7.215 +add test 10.10.7.216 +add test 10.10.7.217 +add test 10.10.7.218 +add test 10.10.7.219 +add test 10.10.7.22 +add test 10.10.7.220 +add test 10.10.7.221 +add test 10.10.7.222 +add test 10.10.7.223 +add test 10.10.7.224 +add test 10.10.7.225 +add test 10.10.7.226 +add test 10.10.7.227 +add test 10.10.7.228 +add test 10.10.7.229 +add test 10.10.7.23 +add test 10.10.7.230 +add test 10.10.7.231 +add test 10.10.7.232 +add test 10.10.7.233 +add test 10.10.7.234 +add test 10.10.7.235 +add test 10.10.7.236 +add test 10.10.7.237 +add test 10.10.7.238 +add test 10.10.7.239 +add test 10.10.7.24 +add test 10.10.7.240 +add test 10.10.7.241 +add test 10.10.7.242 +add test 10.10.7.243 +add test 10.10.7.244 +add test 10.10.7.245 +add test 10.10.7.246 +add test 10.10.7.247 +add test 10.10.7.248 +add test 10.10.7.249 +add test 10.10.7.25 +add test 10.10.7.250 +add test 10.10.7.251 +add test 10.10.7.252 +add test 10.10.7.253 +add test 10.10.7.254 +add test 10.10.7.255 +add test 10.10.7.26 +add test 10.10.7.27 +add test 10.10.7.28 +add test 10.10.7.29 +add test 10.10.7.3 +add test 10.10.7.30 +add test 10.10.7.31 +add test 10.10.7.32 +add test 10.10.7.33 +add test 10.10.7.34 +add test 10.10.7.35 +add test 10.10.7.36 +add test 10.10.7.37 +add test 10.10.7.38 +add test 10.10.7.39 +add test 10.10.7.4 +add test 10.10.7.40 +add test 10.10.7.41 +add test 10.10.7.42 +add test 10.10.7.43 +add test 10.10.7.44 +add test 10.10.7.45 +add test 10.10.7.46 +add test 10.10.7.47 +add test 10.10.7.48 +add test 10.10.7.49 +add test 10.10.7.5 +add test 10.10.7.50 +add test 10.10.7.51 +add test 10.10.7.52 +add test 10.10.7.53 +add test 10.10.7.54 +add test 10.10.7.55 +add test 10.10.7.56 +add test 10.10.7.57 +add test 10.10.7.58 +add test 10.10.7.59 +add test 10.10.7.6 +add test 10.10.7.60 +add test 10.10.7.61 +add test 10.10.7.62 +add test 10.10.7.63 +add test 10.10.7.64 +add test 10.10.7.65 +add test 10.10.7.66 +add test 10.10.7.67 +add test 10.10.7.68 +add test 10.10.7.69 +add test 10.10.7.7 +add test 10.10.7.70 +add test 10.10.7.71 +add test 10.10.7.72 +add test 10.10.7.73 +add test 10.10.7.74 +add test 10.10.7.75 +add test 10.10.7.76 +add test 10.10.7.77 +add test 10.10.7.78 +add test 10.10.7.79 +add test 10.10.7.8 +add test 10.10.7.80 +add test 10.10.7.81 +add test 10.10.7.82 +add test 10.10.7.83 +add test 10.10.7.84 +add test 10.10.7.85 +add test 10.10.7.86 +add test 10.10.7.87 +add test 10.10.7.88 +add test 10.10.7.89 +add test 10.10.7.9 +add test 10.10.7.90 +add test 10.10.7.91 +add test 10.10.7.92 +add test 10.10.7.93 +add test 10.10.7.94 +add test 10.10.7.95 +add test 10.10.7.96 +add test 10.10.7.97 +add test 10.10.7.98 +add test 10.10.7.99 +add test 10.10.70.0 +add test 10.10.70.1 +add test 10.10.70.10 +add test 10.10.70.100 +add test 10.10.70.101 +add test 10.10.70.102 +add test 10.10.70.103 +add test 10.10.70.104 +add test 10.10.70.105 +add test 10.10.70.106 +add test 10.10.70.107 +add test 10.10.70.108 +add test 10.10.70.109 +add test 10.10.70.11 +add test 10.10.70.110 +add test 10.10.70.111 +add test 10.10.70.112 +add test 10.10.70.113 +add test 10.10.70.114 +add test 10.10.70.115 +add test 10.10.70.116 +add test 10.10.70.117 +add test 10.10.70.118 +add test 10.10.70.119 +add test 10.10.70.12 +add test 10.10.70.120 +add test 10.10.70.121 +add test 10.10.70.122 +add test 10.10.70.123 +add test 10.10.70.124 +add test 10.10.70.125 +add test 10.10.70.126 +add test 10.10.70.127 +add test 10.10.70.128 +add test 10.10.70.129 +add test 10.10.70.13 +add test 10.10.70.130 +add test 10.10.70.131 +add test 10.10.70.132 +add test 10.10.70.133 +add test 10.10.70.134 +add test 10.10.70.135 +add test 10.10.70.136 +add test 10.10.70.137 +add test 10.10.70.138 +add test 10.10.70.139 +add test 10.10.70.14 +add test 10.10.70.140 +add test 10.10.70.141 +add test 10.10.70.142 +add test 10.10.70.143 +add test 10.10.70.144 +add test 10.10.70.145 +add test 10.10.70.146 +add test 10.10.70.147 +add test 10.10.70.148 +add test 10.10.70.149 +add test 10.10.70.15 +add test 10.10.70.150 +add test 10.10.70.151 +add test 10.10.70.152 +add test 10.10.70.153 +add test 10.10.70.154 +add test 10.10.70.155 +add test 10.10.70.156 +add test 10.10.70.157 +add test 10.10.70.158 +add test 10.10.70.159 +add test 10.10.70.16 +add test 10.10.70.160 +add test 10.10.70.161 +add test 10.10.70.162 +add test 10.10.70.163 +add test 10.10.70.164 +add test 10.10.70.165 +add test 10.10.70.166 +add test 10.10.70.167 +add test 10.10.70.168 +add test 10.10.70.169 +add test 10.10.70.17 +add test 10.10.70.170 +add test 10.10.70.171 +add test 10.10.70.172 +add test 10.10.70.173 +add test 10.10.70.174 +add test 10.10.70.175 +add test 10.10.70.176 +add test 10.10.70.177 +add test 10.10.70.178 +add test 10.10.70.179 +add test 10.10.70.18 +add test 10.10.70.180 +add test 10.10.70.181 +add test 10.10.70.182 +add test 10.10.70.183 +add test 10.10.70.184 +add test 10.10.70.185 +add test 10.10.70.186 +add test 10.10.70.187 +add test 10.10.70.188 +add test 10.10.70.189 +add test 10.10.70.19 +add test 10.10.70.190 +add test 10.10.70.191 +add test 10.10.70.192 +add test 10.10.70.193 +add test 10.10.70.194 +add test 10.10.70.195 +add test 10.10.70.196 +add test 10.10.70.197 +add test 10.10.70.198 +add test 10.10.70.199 +add test 10.10.70.2 +add test 10.10.70.20 +add test 10.10.70.200 +add test 10.10.70.201 +add test 10.10.70.202 +add test 10.10.70.203 +add test 10.10.70.204 +add test 10.10.70.205 +add test 10.10.70.206 +add test 10.10.70.207 +add test 10.10.70.208 +add test 10.10.70.209 +add test 10.10.70.21 +add test 10.10.70.210 +add test 10.10.70.211 +add test 10.10.70.212 +add test 10.10.70.213 +add test 10.10.70.214 +add test 10.10.70.215 +add test 10.10.70.216 +add test 10.10.70.217 +add test 10.10.70.218 +add test 10.10.70.219 +add test 10.10.70.22 +add test 10.10.70.220 +add test 10.10.70.221 +add test 10.10.70.222 +add test 10.10.70.223 +add test 10.10.70.224 +add test 10.10.70.225 +add test 10.10.70.226 +add test 10.10.70.227 +add test 10.10.70.228 +add test 10.10.70.229 +add test 10.10.70.23 +add test 10.10.70.230 +add test 10.10.70.231 +add test 10.10.70.232 +add test 10.10.70.233 +add test 10.10.70.234 +add test 10.10.70.235 +add test 10.10.70.236 +add test 10.10.70.237 +add test 10.10.70.238 +add test 10.10.70.239 +add test 10.10.70.24 +add test 10.10.70.240 +add test 10.10.70.241 +add test 10.10.70.242 +add test 10.10.70.243 +add test 10.10.70.244 +add test 10.10.70.245 +add test 10.10.70.246 +add test 10.10.70.247 +add test 10.10.70.248 +add test 10.10.70.249 +add test 10.10.70.25 +add test 10.10.70.250 +add test 10.10.70.251 +add test 10.10.70.252 +add test 10.10.70.253 +add test 10.10.70.254 +add test 10.10.70.255 +add test 10.10.70.26 +add test 10.10.70.27 +add test 10.10.70.28 +add test 10.10.70.29 +add test 10.10.70.3 +add test 10.10.70.30 +add test 10.10.70.31 +add test 10.10.70.32 +add test 10.10.70.33 +add test 10.10.70.34 +add test 10.10.70.35 +add test 10.10.70.36 +add test 10.10.70.37 +add test 10.10.70.38 +add test 10.10.70.39 +add test 10.10.70.4 +add test 10.10.70.40 +add test 10.10.70.41 +add test 10.10.70.42 +add test 10.10.70.43 +add test 10.10.70.44 +add test 10.10.70.45 +add test 10.10.70.46 +add test 10.10.70.47 +add test 10.10.70.48 +add test 10.10.70.49 +add test 10.10.70.5 +add test 10.10.70.50 +add test 10.10.70.51 +add test 10.10.70.52 +add test 10.10.70.53 +add test 10.10.70.54 +add test 10.10.70.55 +add test 10.10.70.56 +add test 10.10.70.57 +add test 10.10.70.58 +add test 10.10.70.59 +add test 10.10.70.6 +add test 10.10.70.60 +add test 10.10.70.61 +add test 10.10.70.62 +add test 10.10.70.63 +add test 10.10.70.64 +add test 10.10.70.65 +add test 10.10.70.66 +add test 10.10.70.67 +add test 10.10.70.68 +add test 10.10.70.69 +add test 10.10.70.7 +add test 10.10.70.70 +add test 10.10.70.71 +add test 10.10.70.72 +add test 10.10.70.73 +add test 10.10.70.74 +add test 10.10.70.75 +add test 10.10.70.76 +add test 10.10.70.77 +add test 10.10.70.78 +add test 10.10.70.79 +add test 10.10.70.8 +add test 10.10.70.80 +add test 10.10.70.81 +add test 10.10.70.82 +add test 10.10.70.83 +add test 10.10.70.84 +add test 10.10.70.85 +add test 10.10.70.86 +add test 10.10.70.87 +add test 10.10.70.88 +add test 10.10.70.89 +add test 10.10.70.9 +add test 10.10.70.90 +add test 10.10.70.91 +add test 10.10.70.92 +add test 10.10.70.93 +add test 10.10.70.94 +add test 10.10.70.95 +add test 10.10.70.96 +add test 10.10.70.97 +add test 10.10.70.98 +add test 10.10.70.99 +add test 10.10.71.0 +add test 10.10.71.1 +add test 10.10.71.10 +add test 10.10.71.100 +add test 10.10.71.101 +add test 10.10.71.102 +add test 10.10.71.103 +add test 10.10.71.104 +add test 10.10.71.105 +add test 10.10.71.106 +add test 10.10.71.107 +add test 10.10.71.108 +add test 10.10.71.109 +add test 10.10.71.11 +add test 10.10.71.110 +add test 10.10.71.111 +add test 10.10.71.112 +add test 10.10.71.113 +add test 10.10.71.114 +add test 10.10.71.115 +add test 10.10.71.116 +add test 10.10.71.117 +add test 10.10.71.118 +add test 10.10.71.119 +add test 10.10.71.12 +add test 10.10.71.120 +add test 10.10.71.121 +add test 10.10.71.122 +add test 10.10.71.123 +add test 10.10.71.124 +add test 10.10.71.125 +add test 10.10.71.126 +add test 10.10.71.127 +add test 10.10.71.128 +add test 10.10.71.129 +add test 10.10.71.13 +add test 10.10.71.130 +add test 10.10.71.131 +add test 10.10.71.132 +add test 10.10.71.133 +add test 10.10.71.134 +add test 10.10.71.135 +add test 10.10.71.136 +add test 10.10.71.137 +add test 10.10.71.138 +add test 10.10.71.139 +add test 10.10.71.14 +add test 10.10.71.140 +add test 10.10.71.141 +add test 10.10.71.142 +add test 10.10.71.143 +add test 10.10.71.144 +add test 10.10.71.145 +add test 10.10.71.146 +add test 10.10.71.147 +add test 10.10.71.148 +add test 10.10.71.149 +add test 10.10.71.15 +add test 10.10.71.150 +add test 10.10.71.151 +add test 10.10.71.152 +add test 10.10.71.153 +add test 10.10.71.154 +add test 10.10.71.155 +add test 10.10.71.156 +add test 10.10.71.157 +add test 10.10.71.158 +add test 10.10.71.159 +add test 10.10.71.16 +add test 10.10.71.160 +add test 10.10.71.161 +add test 10.10.71.162 +add test 10.10.71.163 +add test 10.10.71.164 +add test 10.10.71.165 +add test 10.10.71.166 +add test 10.10.71.167 +add test 10.10.71.168 +add test 10.10.71.169 +add test 10.10.71.17 +add test 10.10.71.170 +add test 10.10.71.171 +add test 10.10.71.172 +add test 10.10.71.173 +add test 10.10.71.174 +add test 10.10.71.175 +add test 10.10.71.176 +add test 10.10.71.177 +add test 10.10.71.178 +add test 10.10.71.179 +add test 10.10.71.18 +add test 10.10.71.180 +add test 10.10.71.181 +add test 10.10.71.182 +add test 10.10.71.183 +add test 10.10.71.184 +add test 10.10.71.185 +add test 10.10.71.186 +add test 10.10.71.187 +add test 10.10.71.188 +add test 10.10.71.189 +add test 10.10.71.19 +add test 10.10.71.190 +add test 10.10.71.191 +add test 10.10.71.192 +add test 10.10.71.193 +add test 10.10.71.194 +add test 10.10.71.195 +add test 10.10.71.196 +add test 10.10.71.197 +add test 10.10.71.198 +add test 10.10.71.199 +add test 10.10.71.2 +add test 10.10.71.20 +add test 10.10.71.200 +add test 10.10.71.201 +add test 10.10.71.202 +add test 10.10.71.203 +add test 10.10.71.204 +add test 10.10.71.205 +add test 10.10.71.206 +add test 10.10.71.207 +add test 10.10.71.208 +add test 10.10.71.209 +add test 10.10.71.21 +add test 10.10.71.210 +add test 10.10.71.211 +add test 10.10.71.212 +add test 10.10.71.213 +add test 10.10.71.214 +add test 10.10.71.215 +add test 10.10.71.216 +add test 10.10.71.217 +add test 10.10.71.218 +add test 10.10.71.219 +add test 10.10.71.22 +add test 10.10.71.220 +add test 10.10.71.221 +add test 10.10.71.222 +add test 10.10.71.223 +add test 10.10.71.224 +add test 10.10.71.225 +add test 10.10.71.226 +add test 10.10.71.227 +add test 10.10.71.228 +add test 10.10.71.229 +add test 10.10.71.23 +add test 10.10.71.230 +add test 10.10.71.231 +add test 10.10.71.232 +add test 10.10.71.233 +add test 10.10.71.234 +add test 10.10.71.235 +add test 10.10.71.236 +add test 10.10.71.237 +add test 10.10.71.238 +add test 10.10.71.239 +add test 10.10.71.24 +add test 10.10.71.240 +add test 10.10.71.241 +add test 10.10.71.242 +add test 10.10.71.243 +add test 10.10.71.244 +add test 10.10.71.245 +add test 10.10.71.246 +add test 10.10.71.247 +add test 10.10.71.248 +add test 10.10.71.249 +add test 10.10.71.25 +add test 10.10.71.250 +add test 10.10.71.251 +add test 10.10.71.252 +add test 10.10.71.253 +add test 10.10.71.254 +add test 10.10.71.255 +add test 10.10.71.26 +add test 10.10.71.27 +add test 10.10.71.28 +add test 10.10.71.29 +add test 10.10.71.3 +add test 10.10.71.30 +add test 10.10.71.31 +add test 10.10.71.32 +add test 10.10.71.33 +add test 10.10.71.34 +add test 10.10.71.35 +add test 10.10.71.36 +add test 10.10.71.37 +add test 10.10.71.38 +add test 10.10.71.39 +add test 10.10.71.4 +add test 10.10.71.40 +add test 10.10.71.41 +add test 10.10.71.42 +add test 10.10.71.43 +add test 10.10.71.44 +add test 10.10.71.45 +add test 10.10.71.46 +add test 10.10.71.47 +add test 10.10.71.48 +add test 10.10.71.49 +add test 10.10.71.5 +add test 10.10.71.50 +add test 10.10.71.51 +add test 10.10.71.52 +add test 10.10.71.53 +add test 10.10.71.54 +add test 10.10.71.55 +add test 10.10.71.56 +add test 10.10.71.57 +add test 10.10.71.58 +add test 10.10.71.59 +add test 10.10.71.6 +add test 10.10.71.60 +add test 10.10.71.61 +add test 10.10.71.62 +add test 10.10.71.63 +add test 10.10.71.64 +add test 10.10.71.65 +add test 10.10.71.66 +add test 10.10.71.67 +add test 10.10.71.68 +add test 10.10.71.69 +add test 10.10.71.7 +add test 10.10.71.70 +add test 10.10.71.71 +add test 10.10.71.72 +add test 10.10.71.73 +add test 10.10.71.74 +add test 10.10.71.75 +add test 10.10.71.76 +add test 10.10.71.77 +add test 10.10.71.78 +add test 10.10.71.79 +add test 10.10.71.8 +add test 10.10.71.80 +add test 10.10.71.81 +add test 10.10.71.82 +add test 10.10.71.83 +add test 10.10.71.84 +add test 10.10.71.85 +add test 10.10.71.86 +add test 10.10.71.87 +add test 10.10.71.88 +add test 10.10.71.89 +add test 10.10.71.9 +add test 10.10.71.90 +add test 10.10.71.91 +add test 10.10.71.92 +add test 10.10.71.93 +add test 10.10.71.94 +add test 10.10.71.95 +add test 10.10.71.96 +add test 10.10.71.97 +add test 10.10.71.98 +add test 10.10.71.99 +add test 10.10.72.0 +add test 10.10.72.1 +add test 10.10.72.10 +add test 10.10.72.100 +add test 10.10.72.101 +add test 10.10.72.102 +add test 10.10.72.103 +add test 10.10.72.104 +add test 10.10.72.105 +add test 10.10.72.106 +add test 10.10.72.107 +add test 10.10.72.108 +add test 10.10.72.109 +add test 10.10.72.11 +add test 10.10.72.110 +add test 10.10.72.111 +add test 10.10.72.112 +add test 10.10.72.113 +add test 10.10.72.114 +add test 10.10.72.115 +add test 10.10.72.116 +add test 10.10.72.117 +add test 10.10.72.118 +add test 10.10.72.119 +add test 10.10.72.12 +add test 10.10.72.120 +add test 10.10.72.121 +add test 10.10.72.122 +add test 10.10.72.123 +add test 10.10.72.124 +add test 10.10.72.125 +add test 10.10.72.126 +add test 10.10.72.127 +add test 10.10.72.128 +add test 10.10.72.129 +add test 10.10.72.13 +add test 10.10.72.130 +add test 10.10.72.131 +add test 10.10.72.132 +add test 10.10.72.133 +add test 10.10.72.134 +add test 10.10.72.135 +add test 10.10.72.136 +add test 10.10.72.137 +add test 10.10.72.138 +add test 10.10.72.139 +add test 10.10.72.14 +add test 10.10.72.140 +add test 10.10.72.141 +add test 10.10.72.142 +add test 10.10.72.143 +add test 10.10.72.144 +add test 10.10.72.145 +add test 10.10.72.146 +add test 10.10.72.147 +add test 10.10.72.148 +add test 10.10.72.149 +add test 10.10.72.15 +add test 10.10.72.150 +add test 10.10.72.151 +add test 10.10.72.152 +add test 10.10.72.153 +add test 10.10.72.154 +add test 10.10.72.155 +add test 10.10.72.156 +add test 10.10.72.157 +add test 10.10.72.158 +add test 10.10.72.159 +add test 10.10.72.16 +add test 10.10.72.160 +add test 10.10.72.161 +add test 10.10.72.162 +add test 10.10.72.163 +add test 10.10.72.164 +add test 10.10.72.165 +add test 10.10.72.166 +add test 10.10.72.167 +add test 10.10.72.168 +add test 10.10.72.169 +add test 10.10.72.17 +add test 10.10.72.170 +add test 10.10.72.171 +add test 10.10.72.172 +add test 10.10.72.173 +add test 10.10.72.174 +add test 10.10.72.175 +add test 10.10.72.176 +add test 10.10.72.177 +add test 10.10.72.178 +add test 10.10.72.179 +add test 10.10.72.18 +add test 10.10.72.180 +add test 10.10.72.181 +add test 10.10.72.182 +add test 10.10.72.183 +add test 10.10.72.184 +add test 10.10.72.185 +add test 10.10.72.186 +add test 10.10.72.187 +add test 10.10.72.188 +add test 10.10.72.189 +add test 10.10.72.19 +add test 10.10.72.190 +add test 10.10.72.191 +add test 10.10.72.192 +add test 10.10.72.193 +add test 10.10.72.194 +add test 10.10.72.195 +add test 10.10.72.196 +add test 10.10.72.197 +add test 10.10.72.198 +add test 10.10.72.199 +add test 10.10.72.2 +add test 10.10.72.20 +add test 10.10.72.200 +add test 10.10.72.201 +add test 10.10.72.202 +add test 10.10.72.203 +add test 10.10.72.204 +add test 10.10.72.205 +add test 10.10.72.206 +add test 10.10.72.207 +add test 10.10.72.208 +add test 10.10.72.209 +add test 10.10.72.21 +add test 10.10.72.210 +add test 10.10.72.211 +add test 10.10.72.212 +add test 10.10.72.213 +add test 10.10.72.214 +add test 10.10.72.215 +add test 10.10.72.216 +add test 10.10.72.217 +add test 10.10.72.218 +add test 10.10.72.219 +add test 10.10.72.22 +add test 10.10.72.220 +add test 10.10.72.221 +add test 10.10.72.222 +add test 10.10.72.223 +add test 10.10.72.224 +add test 10.10.72.225 +add test 10.10.72.226 +add test 10.10.72.227 +add test 10.10.72.228 +add test 10.10.72.229 +add test 10.10.72.23 +add test 10.10.72.230 +add test 10.10.72.231 +add test 10.10.72.232 +add test 10.10.72.233 +add test 10.10.72.234 +add test 10.10.72.235 +add test 10.10.72.236 +add test 10.10.72.237 +add test 10.10.72.238 +add test 10.10.72.239 +add test 10.10.72.24 +add test 10.10.72.240 +add test 10.10.72.241 +add test 10.10.72.242 +add test 10.10.72.243 +add test 10.10.72.244 +add test 10.10.72.245 +add test 10.10.72.246 +add test 10.10.72.247 +add test 10.10.72.248 +add test 10.10.72.249 +add test 10.10.72.25 +add test 10.10.72.250 +add test 10.10.72.251 +add test 10.10.72.252 +add test 10.10.72.253 +add test 10.10.72.254 +add test 10.10.72.255 +add test 10.10.72.26 +add test 10.10.72.27 +add test 10.10.72.28 +add test 10.10.72.29 +add test 10.10.72.3 +add test 10.10.72.30 +add test 10.10.72.31 +add test 10.10.72.32 +add test 10.10.72.33 +add test 10.10.72.34 +add test 10.10.72.35 +add test 10.10.72.36 +add test 10.10.72.37 +add test 10.10.72.38 +add test 10.10.72.39 +add test 10.10.72.4 +add test 10.10.72.40 +add test 10.10.72.41 +add test 10.10.72.42 +add test 10.10.72.43 +add test 10.10.72.44 +add test 10.10.72.45 +add test 10.10.72.46 +add test 10.10.72.47 +add test 10.10.72.48 +add test 10.10.72.49 +add test 10.10.72.5 +add test 10.10.72.50 +add test 10.10.72.51 +add test 10.10.72.52 +add test 10.10.72.53 +add test 10.10.72.54 +add test 10.10.72.55 +add test 10.10.72.56 +add test 10.10.72.57 +add test 10.10.72.58 +add test 10.10.72.59 +add test 10.10.72.6 +add test 10.10.72.60 +add test 10.10.72.61 +add test 10.10.72.62 +add test 10.10.72.63 +add test 10.10.72.64 +add test 10.10.72.65 +add test 10.10.72.66 +add test 10.10.72.67 +add test 10.10.72.68 +add test 10.10.72.69 +add test 10.10.72.7 +add test 10.10.72.70 +add test 10.10.72.71 +add test 10.10.72.72 +add test 10.10.72.73 +add test 10.10.72.74 +add test 10.10.72.75 +add test 10.10.72.76 +add test 10.10.72.77 +add test 10.10.72.78 +add test 10.10.72.79 +add test 10.10.72.8 +add test 10.10.72.80 +add test 10.10.72.81 +add test 10.10.72.82 +add test 10.10.72.83 +add test 10.10.72.84 +add test 10.10.72.85 +add test 10.10.72.86 +add test 10.10.72.87 +add test 10.10.72.88 +add test 10.10.72.89 +add test 10.10.72.9 +add test 10.10.72.90 +add test 10.10.72.91 +add test 10.10.72.92 +add test 10.10.72.93 +add test 10.10.72.94 +add test 10.10.72.95 +add test 10.10.72.96 +add test 10.10.72.97 +add test 10.10.72.98 +add test 10.10.72.99 +add test 10.10.73.0 +add test 10.10.73.1 +add test 10.10.73.10 +add test 10.10.73.100 +add test 10.10.73.101 +add test 10.10.73.102 +add test 10.10.73.103 +add test 10.10.73.104 +add test 10.10.73.105 +add test 10.10.73.106 +add test 10.10.73.107 +add test 10.10.73.108 +add test 10.10.73.109 +add test 10.10.73.11 +add test 10.10.73.110 +add test 10.10.73.111 +add test 10.10.73.112 +add test 10.10.73.113 +add test 10.10.73.114 +add test 10.10.73.115 +add test 10.10.73.116 +add test 10.10.73.117 +add test 10.10.73.118 +add test 10.10.73.119 +add test 10.10.73.12 +add test 10.10.73.120 +add test 10.10.73.121 +add test 10.10.73.122 +add test 10.10.73.123 +add test 10.10.73.124 +add test 10.10.73.125 +add test 10.10.73.126 +add test 10.10.73.127 +add test 10.10.73.128 +add test 10.10.73.129 +add test 10.10.73.13 +add test 10.10.73.130 +add test 10.10.73.131 +add test 10.10.73.132 +add test 10.10.73.133 +add test 10.10.73.134 +add test 10.10.73.135 +add test 10.10.73.136 +add test 10.10.73.137 +add test 10.10.73.138 +add test 10.10.73.139 +add test 10.10.73.14 +add test 10.10.73.140 +add test 10.10.73.141 +add test 10.10.73.142 +add test 10.10.73.143 +add test 10.10.73.144 +add test 10.10.73.145 +add test 10.10.73.146 +add test 10.10.73.147 +add test 10.10.73.148 +add test 10.10.73.149 +add test 10.10.73.15 +add test 10.10.73.150 +add test 10.10.73.151 +add test 10.10.73.152 +add test 10.10.73.153 +add test 10.10.73.154 +add test 10.10.73.155 +add test 10.10.73.156 +add test 10.10.73.157 +add test 10.10.73.158 +add test 10.10.73.159 +add test 10.10.73.16 +add test 10.10.73.160 +add test 10.10.73.161 +add test 10.10.73.162 +add test 10.10.73.163 +add test 10.10.73.164 +add test 10.10.73.165 +add test 10.10.73.166 +add test 10.10.73.167 +add test 10.10.73.168 +add test 10.10.73.169 +add test 10.10.73.17 +add test 10.10.73.170 +add test 10.10.73.171 +add test 10.10.73.172 +add test 10.10.73.173 +add test 10.10.73.174 +add test 10.10.73.175 +add test 10.10.73.176 +add test 10.10.73.177 +add test 10.10.73.178 +add test 10.10.73.179 +add test 10.10.73.18 +add test 10.10.73.180 +add test 10.10.73.181 +add test 10.10.73.182 +add test 10.10.73.183 +add test 10.10.73.184 +add test 10.10.73.185 +add test 10.10.73.186 +add test 10.10.73.187 +add test 10.10.73.188 +add test 10.10.73.189 +add test 10.10.73.19 +add test 10.10.73.190 +add test 10.10.73.191 +add test 10.10.73.192 +add test 10.10.73.193 +add test 10.10.73.194 +add test 10.10.73.195 +add test 10.10.73.196 +add test 10.10.73.197 +add test 10.10.73.198 +add test 10.10.73.199 +add test 10.10.73.2 +add test 10.10.73.20 +add test 10.10.73.200 +add test 10.10.73.201 +add test 10.10.73.202 +add test 10.10.73.203 +add test 10.10.73.204 +add test 10.10.73.205 +add test 10.10.73.206 +add test 10.10.73.207 +add test 10.10.73.208 +add test 10.10.73.209 +add test 10.10.73.21 +add test 10.10.73.210 +add test 10.10.73.211 +add test 10.10.73.212 +add test 10.10.73.213 +add test 10.10.73.214 +add test 10.10.73.215 +add test 10.10.73.216 +add test 10.10.73.217 +add test 10.10.73.218 +add test 10.10.73.219 +add test 10.10.73.22 +add test 10.10.73.220 +add test 10.10.73.221 +add test 10.10.73.222 +add test 10.10.73.223 +add test 10.10.73.224 +add test 10.10.73.225 +add test 10.10.73.226 +add test 10.10.73.227 +add test 10.10.73.228 +add test 10.10.73.229 +add test 10.10.73.23 +add test 10.10.73.230 +add test 10.10.73.231 +add test 10.10.73.232 +add test 10.10.73.233 +add test 10.10.73.234 +add test 10.10.73.235 +add test 10.10.73.236 +add test 10.10.73.237 +add test 10.10.73.238 +add test 10.10.73.239 +add test 10.10.73.24 +add test 10.10.73.240 +add test 10.10.73.241 +add test 10.10.73.242 +add test 10.10.73.243 +add test 10.10.73.244 +add test 10.10.73.245 +add test 10.10.73.246 +add test 10.10.73.247 +add test 10.10.73.248 +add test 10.10.73.249 +add test 10.10.73.25 +add test 10.10.73.250 +add test 10.10.73.251 +add test 10.10.73.252 +add test 10.10.73.253 +add test 10.10.73.254 +add test 10.10.73.255 +add test 10.10.73.26 +add test 10.10.73.27 +add test 10.10.73.28 +add test 10.10.73.29 +add test 10.10.73.3 +add test 10.10.73.30 +add test 10.10.73.31 +add test 10.10.73.32 +add test 10.10.73.33 +add test 10.10.73.34 +add test 10.10.73.35 +add test 10.10.73.36 +add test 10.10.73.37 +add test 10.10.73.38 +add test 10.10.73.39 +add test 10.10.73.4 +add test 10.10.73.40 +add test 10.10.73.41 +add test 10.10.73.42 +add test 10.10.73.43 +add test 10.10.73.44 +add test 10.10.73.45 +add test 10.10.73.46 +add test 10.10.73.47 +add test 10.10.73.48 +add test 10.10.73.49 +add test 10.10.73.5 +add test 10.10.73.50 +add test 10.10.73.51 +add test 10.10.73.52 +add test 10.10.73.53 +add test 10.10.73.54 +add test 10.10.73.55 +add test 10.10.73.56 +add test 10.10.73.57 +add test 10.10.73.58 +add test 10.10.73.59 +add test 10.10.73.6 +add test 10.10.73.60 +add test 10.10.73.61 +add test 10.10.73.62 +add test 10.10.73.63 +add test 10.10.73.64 +add test 10.10.73.65 +add test 10.10.73.66 +add test 10.10.73.67 +add test 10.10.73.68 +add test 10.10.73.69 +add test 10.10.73.7 +add test 10.10.73.70 +add test 10.10.73.71 +add test 10.10.73.72 +add test 10.10.73.73 +add test 10.10.73.74 +add test 10.10.73.75 +add test 10.10.73.76 +add test 10.10.73.77 +add test 10.10.73.78 +add test 10.10.73.79 +add test 10.10.73.8 +add test 10.10.73.80 +add test 10.10.73.81 +add test 10.10.73.82 +add test 10.10.73.83 +add test 10.10.73.84 +add test 10.10.73.85 +add test 10.10.73.86 +add test 10.10.73.87 +add test 10.10.73.88 +add test 10.10.73.89 +add test 10.10.73.9 +add test 10.10.73.90 +add test 10.10.73.91 +add test 10.10.73.92 +add test 10.10.73.93 +add test 10.10.73.94 +add test 10.10.73.95 +add test 10.10.73.96 +add test 10.10.73.97 +add test 10.10.73.98 +add test 10.10.73.99 +add test 10.10.74.0 +add test 10.10.74.1 +add test 10.10.74.10 +add test 10.10.74.100 +add test 10.10.74.101 +add test 10.10.74.102 +add test 10.10.74.103 +add test 10.10.74.104 +add test 10.10.74.105 +add test 10.10.74.106 +add test 10.10.74.107 +add test 10.10.74.108 +add test 10.10.74.109 +add test 10.10.74.11 +add test 10.10.74.110 +add test 10.10.74.111 +add test 10.10.74.112 +add test 10.10.74.113 +add test 10.10.74.114 +add test 10.10.74.115 +add test 10.10.74.116 +add test 10.10.74.117 +add test 10.10.74.118 +add test 10.10.74.119 +add test 10.10.74.12 +add test 10.10.74.120 +add test 10.10.74.121 +add test 10.10.74.122 +add test 10.10.74.123 +add test 10.10.74.124 +add test 10.10.74.125 +add test 10.10.74.126 +add test 10.10.74.127 +add test 10.10.74.128 +add test 10.10.74.129 +add test 10.10.74.13 +add test 10.10.74.130 +add test 10.10.74.131 +add test 10.10.74.132 +add test 10.10.74.133 +add test 10.10.74.134 +add test 10.10.74.135 +add test 10.10.74.136 +add test 10.10.74.137 +add test 10.10.74.138 +add test 10.10.74.139 +add test 10.10.74.14 +add test 10.10.74.140 +add test 10.10.74.141 +add test 10.10.74.142 +add test 10.10.74.143 +add test 10.10.74.144 +add test 10.10.74.145 +add test 10.10.74.146 +add test 10.10.74.147 +add test 10.10.74.148 +add test 10.10.74.149 +add test 10.10.74.15 +add test 10.10.74.150 +add test 10.10.74.151 +add test 10.10.74.152 +add test 10.10.74.153 +add test 10.10.74.154 +add test 10.10.74.155 +add test 10.10.74.156 +add test 10.10.74.157 +add test 10.10.74.158 +add test 10.10.74.159 +add test 10.10.74.16 +add test 10.10.74.160 +add test 10.10.74.161 +add test 10.10.74.162 +add test 10.10.74.163 +add test 10.10.74.164 +add test 10.10.74.165 +add test 10.10.74.166 +add test 10.10.74.167 +add test 10.10.74.168 +add test 10.10.74.169 +add test 10.10.74.17 +add test 10.10.74.170 +add test 10.10.74.171 +add test 10.10.74.172 +add test 10.10.74.173 +add test 10.10.74.174 +add test 10.10.74.175 +add test 10.10.74.176 +add test 10.10.74.177 +add test 10.10.74.178 +add test 10.10.74.179 +add test 10.10.74.18 +add test 10.10.74.180 +add test 10.10.74.181 +add test 10.10.74.182 +add test 10.10.74.183 +add test 10.10.74.184 +add test 10.10.74.185 +add test 10.10.74.186 +add test 10.10.74.187 +add test 10.10.74.188 +add test 10.10.74.189 +add test 10.10.74.19 +add test 10.10.74.190 +add test 10.10.74.191 +add test 10.10.74.192 +add test 10.10.74.193 +add test 10.10.74.194 +add test 10.10.74.195 +add test 10.10.74.196 +add test 10.10.74.197 +add test 10.10.74.198 +add test 10.10.74.199 +add test 10.10.74.2 +add test 10.10.74.20 +add test 10.10.74.200 +add test 10.10.74.201 +add test 10.10.74.202 +add test 10.10.74.203 +add test 10.10.74.204 +add test 10.10.74.205 +add test 10.10.74.206 +add test 10.10.74.207 +add test 10.10.74.208 +add test 10.10.74.209 +add test 10.10.74.21 +add test 10.10.74.210 +add test 10.10.74.211 +add test 10.10.74.212 +add test 10.10.74.213 +add test 10.10.74.214 +add test 10.10.74.215 +add test 10.10.74.216 +add test 10.10.74.217 +add test 10.10.74.218 +add test 10.10.74.219 +add test 10.10.74.22 +add test 10.10.74.220 +add test 10.10.74.221 +add test 10.10.74.222 +add test 10.10.74.223 +add test 10.10.74.224 +add test 10.10.74.225 +add test 10.10.74.226 +add test 10.10.74.227 +add test 10.10.74.228 +add test 10.10.74.229 +add test 10.10.74.23 +add test 10.10.74.230 +add test 10.10.74.231 +add test 10.10.74.232 +add test 10.10.74.233 +add test 10.10.74.234 +add test 10.10.74.235 +add test 10.10.74.236 +add test 10.10.74.237 +add test 10.10.74.238 +add test 10.10.74.239 +add test 10.10.74.24 +add test 10.10.74.240 +add test 10.10.74.241 +add test 10.10.74.242 +add test 10.10.74.243 +add test 10.10.74.244 +add test 10.10.74.245 +add test 10.10.74.246 +add test 10.10.74.247 +add test 10.10.74.248 +add test 10.10.74.249 +add test 10.10.74.25 +add test 10.10.74.250 +add test 10.10.74.251 +add test 10.10.74.252 +add test 10.10.74.253 +add test 10.10.74.254 +add test 10.10.74.255 +add test 10.10.74.26 +add test 10.10.74.27 +add test 10.10.74.28 +add test 10.10.74.29 +add test 10.10.74.3 +add test 10.10.74.30 +add test 10.10.74.31 +add test 10.10.74.32 +add test 10.10.74.33 +add test 10.10.74.34 +add test 10.10.74.35 +add test 10.10.74.36 +add test 10.10.74.37 +add test 10.10.74.38 +add test 10.10.74.39 +add test 10.10.74.4 +add test 10.10.74.40 +add test 10.10.74.41 +add test 10.10.74.42 +add test 10.10.74.43 +add test 10.10.74.44 +add test 10.10.74.45 +add test 10.10.74.46 +add test 10.10.74.47 +add test 10.10.74.48 +add test 10.10.74.49 +add test 10.10.74.5 +add test 10.10.74.50 +add test 10.10.74.51 +add test 10.10.74.52 +add test 10.10.74.53 +add test 10.10.74.54 +add test 10.10.74.55 +add test 10.10.74.56 +add test 10.10.74.57 +add test 10.10.74.58 +add test 10.10.74.59 +add test 10.10.74.6 +add test 10.10.74.60 +add test 10.10.74.61 +add test 10.10.74.62 +add test 10.10.74.63 +add test 10.10.74.64 +add test 10.10.74.65 +add test 10.10.74.66 +add test 10.10.74.67 +add test 10.10.74.68 +add test 10.10.74.69 +add test 10.10.74.7 +add test 10.10.74.70 +add test 10.10.74.71 +add test 10.10.74.72 +add test 10.10.74.73 +add test 10.10.74.74 +add test 10.10.74.75 +add test 10.10.74.76 +add test 10.10.74.77 +add test 10.10.74.78 +add test 10.10.74.79 +add test 10.10.74.8 +add test 10.10.74.80 +add test 10.10.74.81 +add test 10.10.74.82 +add test 10.10.74.83 +add test 10.10.74.84 +add test 10.10.74.85 +add test 10.10.74.86 +add test 10.10.74.87 +add test 10.10.74.88 +add test 10.10.74.89 +add test 10.10.74.9 +add test 10.10.74.90 +add test 10.10.74.91 +add test 10.10.74.92 +add test 10.10.74.93 +add test 10.10.74.94 +add test 10.10.74.95 +add test 10.10.74.96 +add test 10.10.74.97 +add test 10.10.74.98 +add test 10.10.74.99 +add test 10.10.75.0 +add test 10.10.75.1 +add test 10.10.75.10 +add test 10.10.75.100 +add test 10.10.75.101 +add test 10.10.75.102 +add test 10.10.75.103 +add test 10.10.75.104 +add test 10.10.75.105 +add test 10.10.75.106 +add test 10.10.75.107 +add test 10.10.75.108 +add test 10.10.75.109 +add test 10.10.75.11 +add test 10.10.75.110 +add test 10.10.75.111 +add test 10.10.75.112 +add test 10.10.75.113 +add test 10.10.75.114 +add test 10.10.75.115 +add test 10.10.75.116 +add test 10.10.75.117 +add test 10.10.75.118 +add test 10.10.75.119 +add test 10.10.75.12 +add test 10.10.75.120 +add test 10.10.75.121 +add test 10.10.75.122 +add test 10.10.75.123 +add test 10.10.75.124 +add test 10.10.75.125 +add test 10.10.75.126 +add test 10.10.75.127 +add test 10.10.75.128 +add test 10.10.75.129 +add test 10.10.75.13 +add test 10.10.75.130 +add test 10.10.75.131 +add test 10.10.75.132 +add test 10.10.75.133 +add test 10.10.75.134 +add test 10.10.75.135 +add test 10.10.75.136 +add test 10.10.75.137 +add test 10.10.75.138 +add test 10.10.75.139 +add test 10.10.75.14 +add test 10.10.75.140 +add test 10.10.75.141 +add test 10.10.75.142 +add test 10.10.75.143 +add test 10.10.75.144 +add test 10.10.75.145 +add test 10.10.75.146 +add test 10.10.75.147 +add test 10.10.75.148 +add test 10.10.75.149 +add test 10.10.75.15 +add test 10.10.75.150 +add test 10.10.75.151 +add test 10.10.75.152 +add test 10.10.75.153 +add test 10.10.75.154 +add test 10.10.75.155 +add test 10.10.75.156 +add test 10.10.75.157 +add test 10.10.75.158 +add test 10.10.75.159 +add test 10.10.75.16 +add test 10.10.75.160 +add test 10.10.75.161 +add test 10.10.75.162 +add test 10.10.75.163 +add test 10.10.75.164 +add test 10.10.75.165 +add test 10.10.75.166 +add test 10.10.75.167 +add test 10.10.75.168 +add test 10.10.75.169 +add test 10.10.75.17 +add test 10.10.75.170 +add test 10.10.75.171 +add test 10.10.75.172 +add test 10.10.75.173 +add test 10.10.75.174 +add test 10.10.75.175 +add test 10.10.75.176 +add test 10.10.75.177 +add test 10.10.75.178 +add test 10.10.75.179 +add test 10.10.75.18 +add test 10.10.75.180 +add test 10.10.75.181 +add test 10.10.75.182 +add test 10.10.75.183 +add test 10.10.75.184 +add test 10.10.75.185 +add test 10.10.75.186 +add test 10.10.75.187 +add test 10.10.75.188 +add test 10.10.75.189 +add test 10.10.75.19 +add test 10.10.75.190 +add test 10.10.75.191 +add test 10.10.75.192 +add test 10.10.75.193 +add test 10.10.75.194 +add test 10.10.75.195 +add test 10.10.75.196 +add test 10.10.75.197 +add test 10.10.75.198 +add test 10.10.75.199 +add test 10.10.75.2 +add test 10.10.75.20 +add test 10.10.75.200 +add test 10.10.75.201 +add test 10.10.75.202 +add test 10.10.75.203 +add test 10.10.75.204 +add test 10.10.75.205 +add test 10.10.75.206 +add test 10.10.75.207 +add test 10.10.75.208 +add test 10.10.75.209 +add test 10.10.75.21 +add test 10.10.75.210 +add test 10.10.75.211 +add test 10.10.75.212 +add test 10.10.75.213 +add test 10.10.75.214 +add test 10.10.75.215 +add test 10.10.75.216 +add test 10.10.75.217 +add test 10.10.75.218 +add test 10.10.75.219 +add test 10.10.75.22 +add test 10.10.75.220 +add test 10.10.75.221 +add test 10.10.75.222 +add test 10.10.75.223 +add test 10.10.75.224 +add test 10.10.75.225 +add test 10.10.75.226 +add test 10.10.75.227 +add test 10.10.75.228 +add test 10.10.75.229 +add test 10.10.75.23 +add test 10.10.75.230 +add test 10.10.75.231 +add test 10.10.75.232 +add test 10.10.75.233 +add test 10.10.75.234 +add test 10.10.75.235 +add test 10.10.75.236 +add test 10.10.75.237 +add test 10.10.75.238 +add test 10.10.75.239 +add test 10.10.75.24 +add test 10.10.75.240 +add test 10.10.75.241 +add test 10.10.75.242 +add test 10.10.75.243 +add test 10.10.75.244 +add test 10.10.75.245 +add test 10.10.75.246 +add test 10.10.75.247 +add test 10.10.75.248 +add test 10.10.75.249 +add test 10.10.75.25 +add test 10.10.75.250 +add test 10.10.75.251 +add test 10.10.75.252 +add test 10.10.75.253 +add test 10.10.75.254 +add test 10.10.75.255 +add test 10.10.75.26 +add test 10.10.75.27 +add test 10.10.75.28 +add test 10.10.75.29 +add test 10.10.75.3 +add test 10.10.75.30 +add test 10.10.75.31 +add test 10.10.75.32 +add test 10.10.75.33 +add test 10.10.75.34 +add test 10.10.75.35 +add test 10.10.75.36 +add test 10.10.75.37 +add test 10.10.75.38 +add test 10.10.75.39 +add test 10.10.75.4 +add test 10.10.75.40 +add test 10.10.75.41 +add test 10.10.75.42 +add test 10.10.75.43 +add test 10.10.75.44 +add test 10.10.75.45 +add test 10.10.75.46 +add test 10.10.75.47 +add test 10.10.75.48 +add test 10.10.75.49 +add test 10.10.75.5 +add test 10.10.75.50 +add test 10.10.75.51 +add test 10.10.75.52 +add test 10.10.75.53 +add test 10.10.75.54 +add test 10.10.75.55 +add test 10.10.75.56 +add test 10.10.75.57 +add test 10.10.75.58 +add test 10.10.75.59 +add test 10.10.75.6 +add test 10.10.75.60 +add test 10.10.75.61 +add test 10.10.75.62 +add test 10.10.75.63 +add test 10.10.75.64 +add test 10.10.75.65 +add test 10.10.75.66 +add test 10.10.75.67 +add test 10.10.75.68 +add test 10.10.75.69 +add test 10.10.75.7 +add test 10.10.75.70 +add test 10.10.75.71 +add test 10.10.75.72 +add test 10.10.75.73 +add test 10.10.75.74 +add test 10.10.75.75 +add test 10.10.75.76 +add test 10.10.75.77 +add test 10.10.75.78 +add test 10.10.75.79 +add test 10.10.75.8 +add test 10.10.75.80 +add test 10.10.75.81 +add test 10.10.75.82 +add test 10.10.75.83 +add test 10.10.75.84 +add test 10.10.75.85 +add test 10.10.75.86 +add test 10.10.75.87 +add test 10.10.75.88 +add test 10.10.75.89 +add test 10.10.75.9 +add test 10.10.75.90 +add test 10.10.75.91 +add test 10.10.75.92 +add test 10.10.75.93 +add test 10.10.75.94 +add test 10.10.75.95 +add test 10.10.75.96 +add test 10.10.75.97 +add test 10.10.75.98 +add test 10.10.75.99 +add test 10.10.76.0 +add test 10.10.76.1 +add test 10.10.76.10 +add test 10.10.76.100 +add test 10.10.76.101 +add test 10.10.76.102 +add test 10.10.76.103 +add test 10.10.76.104 +add test 10.10.76.105 +add test 10.10.76.106 +add test 10.10.76.107 +add test 10.10.76.108 +add test 10.10.76.109 +add test 10.10.76.11 +add test 10.10.76.110 +add test 10.10.76.111 +add test 10.10.76.112 +add test 10.10.76.113 +add test 10.10.76.114 +add test 10.10.76.115 +add test 10.10.76.116 +add test 10.10.76.117 +add test 10.10.76.118 +add test 10.10.76.119 +add test 10.10.76.12 +add test 10.10.76.120 +add test 10.10.76.121 +add test 10.10.76.122 +add test 10.10.76.123 +add test 10.10.76.124 +add test 10.10.76.125 +add test 10.10.76.126 +add test 10.10.76.127 +add test 10.10.76.128 +add test 10.10.76.129 +add test 10.10.76.13 +add test 10.10.76.130 +add test 10.10.76.131 +add test 10.10.76.132 +add test 10.10.76.133 +add test 10.10.76.134 +add test 10.10.76.135 +add test 10.10.76.136 +add test 10.10.76.137 +add test 10.10.76.138 +add test 10.10.76.139 +add test 10.10.76.14 +add test 10.10.76.140 +add test 10.10.76.141 +add test 10.10.76.142 +add test 10.10.76.143 +add test 10.10.76.144 +add test 10.10.76.145 +add test 10.10.76.146 +add test 10.10.76.147 +add test 10.10.76.148 +add test 10.10.76.149 +add test 10.10.76.15 +add test 10.10.76.150 +add test 10.10.76.151 +add test 10.10.76.152 +add test 10.10.76.153 +add test 10.10.76.154 +add test 10.10.76.155 +add test 10.10.76.156 +add test 10.10.76.157 +add test 10.10.76.158 +add test 10.10.76.159 +add test 10.10.76.16 +add test 10.10.76.160 +add test 10.10.76.161 +add test 10.10.76.162 +add test 10.10.76.163 +add test 10.10.76.164 +add test 10.10.76.165 +add test 10.10.76.166 +add test 10.10.76.167 +add test 10.10.76.168 +add test 10.10.76.169 +add test 10.10.76.17 +add test 10.10.76.170 +add test 10.10.76.171 +add test 10.10.76.172 +add test 10.10.76.173 +add test 10.10.76.174 +add test 10.10.76.175 +add test 10.10.76.176 +add test 10.10.76.177 +add test 10.10.76.178 +add test 10.10.76.179 +add test 10.10.76.18 +add test 10.10.76.180 +add test 10.10.76.181 +add test 10.10.76.182 +add test 10.10.76.183 +add test 10.10.76.184 +add test 10.10.76.185 +add test 10.10.76.186 +add test 10.10.76.187 +add test 10.10.76.188 +add test 10.10.76.189 +add test 10.10.76.19 +add test 10.10.76.190 +add test 10.10.76.191 +add test 10.10.76.192 +add test 10.10.76.193 +add test 10.10.76.194 +add test 10.10.76.195 +add test 10.10.76.196 +add test 10.10.76.197 +add test 10.10.76.198 +add test 10.10.76.199 +add test 10.10.76.2 +add test 10.10.76.20 +add test 10.10.76.200 +add test 10.10.76.201 +add test 10.10.76.202 +add test 10.10.76.203 +add test 10.10.76.204 +add test 10.10.76.205 +add test 10.10.76.206 +add test 10.10.76.207 +add test 10.10.76.208 +add test 10.10.76.209 +add test 10.10.76.21 +add test 10.10.76.210 +add test 10.10.76.211 +add test 10.10.76.212 +add test 10.10.76.213 +add test 10.10.76.214 +add test 10.10.76.215 +add test 10.10.76.216 +add test 10.10.76.217 +add test 10.10.76.218 +add test 10.10.76.219 +add test 10.10.76.22 +add test 10.10.76.220 +add test 10.10.76.221 +add test 10.10.76.222 +add test 10.10.76.223 +add test 10.10.76.224 +add test 10.10.76.225 +add test 10.10.76.226 +add test 10.10.76.227 +add test 10.10.76.228 +add test 10.10.76.229 +add test 10.10.76.23 +add test 10.10.76.230 +add test 10.10.76.231 +add test 10.10.76.232 +add test 10.10.76.233 +add test 10.10.76.234 +add test 10.10.76.235 +add test 10.10.76.236 +add test 10.10.76.237 +add test 10.10.76.238 +add test 10.10.76.239 +add test 10.10.76.24 +add test 10.10.76.240 +add test 10.10.76.241 +add test 10.10.76.242 +add test 10.10.76.243 +add test 10.10.76.244 +add test 10.10.76.245 +add test 10.10.76.246 +add test 10.10.76.247 +add test 10.10.76.248 +add test 10.10.76.249 +add test 10.10.76.25 +add test 10.10.76.250 +add test 10.10.76.251 +add test 10.10.76.252 +add test 10.10.76.253 +add test 10.10.76.254 +add test 10.10.76.255 +add test 10.10.76.26 +add test 10.10.76.27 +add test 10.10.76.28 +add test 10.10.76.29 +add test 10.10.76.3 +add test 10.10.76.30 +add test 10.10.76.31 +add test 10.10.76.32 +add test 10.10.76.33 +add test 10.10.76.34 +add test 10.10.76.35 +add test 10.10.76.36 +add test 10.10.76.37 +add test 10.10.76.38 +add test 10.10.76.39 +add test 10.10.76.4 +add test 10.10.76.40 +add test 10.10.76.41 +add test 10.10.76.42 +add test 10.10.76.43 +add test 10.10.76.44 +add test 10.10.76.45 +add test 10.10.76.46 +add test 10.10.76.47 +add test 10.10.76.48 +add test 10.10.76.49 +add test 10.10.76.5 +add test 10.10.76.50 +add test 10.10.76.51 +add test 10.10.76.52 +add test 10.10.76.53 +add test 10.10.76.54 +add test 10.10.76.55 +add test 10.10.76.56 +add test 10.10.76.57 +add test 10.10.76.58 +add test 10.10.76.59 +add test 10.10.76.6 +add test 10.10.76.60 +add test 10.10.76.61 +add test 10.10.76.62 +add test 10.10.76.63 +add test 10.10.76.64 +add test 10.10.76.65 +add test 10.10.76.66 +add test 10.10.76.67 +add test 10.10.76.68 +add test 10.10.76.69 +add test 10.10.76.7 +add test 10.10.76.70 +add test 10.10.76.71 +add test 10.10.76.72 +add test 10.10.76.73 +add test 10.10.76.74 +add test 10.10.76.75 +add test 10.10.76.76 +add test 10.10.76.77 +add test 10.10.76.78 +add test 10.10.76.79 +add test 10.10.76.8 +add test 10.10.76.80 +add test 10.10.76.81 +add test 10.10.76.82 +add test 10.10.76.83 +add test 10.10.76.84 +add test 10.10.76.85 +add test 10.10.76.86 +add test 10.10.76.87 +add test 10.10.76.88 +add test 10.10.76.89 +add test 10.10.76.9 +add test 10.10.76.90 +add test 10.10.76.91 +add test 10.10.76.92 +add test 10.10.76.93 +add test 10.10.76.94 +add test 10.10.76.95 +add test 10.10.76.96 +add test 10.10.76.97 +add test 10.10.76.98 +add test 10.10.76.99 +add test 10.10.77.0 +add test 10.10.77.1 +add test 10.10.77.10 +add test 10.10.77.100 +add test 10.10.77.101 +add test 10.10.77.102 +add test 10.10.77.103 +add test 10.10.77.104 +add test 10.10.77.105 +add test 10.10.77.106 +add test 10.10.77.107 +add test 10.10.77.108 +add test 10.10.77.109 +add test 10.10.77.11 +add test 10.10.77.110 +add test 10.10.77.111 +add test 10.10.77.112 +add test 10.10.77.113 +add test 10.10.77.114 +add test 10.10.77.115 +add test 10.10.77.116 +add test 10.10.77.117 +add test 10.10.77.118 +add test 10.10.77.119 +add test 10.10.77.12 +add test 10.10.77.120 +add test 10.10.77.121 +add test 10.10.77.122 +add test 10.10.77.123 +add test 10.10.77.124 +add test 10.10.77.125 +add test 10.10.77.126 +add test 10.10.77.127 +add test 10.10.77.128 +add test 10.10.77.129 +add test 10.10.77.13 +add test 10.10.77.130 +add test 10.10.77.131 +add test 10.10.77.132 +add test 10.10.77.133 +add test 10.10.77.134 +add test 10.10.77.135 +add test 10.10.77.136 +add test 10.10.77.137 +add test 10.10.77.138 +add test 10.10.77.139 +add test 10.10.77.14 +add test 10.10.77.140 +add test 10.10.77.141 +add test 10.10.77.142 +add test 10.10.77.143 +add test 10.10.77.144 +add test 10.10.77.145 +add test 10.10.77.146 +add test 10.10.77.147 +add test 10.10.77.148 +add test 10.10.77.149 +add test 10.10.77.15 +add test 10.10.77.150 +add test 10.10.77.151 +add test 10.10.77.152 +add test 10.10.77.153 +add test 10.10.77.154 +add test 10.10.77.155 +add test 10.10.77.156 +add test 10.10.77.157 +add test 10.10.77.158 +add test 10.10.77.159 +add test 10.10.77.16 +add test 10.10.77.160 +add test 10.10.77.161 +add test 10.10.77.162 +add test 10.10.77.163 +add test 10.10.77.164 +add test 10.10.77.165 +add test 10.10.77.166 +add test 10.10.77.167 +add test 10.10.77.168 +add test 10.10.77.169 +add test 10.10.77.17 +add test 10.10.77.170 +add test 10.10.77.171 +add test 10.10.77.172 +add test 10.10.77.173 +add test 10.10.77.174 +add test 10.10.77.175 +add test 10.10.77.176 +add test 10.10.77.177 +add test 10.10.77.178 +add test 10.10.77.179 +add test 10.10.77.18 +add test 10.10.77.180 +add test 10.10.77.181 +add test 10.10.77.182 +add test 10.10.77.183 +add test 10.10.77.184 +add test 10.10.77.185 +add test 10.10.77.186 +add test 10.10.77.187 +add test 10.10.77.188 +add test 10.10.77.189 +add test 10.10.77.19 +add test 10.10.77.190 +add test 10.10.77.191 +add test 10.10.77.192 +add test 10.10.77.193 +add test 10.10.77.194 +add test 10.10.77.195 +add test 10.10.77.196 +add test 10.10.77.197 +add test 10.10.77.198 +add test 10.10.77.199 +add test 10.10.77.2 +add test 10.10.77.20 +add test 10.10.77.200 +add test 10.10.77.201 +add test 10.10.77.202 +add test 10.10.77.203 +add test 10.10.77.204 +add test 10.10.77.205 +add test 10.10.77.206 +add test 10.10.77.207 +add test 10.10.77.208 +add test 10.10.77.209 +add test 10.10.77.21 +add test 10.10.77.210 +add test 10.10.77.211 +add test 10.10.77.212 +add test 10.10.77.213 +add test 10.10.77.214 +add test 10.10.77.215 +add test 10.10.77.216 +add test 10.10.77.217 +add test 10.10.77.218 +add test 10.10.77.219 +add test 10.10.77.22 +add test 10.10.77.220 +add test 10.10.77.221 +add test 10.10.77.222 +add test 10.10.77.223 +add test 10.10.77.224 +add test 10.10.77.225 +add test 10.10.77.226 +add test 10.10.77.227 +add test 10.10.77.228 +add test 10.10.77.229 +add test 10.10.77.23 +add test 10.10.77.230 +add test 10.10.77.231 +add test 10.10.77.232 +add test 10.10.77.233 +add test 10.10.77.234 +add test 10.10.77.235 +add test 10.10.77.236 +add test 10.10.77.237 +add test 10.10.77.238 +add test 10.10.77.239 +add test 10.10.77.24 +add test 10.10.77.240 +add test 10.10.77.241 +add test 10.10.77.242 +add test 10.10.77.243 +add test 10.10.77.244 +add test 10.10.77.245 +add test 10.10.77.246 +add test 10.10.77.247 +add test 10.10.77.248 +add test 10.10.77.249 +add test 10.10.77.25 +add test 10.10.77.250 +add test 10.10.77.251 +add test 10.10.77.252 +add test 10.10.77.253 +add test 10.10.77.254 +add test 10.10.77.255 +add test 10.10.77.26 +add test 10.10.77.27 +add test 10.10.77.28 +add test 10.10.77.29 +add test 10.10.77.3 +add test 10.10.77.30 +add test 10.10.77.31 +add test 10.10.77.32 +add test 10.10.77.33 +add test 10.10.77.34 +add test 10.10.77.35 +add test 10.10.77.36 +add test 10.10.77.37 +add test 10.10.77.38 +add test 10.10.77.39 +add test 10.10.77.4 +add test 10.10.77.40 +add test 10.10.77.41 +add test 10.10.77.42 +add test 10.10.77.43 +add test 10.10.77.44 +add test 10.10.77.45 +add test 10.10.77.46 +add test 10.10.77.47 +add test 10.10.77.48 +add test 10.10.77.49 +add test 10.10.77.5 +add test 10.10.77.50 +add test 10.10.77.51 +add test 10.10.77.52 +add test 10.10.77.53 +add test 10.10.77.54 +add test 10.10.77.55 +add test 10.10.77.56 +add test 10.10.77.57 +add test 10.10.77.58 +add test 10.10.77.59 +add test 10.10.77.6 +add test 10.10.77.60 +add test 10.10.77.61 +add test 10.10.77.62 +add test 10.10.77.63 +add test 10.10.77.64 +add test 10.10.77.65 +add test 10.10.77.66 +add test 10.10.77.67 +add test 10.10.77.68 +add test 10.10.77.69 +add test 10.10.77.7 +add test 10.10.77.70 +add test 10.10.77.71 +add test 10.10.77.72 +add test 10.10.77.73 +add test 10.10.77.74 +add test 10.10.77.75 +add test 10.10.77.76 +add test 10.10.77.77 +add test 10.10.77.78 +add test 10.10.77.79 +add test 10.10.77.8 +add test 10.10.77.80 +add test 10.10.77.81 +add test 10.10.77.82 +add test 10.10.77.83 +add test 10.10.77.84 +add test 10.10.77.85 +add test 10.10.77.86 +add test 10.10.77.87 +add test 10.10.77.88 +add test 10.10.77.89 +add test 10.10.77.9 +add test 10.10.77.90 +add test 10.10.77.91 +add test 10.10.77.92 +add test 10.10.77.93 +add test 10.10.77.94 +add test 10.10.77.95 +add test 10.10.77.96 +add test 10.10.77.97 +add test 10.10.77.98 +add test 10.10.77.99 +add test 10.10.78.0 +add test 10.10.78.1 +add test 10.10.78.10 +add test 10.10.78.100 +add test 10.10.78.101 +add test 10.10.78.102 +add test 10.10.78.103 +add test 10.10.78.104 +add test 10.10.78.105 +add test 10.10.78.106 +add test 10.10.78.107 +add test 10.10.78.108 +add test 10.10.78.109 +add test 10.10.78.11 +add test 10.10.78.110 +add test 10.10.78.111 +add test 10.10.78.112 +add test 10.10.78.113 +add test 10.10.78.114 +add test 10.10.78.115 +add test 10.10.78.116 +add test 10.10.78.117 +add test 10.10.78.118 +add test 10.10.78.119 +add test 10.10.78.12 +add test 10.10.78.120 +add test 10.10.78.121 +add test 10.10.78.122 +add test 10.10.78.123 +add test 10.10.78.124 +add test 10.10.78.125 +add test 10.10.78.126 +add test 10.10.78.127 +add test 10.10.78.128 +add test 10.10.78.129 +add test 10.10.78.13 +add test 10.10.78.130 +add test 10.10.78.131 +add test 10.10.78.132 +add test 10.10.78.133 +add test 10.10.78.134 +add test 10.10.78.135 +add test 10.10.78.136 +add test 10.10.78.137 +add test 10.10.78.138 +add test 10.10.78.139 +add test 10.10.78.14 +add test 10.10.78.140 +add test 10.10.78.141 +add test 10.10.78.142 +add test 10.10.78.143 +add test 10.10.78.144 +add test 10.10.78.145 +add test 10.10.78.146 +add test 10.10.78.147 +add test 10.10.78.148 +add test 10.10.78.149 +add test 10.10.78.15 +add test 10.10.78.150 +add test 10.10.78.151 +add test 10.10.78.152 +add test 10.10.78.153 +add test 10.10.78.154 +add test 10.10.78.155 +add test 10.10.78.156 +add test 10.10.78.157 +add test 10.10.78.158 +add test 10.10.78.159 +add test 10.10.78.16 +add test 10.10.78.160 +add test 10.10.78.161 +add test 10.10.78.162 +add test 10.10.78.163 +add test 10.10.78.164 +add test 10.10.78.165 +add test 10.10.78.166 +add test 10.10.78.167 +add test 10.10.78.168 +add test 10.10.78.169 +add test 10.10.78.17 +add test 10.10.78.170 +add test 10.10.78.171 +add test 10.10.78.172 +add test 10.10.78.173 +add test 10.10.78.174 +add test 10.10.78.175 +add test 10.10.78.176 +add test 10.10.78.177 +add test 10.10.78.178 +add test 10.10.78.179 +add test 10.10.78.18 +add test 10.10.78.180 +add test 10.10.78.181 +add test 10.10.78.182 +add test 10.10.78.183 +add test 10.10.78.184 +add test 10.10.78.185 +add test 10.10.78.186 +add test 10.10.78.187 +add test 10.10.78.188 +add test 10.10.78.189 +add test 10.10.78.19 +add test 10.10.78.190 +add test 10.10.78.191 +add test 10.10.78.192 +add test 10.10.78.193 +add test 10.10.78.194 +add test 10.10.78.195 +add test 10.10.78.196 +add test 10.10.78.197 +add test 10.10.78.198 +add test 10.10.78.199 +add test 10.10.78.2 +add test 10.10.78.20 +add test 10.10.78.200 +add test 10.10.78.201 +add test 10.10.78.202 +add test 10.10.78.203 +add test 10.10.78.204 +add test 10.10.78.205 +add test 10.10.78.206 +add test 10.10.78.207 +add test 10.10.78.208 +add test 10.10.78.209 +add test 10.10.78.21 +add test 10.10.78.210 +add test 10.10.78.211 +add test 10.10.78.212 +add test 10.10.78.213 +add test 10.10.78.214 +add test 10.10.78.215 +add test 10.10.78.216 +add test 10.10.78.217 +add test 10.10.78.218 +add test 10.10.78.219 +add test 10.10.78.22 +add test 10.10.78.220 +add test 10.10.78.221 +add test 10.10.78.222 +add test 10.10.78.223 +add test 10.10.78.224 +add test 10.10.78.225 +add test 10.10.78.226 +add test 10.10.78.227 +add test 10.10.78.228 +add test 10.10.78.229 +add test 10.10.78.23 +add test 10.10.78.230 +add test 10.10.78.231 +add test 10.10.78.232 +add test 10.10.78.233 +add test 10.10.78.234 +add test 10.10.78.235 +add test 10.10.78.236 +add test 10.10.78.237 +add test 10.10.78.238 +add test 10.10.78.239 +add test 10.10.78.24 +add test 10.10.78.240 +add test 10.10.78.241 +add test 10.10.78.242 +add test 10.10.78.243 +add test 10.10.78.244 +add test 10.10.78.245 +add test 10.10.78.246 +add test 10.10.78.247 +add test 10.10.78.248 +add test 10.10.78.249 +add test 10.10.78.25 +add test 10.10.78.250 +add test 10.10.78.251 +add test 10.10.78.252 +add test 10.10.78.253 +add test 10.10.78.254 +add test 10.10.78.255 +add test 10.10.78.26 +add test 10.10.78.27 +add test 10.10.78.28 +add test 10.10.78.29 +add test 10.10.78.3 +add test 10.10.78.30 +add test 10.10.78.31 +add test 10.10.78.32 +add test 10.10.78.33 +add test 10.10.78.34 +add test 10.10.78.35 +add test 10.10.78.36 +add test 10.10.78.37 +add test 10.10.78.38 +add test 10.10.78.39 +add test 10.10.78.4 +add test 10.10.78.40 +add test 10.10.78.41 +add test 10.10.78.42 +add test 10.10.78.43 +add test 10.10.78.44 +add test 10.10.78.45 +add test 10.10.78.46 +add test 10.10.78.47 +add test 10.10.78.48 +add test 10.10.78.49 +add test 10.10.78.5 +add test 10.10.78.50 +add test 10.10.78.51 +add test 10.10.78.52 +add test 10.10.78.53 +add test 10.10.78.54 +add test 10.10.78.55 +add test 10.10.78.56 +add test 10.10.78.57 +add test 10.10.78.58 +add test 10.10.78.59 +add test 10.10.78.6 +add test 10.10.78.60 +add test 10.10.78.61 +add test 10.10.78.62 +add test 10.10.78.63 +add test 10.10.78.64 +add test 10.10.78.65 +add test 10.10.78.66 +add test 10.10.78.67 +add test 10.10.78.68 +add test 10.10.78.69 +add test 10.10.78.7 +add test 10.10.78.70 +add test 10.10.78.71 +add test 10.10.78.72 +add test 10.10.78.73 +add test 10.10.78.74 +add test 10.10.78.75 +add test 10.10.78.76 +add test 10.10.78.77 +add test 10.10.78.78 +add test 10.10.78.79 +add test 10.10.78.8 +add test 10.10.78.80 +add test 10.10.78.81 +add test 10.10.78.82 +add test 10.10.78.83 +add test 10.10.78.84 +add test 10.10.78.85 +add test 10.10.78.86 +add test 10.10.78.87 +add test 10.10.78.88 +add test 10.10.78.89 +add test 10.10.78.9 +add test 10.10.78.90 +add test 10.10.78.91 +add test 10.10.78.92 +add test 10.10.78.93 +add test 10.10.78.94 +add test 10.10.78.95 +add test 10.10.78.96 +add test 10.10.78.97 +add test 10.10.78.98 +add test 10.10.78.99 +add test 10.10.79.0 +add test 10.10.79.1 +add test 10.10.79.10 +add test 10.10.79.100 +add test 10.10.79.101 +add test 10.10.79.102 +add test 10.10.79.103 +add test 10.10.79.104 +add test 10.10.79.105 +add test 10.10.79.106 +add test 10.10.79.107 +add test 10.10.79.108 +add test 10.10.79.109 +add test 10.10.79.11 +add test 10.10.79.110 +add test 10.10.79.111 +add test 10.10.79.112 +add test 10.10.79.113 +add test 10.10.79.114 +add test 10.10.79.115 +add test 10.10.79.116 +add test 10.10.79.117 +add test 10.10.79.118 +add test 10.10.79.119 +add test 10.10.79.12 +add test 10.10.79.120 +add test 10.10.79.121 +add test 10.10.79.122 +add test 10.10.79.123 +add test 10.10.79.124 +add test 10.10.79.125 +add test 10.10.79.126 +add test 10.10.79.127 +add test 10.10.79.128 +add test 10.10.79.129 +add test 10.10.79.13 +add test 10.10.79.130 +add test 10.10.79.131 +add test 10.10.79.132 +add test 10.10.79.133 +add test 10.10.79.134 +add test 10.10.79.135 +add test 10.10.79.136 +add test 10.10.79.137 +add test 10.10.79.138 +add test 10.10.79.139 +add test 10.10.79.14 +add test 10.10.79.140 +add test 10.10.79.141 +add test 10.10.79.142 +add test 10.10.79.143 +add test 10.10.79.144 +add test 10.10.79.145 +add test 10.10.79.146 +add test 10.10.79.147 +add test 10.10.79.148 +add test 10.10.79.149 +add test 10.10.79.15 +add test 10.10.79.150 +add test 10.10.79.151 +add test 10.10.79.152 +add test 10.10.79.153 +add test 10.10.79.154 +add test 10.10.79.155 +add test 10.10.79.156 +add test 10.10.79.157 +add test 10.10.79.158 +add test 10.10.79.159 +add test 10.10.79.16 +add test 10.10.79.160 +add test 10.10.79.161 +add test 10.10.79.162 +add test 10.10.79.163 +add test 10.10.79.164 +add test 10.10.79.165 +add test 10.10.79.166 +add test 10.10.79.167 +add test 10.10.79.168 +add test 10.10.79.169 +add test 10.10.79.17 +add test 10.10.79.170 +add test 10.10.79.171 +add test 10.10.79.172 +add test 10.10.79.173 +add test 10.10.79.174 +add test 10.10.79.175 +add test 10.10.79.176 +add test 10.10.79.177 +add test 10.10.79.178 +add test 10.10.79.179 +add test 10.10.79.18 +add test 10.10.79.180 +add test 10.10.79.181 +add test 10.10.79.182 +add test 10.10.79.183 +add test 10.10.79.184 +add test 10.10.79.185 +add test 10.10.79.186 +add test 10.10.79.187 +add test 10.10.79.188 +add test 10.10.79.189 +add test 10.10.79.19 +add test 10.10.79.190 +add test 10.10.79.191 +add test 10.10.79.192 +add test 10.10.79.193 +add test 10.10.79.194 +add test 10.10.79.195 +add test 10.10.79.196 +add test 10.10.79.197 +add test 10.10.79.198 +add test 10.10.79.199 +add test 10.10.79.2 +add test 10.10.79.20 +add test 10.10.79.200 +add test 10.10.79.201 +add test 10.10.79.202 +add test 10.10.79.203 +add test 10.10.79.204 +add test 10.10.79.205 +add test 10.10.79.206 +add test 10.10.79.207 +add test 10.10.79.208 +add test 10.10.79.209 +add test 10.10.79.21 +add test 10.10.79.210 +add test 10.10.79.211 +add test 10.10.79.212 +add test 10.10.79.213 +add test 10.10.79.214 +add test 10.10.79.215 +add test 10.10.79.216 +add test 10.10.79.217 +add test 10.10.79.218 +add test 10.10.79.219 +add test 10.10.79.22 +add test 10.10.79.220 +add test 10.10.79.221 +add test 10.10.79.222 +add test 10.10.79.223 +add test 10.10.79.224 +add test 10.10.79.225 +add test 10.10.79.226 +add test 10.10.79.227 +add test 10.10.79.228 +add test 10.10.79.229 +add test 10.10.79.23 +add test 10.10.79.230 +add test 10.10.79.231 +add test 10.10.79.232 +add test 10.10.79.233 +add test 10.10.79.234 +add test 10.10.79.235 +add test 10.10.79.236 +add test 10.10.79.237 +add test 10.10.79.238 +add test 10.10.79.239 +add test 10.10.79.24 +add test 10.10.79.240 +add test 10.10.79.241 +add test 10.10.79.242 +add test 10.10.79.243 +add test 10.10.79.244 +add test 10.10.79.245 +add test 10.10.79.246 +add test 10.10.79.247 +add test 10.10.79.248 +add test 10.10.79.249 +add test 10.10.79.25 +add test 10.10.79.250 +add test 10.10.79.251 +add test 10.10.79.252 +add test 10.10.79.253 +add test 10.10.79.254 +add test 10.10.79.255 +add test 10.10.79.26 +add test 10.10.79.27 +add test 10.10.79.28 +add test 10.10.79.29 +add test 10.10.79.3 +add test 10.10.79.30 +add test 10.10.79.31 +add test 10.10.79.32 +add test 10.10.79.33 +add test 10.10.79.34 +add test 10.10.79.35 +add test 10.10.79.36 +add test 10.10.79.37 +add test 10.10.79.38 +add test 10.10.79.39 +add test 10.10.79.4 +add test 10.10.79.40 +add test 10.10.79.41 +add test 10.10.79.42 +add test 10.10.79.43 +add test 10.10.79.44 +add test 10.10.79.45 +add test 10.10.79.46 +add test 10.10.79.47 +add test 10.10.79.48 +add test 10.10.79.49 +add test 10.10.79.5 +add test 10.10.79.50 +add test 10.10.79.51 +add test 10.10.79.52 +add test 10.10.79.53 +add test 10.10.79.54 +add test 10.10.79.55 +add test 10.10.79.56 +add test 10.10.79.57 +add test 10.10.79.58 +add test 10.10.79.59 +add test 10.10.79.6 +add test 10.10.79.60 +add test 10.10.79.61 +add test 10.10.79.62 +add test 10.10.79.63 +add test 10.10.79.64 +add test 10.10.79.65 +add test 10.10.79.66 +add test 10.10.79.67 +add test 10.10.79.68 +add test 10.10.79.69 +add test 10.10.79.7 +add test 10.10.79.70 +add test 10.10.79.71 +add test 10.10.79.72 +add test 10.10.79.73 +add test 10.10.79.74 +add test 10.10.79.75 +add test 10.10.79.76 +add test 10.10.79.77 +add test 10.10.79.78 +add test 10.10.79.79 +add test 10.10.79.8 +add test 10.10.79.80 +add test 10.10.79.81 +add test 10.10.79.82 +add test 10.10.79.83 +add test 10.10.79.84 +add test 10.10.79.85 +add test 10.10.79.86 +add test 10.10.79.87 +add test 10.10.79.88 +add test 10.10.79.89 +add test 10.10.79.9 +add test 10.10.79.90 +add test 10.10.79.91 +add test 10.10.79.92 +add test 10.10.79.93 +add test 10.10.79.94 +add test 10.10.79.95 +add test 10.10.79.96 +add test 10.10.79.97 +add test 10.10.79.98 +add test 10.10.79.99 +add test 10.10.8.0 +add test 10.10.8.1 +add test 10.10.8.10 +add test 10.10.8.100 +add test 10.10.8.101 +add test 10.10.8.102 +add test 10.10.8.103 +add test 10.10.8.104 +add test 10.10.8.105 +add test 10.10.8.106 +add test 10.10.8.107 +add test 10.10.8.108 +add test 10.10.8.109 +add test 10.10.8.11 +add test 10.10.8.110 +add test 10.10.8.111 +add test 10.10.8.112 +add test 10.10.8.113 +add test 10.10.8.114 +add test 10.10.8.115 +add test 10.10.8.116 +add test 10.10.8.117 +add test 10.10.8.118 +add test 10.10.8.119 +add test 10.10.8.12 +add test 10.10.8.120 +add test 10.10.8.121 +add test 10.10.8.122 +add test 10.10.8.123 +add test 10.10.8.124 +add test 10.10.8.125 +add test 10.10.8.126 +add test 10.10.8.127 +add test 10.10.8.128 +add test 10.10.8.129 +add test 10.10.8.13 +add test 10.10.8.130 +add test 10.10.8.131 +add test 10.10.8.132 +add test 10.10.8.133 +add test 10.10.8.134 +add test 10.10.8.135 +add test 10.10.8.136 +add test 10.10.8.137 +add test 10.10.8.138 +add test 10.10.8.139 +add test 10.10.8.14 +add test 10.10.8.140 +add test 10.10.8.141 +add test 10.10.8.142 +add test 10.10.8.143 +add test 10.10.8.144 +add test 10.10.8.145 +add test 10.10.8.146 +add test 10.10.8.147 +add test 10.10.8.148 +add test 10.10.8.149 +add test 10.10.8.15 +add test 10.10.8.150 +add test 10.10.8.151 +add test 10.10.8.152 +add test 10.10.8.153 +add test 10.10.8.154 +add test 10.10.8.155 +add test 10.10.8.156 +add test 10.10.8.157 +add test 10.10.8.158 +add test 10.10.8.159 +add test 10.10.8.16 +add test 10.10.8.160 +add test 10.10.8.161 +add test 10.10.8.162 +add test 10.10.8.163 +add test 10.10.8.164 +add test 10.10.8.165 +add test 10.10.8.166 +add test 10.10.8.167 +add test 10.10.8.168 +add test 10.10.8.169 +add test 10.10.8.17 +add test 10.10.8.170 +add test 10.10.8.171 +add test 10.10.8.172 +add test 10.10.8.173 +add test 10.10.8.174 +add test 10.10.8.175 +add test 10.10.8.176 +add test 10.10.8.177 +add test 10.10.8.178 +add test 10.10.8.179 +add test 10.10.8.18 +add test 10.10.8.180 +add test 10.10.8.181 +add test 10.10.8.182 +add test 10.10.8.183 +add test 10.10.8.184 +add test 10.10.8.185 +add test 10.10.8.186 +add test 10.10.8.187 +add test 10.10.8.188 +add test 10.10.8.189 +add test 10.10.8.19 +add test 10.10.8.190 +add test 10.10.8.191 +add test 10.10.8.192 +add test 10.10.8.193 +add test 10.10.8.194 +add test 10.10.8.195 +add test 10.10.8.196 +add test 10.10.8.197 +add test 10.10.8.198 +add test 10.10.8.199 +add test 10.10.8.2 +add test 10.10.8.20 +add test 10.10.8.200 +add test 10.10.8.201 +add test 10.10.8.202 +add test 10.10.8.203 +add test 10.10.8.204 +add test 10.10.8.205 +add test 10.10.8.206 +add test 10.10.8.207 +add test 10.10.8.208 +add test 10.10.8.209 +add test 10.10.8.21 +add test 10.10.8.210 +add test 10.10.8.211 +add test 10.10.8.212 +add test 10.10.8.213 +add test 10.10.8.214 +add test 10.10.8.215 +add test 10.10.8.216 +add test 10.10.8.217 +add test 10.10.8.218 +add test 10.10.8.219 +add test 10.10.8.22 +add test 10.10.8.220 +add test 10.10.8.221 +add test 10.10.8.222 +add test 10.10.8.223 +add test 10.10.8.224 +add test 10.10.8.225 +add test 10.10.8.226 +add test 10.10.8.227 +add test 10.10.8.228 +add test 10.10.8.229 +add test 10.10.8.23 +add test 10.10.8.230 +add test 10.10.8.231 +add test 10.10.8.232 +add test 10.10.8.233 +add test 10.10.8.234 +add test 10.10.8.235 +add test 10.10.8.236 +add test 10.10.8.237 +add test 10.10.8.238 +add test 10.10.8.239 +add test 10.10.8.24 +add test 10.10.8.240 +add test 10.10.8.241 +add test 10.10.8.242 +add test 10.10.8.243 +add test 10.10.8.244 +add test 10.10.8.245 +add test 10.10.8.246 +add test 10.10.8.247 +add test 10.10.8.248 +add test 10.10.8.249 +add test 10.10.8.25 +add test 10.10.8.250 +add test 10.10.8.251 +add test 10.10.8.252 +add test 10.10.8.253 +add test 10.10.8.254 +add test 10.10.8.255 +add test 10.10.8.26 +add test 10.10.8.27 +add test 10.10.8.28 +add test 10.10.8.29 +add test 10.10.8.3 +add test 10.10.8.30 +add test 10.10.8.31 +add test 10.10.8.32 +add test 10.10.8.33 +add test 10.10.8.34 +add test 10.10.8.35 +add test 10.10.8.36 +add test 10.10.8.37 +add test 10.10.8.38 +add test 10.10.8.39 +add test 10.10.8.4 +add test 10.10.8.40 +add test 10.10.8.41 +add test 10.10.8.42 +add test 10.10.8.43 +add test 10.10.8.44 +add test 10.10.8.45 +add test 10.10.8.46 +add test 10.10.8.47 +add test 10.10.8.48 +add test 10.10.8.49 +add test 10.10.8.5 +add test 10.10.8.50 +add test 10.10.8.51 +add test 10.10.8.52 +add test 10.10.8.53 +add test 10.10.8.54 +add test 10.10.8.55 +add test 10.10.8.56 +add test 10.10.8.57 +add test 10.10.8.58 +add test 10.10.8.59 +add test 10.10.8.6 +add test 10.10.8.60 +add test 10.10.8.61 +add test 10.10.8.62 +add test 10.10.8.63 +add test 10.10.8.64 +add test 10.10.8.65 +add test 10.10.8.66 +add test 10.10.8.67 +add test 10.10.8.68 +add test 10.10.8.69 +add test 10.10.8.7 +add test 10.10.8.70 +add test 10.10.8.71 +add test 10.10.8.72 +add test 10.10.8.73 +add test 10.10.8.74 +add test 10.10.8.75 +add test 10.10.8.76 +add test 10.10.8.77 +add test 10.10.8.78 +add test 10.10.8.79 +add test 10.10.8.8 +add test 10.10.8.80 +add test 10.10.8.81 +add test 10.10.8.82 +add test 10.10.8.83 +add test 10.10.8.84 +add test 10.10.8.85 +add test 10.10.8.86 +add test 10.10.8.87 +add test 10.10.8.88 +add test 10.10.8.89 +add test 10.10.8.9 +add test 10.10.8.90 +add test 10.10.8.91 +add test 10.10.8.92 +add test 10.10.8.93 +add test 10.10.8.94 +add test 10.10.8.95 +add test 10.10.8.96 +add test 10.10.8.97 +add test 10.10.8.98 +add test 10.10.8.99 +add test 10.10.80.0 +add test 10.10.80.1 +add test 10.10.80.10 +add test 10.10.80.100 +add test 10.10.80.101 +add test 10.10.80.102 +add test 10.10.80.103 +add test 10.10.80.104 +add test 10.10.80.105 +add test 10.10.80.106 +add test 10.10.80.107 +add test 10.10.80.108 +add test 10.10.80.109 +add test 10.10.80.11 +add test 10.10.80.110 +add test 10.10.80.111 +add test 10.10.80.112 +add test 10.10.80.113 +add test 10.10.80.114 +add test 10.10.80.115 +add test 10.10.80.116 +add test 10.10.80.117 +add test 10.10.80.118 +add test 10.10.80.119 +add test 10.10.80.12 +add test 10.10.80.120 +add test 10.10.80.121 +add test 10.10.80.122 +add test 10.10.80.123 +add test 10.10.80.124 +add test 10.10.80.125 +add test 10.10.80.126 +add test 10.10.80.127 +add test 10.10.80.128 +add test 10.10.80.129 +add test 10.10.80.13 +add test 10.10.80.130 +add test 10.10.80.131 +add test 10.10.80.132 +add test 10.10.80.133 +add test 10.10.80.134 +add test 10.10.80.135 +add test 10.10.80.136 +add test 10.10.80.137 +add test 10.10.80.138 +add test 10.10.80.139 +add test 10.10.80.14 +add test 10.10.80.140 +add test 10.10.80.141 +add test 10.10.80.142 +add test 10.10.80.143 +add test 10.10.80.144 +add test 10.10.80.145 +add test 10.10.80.146 +add test 10.10.80.147 +add test 10.10.80.148 +add test 10.10.80.149 +add test 10.10.80.15 +add test 10.10.80.150 +add test 10.10.80.151 +add test 10.10.80.152 +add test 10.10.80.153 +add test 10.10.80.154 +add test 10.10.80.155 +add test 10.10.80.156 +add test 10.10.80.157 +add test 10.10.80.158 +add test 10.10.80.159 +add test 10.10.80.16 +add test 10.10.80.160 +add test 10.10.80.161 +add test 10.10.80.162 +add test 10.10.80.163 +add test 10.10.80.164 +add test 10.10.80.165 +add test 10.10.80.166 +add test 10.10.80.167 +add test 10.10.80.168 +add test 10.10.80.169 +add test 10.10.80.17 +add test 10.10.80.170 +add test 10.10.80.171 +add test 10.10.80.172 +add test 10.10.80.173 +add test 10.10.80.174 +add test 10.10.80.175 +add test 10.10.80.176 +add test 10.10.80.177 +add test 10.10.80.178 +add test 10.10.80.179 +add test 10.10.80.18 +add test 10.10.80.180 +add test 10.10.80.181 +add test 10.10.80.182 +add test 10.10.80.183 +add test 10.10.80.184 +add test 10.10.80.185 +add test 10.10.80.186 +add test 10.10.80.187 +add test 10.10.80.188 +add test 10.10.80.189 +add test 10.10.80.19 +add test 10.10.80.190 +add test 10.10.80.191 +add test 10.10.80.192 +add test 10.10.80.193 +add test 10.10.80.194 +add test 10.10.80.195 +add test 10.10.80.196 +add test 10.10.80.197 +add test 10.10.80.198 +add test 10.10.80.199 +add test 10.10.80.2 +add test 10.10.80.20 +add test 10.10.80.200 +add test 10.10.80.201 +add test 10.10.80.202 +add test 10.10.80.203 +add test 10.10.80.204 +add test 10.10.80.205 +add test 10.10.80.206 +add test 10.10.80.207 +add test 10.10.80.208 +add test 10.10.80.209 +add test 10.10.80.21 +add test 10.10.80.210 +add test 10.10.80.211 +add test 10.10.80.212 +add test 10.10.80.213 +add test 10.10.80.214 +add test 10.10.80.215 +add test 10.10.80.216 +add test 10.10.80.217 +add test 10.10.80.218 +add test 10.10.80.219 +add test 10.10.80.22 +add test 10.10.80.220 +add test 10.10.80.221 +add test 10.10.80.222 +add test 10.10.80.223 +add test 10.10.80.224 +add test 10.10.80.225 +add test 10.10.80.226 +add test 10.10.80.227 +add test 10.10.80.228 +add test 10.10.80.229 +add test 10.10.80.23 +add test 10.10.80.230 +add test 10.10.80.231 +add test 10.10.80.232 +add test 10.10.80.233 +add test 10.10.80.234 +add test 10.10.80.235 +add test 10.10.80.236 +add test 10.10.80.237 +add test 10.10.80.238 +add test 10.10.80.239 +add test 10.10.80.24 +add test 10.10.80.240 +add test 10.10.80.241 +add test 10.10.80.242 +add test 10.10.80.243 +add test 10.10.80.244 +add test 10.10.80.245 +add test 10.10.80.246 +add test 10.10.80.247 +add test 10.10.80.248 +add test 10.10.80.249 +add test 10.10.80.25 +add test 10.10.80.250 +add test 10.10.80.251 +add test 10.10.80.252 +add test 10.10.80.253 +add test 10.10.80.254 +add test 10.10.80.255 +add test 10.10.80.26 +add test 10.10.80.27 +add test 10.10.80.28 +add test 10.10.80.29 +add test 10.10.80.3 +add test 10.10.80.30 +add test 10.10.80.31 +add test 10.10.80.32 +add test 10.10.80.33 +add test 10.10.80.34 +add test 10.10.80.35 +add test 10.10.80.36 +add test 10.10.80.37 +add test 10.10.80.38 +add test 10.10.80.39 +add test 10.10.80.4 +add test 10.10.80.40 +add test 10.10.80.41 +add test 10.10.80.42 +add test 10.10.80.43 +add test 10.10.80.44 +add test 10.10.80.45 +add test 10.10.80.46 +add test 10.10.80.47 +add test 10.10.80.48 +add test 10.10.80.49 +add test 10.10.80.5 +add test 10.10.80.50 +add test 10.10.80.51 +add test 10.10.80.52 +add test 10.10.80.53 +add test 10.10.80.54 +add test 10.10.80.55 +add test 10.10.80.56 +add test 10.10.80.57 +add test 10.10.80.58 +add test 10.10.80.59 +add test 10.10.80.6 +add test 10.10.80.60 +add test 10.10.80.61 +add test 10.10.80.62 +add test 10.10.80.63 +add test 10.10.80.64 +add test 10.10.80.65 +add test 10.10.80.66 +add test 10.10.80.67 +add test 10.10.80.68 +add test 10.10.80.69 +add test 10.10.80.7 +add test 10.10.80.70 +add test 10.10.80.71 +add test 10.10.80.72 +add test 10.10.80.73 +add test 10.10.80.74 +add test 10.10.80.75 +add test 10.10.80.76 +add test 10.10.80.77 +add test 10.10.80.78 +add test 10.10.80.79 +add test 10.10.80.8 +add test 10.10.80.80 +add test 10.10.80.81 +add test 10.10.80.82 +add test 10.10.80.83 +add test 10.10.80.84 +add test 10.10.80.85 +add test 10.10.80.86 +add test 10.10.80.87 +add test 10.10.80.88 +add test 10.10.80.89 +add test 10.10.80.9 +add test 10.10.80.90 +add test 10.10.80.91 +add test 10.10.80.92 +add test 10.10.80.93 +add test 10.10.80.94 +add test 10.10.80.95 +add test 10.10.80.96 +add test 10.10.80.97 +add test 10.10.80.98 +add test 10.10.80.99 +add test 10.10.81.0 +add test 10.10.81.1 +add test 10.10.81.10 +add test 10.10.81.100 +add test 10.10.81.101 +add test 10.10.81.102 +add test 10.10.81.103 +add test 10.10.81.104 +add test 10.10.81.105 +add test 10.10.81.106 +add test 10.10.81.107 +add test 10.10.81.108 +add test 10.10.81.109 +add test 10.10.81.11 +add test 10.10.81.110 +add test 10.10.81.111 +add test 10.10.81.112 +add test 10.10.81.113 +add test 10.10.81.114 +add test 10.10.81.115 +add test 10.10.81.116 +add test 10.10.81.117 +add test 10.10.81.118 +add test 10.10.81.119 +add test 10.10.81.12 +add test 10.10.81.120 +add test 10.10.81.121 +add test 10.10.81.122 +add test 10.10.81.123 +add test 10.10.81.124 +add test 10.10.81.125 +add test 10.10.81.126 +add test 10.10.81.127 +add test 10.10.81.128 +add test 10.10.81.129 +add test 10.10.81.13 +add test 10.10.81.130 +add test 10.10.81.131 +add test 10.10.81.132 +add test 10.10.81.133 +add test 10.10.81.134 +add test 10.10.81.135 +add test 10.10.81.136 +add test 10.10.81.137 +add test 10.10.81.138 +add test 10.10.81.139 +add test 10.10.81.14 +add test 10.10.81.140 +add test 10.10.81.141 +add test 10.10.81.142 +add test 10.10.81.143 +add test 10.10.81.144 +add test 10.10.81.145 +add test 10.10.81.146 +add test 10.10.81.147 +add test 10.10.81.148 +add test 10.10.81.149 +add test 10.10.81.15 +add test 10.10.81.150 +add test 10.10.81.151 +add test 10.10.81.152 +add test 10.10.81.153 +add test 10.10.81.154 +add test 10.10.81.155 +add test 10.10.81.156 +add test 10.10.81.157 +add test 10.10.81.158 +add test 10.10.81.159 +add test 10.10.81.16 +add test 10.10.81.160 +add test 10.10.81.161 +add test 10.10.81.162 +add test 10.10.81.163 +add test 10.10.81.164 +add test 10.10.81.165 +add test 10.10.81.166 +add test 10.10.81.167 +add test 10.10.81.168 +add test 10.10.81.169 +add test 10.10.81.17 +add test 10.10.81.170 +add test 10.10.81.171 +add test 10.10.81.172 +add test 10.10.81.173 +add test 10.10.81.174 +add test 10.10.81.175 +add test 10.10.81.176 +add test 10.10.81.177 +add test 10.10.81.178 +add test 10.10.81.179 +add test 10.10.81.18 +add test 10.10.81.180 +add test 10.10.81.181 +add test 10.10.81.182 +add test 10.10.81.183 +add test 10.10.81.184 +add test 10.10.81.185 +add test 10.10.81.186 +add test 10.10.81.187 +add test 10.10.81.188 +add test 10.10.81.189 +add test 10.10.81.19 +add test 10.10.81.190 +add test 10.10.81.191 +add test 10.10.81.192 +add test 10.10.81.193 +add test 10.10.81.194 +add test 10.10.81.195 +add test 10.10.81.196 +add test 10.10.81.197 +add test 10.10.81.198 +add test 10.10.81.199 +add test 10.10.81.2 +add test 10.10.81.20 +add test 10.10.81.200 +add test 10.10.81.201 +add test 10.10.81.202 +add test 10.10.81.203 +add test 10.10.81.204 +add test 10.10.81.205 +add test 10.10.81.206 +add test 10.10.81.207 +add test 10.10.81.208 +add test 10.10.81.209 +add test 10.10.81.21 +add test 10.10.81.210 +add test 10.10.81.211 +add test 10.10.81.212 +add test 10.10.81.213 +add test 10.10.81.214 +add test 10.10.81.215 +add test 10.10.81.216 +add test 10.10.81.217 +add test 10.10.81.218 +add test 10.10.81.219 +add test 10.10.81.22 +add test 10.10.81.220 +add test 10.10.81.221 +add test 10.10.81.222 +add test 10.10.81.223 +add test 10.10.81.224 +add test 10.10.81.225 +add test 10.10.81.226 +add test 10.10.81.227 +add test 10.10.81.228 +add test 10.10.81.229 +add test 10.10.81.23 +add test 10.10.81.230 +add test 10.10.81.231 +add test 10.10.81.232 +add test 10.10.81.233 +add test 10.10.81.234 +add test 10.10.81.235 +add test 10.10.81.236 +add test 10.10.81.237 +add test 10.10.81.238 +add test 10.10.81.239 +add test 10.10.81.24 +add test 10.10.81.240 +add test 10.10.81.241 +add test 10.10.81.242 +add test 10.10.81.243 +add test 10.10.81.244 +add test 10.10.81.245 +add test 10.10.81.246 +add test 10.10.81.247 +add test 10.10.81.248 +add test 10.10.81.249 +add test 10.10.81.25 +add test 10.10.81.250 +add test 10.10.81.251 +add test 10.10.81.252 +add test 10.10.81.253 +add test 10.10.81.254 +add test 10.10.81.255 +add test 10.10.81.26 +add test 10.10.81.27 +add test 10.10.81.28 +add test 10.10.81.29 +add test 10.10.81.3 +add test 10.10.81.30 +add test 10.10.81.31 +add test 10.10.81.32 +add test 10.10.81.33 +add test 10.10.81.34 +add test 10.10.81.35 +add test 10.10.81.36 +add test 10.10.81.37 +add test 10.10.81.38 +add test 10.10.81.39 +add test 10.10.81.4 +add test 10.10.81.40 +add test 10.10.81.41 +add test 10.10.81.42 +add test 10.10.81.43 +add test 10.10.81.44 +add test 10.10.81.45 +add test 10.10.81.46 +add test 10.10.81.47 +add test 10.10.81.48 +add test 10.10.81.49 +add test 10.10.81.5 +add test 10.10.81.50 +add test 10.10.81.51 +add test 10.10.81.52 +add test 10.10.81.53 +add test 10.10.81.54 +add test 10.10.81.55 +add test 10.10.81.56 +add test 10.10.81.57 +add test 10.10.81.58 +add test 10.10.81.59 +add test 10.10.81.6 +add test 10.10.81.60 +add test 10.10.81.61 +add test 10.10.81.62 +add test 10.10.81.63 +add test 10.10.81.64 +add test 10.10.81.65 +add test 10.10.81.66 +add test 10.10.81.67 +add test 10.10.81.68 +add test 10.10.81.69 +add test 10.10.81.7 +add test 10.10.81.70 +add test 10.10.81.71 +add test 10.10.81.72 +add test 10.10.81.73 +add test 10.10.81.74 +add test 10.10.81.75 +add test 10.10.81.76 +add test 10.10.81.77 +add test 10.10.81.78 +add test 10.10.81.79 +add test 10.10.81.8 +add test 10.10.81.80 +add test 10.10.81.81 +add test 10.10.81.82 +add test 10.10.81.83 +add test 10.10.81.84 +add test 10.10.81.85 +add test 10.10.81.86 +add test 10.10.81.87 +add test 10.10.81.88 +add test 10.10.81.89 +add test 10.10.81.9 +add test 10.10.81.90 +add test 10.10.81.91 +add test 10.10.81.92 +add test 10.10.81.93 +add test 10.10.81.94 +add test 10.10.81.95 +add test 10.10.81.96 +add test 10.10.81.97 +add test 10.10.81.98 +add test 10.10.81.99 +add test 10.10.82.0 +add test 10.10.82.1 +add test 10.10.82.10 +add test 10.10.82.100 +add test 10.10.82.101 +add test 10.10.82.102 +add test 10.10.82.103 +add test 10.10.82.104 +add test 10.10.82.105 +add test 10.10.82.106 +add test 10.10.82.107 +add test 10.10.82.108 +add test 10.10.82.109 +add test 10.10.82.11 +add test 10.10.82.110 +add test 10.10.82.111 +add test 10.10.82.112 +add test 10.10.82.113 +add test 10.10.82.114 +add test 10.10.82.115 +add test 10.10.82.116 +add test 10.10.82.117 +add test 10.10.82.118 +add test 10.10.82.119 +add test 10.10.82.12 +add test 10.10.82.120 +add test 10.10.82.121 +add test 10.10.82.122 +add test 10.10.82.123 +add test 10.10.82.124 +add test 10.10.82.125 +add test 10.10.82.126 +add test 10.10.82.127 +add test 10.10.82.128 +add test 10.10.82.129 +add test 10.10.82.13 +add test 10.10.82.130 +add test 10.10.82.131 +add test 10.10.82.132 +add test 10.10.82.133 +add test 10.10.82.134 +add test 10.10.82.135 +add test 10.10.82.136 +add test 10.10.82.137 +add test 10.10.82.138 +add test 10.10.82.139 +add test 10.10.82.14 +add test 10.10.82.140 +add test 10.10.82.141 +add test 10.10.82.142 +add test 10.10.82.143 +add test 10.10.82.144 +add test 10.10.82.145 +add test 10.10.82.146 +add test 10.10.82.147 +add test 10.10.82.148 +add test 10.10.82.149 +add test 10.10.82.15 +add test 10.10.82.150 +add test 10.10.82.151 +add test 10.10.82.152 +add test 10.10.82.153 +add test 10.10.82.154 +add test 10.10.82.155 +add test 10.10.82.156 +add test 10.10.82.157 +add test 10.10.82.158 +add test 10.10.82.159 +add test 10.10.82.16 +add test 10.10.82.160 +add test 10.10.82.161 +add test 10.10.82.162 +add test 10.10.82.163 +add test 10.10.82.164 +add test 10.10.82.165 +add test 10.10.82.166 +add test 10.10.82.167 +add test 10.10.82.168 +add test 10.10.82.169 +add test 10.10.82.17 +add test 10.10.82.170 +add test 10.10.82.171 +add test 10.10.82.172 +add test 10.10.82.173 +add test 10.10.82.174 +add test 10.10.82.175 +add test 10.10.82.176 +add test 10.10.82.177 +add test 10.10.82.178 +add test 10.10.82.179 +add test 10.10.82.18 +add test 10.10.82.180 +add test 10.10.82.181 +add test 10.10.82.182 +add test 10.10.82.183 +add test 10.10.82.184 +add test 10.10.82.185 +add test 10.10.82.186 +add test 10.10.82.187 +add test 10.10.82.188 +add test 10.10.82.189 +add test 10.10.82.19 +add test 10.10.82.190 +add test 10.10.82.191 +add test 10.10.82.192 +add test 10.10.82.193 +add test 10.10.82.194 +add test 10.10.82.195 +add test 10.10.82.196 +add test 10.10.82.197 +add test 10.10.82.198 +add test 10.10.82.199 +add test 10.10.82.2 +add test 10.10.82.20 +add test 10.10.82.200 +add test 10.10.82.201 +add test 10.10.82.202 +add test 10.10.82.203 +add test 10.10.82.204 +add test 10.10.82.205 +add test 10.10.82.206 +add test 10.10.82.207 +add test 10.10.82.208 +add test 10.10.82.209 +add test 10.10.82.21 +add test 10.10.82.210 +add test 10.10.82.211 +add test 10.10.82.212 +add test 10.10.82.213 +add test 10.10.82.214 +add test 10.10.82.215 +add test 10.10.82.216 +add test 10.10.82.217 +add test 10.10.82.218 +add test 10.10.82.219 +add test 10.10.82.22 +add test 10.10.82.220 +add test 10.10.82.221 +add test 10.10.82.222 +add test 10.10.82.223 +add test 10.10.82.224 +add test 10.10.82.225 +add test 10.10.82.226 +add test 10.10.82.227 +add test 10.10.82.228 +add test 10.10.82.229 +add test 10.10.82.23 +add test 10.10.82.230 +add test 10.10.82.231 +add test 10.10.82.232 +add test 10.10.82.233 +add test 10.10.82.234 +add test 10.10.82.235 +add test 10.10.82.236 +add test 10.10.82.237 +add test 10.10.82.238 +add test 10.10.82.239 +add test 10.10.82.24 +add test 10.10.82.240 +add test 10.10.82.241 +add test 10.10.82.242 +add test 10.10.82.243 +add test 10.10.82.244 +add test 10.10.82.245 +add test 10.10.82.246 +add test 10.10.82.247 +add test 10.10.82.248 +add test 10.10.82.249 +add test 10.10.82.25 +add test 10.10.82.250 +add test 10.10.82.251 +add test 10.10.82.252 +add test 10.10.82.253 +add test 10.10.82.254 +add test 10.10.82.255 +add test 10.10.82.26 +add test 10.10.82.27 +add test 10.10.82.28 +add test 10.10.82.29 +add test 10.10.82.3 +add test 10.10.82.30 +add test 10.10.82.31 +add test 10.10.82.32 +add test 10.10.82.33 +add test 10.10.82.34 +add test 10.10.82.35 +add test 10.10.82.36 +add test 10.10.82.37 +add test 10.10.82.38 +add test 10.10.82.39 +add test 10.10.82.4 +add test 10.10.82.40 +add test 10.10.82.41 +add test 10.10.82.42 +add test 10.10.82.43 +add test 10.10.82.44 +add test 10.10.82.45 +add test 10.10.82.46 +add test 10.10.82.47 +add test 10.10.82.48 +add test 10.10.82.49 +add test 10.10.82.5 +add test 10.10.82.50 +add test 10.10.82.51 +add test 10.10.82.52 +add test 10.10.82.53 +add test 10.10.82.54 +add test 10.10.82.55 +add test 10.10.82.56 +add test 10.10.82.57 +add test 10.10.82.58 +add test 10.10.82.59 +add test 10.10.82.6 +add test 10.10.82.60 +add test 10.10.82.61 +add test 10.10.82.62 +add test 10.10.82.63 +add test 10.10.82.64 +add test 10.10.82.65 +add test 10.10.82.66 +add test 10.10.82.67 +add test 10.10.82.68 +add test 10.10.82.69 +add test 10.10.82.7 +add test 10.10.82.70 +add test 10.10.82.71 +add test 10.10.82.72 +add test 10.10.82.73 +add test 10.10.82.74 +add test 10.10.82.75 +add test 10.10.82.76 +add test 10.10.82.77 +add test 10.10.82.78 +add test 10.10.82.79 +add test 10.10.82.8 +add test 10.10.82.80 +add test 10.10.82.81 +add test 10.10.82.82 +add test 10.10.82.83 +add test 10.10.82.84 +add test 10.10.82.85 +add test 10.10.82.86 +add test 10.10.82.87 +add test 10.10.82.88 +add test 10.10.82.89 +add test 10.10.82.9 +add test 10.10.82.90 +add test 10.10.82.91 +add test 10.10.82.92 +add test 10.10.82.93 +add test 10.10.82.94 +add test 10.10.82.95 +add test 10.10.82.96 +add test 10.10.82.97 +add test 10.10.82.98 +add test 10.10.82.99 +add test 10.10.83.0 +add test 10.10.83.1 +add test 10.10.83.10 +add test 10.10.83.100 +add test 10.10.83.101 +add test 10.10.83.102 +add test 10.10.83.103 +add test 10.10.83.104 +add test 10.10.83.105 +add test 10.10.83.106 +add test 10.10.83.107 +add test 10.10.83.108 +add test 10.10.83.109 +add test 10.10.83.11 +add test 10.10.83.110 +add test 10.10.83.111 +add test 10.10.83.112 +add test 10.10.83.113 +add test 10.10.83.114 +add test 10.10.83.115 +add test 10.10.83.116 +add test 10.10.83.117 +add test 10.10.83.118 +add test 10.10.83.119 +add test 10.10.83.12 +add test 10.10.83.120 +add test 10.10.83.121 +add test 10.10.83.122 +add test 10.10.83.123 +add test 10.10.83.124 +add test 10.10.83.125 +add test 10.10.83.126 +add test 10.10.83.127 +add test 10.10.83.128 +add test 10.10.83.129 +add test 10.10.83.13 +add test 10.10.83.130 +add test 10.10.83.131 +add test 10.10.83.132 +add test 10.10.83.133 +add test 10.10.83.134 +add test 10.10.83.135 +add test 10.10.83.136 +add test 10.10.83.137 +add test 10.10.83.138 +add test 10.10.83.139 +add test 10.10.83.14 +add test 10.10.83.140 +add test 10.10.83.141 +add test 10.10.83.142 +add test 10.10.83.143 +add test 10.10.83.144 +add test 10.10.83.145 +add test 10.10.83.146 +add test 10.10.83.147 +add test 10.10.83.148 +add test 10.10.83.149 +add test 10.10.83.15 +add test 10.10.83.150 +add test 10.10.83.151 +add test 10.10.83.152 +add test 10.10.83.153 +add test 10.10.83.154 +add test 10.10.83.155 +add test 10.10.83.156 +add test 10.10.83.157 +add test 10.10.83.158 +add test 10.10.83.159 +add test 10.10.83.16 +add test 10.10.83.160 +add test 10.10.83.161 +add test 10.10.83.162 +add test 10.10.83.163 +add test 10.10.83.164 +add test 10.10.83.165 +add test 10.10.83.166 +add test 10.10.83.167 +add test 10.10.83.168 +add test 10.10.83.169 +add test 10.10.83.17 +add test 10.10.83.170 +add test 10.10.83.171 +add test 10.10.83.172 +add test 10.10.83.173 +add test 10.10.83.174 +add test 10.10.83.175 +add test 10.10.83.176 +add test 10.10.83.177 +add test 10.10.83.178 +add test 10.10.83.179 +add test 10.10.83.18 +add test 10.10.83.180 +add test 10.10.83.181 +add test 10.10.83.182 +add test 10.10.83.183 +add test 10.10.83.184 +add test 10.10.83.185 +add test 10.10.83.186 +add test 10.10.83.187 +add test 10.10.83.188 +add test 10.10.83.189 +add test 10.10.83.19 +add test 10.10.83.190 +add test 10.10.83.191 +add test 10.10.83.192 +add test 10.10.83.193 +add test 10.10.83.194 +add test 10.10.83.195 +add test 10.10.83.196 +add test 10.10.83.197 +add test 10.10.83.198 +add test 10.10.83.199 +add test 10.10.83.2 +add test 10.10.83.20 +add test 10.10.83.200 +add test 10.10.83.201 +add test 10.10.83.202 +add test 10.10.83.203 +add test 10.10.83.204 +add test 10.10.83.205 +add test 10.10.83.206 +add test 10.10.83.207 +add test 10.10.83.208 +add test 10.10.83.209 +add test 10.10.83.21 +add test 10.10.83.210 +add test 10.10.83.211 +add test 10.10.83.212 +add test 10.10.83.213 +add test 10.10.83.214 +add test 10.10.83.215 +add test 10.10.83.216 +add test 10.10.83.217 +add test 10.10.83.218 +add test 10.10.83.219 +add test 10.10.83.22 +add test 10.10.83.220 +add test 10.10.83.221 +add test 10.10.83.222 +add test 10.10.83.223 +add test 10.10.83.224 +add test 10.10.83.225 +add test 10.10.83.226 +add test 10.10.83.227 +add test 10.10.83.228 +add test 10.10.83.229 +add test 10.10.83.23 +add test 10.10.83.230 +add test 10.10.83.231 +add test 10.10.83.232 +add test 10.10.83.233 +add test 10.10.83.234 +add test 10.10.83.235 +add test 10.10.83.236 +add test 10.10.83.237 +add test 10.10.83.238 +add test 10.10.83.239 +add test 10.10.83.24 +add test 10.10.83.240 +add test 10.10.83.241 +add test 10.10.83.242 +add test 10.10.83.243 +add test 10.10.83.244 +add test 10.10.83.245 +add test 10.10.83.246 +add test 10.10.83.247 +add test 10.10.83.248 +add test 10.10.83.249 +add test 10.10.83.25 +add test 10.10.83.250 +add test 10.10.83.251 +add test 10.10.83.252 +add test 10.10.83.253 +add test 10.10.83.254 +add test 10.10.83.255 +add test 10.10.83.26 +add test 10.10.83.27 +add test 10.10.83.28 +add test 10.10.83.29 +add test 10.10.83.3 +add test 10.10.83.30 +add test 10.10.83.31 +add test 10.10.83.32 +add test 10.10.83.33 +add test 10.10.83.34 +add test 10.10.83.35 +add test 10.10.83.36 +add test 10.10.83.37 +add test 10.10.83.38 +add test 10.10.83.39 +add test 10.10.83.4 +add test 10.10.83.40 +add test 10.10.83.41 +add test 10.10.83.42 +add test 10.10.83.43 +add test 10.10.83.44 +add test 10.10.83.45 +add test 10.10.83.46 +add test 10.10.83.47 +add test 10.10.83.48 +add test 10.10.83.49 +add test 10.10.83.5 +add test 10.10.83.50 +add test 10.10.83.51 +add test 10.10.83.52 +add test 10.10.83.53 +add test 10.10.83.54 +add test 10.10.83.55 +add test 10.10.83.56 +add test 10.10.83.57 +add test 10.10.83.58 +add test 10.10.83.59 +add test 10.10.83.6 +add test 10.10.83.60 +add test 10.10.83.61 +add test 10.10.83.62 +add test 10.10.83.63 +add test 10.10.83.64 +add test 10.10.83.65 +add test 10.10.83.66 +add test 10.10.83.67 +add test 10.10.83.68 +add test 10.10.83.69 +add test 10.10.83.7 +add test 10.10.83.70 +add test 10.10.83.71 +add test 10.10.83.72 +add test 10.10.83.73 +add test 10.10.83.74 +add test 10.10.83.75 +add test 10.10.83.76 +add test 10.10.83.77 +add test 10.10.83.78 +add test 10.10.83.79 +add test 10.10.83.8 +add test 10.10.83.80 +add test 10.10.83.81 +add test 10.10.83.82 +add test 10.10.83.83 +add test 10.10.83.84 +add test 10.10.83.85 +add test 10.10.83.86 +add test 10.10.83.87 +add test 10.10.83.88 +add test 10.10.83.89 +add test 10.10.83.9 +add test 10.10.83.90 +add test 10.10.83.91 +add test 10.10.83.92 +add test 10.10.83.93 +add test 10.10.83.94 +add test 10.10.83.95 +add test 10.10.83.96 +add test 10.10.83.97 +add test 10.10.83.98 +add test 10.10.83.99 +add test 10.10.84.0 +add test 10.10.84.1 +add test 10.10.84.10 +add test 10.10.84.100 +add test 10.10.84.101 +add test 10.10.84.102 +add test 10.10.84.103 +add test 10.10.84.104 +add test 10.10.84.105 +add test 10.10.84.106 +add test 10.10.84.107 +add test 10.10.84.108 +add test 10.10.84.109 +add test 10.10.84.11 +add test 10.10.84.110 +add test 10.10.84.111 +add test 10.10.84.112 +add test 10.10.84.113 +add test 10.10.84.114 +add test 10.10.84.115 +add test 10.10.84.116 +add test 10.10.84.117 +add test 10.10.84.118 +add test 10.10.84.119 +add test 10.10.84.12 +add test 10.10.84.120 +add test 10.10.84.121 +add test 10.10.84.122 +add test 10.10.84.123 +add test 10.10.84.124 +add test 10.10.84.125 +add test 10.10.84.126 +add test 10.10.84.127 +add test 10.10.84.128 +add test 10.10.84.129 +add test 10.10.84.13 +add test 10.10.84.130 +add test 10.10.84.131 +add test 10.10.84.132 +add test 10.10.84.133 +add test 10.10.84.134 +add test 10.10.84.135 +add test 10.10.84.136 +add test 10.10.84.137 +add test 10.10.84.138 +add test 10.10.84.139 +add test 10.10.84.14 +add test 10.10.84.140 +add test 10.10.84.141 +add test 10.10.84.142 +add test 10.10.84.143 +add test 10.10.84.144 +add test 10.10.84.145 +add test 10.10.84.146 +add test 10.10.84.147 +add test 10.10.84.148 +add test 10.10.84.149 +add test 10.10.84.15 +add test 10.10.84.150 +add test 10.10.84.151 +add test 10.10.84.152 +add test 10.10.84.153 +add test 10.10.84.154 +add test 10.10.84.155 +add test 10.10.84.156 +add test 10.10.84.157 +add test 10.10.84.158 +add test 10.10.84.159 +add test 10.10.84.16 +add test 10.10.84.160 +add test 10.10.84.161 +add test 10.10.84.162 +add test 10.10.84.163 +add test 10.10.84.164 +add test 10.10.84.165 +add test 10.10.84.166 +add test 10.10.84.167 +add test 10.10.84.168 +add test 10.10.84.169 +add test 10.10.84.17 +add test 10.10.84.170 +add test 10.10.84.171 +add test 10.10.84.172 +add test 10.10.84.173 +add test 10.10.84.174 +add test 10.10.84.175 +add test 10.10.84.176 +add test 10.10.84.177 +add test 10.10.84.178 +add test 10.10.84.179 +add test 10.10.84.18 +add test 10.10.84.180 +add test 10.10.84.181 +add test 10.10.84.182 +add test 10.10.84.183 +add test 10.10.84.184 +add test 10.10.84.185 +add test 10.10.84.186 +add test 10.10.84.187 +add test 10.10.84.188 +add test 10.10.84.189 +add test 10.10.84.19 +add test 10.10.84.190 +add test 10.10.84.191 +add test 10.10.84.192 +add test 10.10.84.193 +add test 10.10.84.194 +add test 10.10.84.195 +add test 10.10.84.196 +add test 10.10.84.197 +add test 10.10.84.198 +add test 10.10.84.199 +add test 10.10.84.2 +add test 10.10.84.20 +add test 10.10.84.200 +add test 10.10.84.201 +add test 10.10.84.202 +add test 10.10.84.203 +add test 10.10.84.204 +add test 10.10.84.205 +add test 10.10.84.206 +add test 10.10.84.207 +add test 10.10.84.208 +add test 10.10.84.209 +add test 10.10.84.21 +add test 10.10.84.210 +add test 10.10.84.211 +add test 10.10.84.212 +add test 10.10.84.213 +add test 10.10.84.214 +add test 10.10.84.215 +add test 10.10.84.216 +add test 10.10.84.217 +add test 10.10.84.218 +add test 10.10.84.219 +add test 10.10.84.22 +add test 10.10.84.220 +add test 10.10.84.221 +add test 10.10.84.222 +add test 10.10.84.223 +add test 10.10.84.224 +add test 10.10.84.225 +add test 10.10.84.226 +add test 10.10.84.227 +add test 10.10.84.228 +add test 10.10.84.229 +add test 10.10.84.23 +add test 10.10.84.230 +add test 10.10.84.231 +add test 10.10.84.232 +add test 10.10.84.233 +add test 10.10.84.234 +add test 10.10.84.235 +add test 10.10.84.236 +add test 10.10.84.237 +add test 10.10.84.238 +add test 10.10.84.239 +add test 10.10.84.24 +add test 10.10.84.240 +add test 10.10.84.241 +add test 10.10.84.242 +add test 10.10.84.243 +add test 10.10.84.244 +add test 10.10.84.245 +add test 10.10.84.246 +add test 10.10.84.247 +add test 10.10.84.248 +add test 10.10.84.249 +add test 10.10.84.25 +add test 10.10.84.250 +add test 10.10.84.251 +add test 10.10.84.252 +add test 10.10.84.253 +add test 10.10.84.254 +add test 10.10.84.255 +add test 10.10.84.26 +add test 10.10.84.27 +add test 10.10.84.28 +add test 10.10.84.29 +add test 10.10.84.3 +add test 10.10.84.30 +add test 10.10.84.31 +add test 10.10.84.32 +add test 10.10.84.33 +add test 10.10.84.34 +add test 10.10.84.35 +add test 10.10.84.36 +add test 10.10.84.37 +add test 10.10.84.38 +add test 10.10.84.39 +add test 10.10.84.4 +add test 10.10.84.40 +add test 10.10.84.41 +add test 10.10.84.42 +add test 10.10.84.43 +add test 10.10.84.44 +add test 10.10.84.45 +add test 10.10.84.46 +add test 10.10.84.47 +add test 10.10.84.48 +add test 10.10.84.49 +add test 10.10.84.5 +add test 10.10.84.50 +add test 10.10.84.51 +add test 10.10.84.52 +add test 10.10.84.53 +add test 10.10.84.54 +add test 10.10.84.55 +add test 10.10.84.56 +add test 10.10.84.57 +add test 10.10.84.58 +add test 10.10.84.59 +add test 10.10.84.6 +add test 10.10.84.60 +add test 10.10.84.61 +add test 10.10.84.62 +add test 10.10.84.63 +add test 10.10.84.64 +add test 10.10.84.65 +add test 10.10.84.66 +add test 10.10.84.67 +add test 10.10.84.68 +add test 10.10.84.69 +add test 10.10.84.7 +add test 10.10.84.70 +add test 10.10.84.71 +add test 10.10.84.72 +add test 10.10.84.73 +add test 10.10.84.74 +add test 10.10.84.75 +add test 10.10.84.76 +add test 10.10.84.77 +add test 10.10.84.78 +add test 10.10.84.79 +add test 10.10.84.8 +add test 10.10.84.80 +add test 10.10.84.81 +add test 10.10.84.82 +add test 10.10.84.83 +add test 10.10.84.84 +add test 10.10.84.85 +add test 10.10.84.86 +add test 10.10.84.87 +add test 10.10.84.88 +add test 10.10.84.89 +add test 10.10.84.9 +add test 10.10.84.90 +add test 10.10.84.91 +add test 10.10.84.92 +add test 10.10.84.93 +add test 10.10.84.94 +add test 10.10.84.95 +add test 10.10.84.96 +add test 10.10.84.97 +add test 10.10.84.98 +add test 10.10.84.99 +add test 10.10.85.0 +add test 10.10.85.1 +add test 10.10.85.10 +add test 10.10.85.100 +add test 10.10.85.101 +add test 10.10.85.102 +add test 10.10.85.103 +add test 10.10.85.104 +add test 10.10.85.105 +add test 10.10.85.106 +add test 10.10.85.107 +add test 10.10.85.108 +add test 10.10.85.109 +add test 10.10.85.11 +add test 10.10.85.110 +add test 10.10.85.111 +add test 10.10.85.112 +add test 10.10.85.113 +add test 10.10.85.114 +add test 10.10.85.115 +add test 10.10.85.116 +add test 10.10.85.117 +add test 10.10.85.118 +add test 10.10.85.119 +add test 10.10.85.12 +add test 10.10.85.120 +add test 10.10.85.121 +add test 10.10.85.122 +add test 10.10.85.123 +add test 10.10.85.124 +add test 10.10.85.125 +add test 10.10.85.126 +add test 10.10.85.127 +add test 10.10.85.128 +add test 10.10.85.129 +add test 10.10.85.13 +add test 10.10.85.130 +add test 10.10.85.131 +add test 10.10.85.132 +add test 10.10.85.133 +add test 10.10.85.134 +add test 10.10.85.135 +add test 10.10.85.136 +add test 10.10.85.137 +add test 10.10.85.138 +add test 10.10.85.139 +add test 10.10.85.14 +add test 10.10.85.140 +add test 10.10.85.141 +add test 10.10.85.142 +add test 10.10.85.143 +add test 10.10.85.144 +add test 10.10.85.145 +add test 10.10.85.146 +add test 10.10.85.147 +add test 10.10.85.148 +add test 10.10.85.149 +add test 10.10.85.15 +add test 10.10.85.150 +add test 10.10.85.151 +add test 10.10.85.152 +add test 10.10.85.153 +add test 10.10.85.154 +add test 10.10.85.155 +add test 10.10.85.156 +add test 10.10.85.157 +add test 10.10.85.158 +add test 10.10.85.159 +add test 10.10.85.16 +add test 10.10.85.160 +add test 10.10.85.161 +add test 10.10.85.162 +add test 10.10.85.163 +add test 10.10.85.164 +add test 10.10.85.165 +add test 10.10.85.166 +add test 10.10.85.167 +add test 10.10.85.168 +add test 10.10.85.169 +add test 10.10.85.17 +add test 10.10.85.170 +add test 10.10.85.171 +add test 10.10.85.172 +add test 10.10.85.173 +add test 10.10.85.174 +add test 10.10.85.175 +add test 10.10.85.176 +add test 10.10.85.177 +add test 10.10.85.178 +add test 10.10.85.179 +add test 10.10.85.18 +add test 10.10.85.180 +add test 10.10.85.181 +add test 10.10.85.182 +add test 10.10.85.183 +add test 10.10.85.184 +add test 10.10.85.185 +add test 10.10.85.186 +add test 10.10.85.187 +add test 10.10.85.188 +add test 10.10.85.189 +add test 10.10.85.19 +add test 10.10.85.190 +add test 10.10.85.191 +add test 10.10.85.192 +add test 10.10.85.193 +add test 10.10.85.194 +add test 10.10.85.195 +add test 10.10.85.196 +add test 10.10.85.197 +add test 10.10.85.198 +add test 10.10.85.199 +add test 10.10.85.2 +add test 10.10.85.20 +add test 10.10.85.200 +add test 10.10.85.201 +add test 10.10.85.202 +add test 10.10.85.203 +add test 10.10.85.204 +add test 10.10.85.205 +add test 10.10.85.206 +add test 10.10.85.207 +add test 10.10.85.208 +add test 10.10.85.209 +add test 10.10.85.21 +add test 10.10.85.210 +add test 10.10.85.211 +add test 10.10.85.212 +add test 10.10.85.213 +add test 10.10.85.214 +add test 10.10.85.215 +add test 10.10.85.216 +add test 10.10.85.217 +add test 10.10.85.218 +add test 10.10.85.219 +add test 10.10.85.22 +add test 10.10.85.220 +add test 10.10.85.221 +add test 10.10.85.222 +add test 10.10.85.223 +add test 10.10.85.224 +add test 10.10.85.225 +add test 10.10.85.226 +add test 10.10.85.227 +add test 10.10.85.228 +add test 10.10.85.229 +add test 10.10.85.23 +add test 10.10.85.230 +add test 10.10.85.231 +add test 10.10.85.232 +add test 10.10.85.233 +add test 10.10.85.234 +add test 10.10.85.235 +add test 10.10.85.236 +add test 10.10.85.237 +add test 10.10.85.238 +add test 10.10.85.239 +add test 10.10.85.24 +add test 10.10.85.240 +add test 10.10.85.241 +add test 10.10.85.242 +add test 10.10.85.243 +add test 10.10.85.244 +add test 10.10.85.245 +add test 10.10.85.246 +add test 10.10.85.247 +add test 10.10.85.248 +add test 10.10.85.249 +add test 10.10.85.25 +add test 10.10.85.250 +add test 10.10.85.251 +add test 10.10.85.252 +add test 10.10.85.253 +add test 10.10.85.254 +add test 10.10.85.255 +add test 10.10.85.26 +add test 10.10.85.27 +add test 10.10.85.28 +add test 10.10.85.29 +add test 10.10.85.3 +add test 10.10.85.30 +add test 10.10.85.31 +add test 10.10.85.32 +add test 10.10.85.33 +add test 10.10.85.34 +add test 10.10.85.35 +add test 10.10.85.36 +add test 10.10.85.37 +add test 10.10.85.38 +add test 10.10.85.39 +add test 10.10.85.4 +add test 10.10.85.40 +add test 10.10.85.41 +add test 10.10.85.42 +add test 10.10.85.43 +add test 10.10.85.44 +add test 10.10.85.45 +add test 10.10.85.46 +add test 10.10.85.47 +add test 10.10.85.48 +add test 10.10.85.49 +add test 10.10.85.5 +add test 10.10.85.50 +add test 10.10.85.51 +add test 10.10.85.52 +add test 10.10.85.53 +add test 10.10.85.54 +add test 10.10.85.55 +add test 10.10.85.56 +add test 10.10.85.57 +add test 10.10.85.58 +add test 10.10.85.59 +add test 10.10.85.6 +add test 10.10.85.60 +add test 10.10.85.61 +add test 10.10.85.62 +add test 10.10.85.63 +add test 10.10.85.64 +add test 10.10.85.65 +add test 10.10.85.66 +add test 10.10.85.67 +add test 10.10.85.68 +add test 10.10.85.69 +add test 10.10.85.7 +add test 10.10.85.70 +add test 10.10.85.71 +add test 10.10.85.72 +add test 10.10.85.73 +add test 10.10.85.74 +add test 10.10.85.75 +add test 10.10.85.76 +add test 10.10.85.77 +add test 10.10.85.78 +add test 10.10.85.79 +add test 10.10.85.8 +add test 10.10.85.80 +add test 10.10.85.81 +add test 10.10.85.82 +add test 10.10.85.83 +add test 10.10.85.84 +add test 10.10.85.85 +add test 10.10.85.86 +add test 10.10.85.87 +add test 10.10.85.88 +add test 10.10.85.89 +add test 10.10.85.9 +add test 10.10.85.90 +add test 10.10.85.91 +add test 10.10.85.92 +add test 10.10.85.93 +add test 10.10.85.94 +add test 10.10.85.95 +add test 10.10.85.96 +add test 10.10.85.97 +add test 10.10.85.98 +add test 10.10.85.99 +add test 10.10.86.0 +add test 10.10.86.1 +add test 10.10.86.10 +add test 10.10.86.100 +add test 10.10.86.101 +add test 10.10.86.102 +add test 10.10.86.103 +add test 10.10.86.104 +add test 10.10.86.105 +add test 10.10.86.106 +add test 10.10.86.107 +add test 10.10.86.108 +add test 10.10.86.109 +add test 10.10.86.11 +add test 10.10.86.110 +add test 10.10.86.111 +add test 10.10.86.112 +add test 10.10.86.113 +add test 10.10.86.114 +add test 10.10.86.115 +add test 10.10.86.116 +add test 10.10.86.117 +add test 10.10.86.118 +add test 10.10.86.119 +add test 10.10.86.12 +add test 10.10.86.120 +add test 10.10.86.121 +add test 10.10.86.122 +add test 10.10.86.123 +add test 10.10.86.124 +add test 10.10.86.125 +add test 10.10.86.126 +add test 10.10.86.127 +add test 10.10.86.128 +add test 10.10.86.129 +add test 10.10.86.13 +add test 10.10.86.130 +add test 10.10.86.131 +add test 10.10.86.132 +add test 10.10.86.133 +add test 10.10.86.134 +add test 10.10.86.135 +add test 10.10.86.136 +add test 10.10.86.137 +add test 10.10.86.138 +add test 10.10.86.139 +add test 10.10.86.14 +add test 10.10.86.140 +add test 10.10.86.141 +add test 10.10.86.142 +add test 10.10.86.143 +add test 10.10.86.144 +add test 10.10.86.145 +add test 10.10.86.146 +add test 10.10.86.147 +add test 10.10.86.148 +add test 10.10.86.149 +add test 10.10.86.15 +add test 10.10.86.150 +add test 10.10.86.151 +add test 10.10.86.152 +add test 10.10.86.153 +add test 10.10.86.154 +add test 10.10.86.155 +add test 10.10.86.156 +add test 10.10.86.157 +add test 10.10.86.158 +add test 10.10.86.159 +add test 10.10.86.16 +add test 10.10.86.160 +add test 10.10.86.161 +add test 10.10.86.162 +add test 10.10.86.163 +add test 10.10.86.164 +add test 10.10.86.165 +add test 10.10.86.166 +add test 10.10.86.167 +add test 10.10.86.168 +add test 10.10.86.169 +add test 10.10.86.17 +add test 10.10.86.170 +add test 10.10.86.171 +add test 10.10.86.172 +add test 10.10.86.173 +add test 10.10.86.174 +add test 10.10.86.175 +add test 10.10.86.176 +add test 10.10.86.177 +add test 10.10.86.178 +add test 10.10.86.179 +add test 10.10.86.18 +add test 10.10.86.180 +add test 10.10.86.181 +add test 10.10.86.182 +add test 10.10.86.183 +add test 10.10.86.184 +add test 10.10.86.185 +add test 10.10.86.186 +add test 10.10.86.187 +add test 10.10.86.188 +add test 10.10.86.189 +add test 10.10.86.19 +add test 10.10.86.190 +add test 10.10.86.191 +add test 10.10.86.192 +add test 10.10.86.193 +add test 10.10.86.194 +add test 10.10.86.195 +add test 10.10.86.196 +add test 10.10.86.197 +add test 10.10.86.198 +add test 10.10.86.199 +add test 10.10.86.2 +add test 10.10.86.20 +add test 10.10.86.200 +add test 10.10.86.201 +add test 10.10.86.202 +add test 10.10.86.203 +add test 10.10.86.204 +add test 10.10.86.205 +add test 10.10.86.206 +add test 10.10.86.207 +add test 10.10.86.208 +add test 10.10.86.209 +add test 10.10.86.21 +add test 10.10.86.210 +add test 10.10.86.211 +add test 10.10.86.212 +add test 10.10.86.213 +add test 10.10.86.214 +add test 10.10.86.215 +add test 10.10.86.216 +add test 10.10.86.217 +add test 10.10.86.218 +add test 10.10.86.219 +add test 10.10.86.22 +add test 10.10.86.220 +add test 10.10.86.221 +add test 10.10.86.222 +add test 10.10.86.223 +add test 10.10.86.224 +add test 10.10.86.225 +add test 10.10.86.226 +add test 10.10.86.227 +add test 10.10.86.228 +add test 10.10.86.229 +add test 10.10.86.23 +add test 10.10.86.230 +add test 10.10.86.231 +add test 10.10.86.232 +add test 10.10.86.233 +add test 10.10.86.234 +add test 10.10.86.235 +add test 10.10.86.236 +add test 10.10.86.237 +add test 10.10.86.238 +add test 10.10.86.239 +add test 10.10.86.24 +add test 10.10.86.240 +add test 10.10.86.241 +add test 10.10.86.242 +add test 10.10.86.243 +add test 10.10.86.244 +add test 10.10.86.245 +add test 10.10.86.246 +add test 10.10.86.247 +add test 10.10.86.248 +add test 10.10.86.249 +add test 10.10.86.25 +add test 10.10.86.250 +add test 10.10.86.251 +add test 10.10.86.252 +add test 10.10.86.253 +add test 10.10.86.254 +add test 10.10.86.255 +add test 10.10.86.26 +add test 10.10.86.27 +add test 10.10.86.28 +add test 10.10.86.29 +add test 10.10.86.3 +add test 10.10.86.30 +add test 10.10.86.31 +add test 10.10.86.32 +add test 10.10.86.33 +add test 10.10.86.34 +add test 10.10.86.35 +add test 10.10.86.36 +add test 10.10.86.37 +add test 10.10.86.38 +add test 10.10.86.39 +add test 10.10.86.4 +add test 10.10.86.40 +add test 10.10.86.41 +add test 10.10.86.42 +add test 10.10.86.43 +add test 10.10.86.44 +add test 10.10.86.45 +add test 10.10.86.46 +add test 10.10.86.47 +add test 10.10.86.48 +add test 10.10.86.49 +add test 10.10.86.5 +add test 10.10.86.50 +add test 10.10.86.51 +add test 10.10.86.52 +add test 10.10.86.53 +add test 10.10.86.54 +add test 10.10.86.55 +add test 10.10.86.56 +add test 10.10.86.57 +add test 10.10.86.58 +add test 10.10.86.59 +add test 10.10.86.6 +add test 10.10.86.60 +add test 10.10.86.61 +add test 10.10.86.62 +add test 10.10.86.63 +add test 10.10.86.64 +add test 10.10.86.65 +add test 10.10.86.66 +add test 10.10.86.67 +add test 10.10.86.68 +add test 10.10.86.69 +add test 10.10.86.7 +add test 10.10.86.70 +add test 10.10.86.71 +add test 10.10.86.72 +add test 10.10.86.73 +add test 10.10.86.74 +add test 10.10.86.75 +add test 10.10.86.76 +add test 10.10.86.77 +add test 10.10.86.78 +add test 10.10.86.79 +add test 10.10.86.8 +add test 10.10.86.80 +add test 10.10.86.81 +add test 10.10.86.82 +add test 10.10.86.83 +add test 10.10.86.84 +add test 10.10.86.85 +add test 10.10.86.86 +add test 10.10.86.87 +add test 10.10.86.88 +add test 10.10.86.89 +add test 10.10.86.9 +add test 10.10.86.90 +add test 10.10.86.91 +add test 10.10.86.92 +add test 10.10.86.93 +add test 10.10.86.94 +add test 10.10.86.95 +add test 10.10.86.96 +add test 10.10.86.97 +add test 10.10.86.98 +add test 10.10.86.99 +add test 10.10.87.0 +add test 10.10.87.1 +add test 10.10.87.10 +add test 10.10.87.100 +add test 10.10.87.101 +add test 10.10.87.102 +add test 10.10.87.103 +add test 10.10.87.104 +add test 10.10.87.105 +add test 10.10.87.106 +add test 10.10.87.107 +add test 10.10.87.108 +add test 10.10.87.109 +add test 10.10.87.11 +add test 10.10.87.110 +add test 10.10.87.111 +add test 10.10.87.112 +add test 10.10.87.113 +add test 10.10.87.114 +add test 10.10.87.115 +add test 10.10.87.116 +add test 10.10.87.117 +add test 10.10.87.118 +add test 10.10.87.119 +add test 10.10.87.12 +add test 10.10.87.120 +add test 10.10.87.121 +add test 10.10.87.122 +add test 10.10.87.123 +add test 10.10.87.124 +add test 10.10.87.125 +add test 10.10.87.126 +add test 10.10.87.127 +add test 10.10.87.128 +add test 10.10.87.129 +add test 10.10.87.13 +add test 10.10.87.130 +add test 10.10.87.131 +add test 10.10.87.132 +add test 10.10.87.133 +add test 10.10.87.134 +add test 10.10.87.135 +add test 10.10.87.136 +add test 10.10.87.137 +add test 10.10.87.138 +add test 10.10.87.139 +add test 10.10.87.14 +add test 10.10.87.140 +add test 10.10.87.141 +add test 10.10.87.142 +add test 10.10.87.143 +add test 10.10.87.144 +add test 10.10.87.145 +add test 10.10.87.146 +add test 10.10.87.147 +add test 10.10.87.148 +add test 10.10.87.149 +add test 10.10.87.15 +add test 10.10.87.150 +add test 10.10.87.151 +add test 10.10.87.152 +add test 10.10.87.153 +add test 10.10.87.154 +add test 10.10.87.155 +add test 10.10.87.156 +add test 10.10.87.157 +add test 10.10.87.158 +add test 10.10.87.159 +add test 10.10.87.16 +add test 10.10.87.160 +add test 10.10.87.161 +add test 10.10.87.162 +add test 10.10.87.163 +add test 10.10.87.164 +add test 10.10.87.165 +add test 10.10.87.166 +add test 10.10.87.167 +add test 10.10.87.168 +add test 10.10.87.169 +add test 10.10.87.17 +add test 10.10.87.170 +add test 10.10.87.171 +add test 10.10.87.172 +add test 10.10.87.173 +add test 10.10.87.174 +add test 10.10.87.175 +add test 10.10.87.176 +add test 10.10.87.177 +add test 10.10.87.178 +add test 10.10.87.179 +add test 10.10.87.18 +add test 10.10.87.180 +add test 10.10.87.181 +add test 10.10.87.182 +add test 10.10.87.183 +add test 10.10.87.184 +add test 10.10.87.185 +add test 10.10.87.186 +add test 10.10.87.187 +add test 10.10.87.188 +add test 10.10.87.189 +add test 10.10.87.19 +add test 10.10.87.190 +add test 10.10.87.191 +add test 10.10.87.192 +add test 10.10.87.193 +add test 10.10.87.194 +add test 10.10.87.195 +add test 10.10.87.196 +add test 10.10.87.197 +add test 10.10.87.198 +add test 10.10.87.199 +add test 10.10.87.2 +add test 10.10.87.20 +add test 10.10.87.200 +add test 10.10.87.201 +add test 10.10.87.202 +add test 10.10.87.203 +add test 10.10.87.204 +add test 10.10.87.205 +add test 10.10.87.206 +add test 10.10.87.207 +add test 10.10.87.208 +add test 10.10.87.209 +add test 10.10.87.21 +add test 10.10.87.210 +add test 10.10.87.211 +add test 10.10.87.212 +add test 10.10.87.213 +add test 10.10.87.214 +add test 10.10.87.215 +add test 10.10.87.216 +add test 10.10.87.217 +add test 10.10.87.218 +add test 10.10.87.219 +add test 10.10.87.22 +add test 10.10.87.220 +add test 10.10.87.221 +add test 10.10.87.222 +add test 10.10.87.223 +add test 10.10.87.224 +add test 10.10.87.225 +add test 10.10.87.226 +add test 10.10.87.227 +add test 10.10.87.228 +add test 10.10.87.229 +add test 10.10.87.23 +add test 10.10.87.230 +add test 10.10.87.231 +add test 10.10.87.232 +add test 10.10.87.233 +add test 10.10.87.234 +add test 10.10.87.235 +add test 10.10.87.236 +add test 10.10.87.237 +add test 10.10.87.238 +add test 10.10.87.239 +add test 10.10.87.24 +add test 10.10.87.240 +add test 10.10.87.241 +add test 10.10.87.242 +add test 10.10.87.243 +add test 10.10.87.244 +add test 10.10.87.245 +add test 10.10.87.246 +add test 10.10.87.247 +add test 10.10.87.248 +add test 10.10.87.249 +add test 10.10.87.25 +add test 10.10.87.250 +add test 10.10.87.251 +add test 10.10.87.252 +add test 10.10.87.253 +add test 10.10.87.254 +add test 10.10.87.255 +add test 10.10.87.26 +add test 10.10.87.27 +add test 10.10.87.28 +add test 10.10.87.29 +add test 10.10.87.3 +add test 10.10.87.30 +add test 10.10.87.31 +add test 10.10.87.32 +add test 10.10.87.33 +add test 10.10.87.34 +add test 10.10.87.35 +add test 10.10.87.36 +add test 10.10.87.37 +add test 10.10.87.38 +add test 10.10.87.39 +add test 10.10.87.4 +add test 10.10.87.40 +add test 10.10.87.41 +add test 10.10.87.42 +add test 10.10.87.43 +add test 10.10.87.44 +add test 10.10.87.45 +add test 10.10.87.46 +add test 10.10.87.47 +add test 10.10.87.48 +add test 10.10.87.49 +add test 10.10.87.5 +add test 10.10.87.50 +add test 10.10.87.51 +add test 10.10.87.52 +add test 10.10.87.53 +add test 10.10.87.54 +add test 10.10.87.55 +add test 10.10.87.56 +add test 10.10.87.57 +add test 10.10.87.58 +add test 10.10.87.59 +add test 10.10.87.6 +add test 10.10.87.60 +add test 10.10.87.61 +add test 10.10.87.62 +add test 10.10.87.63 +add test 10.10.87.64 +add test 10.10.87.65 +add test 10.10.87.66 +add test 10.10.87.67 +add test 10.10.87.68 +add test 10.10.87.69 +add test 10.10.87.7 +add test 10.10.87.70 +add test 10.10.87.71 +add test 10.10.87.72 +add test 10.10.87.73 +add test 10.10.87.74 +add test 10.10.87.75 +add test 10.10.87.76 +add test 10.10.87.77 +add test 10.10.87.78 +add test 10.10.87.79 +add test 10.10.87.8 +add test 10.10.87.80 +add test 10.10.87.81 +add test 10.10.87.82 +add test 10.10.87.83 +add test 10.10.87.84 +add test 10.10.87.85 +add test 10.10.87.86 +add test 10.10.87.87 +add test 10.10.87.88 +add test 10.10.87.89 +add test 10.10.87.9 +add test 10.10.87.90 +add test 10.10.87.91 +add test 10.10.87.92 +add test 10.10.87.93 +add test 10.10.87.94 +add test 10.10.87.95 +add test 10.10.87.96 +add test 10.10.87.97 +add test 10.10.87.98 +add test 10.10.87.99 +add test 10.10.88.0 +add test 10.10.88.1 +add test 10.10.88.10 +add test 10.10.88.100 +add test 10.10.88.101 +add test 10.10.88.102 +add test 10.10.88.103 +add test 10.10.88.104 +add test 10.10.88.105 +add test 10.10.88.106 +add test 10.10.88.107 +add test 10.10.88.108 +add test 10.10.88.109 +add test 10.10.88.11 +add test 10.10.88.110 +add test 10.10.88.111 +add test 10.10.88.112 +add test 10.10.88.113 +add test 10.10.88.114 +add test 10.10.88.115 +add test 10.10.88.116 +add test 10.10.88.117 +add test 10.10.88.118 +add test 10.10.88.119 +add test 10.10.88.12 +add test 10.10.88.120 +add test 10.10.88.121 +add test 10.10.88.122 +add test 10.10.88.123 +add test 10.10.88.124 +add test 10.10.88.125 +add test 10.10.88.126 +add test 10.10.88.127 +add test 10.10.88.128 +add test 10.10.88.129 +add test 10.10.88.13 +add test 10.10.88.130 +add test 10.10.88.131 +add test 10.10.88.132 +add test 10.10.88.133 +add test 10.10.88.134 +add test 10.10.88.135 +add test 10.10.88.136 +add test 10.10.88.137 +add test 10.10.88.138 +add test 10.10.88.139 +add test 10.10.88.14 +add test 10.10.88.140 +add test 10.10.88.141 +add test 10.10.88.142 +add test 10.10.88.143 +add test 10.10.88.144 +add test 10.10.88.145 +add test 10.10.88.146 +add test 10.10.88.147 +add test 10.10.88.148 +add test 10.10.88.149 +add test 10.10.88.15 +add test 10.10.88.150 +add test 10.10.88.151 +add test 10.10.88.152 +add test 10.10.88.153 +add test 10.10.88.154 +add test 10.10.88.155 +add test 10.10.88.156 +add test 10.10.88.157 +add test 10.10.88.158 +add test 10.10.88.159 +add test 10.10.88.16 +add test 10.10.88.160 +add test 10.10.88.161 +add test 10.10.88.162 +add test 10.10.88.163 +add test 10.10.88.164 +add test 10.10.88.165 +add test 10.10.88.166 +add test 10.10.88.167 +add test 10.10.88.168 +add test 10.10.88.169 +add test 10.10.88.17 +add test 10.10.88.170 +add test 10.10.88.171 +add test 10.10.88.172 +add test 10.10.88.173 +add test 10.10.88.174 +add test 10.10.88.175 +add test 10.10.88.176 +add test 10.10.88.177 +add test 10.10.88.178 +add test 10.10.88.179 +add test 10.10.88.18 +add test 10.10.88.180 +add test 10.10.88.181 +add test 10.10.88.182 +add test 10.10.88.183 +add test 10.10.88.184 +add test 10.10.88.185 +add test 10.10.88.186 +add test 10.10.88.187 +add test 10.10.88.188 +add test 10.10.88.189 +add test 10.10.88.19 +add test 10.10.88.190 +add test 10.10.88.191 +add test 10.10.88.192 +add test 10.10.88.193 +add test 10.10.88.194 +add test 10.10.88.195 +add test 10.10.88.196 +add test 10.10.88.197 +add test 10.10.88.198 +add test 10.10.88.199 +add test 10.10.88.2 +add test 10.10.88.20 +add test 10.10.88.200 +add test 10.10.88.201 +add test 10.10.88.202 +add test 10.10.88.203 +add test 10.10.88.204 +add test 10.10.88.205 +add test 10.10.88.206 +add test 10.10.88.207 +add test 10.10.88.208 +add test 10.10.88.209 +add test 10.10.88.21 +add test 10.10.88.210 +add test 10.10.88.211 +add test 10.10.88.212 +add test 10.10.88.213 +add test 10.10.88.214 +add test 10.10.88.215 +add test 10.10.88.216 +add test 10.10.88.217 +add test 10.10.88.218 +add test 10.10.88.219 +add test 10.10.88.22 +add test 10.10.88.220 +add test 10.10.88.221 +add test 10.10.88.222 +add test 10.10.88.223 +add test 10.10.88.224 +add test 10.10.88.225 +add test 10.10.88.226 +add test 10.10.88.227 +add test 10.10.88.228 +add test 10.10.88.229 +add test 10.10.88.23 +add test 10.10.88.230 +add test 10.10.88.231 +add test 10.10.88.232 +add test 10.10.88.233 +add test 10.10.88.234 +add test 10.10.88.235 +add test 10.10.88.236 +add test 10.10.88.237 +add test 10.10.88.238 +add test 10.10.88.239 +add test 10.10.88.24 +add test 10.10.88.240 +add test 10.10.88.241 +add test 10.10.88.242 +add test 10.10.88.243 +add test 10.10.88.244 +add test 10.10.88.245 +add test 10.10.88.246 +add test 10.10.88.247 +add test 10.10.88.248 +add test 10.10.88.249 +add test 10.10.88.25 +add test 10.10.88.250 +add test 10.10.88.251 +add test 10.10.88.252 +add test 10.10.88.253 +add test 10.10.88.254 +add test 10.10.88.255 +add test 10.10.88.26 +add test 10.10.88.27 +add test 10.10.88.28 +add test 10.10.88.29 +add test 10.10.88.3 +add test 10.10.88.30 +add test 10.10.88.31 +add test 10.10.88.32 +add test 10.10.88.33 +add test 10.10.88.34 +add test 10.10.88.35 +add test 10.10.88.36 +add test 10.10.88.37 +add test 10.10.88.38 +add test 10.10.88.39 +add test 10.10.88.4 +add test 10.10.88.40 +add test 10.10.88.41 +add test 10.10.88.42 +add test 10.10.88.43 +add test 10.10.88.44 +add test 10.10.88.45 +add test 10.10.88.46 +add test 10.10.88.47 +add test 10.10.88.48 +add test 10.10.88.49 +add test 10.10.88.5 +add test 10.10.88.50 +add test 10.10.88.51 +add test 10.10.88.52 +add test 10.10.88.53 +add test 10.10.88.54 +add test 10.10.88.55 +add test 10.10.88.56 +add test 10.10.88.57 +add test 10.10.88.58 +add test 10.10.88.59 +add test 10.10.88.6 +add test 10.10.88.60 +add test 10.10.88.61 +add test 10.10.88.62 +add test 10.10.88.63 +add test 10.10.88.64 +add test 10.10.88.65 +add test 10.10.88.66 +add test 10.10.88.67 +add test 10.10.88.68 +add test 10.10.88.69 +add test 10.10.88.7 +add test 10.10.88.70 +add test 10.10.88.71 +add test 10.10.88.72 +add test 10.10.88.73 +add test 10.10.88.74 +add test 10.10.88.75 +add test 10.10.88.76 +add test 10.10.88.77 +add test 10.10.88.78 +add test 10.10.88.79 +add test 10.10.88.8 +add test 10.10.88.80 +add test 10.10.88.81 +add test 10.10.88.82 +add test 10.10.88.83 +add test 10.10.88.84 +add test 10.10.88.85 +add test 10.10.88.86 +add test 10.10.88.87 +add test 10.10.88.88 +add test 10.10.88.89 +add test 10.10.88.9 +add test 10.10.88.90 +add test 10.10.88.91 +add test 10.10.88.92 +add test 10.10.88.93 +add test 10.10.88.94 +add test 10.10.88.95 +add test 10.10.88.96 +add test 10.10.88.97 +add test 10.10.88.98 +add test 10.10.88.99 +add test 10.10.89.0 +add test 10.10.89.1 +add test 10.10.89.10 +add test 10.10.89.100 +add test 10.10.89.101 +add test 10.10.89.102 +add test 10.10.89.103 +add test 10.10.89.104 +add test 10.10.89.105 +add test 10.10.89.106 +add test 10.10.89.107 +add test 10.10.89.108 +add test 10.10.89.109 +add test 10.10.89.11 +add test 10.10.89.110 +add test 10.10.89.111 +add test 10.10.89.112 +add test 10.10.89.113 +add test 10.10.89.114 +add test 10.10.89.115 +add test 10.10.89.116 +add test 10.10.89.117 +add test 10.10.89.118 +add test 10.10.89.119 +add test 10.10.89.12 +add test 10.10.89.120 +add test 10.10.89.121 +add test 10.10.89.122 +add test 10.10.89.123 +add test 10.10.89.124 +add test 10.10.89.125 +add test 10.10.89.126 +add test 10.10.89.127 +add test 10.10.89.128 +add test 10.10.89.129 +add test 10.10.89.13 +add test 10.10.89.130 +add test 10.10.89.131 +add test 10.10.89.132 +add test 10.10.89.133 +add test 10.10.89.134 +add test 10.10.89.135 +add test 10.10.89.136 +add test 10.10.89.137 +add test 10.10.89.138 +add test 10.10.89.139 +add test 10.10.89.14 +add test 10.10.89.140 +add test 10.10.89.141 +add test 10.10.89.142 +add test 10.10.89.143 +add test 10.10.89.144 +add test 10.10.89.145 +add test 10.10.89.146 +add test 10.10.89.147 +add test 10.10.89.148 +add test 10.10.89.149 +add test 10.10.89.15 +add test 10.10.89.150 +add test 10.10.89.151 +add test 10.10.89.152 +add test 10.10.89.153 +add test 10.10.89.154 +add test 10.10.89.155 +add test 10.10.89.156 +add test 10.10.89.157 +add test 10.10.89.158 +add test 10.10.89.159 +add test 10.10.89.16 +add test 10.10.89.160 +add test 10.10.89.161 +add test 10.10.89.162 +add test 10.10.89.163 +add test 10.10.89.164 +add test 10.10.89.165 +add test 10.10.89.166 +add test 10.10.89.167 +add test 10.10.89.168 +add test 10.10.89.169 +add test 10.10.89.17 +add test 10.10.89.170 +add test 10.10.89.171 +add test 10.10.89.172 +add test 10.10.89.173 +add test 10.10.89.174 +add test 10.10.89.175 +add test 10.10.89.176 +add test 10.10.89.177 +add test 10.10.89.178 +add test 10.10.89.179 +add test 10.10.89.18 +add test 10.10.89.180 +add test 10.10.89.181 +add test 10.10.89.182 +add test 10.10.89.183 +add test 10.10.89.184 +add test 10.10.89.185 +add test 10.10.89.186 +add test 10.10.89.187 +add test 10.10.89.188 +add test 10.10.89.189 +add test 10.10.89.19 +add test 10.10.89.190 +add test 10.10.89.191 +add test 10.10.89.192 +add test 10.10.89.193 +add test 10.10.89.194 +add test 10.10.89.195 +add test 10.10.89.196 +add test 10.10.89.197 +add test 10.10.89.198 +add test 10.10.89.199 +add test 10.10.89.2 +add test 10.10.89.20 +add test 10.10.89.200 +add test 10.10.89.201 +add test 10.10.89.202 +add test 10.10.89.203 +add test 10.10.89.204 +add test 10.10.89.205 +add test 10.10.89.206 +add test 10.10.89.207 +add test 10.10.89.208 +add test 10.10.89.209 +add test 10.10.89.21 +add test 10.10.89.210 +add test 10.10.89.211 +add test 10.10.89.212 +add test 10.10.89.213 +add test 10.10.89.214 +add test 10.10.89.215 +add test 10.10.89.216 +add test 10.10.89.217 +add test 10.10.89.218 +add test 10.10.89.219 +add test 10.10.89.22 +add test 10.10.89.220 +add test 10.10.89.221 +add test 10.10.89.222 +add test 10.10.89.223 +add test 10.10.89.224 +add test 10.10.89.225 +add test 10.10.89.226 +add test 10.10.89.227 +add test 10.10.89.228 +add test 10.10.89.229 +add test 10.10.89.23 +add test 10.10.89.230 +add test 10.10.89.231 +add test 10.10.89.232 +add test 10.10.89.233 +add test 10.10.89.234 +add test 10.10.89.235 +add test 10.10.89.236 +add test 10.10.89.237 +add test 10.10.89.238 +add test 10.10.89.239 +add test 10.10.89.24 +add test 10.10.89.240 +add test 10.10.89.241 +add test 10.10.89.242 +add test 10.10.89.243 +add test 10.10.89.244 +add test 10.10.89.245 +add test 10.10.89.246 +add test 10.10.89.247 +add test 10.10.89.248 +add test 10.10.89.249 +add test 10.10.89.25 +add test 10.10.89.250 +add test 10.10.89.251 +add test 10.10.89.252 +add test 10.10.89.253 +add test 10.10.89.254 +add test 10.10.89.255 +add test 10.10.89.26 +add test 10.10.89.27 +add test 10.10.89.28 +add test 10.10.89.29 +add test 10.10.89.3 +add test 10.10.89.30 +add test 10.10.89.31 +add test 10.10.89.32 +add test 10.10.89.33 +add test 10.10.89.34 +add test 10.10.89.35 +add test 10.10.89.36 +add test 10.10.89.37 +add test 10.10.89.38 +add test 10.10.89.39 +add test 10.10.89.4 +add test 10.10.89.40 +add test 10.10.89.41 +add test 10.10.89.42 +add test 10.10.89.43 +add test 10.10.89.44 +add test 10.10.89.45 +add test 10.10.89.46 +add test 10.10.89.47 +add test 10.10.89.48 +add test 10.10.89.49 +add test 10.10.89.5 +add test 10.10.89.50 +add test 10.10.89.51 +add test 10.10.89.52 +add test 10.10.89.53 +add test 10.10.89.54 +add test 10.10.89.55 +add test 10.10.89.56 +add test 10.10.89.57 +add test 10.10.89.58 +add test 10.10.89.59 +add test 10.10.89.6 +add test 10.10.89.60 +add test 10.10.89.61 +add test 10.10.89.62 +add test 10.10.89.63 +add test 10.10.89.64 +add test 10.10.89.65 +add test 10.10.89.66 +add test 10.10.89.67 +add test 10.10.89.68 +add test 10.10.89.69 +add test 10.10.89.7 +add test 10.10.89.70 +add test 10.10.89.71 +add test 10.10.89.72 +add test 10.10.89.73 +add test 10.10.89.74 +add test 10.10.89.75 +add test 10.10.89.76 +add test 10.10.89.77 +add test 10.10.89.78 +add test 10.10.89.79 +add test 10.10.89.8 +add test 10.10.89.80 +add test 10.10.89.81 +add test 10.10.89.82 +add test 10.10.89.83 +add test 10.10.89.84 +add test 10.10.89.85 +add test 10.10.89.86 +add test 10.10.89.87 +add test 10.10.89.88 +add test 10.10.89.89 +add test 10.10.89.9 +add test 10.10.89.90 +add test 10.10.89.91 +add test 10.10.89.92 +add test 10.10.89.93 +add test 10.10.89.94 +add test 10.10.89.95 +add test 10.10.89.96 +add test 10.10.89.97 +add test 10.10.89.98 +add test 10.10.89.99 +add test 10.10.9.0 +add test 10.10.9.1 +add test 10.10.9.10 +add test 10.10.9.100 +add test 10.10.9.101 +add test 10.10.9.102 +add test 10.10.9.103 +add test 10.10.9.104 +add test 10.10.9.105 +add test 10.10.9.106 +add test 10.10.9.107 +add test 10.10.9.108 +add test 10.10.9.109 +add test 10.10.9.11 +add test 10.10.9.110 +add test 10.10.9.111 +add test 10.10.9.112 +add test 10.10.9.113 +add test 10.10.9.114 +add test 10.10.9.115 +add test 10.10.9.116 +add test 10.10.9.117 +add test 10.10.9.118 +add test 10.10.9.119 +add test 10.10.9.12 +add test 10.10.9.120 +add test 10.10.9.121 +add test 10.10.9.122 +add test 10.10.9.123 +add test 10.10.9.124 +add test 10.10.9.125 +add test 10.10.9.126 +add test 10.10.9.127 +add test 10.10.9.128 +add test 10.10.9.129 +add test 10.10.9.13 +add test 10.10.9.130 +add test 10.10.9.131 +add test 10.10.9.132 +add test 10.10.9.133 +add test 10.10.9.134 +add test 10.10.9.135 +add test 10.10.9.136 +add test 10.10.9.137 +add test 10.10.9.138 +add test 10.10.9.139 +add test 10.10.9.14 +add test 10.10.9.140 +add test 10.10.9.141 +add test 10.10.9.142 +add test 10.10.9.143 +add test 10.10.9.144 +add test 10.10.9.145 +add test 10.10.9.146 +add test 10.10.9.147 +add test 10.10.9.148 +add test 10.10.9.149 +add test 10.10.9.15 +add test 10.10.9.150 +add test 10.10.9.151 +add test 10.10.9.152 +add test 10.10.9.153 +add test 10.10.9.154 +add test 10.10.9.155 +add test 10.10.9.156 +add test 10.10.9.157 +add test 10.10.9.158 +add test 10.10.9.159 +add test 10.10.9.16 +add test 10.10.9.160 +add test 10.10.9.161 +add test 10.10.9.162 +add test 10.10.9.163 +add test 10.10.9.164 +add test 10.10.9.165 +add test 10.10.9.166 +add test 10.10.9.167 +add test 10.10.9.168 +add test 10.10.9.169 +add test 10.10.9.17 +add test 10.10.9.170 +add test 10.10.9.171 +add test 10.10.9.172 +add test 10.10.9.173 +add test 10.10.9.174 +add test 10.10.9.175 +add test 10.10.9.176 +add test 10.10.9.177 +add test 10.10.9.178 +add test 10.10.9.179 +add test 10.10.9.18 +add test 10.10.9.180 +add test 10.10.9.181 +add test 10.10.9.182 +add test 10.10.9.183 +add test 10.10.9.184 +add test 10.10.9.185 +add test 10.10.9.186 +add test 10.10.9.187 +add test 10.10.9.188 +add test 10.10.9.189 +add test 10.10.9.19 +add test 10.10.9.190 +add test 10.10.9.191 +add test 10.10.9.192 +add test 10.10.9.193 +add test 10.10.9.194 +add test 10.10.9.195 +add test 10.10.9.196 +add test 10.10.9.197 +add test 10.10.9.198 +add test 10.10.9.199 +add test 10.10.9.2 +add test 10.10.9.20 +add test 10.10.9.200 +add test 10.10.9.201 +add test 10.10.9.202 +add test 10.10.9.203 +add test 10.10.9.204 +add test 10.10.9.205 +add test 10.10.9.206 +add test 10.10.9.207 +add test 10.10.9.208 +add test 10.10.9.209 +add test 10.10.9.21 +add test 10.10.9.210 +add test 10.10.9.211 +add test 10.10.9.212 +add test 10.10.9.213 +add test 10.10.9.214 +add test 10.10.9.215 +add test 10.10.9.216 +add test 10.10.9.217 +add test 10.10.9.218 +add test 10.10.9.219 +add test 10.10.9.22 +add test 10.10.9.220 +add test 10.10.9.221 +add test 10.10.9.222 +add test 10.10.9.223 +add test 10.10.9.224 +add test 10.10.9.225 +add test 10.10.9.226 +add test 10.10.9.227 +add test 10.10.9.228 +add test 10.10.9.229 +add test 10.10.9.23 +add test 10.10.9.230 +add test 10.10.9.231 +add test 10.10.9.232 +add test 10.10.9.233 +add test 10.10.9.234 +add test 10.10.9.235 +add test 10.10.9.236 +add test 10.10.9.237 +add test 10.10.9.238 +add test 10.10.9.239 +add test 10.10.9.24 +add test 10.10.9.240 +add test 10.10.9.241 +add test 10.10.9.242 +add test 10.10.9.243 +add test 10.10.9.244 +add test 10.10.9.245 +add test 10.10.9.246 +add test 10.10.9.247 +add test 10.10.9.248 +add test 10.10.9.249 +add test 10.10.9.25 +add test 10.10.9.250 +add test 10.10.9.251 +add test 10.10.9.252 +add test 10.10.9.253 +add test 10.10.9.254 +add test 10.10.9.255 +add test 10.10.9.26 +add test 10.10.9.27 +add test 10.10.9.28 +add test 10.10.9.29 +add test 10.10.9.3 +add test 10.10.9.30 +add test 10.10.9.31 +add test 10.10.9.32 +add test 10.10.9.33 +add test 10.10.9.34 +add test 10.10.9.35 +add test 10.10.9.36 +add test 10.10.9.37 +add test 10.10.9.38 +add test 10.10.9.39 +add test 10.10.9.4 +add test 10.10.9.40 +add test 10.10.9.41 +add test 10.10.9.42 +add test 10.10.9.43 +add test 10.10.9.44 +add test 10.10.9.45 +add test 10.10.9.46 +add test 10.10.9.47 +add test 10.10.9.48 +add test 10.10.9.49 +add test 10.10.9.5 +add test 10.10.9.50 +add test 10.10.9.51 +add test 10.10.9.52 +add test 10.10.9.53 +add test 10.10.9.54 +add test 10.10.9.55 +add test 10.10.9.56 +add test 10.10.9.57 +add test 10.10.9.58 +add test 10.10.9.59 +add test 10.10.9.6 +add test 10.10.9.60 +add test 10.10.9.61 +add test 10.10.9.62 +add test 10.10.9.63 +add test 10.10.9.64 +add test 10.10.9.65 +add test 10.10.9.66 +add test 10.10.9.67 +add test 10.10.9.68 +add test 10.10.9.69 +add test 10.10.9.7 +add test 10.10.9.70 +add test 10.10.9.71 +add test 10.10.9.72 +add test 10.10.9.73 +add test 10.10.9.74 +add test 10.10.9.75 +add test 10.10.9.76 +add test 10.10.9.77 +add test 10.10.9.78 +add test 10.10.9.79 +add test 10.10.9.8 +add test 10.10.9.80 +add test 10.10.9.81 +add test 10.10.9.82 +add test 10.10.9.83 +add test 10.10.9.84 +add test 10.10.9.85 +add test 10.10.9.86 +add test 10.10.9.87 +add test 10.10.9.88 +add test 10.10.9.89 +add test 10.10.9.9 +add test 10.10.9.90 +add test 10.10.9.91 +add test 10.10.9.92 +add test 10.10.9.93 +add test 10.10.9.94 +add test 10.10.9.95 +add test 10.10.9.96 +add test 10.10.9.97 +add test 10.10.9.98 +add test 10.10.9.99 +add test 10.10.90.0 +add test 10.10.90.1 +add test 10.10.90.10 +add test 10.10.90.100 +add test 10.10.90.101 +add test 10.10.90.102 +add test 10.10.90.103 +add test 10.10.90.104 +add test 10.10.90.105 +add test 10.10.90.106 +add test 10.10.90.107 +add test 10.10.90.108 +add test 10.10.90.109 +add test 10.10.90.11 +add test 10.10.90.110 +add test 10.10.90.111 +add test 10.10.90.112 +add test 10.10.90.113 +add test 10.10.90.114 +add test 10.10.90.115 +add test 10.10.90.116 +add test 10.10.90.117 +add test 10.10.90.118 +add test 10.10.90.119 +add test 10.10.90.12 +add test 10.10.90.120 +add test 10.10.90.121 +add test 10.10.90.122 +add test 10.10.90.123 +add test 10.10.90.124 +add test 10.10.90.125 +add test 10.10.90.126 +add test 10.10.90.127 +add test 10.10.90.128 +add test 10.10.90.129 +add test 10.10.90.13 +add test 10.10.90.130 +add test 10.10.90.131 +add test 10.10.90.132 +add test 10.10.90.133 +add test 10.10.90.134 +add test 10.10.90.135 +add test 10.10.90.136 +add test 10.10.90.137 +add test 10.10.90.138 +add test 10.10.90.139 +add test 10.10.90.14 +add test 10.10.90.140 +add test 10.10.90.141 +add test 10.10.90.142 +add test 10.10.90.143 +add test 10.10.90.144 +add test 10.10.90.145 +add test 10.10.90.146 +add test 10.10.90.147 +add test 10.10.90.148 +add test 10.10.90.149 +add test 10.10.90.15 +add test 10.10.90.150 +add test 10.10.90.151 +add test 10.10.90.152 +add test 10.10.90.153 +add test 10.10.90.154 +add test 10.10.90.155 +add test 10.10.90.156 +add test 10.10.90.157 +add test 10.10.90.158 +add test 10.10.90.159 +add test 10.10.90.16 +add test 10.10.90.160 +add test 10.10.90.161 +add test 10.10.90.162 +add test 10.10.90.163 +add test 10.10.90.164 +add test 10.10.90.165 +add test 10.10.90.166 +add test 10.10.90.167 +add test 10.10.90.168 +add test 10.10.90.169 +add test 10.10.90.17 +add test 10.10.90.170 +add test 10.10.90.171 +add test 10.10.90.172 +add test 10.10.90.173 +add test 10.10.90.174 +add test 10.10.90.175 +add test 10.10.90.176 +add test 10.10.90.177 +add test 10.10.90.178 +add test 10.10.90.179 +add test 10.10.90.18 +add test 10.10.90.180 +add test 10.10.90.181 +add test 10.10.90.182 +add test 10.10.90.183 +add test 10.10.90.184 +add test 10.10.90.185 +add test 10.10.90.186 +add test 10.10.90.187 +add test 10.10.90.188 +add test 10.10.90.189 +add test 10.10.90.19 +add test 10.10.90.190 +add test 10.10.90.191 +add test 10.10.90.192 +add test 10.10.90.193 +add test 10.10.90.194 +add test 10.10.90.195 +add test 10.10.90.196 +add test 10.10.90.197 +add test 10.10.90.198 +add test 10.10.90.199 +add test 10.10.90.2 +add test 10.10.90.20 +add test 10.10.90.200 +add test 10.10.90.201 +add test 10.10.90.202 +add test 10.10.90.203 +add test 10.10.90.204 +add test 10.10.90.205 +add test 10.10.90.206 +add test 10.10.90.207 +add test 10.10.90.208 +add test 10.10.90.209 +add test 10.10.90.21 +add test 10.10.90.210 +add test 10.10.90.211 +add test 10.10.90.212 +add test 10.10.90.213 +add test 10.10.90.214 +add test 10.10.90.215 +add test 10.10.90.216 +add test 10.10.90.217 +add test 10.10.90.218 +add test 10.10.90.219 +add test 10.10.90.22 +add test 10.10.90.220 +add test 10.10.90.221 +add test 10.10.90.222 +add test 10.10.90.223 +add test 10.10.90.224 +add test 10.10.90.225 +add test 10.10.90.226 +add test 10.10.90.227 +add test 10.10.90.228 +add test 10.10.90.229 +add test 10.10.90.23 +add test 10.10.90.230 +add test 10.10.90.231 +add test 10.10.90.232 +add test 10.10.90.233 +add test 10.10.90.234 +add test 10.10.90.235 +add test 10.10.90.236 +add test 10.10.90.237 +add test 10.10.90.238 +add test 10.10.90.239 +add test 10.10.90.24 +add test 10.10.90.240 +add test 10.10.90.241 +add test 10.10.90.242 +add test 10.10.90.243 +add test 10.10.90.244 +add test 10.10.90.245 +add test 10.10.90.246 +add test 10.10.90.247 +add test 10.10.90.248 +add test 10.10.90.249 +add test 10.10.90.25 +add test 10.10.90.250 +add test 10.10.90.251 +add test 10.10.90.252 +add test 10.10.90.253 +add test 10.10.90.254 +add test 10.10.90.255 +add test 10.10.90.26 +add test 10.10.90.27 +add test 10.10.90.28 +add test 10.10.90.29 +add test 10.10.90.3 +add test 10.10.90.30 +add test 10.10.90.31 +add test 10.10.90.32 +add test 10.10.90.33 +add test 10.10.90.34 +add test 10.10.90.35 +add test 10.10.90.36 +add test 10.10.90.37 +add test 10.10.90.38 +add test 10.10.90.39 +add test 10.10.90.4 +add test 10.10.90.40 +add test 10.10.90.41 +add test 10.10.90.42 +add test 10.10.90.43 +add test 10.10.90.44 +add test 10.10.90.45 +add test 10.10.90.46 +add test 10.10.90.47 +add test 10.10.90.48 +add test 10.10.90.49 +add test 10.10.90.5 +add test 10.10.90.50 +add test 10.10.90.51 +add test 10.10.90.52 +add test 10.10.90.53 +add test 10.10.90.54 +add test 10.10.90.55 +add test 10.10.90.56 +add test 10.10.90.57 +add test 10.10.90.58 +add test 10.10.90.59 +add test 10.10.90.6 +add test 10.10.90.60 +add test 10.10.90.61 +add test 10.10.90.62 +add test 10.10.90.63 +add test 10.10.90.64 +add test 10.10.90.65 +add test 10.10.90.66 +add test 10.10.90.67 +add test 10.10.90.68 +add test 10.10.90.69 +add test 10.10.90.7 +add test 10.10.90.70 +add test 10.10.90.71 +add test 10.10.90.72 +add test 10.10.90.73 +add test 10.10.90.74 +add test 10.10.90.75 +add test 10.10.90.76 +add test 10.10.90.77 +add test 10.10.90.78 +add test 10.10.90.79 +add test 10.10.90.8 +add test 10.10.90.80 +add test 10.10.90.81 +add test 10.10.90.82 +add test 10.10.90.83 +add test 10.10.90.84 +add test 10.10.90.85 +add test 10.10.90.86 +add test 10.10.90.87 +add test 10.10.90.88 +add test 10.10.90.89 +add test 10.10.90.9 +add test 10.10.90.90 +add test 10.10.90.91 +add test 10.10.90.92 +add test 10.10.90.93 +add test 10.10.90.94 +add test 10.10.90.95 +add test 10.10.90.96 +add test 10.10.90.97 +add test 10.10.90.98 +add test 10.10.90.99 +add test 10.10.91.0 +add test 10.10.91.1 +add test 10.10.91.10 +add test 10.10.91.100 +add test 10.10.91.101 +add test 10.10.91.102 +add test 10.10.91.103 +add test 10.10.91.104 +add test 10.10.91.105 +add test 10.10.91.106 +add test 10.10.91.107 +add test 10.10.91.108 +add test 10.10.91.109 +add test 10.10.91.11 +add test 10.10.91.110 +add test 10.10.91.111 +add test 10.10.91.112 +add test 10.10.91.113 +add test 10.10.91.114 +add test 10.10.91.115 +add test 10.10.91.116 +add test 10.10.91.117 +add test 10.10.91.118 +add test 10.10.91.119 +add test 10.10.91.12 +add test 10.10.91.120 +add test 10.10.91.121 +add test 10.10.91.122 +add test 10.10.91.123 +add test 10.10.91.124 +add test 10.10.91.125 +add test 10.10.91.126 +add test 10.10.91.127 +add test 10.10.91.128 +add test 10.10.91.129 +add test 10.10.91.13 +add test 10.10.91.130 +add test 10.10.91.131 +add test 10.10.91.132 +add test 10.10.91.133 +add test 10.10.91.134 +add test 10.10.91.135 +add test 10.10.91.136 +add test 10.10.91.137 +add test 10.10.91.138 +add test 10.10.91.139 +add test 10.10.91.14 +add test 10.10.91.140 +add test 10.10.91.141 +add test 10.10.91.142 +add test 10.10.91.143 +add test 10.10.91.144 +add test 10.10.91.145 +add test 10.10.91.146 +add test 10.10.91.147 +add test 10.10.91.148 +add test 10.10.91.149 +add test 10.10.91.15 +add test 10.10.91.150 +add test 10.10.91.151 +add test 10.10.91.152 +add test 10.10.91.153 +add test 10.10.91.154 +add test 10.10.91.155 +add test 10.10.91.156 +add test 10.10.91.157 +add test 10.10.91.158 +add test 10.10.91.159 +add test 10.10.91.16 +add test 10.10.91.160 +add test 10.10.91.161 +add test 10.10.91.162 +add test 10.10.91.163 +add test 10.10.91.164 +add test 10.10.91.165 +add test 10.10.91.166 +add test 10.10.91.167 +add test 10.10.91.168 +add test 10.10.91.169 +add test 10.10.91.17 +add test 10.10.91.170 +add test 10.10.91.171 +add test 10.10.91.172 +add test 10.10.91.173 +add test 10.10.91.174 +add test 10.10.91.175 +add test 10.10.91.176 +add test 10.10.91.177 +add test 10.10.91.178 +add test 10.10.91.179 +add test 10.10.91.18 +add test 10.10.91.180 +add test 10.10.91.181 +add test 10.10.91.182 +add test 10.10.91.183 +add test 10.10.91.184 +add test 10.10.91.185 +add test 10.10.91.186 +add test 10.10.91.187 +add test 10.10.91.188 +add test 10.10.91.189 +add test 10.10.91.19 +add test 10.10.91.190 +add test 10.10.91.191 +add test 10.10.91.192 +add test 10.10.91.193 +add test 10.10.91.194 +add test 10.10.91.195 +add test 10.10.91.196 +add test 10.10.91.197 +add test 10.10.91.198 +add test 10.10.91.199 +add test 10.10.91.2 +add test 10.10.91.20 +add test 10.10.91.200 +add test 10.10.91.201 +add test 10.10.91.202 +add test 10.10.91.203 +add test 10.10.91.204 +add test 10.10.91.205 +add test 10.10.91.206 +add test 10.10.91.207 +add test 10.10.91.208 +add test 10.10.91.209 +add test 10.10.91.21 +add test 10.10.91.210 +add test 10.10.91.211 +add test 10.10.91.212 +add test 10.10.91.213 +add test 10.10.91.214 +add test 10.10.91.215 +add test 10.10.91.216 +add test 10.10.91.217 +add test 10.10.91.218 +add test 10.10.91.219 +add test 10.10.91.22 +add test 10.10.91.220 +add test 10.10.91.221 +add test 10.10.91.222 +add test 10.10.91.223 +add test 10.10.91.224 +add test 10.10.91.225 +add test 10.10.91.226 +add test 10.10.91.227 +add test 10.10.91.228 +add test 10.10.91.229 +add test 10.10.91.23 +add test 10.10.91.230 +add test 10.10.91.231 +add test 10.10.91.232 +add test 10.10.91.233 +add test 10.10.91.234 +add test 10.10.91.235 +add test 10.10.91.236 +add test 10.10.91.237 +add test 10.10.91.238 +add test 10.10.91.239 +add test 10.10.91.24 +add test 10.10.91.240 +add test 10.10.91.241 +add test 10.10.91.242 +add test 10.10.91.243 +add test 10.10.91.244 +add test 10.10.91.245 +add test 10.10.91.246 +add test 10.10.91.247 +add test 10.10.91.248 +add test 10.10.91.249 +add test 10.10.91.25 +add test 10.10.91.250 +add test 10.10.91.251 +add test 10.10.91.252 +add test 10.10.91.253 +add test 10.10.91.254 +add test 10.10.91.255 +add test 10.10.91.26 +add test 10.10.91.27 +add test 10.10.91.28 +add test 10.10.91.29 +add test 10.10.91.3 +add test 10.10.91.30 +add test 10.10.91.31 +add test 10.10.91.32 +add test 10.10.91.33 +add test 10.10.91.34 +add test 10.10.91.35 +add test 10.10.91.36 +add test 10.10.91.37 +add test 10.10.91.38 +add test 10.10.91.39 +add test 10.10.91.4 +add test 10.10.91.40 +add test 10.10.91.41 +add test 10.10.91.42 +add test 10.10.91.43 +add test 10.10.91.44 +add test 10.10.91.45 +add test 10.10.91.46 +add test 10.10.91.47 +add test 10.10.91.48 +add test 10.10.91.49 +add test 10.10.91.5 +add test 10.10.91.50 +add test 10.10.91.51 +add test 10.10.91.52 +add test 10.10.91.53 +add test 10.10.91.54 +add test 10.10.91.55 +add test 10.10.91.56 +add test 10.10.91.57 +add test 10.10.91.58 +add test 10.10.91.59 +add test 10.10.91.6 +add test 10.10.91.60 +add test 10.10.91.61 +add test 10.10.91.62 +add test 10.10.91.63 +add test 10.10.91.64 +add test 10.10.91.65 +add test 10.10.91.66 +add test 10.10.91.67 +add test 10.10.91.68 +add test 10.10.91.69 +add test 10.10.91.7 +add test 10.10.91.70 +add test 10.10.91.71 +add test 10.10.91.72 +add test 10.10.91.73 +add test 10.10.91.74 +add test 10.10.91.75 +add test 10.10.91.76 +add test 10.10.91.77 +add test 10.10.91.78 +add test 10.10.91.79 +add test 10.10.91.8 +add test 10.10.91.80 +add test 10.10.91.81 +add test 10.10.91.82 +add test 10.10.91.83 +add test 10.10.91.84 +add test 10.10.91.85 +add test 10.10.91.86 +add test 10.10.91.87 +add test 10.10.91.88 +add test 10.10.91.89 +add test 10.10.91.9 +add test 10.10.91.90 +add test 10.10.91.91 +add test 10.10.91.92 +add test 10.10.91.93 +add test 10.10.91.94 +add test 10.10.91.95 +add test 10.10.91.96 +add test 10.10.91.97 +add test 10.10.91.98 +add test 10.10.91.99 +add test 10.10.92.0 +add test 10.10.92.1 +add test 10.10.92.10 +add test 10.10.92.100 +add test 10.10.92.101 +add test 10.10.92.102 +add test 10.10.92.103 +add test 10.10.92.104 +add test 10.10.92.105 +add test 10.10.92.106 +add test 10.10.92.107 +add test 10.10.92.108 +add test 10.10.92.109 +add test 10.10.92.11 +add test 10.10.92.110 +add test 10.10.92.111 +add test 10.10.92.112 +add test 10.10.92.113 +add test 10.10.92.114 +add test 10.10.92.115 +add test 10.10.92.116 +add test 10.10.92.117 +add test 10.10.92.118 +add test 10.10.92.119 +add test 10.10.92.12 +add test 10.10.92.120 +add test 10.10.92.121 +add test 10.10.92.122 +add test 10.10.92.123 +add test 10.10.92.124 +add test 10.10.92.125 +add test 10.10.92.126 +add test 10.10.92.127 +add test 10.10.92.128 +add test 10.10.92.129 +add test 10.10.92.13 +add test 10.10.92.130 +add test 10.10.92.131 +add test 10.10.92.132 +add test 10.10.92.133 +add test 10.10.92.134 +add test 10.10.92.135 +add test 10.10.92.136 +add test 10.10.92.137 +add test 10.10.92.138 +add test 10.10.92.139 +add test 10.10.92.14 +add test 10.10.92.140 +add test 10.10.92.141 +add test 10.10.92.142 +add test 10.10.92.143 +add test 10.10.92.144 +add test 10.10.92.145 +add test 10.10.92.146 +add test 10.10.92.147 +add test 10.10.92.148 +add test 10.10.92.149 +add test 10.10.92.15 +add test 10.10.92.150 +add test 10.10.92.151 +add test 10.10.92.152 +add test 10.10.92.153 +add test 10.10.92.154 +add test 10.10.92.155 +add test 10.10.92.156 +add test 10.10.92.157 +add test 10.10.92.158 +add test 10.10.92.159 +add test 10.10.92.16 +add test 10.10.92.160 +add test 10.10.92.161 +add test 10.10.92.162 +add test 10.10.92.163 +add test 10.10.92.164 +add test 10.10.92.165 +add test 10.10.92.166 +add test 10.10.92.167 +add test 10.10.92.168 +add test 10.10.92.169 +add test 10.10.92.17 +add test 10.10.92.170 +add test 10.10.92.171 +add test 10.10.92.172 +add test 10.10.92.173 +add test 10.10.92.174 +add test 10.10.92.175 +add test 10.10.92.176 +add test 10.10.92.177 +add test 10.10.92.178 +add test 10.10.92.179 +add test 10.10.92.18 +add test 10.10.92.180 +add test 10.10.92.181 +add test 10.10.92.182 +add test 10.10.92.183 +add test 10.10.92.184 +add test 10.10.92.185 +add test 10.10.92.186 +add test 10.10.92.187 +add test 10.10.92.188 +add test 10.10.92.189 +add test 10.10.92.19 +add test 10.10.92.190 +add test 10.10.92.191 +add test 10.10.92.192 +add test 10.10.92.193 +add test 10.10.92.194 +add test 10.10.92.195 +add test 10.10.92.196 +add test 10.10.92.197 +add test 10.10.92.198 +add test 10.10.92.199 +add test 10.10.92.2 +add test 10.10.92.20 +add test 10.10.92.200 +add test 10.10.92.201 +add test 10.10.92.202 +add test 10.10.92.203 +add test 10.10.92.204 +add test 10.10.92.205 +add test 10.10.92.206 +add test 10.10.92.207 +add test 10.10.92.208 +add test 10.10.92.209 +add test 10.10.92.21 +add test 10.10.92.210 +add test 10.10.92.211 +add test 10.10.92.212 +add test 10.10.92.213 +add test 10.10.92.214 +add test 10.10.92.215 +add test 10.10.92.216 +add test 10.10.92.217 +add test 10.10.92.218 +add test 10.10.92.219 +add test 10.10.92.22 +add test 10.10.92.220 +add test 10.10.92.221 +add test 10.10.92.222 +add test 10.10.92.223 +add test 10.10.92.224 +add test 10.10.92.225 +add test 10.10.92.226 +add test 10.10.92.227 +add test 10.10.92.228 +add test 10.10.92.229 +add test 10.10.92.23 +add test 10.10.92.230 +add test 10.10.92.231 +add test 10.10.92.232 +add test 10.10.92.233 +add test 10.10.92.234 +add test 10.10.92.235 +add test 10.10.92.236 +add test 10.10.92.237 +add test 10.10.92.238 +add test 10.10.92.239 +add test 10.10.92.24 +add test 10.10.92.240 +add test 10.10.92.241 +add test 10.10.92.242 +add test 10.10.92.243 +add test 10.10.92.244 +add test 10.10.92.245 +add test 10.10.92.246 +add test 10.10.92.247 +add test 10.10.92.248 +add test 10.10.92.249 +add test 10.10.92.25 +add test 10.10.92.250 +add test 10.10.92.251 +add test 10.10.92.252 +add test 10.10.92.253 +add test 10.10.92.254 +add test 10.10.92.255 +add test 10.10.92.26 +add test 10.10.92.27 +add test 10.10.92.28 +add test 10.10.92.29 +add test 10.10.92.3 +add test 10.10.92.30 +add test 10.10.92.31 +add test 10.10.92.32 +add test 10.10.92.33 +add test 10.10.92.34 +add test 10.10.92.35 +add test 10.10.92.36 +add test 10.10.92.37 +add test 10.10.92.38 +add test 10.10.92.39 +add test 10.10.92.4 +add test 10.10.92.40 +add test 10.10.92.41 +add test 10.10.92.42 +add test 10.10.92.43 +add test 10.10.92.44 +add test 10.10.92.45 +add test 10.10.92.46 +add test 10.10.92.47 +add test 10.10.92.48 +add test 10.10.92.49 +add test 10.10.92.5 +add test 10.10.92.50 +add test 10.10.92.51 +add test 10.10.92.52 +add test 10.10.92.53 +add test 10.10.92.54 +add test 10.10.92.55 +add test 10.10.92.56 +add test 10.10.92.57 +add test 10.10.92.58 +add test 10.10.92.59 +add test 10.10.92.6 +add test 10.10.92.60 +add test 10.10.92.61 +add test 10.10.92.62 +add test 10.10.92.63 +add test 10.10.92.64 +add test 10.10.92.65 +add test 10.10.92.66 +add test 10.10.92.67 +add test 10.10.92.68 +add test 10.10.92.69 +add test 10.10.92.7 +add test 10.10.92.70 +add test 10.10.92.71 +add test 10.10.92.72 +add test 10.10.92.73 +add test 10.10.92.74 +add test 10.10.92.75 +add test 10.10.92.76 +add test 10.10.92.77 +add test 10.10.92.78 +add test 10.10.92.79 +add test 10.10.92.8 +add test 10.10.92.80 +add test 10.10.92.81 +add test 10.10.92.82 +add test 10.10.92.83 +add test 10.10.92.84 +add test 10.10.92.85 +add test 10.10.92.86 +add test 10.10.92.87 +add test 10.10.92.88 +add test 10.10.92.89 +add test 10.10.92.9 +add test 10.10.92.90 +add test 10.10.92.91 +add test 10.10.92.92 +add test 10.10.92.93 +add test 10.10.92.94 +add test 10.10.92.95 +add test 10.10.92.96 +add test 10.10.92.97 +add test 10.10.92.98 +add test 10.10.92.99 +add test 10.10.93.0 +add test 10.10.93.1 +add test 10.10.93.10 +add test 10.10.93.100 +add test 10.10.93.101 +add test 10.10.93.102 +add test 10.10.93.103 +add test 10.10.93.104 +add test 10.10.93.105 +add test 10.10.93.106 +add test 10.10.93.107 +add test 10.10.93.108 +add test 10.10.93.109 +add test 10.10.93.11 +add test 10.10.93.110 +add test 10.10.93.111 +add test 10.10.93.112 +add test 10.10.93.113 +add test 10.10.93.114 +add test 10.10.93.115 +add test 10.10.93.116 +add test 10.10.93.117 +add test 10.10.93.118 +add test 10.10.93.119 +add test 10.10.93.12 +add test 10.10.93.120 +add test 10.10.93.121 +add test 10.10.93.122 +add test 10.10.93.123 +add test 10.10.93.124 +add test 10.10.93.125 +add test 10.10.93.126 +add test 10.10.93.127 +add test 10.10.93.128 +add test 10.10.93.129 +add test 10.10.93.13 +add test 10.10.93.130 +add test 10.10.93.131 +add test 10.10.93.132 +add test 10.10.93.133 +add test 10.10.93.134 +add test 10.10.93.135 +add test 10.10.93.136 +add test 10.10.93.137 +add test 10.10.93.138 +add test 10.10.93.139 +add test 10.10.93.14 +add test 10.10.93.140 +add test 10.10.93.141 +add test 10.10.93.142 +add test 10.10.93.143 +add test 10.10.93.144 +add test 10.10.93.145 +add test 10.10.93.146 +add test 10.10.93.147 +add test 10.10.93.148 +add test 10.10.93.149 +add test 10.10.93.15 +add test 10.10.93.150 +add test 10.10.93.151 +add test 10.10.93.152 +add test 10.10.93.153 +add test 10.10.93.154 +add test 10.10.93.155 +add test 10.10.93.156 +add test 10.10.93.157 +add test 10.10.93.158 +add test 10.10.93.159 +add test 10.10.93.16 +add test 10.10.93.160 +add test 10.10.93.161 +add test 10.10.93.162 +add test 10.10.93.163 +add test 10.10.93.164 +add test 10.10.93.165 +add test 10.10.93.166 +add test 10.10.93.167 +add test 10.10.93.168 +add test 10.10.93.169 +add test 10.10.93.17 +add test 10.10.93.170 +add test 10.10.93.171 +add test 10.10.93.172 +add test 10.10.93.173 +add test 10.10.93.174 +add test 10.10.93.175 +add test 10.10.93.176 +add test 10.10.93.177 +add test 10.10.93.178 +add test 10.10.93.179 +add test 10.10.93.18 +add test 10.10.93.180 +add test 10.10.93.181 +add test 10.10.93.182 +add test 10.10.93.183 +add test 10.10.93.184 +add test 10.10.93.185 +add test 10.10.93.186 +add test 10.10.93.187 +add test 10.10.93.188 +add test 10.10.93.189 +add test 10.10.93.19 +add test 10.10.93.190 +add test 10.10.93.191 +add test 10.10.93.192 +add test 10.10.93.193 +add test 10.10.93.194 +add test 10.10.93.195 +add test 10.10.93.196 +add test 10.10.93.197 +add test 10.10.93.198 +add test 10.10.93.199 +add test 10.10.93.2 +add test 10.10.93.20 +add test 10.10.93.200 +add test 10.10.93.201 +add test 10.10.93.202 +add test 10.10.93.203 +add test 10.10.93.204 +add test 10.10.93.205 +add test 10.10.93.206 +add test 10.10.93.207 +add test 10.10.93.208 +add test 10.10.93.209 +add test 10.10.93.21 +add test 10.10.93.210 +add test 10.10.93.211 +add test 10.10.93.212 +add test 10.10.93.213 +add test 10.10.93.214 +add test 10.10.93.215 +add test 10.10.93.216 +add test 10.10.93.217 +add test 10.10.93.218 +add test 10.10.93.219 +add test 10.10.93.22 +add test 10.10.93.220 +add test 10.10.93.221 +add test 10.10.93.222 +add test 10.10.93.223 +add test 10.10.93.224 +add test 10.10.93.225 +add test 10.10.93.226 +add test 10.10.93.227 +add test 10.10.93.228 +add test 10.10.93.229 +add test 10.10.93.23 +add test 10.10.93.230 +add test 10.10.93.231 +add test 10.10.93.232 +add test 10.10.93.233 +add test 10.10.93.234 +add test 10.10.93.235 +add test 10.10.93.236 +add test 10.10.93.237 +add test 10.10.93.238 +add test 10.10.93.239 +add test 10.10.93.24 +add test 10.10.93.240 +add test 10.10.93.241 +add test 10.10.93.242 +add test 10.10.93.243 +add test 10.10.93.244 +add test 10.10.93.245 +add test 10.10.93.246 +add test 10.10.93.247 +add test 10.10.93.248 +add test 10.10.93.249 +add test 10.10.93.25 +add test 10.10.93.250 +add test 10.10.93.251 +add test 10.10.93.252 +add test 10.10.93.253 +add test 10.10.93.254 +add test 10.10.93.255 +add test 10.10.93.26 +add test 10.10.93.27 +add test 10.10.93.28 +add test 10.10.93.29 +add test 10.10.93.3 +add test 10.10.93.30 +add test 10.10.93.31 +add test 10.10.93.32 +add test 10.10.93.33 +add test 10.10.93.34 +add test 10.10.93.35 +add test 10.10.93.36 +add test 10.10.93.37 +add test 10.10.93.38 +add test 10.10.93.39 +add test 10.10.93.4 +add test 10.10.93.40 +add test 10.10.93.41 +add test 10.10.93.42 +add test 10.10.93.43 +add test 10.10.93.44 +add test 10.10.93.45 +add test 10.10.93.46 +add test 10.10.93.47 +add test 10.10.93.48 +add test 10.10.93.49 +add test 10.10.93.5 +add test 10.10.93.50 +add test 10.10.93.51 +add test 10.10.93.52 +add test 10.10.93.53 +add test 10.10.93.54 +add test 10.10.93.55 +add test 10.10.93.56 +add test 10.10.93.57 +add test 10.10.93.58 +add test 10.10.93.59 +add test 10.10.93.6 +add test 10.10.93.60 +add test 10.10.93.61 +add test 10.10.93.62 +add test 10.10.93.63 +add test 10.10.93.64 +add test 10.10.93.65 +add test 10.10.93.66 +add test 10.10.93.67 +add test 10.10.93.68 +add test 10.10.93.69 +add test 10.10.93.7 +add test 10.10.93.70 +add test 10.10.93.71 +add test 10.10.93.72 +add test 10.10.93.73 +add test 10.10.93.74 +add test 10.10.93.75 +add test 10.10.93.76 +add test 10.10.93.77 +add test 10.10.93.78 +add test 10.10.93.79 +add test 10.10.93.8 +add test 10.10.93.80 +add test 10.10.93.81 +add test 10.10.93.82 +add test 10.10.93.83 +add test 10.10.93.84 +add test 10.10.93.85 +add test 10.10.93.86 +add test 10.10.93.87 +add test 10.10.93.88 +add test 10.10.93.89 +add test 10.10.93.9 +add test 10.10.93.90 +add test 10.10.93.91 +add test 10.10.93.92 +add test 10.10.93.93 +add test 10.10.93.94 +add test 10.10.93.95 +add test 10.10.93.96 +add test 10.10.93.97 +add test 10.10.93.98 +add test 10.10.93.99 +add test 10.10.94.0 +add test 10.10.94.1 +add test 10.10.94.10 +add test 10.10.94.100 +add test 10.10.94.101 +add test 10.10.94.102 +add test 10.10.94.103 +add test 10.10.94.104 +add test 10.10.94.105 +add test 10.10.94.106 +add test 10.10.94.107 +add test 10.10.94.108 +add test 10.10.94.109 +add test 10.10.94.11 +add test 10.10.94.110 +add test 10.10.94.111 +add test 10.10.94.112 +add test 10.10.94.113 +add test 10.10.94.114 +add test 10.10.94.115 +add test 10.10.94.116 +add test 10.10.94.117 +add test 10.10.94.118 +add test 10.10.94.119 +add test 10.10.94.12 +add test 10.10.94.120 +add test 10.10.94.121 +add test 10.10.94.122 +add test 10.10.94.123 +add test 10.10.94.124 +add test 10.10.94.125 +add test 10.10.94.126 +add test 10.10.94.127 +add test 10.10.94.128 +add test 10.10.94.129 +add test 10.10.94.13 +add test 10.10.94.130 +add test 10.10.94.131 +add test 10.10.94.132 +add test 10.10.94.133 +add test 10.10.94.134 +add test 10.10.94.135 +add test 10.10.94.136 +add test 10.10.94.137 +add test 10.10.94.138 +add test 10.10.94.139 +add test 10.10.94.14 +add test 10.10.94.140 +add test 10.10.94.141 +add test 10.10.94.142 +add test 10.10.94.143 +add test 10.10.94.144 +add test 10.10.94.145 +add test 10.10.94.146 +add test 10.10.94.147 +add test 10.10.94.148 +add test 10.10.94.149 +add test 10.10.94.15 +add test 10.10.94.150 +add test 10.10.94.151 +add test 10.10.94.152 +add test 10.10.94.153 +add test 10.10.94.154 +add test 10.10.94.155 +add test 10.10.94.156 +add test 10.10.94.157 +add test 10.10.94.158 +add test 10.10.94.159 +add test 10.10.94.16 +add test 10.10.94.160 +add test 10.10.94.161 +add test 10.10.94.162 +add test 10.10.94.163 +add test 10.10.94.164 +add test 10.10.94.165 +add test 10.10.94.166 +add test 10.10.94.167 +add test 10.10.94.168 +add test 10.10.94.169 +add test 10.10.94.17 +add test 10.10.94.170 +add test 10.10.94.171 +add test 10.10.94.172 +add test 10.10.94.173 +add test 10.10.94.174 +add test 10.10.94.175 +add test 10.10.94.176 +add test 10.10.94.177 +add test 10.10.94.178 +add test 10.10.94.179 +add test 10.10.94.18 +add test 10.10.94.180 +add test 10.10.94.181 +add test 10.10.94.182 +add test 10.10.94.183 +add test 10.10.94.184 +add test 10.10.94.185 +add test 10.10.94.186 +add test 10.10.94.187 +add test 10.10.94.188 +add test 10.10.94.189 +add test 10.10.94.19 +add test 10.10.94.190 +add test 10.10.94.191 +add test 10.10.94.192 +add test 10.10.94.193 +add test 10.10.94.194 +add test 10.10.94.195 +add test 10.10.94.196 +add test 10.10.94.197 +add test 10.10.94.198 +add test 10.10.94.199 +add test 10.10.94.2 +add test 10.10.94.20 +add test 10.10.94.200 +add test 10.10.94.201 +add test 10.10.94.202 +add test 10.10.94.203 +add test 10.10.94.204 +add test 10.10.94.205 +add test 10.10.94.206 +add test 10.10.94.207 +add test 10.10.94.208 +add test 10.10.94.209 +add test 10.10.94.21 +add test 10.10.94.210 +add test 10.10.94.211 +add test 10.10.94.212 +add test 10.10.94.213 +add test 10.10.94.214 +add test 10.10.94.215 +add test 10.10.94.216 +add test 10.10.94.217 +add test 10.10.94.218 +add test 10.10.94.219 +add test 10.10.94.22 +add test 10.10.94.220 +add test 10.10.94.221 +add test 10.10.94.222 +add test 10.10.94.223 +add test 10.10.94.224 +add test 10.10.94.225 +add test 10.10.94.226 +add test 10.10.94.227 +add test 10.10.94.228 +add test 10.10.94.229 +add test 10.10.94.23 +add test 10.10.94.230 +add test 10.10.94.231 +add test 10.10.94.232 +add test 10.10.94.233 +add test 10.10.94.234 +add test 10.10.94.235 +add test 10.10.94.236 +add test 10.10.94.237 +add test 10.10.94.238 +add test 10.10.94.239 +add test 10.10.94.24 +add test 10.10.94.240 +add test 10.10.94.241 +add test 10.10.94.242 +add test 10.10.94.243 +add test 10.10.94.244 +add test 10.10.94.245 +add test 10.10.94.246 +add test 10.10.94.247 +add test 10.10.94.248 +add test 10.10.94.249 +add test 10.10.94.25 +add test 10.10.94.250 +add test 10.10.94.251 +add test 10.10.94.252 +add test 10.10.94.253 +add test 10.10.94.254 +add test 10.10.94.255 +add test 10.10.94.26 +add test 10.10.94.27 +add test 10.10.94.28 +add test 10.10.94.29 +add test 10.10.94.3 +add test 10.10.94.30 +add test 10.10.94.31 +add test 10.10.94.32 +add test 10.10.94.33 +add test 10.10.94.34 +add test 10.10.94.35 +add test 10.10.94.36 +add test 10.10.94.37 +add test 10.10.94.38 +add test 10.10.94.39 +add test 10.10.94.4 +add test 10.10.94.40 +add test 10.10.94.41 +add test 10.10.94.42 +add test 10.10.94.43 +add test 10.10.94.44 +add test 10.10.94.45 +add test 10.10.94.46 +add test 10.10.94.47 +add test 10.10.94.48 +add test 10.10.94.49 +add test 10.10.94.5 +add test 10.10.94.50 +add test 10.10.94.51 +add test 10.10.94.52 +add test 10.10.94.53 +add test 10.10.94.54 +add test 10.10.94.55 +add test 10.10.94.56 +add test 10.10.94.57 +add test 10.10.94.58 +add test 10.10.94.59 +add test 10.10.94.6 +add test 10.10.94.60 +add test 10.10.94.61 +add test 10.10.94.62 +add test 10.10.94.63 +add test 10.10.94.64 +add test 10.10.94.65 +add test 10.10.94.66 +add test 10.10.94.67 +add test 10.10.94.68 +add test 10.10.94.69 +add test 10.10.94.7 +add test 10.10.94.70 +add test 10.10.94.71 +add test 10.10.94.72 +add test 10.10.94.73 +add test 10.10.94.74 +add test 10.10.94.75 +add test 10.10.94.76 +add test 10.10.94.77 +add test 10.10.94.78 +add test 10.10.94.79 +add test 10.10.94.8 +add test 10.10.94.80 +add test 10.10.94.81 +add test 10.10.94.82 +add test 10.10.94.83 +add test 10.10.94.84 +add test 10.10.94.85 +add test 10.10.94.86 +add test 10.10.94.87 +add test 10.10.94.88 +add test 10.10.94.89 +add test 10.10.94.9 +add test 10.10.94.90 +add test 10.10.94.91 +add test 10.10.94.92 +add test 10.10.94.93 +add test 10.10.94.94 +add test 10.10.94.95 +add test 10.10.94.96 +add test 10.10.94.97 +add test 10.10.94.98 +add test 10.10.94.99 +add test 10.10.95.0 +add test 10.10.95.1 +add test 10.10.95.10 +add test 10.10.95.100 +add test 10.10.95.101 +add test 10.10.95.102 +add test 10.10.95.103 +add test 10.10.95.104 +add test 10.10.95.105 +add test 10.10.95.106 +add test 10.10.95.107 +add test 10.10.95.108 +add test 10.10.95.109 +add test 10.10.95.11 +add test 10.10.95.110 +add test 10.10.95.111 +add test 10.10.95.112 +add test 10.10.95.113 +add test 10.10.95.114 +add test 10.10.95.115 +add test 10.10.95.116 +add test 10.10.95.117 +add test 10.10.95.118 +add test 10.10.95.119 +add test 10.10.95.12 +add test 10.10.95.120 +add test 10.10.95.121 +add test 10.10.95.122 +add test 10.10.95.123 +add test 10.10.95.124 +add test 10.10.95.125 +add test 10.10.95.126 +add test 10.10.95.127 +add test 10.10.95.128 +add test 10.10.95.129 +add test 10.10.95.13 +add test 10.10.95.130 +add test 10.10.95.131 +add test 10.10.95.132 +add test 10.10.95.133 +add test 10.10.95.134 +add test 10.10.95.135 +add test 10.10.95.136 +add test 10.10.95.137 +add test 10.10.95.138 +add test 10.10.95.139 +add test 10.10.95.14 +add test 10.10.95.140 +add test 10.10.95.141 +add test 10.10.95.142 +add test 10.10.95.143 +add test 10.10.95.144 +add test 10.10.95.145 +add test 10.10.95.146 +add test 10.10.95.147 +add test 10.10.95.148 +add test 10.10.95.149 +add test 10.10.95.15 +add test 10.10.95.150 +add test 10.10.95.151 +add test 10.10.95.152 +add test 10.10.95.153 +add test 10.10.95.154 +add test 10.10.95.155 +add test 10.10.95.156 +add test 10.10.95.157 +add test 10.10.95.158 +add test 10.10.95.159 +add test 10.10.95.16 +add test 10.10.95.160 +add test 10.10.95.161 +add test 10.10.95.162 +add test 10.10.95.163 +add test 10.10.95.164 +add test 10.10.95.165 +add test 10.10.95.166 +add test 10.10.95.167 +add test 10.10.95.168 +add test 10.10.95.169 +add test 10.10.95.17 +add test 10.10.95.170 +add test 10.10.95.171 +add test 10.10.95.172 +add test 10.10.95.173 +add test 10.10.95.174 +add test 10.10.95.175 +add test 10.10.95.176 +add test 10.10.95.177 +add test 10.10.95.178 +add test 10.10.95.179 +add test 10.10.95.18 +add test 10.10.95.180 +add test 10.10.95.181 +add test 10.10.95.182 +add test 10.10.95.183 +add test 10.10.95.184 +add test 10.10.95.185 +add test 10.10.95.186 +add test 10.10.95.187 +add test 10.10.95.188 +add test 10.10.95.189 +add test 10.10.95.19 +add test 10.10.95.190 +add test 10.10.95.191 +add test 10.10.95.192 +add test 10.10.95.193 +add test 10.10.95.194 +add test 10.10.95.195 +add test 10.10.95.196 +add test 10.10.95.197 +add test 10.10.95.198 +add test 10.10.95.199 +add test 10.10.95.2 +add test 10.10.95.20 +add test 10.10.95.200 +add test 10.10.95.201 +add test 10.10.95.202 +add test 10.10.95.203 +add test 10.10.95.204 +add test 10.10.95.205 +add test 10.10.95.206 +add test 10.10.95.207 +add test 10.10.95.208 +add test 10.10.95.209 +add test 10.10.95.21 +add test 10.10.95.210 +add test 10.10.95.211 +add test 10.10.95.212 +add test 10.10.95.213 +add test 10.10.95.214 +add test 10.10.95.215 +add test 10.10.95.216 +add test 10.10.95.217 +add test 10.10.95.218 +add test 10.10.95.219 +add test 10.10.95.22 +add test 10.10.95.220 +add test 10.10.95.221 +add test 10.10.95.222 +add test 10.10.95.223 +add test 10.10.95.224 +add test 10.10.95.225 +add test 10.10.95.226 +add test 10.10.95.227 +add test 10.10.95.228 +add test 10.10.95.229 +add test 10.10.95.23 +add test 10.10.95.230 +add test 10.10.95.231 +add test 10.10.95.232 +add test 10.10.95.233 +add test 10.10.95.234 +add test 10.10.95.235 +add test 10.10.95.236 +add test 10.10.95.237 +add test 10.10.95.238 +add test 10.10.95.239 +add test 10.10.95.24 +add test 10.10.95.240 +add test 10.10.95.241 +add test 10.10.95.242 +add test 10.10.95.243 +add test 10.10.95.244 +add test 10.10.95.245 +add test 10.10.95.246 +add test 10.10.95.247 +add test 10.10.95.248 +add test 10.10.95.249 +add test 10.10.95.25 +add test 10.10.95.250 +add test 10.10.95.251 +add test 10.10.95.252 +add test 10.10.95.253 +add test 10.10.95.254 +add test 10.10.95.255 +add test 10.10.95.26 +add test 10.10.95.27 +add test 10.10.95.28 +add test 10.10.95.29 +add test 10.10.95.3 +add test 10.10.95.30 +add test 10.10.95.31 +add test 10.10.95.32 +add test 10.10.95.33 +add test 10.10.95.34 +add test 10.10.95.35 +add test 10.10.95.36 +add test 10.10.95.37 +add test 10.10.95.38 +add test 10.10.95.39 +add test 10.10.95.4 +add test 10.10.95.40 +add test 10.10.95.41 +add test 10.10.95.42 +add test 10.10.95.43 +add test 10.10.95.44 +add test 10.10.95.45 +add test 10.10.95.46 +add test 10.10.95.47 +add test 10.10.95.48 +add test 10.10.95.49 +add test 10.10.95.5 +add test 10.10.95.50 +add test 10.10.95.51 +add test 10.10.95.52 +add test 10.10.95.53 +add test 10.10.95.54 +add test 10.10.95.55 +add test 10.10.95.56 +add test 10.10.95.57 +add test 10.10.95.58 +add test 10.10.95.59 +add test 10.10.95.6 +add test 10.10.95.60 +add test 10.10.95.61 +add test 10.10.95.62 +add test 10.10.95.63 +add test 10.10.95.64 +add test 10.10.95.65 +add test 10.10.95.66 +add test 10.10.95.67 +add test 10.10.95.68 +add test 10.10.95.69 +add test 10.10.95.7 +add test 10.10.95.70 +add test 10.10.95.71 +add test 10.10.95.72 +add test 10.10.95.73 +add test 10.10.95.74 +add test 10.10.95.75 +add test 10.10.95.76 +add test 10.10.95.77 +add test 10.10.95.78 +add test 10.10.95.79 +add test 10.10.95.8 +add test 10.10.95.80 +add test 10.10.95.81 +add test 10.10.95.82 +add test 10.10.95.83 +add test 10.10.95.84 +add test 10.10.95.85 +add test 10.10.95.86 +add test 10.10.95.87 +add test 10.10.95.88 +add test 10.10.95.89 +add test 10.10.95.9 +add test 10.10.95.90 +add test 10.10.95.91 +add test 10.10.95.92 +add test 10.10.95.93 +add test 10.10.95.94 +add test 10.10.95.95 +add test 10.10.95.96 +add test 10.10.95.97 +add test 10.10.95.98 +add test 10.10.95.99 +add test 10.10.96.0 +add test 10.10.96.1 +add test 10.10.96.10 +add test 10.10.96.100 +add test 10.10.96.101 +add test 10.10.96.102 +add test 10.10.96.103 +add test 10.10.96.104 +add test 10.10.96.105 +add test 10.10.96.106 +add test 10.10.96.107 +add test 10.10.96.108 +add test 10.10.96.109 +add test 10.10.96.11 +add test 10.10.96.110 +add test 10.10.96.111 +add test 10.10.96.112 +add test 10.10.96.113 +add test 10.10.96.114 +add test 10.10.96.115 +add test 10.10.96.116 +add test 10.10.96.117 +add test 10.10.96.118 +add test 10.10.96.119 +add test 10.10.96.12 +add test 10.10.96.120 +add test 10.10.96.121 +add test 10.10.96.122 +add test 10.10.96.123 +add test 10.10.96.124 +add test 10.10.96.125 +add test 10.10.96.126 +add test 10.10.96.127 +add test 10.10.96.128 +add test 10.10.96.129 +add test 10.10.96.13 +add test 10.10.96.130 +add test 10.10.96.131 +add test 10.10.96.132 +add test 10.10.96.133 +add test 10.10.96.134 +add test 10.10.96.135 +add test 10.10.96.136 +add test 10.10.96.137 +add test 10.10.96.138 +add test 10.10.96.139 +add test 10.10.96.14 +add test 10.10.96.140 +add test 10.10.96.141 +add test 10.10.96.142 +add test 10.10.96.143 +add test 10.10.96.144 +add test 10.10.96.145 +add test 10.10.96.146 +add test 10.10.96.147 +add test 10.10.96.148 +add test 10.10.96.149 +add test 10.10.96.15 +add test 10.10.96.150 +add test 10.10.96.151 +add test 10.10.96.152 +add test 10.10.96.153 +add test 10.10.96.154 +add test 10.10.96.155 +add test 10.10.96.156 +add test 10.10.96.157 +add test 10.10.96.158 +add test 10.10.96.159 +add test 10.10.96.16 +add test 10.10.96.160 +add test 10.10.96.161 +add test 10.10.96.162 +add test 10.10.96.163 +add test 10.10.96.164 +add test 10.10.96.165 +add test 10.10.96.166 +add test 10.10.96.167 +add test 10.10.96.168 +add test 10.10.96.169 +add test 10.10.96.17 +add test 10.10.96.170 +add test 10.10.96.171 +add test 10.10.96.172 +add test 10.10.96.173 +add test 10.10.96.174 +add test 10.10.96.175 +add test 10.10.96.176 +add test 10.10.96.177 +add test 10.10.96.178 +add test 10.10.96.179 +add test 10.10.96.18 +add test 10.10.96.180 +add test 10.10.96.181 +add test 10.10.96.182 +add test 10.10.96.183 +add test 10.10.96.184 +add test 10.10.96.185 +add test 10.10.96.186 +add test 10.10.96.187 +add test 10.10.96.188 +add test 10.10.96.189 +add test 10.10.96.19 +add test 10.10.96.190 +add test 10.10.96.191 +add test 10.10.96.192 +add test 10.10.96.193 +add test 10.10.96.194 +add test 10.10.96.195 +add test 10.10.96.196 +add test 10.10.96.197 +add test 10.10.96.198 +add test 10.10.96.199 +add test 10.10.96.2 +add test 10.10.96.20 +add test 10.10.96.200 +add test 10.10.96.201 +add test 10.10.96.202 +add test 10.10.96.203 +add test 10.10.96.204 +add test 10.10.96.205 +add test 10.10.96.206 +add test 10.10.96.207 +add test 10.10.96.208 +add test 10.10.96.209 +add test 10.10.96.21 +add test 10.10.96.210 +add test 10.10.96.211 +add test 10.10.96.212 +add test 10.10.96.213 +add test 10.10.96.214 +add test 10.10.96.215 +add test 10.10.96.216 +add test 10.10.96.217 +add test 10.10.96.218 +add test 10.10.96.219 +add test 10.10.96.22 +add test 10.10.96.220 +add test 10.10.96.221 +add test 10.10.96.222 +add test 10.10.96.223 +add test 10.10.96.224 +add test 10.10.96.225 +add test 10.10.96.226 +add test 10.10.96.227 +add test 10.10.96.228 +add test 10.10.96.229 +add test 10.10.96.23 +add test 10.10.96.230 +add test 10.10.96.231 +add test 10.10.96.232 +add test 10.10.96.233 +add test 10.10.96.234 +add test 10.10.96.235 +add test 10.10.96.236 +add test 10.10.96.237 +add test 10.10.96.238 +add test 10.10.96.239 +add test 10.10.96.24 +add test 10.10.96.240 +add test 10.10.96.241 +add test 10.10.96.242 +add test 10.10.96.243 +add test 10.10.96.244 +add test 10.10.96.245 +add test 10.10.96.246 +add test 10.10.96.247 +add test 10.10.96.248 +add test 10.10.96.249 +add test 10.10.96.25 +add test 10.10.96.250 +add test 10.10.96.251 +add test 10.10.96.252 +add test 10.10.96.253 +add test 10.10.96.254 +add test 10.10.96.255 +add test 10.10.96.26 +add test 10.10.96.27 +add test 10.10.96.28 +add test 10.10.96.29 +add test 10.10.96.3 +add test 10.10.96.30 +add test 10.10.96.31 +add test 10.10.96.32 +add test 10.10.96.33 +add test 10.10.96.34 +add test 10.10.96.35 +add test 10.10.96.36 +add test 10.10.96.37 +add test 10.10.96.38 +add test 10.10.96.39 +add test 10.10.96.4 +add test 10.10.96.40 +add test 10.10.96.41 +add test 10.10.96.42 +add test 10.10.96.43 +add test 10.10.96.44 +add test 10.10.96.45 +add test 10.10.96.46 +add test 10.10.96.47 +add test 10.10.96.48 +add test 10.10.96.49 +add test 10.10.96.5 +add test 10.10.96.50 +add test 10.10.96.51 +add test 10.10.96.52 +add test 10.10.96.53 +add test 10.10.96.54 +add test 10.10.96.55 +add test 10.10.96.56 +add test 10.10.96.57 +add test 10.10.96.58 +add test 10.10.96.59 +add test 10.10.96.6 +add test 10.10.96.60 +add test 10.10.96.61 +add test 10.10.96.62 +add test 10.10.96.63 +add test 10.10.96.64 +add test 10.10.96.65 +add test 10.10.96.66 +add test 10.10.96.67 +add test 10.10.96.68 +add test 10.10.96.69 +add test 10.10.96.7 +add test 10.10.96.70 +add test 10.10.96.71 +add test 10.10.96.72 +add test 10.10.96.73 +add test 10.10.96.74 +add test 10.10.96.75 +add test 10.10.96.76 +add test 10.10.96.77 +add test 10.10.96.78 +add test 10.10.96.79 +add test 10.10.96.8 +add test 10.10.96.80 +add test 10.10.96.81 +add test 10.10.96.82 +add test 10.10.96.83 +add test 10.10.96.84 +add test 10.10.96.85 +add test 10.10.96.86 +add test 10.10.96.87 +add test 10.10.96.88 +add test 10.10.96.89 +add test 10.10.96.9 +add test 10.10.96.90 +add test 10.10.96.91 +add test 10.10.96.92 +add test 10.10.96.93 +add test 10.10.96.94 +add test 10.10.96.95 +add test 10.10.96.96 +add test 10.10.96.97 +add test 10.10.96.98 +add test 10.10.96.99 +add test 10.10.97.0 +add test 10.10.97.1 +add test 10.10.97.10 +add test 10.10.97.100 +add test 10.10.97.101 +add test 10.10.97.102 +add test 10.10.97.103 +add test 10.10.97.104 +add test 10.10.97.105 +add test 10.10.97.106 +add test 10.10.97.107 +add test 10.10.97.108 +add test 10.10.97.109 +add test 10.10.97.11 +add test 10.10.97.110 +add test 10.10.97.111 +add test 10.10.97.112 +add test 10.10.97.113 +add test 10.10.97.114 +add test 10.10.97.115 +add test 10.10.97.116 +add test 10.10.97.117 +add test 10.10.97.118 +add test 10.10.97.119 +add test 10.10.97.12 +add test 10.10.97.120 +add test 10.10.97.121 +add test 10.10.97.122 +add test 10.10.97.123 +add test 10.10.97.124 +add test 10.10.97.125 +add test 10.10.97.126 +add test 10.10.97.127 +add test 10.10.97.128 +add test 10.10.97.129 +add test 10.10.97.13 +add test 10.10.97.130 +add test 10.10.97.131 +add test 10.10.97.132 +add test 10.10.97.133 +add test 10.10.97.134 +add test 10.10.97.135 +add test 10.10.97.136 +add test 10.10.97.137 +add test 10.10.97.138 +add test 10.10.97.139 +add test 10.10.97.14 +add test 10.10.97.140 +add test 10.10.97.141 +add test 10.10.97.142 +add test 10.10.97.143 +add test 10.10.97.144 +add test 10.10.97.145 +add test 10.10.97.146 +add test 10.10.97.147 +add test 10.10.97.148 +add test 10.10.97.149 +add test 10.10.97.15 +add test 10.10.97.150 +add test 10.10.97.151 +add test 10.10.97.152 +add test 10.10.97.153 +add test 10.10.97.154 +add test 10.10.97.155 +add test 10.10.97.156 +add test 10.10.97.157 +add test 10.10.97.158 +add test 10.10.97.159 +add test 10.10.97.16 +add test 10.10.97.160 +add test 10.10.97.161 +add test 10.10.97.162 +add test 10.10.97.163 +add test 10.10.97.164 +add test 10.10.97.165 +add test 10.10.97.166 +add test 10.10.97.167 +add test 10.10.97.168 +add test 10.10.97.169 +add test 10.10.97.17 +add test 10.10.97.170 +add test 10.10.97.171 +add test 10.10.97.172 +add test 10.10.97.173 +add test 10.10.97.174 +add test 10.10.97.175 +add test 10.10.97.176 +add test 10.10.97.177 +add test 10.10.97.178 +add test 10.10.97.179 +add test 10.10.97.18 +add test 10.10.97.180 +add test 10.10.97.181 +add test 10.10.97.182 +add test 10.10.97.183 +add test 10.10.97.184 +add test 10.10.97.185 +add test 10.10.97.186 +add test 10.10.97.187 +add test 10.10.97.188 +add test 10.10.97.189 +add test 10.10.97.19 +add test 10.10.97.190 +add test 10.10.97.191 +add test 10.10.97.192 +add test 10.10.97.193 +add test 10.10.97.194 +add test 10.10.97.195 +add test 10.10.97.196 +add test 10.10.97.197 +add test 10.10.97.198 +add test 10.10.97.199 +add test 10.10.97.2 +add test 10.10.97.20 +add test 10.10.97.200 +add test 10.10.97.201 +add test 10.10.97.202 +add test 10.10.97.203 +add test 10.10.97.204 +add test 10.10.97.205 +add test 10.10.97.206 +add test 10.10.97.207 +add test 10.10.97.208 +add test 10.10.97.209 +add test 10.10.97.21 +add test 10.10.97.210 +add test 10.10.97.211 +add test 10.10.97.212 +add test 10.10.97.213 +add test 10.10.97.214 +add test 10.10.97.215 +add test 10.10.97.216 +add test 10.10.97.217 +add test 10.10.97.218 +add test 10.10.97.219 +add test 10.10.97.22 +add test 10.10.97.220 +add test 10.10.97.221 +add test 10.10.97.222 +add test 10.10.97.223 +add test 10.10.97.224 +add test 10.10.97.225 +add test 10.10.97.226 +add test 10.10.97.227 +add test 10.10.97.228 +add test 10.10.97.229 +add test 10.10.97.23 +add test 10.10.97.230 +add test 10.10.97.231 +add test 10.10.97.232 +add test 10.10.97.233 +add test 10.10.97.234 +add test 10.10.97.235 +add test 10.10.97.236 +add test 10.10.97.237 +add test 10.10.97.238 +add test 10.10.97.239 +add test 10.10.97.24 +add test 10.10.97.240 +add test 10.10.97.241 +add test 10.10.97.242 +add test 10.10.97.243 +add test 10.10.97.244 +add test 10.10.97.245 +add test 10.10.97.246 +add test 10.10.97.247 +add test 10.10.97.248 +add test 10.10.97.249 +add test 10.10.97.25 +add test 10.10.97.250 +add test 10.10.97.251 +add test 10.10.97.252 +add test 10.10.97.253 +add test 10.10.97.254 +add test 10.10.97.255 +add test 10.10.97.26 +add test 10.10.97.27 +add test 10.10.97.28 +add test 10.10.97.29 +add test 10.10.97.3 +add test 10.10.97.30 +add test 10.10.97.31 +add test 10.10.97.32 +add test 10.10.97.33 +add test 10.10.97.34 +add test 10.10.97.35 +add test 10.10.97.36 +add test 10.10.97.37 +add test 10.10.97.38 +add test 10.10.97.39 +add test 10.10.97.4 +add test 10.10.97.40 +add test 10.10.97.41 +add test 10.10.97.42 +add test 10.10.97.43 +add test 10.10.97.44 +add test 10.10.97.45 +add test 10.10.97.46 +add test 10.10.97.47 +add test 10.10.97.48 +add test 10.10.97.49 +add test 10.10.97.5 +add test 10.10.97.50 +add test 10.10.97.51 +add test 10.10.97.52 +add test 10.10.97.53 +add test 10.10.97.54 +add test 10.10.97.55 +add test 10.10.97.56 +add test 10.10.97.57 +add test 10.10.97.58 +add test 10.10.97.59 +add test 10.10.97.6 +add test 10.10.97.60 +add test 10.10.97.61 +add test 10.10.97.62 +add test 10.10.97.63 +add test 10.10.97.64 +add test 10.10.97.65 +add test 10.10.97.66 +add test 10.10.97.67 +add test 10.10.97.68 +add test 10.10.97.69 +add test 10.10.97.7 +add test 10.10.97.70 +add test 10.10.97.71 +add test 10.10.97.72 +add test 10.10.97.73 +add test 10.10.97.74 +add test 10.10.97.75 +add test 10.10.97.76 +add test 10.10.97.77 +add test 10.10.97.78 +add test 10.10.97.79 +add test 10.10.97.8 +add test 10.10.97.80 +add test 10.10.97.81 +add test 10.10.97.82 +add test 10.10.97.83 +add test 10.10.97.84 +add test 10.10.97.85 +add test 10.10.97.86 +add test 10.10.97.87 +add test 10.10.97.88 +add test 10.10.97.89 +add test 10.10.97.9 +add test 10.10.97.90 +add test 10.10.97.91 +add test 10.10.97.92 +add test 10.10.97.93 +add test 10.10.97.94 +add test 10.10.97.95 +add test 10.10.97.96 +add test 10.10.97.97 +add test 10.10.97.98 +add test 10.10.97.99 +add test 10.10.98.0 +add test 10.10.98.1 +add test 10.10.98.10 +add test 10.10.98.100 +add test 10.10.98.101 +add test 10.10.98.102 +add test 10.10.98.103 +add test 10.10.98.104 +add test 10.10.98.105 +add test 10.10.98.106 +add test 10.10.98.107 +add test 10.10.98.108 +add test 10.10.98.109 +add test 10.10.98.11 +add test 10.10.98.110 +add test 10.10.98.111 +add test 10.10.98.112 +add test 10.10.98.113 +add test 10.10.98.114 +add test 10.10.98.115 +add test 10.10.98.116 +add test 10.10.98.117 +add test 10.10.98.118 +add test 10.10.98.119 +add test 10.10.98.12 +add test 10.10.98.120 +add test 10.10.98.121 +add test 10.10.98.122 +add test 10.10.98.123 +add test 10.10.98.124 +add test 10.10.98.125 +add test 10.10.98.126 +add test 10.10.98.127 +add test 10.10.98.128 +add test 10.10.98.129 +add test 10.10.98.13 +add test 10.10.98.130 +add test 10.10.98.131 +add test 10.10.98.132 +add test 10.10.98.133 +add test 10.10.98.134 +add test 10.10.98.135 +add test 10.10.98.136 +add test 10.10.98.137 +add test 10.10.98.138 +add test 10.10.98.139 +add test 10.10.98.14 +add test 10.10.98.140 +add test 10.10.98.141 +add test 10.10.98.142 +add test 10.10.98.143 +add test 10.10.98.144 +add test 10.10.98.145 +add test 10.10.98.146 +add test 10.10.98.147 +add test 10.10.98.148 +add test 10.10.98.149 +add test 10.10.98.15 +add test 10.10.98.150 +add test 10.10.98.151 +add test 10.10.98.152 +add test 10.10.98.153 +add test 10.10.98.154 +add test 10.10.98.155 +add test 10.10.98.156 +add test 10.10.98.157 +add test 10.10.98.158 +add test 10.10.98.159 +add test 10.10.98.16 +add test 10.10.98.160 +add test 10.10.98.161 +add test 10.10.98.162 +add test 10.10.98.163 +add test 10.10.98.164 +add test 10.10.98.165 +add test 10.10.98.166 +add test 10.10.98.167 +add test 10.10.98.168 +add test 10.10.98.169 +add test 10.10.98.17 +add test 10.10.98.170 +add test 10.10.98.171 +add test 10.10.98.172 +add test 10.10.98.173 +add test 10.10.98.174 +add test 10.10.98.175 +add test 10.10.98.176 +add test 10.10.98.177 +add test 10.10.98.178 +add test 10.10.98.179 +add test 10.10.98.18 +add test 10.10.98.180 +add test 10.10.98.181 +add test 10.10.98.182 +add test 10.10.98.183 +add test 10.10.98.184 +add test 10.10.98.185 +add test 10.10.98.186 +add test 10.10.98.187 +add test 10.10.98.188 +add test 10.10.98.189 +add test 10.10.98.19 +add test 10.10.98.190 +add test 10.10.98.191 +add test 10.10.98.192 +add test 10.10.98.193 +add test 10.10.98.194 +add test 10.10.98.195 +add test 10.10.98.196 +add test 10.10.98.197 +add test 10.10.98.198 +add test 10.10.98.199 +add test 10.10.98.2 +add test 10.10.98.20 +add test 10.10.98.200 +add test 10.10.98.201 +add test 10.10.98.202 +add test 10.10.98.203 +add test 10.10.98.204 +add test 10.10.98.205 +add test 10.10.98.206 +add test 10.10.98.207 +add test 10.10.98.208 +add test 10.10.98.209 +add test 10.10.98.21 +add test 10.10.98.210 +add test 10.10.98.211 +add test 10.10.98.212 +add test 10.10.98.213 +add test 10.10.98.214 +add test 10.10.98.215 +add test 10.10.98.216 +add test 10.10.98.217 +add test 10.10.98.218 +add test 10.10.98.219 +add test 10.10.98.22 +add test 10.10.98.220 +add test 10.10.98.221 +add test 10.10.98.222 +add test 10.10.98.223 +add test 10.10.98.224 +add test 10.10.98.225 +add test 10.10.98.226 +add test 10.10.98.227 +add test 10.10.98.228 +add test 10.10.98.229 +add test 10.10.98.23 +add test 10.10.98.230 +add test 10.10.98.231 +add test 10.10.98.232 +add test 10.10.98.233 +add test 10.10.98.234 +add test 10.10.98.235 +add test 10.10.98.236 +add test 10.10.98.237 +add test 10.10.98.238 +add test 10.10.98.239 +add test 10.10.98.24 +add test 10.10.98.240 +add test 10.10.98.241 +add test 10.10.98.242 +add test 10.10.98.243 +add test 10.10.98.244 +add test 10.10.98.245 +add test 10.10.98.246 +add test 10.10.98.247 +add test 10.10.98.248 +add test 10.10.98.249 +add test 10.10.98.25 +add test 10.10.98.250 +add test 10.10.98.251 +add test 10.10.98.252 +add test 10.10.98.253 +add test 10.10.98.254 +add test 10.10.98.255 +add test 10.10.98.26 +add test 10.10.98.27 +add test 10.10.98.28 +add test 10.10.98.29 +add test 10.10.98.3 +add test 10.10.98.30 +add test 10.10.98.31 +add test 10.10.98.32 +add test 10.10.98.33 +add test 10.10.98.34 +add test 10.10.98.35 +add test 10.10.98.36 +add test 10.10.98.37 +add test 10.10.98.38 +add test 10.10.98.39 +add test 10.10.98.4 +add test 10.10.98.40 +add test 10.10.98.41 +add test 10.10.98.42 +add test 10.10.98.43 +add test 10.10.98.44 +add test 10.10.98.45 +add test 10.10.98.46 +add test 10.10.98.47 +add test 10.10.98.48 +add test 10.10.98.49 +add test 10.10.98.5 +add test 10.10.98.50 +add test 10.10.98.51 +add test 10.10.98.52 +add test 10.10.98.53 +add test 10.10.98.54 +add test 10.10.98.55 +add test 10.10.98.56 +add test 10.10.98.57 +add test 10.10.98.58 +add test 10.10.98.59 +add test 10.10.98.6 +add test 10.10.98.60 +add test 10.10.98.61 +add test 10.10.98.62 +add test 10.10.98.63 +add test 10.10.98.64 +add test 10.10.98.65 +add test 10.10.98.66 +add test 10.10.98.67 +add test 10.10.98.68 +add test 10.10.98.69 +add test 10.10.98.7 +add test 10.10.98.70 +add test 10.10.98.71 +add test 10.10.98.72 +add test 10.10.98.73 +add test 10.10.98.74 +add test 10.10.98.75 +add test 10.10.98.76 +add test 10.10.98.77 +add test 10.10.98.78 +add test 10.10.98.79 +add test 10.10.98.8 +add test 10.10.98.80 +add test 10.10.98.81 +add test 10.10.98.82 +add test 10.10.98.83 +add test 10.10.98.84 +add test 10.10.98.85 +add test 10.10.98.86 +add test 10.10.98.87 +add test 10.10.98.88 +add test 10.10.98.89 +add test 10.10.98.9 +add test 10.10.98.90 +add test 10.10.98.91 +add test 10.10.98.92 +add test 10.10.98.93 +add test 10.10.98.94 +add test 10.10.98.95 +add test 10.10.98.96 +add test 10.10.98.97 +add test 10.10.98.98 +add test 10.10.98.99 +add test 10.10.99.0 +add test 10.10.99.1 +add test 10.10.99.10 +add test 10.10.99.100 +add test 10.10.99.101 +add test 10.10.99.102 +add test 10.10.99.103 +add test 10.10.99.104 +add test 10.10.99.105 +add test 10.10.99.106 +add test 10.10.99.107 +add test 10.10.99.108 +add test 10.10.99.109 +add test 10.10.99.11 +add test 10.10.99.110 +add test 10.10.99.111 +add test 10.10.99.112 +add test 10.10.99.113 +add test 10.10.99.114 +add test 10.10.99.115 +add test 10.10.99.116 +add test 10.10.99.117 +add test 10.10.99.118 +add test 10.10.99.119 +add test 10.10.99.12 +add test 10.10.99.120 +add test 10.10.99.121 +add test 10.10.99.122 +add test 10.10.99.123 +add test 10.10.99.124 +add test 10.10.99.125 +add test 10.10.99.126 +add test 10.10.99.127 +add test 10.10.99.128 +add test 10.10.99.129 +add test 10.10.99.13 +add test 10.10.99.130 +add test 10.10.99.131 +add test 10.10.99.132 +add test 10.10.99.133 +add test 10.10.99.134 +add test 10.10.99.135 +add test 10.10.99.136 +add test 10.10.99.137 +add test 10.10.99.138 +add test 10.10.99.139 +add test 10.10.99.14 +add test 10.10.99.140 +add test 10.10.99.141 +add test 10.10.99.142 +add test 10.10.99.143 +add test 10.10.99.144 +add test 10.10.99.145 +add test 10.10.99.146 +add test 10.10.99.147 +add test 10.10.99.148 +add test 10.10.99.149 +add test 10.10.99.15 +add test 10.10.99.150 +add test 10.10.99.151 +add test 10.10.99.152 +add test 10.10.99.153 +add test 10.10.99.154 +add test 10.10.99.155 +add test 10.10.99.156 +add test 10.10.99.157 +add test 10.10.99.158 +add test 10.10.99.159 +add test 10.10.99.16 +add test 10.10.99.160 +add test 10.10.99.161 +add test 10.10.99.162 +add test 10.10.99.163 +add test 10.10.99.164 +add test 10.10.99.165 +add test 10.10.99.166 +add test 10.10.99.167 +add test 10.10.99.168 +add test 10.10.99.169 +add test 10.10.99.17 +add test 10.10.99.170 +add test 10.10.99.171 +add test 10.10.99.172 +add test 10.10.99.173 +add test 10.10.99.174 +add test 10.10.99.175 +add test 10.10.99.176 +add test 10.10.99.177 +add test 10.10.99.178 +add test 10.10.99.179 +add test 10.10.99.18 +add test 10.10.99.180 +add test 10.10.99.181 +add test 10.10.99.182 +add test 10.10.99.183 +add test 10.10.99.184 +add test 10.10.99.185 +add test 10.10.99.186 +add test 10.10.99.187 +add test 10.10.99.188 +add test 10.10.99.189 +add test 10.10.99.19 +add test 10.10.99.190 +add test 10.10.99.191 +add test 10.10.99.192 +add test 10.10.99.193 +add test 10.10.99.194 +add test 10.10.99.195 +add test 10.10.99.196 +add test 10.10.99.197 +add test 10.10.99.198 +add test 10.10.99.199 +add test 10.10.99.2 +add test 10.10.99.20 +add test 10.10.99.200 +add test 10.10.99.201 +add test 10.10.99.202 +add test 10.10.99.203 +add test 10.10.99.204 +add test 10.10.99.205 +add test 10.10.99.206 +add test 10.10.99.207 +add test 10.10.99.208 +add test 10.10.99.209 +add test 10.10.99.21 +add test 10.10.99.210 +add test 10.10.99.211 +add test 10.10.99.212 +add test 10.10.99.213 +add test 10.10.99.214 +add test 10.10.99.215 +add test 10.10.99.216 +add test 10.10.99.217 +add test 10.10.99.218 +add test 10.10.99.219 +add test 10.10.99.22 +add test 10.10.99.220 +add test 10.10.99.221 +add test 10.10.99.222 +add test 10.10.99.223 +add test 10.10.99.224 +add test 10.10.99.225 +add test 10.10.99.226 +add test 10.10.99.227 +add test 10.10.99.228 +add test 10.10.99.229 +add test 10.10.99.23 +add test 10.10.99.230 +add test 10.10.99.231 +add test 10.10.99.232 +add test 10.10.99.233 +add test 10.10.99.234 +add test 10.10.99.235 +add test 10.10.99.236 +add test 10.10.99.237 +add test 10.10.99.238 +add test 10.10.99.239 +add test 10.10.99.24 +add test 10.10.99.240 +add test 10.10.99.241 +add test 10.10.99.242 +add test 10.10.99.243 +add test 10.10.99.244 +add test 10.10.99.245 +add test 10.10.99.246 +add test 10.10.99.247 +add test 10.10.99.248 +add test 10.10.99.249 +add test 10.10.99.25 +add test 10.10.99.250 +add test 10.10.99.251 +add test 10.10.99.252 +add test 10.10.99.253 +add test 10.10.99.254 +add test 10.10.99.255 +add test 10.10.99.26 +add test 10.10.99.27 +add test 10.10.99.28 +add test 10.10.99.29 +add test 10.10.99.3 +add test 10.10.99.30 +add test 10.10.99.31 +add test 10.10.99.32 +add test 10.10.99.33 +add test 10.10.99.34 +add test 10.10.99.35 +add test 10.10.99.36 +add test 10.10.99.37 +add test 10.10.99.38 +add test 10.10.99.39 +add test 10.10.99.4 +add test 10.10.99.40 +add test 10.10.99.41 +add test 10.10.99.42 +add test 10.10.99.43 +add test 10.10.99.44 +add test 10.10.99.45 +add test 10.10.99.46 +add test 10.10.99.47 +add test 10.10.99.48 +add test 10.10.99.49 +add test 10.10.99.5 +add test 10.10.99.50 +add test 10.10.99.51 +add test 10.10.99.52 +add test 10.10.99.53 +add test 10.10.99.54 +add test 10.10.99.55 +add test 10.10.99.56 +add test 10.10.99.57 +add test 10.10.99.58 +add test 10.10.99.59 +add test 10.10.99.6 +add test 10.10.99.60 +add test 10.10.99.61 +add test 10.10.99.62 +add test 10.10.99.63 +add test 10.10.99.64 +add test 10.10.99.65 +add test 10.10.99.66 +add test 10.10.99.67 +add test 10.10.99.68 +add test 10.10.99.69 +add test 10.10.99.7 +add test 10.10.99.70 +add test 10.10.99.71 +add test 10.10.99.72 +add test 10.10.99.73 +add test 10.10.99.74 +add test 10.10.99.75 +add test 10.10.99.76 +add test 10.10.99.77 +add test 10.10.99.78 +add test 10.10.99.79 +add test 10.10.99.8 +add test 10.10.99.80 +add test 10.10.99.81 +add test 10.10.99.82 +add test 10.10.99.83 +add test 10.10.99.84 +add test 10.10.99.85 +add test 10.10.99.86 +add test 10.10.99.87 +add test 10.10.99.88 +add test 10.10.99.89 +add test 10.10.99.9 +add test 10.10.99.90 +add test 10.10.99.91 +add test 10.10.99.92 +add test 10.10.99.93 +add test 10.10.99.94 +add test 10.10.99.95 +add test 10.10.99.96 +add test 10.10.99.97 +add test 10.10.99.98 +add test 10.10.99.99 diff --git a/tests/big_sort.sh b/tests/big_sort.sh new file mode 100755 index 0000000..05eced8 --- /dev/null +++ b/tests/big_sort.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +ipset x test >/dev/null 2>&1 +ipset n test hash:ip +for x in `seq 0 255`; do + for y in `seq 0 255`; do + echo "a test 10.10.$x.$y" + done +done | ipset r +ipset -t list > .foo +diff .foo big_sort.terse +ipset -s save > .foo +diff .foo big_sort.saved +ipset x test diff --git a/tests/big_sort.terse b/tests/big_sort.terse new file mode 100644 index 0000000..1322da2 --- /dev/null +++ b/tests/big_sort.terse @@ -0,0 +1,7 @@ +Name: test +Type: hash:ip +Revision: 4 +Header: family inet hashsize 32768 maxelem 65536 +Size in memory: 104040 +References: 0 +Number of entries: 65536 diff --git a/tests/bitmap:ip.t b/tests/bitmap:ip.t new file mode 100644 index 0000000..88d399a --- /dev/null +++ b/tests/bitmap:ip.t @@ -0,0 +1,233 @@ +# Range: Try to create from an invalid range with timeout +1 ipset create test bitmap:ip range 2.0.0.1-2.1.0.1 timeout 5 +# Range: Create a set from a valid range with timeout +0 ipset create test bitmap:ip range 2.0.0.1-2.1.0.0 timeout 5 +# Range: Add lower boundary +0 ipset add test 2.0.0.1 timeout 4 +# Range: Add upper boundary +0 ipset add test 2.1.0.0 timeout 0 +# Range: Test lower boundary +0 ipset test test 2.0.0.1 +# Range: Test upper boundary +0 ipset test test 2.1.0.0 +# Range: Test element not added to the set +1 ipset test test 2.0.0.2 +# Range: Test element before lower boundary +1 ipset test test 2.0.0.0 +# Range: Test element after upper boundary +1 ipset test test 2.1.0.1 +# Range: Try to add element before lower boundary +1 ipset add test 2.0.0.0 +# Range: Try to add element after upper boundary +1 ipset add test 2.1.0.1 +# Range: Delete element not added to the set +1 ipset -D test 2.0.0.2 +# Range: Delete element not added to the set, with exist flag +0 ipset -! -D test 2.0.0.2 +# Range: Add element in the middle +0 ipset -A test 2.0.0.128 +# Range: Add element in the middle again +1 ipset -A test 2.0.0.128 +# Range: Add element in the middle again, with exist flag +0 ipset -! -A test 2.0.0.128 +# Range: Delete the same element +0 ipset -D test 2.0.0.128 +# Range: Add a range of elements +0 ipset -A test 2.0.0.128-2.0.0.131 timeout 4 +# Range: List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo +# Range: Check listing +0 diff -u -I 'Size in memory.*' .foo bitmap:ip.t.list4 +# Sleep 5s so that entries can time out +0 sleep 5s +# Range: List set after timeout +0 ipset list test | grep -v Revision: > .foo +# Range: Check listing +0 diff -u -I 'Size in memory.*' .foo bitmap:ip.t.list0 +# Range: Flush test set +0 ipset flush test +# Range: Delete test set +0 ipset destroy test +# Network: Try to create a set from an invalid network with timeout +1 ipset create test bitmap:ip range 2.0.0.0/15 timeout 5 +# Network: Create a set from a valid network with timeout +0 ipset create test bitmap:ip range 2.0.0.1/16 timeout 5 +# Network: Add lower boundary +0 ipset add test 2.0.0.0 timeout 0 +# Network: Add upper boundary +0 ipset add test 2.0.255.255 timeout 4 +# Network: Test lower boundary +0 ipset test test 2.0.0.0 +# Network: Test upper boundary +0 ipset test test 2.0.255.255 +# Network: Test element not added to the set +1 ipset test test 2.0.0.1 +# Network: Test element before lower boundary +1 ipset test test 1.255.255.255 +# Network: Test element after upper boundary +1 ipset test test 2.1.0.0 +# Network: Try to add element before lower boundary +1 ipset add test 1.255.255.255 +# Network: Try to add element after upper boundary +1 ipset add test 2.1.0.0 +# Network: Delete element not added to the set +1 ipset -D test 2.0.0.2 +# Network: Add element in the middle +0 ipset -A test 2.0.0.128 timeout 4 +# Network: Delete the same element +0 ipset -D test 2.0.0.128 +# Network: List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo +# Network: Check listing +0 diff -u -I 'Size in memory.*' .foo bitmap:ip.t.list5 +# Sleep 5s so that entries can time out +0 sleep 5s +# Network: List set +0 ipset list test | grep -v Revision: > .foo +# Network: Check listing +0 diff -u -I 'Size in memory.*' .foo bitmap:ip.t.list1 +# Network: Flush test set +0 ipset flush test +# Network: Delete test set +0 ipset destroy test +# Subnets: Create a set to store networks with timeout +0 ipset create test bitmap:ip range 10.0.0.0/8 netmask 24 timeout 5 +# Subnets: Add lower boundary +0 ipset add test 10.0.0.0 timeout 4 +# Subnets: Add upper boundary +0 ipset add test 10.255.255.255 timeout 0 +# Subnets: Test lower boundary +0 ipset test test 10.0.0.255 +# Subnets: Test upper boundary +0 ipset test test 10.255.255.0 +# Subnets: Test element not added to the set +1 ipset test test 10.1.0.0 +# Subnets: Test element before lower boundary +1 ipset test test 9.255.255.255 +# Subnets: Test element after upper boundary +1 ipset test test 11.0.0.0 +# Subnets: Try to add element before lower boundary +1 ipset add test 9.255.255.255 +# Subnets: Try to add element after upper boundary +1 ipset add test 11.0.0.0 +# Subnets: Try to delete element not added to the set +1 ipset -D test 10.2.0.0 +# Subnets: Add element to the set +0 ipset -A test 10.2.0.0 +# Subnets: Delete the same element from the set +0 ipset -D test 10.2.0.0 +# Subnets: Add a subnet of subnets +0 ipset -A test 10.8.0.0/16 timeout 4 +# Subnets: List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo +# Subnets: Check listing +0 diff -u -I 'Size in memory.*' .foo bitmap:ip.t.list6 +# Sleep 5s so that entries can time out +0 sleep 5s +# Subnets: List set +0 ipset list test | grep -v Revision: > .foo +# Subnets: Check listing +0 diff -u -I 'Size in memory.*' .foo bitmap:ip.t.list2 +# Subnets: Flush test set +0 ipset flush test +# Subnets: Delete test set +0 ipset destroy test +# Full: Create full IPv4 space with /16 networks and timeout +0 ipset create test bitmap:ip range 0.0.0.0/0 netmask 16 timeout 5 +# Full: Add lower boundary +0 ipset add test 0.0.255.255 timeout 0 +# Full: Add upper boundary +0 ipset add test 255.255.0.0 timeout 0 +# Full: Test lower boundary +0 ipset test test 0.0.0.0 +# Full: Test upper boundary +0 ipset test test 255.255.255.255 +# Full: Test element not added to the set +1 ipset test test 0.1.0.0 +# Full: List set +0 ipset list test | grep -v Revision: > .foo +# Full: Check listing +0 diff -u -I 'Size in memory.*' .foo bitmap:ip.t.list3 +# Full: flush set +0 ipset flush test +# Full: add element with 1s timeout +0 ipset add test 1.1.1.1 timeout 1 +# Full: readd element with 3s timeout +0 ipset add test 1.1.1.1 timeout 3 -exist +# Full: sleep 2s +0 sleep 2s +# Full: check readded element +0 ipset test test 1.1.1.1 +# Full: Delete test set +0 ipset destroy test +# Counters: create set +0 ipset n test bitmap:ip range 2.0.0.1-2.1.0.0 counters +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.1 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2.0.0.1 +# Counters: check counters +0 ./check_counters test 2.0.0.1 5 3456 +# Counters: delete element +0 ipset d test 2.0.0.1 +# Counters: test deleted element +1 ipset t test 2.0.0.1 +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.10 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2.0.0.10 12 9876 +# Counters: update counters +0 ipset -! a test 2.0.0.10 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2.0.0.10 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test bitmap:ip range 2.0.0.1-2.1.0.0 counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.1 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2.0.0.1 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.1 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2.0.0.1 +# Counters and timeout: test deleted element +1 ipset t test 2.0.0.1 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.10 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.10 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2.0.0.10 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.10 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2.0.0.10 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.10 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# Counters: require sendip +skip which sendip +# Counters: create set +0 ipset n test bitmap:ip range 10.255.0.0/16 counters +# Counters: add elemet with zero counters +0 ipset a test 10.255.255.64 +# Counters: generate packets +0 ./check_sendip_packets -4 src 5 +# Counters: check counters +0 ./check_counters test 10.255.255.64 5 $((5*40)) +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test bitmap:ip range 10.255.0.0/16 counters timeout 600 +# Counters and timeout: add elemet with zero counters +0 ipset a test 10.255.255.64 +# Counters and timeout: generate packets +0 ./check_sendip_packets -4 src 6 +# Counters and timeout: check counters +0 ./check_extensions test 10.255.255.64 600 6 $((6*40)) +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/bitmap:ip.t.list0 b/tests/bitmap:ip.t.list0 new file mode 100644 index 0000000..ad9a693 --- /dev/null +++ b/tests/bitmap:ip.t.list0 @@ -0,0 +1,8 @@ +Name: test +Type: bitmap:ip +Header: range 2.0.0.1-2.1.0.0 timeout 5 +Size in memory: 532640 +References: 0 +Number of entries: 1 +Members: +2.1.0.0 timeout 0 diff --git a/tests/bitmap:ip.t.list1 b/tests/bitmap:ip.t.list1 new file mode 100644 index 0000000..a9504f6 --- /dev/null +++ b/tests/bitmap:ip.t.list1 @@ -0,0 +1,8 @@ +Name: test +Type: bitmap:ip +Header: range 2.0.0.0-2.0.255.255 timeout 5 +Size in memory: 532640 +References: 0 +Number of entries: 1 +Members: +2.0.0.0 timeout 0 diff --git a/tests/bitmap:ip.t.list2 b/tests/bitmap:ip.t.list2 new file mode 100644 index 0000000..ddf8100 --- /dev/null +++ b/tests/bitmap:ip.t.list2 @@ -0,0 +1,8 @@ +Name: test +Type: bitmap:ip +Header: range 10.0.0.0-10.255.255.255 netmask 24 timeout 5 +Size in memory: 532640 +References: 0 +Number of entries: 1 +Members: +10.255.255.0 timeout 0 diff --git a/tests/bitmap:ip.t.list3 b/tests/bitmap:ip.t.list3 new file mode 100644 index 0000000..e1a4d43 --- /dev/null +++ b/tests/bitmap:ip.t.list3 @@ -0,0 +1,9 @@ +Name: test +Type: bitmap:ip +Header: range 0.0.0.0-255.255.255.255 netmask 16 timeout 5 +Size in memory: 532640 +References: 0 +Number of entries: 2 +Members: +0.0.0.0 timeout 0 +255.255.0.0 timeout 0 diff --git a/tests/bitmap:ip.t.list4 b/tests/bitmap:ip.t.list4 new file mode 100644 index 0000000..7148a8d --- /dev/null +++ b/tests/bitmap:ip.t.list4 @@ -0,0 +1,13 @@ +Name: test +Type: bitmap:ip +Header: range 2.0.0.1-2.1.0.0 timeout x +Size in memory: 532640 +References: 0 +Number of entries: 6 +Members: +2.0.0.1 timeout x +2.0.0.128 timeout x +2.0.0.129 timeout x +2.0.0.130 timeout x +2.0.0.131 timeout x +2.1.0.0 timeout x diff --git a/tests/bitmap:ip.t.list5 b/tests/bitmap:ip.t.list5 new file mode 100644 index 0000000..1d22665 --- /dev/null +++ b/tests/bitmap:ip.t.list5 @@ -0,0 +1,9 @@ +Name: test +Type: bitmap:ip +Header: range 2.0.0.0-2.0.255.255 timeout x +Size in memory: 532640 +References: 0 +Number of entries: 2 +Members: +2.0.0.0 timeout x +2.0.255.255 timeout x diff --git a/tests/bitmap:ip.t.list6 b/tests/bitmap:ip.t.list6 new file mode 100644 index 0000000..c3eb347 --- /dev/null +++ b/tests/bitmap:ip.t.list6 @@ -0,0 +1,265 @@ +Name: test +Type: bitmap:ip +Header: range 10.0.0.0-10.255.255.255 netmask 24 timeout x +Size in memory: 532640 +References: 0 +Number of entries: 258 +Members: +10.0.0.0 timeout x +10.8.0.0 timeout x +10.8.1.0 timeout x +10.8.2.0 timeout x +10.8.3.0 timeout x +10.8.4.0 timeout x +10.8.5.0 timeout x +10.8.6.0 timeout x +10.8.7.0 timeout x +10.8.8.0 timeout x +10.8.9.0 timeout x +10.8.10.0 timeout x +10.8.11.0 timeout x +10.8.12.0 timeout x +10.8.13.0 timeout x +10.8.14.0 timeout x +10.8.15.0 timeout x +10.8.16.0 timeout x +10.8.17.0 timeout x +10.8.18.0 timeout x +10.8.19.0 timeout x +10.8.20.0 timeout x +10.8.21.0 timeout x +10.8.22.0 timeout x +10.8.23.0 timeout x +10.8.24.0 timeout x +10.8.25.0 timeout x +10.8.26.0 timeout x +10.8.27.0 timeout x +10.8.28.0 timeout x +10.8.29.0 timeout x +10.8.30.0 timeout x +10.8.31.0 timeout x +10.8.32.0 timeout x +10.8.33.0 timeout x +10.8.34.0 timeout x +10.8.35.0 timeout x +10.8.36.0 timeout x +10.8.37.0 timeout x +10.8.38.0 timeout x +10.8.39.0 timeout x +10.8.40.0 timeout x +10.8.41.0 timeout x +10.8.42.0 timeout x +10.8.43.0 timeout x +10.8.44.0 timeout x +10.8.45.0 timeout x +10.8.46.0 timeout x +10.8.47.0 timeout x +10.8.48.0 timeout x +10.8.49.0 timeout x +10.8.50.0 timeout x +10.8.51.0 timeout x +10.8.52.0 timeout x +10.8.53.0 timeout x +10.8.54.0 timeout x +10.8.55.0 timeout x +10.8.56.0 timeout x +10.8.57.0 timeout x +10.8.58.0 timeout x +10.8.59.0 timeout x +10.8.60.0 timeout x +10.8.61.0 timeout x +10.8.62.0 timeout x +10.8.63.0 timeout x +10.8.64.0 timeout x +10.8.65.0 timeout x +10.8.66.0 timeout x +10.8.67.0 timeout x +10.8.68.0 timeout x +10.8.69.0 timeout x +10.8.70.0 timeout x +10.8.71.0 timeout x +10.8.72.0 timeout x +10.8.73.0 timeout x +10.8.74.0 timeout x +10.8.75.0 timeout x +10.8.76.0 timeout x +10.8.77.0 timeout x +10.8.78.0 timeout x +10.8.79.0 timeout x +10.8.80.0 timeout x +10.8.81.0 timeout x +10.8.82.0 timeout x +10.8.83.0 timeout x +10.8.84.0 timeout x +10.8.85.0 timeout x +10.8.86.0 timeout x +10.8.87.0 timeout x +10.8.88.0 timeout x +10.8.89.0 timeout x +10.8.90.0 timeout x +10.8.91.0 timeout x +10.8.92.0 timeout x +10.8.93.0 timeout x +10.8.94.0 timeout x +10.8.95.0 timeout x +10.8.96.0 timeout x +10.8.97.0 timeout x +10.8.98.0 timeout x +10.8.99.0 timeout x +10.8.100.0 timeout x +10.8.101.0 timeout x +10.8.102.0 timeout x +10.8.103.0 timeout x +10.8.104.0 timeout x +10.8.105.0 timeout x +10.8.106.0 timeout x +10.8.107.0 timeout x +10.8.108.0 timeout x +10.8.109.0 timeout x +10.8.110.0 timeout x +10.8.111.0 timeout x +10.8.112.0 timeout x +10.8.113.0 timeout x +10.8.114.0 timeout x +10.8.115.0 timeout x +10.8.116.0 timeout x +10.8.117.0 timeout x +10.8.118.0 timeout x +10.8.119.0 timeout x +10.8.120.0 timeout x +10.8.121.0 timeout x +10.8.122.0 timeout x +10.8.123.0 timeout x +10.8.124.0 timeout x +10.8.125.0 timeout x +10.8.126.0 timeout x +10.8.127.0 timeout x +10.8.128.0 timeout x +10.8.129.0 timeout x +10.8.130.0 timeout x +10.8.131.0 timeout x +10.8.132.0 timeout x +10.8.133.0 timeout x +10.8.134.0 timeout x +10.8.135.0 timeout x +10.8.136.0 timeout x +10.8.137.0 timeout x +10.8.138.0 timeout x +10.8.139.0 timeout x +10.8.140.0 timeout x +10.8.141.0 timeout x +10.8.142.0 timeout x +10.8.143.0 timeout x +10.8.144.0 timeout x +10.8.145.0 timeout x +10.8.146.0 timeout x +10.8.147.0 timeout x +10.8.148.0 timeout x +10.8.149.0 timeout x +10.8.150.0 timeout x +10.8.151.0 timeout x +10.8.152.0 timeout x +10.8.153.0 timeout x +10.8.154.0 timeout x +10.8.155.0 timeout x +10.8.156.0 timeout x +10.8.157.0 timeout x +10.8.158.0 timeout x +10.8.159.0 timeout x +10.8.160.0 timeout x +10.8.161.0 timeout x +10.8.162.0 timeout x +10.8.163.0 timeout x +10.8.164.0 timeout x +10.8.165.0 timeout x +10.8.166.0 timeout x +10.8.167.0 timeout x +10.8.168.0 timeout x +10.8.169.0 timeout x +10.8.170.0 timeout x +10.8.171.0 timeout x +10.8.172.0 timeout x +10.8.173.0 timeout x +10.8.174.0 timeout x +10.8.175.0 timeout x +10.8.176.0 timeout x +10.8.177.0 timeout x +10.8.178.0 timeout x +10.8.179.0 timeout x +10.8.180.0 timeout x +10.8.181.0 timeout x +10.8.182.0 timeout x +10.8.183.0 timeout x +10.8.184.0 timeout x +10.8.185.0 timeout x +10.8.186.0 timeout x +10.8.187.0 timeout x +10.8.188.0 timeout x +10.8.189.0 timeout x +10.8.190.0 timeout x +10.8.191.0 timeout x +10.8.192.0 timeout x +10.8.193.0 timeout x +10.8.194.0 timeout x +10.8.195.0 timeout x +10.8.196.0 timeout x +10.8.197.0 timeout x +10.8.198.0 timeout x +10.8.199.0 timeout x +10.8.200.0 timeout x +10.8.201.0 timeout x +10.8.202.0 timeout x +10.8.203.0 timeout x +10.8.204.0 timeout x +10.8.205.0 timeout x +10.8.206.0 timeout x +10.8.207.0 timeout x +10.8.208.0 timeout x +10.8.209.0 timeout x +10.8.210.0 timeout x +10.8.211.0 timeout x +10.8.212.0 timeout x +10.8.213.0 timeout x +10.8.214.0 timeout x +10.8.215.0 timeout x +10.8.216.0 timeout x +10.8.217.0 timeout x +10.8.218.0 timeout x +10.8.219.0 timeout x +10.8.220.0 timeout x +10.8.221.0 timeout x +10.8.222.0 timeout x +10.8.223.0 timeout x +10.8.224.0 timeout x +10.8.225.0 timeout x +10.8.226.0 timeout x +10.8.227.0 timeout x +10.8.228.0 timeout x +10.8.229.0 timeout x +10.8.230.0 timeout x +10.8.231.0 timeout x +10.8.232.0 timeout x +10.8.233.0 timeout x +10.8.234.0 timeout x +10.8.235.0 timeout x +10.8.236.0 timeout x +10.8.237.0 timeout x +10.8.238.0 timeout x +10.8.239.0 timeout x +10.8.240.0 timeout x +10.8.241.0 timeout x +10.8.242.0 timeout x +10.8.243.0 timeout x +10.8.244.0 timeout x +10.8.245.0 timeout x +10.8.246.0 timeout x +10.8.247.0 timeout x +10.8.248.0 timeout x +10.8.249.0 timeout x +10.8.250.0 timeout x +10.8.251.0 timeout x +10.8.252.0 timeout x +10.8.253.0 timeout x +10.8.254.0 timeout x +10.8.255.0 timeout x +10.255.255.0 timeout x diff --git a/tests/check_cidrs.sh b/tests/check_cidrs.sh new file mode 100755 index 0000000..2206b18 --- /dev/null +++ b/tests/check_cidrs.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +set -e + +ipset=${IPSET_BIN:-../src/ipset} + +$ipset f +$ipset x +$ipset n test hash:net +for x in `seq 1 32`; do + $ipset a test 10.0.0.0/$x + n=`$ipset l test | wc -l` + n=$((n - 8)) + test $n -eq $x || exit 1 +done +for x in `seq 32 -1 1`; do + $ipset d test 10.0.0.0/$x + n=`$ipset l test | wc -l` + # We deleted one element + n=$((n - 8 + 1)) + test $n -eq $x || exit 1 +done +$ipset x test diff --git a/tests/check_counters b/tests/check_counters new file mode 100755 index 0000000..912067a --- /dev/null +++ b/tests/check_counters @@ -0,0 +1,11 @@ +#!/bin/bash + +ipset=${IPSET_BIN:-../src/ipset} + +read ip p packets b bytes <<< $($ipset l $1 | grep ^$2) +test -z "$packets" -o -z "$bytes" && exit 1 +test $packets -ne $3 -o $bytes -ne $4 && exit 1 +exit 0 + + + diff --git a/tests/check_extensions b/tests/check_extensions new file mode 100755 index 0000000..77e7c2c --- /dev/null +++ b/tests/check_extensions @@ -0,0 +1,12 @@ +#!/bin/bash + +ipset=${IPSET_BIN:-../src/ipset} + +read ip t timeout p packets b bytes <<< $($ipset l $1 | grep ^$2) +test -z "$timeout" -o -z "$packets" -o -z "$bytes" && exit 1 +test $timeout -gt $3 -o $timeout -lt $(($3 - 10)) && exit 1 +test $packets -ne $4 -o $bytes -ne $5 && exit 1 +exit 0 + + + diff --git a/tests/check_klog.sh b/tests/check_klog.sh new file mode 100755 index 0000000..9af5f66 --- /dev/null +++ b/tests/check_klog.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +# set -x +set -e + +# arguments: ipaddr proto port setname ... + +test -f .loglines || exit 1 +loglines=$(<.loglines) +if [ $loglines -ne 0 ]; then + loglines=$((loglines - 1)) +fi + +expand_ipv6() { + # incomplete, but for our addresses it's OK + addr= + n=0 + while read a; do + n=$((n+1)) + if [ -z "$a" ]; then + addr="$addr::" + else + case `echo $a | wc -c` in + 4) a="0$a";; + 3) a="00$a";; + 2) a="000$a";; + esac + addr="$addr$a:" + fi + done < <(echo $1 | tr : '\n') + addr=`echo $addr | sed -e 's/:$//'` + null= + while [ $n -le 8 ]; do + null="$null:0000" + n=$((n+1)) + done + addr=`echo $addr | sed -e "s/::/$null/"` + echo $addr +} + +ipaddr=`expand_ipv6 $1`; shift +proto=`echo $1 | tr a-z A-Z`; shift +port=$1; shift + +set +e +for setname in $@; do + match=`tail -n +$loglines /var/log/kern.log | grep -e "in set $setname: .* SRC=$ipaddr .* PROTO=$proto SPT=$port .*"` + if [ -z "$match" ]; then + match=`dmesg | tail -n +$loglines | grep -e "in set $setname: .* SRC=$ipaddr .* PROTO=$proto SPT=$port .*"` + fi + if [ -z "$match" ]; then + echo "no match!" + exit 1 + fi +done +exit 0 diff --git a/tests/check_sendip_packets b/tests/check_sendip_packets new file mode 100755 index 0000000..0dad3d0 --- /dev/null +++ b/tests/check_sendip_packets @@ -0,0 +1,24 @@ +#!/bin/sh + +# -4|-6 dirs pkt-count + +set -e + +if [ "$1" = "-4" ]; then + cmd=iptables + proto=ipv4 + src=10.255.255.64 + dst=127.0.0.1 +else + cmd=ip6tables + proto=ipv6 + src=1002:1002:1002:1002::32 + dst=::1 +fi + +$cmd -A INPUT -m set --match-set test $2 -j DROP +for x in `seq 1 $3`; do + sendip -p $proto -id $dst -is $src -p tcp -td 80 -ts 1025 $dst +done +$cmd -D INPUT -m set --match-set test $2 -j DROP + diff --git a/tests/cidr.sh b/tests/cidr.sh new file mode 100755 index 0000000..b7d695a --- /dev/null +++ b/tests/cidr.sh @@ -0,0 +1,112 @@ +#!/bin/bash + +set -e + +NETS="0.0.0.0/1 +128.0.0.0/2 +192.0.0.0/3 +224.0.0.0/4 +240.0.0.0/5 +248.0.0.0/6 +252.0.0.0/7 +254.0.0.0/8 +255.0.0.0/9 +255.128.0.0/10 +255.192.0.0/11 +255.224.0.0/12 +255.240.0.0/13 +255.248.0.0/14 +255.252.0.0/15 +255.254.0.0/16 +255.255.0.0/17 +255.255.128.0/18 +255.255.192.0/19 +255.255.224.0/20 +255.255.240.0/21 +255.255.248.0/22 +255.255.252.0/23 +255.255.254.0/24 +255.255.255.0/25 +255.255.255.128/26 +255.255.255.192/27 +255.255.255.224/28 +255.255.255.240/29 +255.255.255.248/30 +255.255.255.252/31 +255.255.255.254/32" + +ipset="../src/ipset" + +case "$1" in +net) + $ipset n test hash:net + + while IFS= read x; do + $ipset add test $x + done <<<"$NETS" + + while IFS= read x; do + first=`netmask -r $x | cut -d - -f 1` + $ipset test test $first >/dev/null 2>&1 + last=`netmask -r $x | cut -d - -f 2 | cut -d ' ' -f 1` + $ipset test test $last >/dev/null 2>&1 + done <<<"$NETS" + + while IFS= read x; do + $ipset del test $x + done <<<"$NETS" + ;; +net,port) + $ipset n test hash:net,port + + n=1 + while IFS= read x; do + $ipset add test $x,$n + n=$((n+1)) + done <<<"$NETS" + + n=1 + while IFS= read x; do + first=`netmask -r $x | cut -d - -f 1` + $ipset test test $first,$n >/dev/null 2>&1 + last=`netmask -r $x | cut -d - -f 2 | cut -d ' ' -f 1` + $ipset test test $last,$n >/dev/null 2>&1 + n=$((n+1)) + done <<<"$NETS" + + n=1 + while IFS= read x; do + $ipset del test $x,$n + n=$((n+1)) + done <<<"$NETS" + ;; +net,iface) + $ipset n test hash:net,iface + + $ipset add test 0.0.0.0/0,eth0 + n=1 + while IFS= read x; do + $ipset add test $x,eth$n + n=$((n+1)) + done <<<"$NETS" + + $ipset test test 0.0.0.0/0,eth0 + n=1 + while IFS= read x; do + $ipset test test $x,eth$n >/dev/null 2>&1 + n=$((n+1)) + done <<<"$NETS" + + $ipset del test 0.0.0.0/0,eth0 + n=1 + while IFS= read x; do + $ipset del test $x,eth$n + n=$((n+1)) + done <<<"$NETS" + ;; +*) + echo "Usage: $0 net|net,port|net,iface" + exit 1 + ;; +esac +$ipset x test diff --git a/tests/comment.t b/tests/comment.t new file mode 100644 index 0000000..b12609b --- /dev/null +++ b/tests/comment.t @@ -0,0 +1,157 @@ +# Bitmap comment: create set +0 ipset create test bitmap:ip range 2.0.0.1-2.1.0.0 comment +# Bitmap comment: Check invalid length of comment +1 ipset add test 2.0.0.1 comment "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +# Bitmap comment: Add comment with max length +0 ipset add test 2.0.0.1 comment "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +# Bitmap comment: Add element with comment +0 ipset -! add test 2.0.0.1 comment "text message" +# Bitmap comment: Test element with comment +0 ipset test test 2.0.0.1 +# Bitmap comment: List set +0 ipset list test | grep -v Revision: > .foo +# Bitmap comment: Check listing +0 diff -u -I 'Size in memory.*' .foo comment.t.list0 +# Bitmap comment: Delete element with comment +0 ipset del test 2.0.0.1 +# Bitmap comment: Test deleted element +1 ipset test test 2.0.0.1 +# Bitmap comment: Check listing +1 ipset list test | grep 'comment "text message"' >/dev/null +# Bitmap comment: Add element with comment +0 ipset add test 2.0.0.1 comment "text message" +# Bitmap comment: check listing +0 ipset list test | grep 'comment "text message"' >/dev/null +# Bitmap comment: Re-add element with another comment +0 ipset -! add test 2.0.0.1 comment "text message 2" +# Bitmap comment: check listing +0 ipset list test | grep 'comment "text message 2"' >/dev/null +# Bitmap comment: Flush test set +0 ipset flush test +# Bitmap comment: Add multiple elements with comment +0 for x in `seq 1 255`; do echo "add test 2.0.0.$x comment \\\"text message $x\\\""; done | ipset restore +# Bitmap comment: List set +0 ipset list test | grep -v Revision: > .foo +# Bitmap comment: Check listing +0 diff -u -I 'Size in memory.*' .foo comment.t.list1 +# Bitmap comment: Delete test set +0 ipset destroy test +# Bitmap comment: create set with timeout +0 ipset create test bitmap:ip range 2.0.0.1-2.1.0.0 comment timeout 3 +# Bitmap comment: Add multiple elements with default timeout +0 for x in `seq 1 255`; do echo "add test 2.0.0.$x comment \\\"text message $x\\\""; done | ipset restore +# Bitmap comment: Add multiple elements with zero timeout +0 for x in `seq 1 255`; do echo "add test 2.0.1.$x timeout 0 comment \\\"text message $x\\\""; done | ipset restore +# Bitmap comment: List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo +# Bitmap comment: Check listing +0 diff -u -I 'Size in memory.*' .foo comment.t.list11 +# Sleep 5s so that entries can time out +0 sleep 5s +# Bitmap comment: List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo +# Bitmap comment: Check listing +0 diff -u -I 'Size in memory.*' -I 'Number of entries' .foo comment.t.list12 +# Bitmap comment: Flush set +0 ipset flush test +# Bitmap comment: Delete test set +0 ipset destroy test +# Hash comment: Create a set +0 ipset create test hash:net,net hashsize 128 comment +# Hash comment: Check invalid length of comment +1 ipset add test 1.1.1.1/32,1.1.1.2/32 comment "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +# Hash comment: Add comment with max length +0 ipset add test 1.1.1.1/32,1.1.1.2/32 comment "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +# Hash comment: Try to add /32 +0 ipset -! add test 1.1.1.1/32,1.1.1.2/32 comment "text 1.1.1.1/32,1.1.1.2/32" +# Hash comment: Add almost zero valued element +0 ipset add test 0.0.0.0/1,0.0.0.0/1 comment "text 0.0.0.0/1,0.0.0.0/1" +# Hash comment: Test almost zero valued element +0 ipset test test 0.0.0.0/1,0.0.0.0/1 +# Hash comment: Delete almost zero valued element +0 ipset del test 0.0.0.0/1,0.0.0.0/1 +# Hash comment: Test deleted element +1 ipset test test 0.0.0.0/1,0.0.0.0/1 +# Hash comment: Delete element not added to the set +1 ipset del test 0.0.0.0/1,0.0.0.0/1 +# Hash comment: Add first random network +0 ipset add test 2.0.0.1/24,2.0.1.1/24 comment "text 2.0.0.1/24,2.0.1.1/24" +# Hash comment: Add second random network +0 ipset add test 192.168.68.69/27,192.168.129.69/27 comment "text 192.168.68.69/27,192.168.129.69/27" +# Hash comment: Test first random value +0 ipset test test 2.0.0.255,2.0.1.255 +# Hash comment: Test second random value +0 ipset test test 192.168.68.95,192.168.129.75 +# Hash comment: Test value not added to the set +1 ipset test test 2.0.1.0,2.0.0.1 +# Hash comment: Try to add IP address +0 ipset add test 2.0.0.1,2.0.0.2 +# Hash comment: List set +0 ipset list test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Hash comment: Check listing +0 diff -u -I 'Size in memory.*' .foo comment.t.list2 +# Hash comment: Update element with comment +0 ipset -! add test 2.0.0.1,2.0.0.2 comment "text 2.0.0.1,2.0.0.2" +# Hash comment: Check updated element +0 ipset list test | grep '"text 2.0.0.1,2.0.0.2"' >/dev/null +# Hash comment: Update another element with comment +0 ipset -! add test 2.0.0.1/24,2.0.1.1/24 comment "text 2.0.0.1/24\,2.0.1.1/24 new" +# Hash comment: Check updated element +0 ipset list test | grep '"text 2.0.0.1/24,2.0.1.1/24 new"' >/dev/null +# Hash comment: Flush test set +0 ipset flush test +# Hash comment: Delete test set +0 ipset destroy test +# Hash comment: Stress test with comments +0 ./netnetgen.sh comment | ipset restore +# Hash comment: List set and check the number of elements +0 n=`ipset -L test|grep '^10.'|wc -l` && test $n -eq 87040 +# Hash comment: Delete test set +0 ipset destroy test +# Hash comment: Check that resizing keeps the comments +0 ./resizec.sh -4 netnet +# Hash comment: Stress test with comments and timeout +0 ./netnetgen.sh comment timeout | ipset restore +# Hash comment: List set and check the number of elements +0 n=`ipset -L test|grep '^10.'|wc -l` && test $n -eq 87040 +# Hash comment: Destroy test set +0 ipset destroy test +# Hash comment: create set with timeout +0 ipset create test hash:ip comment timeout 4 +# Hash comment: Add multiple elements with default timeout +0 for x in `seq 0 255`; do echo "add test 2.0.0.$x comment \\\"text message $x\\\""; done | ipset restore +# Hash comment: Add multiple elements with zero timeout +0 for x in `seq 0 255`; do echo "add test 2.0.1.$x timeout 0 comment \\\"text message $x\\\""; done | ipset restore +# Hash comment: List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Hash comment: Check listing +0 diff -u -I 'Size in memory.*' .foo comment.t.list21 +# Sleep 5s so that entries can time out +0 sleep 5s +# Hash comment: List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Hash comment: Check listing +0 diff -u -I 'Size in memory.*' .foo comment.t.list22 +# Hash comment: Flush set +0 ipset flush test +# Hash comment: Delete test set +0 ipset destroy test +# List comment: Create a, b, c sets +0 for x in a b c; do ipset n $x hash:ip; done +# List comment: Create test set with comment +0 ipset n test list:set comment +# List comment: Add c set with comment +0 ipset a test c comment "c set comment" +# List comment: Add a set with comment +0 ipset a test a before c comment "a set comment" +# List comment: Add b set with comment +0 ipset a test b after a comment "b set comment" +# List comment: List sets +0 ipset list | grep -v Revision: > .foo +# List comment: Check listing +0 diff -u -I 'Size in memory.*' .foo comment.t.list3 +# Flush sets +0 ipset f +# Destroy sets +0 ipset x +# eof diff --git a/tests/comment.t.list0 b/tests/comment.t.list0 new file mode 100644 index 0000000..6d44c91 --- /dev/null +++ b/tests/comment.t.list0 @@ -0,0 +1,8 @@ +Name: test +Type: bitmap:ip +Header: range 2.0.0.1-2.1.0.0 comment +Size in memory: 532640 +References: 0 +Number of entries: 1 +Members: +2.0.0.1 comment "text message" diff --git a/tests/comment.t.list1 b/tests/comment.t.list1 new file mode 100644 index 0000000..1a09672 --- /dev/null +++ b/tests/comment.t.list1 @@ -0,0 +1,262 @@ +Name: test +Type: bitmap:ip +Header: range 2.0.0.1-2.1.0.0 comment +Size in memory: 532640 +References: 0 +Number of entries: 255 +Members: +2.0.0.1 comment "text message 1" +2.0.0.2 comment "text message 2" +2.0.0.3 comment "text message 3" +2.0.0.4 comment "text message 4" +2.0.0.5 comment "text message 5" +2.0.0.6 comment "text message 6" +2.0.0.7 comment "text message 7" +2.0.0.8 comment "text message 8" +2.0.0.9 comment "text message 9" +2.0.0.10 comment "text message 10" +2.0.0.11 comment "text message 11" +2.0.0.12 comment "text message 12" +2.0.0.13 comment "text message 13" +2.0.0.14 comment "text message 14" +2.0.0.15 comment "text message 15" +2.0.0.16 comment "text message 16" +2.0.0.17 comment "text message 17" +2.0.0.18 comment "text message 18" +2.0.0.19 comment "text message 19" +2.0.0.20 comment "text message 20" +2.0.0.21 comment "text message 21" +2.0.0.22 comment "text message 22" +2.0.0.23 comment "text message 23" +2.0.0.24 comment "text message 24" +2.0.0.25 comment "text message 25" +2.0.0.26 comment "text message 26" +2.0.0.27 comment "text message 27" +2.0.0.28 comment "text message 28" +2.0.0.29 comment "text message 29" +2.0.0.30 comment "text message 30" +2.0.0.31 comment "text message 31" +2.0.0.32 comment "text message 32" +2.0.0.33 comment "text message 33" +2.0.0.34 comment "text message 34" +2.0.0.35 comment "text message 35" +2.0.0.36 comment "text message 36" +2.0.0.37 comment "text message 37" +2.0.0.38 comment "text message 38" +2.0.0.39 comment "text message 39" +2.0.0.40 comment "text message 40" +2.0.0.41 comment "text message 41" +2.0.0.42 comment "text message 42" +2.0.0.43 comment "text message 43" +2.0.0.44 comment "text message 44" +2.0.0.45 comment "text message 45" +2.0.0.46 comment "text message 46" +2.0.0.47 comment "text message 47" +2.0.0.48 comment "text message 48" +2.0.0.49 comment "text message 49" +2.0.0.50 comment "text message 50" +2.0.0.51 comment "text message 51" +2.0.0.52 comment "text message 52" +2.0.0.53 comment "text message 53" +2.0.0.54 comment "text message 54" +2.0.0.55 comment "text message 55" +2.0.0.56 comment "text message 56" +2.0.0.57 comment "text message 57" +2.0.0.58 comment "text message 58" +2.0.0.59 comment "text message 59" +2.0.0.60 comment "text message 60" +2.0.0.61 comment "text message 61" +2.0.0.62 comment "text message 62" +2.0.0.63 comment "text message 63" +2.0.0.64 comment "text message 64" +2.0.0.65 comment "text message 65" +2.0.0.66 comment "text message 66" +2.0.0.67 comment "text message 67" +2.0.0.68 comment "text message 68" +2.0.0.69 comment "text message 69" +2.0.0.70 comment "text message 70" +2.0.0.71 comment "text message 71" +2.0.0.72 comment "text message 72" +2.0.0.73 comment "text message 73" +2.0.0.74 comment "text message 74" +2.0.0.75 comment "text message 75" +2.0.0.76 comment "text message 76" +2.0.0.77 comment "text message 77" +2.0.0.78 comment "text message 78" +2.0.0.79 comment "text message 79" +2.0.0.80 comment "text message 80" +2.0.0.81 comment "text message 81" +2.0.0.82 comment "text message 82" +2.0.0.83 comment "text message 83" +2.0.0.84 comment "text message 84" +2.0.0.85 comment "text message 85" +2.0.0.86 comment "text message 86" +2.0.0.87 comment "text message 87" +2.0.0.88 comment "text message 88" +2.0.0.89 comment "text message 89" +2.0.0.90 comment "text message 90" +2.0.0.91 comment "text message 91" +2.0.0.92 comment "text message 92" +2.0.0.93 comment "text message 93" +2.0.0.94 comment "text message 94" +2.0.0.95 comment "text message 95" +2.0.0.96 comment "text message 96" +2.0.0.97 comment "text message 97" +2.0.0.98 comment "text message 98" +2.0.0.99 comment "text message 99" +2.0.0.100 comment "text message 100" +2.0.0.101 comment "text message 101" +2.0.0.102 comment "text message 102" +2.0.0.103 comment "text message 103" +2.0.0.104 comment "text message 104" +2.0.0.105 comment "text message 105" +2.0.0.106 comment "text message 106" +2.0.0.107 comment "text message 107" +2.0.0.108 comment "text message 108" +2.0.0.109 comment "text message 109" +2.0.0.110 comment "text message 110" +2.0.0.111 comment "text message 111" +2.0.0.112 comment "text message 112" +2.0.0.113 comment "text message 113" +2.0.0.114 comment "text message 114" +2.0.0.115 comment "text message 115" +2.0.0.116 comment "text message 116" +2.0.0.117 comment "text message 117" +2.0.0.118 comment "text message 118" +2.0.0.119 comment "text message 119" +2.0.0.120 comment "text message 120" +2.0.0.121 comment "text message 121" +2.0.0.122 comment "text message 122" +2.0.0.123 comment "text message 123" +2.0.0.124 comment "text message 124" +2.0.0.125 comment "text message 125" +2.0.0.126 comment "text message 126" +2.0.0.127 comment "text message 127" +2.0.0.128 comment "text message 128" +2.0.0.129 comment "text message 129" +2.0.0.130 comment "text message 130" +2.0.0.131 comment "text message 131" +2.0.0.132 comment "text message 132" +2.0.0.133 comment "text message 133" +2.0.0.134 comment "text message 134" +2.0.0.135 comment "text message 135" +2.0.0.136 comment "text message 136" +2.0.0.137 comment "text message 137" +2.0.0.138 comment "text message 138" +2.0.0.139 comment "text message 139" +2.0.0.140 comment "text message 140" +2.0.0.141 comment "text message 141" +2.0.0.142 comment "text message 142" +2.0.0.143 comment "text message 143" +2.0.0.144 comment "text message 144" +2.0.0.145 comment "text message 145" +2.0.0.146 comment "text message 146" +2.0.0.147 comment "text message 147" +2.0.0.148 comment "text message 148" +2.0.0.149 comment "text message 149" +2.0.0.150 comment "text message 150" +2.0.0.151 comment "text message 151" +2.0.0.152 comment "text message 152" +2.0.0.153 comment "text message 153" +2.0.0.154 comment "text message 154" +2.0.0.155 comment "text message 155" +2.0.0.156 comment "text message 156" +2.0.0.157 comment "text message 157" +2.0.0.158 comment "text message 158" +2.0.0.159 comment "text message 159" +2.0.0.160 comment "text message 160" +2.0.0.161 comment "text message 161" +2.0.0.162 comment "text message 162" +2.0.0.163 comment "text message 163" +2.0.0.164 comment "text message 164" +2.0.0.165 comment "text message 165" +2.0.0.166 comment "text message 166" +2.0.0.167 comment "text message 167" +2.0.0.168 comment "text message 168" +2.0.0.169 comment "text message 169" +2.0.0.170 comment "text message 170" +2.0.0.171 comment "text message 171" +2.0.0.172 comment "text message 172" +2.0.0.173 comment "text message 173" +2.0.0.174 comment "text message 174" +2.0.0.175 comment "text message 175" +2.0.0.176 comment "text message 176" +2.0.0.177 comment "text message 177" +2.0.0.178 comment "text message 178" +2.0.0.179 comment "text message 179" +2.0.0.180 comment "text message 180" +2.0.0.181 comment "text message 181" +2.0.0.182 comment "text message 182" +2.0.0.183 comment "text message 183" +2.0.0.184 comment "text message 184" +2.0.0.185 comment "text message 185" +2.0.0.186 comment "text message 186" +2.0.0.187 comment "text message 187" +2.0.0.188 comment "text message 188" +2.0.0.189 comment "text message 189" +2.0.0.190 comment "text message 190" +2.0.0.191 comment "text message 191" +2.0.0.192 comment "text message 192" +2.0.0.193 comment "text message 193" +2.0.0.194 comment "text message 194" +2.0.0.195 comment "text message 195" +2.0.0.196 comment "text message 196" +2.0.0.197 comment "text message 197" +2.0.0.198 comment "text message 198" +2.0.0.199 comment "text message 199" +2.0.0.200 comment "text message 200" +2.0.0.201 comment "text message 201" +2.0.0.202 comment "text message 202" +2.0.0.203 comment "text message 203" +2.0.0.204 comment "text message 204" +2.0.0.205 comment "text message 205" +2.0.0.206 comment "text message 206" +2.0.0.207 comment "text message 207" +2.0.0.208 comment "text message 208" +2.0.0.209 comment "text message 209" +2.0.0.210 comment "text message 210" +2.0.0.211 comment "text message 211" +2.0.0.212 comment "text message 212" +2.0.0.213 comment "text message 213" +2.0.0.214 comment "text message 214" +2.0.0.215 comment "text message 215" +2.0.0.216 comment "text message 216" +2.0.0.217 comment "text message 217" +2.0.0.218 comment "text message 218" +2.0.0.219 comment "text message 219" +2.0.0.220 comment "text message 220" +2.0.0.221 comment "text message 221" +2.0.0.222 comment "text message 222" +2.0.0.223 comment "text message 223" +2.0.0.224 comment "text message 224" +2.0.0.225 comment "text message 225" +2.0.0.226 comment "text message 226" +2.0.0.227 comment "text message 227" +2.0.0.228 comment "text message 228" +2.0.0.229 comment "text message 229" +2.0.0.230 comment "text message 230" +2.0.0.231 comment "text message 231" +2.0.0.232 comment "text message 232" +2.0.0.233 comment "text message 233" +2.0.0.234 comment "text message 234" +2.0.0.235 comment "text message 235" +2.0.0.236 comment "text message 236" +2.0.0.237 comment "text message 237" +2.0.0.238 comment "text message 238" +2.0.0.239 comment "text message 239" +2.0.0.240 comment "text message 240" +2.0.0.241 comment "text message 241" +2.0.0.242 comment "text message 242" +2.0.0.243 comment "text message 243" +2.0.0.244 comment "text message 244" +2.0.0.245 comment "text message 245" +2.0.0.246 comment "text message 246" +2.0.0.247 comment "text message 247" +2.0.0.248 comment "text message 248" +2.0.0.249 comment "text message 249" +2.0.0.250 comment "text message 250" +2.0.0.251 comment "text message 251" +2.0.0.252 comment "text message 252" +2.0.0.253 comment "text message 253" +2.0.0.254 comment "text message 254" +2.0.0.255 comment "text message 255" diff --git a/tests/comment.t.list11 b/tests/comment.t.list11 new file mode 100644 index 0000000..7d6990f --- /dev/null +++ b/tests/comment.t.list11 @@ -0,0 +1,517 @@ +Name: test +Type: bitmap:ip +Header: range 2.0.0.1-2.1.0.0 timeout x comment +Size in memory: 1056928 +References: 0 +Number of entries: 510 +Members: +2.0.0.1 timeout x comment "text message 1" +2.0.0.2 timeout x comment "text message 2" +2.0.0.3 timeout x comment "text message 3" +2.0.0.4 timeout x comment "text message 4" +2.0.0.5 timeout x comment "text message 5" +2.0.0.6 timeout x comment "text message 6" +2.0.0.7 timeout x comment "text message 7" +2.0.0.8 timeout x comment "text message 8" +2.0.0.9 timeout x comment "text message 9" +2.0.0.10 timeout x comment "text message 10" +2.0.0.11 timeout x comment "text message 11" +2.0.0.12 timeout x comment "text message 12" +2.0.0.13 timeout x comment "text message 13" +2.0.0.14 timeout x comment "text message 14" +2.0.0.15 timeout x comment "text message 15" +2.0.0.16 timeout x comment "text message 16" +2.0.0.17 timeout x comment "text message 17" +2.0.0.18 timeout x comment "text message 18" +2.0.0.19 timeout x comment "text message 19" +2.0.0.20 timeout x comment "text message 20" +2.0.0.21 timeout x comment "text message 21" +2.0.0.22 timeout x comment "text message 22" +2.0.0.23 timeout x comment "text message 23" +2.0.0.24 timeout x comment "text message 24" +2.0.0.25 timeout x comment "text message 25" +2.0.0.26 timeout x comment "text message 26" +2.0.0.27 timeout x comment "text message 27" +2.0.0.28 timeout x comment "text message 28" +2.0.0.29 timeout x comment "text message 29" +2.0.0.30 timeout x comment "text message 30" +2.0.0.31 timeout x comment "text message 31" +2.0.0.32 timeout x comment "text message 32" +2.0.0.33 timeout x comment "text message 33" +2.0.0.34 timeout x comment "text message 34" +2.0.0.35 timeout x comment "text message 35" +2.0.0.36 timeout x comment "text message 36" +2.0.0.37 timeout x comment "text message 37" +2.0.0.38 timeout x comment "text message 38" +2.0.0.39 timeout x comment "text message 39" +2.0.0.40 timeout x comment "text message 40" +2.0.0.41 timeout x comment "text message 41" +2.0.0.42 timeout x comment "text message 42" +2.0.0.43 timeout x comment "text message 43" +2.0.0.44 timeout x comment "text message 44" +2.0.0.45 timeout x comment "text message 45" +2.0.0.46 timeout x comment "text message 46" +2.0.0.47 timeout x comment "text message 47" +2.0.0.48 timeout x comment "text message 48" +2.0.0.49 timeout x comment "text message 49" +2.0.0.50 timeout x comment "text message 50" +2.0.0.51 timeout x comment "text message 51" +2.0.0.52 timeout x comment "text message 52" +2.0.0.53 timeout x comment "text message 53" +2.0.0.54 timeout x comment "text message 54" +2.0.0.55 timeout x comment "text message 55" +2.0.0.56 timeout x comment "text message 56" +2.0.0.57 timeout x comment "text message 57" +2.0.0.58 timeout x comment "text message 58" +2.0.0.59 timeout x comment "text message 59" +2.0.0.60 timeout x comment "text message 60" +2.0.0.61 timeout x comment "text message 61" +2.0.0.62 timeout x comment "text message 62" +2.0.0.63 timeout x comment "text message 63" +2.0.0.64 timeout x comment "text message 64" +2.0.0.65 timeout x comment "text message 65" +2.0.0.66 timeout x comment "text message 66" +2.0.0.67 timeout x comment "text message 67" +2.0.0.68 timeout x comment "text message 68" +2.0.0.69 timeout x comment "text message 69" +2.0.0.70 timeout x comment "text message 70" +2.0.0.71 timeout x comment "text message 71" +2.0.0.72 timeout x comment "text message 72" +2.0.0.73 timeout x comment "text message 73" +2.0.0.74 timeout x comment "text message 74" +2.0.0.75 timeout x comment "text message 75" +2.0.0.76 timeout x comment "text message 76" +2.0.0.77 timeout x comment "text message 77" +2.0.0.78 timeout x comment "text message 78" +2.0.0.79 timeout x comment "text message 79" +2.0.0.80 timeout x comment "text message 80" +2.0.0.81 timeout x comment "text message 81" +2.0.0.82 timeout x comment "text message 82" +2.0.0.83 timeout x comment "text message 83" +2.0.0.84 timeout x comment "text message 84" +2.0.0.85 timeout x comment "text message 85" +2.0.0.86 timeout x comment "text message 86" +2.0.0.87 timeout x comment "text message 87" +2.0.0.88 timeout x comment "text message 88" +2.0.0.89 timeout x comment "text message 89" +2.0.0.90 timeout x comment "text message 90" +2.0.0.91 timeout x comment "text message 91" +2.0.0.92 timeout x comment "text message 92" +2.0.0.93 timeout x comment "text message 93" +2.0.0.94 timeout x comment "text message 94" +2.0.0.95 timeout x comment "text message 95" +2.0.0.96 timeout x comment "text message 96" +2.0.0.97 timeout x comment "text message 97" +2.0.0.98 timeout x comment "text message 98" +2.0.0.99 timeout x comment "text message 99" +2.0.0.100 timeout x comment "text message 100" +2.0.0.101 timeout x comment "text message 101" +2.0.0.102 timeout x comment "text message 102" +2.0.0.103 timeout x comment "text message 103" +2.0.0.104 timeout x comment "text message 104" +2.0.0.105 timeout x comment "text message 105" +2.0.0.106 timeout x comment "text message 106" +2.0.0.107 timeout x comment "text message 107" +2.0.0.108 timeout x comment "text message 108" +2.0.0.109 timeout x comment "text message 109" +2.0.0.110 timeout x comment "text message 110" +2.0.0.111 timeout x comment "text message 111" +2.0.0.112 timeout x comment "text message 112" +2.0.0.113 timeout x comment "text message 113" +2.0.0.114 timeout x comment "text message 114" +2.0.0.115 timeout x comment "text message 115" +2.0.0.116 timeout x comment "text message 116" +2.0.0.117 timeout x comment "text message 117" +2.0.0.118 timeout x comment "text message 118" +2.0.0.119 timeout x comment "text message 119" +2.0.0.120 timeout x comment "text message 120" +2.0.0.121 timeout x comment "text message 121" +2.0.0.122 timeout x comment "text message 122" +2.0.0.123 timeout x comment "text message 123" +2.0.0.124 timeout x comment "text message 124" +2.0.0.125 timeout x comment "text message 125" +2.0.0.126 timeout x comment "text message 126" +2.0.0.127 timeout x comment "text message 127" +2.0.0.128 timeout x comment "text message 128" +2.0.0.129 timeout x comment "text message 129" +2.0.0.130 timeout x comment "text message 130" +2.0.0.131 timeout x comment "text message 131" +2.0.0.132 timeout x comment "text message 132" +2.0.0.133 timeout x comment "text message 133" +2.0.0.134 timeout x comment "text message 134" +2.0.0.135 timeout x comment "text message 135" +2.0.0.136 timeout x comment "text message 136" +2.0.0.137 timeout x comment "text message 137" +2.0.0.138 timeout x comment "text message 138" +2.0.0.139 timeout x comment "text message 139" +2.0.0.140 timeout x comment "text message 140" +2.0.0.141 timeout x comment "text message 141" +2.0.0.142 timeout x comment "text message 142" +2.0.0.143 timeout x comment "text message 143" +2.0.0.144 timeout x comment "text message 144" +2.0.0.145 timeout x comment "text message 145" +2.0.0.146 timeout x comment "text message 146" +2.0.0.147 timeout x comment "text message 147" +2.0.0.148 timeout x comment "text message 148" +2.0.0.149 timeout x comment "text message 149" +2.0.0.150 timeout x comment "text message 150" +2.0.0.151 timeout x comment "text message 151" +2.0.0.152 timeout x comment "text message 152" +2.0.0.153 timeout x comment "text message 153" +2.0.0.154 timeout x comment "text message 154" +2.0.0.155 timeout x comment "text message 155" +2.0.0.156 timeout x comment "text message 156" +2.0.0.157 timeout x comment "text message 157" +2.0.0.158 timeout x comment "text message 158" +2.0.0.159 timeout x comment "text message 159" +2.0.0.160 timeout x comment "text message 160" +2.0.0.161 timeout x comment "text message 161" +2.0.0.162 timeout x comment "text message 162" +2.0.0.163 timeout x comment "text message 163" +2.0.0.164 timeout x comment "text message 164" +2.0.0.165 timeout x comment "text message 165" +2.0.0.166 timeout x comment "text message 166" +2.0.0.167 timeout x comment "text message 167" +2.0.0.168 timeout x comment "text message 168" +2.0.0.169 timeout x comment "text message 169" +2.0.0.170 timeout x comment "text message 170" +2.0.0.171 timeout x comment "text message 171" +2.0.0.172 timeout x comment "text message 172" +2.0.0.173 timeout x comment "text message 173" +2.0.0.174 timeout x comment "text message 174" +2.0.0.175 timeout x comment "text message 175" +2.0.0.176 timeout x comment "text message 176" +2.0.0.177 timeout x comment "text message 177" +2.0.0.178 timeout x comment "text message 178" +2.0.0.179 timeout x comment "text message 179" +2.0.0.180 timeout x comment "text message 180" +2.0.0.181 timeout x comment "text message 181" +2.0.0.182 timeout x comment "text message 182" +2.0.0.183 timeout x comment "text message 183" +2.0.0.184 timeout x comment "text message 184" +2.0.0.185 timeout x comment "text message 185" +2.0.0.186 timeout x comment "text message 186" +2.0.0.187 timeout x comment "text message 187" +2.0.0.188 timeout x comment "text message 188" +2.0.0.189 timeout x comment "text message 189" +2.0.0.190 timeout x comment "text message 190" +2.0.0.191 timeout x comment "text message 191" +2.0.0.192 timeout x comment "text message 192" +2.0.0.193 timeout x comment "text message 193" +2.0.0.194 timeout x comment "text message 194" +2.0.0.195 timeout x comment "text message 195" +2.0.0.196 timeout x comment "text message 196" +2.0.0.197 timeout x comment "text message 197" +2.0.0.198 timeout x comment "text message 198" +2.0.0.199 timeout x comment "text message 199" +2.0.0.200 timeout x comment "text message 200" +2.0.0.201 timeout x comment "text message 201" +2.0.0.202 timeout x comment "text message 202" +2.0.0.203 timeout x comment "text message 203" +2.0.0.204 timeout x comment "text message 204" +2.0.0.205 timeout x comment "text message 205" +2.0.0.206 timeout x comment "text message 206" +2.0.0.207 timeout x comment "text message 207" +2.0.0.208 timeout x comment "text message 208" +2.0.0.209 timeout x comment "text message 209" +2.0.0.210 timeout x comment "text message 210" +2.0.0.211 timeout x comment "text message 211" +2.0.0.212 timeout x comment "text message 212" +2.0.0.213 timeout x comment "text message 213" +2.0.0.214 timeout x comment "text message 214" +2.0.0.215 timeout x comment "text message 215" +2.0.0.216 timeout x comment "text message 216" +2.0.0.217 timeout x comment "text message 217" +2.0.0.218 timeout x comment "text message 218" +2.0.0.219 timeout x comment "text message 219" +2.0.0.220 timeout x comment "text message 220" +2.0.0.221 timeout x comment "text message 221" +2.0.0.222 timeout x comment "text message 222" +2.0.0.223 timeout x comment "text message 223" +2.0.0.224 timeout x comment "text message 224" +2.0.0.225 timeout x comment "text message 225" +2.0.0.226 timeout x comment "text message 226" +2.0.0.227 timeout x comment "text message 227" +2.0.0.228 timeout x comment "text message 228" +2.0.0.229 timeout x comment "text message 229" +2.0.0.230 timeout x comment "text message 230" +2.0.0.231 timeout x comment "text message 231" +2.0.0.232 timeout x comment "text message 232" +2.0.0.233 timeout x comment "text message 233" +2.0.0.234 timeout x comment "text message 234" +2.0.0.235 timeout x comment "text message 235" +2.0.0.236 timeout x comment "text message 236" +2.0.0.237 timeout x comment "text message 237" +2.0.0.238 timeout x comment "text message 238" +2.0.0.239 timeout x comment "text message 239" +2.0.0.240 timeout x comment "text message 240" +2.0.0.241 timeout x comment "text message 241" +2.0.0.242 timeout x comment "text message 242" +2.0.0.243 timeout x comment "text message 243" +2.0.0.244 timeout x comment "text message 244" +2.0.0.245 timeout x comment "text message 245" +2.0.0.246 timeout x comment "text message 246" +2.0.0.247 timeout x comment "text message 247" +2.0.0.248 timeout x comment "text message 248" +2.0.0.249 timeout x comment "text message 249" +2.0.0.250 timeout x comment "text message 250" +2.0.0.251 timeout x comment "text message 251" +2.0.0.252 timeout x comment "text message 252" +2.0.0.253 timeout x comment "text message 253" +2.0.0.254 timeout x comment "text message 254" +2.0.0.255 timeout x comment "text message 255" +2.0.1.1 timeout x comment "text message 1" +2.0.1.2 timeout x comment "text message 2" +2.0.1.3 timeout x comment "text message 3" +2.0.1.4 timeout x comment "text message 4" +2.0.1.5 timeout x comment "text message 5" +2.0.1.6 timeout x comment "text message 6" +2.0.1.7 timeout x comment "text message 7" +2.0.1.8 timeout x comment "text message 8" +2.0.1.9 timeout x comment "text message 9" +2.0.1.10 timeout x comment "text message 10" +2.0.1.11 timeout x comment "text message 11" +2.0.1.12 timeout x comment "text message 12" +2.0.1.13 timeout x comment "text message 13" +2.0.1.14 timeout x comment "text message 14" +2.0.1.15 timeout x comment "text message 15" +2.0.1.16 timeout x comment "text message 16" +2.0.1.17 timeout x comment "text message 17" +2.0.1.18 timeout x comment "text message 18" +2.0.1.19 timeout x comment "text message 19" +2.0.1.20 timeout x comment "text message 20" +2.0.1.21 timeout x comment "text message 21" +2.0.1.22 timeout x comment "text message 22" +2.0.1.23 timeout x comment "text message 23" +2.0.1.24 timeout x comment "text message 24" +2.0.1.25 timeout x comment "text message 25" +2.0.1.26 timeout x comment "text message 26" +2.0.1.27 timeout x comment "text message 27" +2.0.1.28 timeout x comment "text message 28" +2.0.1.29 timeout x comment "text message 29" +2.0.1.30 timeout x comment "text message 30" +2.0.1.31 timeout x comment "text message 31" +2.0.1.32 timeout x comment "text message 32" +2.0.1.33 timeout x comment "text message 33" +2.0.1.34 timeout x comment "text message 34" +2.0.1.35 timeout x comment "text message 35" +2.0.1.36 timeout x comment "text message 36" +2.0.1.37 timeout x comment "text message 37" +2.0.1.38 timeout x comment "text message 38" +2.0.1.39 timeout x comment "text message 39" +2.0.1.40 timeout x comment "text message 40" +2.0.1.41 timeout x comment "text message 41" +2.0.1.42 timeout x comment "text message 42" +2.0.1.43 timeout x comment "text message 43" +2.0.1.44 timeout x comment "text message 44" +2.0.1.45 timeout x comment "text message 45" +2.0.1.46 timeout x comment "text message 46" +2.0.1.47 timeout x comment "text message 47" +2.0.1.48 timeout x comment "text message 48" +2.0.1.49 timeout x comment "text message 49" +2.0.1.50 timeout x comment "text message 50" +2.0.1.51 timeout x comment "text message 51" +2.0.1.52 timeout x comment "text message 52" +2.0.1.53 timeout x comment "text message 53" +2.0.1.54 timeout x comment "text message 54" +2.0.1.55 timeout x comment "text message 55" +2.0.1.56 timeout x comment "text message 56" +2.0.1.57 timeout x comment "text message 57" +2.0.1.58 timeout x comment "text message 58" +2.0.1.59 timeout x comment "text message 59" +2.0.1.60 timeout x comment "text message 60" +2.0.1.61 timeout x comment "text message 61" +2.0.1.62 timeout x comment "text message 62" +2.0.1.63 timeout x comment "text message 63" +2.0.1.64 timeout x comment "text message 64" +2.0.1.65 timeout x comment "text message 65" +2.0.1.66 timeout x comment "text message 66" +2.0.1.67 timeout x comment "text message 67" +2.0.1.68 timeout x comment "text message 68" +2.0.1.69 timeout x comment "text message 69" +2.0.1.70 timeout x comment "text message 70" +2.0.1.71 timeout x comment "text message 71" +2.0.1.72 timeout x comment "text message 72" +2.0.1.73 timeout x comment "text message 73" +2.0.1.74 timeout x comment "text message 74" +2.0.1.75 timeout x comment "text message 75" +2.0.1.76 timeout x comment "text message 76" +2.0.1.77 timeout x comment "text message 77" +2.0.1.78 timeout x comment "text message 78" +2.0.1.79 timeout x comment "text message 79" +2.0.1.80 timeout x comment "text message 80" +2.0.1.81 timeout x comment "text message 81" +2.0.1.82 timeout x comment "text message 82" +2.0.1.83 timeout x comment "text message 83" +2.0.1.84 timeout x comment "text message 84" +2.0.1.85 timeout x comment "text message 85" +2.0.1.86 timeout x comment "text message 86" +2.0.1.87 timeout x comment "text message 87" +2.0.1.88 timeout x comment "text message 88" +2.0.1.89 timeout x comment "text message 89" +2.0.1.90 timeout x comment "text message 90" +2.0.1.91 timeout x comment "text message 91" +2.0.1.92 timeout x comment "text message 92" +2.0.1.93 timeout x comment "text message 93" +2.0.1.94 timeout x comment "text message 94" +2.0.1.95 timeout x comment "text message 95" +2.0.1.96 timeout x comment "text message 96" +2.0.1.97 timeout x comment "text message 97" +2.0.1.98 timeout x comment "text message 98" +2.0.1.99 timeout x comment "text message 99" +2.0.1.100 timeout x comment "text message 100" +2.0.1.101 timeout x comment "text message 101" +2.0.1.102 timeout x comment "text message 102" +2.0.1.103 timeout x comment "text message 103" +2.0.1.104 timeout x comment "text message 104" +2.0.1.105 timeout x comment "text message 105" +2.0.1.106 timeout x comment "text message 106" +2.0.1.107 timeout x comment "text message 107" +2.0.1.108 timeout x comment "text message 108" +2.0.1.109 timeout x comment "text message 109" +2.0.1.110 timeout x comment "text message 110" +2.0.1.111 timeout x comment "text message 111" +2.0.1.112 timeout x comment "text message 112" +2.0.1.113 timeout x comment "text message 113" +2.0.1.114 timeout x comment "text message 114" +2.0.1.115 timeout x comment "text message 115" +2.0.1.116 timeout x comment "text message 116" +2.0.1.117 timeout x comment "text message 117" +2.0.1.118 timeout x comment "text message 118" +2.0.1.119 timeout x comment "text message 119" +2.0.1.120 timeout x comment "text message 120" +2.0.1.121 timeout x comment "text message 121" +2.0.1.122 timeout x comment "text message 122" +2.0.1.123 timeout x comment "text message 123" +2.0.1.124 timeout x comment "text message 124" +2.0.1.125 timeout x comment "text message 125" +2.0.1.126 timeout x comment "text message 126" +2.0.1.127 timeout x comment "text message 127" +2.0.1.128 timeout x comment "text message 128" +2.0.1.129 timeout x comment "text message 129" +2.0.1.130 timeout x comment "text message 130" +2.0.1.131 timeout x comment "text message 131" +2.0.1.132 timeout x comment "text message 132" +2.0.1.133 timeout x comment "text message 133" +2.0.1.134 timeout x comment "text message 134" +2.0.1.135 timeout x comment "text message 135" +2.0.1.136 timeout x comment "text message 136" +2.0.1.137 timeout x comment "text message 137" +2.0.1.138 timeout x comment "text message 138" +2.0.1.139 timeout x comment "text message 139" +2.0.1.140 timeout x comment "text message 140" +2.0.1.141 timeout x comment "text message 141" +2.0.1.142 timeout x comment "text message 142" +2.0.1.143 timeout x comment "text message 143" +2.0.1.144 timeout x comment "text message 144" +2.0.1.145 timeout x comment "text message 145" +2.0.1.146 timeout x comment "text message 146" +2.0.1.147 timeout x comment "text message 147" +2.0.1.148 timeout x comment "text message 148" +2.0.1.149 timeout x comment "text message 149" +2.0.1.150 timeout x comment "text message 150" +2.0.1.151 timeout x comment "text message 151" +2.0.1.152 timeout x comment "text message 152" +2.0.1.153 timeout x comment "text message 153" +2.0.1.154 timeout x comment "text message 154" +2.0.1.155 timeout x comment "text message 155" +2.0.1.156 timeout x comment "text message 156" +2.0.1.157 timeout x comment "text message 157" +2.0.1.158 timeout x comment "text message 158" +2.0.1.159 timeout x comment "text message 159" +2.0.1.160 timeout x comment "text message 160" +2.0.1.161 timeout x comment "text message 161" +2.0.1.162 timeout x comment "text message 162" +2.0.1.163 timeout x comment "text message 163" +2.0.1.164 timeout x comment "text message 164" +2.0.1.165 timeout x comment "text message 165" +2.0.1.166 timeout x comment "text message 166" +2.0.1.167 timeout x comment "text message 167" +2.0.1.168 timeout x comment "text message 168" +2.0.1.169 timeout x comment "text message 169" +2.0.1.170 timeout x comment "text message 170" +2.0.1.171 timeout x comment "text message 171" +2.0.1.172 timeout x comment "text message 172" +2.0.1.173 timeout x comment "text message 173" +2.0.1.174 timeout x comment "text message 174" +2.0.1.175 timeout x comment "text message 175" +2.0.1.176 timeout x comment "text message 176" +2.0.1.177 timeout x comment "text message 177" +2.0.1.178 timeout x comment "text message 178" +2.0.1.179 timeout x comment "text message 179" +2.0.1.180 timeout x comment "text message 180" +2.0.1.181 timeout x comment "text message 181" +2.0.1.182 timeout x comment "text message 182" +2.0.1.183 timeout x comment "text message 183" +2.0.1.184 timeout x comment "text message 184" +2.0.1.185 timeout x comment "text message 185" +2.0.1.186 timeout x comment "text message 186" +2.0.1.187 timeout x comment "text message 187" +2.0.1.188 timeout x comment "text message 188" +2.0.1.189 timeout x comment "text message 189" +2.0.1.190 timeout x comment "text message 190" +2.0.1.191 timeout x comment "text message 191" +2.0.1.192 timeout x comment "text message 192" +2.0.1.193 timeout x comment "text message 193" +2.0.1.194 timeout x comment "text message 194" +2.0.1.195 timeout x comment "text message 195" +2.0.1.196 timeout x comment "text message 196" +2.0.1.197 timeout x comment "text message 197" +2.0.1.198 timeout x comment "text message 198" +2.0.1.199 timeout x comment "text message 199" +2.0.1.200 timeout x comment "text message 200" +2.0.1.201 timeout x comment "text message 201" +2.0.1.202 timeout x comment "text message 202" +2.0.1.203 timeout x comment "text message 203" +2.0.1.204 timeout x comment "text message 204" +2.0.1.205 timeout x comment "text message 205" +2.0.1.206 timeout x comment "text message 206" +2.0.1.207 timeout x comment "text message 207" +2.0.1.208 timeout x comment "text message 208" +2.0.1.209 timeout x comment "text message 209" +2.0.1.210 timeout x comment "text message 210" +2.0.1.211 timeout x comment "text message 211" +2.0.1.212 timeout x comment "text message 212" +2.0.1.213 timeout x comment "text message 213" +2.0.1.214 timeout x comment "text message 214" +2.0.1.215 timeout x comment "text message 215" +2.0.1.216 timeout x comment "text message 216" +2.0.1.217 timeout x comment "text message 217" +2.0.1.218 timeout x comment "text message 218" +2.0.1.219 timeout x comment "text message 219" +2.0.1.220 timeout x comment "text message 220" +2.0.1.221 timeout x comment "text message 221" +2.0.1.222 timeout x comment "text message 222" +2.0.1.223 timeout x comment "text message 223" +2.0.1.224 timeout x comment "text message 224" +2.0.1.225 timeout x comment "text message 225" +2.0.1.226 timeout x comment "text message 226" +2.0.1.227 timeout x comment "text message 227" +2.0.1.228 timeout x comment "text message 228" +2.0.1.229 timeout x comment "text message 229" +2.0.1.230 timeout x comment "text message 230" +2.0.1.231 timeout x comment "text message 231" +2.0.1.232 timeout x comment "text message 232" +2.0.1.233 timeout x comment "text message 233" +2.0.1.234 timeout x comment "text message 234" +2.0.1.235 timeout x comment "text message 235" +2.0.1.236 timeout x comment "text message 236" +2.0.1.237 timeout x comment "text message 237" +2.0.1.238 timeout x comment "text message 238" +2.0.1.239 timeout x comment "text message 239" +2.0.1.240 timeout x comment "text message 240" +2.0.1.241 timeout x comment "text message 241" +2.0.1.242 timeout x comment "text message 242" +2.0.1.243 timeout x comment "text message 243" +2.0.1.244 timeout x comment "text message 244" +2.0.1.245 timeout x comment "text message 245" +2.0.1.246 timeout x comment "text message 246" +2.0.1.247 timeout x comment "text message 247" +2.0.1.248 timeout x comment "text message 248" +2.0.1.249 timeout x comment "text message 249" +2.0.1.250 timeout x comment "text message 250" +2.0.1.251 timeout x comment "text message 251" +2.0.1.252 timeout x comment "text message 252" +2.0.1.253 timeout x comment "text message 253" +2.0.1.254 timeout x comment "text message 254" +2.0.1.255 timeout x comment "text message 255" diff --git a/tests/comment.t.list12 b/tests/comment.t.list12 new file mode 100644 index 0000000..9440b75 --- /dev/null +++ b/tests/comment.t.list12 @@ -0,0 +1,262 @@ +Name: test +Type: bitmap:ip +Header: range 2.0.0.1-2.1.0.0 timeout x comment +Size in memory: 1056928 +References: 0 +Number of entries: 510 +Members: +2.0.1.1 timeout x comment "text message 1" +2.0.1.2 timeout x comment "text message 2" +2.0.1.3 timeout x comment "text message 3" +2.0.1.4 timeout x comment "text message 4" +2.0.1.5 timeout x comment "text message 5" +2.0.1.6 timeout x comment "text message 6" +2.0.1.7 timeout x comment "text message 7" +2.0.1.8 timeout x comment "text message 8" +2.0.1.9 timeout x comment "text message 9" +2.0.1.10 timeout x comment "text message 10" +2.0.1.11 timeout x comment "text message 11" +2.0.1.12 timeout x comment "text message 12" +2.0.1.13 timeout x comment "text message 13" +2.0.1.14 timeout x comment "text message 14" +2.0.1.15 timeout x comment "text message 15" +2.0.1.16 timeout x comment "text message 16" +2.0.1.17 timeout x comment "text message 17" +2.0.1.18 timeout x comment "text message 18" +2.0.1.19 timeout x comment "text message 19" +2.0.1.20 timeout x comment "text message 20" +2.0.1.21 timeout x comment "text message 21" +2.0.1.22 timeout x comment "text message 22" +2.0.1.23 timeout x comment "text message 23" +2.0.1.24 timeout x comment "text message 24" +2.0.1.25 timeout x comment "text message 25" +2.0.1.26 timeout x comment "text message 26" +2.0.1.27 timeout x comment "text message 27" +2.0.1.28 timeout x comment "text message 28" +2.0.1.29 timeout x comment "text message 29" +2.0.1.30 timeout x comment "text message 30" +2.0.1.31 timeout x comment "text message 31" +2.0.1.32 timeout x comment "text message 32" +2.0.1.33 timeout x comment "text message 33" +2.0.1.34 timeout x comment "text message 34" +2.0.1.35 timeout x comment "text message 35" +2.0.1.36 timeout x comment "text message 36" +2.0.1.37 timeout x comment "text message 37" +2.0.1.38 timeout x comment "text message 38" +2.0.1.39 timeout x comment "text message 39" +2.0.1.40 timeout x comment "text message 40" +2.0.1.41 timeout x comment "text message 41" +2.0.1.42 timeout x comment "text message 42" +2.0.1.43 timeout x comment "text message 43" +2.0.1.44 timeout x comment "text message 44" +2.0.1.45 timeout x comment "text message 45" +2.0.1.46 timeout x comment "text message 46" +2.0.1.47 timeout x comment "text message 47" +2.0.1.48 timeout x comment "text message 48" +2.0.1.49 timeout x comment "text message 49" +2.0.1.50 timeout x comment "text message 50" +2.0.1.51 timeout x comment "text message 51" +2.0.1.52 timeout x comment "text message 52" +2.0.1.53 timeout x comment "text message 53" +2.0.1.54 timeout x comment "text message 54" +2.0.1.55 timeout x comment "text message 55" +2.0.1.56 timeout x comment "text message 56" +2.0.1.57 timeout x comment "text message 57" +2.0.1.58 timeout x comment "text message 58" +2.0.1.59 timeout x comment "text message 59" +2.0.1.60 timeout x comment "text message 60" +2.0.1.61 timeout x comment "text message 61" +2.0.1.62 timeout x comment "text message 62" +2.0.1.63 timeout x comment "text message 63" +2.0.1.64 timeout x comment "text message 64" +2.0.1.65 timeout x comment "text message 65" +2.0.1.66 timeout x comment "text message 66" +2.0.1.67 timeout x comment "text message 67" +2.0.1.68 timeout x comment "text message 68" +2.0.1.69 timeout x comment "text message 69" +2.0.1.70 timeout x comment "text message 70" +2.0.1.71 timeout x comment "text message 71" +2.0.1.72 timeout x comment "text message 72" +2.0.1.73 timeout x comment "text message 73" +2.0.1.74 timeout x comment "text message 74" +2.0.1.75 timeout x comment "text message 75" +2.0.1.76 timeout x comment "text message 76" +2.0.1.77 timeout x comment "text message 77" +2.0.1.78 timeout x comment "text message 78" +2.0.1.79 timeout x comment "text message 79" +2.0.1.80 timeout x comment "text message 80" +2.0.1.81 timeout x comment "text message 81" +2.0.1.82 timeout x comment "text message 82" +2.0.1.83 timeout x comment "text message 83" +2.0.1.84 timeout x comment "text message 84" +2.0.1.85 timeout x comment "text message 85" +2.0.1.86 timeout x comment "text message 86" +2.0.1.87 timeout x comment "text message 87" +2.0.1.88 timeout x comment "text message 88" +2.0.1.89 timeout x comment "text message 89" +2.0.1.90 timeout x comment "text message 90" +2.0.1.91 timeout x comment "text message 91" +2.0.1.92 timeout x comment "text message 92" +2.0.1.93 timeout x comment "text message 93" +2.0.1.94 timeout x comment "text message 94" +2.0.1.95 timeout x comment "text message 95" +2.0.1.96 timeout x comment "text message 96" +2.0.1.97 timeout x comment "text message 97" +2.0.1.98 timeout x comment "text message 98" +2.0.1.99 timeout x comment "text message 99" +2.0.1.100 timeout x comment "text message 100" +2.0.1.101 timeout x comment "text message 101" +2.0.1.102 timeout x comment "text message 102" +2.0.1.103 timeout x comment "text message 103" +2.0.1.104 timeout x comment "text message 104" +2.0.1.105 timeout x comment "text message 105" +2.0.1.106 timeout x comment "text message 106" +2.0.1.107 timeout x comment "text message 107" +2.0.1.108 timeout x comment "text message 108" +2.0.1.109 timeout x comment "text message 109" +2.0.1.110 timeout x comment "text message 110" +2.0.1.111 timeout x comment "text message 111" +2.0.1.112 timeout x comment "text message 112" +2.0.1.113 timeout x comment "text message 113" +2.0.1.114 timeout x comment "text message 114" +2.0.1.115 timeout x comment "text message 115" +2.0.1.116 timeout x comment "text message 116" +2.0.1.117 timeout x comment "text message 117" +2.0.1.118 timeout x comment "text message 118" +2.0.1.119 timeout x comment "text message 119" +2.0.1.120 timeout x comment "text message 120" +2.0.1.121 timeout x comment "text message 121" +2.0.1.122 timeout x comment "text message 122" +2.0.1.123 timeout x comment "text message 123" +2.0.1.124 timeout x comment "text message 124" +2.0.1.125 timeout x comment "text message 125" +2.0.1.126 timeout x comment "text message 126" +2.0.1.127 timeout x comment "text message 127" +2.0.1.128 timeout x comment "text message 128" +2.0.1.129 timeout x comment "text message 129" +2.0.1.130 timeout x comment "text message 130" +2.0.1.131 timeout x comment "text message 131" +2.0.1.132 timeout x comment "text message 132" +2.0.1.133 timeout x comment "text message 133" +2.0.1.134 timeout x comment "text message 134" +2.0.1.135 timeout x comment "text message 135" +2.0.1.136 timeout x comment "text message 136" +2.0.1.137 timeout x comment "text message 137" +2.0.1.138 timeout x comment "text message 138" +2.0.1.139 timeout x comment "text message 139" +2.0.1.140 timeout x comment "text message 140" +2.0.1.141 timeout x comment "text message 141" +2.0.1.142 timeout x comment "text message 142" +2.0.1.143 timeout x comment "text message 143" +2.0.1.144 timeout x comment "text message 144" +2.0.1.145 timeout x comment "text message 145" +2.0.1.146 timeout x comment "text message 146" +2.0.1.147 timeout x comment "text message 147" +2.0.1.148 timeout x comment "text message 148" +2.0.1.149 timeout x comment "text message 149" +2.0.1.150 timeout x comment "text message 150" +2.0.1.151 timeout x comment "text message 151" +2.0.1.152 timeout x comment "text message 152" +2.0.1.153 timeout x comment "text message 153" +2.0.1.154 timeout x comment "text message 154" +2.0.1.155 timeout x comment "text message 155" +2.0.1.156 timeout x comment "text message 156" +2.0.1.157 timeout x comment "text message 157" +2.0.1.158 timeout x comment "text message 158" +2.0.1.159 timeout x comment "text message 159" +2.0.1.160 timeout x comment "text message 160" +2.0.1.161 timeout x comment "text message 161" +2.0.1.162 timeout x comment "text message 162" +2.0.1.163 timeout x comment "text message 163" +2.0.1.164 timeout x comment "text message 164" +2.0.1.165 timeout x comment "text message 165" +2.0.1.166 timeout x comment "text message 166" +2.0.1.167 timeout x comment "text message 167" +2.0.1.168 timeout x comment "text message 168" +2.0.1.169 timeout x comment "text message 169" +2.0.1.170 timeout x comment "text message 170" +2.0.1.171 timeout x comment "text message 171" +2.0.1.172 timeout x comment "text message 172" +2.0.1.173 timeout x comment "text message 173" +2.0.1.174 timeout x comment "text message 174" +2.0.1.175 timeout x comment "text message 175" +2.0.1.176 timeout x comment "text message 176" +2.0.1.177 timeout x comment "text message 177" +2.0.1.178 timeout x comment "text message 178" +2.0.1.179 timeout x comment "text message 179" +2.0.1.180 timeout x comment "text message 180" +2.0.1.181 timeout x comment "text message 181" +2.0.1.182 timeout x comment "text message 182" +2.0.1.183 timeout x comment "text message 183" +2.0.1.184 timeout x comment "text message 184" +2.0.1.185 timeout x comment "text message 185" +2.0.1.186 timeout x comment "text message 186" +2.0.1.187 timeout x comment "text message 187" +2.0.1.188 timeout x comment "text message 188" +2.0.1.189 timeout x comment "text message 189" +2.0.1.190 timeout x comment "text message 190" +2.0.1.191 timeout x comment "text message 191" +2.0.1.192 timeout x comment "text message 192" +2.0.1.193 timeout x comment "text message 193" +2.0.1.194 timeout x comment "text message 194" +2.0.1.195 timeout x comment "text message 195" +2.0.1.196 timeout x comment "text message 196" +2.0.1.197 timeout x comment "text message 197" +2.0.1.198 timeout x comment "text message 198" +2.0.1.199 timeout x comment "text message 199" +2.0.1.200 timeout x comment "text message 200" +2.0.1.201 timeout x comment "text message 201" +2.0.1.202 timeout x comment "text message 202" +2.0.1.203 timeout x comment "text message 203" +2.0.1.204 timeout x comment "text message 204" +2.0.1.205 timeout x comment "text message 205" +2.0.1.206 timeout x comment "text message 206" +2.0.1.207 timeout x comment "text message 207" +2.0.1.208 timeout x comment "text message 208" +2.0.1.209 timeout x comment "text message 209" +2.0.1.210 timeout x comment "text message 210" +2.0.1.211 timeout x comment "text message 211" +2.0.1.212 timeout x comment "text message 212" +2.0.1.213 timeout x comment "text message 213" +2.0.1.214 timeout x comment "text message 214" +2.0.1.215 timeout x comment "text message 215" +2.0.1.216 timeout x comment "text message 216" +2.0.1.217 timeout x comment "text message 217" +2.0.1.218 timeout x comment "text message 218" +2.0.1.219 timeout x comment "text message 219" +2.0.1.220 timeout x comment "text message 220" +2.0.1.221 timeout x comment "text message 221" +2.0.1.222 timeout x comment "text message 222" +2.0.1.223 timeout x comment "text message 223" +2.0.1.224 timeout x comment "text message 224" +2.0.1.225 timeout x comment "text message 225" +2.0.1.226 timeout x comment "text message 226" +2.0.1.227 timeout x comment "text message 227" +2.0.1.228 timeout x comment "text message 228" +2.0.1.229 timeout x comment "text message 229" +2.0.1.230 timeout x comment "text message 230" +2.0.1.231 timeout x comment "text message 231" +2.0.1.232 timeout x comment "text message 232" +2.0.1.233 timeout x comment "text message 233" +2.0.1.234 timeout x comment "text message 234" +2.0.1.235 timeout x comment "text message 235" +2.0.1.236 timeout x comment "text message 236" +2.0.1.237 timeout x comment "text message 237" +2.0.1.238 timeout x comment "text message 238" +2.0.1.239 timeout x comment "text message 239" +2.0.1.240 timeout x comment "text message 240" +2.0.1.241 timeout x comment "text message 241" +2.0.1.242 timeout x comment "text message 242" +2.0.1.243 timeout x comment "text message 243" +2.0.1.244 timeout x comment "text message 244" +2.0.1.245 timeout x comment "text message 245" +2.0.1.246 timeout x comment "text message 246" +2.0.1.247 timeout x comment "text message 247" +2.0.1.248 timeout x comment "text message 248" +2.0.1.249 timeout x comment "text message 249" +2.0.1.250 timeout x comment "text message 250" +2.0.1.251 timeout x comment "text message 251" +2.0.1.252 timeout x comment "text message 252" +2.0.1.253 timeout x comment "text message 253" +2.0.1.254 timeout x comment "text message 254" +2.0.1.255 timeout x comment "text message 255" diff --git a/tests/comment.t.list2 b/tests/comment.t.list2 new file mode 100644 index 0000000..90a7e9b --- /dev/null +++ b/tests/comment.t.list2 @@ -0,0 +1,11 @@ +Name: test +Type: hash:net,net +Header: family inet hashsize 128 maxelem 65536 comment +Size in memory: 1288 +References: 0 +Number of entries: 4 +Members: +1.1.1.1,1.1.1.2 comment "text 1.1.1.1/32,1.1.1.2/32" +192.168.68.64/27,192.168.129.64/27 comment "text 192.168.68.69/27,192.168.129.69/27" +2.0.0.0/24,2.0.1.0/24 comment "text 2.0.0.1/24,2.0.1.1/24" +2.0.0.1,2.0.0.2 diff --git a/tests/comment.t.list21 b/tests/comment.t.list21 new file mode 100644 index 0000000..973b344 --- /dev/null +++ b/tests/comment.t.list21 @@ -0,0 +1,519 @@ +Name: test +Type: hash:ip +Header: family inet hashsize 1024 maxelem 65536 timeout x comment +Size in memory: 95168 +References: 0 +Number of entries: 512 +Members: +2.0.0.0 timeout x comment "text message 0" +2.0.0.1 timeout x comment "text message 1" +2.0.0.10 timeout x comment "text message 10" +2.0.0.100 timeout x comment "text message 100" +2.0.0.101 timeout x comment "text message 101" +2.0.0.102 timeout x comment "text message 102" +2.0.0.103 timeout x comment "text message 103" +2.0.0.104 timeout x comment "text message 104" +2.0.0.105 timeout x comment "text message 105" +2.0.0.106 timeout x comment "text message 106" +2.0.0.107 timeout x comment "text message 107" +2.0.0.108 timeout x comment "text message 108" +2.0.0.109 timeout x comment "text message 109" +2.0.0.11 timeout x comment "text message 11" +2.0.0.110 timeout x comment "text message 110" +2.0.0.111 timeout x comment "text message 111" +2.0.0.112 timeout x comment "text message 112" +2.0.0.113 timeout x comment "text message 113" +2.0.0.114 timeout x comment "text message 114" +2.0.0.115 timeout x comment "text message 115" +2.0.0.116 timeout x comment "text message 116" +2.0.0.117 timeout x comment "text message 117" +2.0.0.118 timeout x comment "text message 118" +2.0.0.119 timeout x comment "text message 119" +2.0.0.12 timeout x comment "text message 12" +2.0.0.120 timeout x comment "text message 120" +2.0.0.121 timeout x comment "text message 121" +2.0.0.122 timeout x comment "text message 122" +2.0.0.123 timeout x comment "text message 123" +2.0.0.124 timeout x comment "text message 124" +2.0.0.125 timeout x comment "text message 125" +2.0.0.126 timeout x comment "text message 126" +2.0.0.127 timeout x comment "text message 127" +2.0.0.128 timeout x comment "text message 128" +2.0.0.129 timeout x comment "text message 129" +2.0.0.13 timeout x comment "text message 13" +2.0.0.130 timeout x comment "text message 130" +2.0.0.131 timeout x comment "text message 131" +2.0.0.132 timeout x comment "text message 132" +2.0.0.133 timeout x comment "text message 133" +2.0.0.134 timeout x comment "text message 134" +2.0.0.135 timeout x comment "text message 135" +2.0.0.136 timeout x comment "text message 136" +2.0.0.137 timeout x comment "text message 137" +2.0.0.138 timeout x comment "text message 138" +2.0.0.139 timeout x comment "text message 139" +2.0.0.14 timeout x comment "text message 14" +2.0.0.140 timeout x comment "text message 140" +2.0.0.141 timeout x comment "text message 141" +2.0.0.142 timeout x comment "text message 142" +2.0.0.143 timeout x comment "text message 143" +2.0.0.144 timeout x comment "text message 144" +2.0.0.145 timeout x comment "text message 145" +2.0.0.146 timeout x comment "text message 146" +2.0.0.147 timeout x comment "text message 147" +2.0.0.148 timeout x comment "text message 148" +2.0.0.149 timeout x comment "text message 149" +2.0.0.15 timeout x comment "text message 15" +2.0.0.150 timeout x comment "text message 150" +2.0.0.151 timeout x comment "text message 151" +2.0.0.152 timeout x comment "text message 152" +2.0.0.153 timeout x comment "text message 153" +2.0.0.154 timeout x comment "text message 154" +2.0.0.155 timeout x comment "text message 155" +2.0.0.156 timeout x comment "text message 156" +2.0.0.157 timeout x comment "text message 157" +2.0.0.158 timeout x comment "text message 158" +2.0.0.159 timeout x comment "text message 159" +2.0.0.16 timeout x comment "text message 16" +2.0.0.160 timeout x comment "text message 160" +2.0.0.161 timeout x comment "text message 161" +2.0.0.162 timeout x comment "text message 162" +2.0.0.163 timeout x comment "text message 163" +2.0.0.164 timeout x comment "text message 164" +2.0.0.165 timeout x comment "text message 165" +2.0.0.166 timeout x comment "text message 166" +2.0.0.167 timeout x comment "text message 167" +2.0.0.168 timeout x comment "text message 168" +2.0.0.169 timeout x comment "text message 169" +2.0.0.17 timeout x comment "text message 17" +2.0.0.170 timeout x comment "text message 170" +2.0.0.171 timeout x comment "text message 171" +2.0.0.172 timeout x comment "text message 172" +2.0.0.173 timeout x comment "text message 173" +2.0.0.174 timeout x comment "text message 174" +2.0.0.175 timeout x comment "text message 175" +2.0.0.176 timeout x comment "text message 176" +2.0.0.177 timeout x comment "text message 177" +2.0.0.178 timeout x comment "text message 178" +2.0.0.179 timeout x comment "text message 179" +2.0.0.18 timeout x comment "text message 18" +2.0.0.180 timeout x comment "text message 180" +2.0.0.181 timeout x comment "text message 181" +2.0.0.182 timeout x comment "text message 182" +2.0.0.183 timeout x comment "text message 183" +2.0.0.184 timeout x comment "text message 184" +2.0.0.185 timeout x comment "text message 185" +2.0.0.186 timeout x comment "text message 186" +2.0.0.187 timeout x comment "text message 187" +2.0.0.188 timeout x comment "text message 188" +2.0.0.189 timeout x comment "text message 189" +2.0.0.19 timeout x comment "text message 19" +2.0.0.190 timeout x comment "text message 190" +2.0.0.191 timeout x comment "text message 191" +2.0.0.192 timeout x comment "text message 192" +2.0.0.193 timeout x comment "text message 193" +2.0.0.194 timeout x comment "text message 194" +2.0.0.195 timeout x comment "text message 195" +2.0.0.196 timeout x comment "text message 196" +2.0.0.197 timeout x comment "text message 197" +2.0.0.198 timeout x comment "text message 198" +2.0.0.199 timeout x comment "text message 199" +2.0.0.2 timeout x comment "text message 2" +2.0.0.20 timeout x comment "text message 20" +2.0.0.200 timeout x comment "text message 200" +2.0.0.201 timeout x comment "text message 201" +2.0.0.202 timeout x comment "text message 202" +2.0.0.203 timeout x comment "text message 203" +2.0.0.204 timeout x comment "text message 204" +2.0.0.205 timeout x comment "text message 205" +2.0.0.206 timeout x comment "text message 206" +2.0.0.207 timeout x comment "text message 207" +2.0.0.208 timeout x comment "text message 208" +2.0.0.209 timeout x comment "text message 209" +2.0.0.21 timeout x comment "text message 21" +2.0.0.210 timeout x comment "text message 210" +2.0.0.211 timeout x comment "text message 211" +2.0.0.212 timeout x comment "text message 212" +2.0.0.213 timeout x comment "text message 213" +2.0.0.214 timeout x comment "text message 214" +2.0.0.215 timeout x comment "text message 215" +2.0.0.216 timeout x comment "text message 216" +2.0.0.217 timeout x comment "text message 217" +2.0.0.218 timeout x comment "text message 218" +2.0.0.219 timeout x comment "text message 219" +2.0.0.22 timeout x comment "text message 22" +2.0.0.220 timeout x comment "text message 220" +2.0.0.221 timeout x comment "text message 221" +2.0.0.222 timeout x comment "text message 222" +2.0.0.223 timeout x comment "text message 223" +2.0.0.224 timeout x comment "text message 224" +2.0.0.225 timeout x comment "text message 225" +2.0.0.226 timeout x comment "text message 226" +2.0.0.227 timeout x comment "text message 227" +2.0.0.228 timeout x comment "text message 228" +2.0.0.229 timeout x comment "text message 229" +2.0.0.23 timeout x comment "text message 23" +2.0.0.230 timeout x comment "text message 230" +2.0.0.231 timeout x comment "text message 231" +2.0.0.232 timeout x comment "text message 232" +2.0.0.233 timeout x comment "text message 233" +2.0.0.234 timeout x comment "text message 234" +2.0.0.235 timeout x comment "text message 235" +2.0.0.236 timeout x comment "text message 236" +2.0.0.237 timeout x comment "text message 237" +2.0.0.238 timeout x comment "text message 238" +2.0.0.239 timeout x comment "text message 239" +2.0.0.24 timeout x comment "text message 24" +2.0.0.240 timeout x comment "text message 240" +2.0.0.241 timeout x comment "text message 241" +2.0.0.242 timeout x comment "text message 242" +2.0.0.243 timeout x comment "text message 243" +2.0.0.244 timeout x comment "text message 244" +2.0.0.245 timeout x comment "text message 245" +2.0.0.246 timeout x comment "text message 246" +2.0.0.247 timeout x comment "text message 247" +2.0.0.248 timeout x comment "text message 248" +2.0.0.249 timeout x comment "text message 249" +2.0.0.25 timeout x comment "text message 25" +2.0.0.250 timeout x comment "text message 250" +2.0.0.251 timeout x comment "text message 251" +2.0.0.252 timeout x comment "text message 252" +2.0.0.253 timeout x comment "text message 253" +2.0.0.254 timeout x comment "text message 254" +2.0.0.255 timeout x comment "text message 255" +2.0.0.26 timeout x comment "text message 26" +2.0.0.27 timeout x comment "text message 27" +2.0.0.28 timeout x comment "text message 28" +2.0.0.29 timeout x comment "text message 29" +2.0.0.3 timeout x comment "text message 3" +2.0.0.30 timeout x comment "text message 30" +2.0.0.31 timeout x comment "text message 31" +2.0.0.32 timeout x comment "text message 32" +2.0.0.33 timeout x comment "text message 33" +2.0.0.34 timeout x comment "text message 34" +2.0.0.35 timeout x comment "text message 35" +2.0.0.36 timeout x comment "text message 36" +2.0.0.37 timeout x comment "text message 37" +2.0.0.38 timeout x comment "text message 38" +2.0.0.39 timeout x comment "text message 39" +2.0.0.4 timeout x comment "text message 4" +2.0.0.40 timeout x comment "text message 40" +2.0.0.41 timeout x comment "text message 41" +2.0.0.42 timeout x comment "text message 42" +2.0.0.43 timeout x comment "text message 43" +2.0.0.44 timeout x comment "text message 44" +2.0.0.45 timeout x comment "text message 45" +2.0.0.46 timeout x comment "text message 46" +2.0.0.47 timeout x comment "text message 47" +2.0.0.48 timeout x comment "text message 48" +2.0.0.49 timeout x comment "text message 49" +2.0.0.5 timeout x comment "text message 5" +2.0.0.50 timeout x comment "text message 50" +2.0.0.51 timeout x comment "text message 51" +2.0.0.52 timeout x comment "text message 52" +2.0.0.53 timeout x comment "text message 53" +2.0.0.54 timeout x comment "text message 54" +2.0.0.55 timeout x comment "text message 55" +2.0.0.56 timeout x comment "text message 56" +2.0.0.57 timeout x comment "text message 57" +2.0.0.58 timeout x comment "text message 58" +2.0.0.59 timeout x comment "text message 59" +2.0.0.6 timeout x comment "text message 6" +2.0.0.60 timeout x comment "text message 60" +2.0.0.61 timeout x comment "text message 61" +2.0.0.62 timeout x comment "text message 62" +2.0.0.63 timeout x comment "text message 63" +2.0.0.64 timeout x comment "text message 64" +2.0.0.65 timeout x comment "text message 65" +2.0.0.66 timeout x comment "text message 66" +2.0.0.67 timeout x comment "text message 67" +2.0.0.68 timeout x comment "text message 68" +2.0.0.69 timeout x comment "text message 69" +2.0.0.7 timeout x comment "text message 7" +2.0.0.70 timeout x comment "text message 70" +2.0.0.71 timeout x comment "text message 71" +2.0.0.72 timeout x comment "text message 72" +2.0.0.73 timeout x comment "text message 73" +2.0.0.74 timeout x comment "text message 74" +2.0.0.75 timeout x comment "text message 75" +2.0.0.76 timeout x comment "text message 76" +2.0.0.77 timeout x comment "text message 77" +2.0.0.78 timeout x comment "text message 78" +2.0.0.79 timeout x comment "text message 79" +2.0.0.8 timeout x comment "text message 8" +2.0.0.80 timeout x comment "text message 80" +2.0.0.81 timeout x comment "text message 81" +2.0.0.82 timeout x comment "text message 82" +2.0.0.83 timeout x comment "text message 83" +2.0.0.84 timeout x comment "text message 84" +2.0.0.85 timeout x comment "text message 85" +2.0.0.86 timeout x comment "text message 86" +2.0.0.87 timeout x comment "text message 87" +2.0.0.88 timeout x comment "text message 88" +2.0.0.89 timeout x comment "text message 89" +2.0.0.9 timeout x comment "text message 9" +2.0.0.90 timeout x comment "text message 90" +2.0.0.91 timeout x comment "text message 91" +2.0.0.92 timeout x comment "text message 92" +2.0.0.93 timeout x comment "text message 93" +2.0.0.94 timeout x comment "text message 94" +2.0.0.95 timeout x comment "text message 95" +2.0.0.96 timeout x comment "text message 96" +2.0.0.97 timeout x comment "text message 97" +2.0.0.98 timeout x comment "text message 98" +2.0.0.99 timeout x comment "text message 99" +2.0.1.0 timeout x comment "text message 0" +2.0.1.1 timeout x comment "text message 1" +2.0.1.10 timeout x comment "text message 10" +2.0.1.100 timeout x comment "text message 100" +2.0.1.101 timeout x comment "text message 101" +2.0.1.102 timeout x comment "text message 102" +2.0.1.103 timeout x comment "text message 103" +2.0.1.104 timeout x comment "text message 104" +2.0.1.105 timeout x comment "text message 105" +2.0.1.106 timeout x comment "text message 106" +2.0.1.107 timeout x comment "text message 107" +2.0.1.108 timeout x comment "text message 108" +2.0.1.109 timeout x comment "text message 109" +2.0.1.11 timeout x comment "text message 11" +2.0.1.110 timeout x comment "text message 110" +2.0.1.111 timeout x comment "text message 111" +2.0.1.112 timeout x comment "text message 112" +2.0.1.113 timeout x comment "text message 113" +2.0.1.114 timeout x comment "text message 114" +2.0.1.115 timeout x comment "text message 115" +2.0.1.116 timeout x comment "text message 116" +2.0.1.117 timeout x comment "text message 117" +2.0.1.118 timeout x comment "text message 118" +2.0.1.119 timeout x comment "text message 119" +2.0.1.12 timeout x comment "text message 12" +2.0.1.120 timeout x comment "text message 120" +2.0.1.121 timeout x comment "text message 121" +2.0.1.122 timeout x comment "text message 122" +2.0.1.123 timeout x comment "text message 123" +2.0.1.124 timeout x comment "text message 124" +2.0.1.125 timeout x comment "text message 125" +2.0.1.126 timeout x comment "text message 126" +2.0.1.127 timeout x comment "text message 127" +2.0.1.128 timeout x comment "text message 128" +2.0.1.129 timeout x comment "text message 129" +2.0.1.13 timeout x comment "text message 13" +2.0.1.130 timeout x comment "text message 130" +2.0.1.131 timeout x comment "text message 131" +2.0.1.132 timeout x comment "text message 132" +2.0.1.133 timeout x comment "text message 133" +2.0.1.134 timeout x comment "text message 134" +2.0.1.135 timeout x comment "text message 135" +2.0.1.136 timeout x comment "text message 136" +2.0.1.137 timeout x comment "text message 137" +2.0.1.138 timeout x comment "text message 138" +2.0.1.139 timeout x comment "text message 139" +2.0.1.14 timeout x comment "text message 14" +2.0.1.140 timeout x comment "text message 140" +2.0.1.141 timeout x comment "text message 141" +2.0.1.142 timeout x comment "text message 142" +2.0.1.143 timeout x comment "text message 143" +2.0.1.144 timeout x comment "text message 144" +2.0.1.145 timeout x comment "text message 145" +2.0.1.146 timeout x comment "text message 146" +2.0.1.147 timeout x comment "text message 147" +2.0.1.148 timeout x comment "text message 148" +2.0.1.149 timeout x comment "text message 149" +2.0.1.15 timeout x comment "text message 15" +2.0.1.150 timeout x comment "text message 150" +2.0.1.151 timeout x comment "text message 151" +2.0.1.152 timeout x comment "text message 152" +2.0.1.153 timeout x comment "text message 153" +2.0.1.154 timeout x comment "text message 154" +2.0.1.155 timeout x comment "text message 155" +2.0.1.156 timeout x comment "text message 156" +2.0.1.157 timeout x comment "text message 157" +2.0.1.158 timeout x comment "text message 158" +2.0.1.159 timeout x comment "text message 159" +2.0.1.16 timeout x comment "text message 16" +2.0.1.160 timeout x comment "text message 160" +2.0.1.161 timeout x comment "text message 161" +2.0.1.162 timeout x comment "text message 162" +2.0.1.163 timeout x comment "text message 163" +2.0.1.164 timeout x comment "text message 164" +2.0.1.165 timeout x comment "text message 165" +2.0.1.166 timeout x comment "text message 166" +2.0.1.167 timeout x comment "text message 167" +2.0.1.168 timeout x comment "text message 168" +2.0.1.169 timeout x comment "text message 169" +2.0.1.17 timeout x comment "text message 17" +2.0.1.170 timeout x comment "text message 170" +2.0.1.171 timeout x comment "text message 171" +2.0.1.172 timeout x comment "text message 172" +2.0.1.173 timeout x comment "text message 173" +2.0.1.174 timeout x comment "text message 174" +2.0.1.175 timeout x comment "text message 175" +2.0.1.176 timeout x comment "text message 176" +2.0.1.177 timeout x comment "text message 177" +2.0.1.178 timeout x comment "text message 178" +2.0.1.179 timeout x comment "text message 179" +2.0.1.18 timeout x comment "text message 18" +2.0.1.180 timeout x comment "text message 180" +2.0.1.181 timeout x comment "text message 181" +2.0.1.182 timeout x comment "text message 182" +2.0.1.183 timeout x comment "text message 183" +2.0.1.184 timeout x comment "text message 184" +2.0.1.185 timeout x comment "text message 185" +2.0.1.186 timeout x comment "text message 186" +2.0.1.187 timeout x comment "text message 187" +2.0.1.188 timeout x comment "text message 188" +2.0.1.189 timeout x comment "text message 189" +2.0.1.19 timeout x comment "text message 19" +2.0.1.190 timeout x comment "text message 190" +2.0.1.191 timeout x comment "text message 191" +2.0.1.192 timeout x comment "text message 192" +2.0.1.193 timeout x comment "text message 193" +2.0.1.194 timeout x comment "text message 194" +2.0.1.195 timeout x comment "text message 195" +2.0.1.196 timeout x comment "text message 196" +2.0.1.197 timeout x comment "text message 197" +2.0.1.198 timeout x comment "text message 198" +2.0.1.199 timeout x comment "text message 199" +2.0.1.2 timeout x comment "text message 2" +2.0.1.20 timeout x comment "text message 20" +2.0.1.200 timeout x comment "text message 200" +2.0.1.201 timeout x comment "text message 201" +2.0.1.202 timeout x comment "text message 202" +2.0.1.203 timeout x comment "text message 203" +2.0.1.204 timeout x comment "text message 204" +2.0.1.205 timeout x comment "text message 205" +2.0.1.206 timeout x comment "text message 206" +2.0.1.207 timeout x comment "text message 207" +2.0.1.208 timeout x comment "text message 208" +2.0.1.209 timeout x comment "text message 209" +2.0.1.21 timeout x comment "text message 21" +2.0.1.210 timeout x comment "text message 210" +2.0.1.211 timeout x comment "text message 211" +2.0.1.212 timeout x comment "text message 212" +2.0.1.213 timeout x comment "text message 213" +2.0.1.214 timeout x comment "text message 214" +2.0.1.215 timeout x comment "text message 215" +2.0.1.216 timeout x comment "text message 216" +2.0.1.217 timeout x comment "text message 217" +2.0.1.218 timeout x comment "text message 218" +2.0.1.219 timeout x comment "text message 219" +2.0.1.22 timeout x comment "text message 22" +2.0.1.220 timeout x comment "text message 220" +2.0.1.221 timeout x comment "text message 221" +2.0.1.222 timeout x comment "text message 222" +2.0.1.223 timeout x comment "text message 223" +2.0.1.224 timeout x comment "text message 224" +2.0.1.225 timeout x comment "text message 225" +2.0.1.226 timeout x comment "text message 226" +2.0.1.227 timeout x comment "text message 227" +2.0.1.228 timeout x comment "text message 228" +2.0.1.229 timeout x comment "text message 229" +2.0.1.23 timeout x comment "text message 23" +2.0.1.230 timeout x comment "text message 230" +2.0.1.231 timeout x comment "text message 231" +2.0.1.232 timeout x comment "text message 232" +2.0.1.233 timeout x comment "text message 233" +2.0.1.234 timeout x comment "text message 234" +2.0.1.235 timeout x comment "text message 235" +2.0.1.236 timeout x comment "text message 236" +2.0.1.237 timeout x comment "text message 237" +2.0.1.238 timeout x comment "text message 238" +2.0.1.239 timeout x comment "text message 239" +2.0.1.24 timeout x comment "text message 24" +2.0.1.240 timeout x comment "text message 240" +2.0.1.241 timeout x comment "text message 241" +2.0.1.242 timeout x comment "text message 242" +2.0.1.243 timeout x comment "text message 243" +2.0.1.244 timeout x comment "text message 244" +2.0.1.245 timeout x comment "text message 245" +2.0.1.246 timeout x comment "text message 246" +2.0.1.247 timeout x comment "text message 247" +2.0.1.248 timeout x comment "text message 248" +2.0.1.249 timeout x comment "text message 249" +2.0.1.25 timeout x comment "text message 25" +2.0.1.250 timeout x comment "text message 250" +2.0.1.251 timeout x comment "text message 251" +2.0.1.252 timeout x comment "text message 252" +2.0.1.253 timeout x comment "text message 253" +2.0.1.254 timeout x comment "text message 254" +2.0.1.255 timeout x comment "text message 255" +2.0.1.26 timeout x comment "text message 26" +2.0.1.27 timeout x comment "text message 27" +2.0.1.28 timeout x comment "text message 28" +2.0.1.29 timeout x comment "text message 29" +2.0.1.3 timeout x comment "text message 3" +2.0.1.30 timeout x comment "text message 30" +2.0.1.31 timeout x comment "text message 31" +2.0.1.32 timeout x comment "text message 32" +2.0.1.33 timeout x comment "text message 33" +2.0.1.34 timeout x comment "text message 34" +2.0.1.35 timeout x comment "text message 35" +2.0.1.36 timeout x comment "text message 36" +2.0.1.37 timeout x comment "text message 37" +2.0.1.38 timeout x comment "text message 38" +2.0.1.39 timeout x comment "text message 39" +2.0.1.4 timeout x comment "text message 4" +2.0.1.40 timeout x comment "text message 40" +2.0.1.41 timeout x comment "text message 41" +2.0.1.42 timeout x comment "text message 42" +2.0.1.43 timeout x comment "text message 43" +2.0.1.44 timeout x comment "text message 44" +2.0.1.45 timeout x comment "text message 45" +2.0.1.46 timeout x comment "text message 46" +2.0.1.47 timeout x comment "text message 47" +2.0.1.48 timeout x comment "text message 48" +2.0.1.49 timeout x comment "text message 49" +2.0.1.5 timeout x comment "text message 5" +2.0.1.50 timeout x comment "text message 50" +2.0.1.51 timeout x comment "text message 51" +2.0.1.52 timeout x comment "text message 52" +2.0.1.53 timeout x comment "text message 53" +2.0.1.54 timeout x comment "text message 54" +2.0.1.55 timeout x comment "text message 55" +2.0.1.56 timeout x comment "text message 56" +2.0.1.57 timeout x comment "text message 57" +2.0.1.58 timeout x comment "text message 58" +2.0.1.59 timeout x comment "text message 59" +2.0.1.6 timeout x comment "text message 6" +2.0.1.60 timeout x comment "text message 60" +2.0.1.61 timeout x comment "text message 61" +2.0.1.62 timeout x comment "text message 62" +2.0.1.63 timeout x comment "text message 63" +2.0.1.64 timeout x comment "text message 64" +2.0.1.65 timeout x comment "text message 65" +2.0.1.66 timeout x comment "text message 66" +2.0.1.67 timeout x comment "text message 67" +2.0.1.68 timeout x comment "text message 68" +2.0.1.69 timeout x comment "text message 69" +2.0.1.7 timeout x comment "text message 7" +2.0.1.70 timeout x comment "text message 70" +2.0.1.71 timeout x comment "text message 71" +2.0.1.72 timeout x comment "text message 72" +2.0.1.73 timeout x comment "text message 73" +2.0.1.74 timeout x comment "text message 74" +2.0.1.75 timeout x comment "text message 75" +2.0.1.76 timeout x comment "text message 76" +2.0.1.77 timeout x comment "text message 77" +2.0.1.78 timeout x comment "text message 78" +2.0.1.79 timeout x comment "text message 79" +2.0.1.8 timeout x comment "text message 8" +2.0.1.80 timeout x comment "text message 80" +2.0.1.81 timeout x comment "text message 81" +2.0.1.82 timeout x comment "text message 82" +2.0.1.83 timeout x comment "text message 83" +2.0.1.84 timeout x comment "text message 84" +2.0.1.85 timeout x comment "text message 85" +2.0.1.86 timeout x comment "text message 86" +2.0.1.87 timeout x comment "text message 87" +2.0.1.88 timeout x comment "text message 88" +2.0.1.89 timeout x comment "text message 89" +2.0.1.9 timeout x comment "text message 9" +2.0.1.90 timeout x comment "text message 90" +2.0.1.91 timeout x comment "text message 91" +2.0.1.92 timeout x comment "text message 92" +2.0.1.93 timeout x comment "text message 93" +2.0.1.94 timeout x comment "text message 94" +2.0.1.95 timeout x comment "text message 95" +2.0.1.96 timeout x comment "text message 96" +2.0.1.97 timeout x comment "text message 97" +2.0.1.98 timeout x comment "text message 98" +2.0.1.99 timeout x comment "text message 99" diff --git a/tests/comment.t.list22 b/tests/comment.t.list22 new file mode 100644 index 0000000..9215b0d --- /dev/null +++ b/tests/comment.t.list22 @@ -0,0 +1,263 @@ +Name: test +Type: hash:ip +Header: family inet hashsize 1024 maxelem 65536 timeout x comment +Size in memory: 57634 +References: 0 +Number of entries: 256 +Members: +2.0.1.0 timeout x comment "text message 0" +2.0.1.1 timeout x comment "text message 1" +2.0.1.10 timeout x comment "text message 10" +2.0.1.100 timeout x comment "text message 100" +2.0.1.101 timeout x comment "text message 101" +2.0.1.102 timeout x comment "text message 102" +2.0.1.103 timeout x comment "text message 103" +2.0.1.104 timeout x comment "text message 104" +2.0.1.105 timeout x comment "text message 105" +2.0.1.106 timeout x comment "text message 106" +2.0.1.107 timeout x comment "text message 107" +2.0.1.108 timeout x comment "text message 108" +2.0.1.109 timeout x comment "text message 109" +2.0.1.11 timeout x comment "text message 11" +2.0.1.110 timeout x comment "text message 110" +2.0.1.111 timeout x comment "text message 111" +2.0.1.112 timeout x comment "text message 112" +2.0.1.113 timeout x comment "text message 113" +2.0.1.114 timeout x comment "text message 114" +2.0.1.115 timeout x comment "text message 115" +2.0.1.116 timeout x comment "text message 116" +2.0.1.117 timeout x comment "text message 117" +2.0.1.118 timeout x comment "text message 118" +2.0.1.119 timeout x comment "text message 119" +2.0.1.12 timeout x comment "text message 12" +2.0.1.120 timeout x comment "text message 120" +2.0.1.121 timeout x comment "text message 121" +2.0.1.122 timeout x comment "text message 122" +2.0.1.123 timeout x comment "text message 123" +2.0.1.124 timeout x comment "text message 124" +2.0.1.125 timeout x comment "text message 125" +2.0.1.126 timeout x comment "text message 126" +2.0.1.127 timeout x comment "text message 127" +2.0.1.128 timeout x comment "text message 128" +2.0.1.129 timeout x comment "text message 129" +2.0.1.13 timeout x comment "text message 13" +2.0.1.130 timeout x comment "text message 130" +2.0.1.131 timeout x comment "text message 131" +2.0.1.132 timeout x comment "text message 132" +2.0.1.133 timeout x comment "text message 133" +2.0.1.134 timeout x comment "text message 134" +2.0.1.135 timeout x comment "text message 135" +2.0.1.136 timeout x comment "text message 136" +2.0.1.137 timeout x comment "text message 137" +2.0.1.138 timeout x comment "text message 138" +2.0.1.139 timeout x comment "text message 139" +2.0.1.14 timeout x comment "text message 14" +2.0.1.140 timeout x comment "text message 140" +2.0.1.141 timeout x comment "text message 141" +2.0.1.142 timeout x comment "text message 142" +2.0.1.143 timeout x comment "text message 143" +2.0.1.144 timeout x comment "text message 144" +2.0.1.145 timeout x comment "text message 145" +2.0.1.146 timeout x comment "text message 146" +2.0.1.147 timeout x comment "text message 147" +2.0.1.148 timeout x comment "text message 148" +2.0.1.149 timeout x comment "text message 149" +2.0.1.15 timeout x comment "text message 15" +2.0.1.150 timeout x comment "text message 150" +2.0.1.151 timeout x comment "text message 151" +2.0.1.152 timeout x comment "text message 152" +2.0.1.153 timeout x comment "text message 153" +2.0.1.154 timeout x comment "text message 154" +2.0.1.155 timeout x comment "text message 155" +2.0.1.156 timeout x comment "text message 156" +2.0.1.157 timeout x comment "text message 157" +2.0.1.158 timeout x comment "text message 158" +2.0.1.159 timeout x comment "text message 159" +2.0.1.16 timeout x comment "text message 16" +2.0.1.160 timeout x comment "text message 160" +2.0.1.161 timeout x comment "text message 161" +2.0.1.162 timeout x comment "text message 162" +2.0.1.163 timeout x comment "text message 163" +2.0.1.164 timeout x comment "text message 164" +2.0.1.165 timeout x comment "text message 165" +2.0.1.166 timeout x comment "text message 166" +2.0.1.167 timeout x comment "text message 167" +2.0.1.168 timeout x comment "text message 168" +2.0.1.169 timeout x comment "text message 169" +2.0.1.17 timeout x comment "text message 17" +2.0.1.170 timeout x comment "text message 170" +2.0.1.171 timeout x comment "text message 171" +2.0.1.172 timeout x comment "text message 172" +2.0.1.173 timeout x comment "text message 173" +2.0.1.174 timeout x comment "text message 174" +2.0.1.175 timeout x comment "text message 175" +2.0.1.176 timeout x comment "text message 176" +2.0.1.177 timeout x comment "text message 177" +2.0.1.178 timeout x comment "text message 178" +2.0.1.179 timeout x comment "text message 179" +2.0.1.18 timeout x comment "text message 18" +2.0.1.180 timeout x comment "text message 180" +2.0.1.181 timeout x comment "text message 181" +2.0.1.182 timeout x comment "text message 182" +2.0.1.183 timeout x comment "text message 183" +2.0.1.184 timeout x comment "text message 184" +2.0.1.185 timeout x comment "text message 185" +2.0.1.186 timeout x comment "text message 186" +2.0.1.187 timeout x comment "text message 187" +2.0.1.188 timeout x comment "text message 188" +2.0.1.189 timeout x comment "text message 189" +2.0.1.19 timeout x comment "text message 19" +2.0.1.190 timeout x comment "text message 190" +2.0.1.191 timeout x comment "text message 191" +2.0.1.192 timeout x comment "text message 192" +2.0.1.193 timeout x comment "text message 193" +2.0.1.194 timeout x comment "text message 194" +2.0.1.195 timeout x comment "text message 195" +2.0.1.196 timeout x comment "text message 196" +2.0.1.197 timeout x comment "text message 197" +2.0.1.198 timeout x comment "text message 198" +2.0.1.199 timeout x comment "text message 199" +2.0.1.2 timeout x comment "text message 2" +2.0.1.20 timeout x comment "text message 20" +2.0.1.200 timeout x comment "text message 200" +2.0.1.201 timeout x comment "text message 201" +2.0.1.202 timeout x comment "text message 202" +2.0.1.203 timeout x comment "text message 203" +2.0.1.204 timeout x comment "text message 204" +2.0.1.205 timeout x comment "text message 205" +2.0.1.206 timeout x comment "text message 206" +2.0.1.207 timeout x comment "text message 207" +2.0.1.208 timeout x comment "text message 208" +2.0.1.209 timeout x comment "text message 209" +2.0.1.21 timeout x comment "text message 21" +2.0.1.210 timeout x comment "text message 210" +2.0.1.211 timeout x comment "text message 211" +2.0.1.212 timeout x comment "text message 212" +2.0.1.213 timeout x comment "text message 213" +2.0.1.214 timeout x comment "text message 214" +2.0.1.215 timeout x comment "text message 215" +2.0.1.216 timeout x comment "text message 216" +2.0.1.217 timeout x comment "text message 217" +2.0.1.218 timeout x comment "text message 218" +2.0.1.219 timeout x comment "text message 219" +2.0.1.22 timeout x comment "text message 22" +2.0.1.220 timeout x comment "text message 220" +2.0.1.221 timeout x comment "text message 221" +2.0.1.222 timeout x comment "text message 222" +2.0.1.223 timeout x comment "text message 223" +2.0.1.224 timeout x comment "text message 224" +2.0.1.225 timeout x comment "text message 225" +2.0.1.226 timeout x comment "text message 226" +2.0.1.227 timeout x comment "text message 227" +2.0.1.228 timeout x comment "text message 228" +2.0.1.229 timeout x comment "text message 229" +2.0.1.23 timeout x comment "text message 23" +2.0.1.230 timeout x comment "text message 230" +2.0.1.231 timeout x comment "text message 231" +2.0.1.232 timeout x comment "text message 232" +2.0.1.233 timeout x comment "text message 233" +2.0.1.234 timeout x comment "text message 234" +2.0.1.235 timeout x comment "text message 235" +2.0.1.236 timeout x comment "text message 236" +2.0.1.237 timeout x comment "text message 237" +2.0.1.238 timeout x comment "text message 238" +2.0.1.239 timeout x comment "text message 239" +2.0.1.24 timeout x comment "text message 24" +2.0.1.240 timeout x comment "text message 240" +2.0.1.241 timeout x comment "text message 241" +2.0.1.242 timeout x comment "text message 242" +2.0.1.243 timeout x comment "text message 243" +2.0.1.244 timeout x comment "text message 244" +2.0.1.245 timeout x comment "text message 245" +2.0.1.246 timeout x comment "text message 246" +2.0.1.247 timeout x comment "text message 247" +2.0.1.248 timeout x comment "text message 248" +2.0.1.249 timeout x comment "text message 249" +2.0.1.25 timeout x comment "text message 25" +2.0.1.250 timeout x comment "text message 250" +2.0.1.251 timeout x comment "text message 251" +2.0.1.252 timeout x comment "text message 252" +2.0.1.253 timeout x comment "text message 253" +2.0.1.254 timeout x comment "text message 254" +2.0.1.255 timeout x comment "text message 255" +2.0.1.26 timeout x comment "text message 26" +2.0.1.27 timeout x comment "text message 27" +2.0.1.28 timeout x comment "text message 28" +2.0.1.29 timeout x comment "text message 29" +2.0.1.3 timeout x comment "text message 3" +2.0.1.30 timeout x comment "text message 30" +2.0.1.31 timeout x comment "text message 31" +2.0.1.32 timeout x comment "text message 32" +2.0.1.33 timeout x comment "text message 33" +2.0.1.34 timeout x comment "text message 34" +2.0.1.35 timeout x comment "text message 35" +2.0.1.36 timeout x comment "text message 36" +2.0.1.37 timeout x comment "text message 37" +2.0.1.38 timeout x comment "text message 38" +2.0.1.39 timeout x comment "text message 39" +2.0.1.4 timeout x comment "text message 4" +2.0.1.40 timeout x comment "text message 40" +2.0.1.41 timeout x comment "text message 41" +2.0.1.42 timeout x comment "text message 42" +2.0.1.43 timeout x comment "text message 43" +2.0.1.44 timeout x comment "text message 44" +2.0.1.45 timeout x comment "text message 45" +2.0.1.46 timeout x comment "text message 46" +2.0.1.47 timeout x comment "text message 47" +2.0.1.48 timeout x comment "text message 48" +2.0.1.49 timeout x comment "text message 49" +2.0.1.5 timeout x comment "text message 5" +2.0.1.50 timeout x comment "text message 50" +2.0.1.51 timeout x comment "text message 51" +2.0.1.52 timeout x comment "text message 52" +2.0.1.53 timeout x comment "text message 53" +2.0.1.54 timeout x comment "text message 54" +2.0.1.55 timeout x comment "text message 55" +2.0.1.56 timeout x comment "text message 56" +2.0.1.57 timeout x comment "text message 57" +2.0.1.58 timeout x comment "text message 58" +2.0.1.59 timeout x comment "text message 59" +2.0.1.6 timeout x comment "text message 6" +2.0.1.60 timeout x comment "text message 60" +2.0.1.61 timeout x comment "text message 61" +2.0.1.62 timeout x comment "text message 62" +2.0.1.63 timeout x comment "text message 63" +2.0.1.64 timeout x comment "text message 64" +2.0.1.65 timeout x comment "text message 65" +2.0.1.66 timeout x comment "text message 66" +2.0.1.67 timeout x comment "text message 67" +2.0.1.68 timeout x comment "text message 68" +2.0.1.69 timeout x comment "text message 69" +2.0.1.7 timeout x comment "text message 7" +2.0.1.70 timeout x comment "text message 70" +2.0.1.71 timeout x comment "text message 71" +2.0.1.72 timeout x comment "text message 72" +2.0.1.73 timeout x comment "text message 73" +2.0.1.74 timeout x comment "text message 74" +2.0.1.75 timeout x comment "text message 75" +2.0.1.76 timeout x comment "text message 76" +2.0.1.77 timeout x comment "text message 77" +2.0.1.78 timeout x comment "text message 78" +2.0.1.79 timeout x comment "text message 79" +2.0.1.8 timeout x comment "text message 8" +2.0.1.80 timeout x comment "text message 80" +2.0.1.81 timeout x comment "text message 81" +2.0.1.82 timeout x comment "text message 82" +2.0.1.83 timeout x comment "text message 83" +2.0.1.84 timeout x comment "text message 84" +2.0.1.85 timeout x comment "text message 85" +2.0.1.86 timeout x comment "text message 86" +2.0.1.87 timeout x comment "text message 87" +2.0.1.88 timeout x comment "text message 88" +2.0.1.89 timeout x comment "text message 89" +2.0.1.9 timeout x comment "text message 9" +2.0.1.90 timeout x comment "text message 90" +2.0.1.91 timeout x comment "text message 91" +2.0.1.92 timeout x comment "text message 92" +2.0.1.93 timeout x comment "text message 93" +2.0.1.94 timeout x comment "text message 94" +2.0.1.95 timeout x comment "text message 95" +2.0.1.96 timeout x comment "text message 96" +2.0.1.97 timeout x comment "text message 97" +2.0.1.98 timeout x comment "text message 98" +2.0.1.99 timeout x comment "text message 99" diff --git a/tests/comment.t.list3 b/tests/comment.t.list3 new file mode 100644 index 0000000..673678a --- /dev/null +++ b/tests/comment.t.list3 @@ -0,0 +1,34 @@ +Name: a +Type: hash:ip +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 152 +References: 1 +Number of entries: 0 +Members: + +Name: b +Type: hash:ip +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 152 +References: 1 +Number of entries: 0 +Members: + +Name: c +Type: hash:ip +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 152 +References: 1 +Number of entries: 0 +Members: + +Name: test +Type: list:set +Header: size 8 comment +Size in memory: 288 +References: 0 +Number of entries: 3 +Members: +a comment "a set comment" +b comment "b set comment" +c comment "c set comment" diff --git a/tests/hash:ip,mark.t b/tests/hash:ip,mark.t new file mode 100644 index 0000000..9c51201 --- /dev/null +++ b/tests/hash:ip,mark.t @@ -0,0 +1,135 @@ +# Create a set with timeout +0 ipset create test hash:ip,mark timeout 4 +# Add partly zero valued element +0 ipset add test 2.0.0.1,0x0 +# Test partly zero valued element +0 ipset test test 2.0.0.1,0x0 +# Delete partly zero valued element +0 ipset del test 2.0.0.1,0x0 +# Add first random value +0 ipset add test 2.0.0.1,0x5 +# Add second random value +0 ipset add test 2.1.0.0,0x80 +# Test first random value +0 ipset test test 2.0.0.1,0x5 +# Test second random value +0 ipset test test 2.1.0.0,0x80 +# Test value not added to the set +1 ipset test test 2.0.0.1,0x4 +# Delete value not added to the set +1 ipset del test 2.0.0.1,0x6 +# Test value before first random value +1 ipset test test 2.0.0.0,0x5 +# Test value after second random value +1 ipset test test 2.1.0.1,0x80 +# Try to add value before first random value +0 ipset add test 2.0.0.0,0x5 +# Try to add value after second random value +0 ipset add test 2.1.0.1,0x80 +# List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip,mark.t.list0 +# Sleep 5s so that elements can time out +0 sleep 5 +# List set +0 ipset list test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip,mark.t.list1 +# Flush test set +0 ipset flush test +# Add multiple elements in one step +0 ipset add test 1.1.1.1-1.1.1.18,0x50 +# Delete multiple elements in one step +0 ipset del test 1.1.1.2-1.1.1.3,0x50 +# Check number of elements after multi-add/multi-del +0 n=`ipset save test|wc -l` && test $n -eq 17 +# Delete test set +0 ipset destroy test +# Create set to add a range +0 ipset new test hash:ip,mark hashsize 64 +# Add a range which forces a resizing +0 ipset add test 10.0.0.0-10.0.3.255,0x50 +# Check that correct number of elements are added +0 n=`ipset list test|grep '^10.0'|wc -l` && test $n -eq 1024 +# Flush set +0 ipset flush test +# Add an single element +0 ipset add test 10.0.0.1,0x50 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 2 +# Delete the single element +0 ipset del test 10.0.0.1,0x50 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Add an IP range +0 ipset add test 10.0.0.1-10.0.0.10,0x50 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 11 +# Delete the IP range +0 ipset del test 10.0.0.1-10.0.0.10,80 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Destroy set +0 ipset -X test +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -4 ipmark +# Counters: create set +0 ipset n test hash:ip,mark counters +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.1,0x50 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2.0.0.1,0x50 +# Counters: check counters +0 ./check_counters test 2.0.0.1 5 3456 +# Counters: delete element +0 ipset d test 2.0.0.1,0x50 +# Counters: test deleted element +1 ipset t test 2.0.0.1,0x50 +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.20,0x1c5 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2.0.0.20 12 9876 +# Counters: update counters +0 ipset -! a test 2.0.0.20,0x1c5 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2.0.0.20 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:ip,mark counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.1,0x50 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2.0.0.1,0x50 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.1 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2.0.0.1,0x50 +# Counters and timeout: test deleted element +1 ipset t test 2.0.0.1,0x50 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.20,0x1c5 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.20 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2.0.0.20,0x1c5 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.20 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2.0.0.20,0x1c5 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.20 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# Create a set with 0x0000FFDE markmask +0 ipset create test hash:ip,mark markmask 0x0000FFDE +# Add first value with 0x0521F322 mark +0 ipset add test 19.16.1.254,0x0521F322 +# Test last entry mark was modified to 0x0000F302 +0 ipset test test 19.16.1.254,0x0000F302 +# Test that mask is applied for tests as well +0 ipset test test 19.16.1.254,0x0521F322 +# Destroy set +0 ipset x test +# eof diff --git a/tests/hash:ip,mark.t.list0 b/tests/hash:ip,mark.t.list0 new file mode 100644 index 0000000..3866bf5 --- /dev/null +++ b/tests/hash:ip,mark.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:ip,mark +Header: family inet markmask 0xffffffff hashsize 1024 maxelem 65536 timeout x +Size in memory: 640 +References: 0 +Number of entries: 4 +Members: +2.0.0.0,0x00000005 timeout x +2.0.0.1,0x00000005 timeout x +2.1.0.0,0x00000080 timeout x +2.1.0.1,0x00000080 timeout x diff --git a/tests/hash:ip,mark.t.list1 b/tests/hash:ip,mark.t.list1 new file mode 100644 index 0000000..c959e4c --- /dev/null +++ b/tests/hash:ip,mark.t.list1 @@ -0,0 +1,7 @@ +Name: test +Type: hash:ip,mark +Header: family inet markmask 0xffffffff hashsize 1024 maxelem 65536 timeout 4 +Size in memory: 536 +References: 0 +Number of entries: 0 +Members: diff --git a/tests/hash:ip,port,ip.t b/tests/hash:ip,port,ip.t new file mode 100644 index 0000000..8a6954e --- /dev/null +++ b/tests/hash:ip,port,ip.t @@ -0,0 +1,151 @@ +# Create a set with timeout +0 ipset create test hash:ip,port,ip timeout 4 +# Add partly zero valued element +0 ipset add test 2.0.0.1,0,0.0.0.0 +# Test partly zero valued element +0 ipset test test 2.0.0.1,0,0.0.0.0 +# Delete party zero valued element +0 ipset del test 2.0.0.1,0,0.0.0.0 +# Add almost zero valued element +0 ipset add test 2.0.0.1,0,0.0.0.1 +# Test almost zero valued element +0 ipset test test 2.0.0.1,0,0.0.0.1 +# Delete almost zero valued element +0 ipset del test 2.0.0.1,0,0.0.0.1 +# Add first random value +0 ipset add test 2.0.0.1,5,1.1.1.1 +# Add second random value +0 ipset add test 2.1.0.0,128,2.2.2.2 +# Test first random value +0 ipset test test 2.0.0.1,5,1.1.1.1 +# Test second random value +0 ipset test test 2.1.0.0,128,2.2.2.2 +# Test value not added to the set +1 ipset test test 2.0.0.1,5,1.1.1.2 +# Test value not added to the set +1 ipset test test 2.0.0.1,6,1.1.1.1 +# Test value not added to the set +1 ipset test test 2.0.0.2,6,1.1.1.1 +# Test value before first random value +1 ipset test test 2.0.0.0,5,1.1.1.1 +# Test value after second random value +1 ipset test test 2.1.0.1,128,2.2.2.2 +# Try to add value before first random value +0 ipset add test 2.0.0.0,5,1.1.1.1 +# Try to add value after second random value +0 ipset add test 2.1.0.1,128,2.2.2.2 +# List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip,port,ip.t.list0 +# Sleep 5s so that elements can time out +0 sleep 5 +# List set +0 ipset list test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip,port,ip.t.list1 +# Flush test set +0 ipset flush test +# Add multiple elements in one step +0 ipset add test 1.1.1.1-1.1.1.4,80-84,2.2.2.2 +# Delete multiple elements in one step +0 ipset del test 1.1.1.2-1.1.1.3,tcp:81-82,2.2.2.2 +# Check number of elements after multi-add/multi-del +0 n=`ipset save test|wc -l` && test $n -eq 17 +# Delete test set +0 ipset destroy test +# Create set to add a range +0 ipset new test hash:ip,port,ip hashsize 64 +# Add a range which forces a resizing +0 ipset add test 10.0.0.0-10.0.3.255,tcp:80-82,192.168.0.1 +# Check that correct number of elements are added +0 n=`ipset list test|grep '^10.0'|wc -l` && test $n -eq 3072 +# Destroy set +0 ipset -X test +# Create set +0 ipset create test hash:ip,port,ip +# Add a single element +0 ipset add test 10.0.0.1,tcp:80,2.2.2.1 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 2 +# Delete the single element +0 ipset del test 10.0.0.1,tcp:80,2.2.2.1 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Add an IP range +0 ipset add test 10.0.0.1-10.0.0.10,tcp:80,2.2.2.1 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 11 +# Delete the IP range +0 ipset del test 10.0.0.1-10.0.0.10,tcp:80,2.2.2.1 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Add a port range +0 ipset add test 10.0.0.1,tcp:80-89,2.2.2.1 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 11 +# Delete the port range +0 ipset del test 10.0.0.1,tcp:80-89,2.2.2.1 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Add an IP and port range +0 ipset add test 10.0.0.1-10.0.0.10,tcp:80-89,2.2.2.1 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 101 +# Delete the IP and port range +0 ipset del test 10.0.0.1-10.0.0.10,tcp:80-89,2.2.2.1 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Destroy set +0 ipset -X test +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -4 ipportip +# Counters: create set +0 ipset n test hash:ip,port,ip counters +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.1,80,192.168.199.200 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2.0.0.1,80,192.168.199.200 +# Counters: check counters +0 ./check_counters test 2.0.0.1 5 3456 +# Counters: delete element +0 ipset d test 2.0.0.1,80,192.168.199.200 +# Counters: test deleted element +1 ipset t test 2.0.0.1,80,192.168.199.200 +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.20,453,10.0.0.1 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2.0.0.20 12 9876 +# Counters: update counters +0 ipset -! a test 2.0.0.20,453,10.0.0.1 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2.0.0.20 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:ip,port,ip counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.1,80,192.168.199.200 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2.0.0.1,80,192.168.199.200 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.1 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2.0.0.1,80,192.168.199.200 +# Counters and timeout: test deleted element +1 ipset t test 2.0.0.1,80,192.168.199.200 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.20,453,10.0.0.1 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.20 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2.0.0.20,453,10.0.0.1 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.20 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2.0.0.20,453,10.0.0.1 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.20 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/hash:ip,port,ip.t.list0 b/tests/hash:ip,port,ip.t.list0 new file mode 100644 index 0000000..57adef1 --- /dev/null +++ b/tests/hash:ip,port,ip.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:ip,port,ip +Header: family inet hashsize 1024 maxelem 65536 timeout x +Size in memory: 840 +References: 0 +Number of entries: 4 +Members: +2.0.0.0,tcp:5,1.1.1.1 timeout x +2.0.0.1,tcp:5,1.1.1.1 timeout x +2.1.0.0,tcp:128,2.2.2.2 timeout x +2.1.0.1,tcp:128,2.2.2.2 timeout x diff --git a/tests/hash:ip,port,ip.t.list1 b/tests/hash:ip,port,ip.t.list1 new file mode 100644 index 0000000..7c7d560 --- /dev/null +++ b/tests/hash:ip,port,ip.t.list1 @@ -0,0 +1,7 @@ +Name: test +Type: hash:ip,port,ip +Header: family inet hashsize 1024 maxelem 65536 timeout 4 +Size in memory: 664 +References: 0 +Number of entries: 0 +Members: diff --git a/tests/hash:ip,port,net.t b/tests/hash:ip,port,net.t new file mode 100644 index 0000000..487f563 --- /dev/null +++ b/tests/hash:ip,port,net.t @@ -0,0 +1,183 @@ +# Create a set with timeout +0 ipset create test hash:ip,port,net timeout 4 +# Add partly zero valued element +0 ipset add test 2.0.0.1,0,192.168.0.0/24 +# Test partly zero valued element +0 ipset test test 2.0.0.1,0,192.168.0.0/24 +# Delete partly zero valued element +0 ipset del test 2.0.0.1,0,192.168.0.0/24 +# Add first random value +0 ipset add test 2.0.0.1,5,192.168.0.0/24 +# Add second random value +0 ipset add test 2.1.0.0,128,10.0.0.0/16 +# Test first random value +0 ipset test test 2.0.0.1,5,192.168.0.0/24 +# Test second random value +0 ipset test test 2.1.0.0,128,10.0.0.0/16 +# Test value not added to the set +1 ipset test test 2.0.0.1,4,10.0.0.0/16 +# Delete value not added to the set +1 ipset del test 2.0.0.1,6,10.0.0.0/16 +# Test value before first random value +1 ipset test test 2.0.0.0,5,192.168.0.0/24 +# Test value after second random value +1 ipset test test 2.1.0.1,128,10.0.0.0/16 +# Try to add value before first random value +0 ipset add test 2.0.0.0,5,192.168.0.0/25 +# Try to add value after second random value +0 ipset add test 2.1.0.1,128,10.0.0.0/17 +# List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip,port,net.t.list0 +# Sleep 5s so that elements can time out +0 sleep 5 +# List set +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Flush test set +0 ipset flush test +# Delete set +0 ipset destroy test +# Create set to add a range +0 ipset new test hash:ip,port,net hashsize 64 +# Add a range which forces a resizing +0 ipset add test 10.0.0.0-10.0.3.255,tcp:80-82,192.168.0.1/24 +# Check that correct number of elements are added +0 n=`ipset list test|grep '^10.0'|wc -l` && test $n -eq 3072 +# Destroy set +0 ipset -X test +# Create set to add a range and with range notation in the network +0 ipset new test hash:ip,port,net hashsize 64 +# Add a range which forces a resizing +0 ipset add test 10.0.0.0-10.0.3.255,tcp:80-82,192.168.0.0-192.168.2.255 +# Check that correct number of elements are added +0 n=`ipset list test|grep '^10.0'|wc -l` && test $n -eq 6144 +# Destroy set +0 ipset -X test +# Create test set with timeout support +0 ipset create test hash:ip,port,net timeout 30 +# Add a non-matching IP address entry +0 ipset -A test 2.2.2.2,80,1.1.1.1 nomatch +# Add an overlapping matching small net +0 ipset -A test 2.2.2.2,80,1.1.1.0/30 +# Add an overlapping non-matching larger net +0 ipset -A test 2.2.2.2,80,1.1.1.0/28 nomatch +# Add an even larger matching net +0 ipset -A test 2.2.2.2,80,1.1.1.0/26 +# Check non-matching IP +1 ipset -T test 2.2.2.2,80,1.1.1.1 +# Check matching IP from non-matchin small net +0 ipset -T test 2.2.2.2,80,1.1.1.3 +# Check non-matching IP from larger net +1 ipset -T test 2.2.2.2,80,1.1.1.4 +# Check matching IP from even larger net +0 ipset -T test 2.2.2.2,80,1.1.1.16 +# Update non-matching IP to matching one +0 ipset -! -A test 2.2.2.2,80,1.1.1.1 +# Delete overlapping small net +0 ipset -D test 2.2.2.2,80,1.1.1.0/30 +# Check matching IP +0 ipset -T test 2.2.2.2,80,1.1.1.1 +# Add overlapping small net +0 ipset -A test 2.2.2.2,80,1.1.1.0/30 +# Update matching IP as a non-matching one, with shorter timeout +0 ipset -! -A test 2.2.2.2,80,1.1.1.1 nomatch timeout 2 +# Check non-matching IP +1 ipset -T test 2.2.2.2,80,1.1.1.1 +# Sleep 3s so that element can time out +0 sleep 3 +# Check non-matching IP +0 ipset -T test 2.2.2.2,80,1.1.1.1 +# Check matching IP +0 ipset -T test 2.2.2.2,80,1.1.1.3 +# Delete test set +0 ipset destroy test +# Create set +0 ipset create test hash:ip,port,net +# Add a single element +0 ipset add test 10.0.0.1,tcp:80,2.2.2.0/24 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 2 +# Delete the single element +0 ipset del test 10.0.0.1,tcp:80,2.2.2.0/24 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Add an IP range +0 ipset add test 10.0.0.1-10.0.0.10,tcp:80,2.2.2.0/24 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 11 +# Delete the IP range +0 ipset del test 10.0.0.1-10.0.0.10,tcp:80,2.2.2.0/24 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Add a port range +0 ipset add test 10.0.0.1,tcp:80-89,2.2.2.0/24 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 11 +# Delete the port range +0 ipset del test 10.0.0.1,tcp:80-89,2.2.2.0/24 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Add an IP and port range +0 ipset add test 10.0.0.1-10.0.0.10,tcp:80-89,2.2.2.0/24 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 101 +# Delete the IP and port range +0 ipset del test 10.0.0.1-10.0.0.10,tcp:80-89,2.2.2.0/24 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Destroy set +0 ipset -X test +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -4 ipportnet +# Nomatch: Check that resizing keeps the nomatch flag +0 ./resizen.sh -4 ipportnet +# Counters: create set +0 ipset n test hash:ip,port,net counters +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.1,80,192.168.199.200 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2.0.0.1,80,192.168.199.200 +# Counters: check counters +0 ./check_counters test 2.0.0.1 5 3456 +# Counters: delete element +0 ipset d test 2.0.0.1,80,192.168.199.200 +# Counters: test deleted element +1 ipset t test 2.0.0.1,80,192.168.199.200 +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.20,453,10.0.0.1 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2.0.0.20 12 9876 +# Counters: update counters +0 ipset -! a test 2.0.0.20,453,10.0.0.1 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2.0.0.20 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:ip,port,net counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.1,80,192.168.199.200 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2.0.0.1,80,192.168.199.200 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.1 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2.0.0.1,80,192.168.199.200 +# Counters and timeout: test deleted element +1 ipset t test 2.0.0.1,80,192.168.199.200 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.20,453,10.0.0.1 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.20 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2.0.0.20,453,10.0.0.1 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.20 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2.0.0.20,453,10.0.0.1 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.20 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/hash:ip,port,net.t.list0 b/tests/hash:ip,port,net.t.list0 new file mode 100644 index 0000000..44c53c5 --- /dev/null +++ b/tests/hash:ip,port,net.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:ip,port,net +Header: family inet hashsize 1024 maxelem 65536 timeout x +Size in memory: 1096 +References: 0 +Number of entries: 4 +Members: +2.0.0.0,tcp:5,192.168.0.0/25 timeout x +2.0.0.1,tcp:5,192.168.0.0/24 timeout x +2.1.0.0,tcp:128,10.0.0.0/16 timeout x +2.1.0.1,tcp:128,10.0.0.0/17 timeout x diff --git a/tests/hash:ip,port.t b/tests/hash:ip,port.t new file mode 100644 index 0000000..aba8fdc --- /dev/null +++ b/tests/hash:ip,port.t @@ -0,0 +1,173 @@ +# Create a set with timeout +0 ipset create test hash:ip,port timeout 4 +# Add partly zero valued element +0 ipset add test 2.0.0.1,0 +# Test partly zero valued element +0 ipset test test 2.0.0.1,0 +# Delete partly zero valued element +0 ipset del test 2.0.0.1,0 +# Add first random value +0 ipset add test 2.0.0.1,5 +# Add second random value +0 ipset add test 2.1.0.0,128 +# Test first random value +0 ipset test test 2.0.0.1,5 +# Test second random value +0 ipset test test 2.1.0.0,128 +# Test value not added to the set +1 ipset test test 2.0.0.1,4 +# Delete value not added to the set +1 ipset del test 2.0.0.1,6 +# Test value before first random value +1 ipset test test 2.0.0.0,5 +# Test value after second random value +1 ipset test test 2.1.0.1,128 +# Try to add value before first random value +0 ipset add test 2.0.0.0,5 +# Try to add value after second random value +0 ipset add test 2.1.0.1,128 +# Add port by name +0 ipset add test 2.1.0.3,smtp +# Delete port by number +0 ipset del test 2.1.0.3,25 +# List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip,port.t.list0 +# Sleep 5s so that elements can time out +0 sleep 5 +# List set +0 ipset list test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip,port.t.list1 +# Flush test set +0 ipset flush test +# Add multiple elements in one step +0 ipset add test 1.1.1.1-1.1.1.4,80-84 +# Delete multiple elements in one step +0 ipset del test 1.1.1.2-1.1.1.3,tcp:81-82 +# Check number of elements after multi-add/multi-del +0 n=`ipset save test|wc -l` && test $n -eq 17 +# Delete test set +0 ipset destroy test +# Create a set +0 ipset create test hash:ip,port +# Add element without specifying protocol +0 ipset add test 2.0.0.1,80 +# Add "same" element but with UDP protocol +0 ipset add test 2.0.0.1,udp:80 +# Test element without specifying protocol +0 ipset test test 2.0.0.1,80 +# Test element with TCP protocol +0 ipset test test 2.0.0.1,tcp:80 +# Test element with UDP protocol +0 ipset test test 2.0.0.1,udp:80 +# Add element with vrrp +0 ipset add test 2.0.0.1,vrrp:0 +# Test element with vrrp +0 ipset test test 2.0.0.1,vrrp:0 +# Add element with sctp +0 ipset add test 2.0.0.1,sctp:80 +# Test element with sctp +0 ipset test test 2.0.0.1,sctp:80 +# Delete element with sctp +0 ipset del test 2.0.0.1,sctp:80 +# List set +0 ipset list test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip,port.t.list2 +# Delete set +0 ipset destroy test +# Create set to add a range +0 ipset new test hash:ip,port hashsize 64 +# Add a range which forces a resizing +0 ipset add test 10.0.0.0-10.0.3.255,tcp:80-82 +# Check that correct number of elements are added +0 n=`ipset list test|grep '^10.0'|wc -l` && test $n -eq 3072 +# Flush set +0 ipset flush test +# Add an single element +0 ipset add test 10.0.0.1,tcp:80 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 2 +# Delete the single element +0 ipset del test 10.0.0.1,tcp:80 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Add an IP range +0 ipset add test 10.0.0.1-10.0.0.10,tcp:80 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 11 +# Delete the IP range +0 ipset del test 10.0.0.1-10.0.0.10,tcp:80 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Add a port range +0 ipset add test 10.0.0.1,tcp:80-89 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 11 +# Delete the port range +0 ipset del test 10.0.0.1,tcp:80-89 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Add an IP and port range +0 ipset add test 10.0.0.1-10.0.0.10,tcp:80-89 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 101 +# Delete the IP and port range +0 ipset del test 10.0.0.1-10.0.0.10,tcp:80-89 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Destroy set +0 ipset -X test +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -4 ipport +# Counters: create set +0 ipset n test hash:ip,port counters +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.1,80 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2.0.0.1,80 +# Counters: check counters +0 ./check_counters test 2.0.0.1 5 3456 +# Counters: delete element +0 ipset d test 2.0.0.1,80 +# Counters: test deleted element +1 ipset t test 2.0.0.1,80 +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.20,453 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2.0.0.20 12 9876 +# Counters: update counters +0 ipset -! a test 2.0.0.20,453 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2.0.0.20 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:ip,port counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.1,80 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2.0.0.1,80 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.1 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2.0.0.1,80 +# Counters and timeout: test deleted element +1 ipset t test 2.0.0.1,80 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.20,453 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.20 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2.0.0.20,453 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.20 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2.0.0.20,453 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.20 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/hash:ip,port.t.list0 b/tests/hash:ip,port.t.list0 new file mode 100644 index 0000000..49e3033 --- /dev/null +++ b/tests/hash:ip,port.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:ip,port +Header: family inet hashsize 1024 maxelem 65536 timeout x +Size in memory: 640 +References: 0 +Number of entries: 4 +Members: +2.0.0.0,tcp:5 timeout x +2.0.0.1,tcp:5 timeout x +2.1.0.0,tcp:128 timeout x +2.1.0.1,tcp:128 timeout x diff --git a/tests/hash:ip,port.t.list1 b/tests/hash:ip,port.t.list1 new file mode 100644 index 0000000..4b79124 --- /dev/null +++ b/tests/hash:ip,port.t.list1 @@ -0,0 +1,7 @@ +Name: test +Type: hash:ip,port +Header: family inet hashsize 1024 maxelem 65536 timeout 4 +Size in memory: 528 +References: 0 +Number of entries: 0 +Members: diff --git a/tests/hash:ip,port.t.list2 b/tests/hash:ip,port.t.list2 new file mode 100644 index 0000000..624d050 --- /dev/null +++ b/tests/hash:ip,port.t.list2 @@ -0,0 +1,10 @@ +Name: test +Type: hash:ip,port +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 320 +References: 0 +Number of entries: 3 +Members: +2.0.0.1,tcp:80 +2.0.0.1,udp:80 +2.0.0.1,vrrp:0 diff --git a/tests/hash:ip.t b/tests/hash:ip.t new file mode 100644 index 0000000..36b82f9 --- /dev/null +++ b/tests/hash:ip.t @@ -0,0 +1,213 @@ +# IP: Create a set with timeout +0 ipset -N test iphash --hashsize 128 timeout 4 +# Range: Add zero valued element +1 ipset -A test 0.0.0.0 +# Range: Test zero valued element +1 ipset -T test 0.0.0.0 +# IP: Add first random value +0 ipset -A test 2.0.0.1 timeout 4 +# IP: Add second random value +0 ipset -A test 192.168.68.69 timeout 0 +# IP: Test first random value +0 ipset -T test 2.0.0.1 +# IP: Test second random value +0 ipset -T test 192.168.68.69 +# IP: Test value not added to the set +1 ipset -T test 2.0.0.2 +# IP: Add third random value +0 ipset -A test 200.100.0.12 +# IP: Delete the same value +0 ipset -D test 200.100.0.12 +# IP: List set +0 ipset -L test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# IP: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip.t.list2 +# Sleep 5s so that element can time out +0 sleep 5 +# IP: List set +0 ipset -L test 2>/dev/null | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# IP: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip.t.list0 +# IP: Flush test set +0 ipset -F test +# IP: Add multiple elements in one step +0 ipset -A test 1.1.1.1-1.1.1.5 +# IP: Delete multiple elements in one step +0 ipset -D test 1.1.1.2-1.1.1.5 +# IP: Test element after deletion +0 ipset -T test 1.1.1.1 +# IP: Test deleted element +1 ipset -T test 1.1.1.2 +# IP: Delete test set +0 ipset -X test +# IP: Restore values so that rehashing is triggered +0 sed 's/hashsize 128/hashsize 128 timeout 4/' iphash.t.restore | ipset -R +# IP: Check that the values are restored +0 test `ipset -S test| grep add| wc -l` -eq 129 +# Sleep 5s so that elements can time out +0 sleep 5 +# IP: check that elements timed out +0 test `ipset -S test| grep add| wc -l` -eq 0 +# IP: Flush test set +0 ipset -F test +# IP: Stress test resizing +0 ./resize.sh +# IP: Check listing, which requires multiple messages +0 n=`ipset -S resize-test | wc -l` && test $n -eq 8161 +# IP: Swap test and resize-test sets +0 ipset -W test resize-test +# IP: Check listing, which requires multiple messages +0 n=`ipset -S test | wc -l` && test $n -eq 8161 +# IP: Flush sets +0 ipset -F +# IP: Run resize and listing parallel +0 ./resize-and-list.sh +# IP: Destroy sets +0 ipset -X +# IP: Create set to add a range +0 ipset new test hash:ip hashsize 64 +# IP: Add a range which forces a resizing +0 ipset add test 10.0.0.0-10.0.3.255 +# IP: Check that correct number of elements are added +0 n=`ipset list test|grep '^10.0'|wc -l` && test $n -eq 1024 +# IP: Destroy sets +0 ipset -X +# Network: Create a set with timeout +0 ipset -N test iphash --hashsize 128 --netmask 24 timeout 4 +# Network: Add zero valued element +1 ipset -A test 0.0.0.0 +# Network: Test zero valued element +1 ipset -T test 0.0.0.0 +# Network: Delete zero valued element +1 ipset -D test 0.0.0.0 +# Network: Add first random network +0 ipset -A test 2.0.0.1 +# Network: Add second random network +0 ipset -A test 192.168.68.69 +# Network: Test first random value +0 ipset -T test 2.0.0.255 +# Network: Test second random value +0 ipset -T test 192.168.68.95 +# Network: Test value not added to the set +1 ipset -T test 2.0.1.0 +# Network: Add third element +0 ipset -A test 200.100.10.1 timeout 0 +# Network: Add third random network +0 ipset -A test 200.100.0.12 +# Network: Delete the same network +0 ipset -D test 200.100.0.12 +# Network: List set +0 ipset -L test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Network: Check listing +0 diff -u -I 'Size in memory.*' -I 'Size in memory.*' .foo hash:ip.t.list3 +# Sleep 5s so that elements can time out +0 sleep 5 +# Network: List set +0 ipset -L test | grep -v Revision: > .foo +# Network: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip.t.list1 +# Network: Flush test set +0 ipset -F test +# Network: add element with 1s timeout +0 ipset add test 200.100.0.12 timeout 1 +# Network: readd element with 3s timeout +0 ipset add test 200.100.0.12 timeout 3 -exist +# Network: sleep 2s +0 sleep 2s +# Network: check readded element +0 ipset test test 200.100.0.12 +# Network: Delete test set +0 ipset -X test +# Range: Create set +0 ipset create test hash:ip +# Range: Add a single element +0 ipset add test 10.0.0.1 +# Range: Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 2 +# Range: Delete the element +0 ipset del test 10.0.0.1 +# Range: Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Range: Add a range +0 ipset add test 10.0.0.1-10.0.0.10 +# Range: Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 11 +# Range: Delete a range +0 ipset del test 10.0.0.1-10.0.0.10 +# Range: Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Range: Delete test set +0 ipset destroy test +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -4 ip +# Counters: create set +0 ipset n test hash:ip counters +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.1 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2.0.0.1 +# Counters: check counters +0 ./check_counters test 2.0.0.1 5 3456 +# Counters: delete element +0 ipset d test 2.0.0.1 +# Counters: test deleted element +1 ipset t test 2.0.0.1 +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.10 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2.0.0.10 12 9876 +# Counters: update counters +0 ipset -! a test 2.0.0.10 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2.0.0.10 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:ip counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.1 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2.0.0.1 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.1 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2.0.0.1 +# Counters and timeout: test deleted element +1 ipset t test 2.0.0.1 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.10 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.10 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2.0.0.10 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.10 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2.0.0.10 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.10 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# Counters: require sendip +skip which sendip +# Counters: create set +0 ipset n test hash:ip counters +# Counters: add elemet with zero counters +0 ipset a test 10.255.255.64 +# Counters: generate packets +0 ./check_sendip_packets -4 src 5 +# Counters: check counters +0 ./check_counters test 10.255.255.64 5 $((5*40)) +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:ip counters timeout 600 +# Counters and timeout: add elemet with zero counters +0 ipset a test 10.255.255.64 +# Counters and timeout: generate packets +0 ./check_sendip_packets -4 src 6 +# Counters and timeout: check counters +0 ./check_extensions test 10.255.255.64 600 6 $((6*40)) +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/hash:ip.t.list0 b/tests/hash:ip.t.list0 new file mode 100644 index 0000000..1859015 --- /dev/null +++ b/tests/hash:ip.t.list0 @@ -0,0 +1,8 @@ +Name: test +Type: hash:ip +Header: family inet hashsize 128 maxelem 65536 timeout 4 +Size in memory: 336 +References: 0 +Number of entries: 1 +Members: +192.168.68.69 timeout 0 diff --git a/tests/hash:ip.t.list1 b/tests/hash:ip.t.list1 new file mode 100644 index 0000000..0977324 --- /dev/null +++ b/tests/hash:ip.t.list1 @@ -0,0 +1,8 @@ +Name: test +Type: hash:ip +Header: family inet hashsize 128 maxelem 65536 netmask 24 timeout 4 +Size in memory: 432 +References: 0 +Number of entries: 1 +Members: +200.100.10.0 timeout 0 diff --git a/tests/hash:ip.t.list2 b/tests/hash:ip.t.list2 new file mode 100644 index 0000000..6cd2bf4 --- /dev/null +++ b/tests/hash:ip.t.list2 @@ -0,0 +1,9 @@ +Name: test +Type: hash:ip +Header: family inet hashsize 128 maxelem 65536 timeout x +Size in memory: 352 +References: 0 +Number of entries: 2 +Members: +192.168.68.69 timeout x +2.0.0.1 timeout x diff --git a/tests/hash:ip.t.list3 b/tests/hash:ip.t.list3 new file mode 100644 index 0000000..500abbc --- /dev/null +++ b/tests/hash:ip.t.list3 @@ -0,0 +1,10 @@ +Name: test +Type: hash:ip +Header: family inet hashsize 128 maxelem 65536 netmask 24 timeout x +Size in memory: 464 +References: 0 +Number of entries: 3 +Members: +192.168.68.0 timeout x +2.0.0.0 timeout x +200.100.10.0 timeout x diff --git a/tests/hash:ip6,mark.t b/tests/hash:ip6,mark.t new file mode 100644 index 0000000..8f50acf --- /dev/null +++ b/tests/hash:ip6,mark.t @@ -0,0 +1,237 @@ +# Create a set with timeout +0 ipset create test hash:ip,mark family inet6 timeout 4 +# Add partly zero valued element +0 ipset add test 2:0:0::1,0x0 +# Test partly zero valued element +0 ipset test test 2:0:0::1,0x0 +# Delete partly zero valued element +0 ipset del test 2:0:0::1,0x0 +# Add first random value +0 ipset add test 2:0:0::1,0x5 +# Add second random value +0 ipset add test 2:1:0::0,0x80 +# Test first random value +0 ipset test test 2:0:0::1,0x5 +# Test second random value +0 ipset test test 2:1:0::0,0x80 +# Test value not added to the set +1 ipset test test 2:0:0::1,0x4 +# Delete value not added to the set +1 ipset del test 2:0:0::1,0x6 +# Test value before first random value +1 ipset test test 2:0:0::0,0x5 +# Test value after second random value +1 ipset test test 2:1:0::1,0x80 +# Try to add value before first random value +0 ipset add test 2:0:0::0,0x5 +# Try to add value after second random value +0 ipset add test 2:1:0::1,0x80 +# List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip6,mark.t.list0 +# Sleep 5s so that elements can time out +0 sleep 5 +# List set +0 ipset list test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip6,mark.t.list1 +# Delete test set +0 ipset destroy test +# Create set to add a range +0 ipset new test hash:ip,mark -6 hashsize 64 +# Add a random value 1 +0 ipset add test 1::1,0xc3500 +# Add a random value 2 +0 ipset add test 1::1,0x87cda0 +# Add a random value 3 +0 ipset add test 1::3,0x87cda0 +# Add a random value 4 +0 ipset add test 1::4,0x87cda0 +# Add a random value 5 +0 ipset add test 1::5,0x87cda0 +# Add a random value 6 +0 ipset add test 1::6,0x87cda0 +# Add a random value 7 +0 ipset add test 1::7,0x87cda0 +# Add a random value 8 +0 ipset add test 1::8,0x87cda0 +# Add a random value 9 +0 ipset add test 1::9,0x87cda0 +# Add a random value 10 +0 ipset add test 1::101,0x87cda0 +# Add a random value 11 +0 ipset add test 1::11,0x87cda0 +# Add a random value 12 +0 ipset add test 1::12,0x87cda0 +# Add a random value 13 +0 ipset add test 1::13,0x87cda0 +# Add a random value 14 +0 ipset add test 1::14,0x87cda0 +# Add a random value 15 +0 ipset add test 1::15,0x87cda0 +# Add a random value 16 +0 ipset add test 1::16,0x87cda0 +# Add a random value 17 +0 ipset add test 1::17,0x87cda0 +# Add a random value 18 +0 ipset add test 1::18,0x87cda0 +# Add a random value 19 +0 ipset add test 1::19,0x87cda0 +# Add a random value 20 +0 ipset add test 1::20,0x87cda0 +# Add a random value 21 +0 ipset add test 1::21,0x87cda0 +# Add a random value 22 +0 ipset add test 1::22,0x87cda0 +# Add a random value 23 +0 ipset add test 1::23,0x87cda0 +# Add a random value 24 +0 ipset add test 1::24,0x87cda0 +# Add a random value 25 +0 ipset add test 1::25,0x87cda0 +# Add a random value 26 +0 ipset add test 1::26,0x87cda0 +# Add a random value 27 +0 ipset add test 1::27,0x87cda0 +# Add a random value 28 +0 ipset add test 1::28,0x87cda0 +# Add a random value 29 +0 ipset add test 1::29,0x87cda0 +# Add a random value 30 +0 ipset add test 1::301,0x87cda0 +# Add a random value 31 +0 ipset add test 1::31,0x87cda0 +# Add a random value 32 +0 ipset add test 1::32,0x87cda0 +# Add a random value 33 +0 ipset add test 1::33,0x87cda0 +# Add a random value 34 +0 ipset add test 1::34,0x87cda0 +# Add a random value 35 +0 ipset add test 1::35,0x87cda0 +# Add a random value 36 +0 ipset add test 1::36,0x87cda0 +# Add a random value 37 +0 ipset add test 1::37,0x87cda0 +# Add a random value 38 +0 ipset add test 1::38,0x87cda0 +# Add a random value 39 +0 ipset add test 1::39,0x87cda0 +# Add a random value 40 +0 ipset add test 1::401,0x87cda0 +# Add a random value 41 +0 ipset add test 1::41,0x87cda0 +# Add a random value 42 +0 ipset add test 1::42,0x87cda0 +# Add a random value 43 +0 ipset add test 1::43,0x87cda0 +# Add a random value 44 +0 ipset add test 1::44,0x87cda0 +# Add a random value 45 +0 ipset add test 1::45,0x87cda0 +# Add a random value 46 +0 ipset add test 1::46,0x87cda0 +# Add a random value 47 +0 ipset add test 1::47,0x87cda0 +# Add a random value 48 +0 ipset add test 1::48,0x87cda0 +# Add a random value 49 +0 ipset add test 1::49,0x87cda0 +# Add a random value 50 +0 ipset add test 1::501,0x87cda0 +# Add a random value 51 +0 ipset add test 1::51,0x87cda0 +# Add a random value 52 +0 ipset add test 1::52,0x87cda0 +# Add a random value 53 +0 ipset add test 1::53,0x87cda0 +# Add a random value 54 +0 ipset add test 1::54,0x87cda0 +# Add a random value 55 +0 ipset add test 1::55,0x87cda0 +# Add a random value 56 +0 ipset add test 1::56,0x87cda0 +# Add a random value 57 +0 ipset add test 1::57,0x87cda0 +# Add a random value 58 +0 ipset add test 1::58,0x87cda0 +# Add a random value 59 +0 ipset add test 1::59,0x87cda0 +# Add a random value 60 +0 ipset add test 1::601,0x87cda0 +# Add a random value 61 +0 ipset add test 1::61,0x87cda0 +# Add a random value 62 +0 ipset add test 1::62,0x87cda0 +# Add a random value 63 +0 ipset add test 1::63,0x87cda0 +# Add a random value 64 +0 ipset add test 1::64,0x87cda0 +# Add a random value 65, that forces a resizing +0 ipset add test 1::65,0x87cda0 +# Check that correct number of elements are added +0 n=`ipset list test|grep 1::|wc -l` && test $n -eq 65 +# Destroy set +0 ipset -X test +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -6 ipmark +# Counters: create set +0 ipset n test hash:ip,mark -6 counters +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::1,0x50 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2:0:0::1,0x50 +# Counters: check counters +0 ./check_counters test 2::1 5 3456 +# Counters: delete element +0 ipset d test 2:0:0::1,0x50 +# Counters: test deleted element +1 ipset t test 2:0:0::1,0x50 +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::20,0x1c5 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2::20 12 9876 +# Counters: update counters +0 ipset -! a test 2:0:0::20,0x1c5 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2::20 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:ip,mark -6 counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::1,0x50 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2:0:0::1,0x50 +# Counters and timeout: check counters +0 ./check_extensions test 2::1 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2:0:0::1,0x50 +# Counters and timeout: test deleted element +1 ipset t test 2:0:0::1,0x50 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::20,0x1c5 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2:0:0::20,0x1c5 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2:0:0::20,0x1c5 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# Create a set with 0x0000FFDE markmask +0 ipset create test hash:ip,mark family inet6 markmask 0x0000FFDE +# Add first value with 0x0521F322 mark +0 ipset add test 2:1::1,0x0521F322 +# Test last entry mark was modified to 0x0000F302 +0 ipset test test 2:1::1,0x0000F302 +# Test that mask is applied for tests as well +0 ipset test test 2:1::1,0x0521F322 +# Destroy set +0 ipset x test +# eof diff --git a/tests/hash:ip6,mark.t.list0 b/tests/hash:ip6,mark.t.list0 new file mode 100644 index 0000000..be7c069 --- /dev/null +++ b/tests/hash:ip6,mark.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:ip,mark +Header: family inet6 markmask 0xffffffff hashsize 1024 maxelem 65536 timeout x +Size in memory: 1088 +References: 0 +Number of entries: 4 +Members: +2:1::,0x00000080 timeout x +2:1::1,0x00000080 timeout x +2::,0x00000005 timeout x +2::1,0x00000005 timeout x diff --git a/tests/hash:ip6,mark.t.list1 b/tests/hash:ip6,mark.t.list1 new file mode 100644 index 0000000..5c7b730 --- /dev/null +++ b/tests/hash:ip6,mark.t.list1 @@ -0,0 +1,7 @@ +Name: test +Type: hash:ip,mark +Header: family inet6 markmask 0xffffffff hashsize 1024 maxelem 65536 timeout 4 +Size in memory: 800 +References: 0 +Number of entries: 0 +Members: diff --git a/tests/hash:ip6,port,ip6.t b/tests/hash:ip6,port,ip6.t new file mode 100644 index 0000000..e8a75f0 --- /dev/null +++ b/tests/hash:ip6,port,ip6.t @@ -0,0 +1,115 @@ +# Create a set with timeout +0 ipset create test hash:ip,port,ip family inet6 timeout 4 +# Add partly zero valued element +0 ipset add test 2:0:0::1,0,0:0:0::0 +# Test partly zero valued element +0 ipset test test 2:0:0::1,0,0:0:0::0 +# Delete party zero valued element +0 ipset del test 2:0:0::1,0,0:0:0::0 +# Add almost zero valued element +0 ipset add test 2:0:0::1,0,0:0:0::1 +# Test almost zero valued element +0 ipset test test 2:0:0::1,0,0:0:0::1 +# Delete almost zero valued element +0 ipset del test 2:0:0::1,0,0:0:0::1 +# Add first random value +0 ipset add test 2:0:0::1,5,1:1:1::1 +# Add second random value +0 ipset add test 2:1:0::0,128,2:2:2::2 +# Test first random value +0 ipset test test 2:0:0::1,5,1:1:1::1 +# Test second random value +0 ipset test test 2:1:0::0,128,2:2:2::2 +# Test value not added to the set +1 ipset test test 2:0:0::1,5,1:1:1::2 +# Test value not added to the set +1 ipset test test 2:0:0::1,6,1:1:1::1 +# Test value not added to the set +1 ipset test test 2:0:0::2,6,1:1:1::1 +# Test value before first random value +1 ipset test test 2:0:0::0,5,1:1:1::1 +# Test value after second random value +1 ipset test test 2:1:0::1,128,2:2:2::2 +# Try to add value before first random value +0 ipset add test 2:0:0::0,5,1:1:1::1 +# Try to add value after second random value +0 ipset add test 2:1:0::1,128,2:2:2::2 +# List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip6,port,ip6.t.list0 +# Sleep 5s so that elements can time out +0 sleep 5 +# List set +0 ipset list test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip6,port,ip6.t.list1 +# Flush test set +0 ipset flush test +# Add multiple elements in one step +0 ipset add test 1::1,udp:80-85,2::2 +# Delete multiple elements in one step +0 ipset del test 1::1,udp:81-85,2::2 +# Check elements after multiple add/del +0 ipset test test 1::1,udp:80,2::2 +# Delete test set +0 ipset destroy test +# Create set to add a range +0 ipset new test hash:ip,port,ip -6 hashsize 64 +# Add a range which forces a resizing +0 ipset add test 1::1,tcp:80-1105,2::2 +# Check that correct number of elements are added +0 n=`ipset list test|grep 1::1|wc -l` && test $n -eq 1026 +# Destroy set +0 ipset -X test +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -6 ipportip +# Counters: create set +0 ipset n test hash:ip,port,ip -6 counters +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::1,80,2002:24:ff::1 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2:0:0::1,80,2002:24:ff::1 +# Counters: check counters +0 ./check_counters test 2::1 5 3456 +# Counters: delete element +0 ipset d test 2:0:0::1,80,2002:24:ff::1 +# Counters: test deleted element +1 ipset t test 2:0:0::1,80,2002:24:ff::1 +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::20,453,2002:ff:24::ab packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2::20 12 9876 +# Counters: update counters +0 ipset -! a test 2:0:0::20,453,2002:ff:24::ab packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2::20 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:ip,port,ip -6 counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::1,80,2002:24:ff::1 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2:0:0::1,80,2002:24:ff::1 +# Counters and timeout: check counters +0 ./check_extensions test 2::1 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2:0:0::1,80,2002:24:ff::1 +# Counters and timeout: test deleted element +1 ipset t test 2:0:0::1,80,2002:24:ff::1 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::20,453,2002:ff:24::ab packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2:0:0::20,453,2002:ff:24::ab packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2:0:0::20,453,2002:ff:24::ab timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/hash:ip6,port,ip6.t.list0 b/tests/hash:ip6,port,ip6.t.list0 new file mode 100644 index 0000000..6fc6771 --- /dev/null +++ b/tests/hash:ip6,port,ip6.t.list0 @@ -0,0 +1,12 @@ +Name: test +Type: hash:ip,port,ip +Header: family inet6 hashsize 1024 maxelem 65536 timeout x +Size in memory: 1608 +References: 0 +Size in memory: 9104 +Number of entries: 4 +Members: +2:1::,tcp:128,2:2:2::2 timeout x +2:1::1,tcp:128,2:2:2::2 timeout x +2::,tcp:5,1:1:1::1 timeout x +2::1,tcp:5,1:1:1::1 timeout x diff --git a/tests/hash:ip6,port,ip6.t.list1 b/tests/hash:ip6,port,ip6.t.list1 new file mode 100644 index 0000000..d3b61b7 --- /dev/null +++ b/tests/hash:ip6,port,ip6.t.list1 @@ -0,0 +1,7 @@ +Name: test +Type: hash:ip,port,ip +Header: family inet6 hashsize 1024 maxelem 65536 timeout 4 +Size in memory: 1072 +References: 0 +Number of entries: 0 +Members: diff --git a/tests/hash:ip6,port,net6.t b/tests/hash:ip6,port,net6.t new file mode 100644 index 0000000..23a5da0 --- /dev/null +++ b/tests/hash:ip6,port,net6.t @@ -0,0 +1,143 @@ +# Range: Create a set +0 ipset -N test ipportnethash -6 +# Range: Add zero valued element +1 ipset -A test 2:0:0::1,0,0:0:0::0/0 +# Range: Test zero valued element +1 ipset -T test 2:0:0::1,0,0:0:0::0/0 +# Range: Delete zero valued element +1 ipset -D test 2:0:0::1,0,0:0:0::0/0 +# Range: Add almost zero valued element +0 ipset -A test 2:0:0::1,0,0:0:0::0/24 +# Range: Test almost zero valued element +0 ipset -T test 2:0:0::1,0,0:0:0::0/24 +# Range: Delete almost zero valued element +0 ipset -D test 2:0:0::1,0,0:0:0::0/24 +# Range: Add first random value +0 ipset -A test 2:0:0::1,5,1:1:1::1/24 +# Range: Add second random value +0 ipset -A test 2:1:0::0,128,2:2:2::2/12 +# Range: Test first random value +0 ipset -T test 2:0:0::1,5,1:1:1::2 +# Range: Test second random value +0 ipset -T test 2:1:0::0,128,2:2:2::0 +# Range: Test value not added to the set +1 ipset -T test 2:0:0::1,5,2:1:1::255 +# Range: Test value not added to the set +1 ipset -T test 2:0:0::1,6,1:1:1::1 +# Range: Test value not added to the set +1 ipset -T test 2:0:0::2,6,1:1:1::1 +# Range: Test value before first random value +1 ipset -T test 2:0:0::0,5,1:1:1::1 +# Range: Test value after second random value +1 ipset -T test 2:1:0::1,128,2:2:2::2 +# Range: Try to add value before first random value +0 ipset -A test 2:0:0::0,5,1:1:1::1/24 +# Range: Try to add value after second random value +0 ipset -A test 2:1:0::1,128,2:2:2::2/12 +# Range: List set +0 ipset -L test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Range: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip6,port,net6.t.list0 +# Range: Flush test set +0 ipset -F test +# Range: Delete test set +0 ipset -X test +# Create set to add a range +0 ipset new test hash:ip,port,net -6 hashsize 64 +# Add a range which forces a resizing +0 ipset add test 1::1,tcp:80-1105,2::2/12 +# Check that correct number of elements are added +0 n=`ipset list test|grep 1::1|wc -l` && test $n -eq 1026 +# Destroy set +0 ipset -X test +# Create test set with timeout support +0 ipset create test hash:ip,port,net family inet6 timeout 30 +# Add a non-matching IP address entry +0 ipset -A test 2:2:2::2,80,1:1:1::1 nomatch +# Add an overlapping matching small net +0 ipset -A test 2:2:2::2,80,1:1:1::/124 +# Add an overlapping non-matching larger net +0 ipset -A test 2:2:2::2,80,1:1:1::/120 nomatch +# Add an even larger matching net +0 ipset -A test 2:2:2::2,80,1:1:1::/116 +# Check non-matching IP +1 ipset -T test 2:2:2::2,80,1:1:1::1 +# Check matching IP from non-matchin small net +0 ipset -T test 2:2:2::2,80,1:1:1::F +# Check non-matching IP from larger net +1 ipset -T test 2:2:2::2,80,1:1:1::10 +# Check matching IP from even larger net +0 ipset -T test 2:2:2::2,80,1:1:1::100 +# Update non-matching IP to matching one +0 ipset -! -A test 2:2:2::2,80,1:1:1::1 +# Delete overlapping small net +0 ipset -D test 2:2:2::2,80,1:1:1::/124 +# Check matching IP +0 ipset -T test 2:2:2::2,80,1:1:1::1 +# Add overlapping small net +0 ipset -A test 2:2:2::2,80,1:1:1::/124 +# Update matching IP as a non-matching one, with shorter timeout +0 ipset -! -A test 2:2:2::2,80,1:1:1::1 nomatch timeout 2 +# Check non-matching IP +1 ipset -T test 2:2:2::2,80,1:1:1::1 +# Sleep 3s so that element can time out +0 sleep 3 +# Check non-matching IP +0 ipset -T test 2:2:2::2,80,1:1:1::1 +# Check matching IP +0 ipset -T test 2:2:2::2,80,1:1:1::F +# Delete test set +0 ipset destroy test +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -6 ipportnet +# Nomatch: Check that resizing keeps the nomatch flag +0 ./resizen.sh -6 ipportnet +# Counters: create set +0 ipset n test hash:ip,port,net -6 counters +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::1,80,2002:24:ff::1/64 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2:0:0::1,80,2002:24:ff::1/64 +# Counters: check counters +0 ./check_counters test 2::1 5 3456 +# Counters: delete element +0 ipset d test 2:0:0::1,80,2002:24:ff::1/64 +# Counters: test deleted element +1 ipset t test 2:0:0::1,80,2002:24:ff::1/64 +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::20,453,2002:ff:24::ab/54 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2::20 12 9876 +# Counters: update counters +0 ipset -! a test 2:0:0::20,453,2002:ff:24::ab/54 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2::20 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:ip,port,net -6 counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::1,80,2002:24:ff::1/64 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2:0:0::1,80,2002:24:ff::1/64 +# Counters and timeout: check counters +0 ./check_extensions test 2::1 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2:0:0::1,80,2002:24:ff::1/64 +# Counters and timeout: test deleted element +1 ipset t test 2:0:0::1,80,2002:24:ff::1/64 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::20,453,2002:ff:24::ab/54 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2:0:0::20,453,2002:ff:24::ab/54 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2:0:0::20,453,2002:ff:24::ab/54 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/hash:ip6,port,net6.t.list0 b/tests/hash:ip6,port,net6.t.list0 new file mode 100644 index 0000000..ad8ea8f --- /dev/null +++ b/tests/hash:ip6,port,net6.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:ip,port,net +Header: family inet6 hashsize 1024 maxelem 65536 +Size in memory: 1864 +References: 0 +Number of entries: 4 +Members: +2:1::,tcp:128,::/12 +2:1::1,tcp:128,::/12 +2::,tcp:5,1::/24 +2::1,tcp:5,1::/24 diff --git a/tests/hash:ip6,port.t b/tests/hash:ip6,port.t new file mode 100644 index 0000000..a47ca6e --- /dev/null +++ b/tests/hash:ip6,port.t @@ -0,0 +1,107 @@ +# Create a set with timeout +0 ipset create test hash:ip,port family inet6 timeout 4 +# Add partly zero valued element +0 ipset add test 2:0:0::1,0 +# Test partly zero valued element +0 ipset test test 2:0:0::1,0 +# Delete partly zero valued element +0 ipset del test 2:0:0::1,0 +# Add first random value +0 ipset add test 2:0:0::1,5 +# Add second random value +0 ipset add test 2:1:0::0,128 +# Test first random value +0 ipset test test 2:0:0::1,5 +# Test second random value +0 ipset test test 2:1:0::0,128 +# Test value not added to the set +1 ipset test test 2:0:0::1,4 +# Delete value not added to the set +1 ipset del test 2:0:0::1,6 +# Test value before first random value +1 ipset test test 2:0:0::0,5 +# Test value after second random value +1 ipset test test 2:1:0::1,128 +# Try to add value before first random value +0 ipset add test 2:0:0::0,5 +# Try to add value after second random value +0 ipset add test 2:1:0::1,128 +# List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip6,port.t.list0 +# Sleep 5s so that elements can time out +0 sleep 5 +# List set +0 ipset list test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip6,port.t.list1 +# Flush test set +0 ipset flush test +# Add multiple elements in one step +0 ipset add test 1::1,udp:80-85 +# Delete multiple elements in one step +0 ipset del test 1::1,udp:81-84 +# Check elements after multiple add/del +0 ipset test test 1::1,udp:80 +# Delete test set +0 ipset destroy test +# Create set to add a range +0 ipset new test hash:ip,port -6 hashsize 64 +# Add a range which forces a resizing +0 ipset add test 1::1,tcp:80-1105 +# Check that correct number of elements are added +0 n=`ipset list test|grep 1::1|wc -l` && test $n -eq 1026 +# Destroy set +0 ipset -X test +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -6 ipport +# Counters: create set +0 ipset n test hash:ip,port -6 counters +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::1,80 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2:0:0::1,80 +# Counters: check counters +0 ./check_counters test 2::1 5 3456 +# Counters: delete element +0 ipset d test 2:0:0::1,80 +# Counters: test deleted element +1 ipset t test 2:0:0::1,80 +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::20,453 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2::20 12 9876 +# Counters: update counters +0 ipset -! a test 2:0:0::20,453 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2::20 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:ip,port -6 counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::1,80 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2:0:0::1,80 +# Counters and timeout: check counters +0 ./check_extensions test 2::1 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2:0:0::1,80 +# Counters and timeout: test deleted element +1 ipset t test 2:0:0::1,80 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::20,453 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2:0:0::20,453 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2:0:0::20,453 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/hash:ip6,port.t.list0 b/tests/hash:ip6,port.t.list0 new file mode 100644 index 0000000..926c4ec --- /dev/null +++ b/tests/hash:ip6,port.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:ip,port +Header: family inet6 hashsize 1024 maxelem 65536 timeout x +Size in memory: 1088 +References: 0 +Number of entries: 4 +Members: +2:1::,tcp:128 timeout x +2:1::1,tcp:128 timeout x +2::,tcp:5 timeout x +2::1,tcp:5 timeout x diff --git a/tests/hash:ip6,port.t.list1 b/tests/hash:ip6,port.t.list1 new file mode 100644 index 0000000..d707af5 --- /dev/null +++ b/tests/hash:ip6,port.t.list1 @@ -0,0 +1,7 @@ +Name: test +Type: hash:ip,port +Header: family inet6 hashsize 1024 maxelem 65536 timeout 4 +Size in memory: 800 +References: 0 +Number of entries: 0 +Members: diff --git a/tests/hash:ip6.t b/tests/hash:ip6.t new file mode 100644 index 0000000..5edc267 --- /dev/null +++ b/tests/hash:ip6.t @@ -0,0 +1,151 @@ +# IP: Create a set with timeout +0 ipset -N test iphash -6 --hashsize 128 timeout 4 +# IP: Add zero valued element +1 ipset -A test :: +# IP: Test zero valued element +1 ipset -T test :: +# IP: Delete zero valued element +1 ipset -D test :: +# IP: Add first random value +0 ipset -A test 2:0:0::1 timeout 4 +# IP: Add second random value +0 ipset -A test 192:168:68::69 timeout 0 +# IP: Test first random value +0 ipset -T test 2:0:0::1 +# IP: Test second random value +0 ipset -T test 192:168:68::69 +# IP: Test value not added to the set +1 ipset -T test 2:0:0::2 +# IP: Add third random value +0 ipset -A test 200:100:0::12 +# IP: Delete the same value +0 ipset -D test 200:100:0::12 +# IP: List set +0 ipset -L test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# IP: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip6.t.list2 +# IP: Save set +0 ipset save test > hash:ip6.t.restore +# Sleep 5s so that element can time out +0 sleep 5 +# IP: List set +0 ipset -L test 2>/dev/null | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# IP: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip6.t.list0 +# IP: Destroy set +0 ipset x test +# IP: Restore saved set +0 ipset restore < hash:ip6.t.restore && rm hash:ip6.t.restore +# IP: List set +0 ipset -L test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# IP: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip6.t.list2 +# IP: Flush test set +0 ipset -F test +# IP: Try to add multiple elements in one step +1 ipset -A test 1::1-1::10 +# IP: Delete test set +0 ipset -X test +# Network: Create a set with timeout +0 ipset -N test iphash -6 --hashsize 128 --netmask 64 timeout 4 +# Network: Add zero valued element +1 ipset -A test :: +# Network: Test zero valued element +1 ipset -T test :: +# Network: Delete zero valued element +1 ipset -D test :: +# Network: Add first random network +0 ipset -A test 2:0:0::1 +# Network: Add second random network +0 ipset -A test 192:168:68::69 +# Network: Test first random value +0 ipset -T test 2:0:0::255 +# Network: Test second random value +0 ipset -T test 192:168:68::95 +# Network: Test value not added to the set +1 ipset -T test 4:0:1::0 +# Network: Add third element +0 ipset -A test 200:100:10::1 timeout 0 +# Network: Add third random network +0 ipset -A test 200:101:0::12 +# Network: Delete the same network +0 ipset -D test 200:101:0::12 +# Network: Test the deleted network +1 ipset -T test 200:101:0::12 +# Network: List set +0 ipset -L test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Network: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip6.t.list3 +# Sleep 5s so that elements can time out +0 sleep 5 +# Network: List set +0 ipset -L test | grep -v Revision: > .foo +# Network: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:ip6.t.list1 +# Network: Flush test set +0 ipset -F test +# Network: Delete test set +0 ipset -X test +# Check more complex restore commands +0 ipset restore < restore.t.restore +# List restored set a +0 ipset l a | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing of set a +0 diff -u -I 'Size in memory.*' .foo restore.t.list0 +# List restored set b +0 ipset l b | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing of set b +0 diff -u -I 'Size in memory.*' .foo restore.t.list1 +# Destroy by restore +0 ipset restore < restore.t.destroy +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -6 ip +# Counters: create set +0 ipset n test hash:ip -6 counters +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::1 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2:0:0::1 +# Counters: check counters +0 ./check_counters test 2::1 5 3456 +# Counters: delete element +0 ipset d test 2:0:0::1 +# Counters: test deleted element +1 ipset t test 2:0:0::1 +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::20 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2::20 12 9876 +# Counters: update counters +0 ipset -! a test 2:0:0::20 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2::20 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:ip -6 counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::1 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2:0:0::1 +# Counters and timeout: check counters +0 ./check_extensions test 2::1 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2:0:0::1 +# Counters and timeout: test deleted element +1 ipset t test 2:0:0::1 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::20 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2:0:0::20 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2:0:0::20 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/hash:ip6.t.list0 b/tests/hash:ip6.t.list0 new file mode 100644 index 0000000..44b6fb4 --- /dev/null +++ b/tests/hash:ip6.t.list0 @@ -0,0 +1,8 @@ +Name: test +Type: hash:ip +Header: family inet6 hashsize 128 maxelem 65536 timeout 4 +Size in memory: 416 +References: 0 +Number of entries: 1 +Members: +192:168:68::69 timeout 0 diff --git a/tests/hash:ip6.t.list1 b/tests/hash:ip6.t.list1 new file mode 100644 index 0000000..838fa77 --- /dev/null +++ b/tests/hash:ip6.t.list1 @@ -0,0 +1,8 @@ +Name: test +Type: hash:ip +Header: family inet6 hashsize 128 maxelem 65536 netmask 64 timeout 4 +Size in memory: 544 +References: 0 +Number of entries: 1 +Members: +200:100:10:: timeout 0 diff --git a/tests/hash:ip6.t.list2 b/tests/hash:ip6.t.list2 new file mode 100644 index 0000000..46a92f7 --- /dev/null +++ b/tests/hash:ip6.t.list2 @@ -0,0 +1,9 @@ +Name: test +Type: hash:ip +Header: family inet6 hashsize 128 maxelem 65536 timeout x +Size in memory: 512 +References: 0 +Number of entries: 2 +Members: +192:168:68::69 timeout x +2::1 timeout x diff --git a/tests/hash:ip6.t.list3 b/tests/hash:ip6.t.list3 new file mode 100644 index 0000000..c6e2990 --- /dev/null +++ b/tests/hash:ip6.t.list3 @@ -0,0 +1,10 @@ +Name: test +Type: hash:ip +Header: family inet6 hashsize 128 maxelem 65536 netmask 64 timeout x +Size in memory: 704 +References: 0 +Number of entries: 3 +Members: +192:168:68:: timeout x +200:100:10:: timeout x +2:: timeout x diff --git a/tests/hash:mac.t b/tests/hash:mac.t new file mode 100644 index 0000000..361bf58 --- /dev/null +++ b/tests/hash:mac.t @@ -0,0 +1,71 @@ +# MAC: Create a set with timeout +0 ipset -N test machash --hashsize 128 timeout 4 +# Range: Add zero valued element +1 ipset -A test 0:0:0:0:0:0 +# Range: Test zero valued element +1 ipset -T test 0:0:0:0:0:0 +# MAC: Add first random value +0 ipset -A test 0:0:0:0:2:0 timeout 4 +# MAC: Add second random value +0 ipset -A test 0:a:0:0:0:0 timeout 0 +# MAC: Test first random value +0 ipset -T test 0:0:0:0:2:0 +# MAC: Test second random value +0 ipset -T test 0:a:0:0:0:0 +# MAC: Test value not added to the set +1 ipset -T test 0:0:0:0:1:0 +# MAC: Add third random value +0 ipset -A test 1:2:3:4:a:b +# MAC: Delete the same value +0 ipset -D test 1:2:3:4:a:b +# MAC: List set +0 ipset -L test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# MAC: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:mac.t.list2 +# Sleep 5s so that element can time out +0 sleep 5 +# MAC: List set +0 ipset -L test 2>/dev/null | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# MAC: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:mac.t.list0 +# MAC: Destroy test set +0 ipset -X test +# MAC: Create a set with skbinfo extension +0 ipset n test hash:mac skbinfo +# MAC: Add element with mark +0 ipset a test 1:2:3:4:5:6 skbmark 0x123456 +# MAC: Add element with mark/mask +0 ipset a test 1:2:3:4:5:7 skbmark 0x1234ab/0x0000ffff +# MAC: Add element with skbprio +0 ipset a test 1:2:3:4:5:8 skbprio 1:20 +# MAC: Add element with skbqueue +0 ipset a test 1:2:3:4:5:9 skbqueue 11 +# MAC: Add element with mark and skbprio +0 ipset a test 1:2:3:4:5:10 skbmark 0xaabbccdd skbprio 22:1 +# MAC: Add element with mark, skbprio and skbqueue +0 ipset a test 1:2:3:4:5:11 skbmark 0x11223344/0xffff0000 skbprio 2:1 skbqueue 8 +# MAC: List set +0 ipset -L test 2>/dev/null | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# MAC: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:mac.t.list1 +# MAC: Destroy test set +0 ipset -X test +# MAC: Create a set with small maxelem parameter +0 ipset n test hash:mac maxelem 2 skbinfo +# MAC: Add first element +0 ipset a test 1:2:3:4:5:6 skbprio 1:10 +# MAC: Add second element +0 ipset a test 1:2:3:4:5:7 skbprio 1:11 +# MAC: Add third element +1 ipset a test 1:2:3:4:5:8 skbprio 1:12 +# MAC: Add second element again +1 ipset a test 1:2:3:4:5:7 skbprio 1:11 +# MAC: Add second element with another extension value +0 ipset -! a test 1:2:3:4:5:7 skbprio 1:12 skbqueue 8 +# MAC: List set +0 ipset -L test 2>/dev/null | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# MAC: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:mac.t.list3 +# MAC: Destroy test set +0 ipset x test +# eof diff --git a/tests/hash:mac.t.list0 b/tests/hash:mac.t.list0 new file mode 100644 index 0000000..232b932 --- /dev/null +++ b/tests/hash:mac.t.list0 @@ -0,0 +1,8 @@ +Name: test +Type: hash:mac +Header: hashsize 128 maxelem 65536 timeout 4 +Size in memory: 336 +References: 0 +Number of entries: 1 +Members: +00:0A:00:00:00:00 timeout 0 diff --git a/tests/hash:mac.t.list1 b/tests/hash:mac.t.list1 new file mode 100644 index 0000000..0c971ff --- /dev/null +++ b/tests/hash:mac.t.list1 @@ -0,0 +1,13 @@ +Name: test +Type: hash:mac +Header: hashsize 1024 maxelem 65536 skbinfo +Size in memory: 1088 +References: 0 +Number of entries: 6 +Members: +01:02:03:04:05:06 skbmark 0x123456 +01:02:03:04:05:07 skbmark 0x1234ab/0xffff +01:02:03:04:05:08 skbprio 1:20 +01:02:03:04:05:09 skbqueue 11 +01:02:03:04:05:10 skbmark 0xaabbccdd skbprio 22:1 +01:02:03:04:05:11 skbmark 0x11223344/0xffff0000 skbprio 2:1 skbqueue 8 diff --git a/tests/hash:mac.t.list2 b/tests/hash:mac.t.list2 new file mode 100644 index 0000000..166f266 --- /dev/null +++ b/tests/hash:mac.t.list2 @@ -0,0 +1,9 @@ +Name: test +Type: hash:mac +Header: hashsize 128 maxelem 65536 timeout x +Size in memory: 384 +References: 0 +Number of entries: 2 +Members: +00:00:00:00:02:00 timeout x +00:0A:00:00:00:00 timeout x diff --git a/tests/hash:mac.t.list3 b/tests/hash:mac.t.list3 new file mode 100644 index 0000000..4154342 --- /dev/null +++ b/tests/hash:mac.t.list3 @@ -0,0 +1,9 @@ +Name: test +Type: hash:mac +Header: hashsize 1024 maxelem 2 skbinfo +Size in memory: 448 +References: 0 +Number of entries: 2 +Members: +01:02:03:04:05:06 skbprio 1:10 +01:02:03:04:05:07 skbprio 1:12 skbqueue 8 diff --git a/tests/hash:net,iface.t b/tests/hash:net,iface.t new file mode 100644 index 0000000..a847357 --- /dev/null +++ b/tests/hash:net,iface.t @@ -0,0 +1,229 @@ +# Create a set +0 ipset create test hash:net,iface hashsize 128 +# Add zero valued element +0 ipset add test 0.0.0.0/0,eth0 +# Test zero valued element +0 ipset test test 0.0.0.0/0,eth0 +# Delete zero valued element +0 ipset del test 0.0.0.0/0,eth0 +# Add 1.1.1.1/0 +0 ipset add test 1.1.1.1/0,eth0 +# Test 1.1.1.1/0 +0 ipset test test 1.1.1.1/0,eth0 +# Delete 1.1.1.1/0 +0 ipset del test 1.1.1.1/0,eth0 +# Try to add /32 +0 ipset add test 1.1.1.1/32,eth0 +# Add almost zero valued element +0 ipset add test 0.0.0.0/1,eth0 +# Test almost zero valued element +0 ipset test test 0.0.0.0/1,eth0 +# Delete almost zero valued element +0 ipset del test 0.0.0.0/1,eth0 +# Test deleted element +1 ipset test test 0.0.0.0/1,eth0 +# Delete element not added to the set +1 ipset del test 0.0.0.0/1,eth0 +# Add first random network +0 ipset add test 2.0.0.1/24,eth0 +# Add second random network +0 ipset add test 192.168.68.69/27,eth1 +# Test first random value +0 ipset test test 2.0.0.255,eth0 +# Test second random value +0 ipset test test 192.168.68.95,eth1 +# Test value not added to the set +1 ipset test test 2.0.1.0,eth0 +# Test value not added to the set +1 ipset test test 2.0.0.255,eth1 +# Test value not added to the set +1 ipset test test 192.168.68.95,eth0 +# Try to add IP address +0 ipset add test 2.0.0.1,eth0 +# List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net,iface.t.list0 +# Flush test set +0 ipset flush test +# Delete test set +0 ipset destroy test +# Create test set +0 ipset new test hash:net,iface +# Add networks in range notation +0 ipset add test 10.2.0.0-10.2.1.12,eth0 +# List set +0 ipset -L test 2>/dev/null | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net,iface.t.list2 +# Flush test set +0 ipset flush test +# Add 0/0,eth0 +0 ipset add test 0/0,eth0 +# Add 10.0.0.0/16,eth1 +0 ipset add test 10.0.0.0/16,eth1 +# Add 10.0.0.0/24,eth0 +0 ipset add test 10.0.0.0/24,eth0 +# Add 10.0.0.0/16,eth2 +0 ipset add test 10.0.0.0/16,eth2 +# Check 10.0.1.1 with eth1 +0 ipset test test 10.0.1.1,eth1 +# Check 10.0.1.1 with eth2 +0 ipset test test 10.0.1.1,eth2 +# Check 10.0.1.1 with eth0 +1 ipset test test 10.0.1.1,eth0 +# Check 10.0.0.1 with eth1 +1 ipset test test 10.0.0.1,eth1 +# Check 10.0.0.1 with eth2 +1 ipset test test 10.0.0.1,eth2 +# Check 10.0.0.1 with eth0 +0 ipset test test 10.0.0.1,eth0 +# Check 1.0.1.1 with eth1 +1 ipset test test 1.0.1.1,eth1 +# Check 1.0.1.1 with eth2 +1 ipset test test 1.0.1.1,eth2 +# Check 1.0.1.1 with eth0 +0 ipset test test 1.0.1.1,eth0 +# Delete test set +0 ipset destroy test +# Create test set +0 ipset new test hash:net,iface +# Add a /16 network with eth0 +0 ipset add test 10.0.0.0/16,eth0 +# Add an overlapping /24 network with eth1 +0 ipset add test 10.0.0.0/24,eth1 +# Add an overlapping /28 network with eth2 +0 ipset add test 10.0.0.0/28,eth2 +# Check matching element: from /28, with eth2 +0 ipset test test 10.0.0.1,eth2 +# Check non-matching element: from /28, with eth1 +1 ipset test test 10.0.0.2,eth1 +# Check non-matching element: from /28, with eth0 +1 ipset test test 10.0.0.3,eth0 +# Check matching element from: /24, with eth1 +0 ipset test test 10.0.0.16,eth1 +# Check non-matching element: from /24, with eth2 +1 ipset test test 10.0.0.17,eth2 +# Check non-matching element: from /24, with eth0 +1 ipset test test 10.0.0.18,eth0 +# Check matching element: from /16, with eth0 +0 ipset test test 10.0.1.1,eth0 +# Check non-matching element: from /16, with eth1 +1 ipset test test 10.0.1.2,eth1 +# Check non-matching element: from /16, with eth2 +1 ipset test test 10.0.1.3,eth2 +# Flush test set +0 ipset flush test +# Add overlapping networks from /4 to /30 +0 (set -e; for x in `seq 4 30`; do ipset add test 192.0.0.0/$x,eth$x; done) +# List test set +0 ipset -L test 2>/dev/null | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net,iface.t.list1 +# Test matching elements in all added networks from /30 to /24 +0 (set -e; y=2; for x in `seq 24 30 | tac`; do ipset test test 192.0.0.$y,eth$x; y=$((y*2)); done) +# Test non-matching elements in all added networks from /30 to /24 +0 (y=2; for x in `seq 24 30 | tac`; do z=$((x-1)); ipset test test 192.0.0.$y,eth$z; ret=$?; test $ret -eq 0 && exit 1; y=$((y*2)); done) +# Delete test set +0 ipset destroy test +# Create test set with minimal hash size +0 ipset create test hash:net,iface hashsize 64 +# Add clashing elements +0 (set -e; for x in `seq 0 63`; do ipset add test 10.0.0.0/16,eth$x; done) +# Check listing +0 n=`ipset list test | grep -v Revision: | wc -l` && test $n -eq 71 +# Delete test set +0 ipset destroy test +# Check all possible CIDR values +0 ./cidr.sh net,iface +# Create test set with timeout support +0 ipset create test hash:net,iface timeout 30 +# Add a non-matching IP address entry +0 ipset -A test 1.1.1.1,eth0 nomatch +# Add an overlapping matching small net +0 ipset -A test 1.1.1.0/30,eth0 +# Add an overlapping non-matching larger net +0 ipset -A test 1.1.1.0/28,eth0 nomatch +# Add an even larger matching net +0 ipset -A test 1.1.1.0/26,eth0 +# Check non-matching IP +1 ipset -T test 1.1.1.1,eth0 +# Check matching IP from non-matchin small net +0 ipset -T test 1.1.1.3,eth0 +# Check non-matching IP from larger net +1 ipset -T test 1.1.1.4,eth0 +# Check matching IP from even larger net +0 ipset -T test 1.1.1.16,eth0 +# Update non-matching IP to matching one +0 ipset -! -A test 1.1.1.1,eth0 +# Delete overlapping small net +0 ipset -D test 1.1.1.0/30,eth0 +# Check matching IP +0 ipset -T test 1.1.1.1,eth0 +# Add overlapping small net +0 ipset -A test 1.1.1.0/30,eth0 +# Update matching IP as a non-matching one, with shorter timeout +0 ipset -! -A test 1.1.1.1,eth0 nomatch timeout 2 +# Check non-matching IP +1 ipset -T test 1.1.1.1,eth0 +# Sleep 3s so that element can time out +0 sleep 3 +# Check non-matching IP +0 ipset -T test 1.1.1.1,eth0 +# Check matching IP +0 ipset -T test 1.1.1.3,eth0 +# Delete test set +0 ipset destroy test +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -4 netiface +# Nomatch: Check that resizing keeps the nomatch flag +0 ./resizen.sh -4 netiface +# Counters: create set +0 ipset n test hash:net,iface counters +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.1/24,eth0 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2.0.0.1/24,eth0 +# Counters: check counters +0 ./check_counters test 2.0.0.0/24,eth0 5 3456 +# Counters: delete element +0 ipset d test 2.0.0.1/24,eth0 +# Counters: test deleted element +1 ipset t test 2.0.0.1/24,eth0 +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.20/25,wlan0 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2.0.0.0/25,wlan0 12 9876 +# Counters: update counters +0 ipset -! a test 2.0.0.20/25,wlan0 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2.0.0.0/25,wlan0 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:net,iface counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.1/24,eth0 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2.0.0.1/24,eth0 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.0/24,eth0 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2.0.0.1/24,eth0 +# Counters and timeout: test deleted element +1 ipset t test 2.0.0.1/24,eth0 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.20/25,wlan0 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.0/25,wlan0 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2.0.0.20/25,wlan0 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.0/25,wlan0 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2.0.0.20/25,wlan0 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.0/25,wlan0 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/hash:net,iface.t.list0 b/tests/hash:net,iface.t.list0 new file mode 100644 index 0000000..e29a7d6 --- /dev/null +++ b/tests/hash:net,iface.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:net,iface +Header: family inet hashsize 128 maxelem 65536 +Size in memory: 928 +References: 0 +Number of entries: 4 +Members: +1.1.1.1,eth0 +192.168.68.64/27,eth1 +2.0.0.0/24,eth0 +2.0.0.1,eth0 diff --git a/tests/hash:net,iface.t.list1 b/tests/hash:net,iface.t.list1 new file mode 100644 index 0000000..00f7d80 --- /dev/null +++ b/tests/hash:net,iface.t.list1 @@ -0,0 +1,34 @@ +Name: test +Type: hash:net,iface +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 3872 +References: 0 +Number of entries: 27 +Members: +192.0.0.0/10,eth10 +192.0.0.0/11,eth11 +192.0.0.0/12,eth12 +192.0.0.0/13,eth13 +192.0.0.0/14,eth14 +192.0.0.0/15,eth15 +192.0.0.0/16,eth16 +192.0.0.0/17,eth17 +192.0.0.0/18,eth18 +192.0.0.0/19,eth19 +192.0.0.0/20,eth20 +192.0.0.0/21,eth21 +192.0.0.0/22,eth22 +192.0.0.0/23,eth23 +192.0.0.0/24,eth24 +192.0.0.0/25,eth25 +192.0.0.0/26,eth26 +192.0.0.0/27,eth27 +192.0.0.0/28,eth28 +192.0.0.0/29,eth29 +192.0.0.0/30,eth30 +192.0.0.0/4,eth4 +192.0.0.0/5,eth5 +192.0.0.0/6,eth6 +192.0.0.0/7,eth7 +192.0.0.0/8,eth8 +192.0.0.0/9,eth9 diff --git a/tests/hash:net,iface.t.list2 b/tests/hash:net,iface.t.list2 new file mode 100644 index 0000000..4f5cc90 --- /dev/null +++ b/tests/hash:net,iface.t.list2 @@ -0,0 +1,11 @@ +Name: test +Type: hash:net,iface +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 928 +References: 0 +Number of entries: 4 +Members: +10.2.0.0/24,eth0 +10.2.1.0/29,eth0 +10.2.1.12,eth0 +10.2.1.8/30,eth0 diff --git a/tests/hash:net,net.t b/tests/hash:net,net.t new file mode 100644 index 0000000..13f1198 --- /dev/null +++ b/tests/hash:net,net.t @@ -0,0 +1,169 @@ +# Create a set with timeout +0 ipset create test hash:net,net hashsize 128 timeout 4 +# Add zero valued element +1 ipset add test 0.0.0.0/0,0.0.0.0/0 +# Test zero valued element +1 ipset test test 0.0.0.0/0,0.0.0.0/0 +# Delete zero valued element +1 ipset del test 0.0.0.0/0,0.0.0.0/0 +# Try to add /0 +1 ipset add test 1.1.1.1/0,1.1.1.1/0 +# Try to add /32 +0 ipset add test 1.1.1.1/32,1.1.1.2/32 +# Add almost zero valued element +0 ipset add test 0.0.0.0/1,0.0.0.0/1 +# Test almost zero valued element +0 ipset test test 0.0.0.0/1,0.0.0.0/1 +# Delete almost zero valued element +0 ipset del test 0.0.0.0/1,0.0.0.0/1 +# Test deleted element +1 ipset test test 0.0.0.0/1,0.0.0.0/1 +# Delete element not added to the set +1 ipset del test 0.0.0.0/1,0.0.0.0/1 +# Add first random network +0 ipset add test 2.0.0.1/24,2.0.1.1/24 +# Add second random network +0 ipset add test 192.168.68.69/27,192.168.129.69/27 +# Test first random value +0 ipset test test 2.0.0.255,2.0.1.255 +# Test second random value +0 ipset test test 192.168.68.95,192.168.129.75 +# Test value not added to the set +1 ipset test test 2.0.1.0,2.0.0.1 +# Try to add IP address +0 ipset add test 2.0.0.1,2.0.0.2 +# List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net,net.t.list0 +# Sleep 5s so that element can time out +0 sleep 5 +# List set +0 ipset -L test 2>/dev/null | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net,net.t.list1 +# Flush test set +0 ipset flush test +# Delete test set +0 ipset destroy test +# Create test set +0 ipset new test hash:net,net +# Add networks in range notation +0 ipset add test 10.2.0.0-10.2.1.12,10.3.0.0-10.3.1.12 +# List set +0 ipset -L test 2>/dev/null | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net,net.t.list2 +# Delete test set +0 ipset destroy test +# Stress test with range notation +0 ./netnetgen.sh | ipset restore +# List set and check the number of elements +0 n=`ipset -L test|grep '^10.'|wc -l` && test $n -eq 87040 +# Destroy test set +0 ipset destroy test +# Create test set with timeout support +0 ipset create test hash:net,net timeout 30 +# Add a non-matching IP address entry +0 ipset -A test 1.1.1.1,1.1.1.2 nomatch +# Add an overlapping matching small net +0 ipset -A test 1.1.1.0/30,1.1.1.0/30 +# Add an overlapping non-matching larger net +0 ipset -A test 1.1.1.0/28,1.1.1.0/28 nomatch +# Add an even larger matching net +0 ipset -A test 1.1.1.0/26,1.1.1.0/26 +# Check non-matching IP +1 ipset -T test 1.1.1.1,1.1.1.2 +# Check matching IP from non-matchin small net +0 ipset -T test 1.1.1.3,1.1.1.2 +# Check non-matching IP from larger net +1 ipset -T test 1.1.1.4,1.1.1.4 +# Check matching IP from even larger net +0 ipset -T test 1.1.1.16,1.1.1.16 +# Update non-matching IP to matching one +0 ipset -! -A test 1.1.1.1,1.1.1.2 +# Delete overlapping small net +0 ipset -D test 1.1.1.0/30,1.1.1.0/30 +# Check matching IP +0 ipset -T test 1.1.1.1,1.1.1.2 +# Add overlapping small net +0 ipset -A test 1.1.1.0/30,1.1.1.0/30 +# Update matching IP as a non-matching one, with shorter timeout +0 ipset -! -A test 1.1.1.1,1.1.1.2 nomatch timeout 2 +# Check non-matching IP +1 ipset -T test 1.1.1.1,1.1.1.2 +# Sleep 3s so that element can time out +0 sleep 3 +# Check non-matching IP +0 ipset -T test 1.1.1.1,1.1.1.2 +# Check matching IP +0 ipset -T test 1.1.1.3,1.1.1.2 +# flush ipset +0 ipset -F test +# Add matching IP +0 ipset -A test 10.0.0.0/16,192.168.0.0/24 +# Add more-specific non-matching IP +0 ipset -A test 10.0.0.0/24,192.168.0.0/24 nomatch +# Add even more-specific matching IP +0 ipset -A test 10.0.0.0/30,192.168.0.0/23 +# Check non-matching IP +1 ipset -T test 10.0.0.10,192.168.0.1 +# Check non-matching IP with nomatch specified +0 ipset -T test 10.0.0.10,192.168.0.1 nomatch +# Check matching IP +0 ipset -T test 10.0.0.1,192.168.0.1 +# Delete test set +0 ipset destroy test +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -4 netnet +# Nomatch: Check that resizing keeps the nomatch flag +0 ./resizen.sh -4 netnet +# Counters: create set +0 ipset n test hash:net,net counters +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.1/24,2.0.0.1/24 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2.0.0.1/24,2.0.0.1/24 +# Counters: check counters +0 ./check_counters test 2.0.0.0/24,2.0.0.0/24 5 3456 +# Counters: delete element +0 ipset d test 2.0.0.1/24,2.0.0.1/24 +# Counters: test deleted element +1 ipset t test 2.0.0.1/24,2.0.0.1/24 +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.20/25,2.0.0.20/25 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2.0.0.0/25,2.0.0.0/25 12 9876 +# Counters: update counters +0 ipset -! a test 2.0.0.20/25,2.0.0.20/25 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2.0.0.0/25,2.0.0.0/25 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:net,net counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.1/24,2.0.0.1/24 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2.0.0.1/24,2.0.0.1/24 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.0/24,2.0.0.0/24 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2.0.0.1/24,2.0.0.1/24 +# Counters and timeout: test deleted element +1 ipset t test 2.0.0.1/24,2.0.0.1/24 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.20/25,2.0.0.20/25 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.0/25,2.0.0.0/25 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2.0.0.20/25,2.0.0.20/25 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.0/25,2.0.0.0/25 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2.0.0.20/25,2.0.0.20/25 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.0/25,2.0.0.0/25 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/hash:net,net.t.list0 b/tests/hash:net,net.t.list0 new file mode 100644 index 0000000..4b806ea --- /dev/null +++ b/tests/hash:net,net.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:net,net +Header: family inet hashsize 128 maxelem 65536 timeout x +Size in memory: 1288 +References: 0 +Number of entries: 4 +Members: +1.1.1.1,1.1.1.2 timeout x +192.168.68.64/27,192.168.129.64/27 timeout x +2.0.0.0/24,2.0.1.0/24 timeout x +2.0.0.1,2.0.0.2 timeout x diff --git a/tests/hash:net,net.t.list1 b/tests/hash:net,net.t.list1 new file mode 100644 index 0000000..99e62c1 --- /dev/null +++ b/tests/hash:net,net.t.list1 @@ -0,0 +1,7 @@ +Name: test +Type: hash:net,net +Header: family inet hashsize 128 maxelem 65536 timeout 4 +Size in memory: 920 +References: 0 +Number of entries: 0 +Members: diff --git a/tests/hash:net,net.t.list2 b/tests/hash:net,net.t.list2 new file mode 100644 index 0000000..139b3e2 --- /dev/null +++ b/tests/hash:net,net.t.list2 @@ -0,0 +1,23 @@ +Name: test +Type: hash:net,net +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 2056 +References: 0 +Number of entries: 16 +Members: +10.2.0.0/24,10.3.0.0/24 +10.2.0.0/24,10.3.1.0/29 +10.2.0.0/24,10.3.1.12 +10.2.0.0/24,10.3.1.8/30 +10.2.1.0/29,10.3.0.0/24 +10.2.1.0/29,10.3.1.0/29 +10.2.1.0/29,10.3.1.12 +10.2.1.0/29,10.3.1.8/30 +10.2.1.12,10.3.0.0/24 +10.2.1.12,10.3.1.0/29 +10.2.1.12,10.3.1.12 +10.2.1.12,10.3.1.8/30 +10.2.1.8/30,10.3.0.0/24 +10.2.1.8/30,10.3.1.0/29 +10.2.1.8/30,10.3.1.12 +10.2.1.8/30,10.3.1.8/30 diff --git a/tests/hash:net,port,net.t b/tests/hash:net,port,net.t new file mode 100644 index 0000000..0e92f5b --- /dev/null +++ b/tests/hash:net,port,net.t @@ -0,0 +1,183 @@ +# Create a set with timeout +0 ipset create test hash:net,port,net timeout 4 +# Add partly zero valued element +0 ipset add test 2.0.0.1/24,0,192.168.0.0/24 +# Test partly zero valued element +0 ipset test test 2.0.0.1/24,0,192.168.0.0/24 +# Delete partly zero valued element +0 ipset del test 2.0.0.1/24,0,192.168.0.0/24 +# Add first random value +0 ipset add test 2.0.0.1/24,5,192.168.0.0/24 +# Add second random value +0 ipset add test 2.1.0.0/24,128,10.0.0.0/16 +# Test first random value +0 ipset test test 2.0.0.1,5,192.168.0.1 +# Test second random value +0 ipset test test 2.1.0.0,128,10.0.1.1 +# Test value not added to the set +1 ipset test test 2.5.0.1,4,10.0.0.1 +# Delete value not added to the set +1 ipset del test 2.0.0.1/8,6,10.0.0.0/16 +# Test value before first random value +1 ipset test test 2.0.0.0/25,5,192.168.0.0/24 +# Test value after second random value +1 ipset test test 2.4.0.1,128,10.0.0.100 +# Try to add value before first random value +0 ipset add test 2.0.0.0/24,5,192.168.0.0/25 +# Try to add value after second random value +0 ipset add test 2.1.0.1,128,10.0.0.0/17 +# List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net,port,net.t.list0 +# Sleep 5s so that elements can time out +0 sleep 5 +# List set +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Flush test set +0 ipset flush test +# Delete set +0 ipset destroy test +# Create set to add a range +0 ipset new test hash:net,port,net hashsize 64 +# Add a range +0 ipset add test 10.0.0.0-10.0.3.255,tcp:80-82,192.168.0.1/24 +# Check that correct number of elements are added +0 n=`ipset list test|grep '^10.0'|wc -l` && test $n -eq 3 +# Destroy set +0 ipset -X test +# Create set to add a range and with range notation in the network +0 ipset new test hash:net,port,net hashsize 64 +# Add a range which forces a resizing +0 ipset add test 10.0.0.0-10.0.3.255,tcp:80-82,192.168.0.0-192.168.2.255 +# Check that correct number of elements are added +0 n=`ipset list test|grep '^10.0'|wc -l` && test $n -eq 6 +# Destroy set +0 ipset -X test +# Create test set with timeout support +0 ipset create test hash:net,port,net timeout 30 +# Add a non-matching IP address entry +0 ipset -A test 2.2.2.2,80,1.1.1.1 nomatch +# Add an overlapping matching small net +0 ipset -A test 2.2.2.2,80,1.1.1.0/30 +# Add an overlapping non-matching larger net +0 ipset -A test 2.2.2.2,80,1.1.1.0/28 nomatch +# Add an even larger matching net +0 ipset -A test 2.2.2.2,80,1.1.1.0/26 +# Check non-matching IP +1 ipset -T test 2.2.2.2,80,1.1.1.1 +# Check matching IP from non-matchin small net +0 ipset -T test 2.2.2.2,80,1.1.1.3 +# Check non-matching IP from larger net +1 ipset -T test 2.2.2.2,80,1.1.1.4 +# Check matching IP from even larger net +0 ipset -T test 2.2.2.2,80,1.1.1.16 +# Update non-matching IP to matching one +0 ipset -! -A test 2.2.2.2,80,1.1.1.1 +# Delete overlapping small net +0 ipset -D test 2.2.2.2,80,1.1.1.0/30 +# Check matching IP +0 ipset -T test 2.2.2.2,80,1.1.1.1 +# Add overlapping small net +0 ipset -A test 2.2.2.2,80,1.1.1.0/30 +# Update matching IP as a non-matching one, with shorter timeout +0 ipset -! -A test 2.2.2.2,80,1.1.1.1 nomatch timeout 2 +# Check non-matching IP +1 ipset -T test 2.2.2.2,80,1.1.1.1 +# Sleep 3s so that element can time out +0 sleep 3 +# Check non-matching IP +0 ipset -T test 2.2.2.2,80,1.1.1.1 +# Check matching IP +0 ipset -T test 2.2.2.2,80,1.1.1.3 +# Delete test set +0 ipset destroy test +# Create set +0 ipset create test hash:net,port,net +# Add a single element +0 ipset add test 10.0.0.1,tcp:80,2.2.2.0/24 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 2 +# Delete the single element +0 ipset del test 10.0.0.1,tcp:80,2.2.2.0/24 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Add an IP range +0 ipset add test 10.0.0.1-10.0.0.10,tcp:80,2.2.2.0/24 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 6 +# Delete the IP range +0 ipset del test 10.0.0.1-10.0.0.10,tcp:80,2.2.2.0/24 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Add a port range +0 ipset add test 10.0.0.1,tcp:80-89,2.2.2.0/24 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 11 +# Delete the port range +0 ipset del test 10.0.0.1,tcp:80-89,2.2.2.0/24 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Add an IP and port range +0 ipset add test 10.0.0.1-10.0.0.10,tcp:80-89,2.2.2.0/24 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 51 +# Delete the IP and port range +0 ipset del test 10.0.0.1-10.0.0.10,tcp:80-89,2.2.2.0/24 +# Check number of elements +0 n=`ipset save test|wc -l` && test $n -eq 1 +# Destroy set +0 ipset -X test +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -4 netportnet +# Nomatch: Check that resizing keeps the nomatch flag +0 ./resizen.sh -4 netportnet +# Counters: create set +0 ipset n test hash:net,port,net counters +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.1,80,192.168.199.200 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2.0.0.1,80,192.168.199.200 +# Counters: check counters +0 ./check_counters test 2.0.0.1 5 3456 +# Counters: delete element +0 ipset d test 2.0.0.1,80,192.168.199.200 +# Counters: test deleted element +1 ipset t test 2.0.0.1,80,192.168.199.200 +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.20,453,10.0.0.1 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2.0.0.20 12 9876 +# Counters: update counters +0 ipset -! a test 2.0.0.20,453,10.0.0.1 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2.0.0.20 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:net,port,net counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.1,80,192.168.199.200 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2.0.0.1,80,192.168.199.200 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.1 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2.0.0.1,80,192.168.199.200 +# Counters and timeout: test deleted element +1 ipset t test 2.0.0.1,80,192.168.199.200 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.20,453,10.0.0.1 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.20 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2.0.0.20,453,10.0.0.1 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.20 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2.0.0.20,453,10.0.0.1 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.20 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/hash:net,port,net.t.list0 b/tests/hash:net,port,net.t.list0 new file mode 100644 index 0000000..9f20e7d --- /dev/null +++ b/tests/hash:net,port,net.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:net,port,net +Header: family inet hashsize 1024 maxelem 65536 timeout x +Size in memory: 1288 +References: 0 +Number of entries: 4 +Members: +2.0.0.0/24,tcp:5,192.168.0.0/24 timeout x +2.0.0.0/24,tcp:5,192.168.0.0/25 timeout x +2.1.0.0/24,tcp:128,10.0.0.0/16 timeout x +2.1.0.1,tcp:128,10.0.0.0/17 timeout x diff --git a/tests/hash:net,port.t b/tests/hash:net,port.t new file mode 100644 index 0000000..5424ff7 --- /dev/null +++ b/tests/hash:net,port.t @@ -0,0 +1,177 @@ +# Create a set with timeout +0 ipset create test hash:net,port hashsize 128 timeout 4 +# Add zero valued element +1 ipset add test 0.0.0.0/0,0 +# Test zero valued element +1 ipset test test 0.0.0.0/0,0 +# Delete zero valued element +1 ipset del test 0.0.0.0/0,0 +# Try to add /0 +1 ipset add test 1.1.1.1/0,0 +# Try to add /32 +0 ipset add test 1.1.1.1/32,tcp:5 +# Add almost zero valued element +0 ipset add test 0.0.0.0/1,tcp:8 +# Test almost zero valued element +0 ipset test test 0.0.0.0/1,tcp:8 +# Test almost zero valued element with UDP +1 ipset test test 0.0.0.0/1,udp:8 +# Delete almost zero valued element +0 ipset del test 0.0.0.0/1,tcp:8 +# Test deleted element +1 ipset test test 0.0.0.0/1,tcp:8 +# Delete element not added to the set +1 ipset del test 0.0.0.0/1,tcp:8 +# Add first random network +0 ipset add test 2.0.0.1/24,icmp:ping +# Add second random network +0 ipset add test 192.168.68.69/27,tcp:8 +# Test first random value +0 ipset test test 2.0.0.255,icmp:ping +# Test second random value +0 ipset test test 192.168.68.95,tcp:8 +# Test value not added to the set +1 ipset test test 2.0.1.0,icmp:ping +# Try to add IP address +0 ipset add test 2.0.0.1,icmp:ping timeout 3 +# Add ICMP by type/code +0 ipset add test 2.0.0.255,icmp:3/10 +# Test ICMP by type/code +0 ipset test test 2.0.0.255,icmp:3/10 +# Test ICMP by name +0 ipset test test 2.0.0.255,icmp:host-prohibited +# List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net,port.t.list0 +# Sleep 5s so that element can time out +0 sleep 5 +# IP: List set +0 ipset -L test 2>/dev/null | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# IP: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net,port.t.list1 +# Flush test set +0 ipset flush test +# Add multiple elements in one step +0 ipset add test 1.1.1.1/24,80-84 timeout 0 +# Delete multiple elements in one step +0 ipset del test 1.1.1.2/24,tcp:81-82 +# Check number of elements after multi-add/multi-del +0 n=`ipset save test|wc -l` && test $n -eq 4 +# Delete test set +0 ipset destroy test +# Create set to add a range +0 ipset new test hash:net,port hashsize 64 +# Add a range which forces a resizing +0 ipset add test 10.0.0.0/24,tcp:80-1105 +# Check that correct number of elements are added +0 n=`ipset list test|grep '^10.0'|wc -l` && test $n -eq 1026 +# Destroy set +0 ipset -X test +# Create set to add a range and with range notation in the network +0 ipset new test hash:net,port hashsize 64 +# Add a range which forces a resizing +0 ipset add test 10.0.0.0-10.0.2.255,tcp:80-1105 +# Check that correct number of elements are added +0 n=`ipset list test|grep '^10.0'|wc -l` && test $n -eq 2052 +# Flush set +0 ipset flush test +# Add range to verify wraparound does not happen +0 ipset add test 255.255.255.253-255.255.255.255,tcp:65534-65535 +# Check that correct number of elements are added +0 n=`ipset list test|grep '^255.255.255'|wc -l` && test $n -eq 4 +# Destroy set +0 ipset -X test +# Create test set with timeout support +0 ipset create test hash:net,port timeout 30 +# Add a non-matching IP address entry +0 ipset -A test 1.1.1.1,80 nomatch +# Add an overlapping matching small net +0 ipset -A test 1.1.1.0/30,80 +# Add an overlapping non-matching larger net +0 ipset -A test 1.1.1.0/28,80 nomatch +# Add an even larger matching net +0 ipset -A test 1.1.1.0/26,80 +# Check non-matching IP +1 ipset -T test 1.1.1.1,80 +# Check matching IP from non-matchin small net +0 ipset -T test 1.1.1.3,80 +# Check non-matching IP from larger net +1 ipset -T test 1.1.1.4,80 +# Check matching IP from even larger net +0 ipset -T test 1.1.1.16,80 +# Update non-matching IP to matching one +0 ipset -! -A test 1.1.1.1,80 +# Delete overlapping small net +0 ipset -D test 1.1.1.0/30,80 +# Check matching IP +0 ipset -T test 1.1.1.1,80 +# Add overlapping small net +0 ipset -A test 1.1.1.0/30,80 +# Update matching IP as a non-matching one, with shorter timeout +0 ipset -! -A test 1.1.1.1,80 nomatch timeout 2 +# Check non-matching IP +1 ipset -T test 1.1.1.1,80 +# Sleep 3s so that element can time out +0 sleep 3 +# Check non-matching IP +0 ipset -T test 1.1.1.1,80 +# Check matching IP +0 ipset -T test 1.1.1.3,80 +# Delete test set +0 ipset destroy test +# Check all possible CIDR values +0 ./cidr.sh net,port +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -4 netport +# Nomatch: Check that resizing keeps the nomatch flag +0 ./resizen.sh -4 netport +# Counters: create set +0 ipset n test hash:net,port counters +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.1/24,80 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2.0.0.1/24,80 +# Counters: check counters +0 ./check_counters test 2.0.0.0/24 5 3456 +# Counters: delete element +0 ipset d test 2.0.0.1/24,80 +# Counters: test deleted element +1 ipset t test 2.0.0.1/24,80 +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.20/25,453 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2.0.0.0/25 12 9876 +# Counters: update counters +0 ipset -! a test 2.0.0.20/25,453 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2.0.0.0/25 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:net,port counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.1/24,80 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2.0.0.1/24,80 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.0/24 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2.0.0.1/24,80 +# Counters and timeout: test deleted element +1 ipset t test 2.0.0.1/24,80 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.20/25,453 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.0/25 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2.0.0.20/25,453 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.0/25 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2.0.0.20/25,453 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.0/25 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/hash:net,port.t.list0 b/tests/hash:net,port.t.list0 new file mode 100644 index 0000000..fbfab7f --- /dev/null +++ b/tests/hash:net,port.t.list0 @@ -0,0 +1,12 @@ +Name: test +Type: hash:net,port +Header: family inet hashsize 128 maxelem 65536 timeout x +Size in memory: 1024 +References: 0 +Number of entries: 5 +Members: +1.1.1.1,tcp:5 timeout x +192.168.68.64/27,tcp:8 timeout x +2.0.0.0/24,icmp:echo-request timeout x +2.0.0.1,icmp:echo-request timeout x +2.0.0.255,icmp:host-prohibited timeout x diff --git a/tests/hash:net,port.t.list1 b/tests/hash:net,port.t.list1 new file mode 100644 index 0000000..66f0955 --- /dev/null +++ b/tests/hash:net,port.t.list1 @@ -0,0 +1,7 @@ +Name: test +Type: hash:net,port +Header: family inet hashsize 128 maxelem 65536 timeout 4 +Size in memory: 880 +References: 0 +Number of entries: 0 +Members: diff --git a/tests/hash:net.t b/tests/hash:net.t new file mode 100644 index 0000000..501f63e --- /dev/null +++ b/tests/hash:net.t @@ -0,0 +1,183 @@ +# Create a set with timeout +0 ipset create test nethash hashsize 128 timeout 4 +# Add zero valued element +1 ipset add test 0.0.0.0/0 +# Test zero valued element +1 ipset test test 0.0.0.0/0 +# Delete zero valued element +1 ipset del test 0.0.0.0/0 +# Try to add /0 +1 ipset add test 1.1.1.1/0 +# Try to add /32 +0 ipset add test 1.1.1.1/32 +# Add almost zero valued element +0 ipset add test 0.0.0.0/1 +# Test almost zero valued element +0 ipset test test 0.0.0.0/1 +# Delete almost zero valued element +0 ipset del test 0.0.0.0/1 +# Test deleted element +1 ipset test test 0.0.0.0/1 +# Delete element not added to the set +1 ipset del test 0.0.0.0/1 +# Add first random network +0 ipset add test 2.0.0.1/24 +# Add second random network +0 ipset add test 192.168.68.69/27 +# Test first random value +0 ipset test test 2.0.0.255 +# Test second random value +0 ipset test test 192.168.68.95 +# Test value not added to the set +1 ipset test test 2.0.1.0 +# Try to add IP address +0 ipset add test 2.0.0.1 +# List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net.t.list0 +# Sleep 5s so that element can time out +0 sleep 5 +# List set +0 ipset -L test 2>/dev/null | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net.t.list1 +# Flush test set +0 ipset flush test +# Delete test set +0 ipset destroy test +# Create test set +0 ipset new test hash:net +# Add networks in range notation +0 ipset add test 10.2.0.0-10.2.1.12 +# List set +0 ipset -L test 2>/dev/null | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net.t.list2 +# Delete test set +0 ipset destroy test +# Stress test with range notation +0 ./netgen.sh | ipset restore +# List set and check the number of elements +0 n=`ipset -L test|grep '^10.'|wc -l` && test $n -eq 43520 +# Destroy test set +0 ipset destroy test +# Verify keeping track cidrs: create set +0 ipset n test hash:net +# Verify keeping track cidrs: add /16 net +0 ipset a test 1.1.0.0/16 +# Verify keeping track cidrs: add /24 net +0 ipset a test 2.2.2.0/24 +# Verify keeping track cidrs: del /24 net +0 ipset d test 2.2.2.0/24 +# Verify keeping track cidrs: check address in /16 +0 ipset t test 1.1.1.1 +# Destroy test set +0 ipset x test +# Create test set with timeout support +0 ipset create test hash:net timeout 30 +# Add a non-matching IP address entry +0 ipset -A test 1.1.1.1 nomatch +# Add an overlapping matching small net +0 ipset -A test 1.1.1.0/30 +# Add an overlapping non-matching larger net +0 ipset -A test 1.1.1.0/28 nomatch +# Add an even larger matching net +0 ipset -A test 1.1.1.0/26 +# Check non-matching IP +1 ipset -T test 1.1.1.1 +# Check non-matching IP with nomatch flag +0 ipset -T test 1.1.1.1 nomatch +# Check matching IP from non-matchin small net +0 ipset -T test 1.1.1.3 +# Check non-matching IP from larger net +1 ipset -T test 1.1.1.4 +# Check matching IP from even larger net +0 ipset -T test 1.1.1.16 +# Update non-matching IP to matching one +0 ipset -! -A test 1.1.1.1 +# Delete overlapping small net +0 ipset -D test 1.1.1.0/30 +# Check matching IP +0 ipset -T test 1.1.1.1 +# Add overlapping small net +0 ipset -A test 1.1.1.0/30 +# Update matching IP as a non-matching one, with shorter timeout +0 ipset -! -A test 1.1.1.1 nomatch timeout 2 +# Check non-matching IP +1 ipset -T test 1.1.1.1 +# Sleep 3s so that element can time out +0 sleep 3 +# Check non-matching IP +0 ipset -T test 1.1.1.1 +# Check matching IP +0 ipset -T test 1.1.1.3 +# Delete test set +0 ipset destroy test +# Check CIDR book-keeping +0 ./check_cidrs.sh +# Check all possible CIDR values +0 ./cidr.sh net +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -4 net +# Nomatch: Check that resizing keeps the nomatch flag +0 ./resizen.sh -4 net +# Create set without timeout support +0 ipset n test hash:net +# Add more than 2^31 elements in a range +0 ipset a test 0.0.0.0-128.0.0.1 +# List set +0 ipset -L test 2>/dev/null | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net.t.list3 +# Delete test set +0 ipset destroy test +# Counters: create set +0 ipset n test hash:net counters +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.1/24 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2.0.0.1/24 +# Counters: check counters +0 ./check_counters test 2.0.0.0/24 5 3456 +# Counters: delete element +0 ipset d test 2.0.0.1/24 +# Counters: test deleted element +1 ipset t test 2.0.0.1/24 +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.20/25 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2.0.0.0/25 12 9876 +# Counters: update counters +0 ipset -! a test 2.0.0.20/25 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2.0.0.0/25 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:net counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.1/24 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2.0.0.1/24 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.0/24 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2.0.0.1/24 +# Counters and timeout: test deleted element +1 ipset t test 2.0.0.1/24 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.20/25 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.0/25 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2.0.0.20/25 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.0/25 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2.0.0.20/25 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.0/25 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/hash:net.t.list0 b/tests/hash:net.t.list0 new file mode 100644 index 0000000..e22f183 --- /dev/null +++ b/tests/hash:net.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:net +Header: family inet hashsize 128 maxelem 65536 timeout x +Size in memory: 896 +References: 0 +Number of entries: 4 +Members: +1.1.1.1 timeout x +192.168.68.64/27 timeout x +2.0.0.0/24 timeout x +2.0.0.1 timeout x diff --git a/tests/hash:net.t.list1 b/tests/hash:net.t.list1 new file mode 100644 index 0000000..6e74a1d --- /dev/null +++ b/tests/hash:net.t.list1 @@ -0,0 +1,7 @@ +Name: test +Type: hash:net +Header: family inet hashsize 128 maxelem 65536 timeout 4 +Size in memory: 784 +References: 0 +Number of entries: 0 +Members: diff --git a/tests/hash:net.t.list2 b/tests/hash:net.t.list2 new file mode 100644 index 0000000..893ac9d --- /dev/null +++ b/tests/hash:net.t.list2 @@ -0,0 +1,11 @@ +Name: test +Type: hash:net +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 640 +References: 0 +Number of entries: 4 +Members: +10.2.0.0/24 +10.2.1.0/29 +10.2.1.12 +10.2.1.8/30 diff --git a/tests/hash:net.t.list3 b/tests/hash:net.t.list3 new file mode 100644 index 0000000..265fcbd --- /dev/null +++ b/tests/hash:net.t.list3 @@ -0,0 +1,9 @@ +Name: test +Type: hash:net +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 504 +References: 0 +Number of entries: 2 +Members: +0.0.0.0/1 +128.0.0.0/31 diff --git a/tests/hash:net6,net6.t b/tests/hash:net6,net6.t new file mode 100644 index 0000000..57f8b2a --- /dev/null +++ b/tests/hash:net6,net6.t @@ -0,0 +1,151 @@ +# Create a set with timeout +0 ipset create test hash:net,net family inet6 hashsize 128 timeout 4 +# Add zero valued element +1 ipset add test ::/0,::/0 +# Test zero valued element +1 ipset test test ::/0,::/0 +# Delete zero valued element +1 ipset del test ::/0,::/0 +# Try to add /0 +1 ipset add test 1:1:1::1/0,1:1:1::1/0 +# Try to add /128 +0 ipset add test 1:1:1::1/128,2:2:2::2/128 +# Add almost zero valued element +0 ipset add test 0:0:0::0/1,0:0:0::0/1 +# Test almost zero valued element +0 ipset test test 0:0:0::0/1,0:0:0::0/1 +# Delete almost zero valued element +0 ipset del test 0:0:0::0/1,0:0:0::0/1 +# Test deleted element +1 ipset test test 0:0:0::0/1,0:0:0::0/1 +# Delete element not added to the set +1 ipset del test 0:0:0::0/1,0:0:0::0/1 +# Add first random network +0 ipset add test 2:0:0::1/24,4:0:0::1/32 +# Add second random network +0 ipset add test 192:168:68::69/27,172:16:68::69/48 +# Test first random value +0 ipset test test 2:0:0::255,4:0:0::54 +# Test second random value +0 ipset test test 192:168:68::95,172:16:68::68 +# Test value not added to the set +1 ipset test test 3:0:0::1,172:255:24::1 +# Try to add IP address +0 ipset add test 3:0:0::1,8:0:0::1 +# List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net6,net6.t.list0 +# Sleep 5s so that element can time out +0 sleep 5 +# IP: List set +0 ipset -L test 2>/dev/null | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# IP: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net6,net6.t.list1 +# Flush test set +0 ipset flush test +# Add matching IP address entry +0 ipset -A test 2001:db8::1/64,2001:db8:fe9::1/126 +# Add more-specific non-matching IP address entry +0 ipset -A test 2001:db8::1/68,2001:db8:fe9::1/64 nomatch +# Add even-more-specific matching IP address entry +0 ipset -A test 2001:db8::1/72,2001:db8:fe9::1/64 +# Check non-matching IP +1 ipset -T test 2001:db8:0:0:0f00::,2001:db8:fe9::1 +# Check non-matching IP with nomatch +0 ipset -T test 2001:db8:0:0:0f00::,2001:db8:fe9::1 nomatch +# Check matching IP +0 ipset -T test 2001:db8::1,2001:db8:fe9::1 +# Delete test set +0 ipset destroy test +# Create test set with timeout support +0 ipset create test hash:net,net family inet6 timeout 30 +# Add a non-matching IP address entry +0 ipset -A test 1:1:1::1,2:2:2::2 nomatch +# Add an overlapping matching small net +0 ipset -A test 1:1:1::/124,2:2:2::/124 +# Add an overlapping non-matching larger net +0 ipset -A test 1:1:1::/120,2:2:2::/120 nomatch +# Add an even larger matching net +0 ipset -A test 1:1:1::/116,2:2:2::/116 +# Check non-matching IP +1 ipset -T test 1:1:1::1,2:2:2::2 +# Check matching IP from non-matchin small net +0 ipset -T test 1:1:1::f,2:2:2::f +# Check non-matching IP from larger net +1 ipset -T test 1:1:1::10,2:2:2::10 +# Check matching IP from even larger net +0 ipset -T test 1:1:1::100,2:2:2::100 +# Update non-matching IP to matching one +0 ipset -! -A test 1:1:1::1,2:2:2::2 +# Delete overlapping small net +0 ipset -D test 1:1:1::/124,2:2:2::/124 +# Check matching IP +0 ipset -T test 1:1:1::1,2:2:2::2 +# Add overlapping small net +0 ipset -A test 1:1:1::/124,2:2:2::/124 +# Update matching IP as a non-matching one, with shorter timeout +0 ipset -! -A test 1:1:1::1,2:2:2::2 nomatch timeout 2 +# Check non-matching IP +1 ipset -T test 1:1:1::1,2:2:2::2 +# Sleep 3s so that element can time out +0 sleep 3 +# Check non-matching IP +0 ipset -T test 1:1:1::1,2:2:2::2 +# Check matching IP +0 ipset -T test 1:1:1::f,2:2:2::f +# Delete test set +0 ipset destroy test +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -6 netnet +# Nomatch: Check that resizing keeps the nomatch flag +0 ./resizen.sh -6 netnet +# Counters: create set +0 ipset n test hash:net,net -6 counters +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::1/64,3:0:0::1/64 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2:0:0::1/64,3:0:0::1/64 +# Counters: check counters +0 ./check_counters test 2:: 5 3456 +# Counters: delete element +0 ipset d test 2:0:0::1/64,3:0:0::1/64 +# Counters: test deleted element +1 ipset t test 2:0:0::1/64,3:0:0::1/64 +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::20/54,3:0:0::20/54 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2:: 12 9876 +# Counters: update counters +0 ipset -! a test 2:0:0::20/54,3:0:0::20/54 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2:: 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:net,net -6 counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::1/64,3:0:0::1/64 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2:0:0::1/64,3:0:0::1/64 +# Counters and timeout: check counters +0 ./check_extensions test 2:: 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2:0:0::1/64,3:0:0::1/64 +# Counters and timeout: test deleted element +1 ipset t test 2:0:0::1/64,3:0:0::1/64 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::20/54,3:0:0::20/54 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2:: 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2:0:0::20/54,3:0:0::20/54 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2:: 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2:0:0::20/54,3:0:0::20/54 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2:: 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/hash:net6,net6.t.list0 b/tests/hash:net6,net6.t.list0 new file mode 100644 index 0000000..1f021e5 --- /dev/null +++ b/tests/hash:net6,net6.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:net,net +Header: family inet6 hashsize 128 maxelem 65536 timeout x +Size in memory: 3144 +References: 0 +Number of entries: 4 +Members: +192:160::/27,172:16:68::/48 timeout x +1:1:1::1,2:2:2::2 timeout x +2::/24,4::/32 timeout x +3::1,8::1 timeout x diff --git a/tests/hash:net6,net6.t.list1 b/tests/hash:net6,net6.t.list1 new file mode 100644 index 0000000..2ccfd51 --- /dev/null +++ b/tests/hash:net6,net6.t.list1 @@ -0,0 +1,7 @@ +Name: test +Type: hash:net,net +Header: family inet6 hashsize 128 maxelem 65536 timeout 4 +Size in memory: 2608 +References: 0 +Number of entries: 0 +Members: diff --git a/tests/hash:net6,port,net6.t b/tests/hash:net6,port,net6.t new file mode 100644 index 0000000..5793b2d --- /dev/null +++ b/tests/hash:net6,port,net6.t @@ -0,0 +1,149 @@ +# Range: Create a set +0 ipset -N test netportnethash -6 +# Range: Add zero valued element +1 ipset -A test 0::0/0,0:0,0:0:0::0/0 +# Range: Test zero valued element +1 ipset -T test 0::0/0,0:0,0:0:0::0/0 +# Range: Delete zero valued element +1 ipset -D test 0::0/0,0,0:0:0:0::0/0 +# Range: Add almost zero valued element +0 ipset -A test 2:0:0::1/24,0,0:0:0::0/0 +# Range: Test almost zero valued element +0 ipset -T test 2:0:0::1/24,0,0:0:0::0/0 +# Range: Delete almost zero valued element +0 ipset -D test 2:0:0::1/24,0,0:0:0::0/0 +# Range: Add almost zero valued element +0 ipset -A test 2:0:0::1,0,0:0:0::0/24 +# Range: Test almost zero valued element +0 ipset -T test 2:0:0::1,0,0:0:0::0/24 +# Range: Delete almost zero valued element +0 ipset -D test 2:0:0::1,0,0:0:0::0/24 +# Range: Add first random value +0 ipset -A test 2:0:0::1,5,1:1:1::1/24 +# Range: Add second random value +0 ipset -A test 2:1:0::0,128,2:2:2::2/12 +# Range: Test first random value +0 ipset -T test 2:0:0::1,5,1:1:1::2 +# Range: Test second random value +0 ipset -T test 2:1:0::0,128,2:2:2::0 +# Range: Test value not added to the set +1 ipset -T test 2:0:0::1,5,2:1:1::255 +# Range: Test value not added to the set +1 ipset -T test 2:0:0::1,6,1:1:1::1 +# Range: Test value not added to the set +1 ipset -T test 2:0:0::2,6,1:1:1::1 +# Range: Test value before first random value +1 ipset -T test 2:0:0::0,5,1:1:1::1 +# Range: Test value after second random value +1 ipset -T test 2:1:0::1,128,2:2:2::2 +# Range: Try to add value before first random value +0 ipset -A test 2:0:0::0,5,1:1:1::1/24 +# Range: Try to add value after second random value +0 ipset -A test 2:1:0::1,128,2:2:2::2/12 +# Range: List set +0 ipset -L test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Range: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net6,port,net6.t.list0 +# Range: Flush test set +0 ipset -F test +# Range: Delete test set +0 ipset -X test +# Create set to add a range +0 ipset new test hash:net,port,net -6 hashsize 64 +# Add a range which forces a resizing +0 ipset add test 1::1,tcp:80-1105,2::2/12 +# Check that correct number of elements are added +0 n=`ipset list test|grep 1::1|wc -l` && test $n -eq 1026 +# Destroy set +0 ipset -X test +# Create test set with timeout support +0 ipset create test hash:net,port,net family inet6 timeout 30 +# Add a non-matching IP address entry +0 ipset -A test 2:2:2::2,80,1:1:1::1 nomatch +# Add an overlapping matching small net +0 ipset -A test 2:2:2::2,80,1:1:1::/124 +# Add an overlapping non-matching larger net +0 ipset -A test 2:2:2::2,80,1:1:1::/120 nomatch +# Add an even larger matching net +0 ipset -A test 2:2:2::2,80,1:1:1::/116 +# Check non-matching IP +1 ipset -T test 2:2:2::2,80,1:1:1::1 +# Check matching IP from non-matchin small net +0 ipset -T test 2:2:2::2,80,1:1:1::F +# Check non-matching IP from larger net +1 ipset -T test 2:2:2::2,80,1:1:1::10 +# Check matching IP from even larger net +0 ipset -T test 2:2:2::2,80,1:1:1::100 +# Update non-matching IP to matching one +0 ipset -! -A test 2:2:2::2,80,1:1:1::1 +# Delete overlapping small net +0 ipset -D test 2:2:2::2,80,1:1:1::/124 +# Check matching IP +0 ipset -T test 2:2:2::2,80,1:1:1::1 +# Add overlapping small net +0 ipset -A test 2:2:2::2,80,1:1:1::/124 +# Update matching IP as a non-matching one, with shorter timeout +0 ipset -! -A test 2:2:2::2,80,1:1:1::1 nomatch timeout 2 +# Check non-matching IP +1 ipset -T test 2:2:2::2,80,1:1:1::1 +# Sleep 3s so that element can time out +0 sleep 3 +# Check non-matching IP +0 ipset -T test 2:2:2::2,80,1:1:1::1 +# Check matching IP +0 ipset -T test 2:2:2::2,80,1:1:1::F +# Delete test set +0 ipset destroy test +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -6 netportnet +# Nomatch: Check that resizing keeps the nomatch flag +0 ./resizen.sh -6 netportnet +# Counters: create set +0 ipset n test hash:net,port,net -6 counters +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::1,80,2002:24:ff::1/64 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2:0:0::1,80,2002:24:ff::1/64 +# Counters: check counters +0 ./check_counters test 2::1 5 3456 +# Counters: delete element +0 ipset d test 2:0:0::1,80,2002:24:ff::1/64 +# Counters: test deleted element +1 ipset t test 2:0:0::1,80,2002:24:ff::1/64 +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::20,453,2002:ff:24::ab/54 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2::20 12 9876 +# Counters: update counters +0 ipset -! a test 2:0:0::20,453,2002:ff:24::ab/54 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2::20 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:net,port,net -6 counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::1,80,2002:24:ff::1/64 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2:0:0::1,80,2002:24:ff::1/64 +# Counters and timeout: check counters +0 ./check_extensions test 2::1 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2:0:0::1,80,2002:24:ff::1/64 +# Counters and timeout: test deleted element +1 ipset t test 2:0:0::1,80,2002:24:ff::1/64 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::20,453,2002:ff:24::ab/54 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2:0:0::20,453,2002:ff:24::ab/54 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2:0:0::20,453,2002:ff:24::ab/54 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2::20 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/hash:net6,port,net6.t.list0 b/tests/hash:net6,port,net6.t.list0 new file mode 100644 index 0000000..4b9f8f8 --- /dev/null +++ b/tests/hash:net6,port,net6.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:net,port,net +Header: family inet6 hashsize 1024 maxelem 65536 +Size in memory: 2440 +References: 0 +Number of entries: 4 +Members: +2:1::,tcp:128,::/12 +2:1::1,tcp:128,::/12 +2::,tcp:5,1::/24 +2::1,tcp:5,1::/24 diff --git a/tests/hash:net6,port.t b/tests/hash:net6,port.t new file mode 100644 index 0000000..e3e6584 --- /dev/null +++ b/tests/hash:net6,port.t @@ -0,0 +1,171 @@ +# Create a set with timeout +0 ipset create test hash:net,port family inet6 hashsize 128 timeout 4 +# Add zero valued element +1 ipset add test ::/0,tcp:8 +# Test zero valued element +1 ipset test test ::/0,tcp:8 +# Delete zero valued element +1 ipset del test ::/0,tcp:8 +# Try to add /0 +1 ipset add test 1:1:1::1/0,tcp:8 +# Try to add /128 +0 ipset add test 1:1:1::1/128,tcp:8 timeout 0 +# Add almost zero valued element +0 ipset add test 0:0:0::0/1,tcp:8 +# Test almost zero valued element +0 ipset test test 0:0:0::0/1,tcp:8 +# Test almost zero valued element with UDP +1 ipset test test 0:0:0::0/1,udp:8 +# Delete almost zero valued element +0 ipset del test 0:0:0::0/1,tcp:8 +# Test deleted element +1 ipset test test 0:0:0::0/1,tcp:8 +# Delete element not added to the set +1 ipset del test 0:0:0::0/1,tcp:8 +# Add first random network +0 ipset add test 2:0:0::1/24,tcp:8 +# Add second random network +0 ipset add test 192:168:68::69/27,icmpv6:ping +# Test first random value +0 ipset test test 2:0:0::255,tcp:8 +# Test second random value +0 ipset test test 192:168:68::95,icmpv6:ping +# Test value not added to the set +1 ipset test test 3:0:0::1,tcp:8 +# Try to add IP address +0 ipset add test 3:0:0::1,tcp:8 +# Add ICMPv6 by type/code +0 ipset add test 192:168:68::95,icmpv6:1/4 +# Test ICMPv6 by type/code +0 ipset test test 192:168:68::95,icmpv6:1/4 +# Test ICMPv6 by name +0 ipset test test 192:168:68::95,icmpv6:port-unreachable +# List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Save set +0 ipset save test > hash:net6,port.t.restore +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net6,port.t.list0 +# Sleep 5s so that element can time out +0 sleep 5 +# IP: List set +0 ipset -L test 2>/dev/null | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# IP: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net6,port.t.list1 +# Destroy set +0 ipset x test +# Restore set +0 ipset restore < hash:net6,port.t.restore && rm hash:net6,port.t.restore +# List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net6,port.t.list0 +# Flush test set +0 ipset flush test +# Add multiple elements in one step +0 ipset add test 1::1/64,80-84 timeout 0 +# Delete multiple elements in one step +0 ipset del test 1::1/64,tcp:81-82 +# Check number of elements after multi-add/multi-del +0 n=`ipset save test|wc -l` && test $n -eq 4 +# Delete test set +0 ipset destroy test +# Create set to add a range +0 ipset new test hash:net,port -6 hashsize 64 +# Add a range which forces a resizing +0 ipset add test 1::1/64,tcp:80-1105 +# Check that correct number of elements are added +0 n=`ipset list test|grep 1::|wc -l` && test $n -eq 1026 +# Destroy set +0 ipset -X test +# Create test set with timeout support +0 ipset create test hash:net,port family inet6 timeout 30 +# Add a non-matching IP address entry +0 ipset -A test 1:1:1::1,80 nomatch +# Add an overlapping matching small net +0 ipset -A test 1:1:1::/124,80 +# Add an overlapping non-matching larger net +0 ipset -A test 1:1:1::/120,80 nomatch +# Add an even larger matching net +0 ipset -A test 1:1:1::/116,80 +# Check non-matching IP +1 ipset -T test 1:1:1::1,80 +# Check matching IP from non-matchin small net +0 ipset -T test 1:1:1::F,80 +# Check non-matching IP from larger net +1 ipset -T test 1:1:1::10,80 +# Check matching IP from even larger net +0 ipset -T test 1:1:1::100,80 +# Update non-matching IP to matching one +0 ipset -! -A test 1:1:1::1,80 +# Delete overlapping small net +0 ipset -D test 1:1:1::/124,80 +# Check matching IP +0 ipset -T test 1:1:1::1,80 +# Add overlapping small net +0 ipset -A test 1:1:1::/124,80 +# Update matching IP as a non-matching one, with shorter timeout +0 ipset -! -A test 1:1:1::1,80 nomatch timeout 2 +# Check non-matching IP +1 ipset -T test 1:1:1::1,80 +# Sleep 3s so that element can time out +0 sleep 3 +# Check non-matching IP +0 ipset -T test 1:1:1::1,80 +# Check matching IP +0 ipset -T test 1:1:1::F,80 +# Delete test set +0 ipset destroy test +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -6 netport +# Nomatch: Check that resizing keeps the nomatch flag +0 ./resizen.sh -6 netport +# Counters: create set +0 ipset n test hash:net,port -6 counters +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::1/64,80 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2:0:0::1/64,80 +# Counters: check counters +0 ./check_counters test 2:: 5 3456 +# Counters: delete element +0 ipset d test 2:0:0::1/64,80 +# Counters: test deleted element +1 ipset t test 2:0:0::1/64,80 +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::20/54,453 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2:: 12 9876 +# Counters: update counters +0 ipset -! a test 2:0:0::20/54,453 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2:: 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:net,port -6 counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::1/64,80 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2:0:0::1/64,80 +# Counters and timeout: check counters +0 ./check_extensions test 2:: 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2:0:0::1/64,80 +# Counters and timeout: test deleted element +1 ipset t test 2:0:0::1/64,80 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::20/54,453 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2:: 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2:0:0::20/54,453 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2:: 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2:0:0::20/54,453 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2:: 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/hash:net6,port.t.list0 b/tests/hash:net6,port.t.list0 new file mode 100644 index 0000000..2d3596c --- /dev/null +++ b/tests/hash:net6,port.t.list0 @@ -0,0 +1,12 @@ +Name: test +Type: hash:net,port +Header: family inet6 hashsize 128 maxelem 65536 timeout x +Size in memory: 2352 +References: 0 +Number of entries: 5 +Members: +192:160::/27,ipv6-icmp:echo-request timeout x +192:168:68::95,ipv6-icmp:port-unreachable timeout x +1:1:1::1,tcp:8 timeout x +2::/24,tcp:8 timeout x +3::1,tcp:8 timeout x diff --git a/tests/hash:net6,port.t.list1 b/tests/hash:net6,port.t.list1 new file mode 100644 index 0000000..788358b --- /dev/null +++ b/tests/hash:net6,port.t.list1 @@ -0,0 +1,8 @@ +Name: test +Type: hash:net,port +Header: family inet6 hashsize 128 maxelem 65536 timeout 4 +Size in memory: 1984 +References: 0 +Number of entries: 1 +Members: +1:1:1::1,tcp:8 timeout 0 diff --git a/tests/hash:net6.t b/tests/hash:net6.t new file mode 100644 index 0000000..7a47655 --- /dev/null +++ b/tests/hash:net6.t @@ -0,0 +1,139 @@ +# Create a set with timeout +0 ipset create test nethash family inet6 hashsize 128 timeout 4 +# Add zero valued element +1 ipset add test ::/0 +# Test zero valued element +1 ipset test test ::/0 +# Delete zero valued element +1 ipset del test ::/0 +# Try to add /0 +1 ipset add test 1:1:1::1/0 +# Try to add /128 +0 ipset add test 1:1:1::1/128 +# Add almost zero valued element +0 ipset add test 0:0:0::0/1 +# Test almost zero valued element +0 ipset test test 0:0:0::0/1 +# Delete almost zero valued element +0 ipset del test 0:0:0::0/1 +# Test deleted element +1 ipset test test 0:0:0::0/1 +# Delete element not added to the set +1 ipset del test 0:0:0::0/1 +# Add first random network +0 ipset add test 2:0:0::1/24 +# Add second random network +0 ipset add test 192:168:68::69/27 +# Test first random value +0 ipset test test 2:0:0::255 +# Test second random value +0 ipset test test 192:168:68::95 +# Test value not added to the set +1 ipset test test 3:0:0::1 +# Try to add IP address +0 ipset add test 3:0:0::1 +# List set +0 ipset list test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net6.t.list0 +# Sleep 5s so that element can time out +0 sleep 5 +# IP: List set +0 ipset -L test 2>/dev/null | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# IP: Check listing +0 diff -u -I 'Size in memory.*' .foo hash:net6.t.list1 +# Flush test set +0 ipset flush test +# Delete test set +0 ipset destroy test +# Create test set with timeout support +0 ipset create test hash:net family inet6 timeout 30 +# Add a non-matching IP address entry +0 ipset -A test 1:1:1::1 nomatch +# Add an overlapping matching small net +0 ipset -A test 1:1:1::/124 +# Add an overlapping non-matching larger net +0 ipset -A test 1:1:1::/120 nomatch +# Add an even larger matching net +0 ipset -A test 1:1:1::/116 +# Check non-matching IP +1 ipset -T test 1:1:1::1 +# Check matching IP from non-matchin small net +0 ipset -T test 1:1:1::F +# Check non-matching IP from larger net +1 ipset -T test 1:1:1::10 +# Check matching IP from even larger net +0 ipset -T test 1:1:1::100 +# Update non-matching IP to matching one +0 ipset -! -A test 1:1:1::1 +# Delete overlapping small net +0 ipset -D test 1:1:1::/124 +# Check matching IP +0 ipset -T test 1:1:1::1 +# Add overlapping small net +0 ipset -A test 1:1:1::/124 +# Update matching IP as a non-matching one, with shorter timeout +0 ipset -! -A test 1:1:1::1 nomatch timeout 2 +# Check non-matching IP +1 ipset -T test 1:1:1::1 +# Sleep 3s so that element can time out +0 sleep 3 +# Check non-matching IP +0 ipset -T test 1:1:1::1 +# Check matching IP +0 ipset -T test 1:1:1::F +# Delete test set +0 ipset destroy test +# Timeout: Check that resizing keeps timeout values +0 ./resizet.sh -6 net +# Nomatch: Check that resizing keeps the nomatch flag +0 ./resizen.sh -6 net +# Counters: create set +0 ipset n test hash:net -6 counters +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::1/64 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2:0:0::1/64 +# Counters: check counters +0 ./check_counters test 2:: 5 3456 +# Counters: delete element +0 ipset d test 2:0:0::1/64 +# Counters: test deleted element +1 ipset t test 2:0:0::1/64 +# Counters: add element with packet, byte counters +0 ipset a test 2:0:0::20/54 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2:: 12 9876 +# Counters: update counters +0 ipset -! a test 2:0:0::20/54 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2:: 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test hash:net -6 counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::1/64 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2:0:0::1/64 +# Counters and timeout: check counters +0 ./check_extensions test 2:: 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2:0:0::1/64 +# Counters and timeout: test deleted element +1 ipset t test 2:0:0::1/64 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2:0:0::20/54 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2:: 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2:0:0::20/54 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2:: 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2:0:0::20/54 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2:: 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/hash:net6.t.list0 b/tests/hash:net6.t.list0 new file mode 100644 index 0000000..ad7133a --- /dev/null +++ b/tests/hash:net6.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:net +Header: family inet6 hashsize 128 maxelem 65536 timeout x +Size in memory: 2112 +References: 0 +Number of entries: 4 +Members: +192:160::/27 timeout x +1:1:1::1 timeout x +2::/24 timeout x +3::1 timeout x diff --git a/tests/hash:net6.t.list1 b/tests/hash:net6.t.list1 new file mode 100644 index 0000000..bf7dd88 --- /dev/null +++ b/tests/hash:net6.t.list1 @@ -0,0 +1,7 @@ +Name: test +Type: hash:net +Header: family inet6 hashsize 128 maxelem 65536 timeout 4 +Size in memory: 1824 +References: 0 +Number of entries: 0 +Members: diff --git a/tests/init.t b/tests/init.t new file mode 100644 index 0000000..3311856 --- /dev/null +++ b/tests/init.t @@ -0,0 +1,9 @@ +# Load in the ip_set kernel module +0 modprobe ip_set +# List our test set: the testsuite fails if it exists +1 ipset -L test >/dev/null +# Delete our test set: the testsuite fails if it exists +1 ipset -X test +# Check mandatory create arguments +2 ipset -N test +# eof diff --git a/tests/iphash.t b/tests/iphash.t new file mode 100644 index 0000000..0393295 --- /dev/null +++ b/tests/iphash.t @@ -0,0 +1,105 @@ +# IP: Create a set +0 ipset -N test iphash --hashsize 128 +# Range: Add zero valued element +1 ipset -A test 0.0.0.0 +# Range: Test zero valued element +1 ipset -T test 0.0.0.0 +# IP: Add first random value +0 ipset -A test 2.0.0.1 +# IP: Add second random value +0 ipset -A test 192.168.68.69 +# IP: Test first random value +0 ipset -T test 2.0.0.1 +# IP: Test second random value +0 ipset -T test 192.168.68.69 +# IP: Test value not added to the set +1 ipset -T test 2.0.0.2 +# IP: Add third random value +0 ipset -A test 200.100.0.12 +# IP: Delete the same value +0 ipset -D test 200.100.0.12 +# IP: Delete element not added to the set +1 ipset -D test 200.100.0.12 +# IP: Delete element not added to the set, ignoring error +0 ipset -! -D test 200.100.0.12 +# IP: List set +0 ipset -L test 2>/dev/null | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# IP: Check listing +0 diff -u -I 'Size in memory.*' .foo iphash.t.list0 +# IP: Flush test set +0 ipset -F test +# IP: Delete test set +0 ipset -X test +# IP: Restore values so that rehashing is triggered, old format +0 ipset -R < iphash.t.restore.old +# IP: Check that all values are restored +0 (grep add iphash.t.restore | sort > .foo.1) && (ipset -S test | grep add | sort > .foo.2) && cmp .foo.1 .foo.2 +# IP: Delete test set +0 ipset -X test +# IP: Restore values so that rehashing is triggered +0 ipset -R < iphash.t.restore +# IP: Check that all values are restored +0 (grep add iphash.t.restore | sort > .foo.1) && (ipset -S test | grep add | sort > .foo.2) && cmp .foo.1 .foo.2 +# IP: Flush test set +0 ipset -F test +# IP: Delete test set +0 ipset -X test +# IP: Restore values in order to check sorting +0 ipset r -f iphash.t.restore +# IP: Delete test2 set +0 (ipset -X test2; true) +# IP: Restore another set for sorting +0 sed -e 's/test/test2/' -e 's/ 10/ 20/' < iphash.t.restore | ipset r +# IP: Add more entries to the second set +0 tail -n +2 iphash.t.restore | sed -e 's/test/test2/' -e 's/ 10/ 30/' | ipset r +# IP: Save sets +0 ipset -s -f .foo.1 save +# IP: Compare sorted save and restore +0 cmp .foo.1 iphash.t.restore.sorted +# IP: Delete test set +0 ipset x test +# IP: Delete test2 set +0 ipset x test2 +# IP: Restore, which requires multiple messages +0 ipset restore < iphash.t.large +# IP: Save the restored set +0 ipset save test | sort > .foo.1 +# IP: Compare save and restore +0 (sort iphash.t.large > .foo.2) && (cmp .foo.1 .foo.2) +# IP: Delete all elements, one by one +0 ipset list test | sed '1,/Members/d' | xargs -n1 ipset del test +# IP: Delete test set +0 ipset x test +# Network: Create a set +0 ipset -N test iphash --hashsize 128 --netmask 24 +# Network: Add zero valued element +1 ipset -A test 0.0.0.0 +# Network: Test zero valued element +1 ipset -T test 0.0.0.0 +# Network: Delete zero valued element +1 ipset -D test 0.0.0.0 +# Network: Add first random network +0 ipset -A test 2.0.0.1 +# Network: Add second random network +0 ipset -A test 192.168.68.69 +# Network: Test first random value +0 ipset -T test 2.0.0.255 +# Network: Test second random value +0 ipset -T test 192.168.68.95 +# Network: Test value not added to the set +1 ipset -T test 2.0.1.0 +# Network: Add third random network +0 ipset -A test 200.100.0.12 +# Network: Delete the same network +0 ipset -D test 200.100.0.12 +# Network: Delete element not added to the set +1 ipset -D test 200.100.0.12 +# Network: List set +0 ipset -L test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Network: Check listing +0 diff -u -I 'Size in memory.*' .foo iphash.t.list1 +# Network: Flush test set +0 ipset -F test +# Network: Delete test set +0 ipset -X test +# eof diff --git a/tests/iphash.t.large b/tests/iphash.t.large new file mode 100644 index 0000000..24cc125 --- /dev/null +++ b/tests/iphash.t.large @@ -0,0 +1,1057 @@ +create test hash:ip family inet hashsize 1024 maxelem 65536 +add test 10.10.0.0 +add test 10.10.0.1 +add test 10.10.0.2 +add test 10.10.0.3 +add test 10.10.0.4 +add test 10.10.0.5 +add test 10.10.0.6 +add test 10.10.0.7 +add test 10.10.0.8 +add test 10.10.0.9 +add test 10.10.0.10 +add test 10.10.0.11 +add test 10.10.0.12 +add test 10.10.0.13 +add test 10.10.0.14 +add test 10.10.0.15 +add test 10.10.0.16 +add test 10.10.0.17 +add test 10.10.0.18 +add test 10.10.0.19 +add test 10.10.0.20 +add test 10.10.0.21 +add test 10.10.0.22 +add test 10.10.0.23 +add test 10.10.0.24 +add test 10.10.0.25 +add test 10.10.0.26 +add test 10.10.0.27 +add test 10.10.0.28 +add test 10.10.0.29 +add test 10.10.0.30 +add test 10.10.0.31 +add test 10.10.0.32 +add test 10.10.0.33 +add test 10.10.0.34 +add test 10.10.0.35 +add test 10.10.0.36 +add test 10.10.0.37 +add test 10.10.0.38 +add test 10.10.0.39 +add test 10.10.0.40 +add test 10.10.0.41 +add test 10.10.0.42 +add test 10.10.0.43 +add test 10.10.0.44 +add test 10.10.0.45 +add test 10.10.0.46 +add test 10.10.0.47 +add test 10.10.0.48 +add test 10.10.0.49 +add test 10.10.0.50 +add test 10.10.0.51 +add test 10.10.0.52 +add test 10.10.0.53 +add test 10.10.0.54 +add test 10.10.0.55 +add test 10.10.0.56 +add test 10.10.0.57 +add test 10.10.0.58 +add test 10.10.0.59 +add test 10.10.0.60 +add test 10.10.0.61 +add test 10.10.0.62 +add test 10.10.0.63 +add test 10.10.0.64 +add test 10.10.0.65 +add test 10.10.0.66 +add test 10.10.0.67 +add test 10.10.0.68 +add test 10.10.0.69 +add test 10.10.0.70 +add test 10.10.0.71 +add test 10.10.0.72 +add test 10.10.0.73 +add test 10.10.0.74 +add test 10.10.0.75 +add test 10.10.0.76 +add test 10.10.0.77 +add test 10.10.0.78 +add test 10.10.0.79 +add test 10.10.0.80 +add test 10.10.0.81 +add test 10.10.0.82 +add test 10.10.0.83 +add test 10.10.0.84 +add test 10.10.0.85 +add test 10.10.0.86 +add test 10.10.0.87 +add test 10.10.0.88 +add test 10.10.0.89 +add test 10.10.0.90 +add test 10.10.0.91 +add test 10.10.0.92 +add test 10.10.0.93 +add test 10.10.0.94 +add test 10.10.0.95 +add test 10.10.0.96 +add test 10.10.0.97 +add test 10.10.0.98 +add test 10.10.0.99 +add test 10.10.0.100 +add test 10.10.0.101 +add test 10.10.0.102 +add test 10.10.0.103 +add test 10.10.0.104 +add test 10.10.0.105 +add test 10.10.0.106 +add test 10.10.0.107 +add test 10.10.0.108 +add test 10.10.0.109 +add test 10.10.0.110 +add test 10.10.0.111 +add test 10.10.0.112 +add test 10.10.0.113 +add test 10.10.0.114 +add test 10.10.0.115 +add test 10.10.0.116 +add test 10.10.0.117 +add test 10.10.0.118 +add test 10.10.0.119 +add test 10.10.0.120 +add test 10.10.0.121 +add test 10.10.0.122 +add test 10.10.0.123 +add test 10.10.0.124 +add test 10.10.0.125 +add test 10.10.0.126 +add test 10.10.0.127 +add test 10.10.0.128 +add test 10.10.0.129 +add test 10.10.0.130 +add test 10.10.0.131 +add test 10.10.0.132 +add test 10.10.0.133 +add test 10.10.0.134 +add test 10.10.0.135 +add test 10.10.0.136 +add test 10.10.0.137 +add test 10.10.0.138 +add test 10.10.0.139 +add test 10.10.0.140 +add test 10.10.0.141 +add test 10.10.0.142 +add test 10.10.0.143 +add test 10.10.0.144 +add test 10.10.0.145 +add test 10.10.0.146 +add test 10.10.0.147 +add test 10.10.0.148 +add test 10.10.0.149 +add test 10.10.0.150 +add test 10.10.0.151 +add test 10.10.0.152 +add test 10.10.0.153 +add test 10.10.0.154 +add test 10.10.0.155 +add test 10.10.0.156 +add test 10.10.0.157 +add test 10.10.0.158 +add test 10.10.0.159 +add test 10.10.0.160 +add test 10.10.0.161 +add test 10.10.0.162 +add test 10.10.0.163 +add test 10.10.0.164 +add test 10.10.0.165 +add test 10.10.0.166 +add test 10.10.0.167 +add test 10.10.0.168 +add test 10.10.0.169 +add test 10.10.0.170 +add test 10.10.0.171 +add test 10.10.0.172 +add test 10.10.0.173 +add test 10.10.0.174 +add test 10.10.0.175 +add test 10.10.0.176 +add test 10.10.0.177 +add test 10.10.0.178 +add test 10.10.0.179 +add test 10.10.0.180 +add test 10.10.0.181 +add test 10.10.0.182 +add test 10.10.0.183 +add test 10.10.0.184 +add test 10.10.0.185 +add test 10.10.0.186 +add test 10.10.0.187 +add test 10.10.0.188 +add test 10.10.0.189 +add test 10.10.0.190 +add test 10.10.0.191 +add test 10.10.0.192 +add test 10.10.0.193 +add test 10.10.0.194 +add test 10.10.0.195 +add test 10.10.0.196 +add test 10.10.0.197 +add test 10.10.0.198 +add test 10.10.0.199 +add test 10.10.0.200 +add test 10.10.0.201 +add test 10.10.0.202 +add test 10.10.0.203 +add test 10.10.0.204 +add test 10.10.0.205 +add test 10.10.0.206 +add test 10.10.0.207 +add test 10.10.0.208 +add test 10.10.0.209 +add test 10.10.0.210 +add test 10.10.0.211 +add test 10.10.0.212 +add test 10.10.0.213 +add test 10.10.0.214 +add test 10.10.0.215 +add test 10.10.0.216 +add test 10.10.0.217 +add test 10.10.0.218 +add test 10.10.0.219 +add test 10.10.0.220 +add test 10.10.0.221 +add test 10.10.0.222 +add test 10.10.0.223 +add test 10.10.0.224 +add test 10.10.0.225 +add test 10.10.0.226 +add test 10.10.0.227 +add test 10.10.0.228 +add test 10.10.0.229 +add test 10.10.0.230 +add test 10.10.0.231 +add test 10.10.0.232 +add test 10.10.0.233 +add test 10.10.0.234 +add test 10.10.0.235 +add test 10.10.0.236 +add test 10.10.0.237 +add test 10.10.0.238 +add test 10.10.0.239 +add test 10.10.0.240 +add test 10.10.0.241 +add test 10.10.0.242 +add test 10.10.0.243 +add test 10.10.0.244 +add test 10.10.0.245 +add test 10.10.0.246 +add test 10.10.0.247 +add test 10.10.0.248 +add test 10.10.0.249 +add test 10.10.0.250 +add test 10.10.0.251 +add test 10.10.0.252 +add test 10.10.0.253 +add test 10.10.0.254 +add test 10.10.0.255 +add test 10.10.1.0 +add test 10.10.1.1 +add test 10.10.1.2 +add test 10.10.1.3 +add test 10.10.1.4 +add test 10.10.1.5 +add test 10.10.1.6 +add test 10.10.1.7 +add test 10.10.1.8 +add test 10.10.1.9 +add test 10.10.1.10 +add test 10.10.1.11 +add test 10.10.1.12 +add test 10.10.1.13 +add test 10.10.1.14 +add test 10.10.1.15 +add test 10.10.1.16 +add test 10.10.1.17 +add test 10.10.1.18 +add test 10.10.1.19 +add test 10.10.1.20 +add test 10.10.1.21 +add test 10.10.1.22 +add test 10.10.1.23 +add test 10.10.1.24 +add test 10.10.1.25 +add test 10.10.1.26 +add test 10.10.1.27 +add test 10.10.1.28 +add test 10.10.1.29 +add test 10.10.1.30 +add test 10.10.1.31 +add test 10.10.1.32 +add test 10.10.1.33 +add test 10.10.1.34 +add test 10.10.1.35 +add test 10.10.1.36 +add test 10.10.1.37 +add test 10.10.1.38 +add test 10.10.1.39 +add test 10.10.1.40 +add test 10.10.1.41 +add test 10.10.1.42 +add test 10.10.1.43 +add test 10.10.1.44 +add test 10.10.1.45 +add test 10.10.1.46 +add test 10.10.1.47 +add test 10.10.1.48 +add test 10.10.1.49 +add test 10.10.1.50 +add test 10.10.1.51 +add test 10.10.1.52 +add test 10.10.1.53 +add test 10.10.1.54 +add test 10.10.1.55 +add test 10.10.1.56 +add test 10.10.1.57 +add test 10.10.1.58 +add test 10.10.1.59 +add test 10.10.1.60 +add test 10.10.1.61 +add test 10.10.1.62 +add test 10.10.1.63 +add test 10.10.1.64 +add test 10.10.1.65 +add test 10.10.1.66 +add test 10.10.1.67 +add test 10.10.1.68 +add test 10.10.1.69 +add test 10.10.1.70 +add test 10.10.1.71 +add test 10.10.1.72 +add test 10.10.1.73 +add test 10.10.1.74 +add test 10.10.1.75 +add test 10.10.1.76 +add test 10.10.1.77 +add test 10.10.1.78 +add test 10.10.1.79 +add test 10.10.1.80 +add test 10.10.1.81 +add test 10.10.1.82 +add test 10.10.1.83 +add test 10.10.1.84 +add test 10.10.1.85 +add test 10.10.1.86 +add test 10.10.1.87 +add test 10.10.1.88 +add test 10.10.1.89 +add test 10.10.1.90 +add test 10.10.1.91 +add test 10.10.1.92 +add test 10.10.1.93 +add test 10.10.1.94 +add test 10.10.1.95 +add test 10.10.1.96 +add test 10.10.1.97 +add test 10.10.1.98 +add test 10.10.1.99 +add test 10.10.1.100 +add test 10.10.1.101 +add test 10.10.1.102 +add test 10.10.1.103 +add test 10.10.1.104 +add test 10.10.1.105 +add test 10.10.1.106 +add test 10.10.1.107 +add test 10.10.1.108 +add test 10.10.1.109 +add test 10.10.1.110 +add test 10.10.1.111 +add test 10.10.1.112 +add test 10.10.1.113 +add test 10.10.1.114 +add test 10.10.1.115 +add test 10.10.1.116 +add test 10.10.1.117 +add test 10.10.1.118 +add test 10.10.1.119 +add test 10.10.1.120 +add test 10.10.1.121 +add test 10.10.1.122 +add test 10.10.1.123 +add test 10.10.1.124 +add test 10.10.1.125 +add test 10.10.1.126 +add test 10.10.1.127 +add test 10.10.1.128 +add test 10.10.1.129 +add test 10.10.1.130 +add test 10.10.1.131 +add test 10.10.1.132 +add test 10.10.1.133 +add test 10.10.1.134 +add test 10.10.1.135 +add test 10.10.1.136 +add test 10.10.1.137 +add test 10.10.1.138 +add test 10.10.1.139 +add test 10.10.1.140 +add test 10.10.1.141 +add test 10.10.1.142 +add test 10.10.1.143 +add test 10.10.1.144 +add test 10.10.1.145 +add test 10.10.1.146 +add test 10.10.1.147 +add test 10.10.1.148 +add test 10.10.1.149 +add test 10.10.1.150 +add test 10.10.1.151 +add test 10.10.1.152 +add test 10.10.1.153 +add test 10.10.1.154 +add test 10.10.1.155 +add test 10.10.1.156 +add test 10.10.1.157 +add test 10.10.1.158 +add test 10.10.1.159 +add test 10.10.1.160 +add test 10.10.1.161 +add test 10.10.1.162 +add test 10.10.1.163 +add test 10.10.1.164 +add test 10.10.1.165 +add test 10.10.1.166 +add test 10.10.1.167 +add test 10.10.1.168 +add test 10.10.1.169 +add test 10.10.1.170 +add test 10.10.1.171 +add test 10.10.1.172 +add test 10.10.1.173 +add test 10.10.1.174 +add test 10.10.1.175 +add test 10.10.1.176 +add test 10.10.1.177 +add test 10.10.1.178 +add test 10.10.1.179 +add test 10.10.1.180 +add test 10.10.1.181 +add test 10.10.1.182 +add test 10.10.1.183 +add test 10.10.1.184 +add test 10.10.1.185 +add test 10.10.1.186 +add test 10.10.1.187 +add test 10.10.1.188 +add test 10.10.1.189 +add test 10.10.1.190 +add test 10.10.1.191 +add test 10.10.1.192 +add test 10.10.1.193 +add test 10.10.1.194 +add test 10.10.1.195 +add test 10.10.1.196 +add test 10.10.1.197 +add test 10.10.1.198 +add test 10.10.1.199 +add test 10.10.1.200 +add test 10.10.1.201 +add test 10.10.1.202 +add test 10.10.1.203 +add test 10.10.1.204 +add test 10.10.1.205 +add test 10.10.1.206 +add test 10.10.1.207 +add test 10.10.1.208 +add test 10.10.1.209 +add test 10.10.1.210 +add test 10.10.1.211 +add test 10.10.1.212 +add test 10.10.1.213 +add test 10.10.1.214 +add test 10.10.1.215 +add test 10.10.1.216 +add test 10.10.1.217 +add test 10.10.1.218 +add test 10.10.1.219 +add test 10.10.1.220 +add test 10.10.1.221 +add test 10.10.1.222 +add test 10.10.1.223 +add test 10.10.1.224 +add test 10.10.1.225 +add test 10.10.1.226 +add test 10.10.1.227 +add test 10.10.1.228 +add test 10.10.1.229 +add test 10.10.1.230 +add test 10.10.1.231 +add test 10.10.1.232 +add test 10.10.1.233 +add test 10.10.1.234 +add test 10.10.1.235 +add test 10.10.1.236 +add test 10.10.1.237 +add test 10.10.1.238 +add test 10.10.1.239 +add test 10.10.1.240 +add test 10.10.1.241 +add test 10.10.1.242 +add test 10.10.1.243 +add test 10.10.1.244 +add test 10.10.1.245 +add test 10.10.1.246 +add test 10.10.1.247 +add test 10.10.1.248 +add test 10.10.1.249 +add test 10.10.1.250 +add test 10.10.1.251 +add test 10.10.1.252 +add test 10.10.1.253 +add test 10.10.1.254 +add test 10.10.1.255 +add test 10.10.2.0 +add test 10.10.2.1 +add test 10.10.2.2 +add test 10.10.2.3 +add test 10.10.2.4 +add test 10.10.2.5 +add test 10.10.2.6 +add test 10.10.2.7 +add test 10.10.2.8 +add test 10.10.2.9 +add test 10.10.2.10 +add test 10.10.2.11 +add test 10.10.2.12 +add test 10.10.2.13 +add test 10.10.2.14 +add test 10.10.2.15 +add test 10.10.2.16 +add test 10.10.2.17 +add test 10.10.2.18 +add test 10.10.2.19 +add test 10.10.2.20 +add test 10.10.2.21 +add test 10.10.2.22 +add test 10.10.2.23 +add test 10.10.2.24 +add test 10.10.2.25 +add test 10.10.2.26 +add test 10.10.2.27 +add test 10.10.2.28 +add test 10.10.2.29 +add test 10.10.2.30 +add test 10.10.2.31 +add test 10.10.2.32 +add test 10.10.2.33 +add test 10.10.2.34 +add test 10.10.2.35 +add test 10.10.2.36 +add test 10.10.2.37 +add test 10.10.2.38 +add test 10.10.2.39 +add test 10.10.2.40 +add test 10.10.2.41 +add test 10.10.2.42 +add test 10.10.2.43 +add test 10.10.2.44 +add test 10.10.2.45 +add test 10.10.2.46 +add test 10.10.2.47 +add test 10.10.2.48 +add test 10.10.2.49 +add test 10.10.2.50 +add test 10.10.2.51 +add test 10.10.2.52 +add test 10.10.2.53 +add test 10.10.2.54 +add test 10.10.2.55 +add test 10.10.2.56 +add test 10.10.2.57 +add test 10.10.2.58 +add test 10.10.2.59 +add test 10.10.2.60 +add test 10.10.2.61 +add test 10.10.2.62 +add test 10.10.2.63 +add test 10.10.2.64 +add test 10.10.2.65 +add test 10.10.2.66 +add test 10.10.2.67 +add test 10.10.2.68 +add test 10.10.2.69 +add test 10.10.2.70 +add test 10.10.2.71 +add test 10.10.2.72 +add test 10.10.2.73 +add test 10.10.2.74 +add test 10.10.2.75 +add test 10.10.2.76 +add test 10.10.2.77 +add test 10.10.2.78 +add test 10.10.2.79 +add test 10.10.2.80 +add test 10.10.2.81 +add test 10.10.2.82 +add test 10.10.2.83 +add test 10.10.2.84 +add test 10.10.2.85 +add test 10.10.2.86 +add test 10.10.2.87 +add test 10.10.2.88 +add test 10.10.2.89 +add test 10.10.2.90 +add test 10.10.2.91 +add test 10.10.2.92 +add test 10.10.2.93 +add test 10.10.2.94 +add test 10.10.2.95 +add test 10.10.2.96 +add test 10.10.2.97 +add test 10.10.2.98 +add test 10.10.2.99 +add test 10.10.2.100 +add test 10.10.2.101 +add test 10.10.2.102 +add test 10.10.2.103 +add test 10.10.2.104 +add test 10.10.2.105 +add test 10.10.2.106 +add test 10.10.2.107 +add test 10.10.2.108 +add test 10.10.2.109 +add test 10.10.2.110 +add test 10.10.2.111 +add test 10.10.2.112 +add test 10.10.2.113 +add test 10.10.2.114 +add test 10.10.2.115 +add test 10.10.2.116 +add test 10.10.2.117 +add test 10.10.2.118 +add test 10.10.2.119 +add test 10.10.2.120 +add test 10.10.2.121 +add test 10.10.2.122 +add test 10.10.2.123 +add test 10.10.2.124 +add test 10.10.2.125 +add test 10.10.2.126 +add test 10.10.2.127 +add test 10.10.2.128 +add test 10.10.2.129 +add test 10.10.2.130 +add test 10.10.2.131 +add test 10.10.2.132 +add test 10.10.2.133 +add test 10.10.2.134 +add test 10.10.2.135 +add test 10.10.2.136 +add test 10.10.2.137 +add test 10.10.2.138 +add test 10.10.2.139 +add test 10.10.2.140 +add test 10.10.2.141 +add test 10.10.2.142 +add test 10.10.2.143 +add test 10.10.2.144 +add test 10.10.2.145 +add test 10.10.2.146 +add test 10.10.2.147 +add test 10.10.2.148 +add test 10.10.2.149 +add test 10.10.2.150 +add test 10.10.2.151 +add test 10.10.2.152 +add test 10.10.2.153 +add test 10.10.2.154 +add test 10.10.2.155 +add test 10.10.2.156 +add test 10.10.2.157 +add test 10.10.2.158 +add test 10.10.2.159 +add test 10.10.2.160 +add test 10.10.2.161 +add test 10.10.2.162 +add test 10.10.2.163 +add test 10.10.2.164 +add test 10.10.2.165 +add test 10.10.2.166 +add test 10.10.2.167 +add test 10.10.2.168 +add test 10.10.2.169 +add test 10.10.2.170 +add test 10.10.2.171 +add test 10.10.2.172 +add test 10.10.2.173 +add test 10.10.2.174 +add test 10.10.2.175 +add test 10.10.2.176 +add test 10.10.2.177 +add test 10.10.2.178 +add test 10.10.2.179 +add test 10.10.2.180 +add test 10.10.2.181 +add test 10.10.2.182 +add test 10.10.2.183 +add test 10.10.2.184 +add test 10.10.2.185 +add test 10.10.2.186 +add test 10.10.2.187 +add test 10.10.2.188 +add test 10.10.2.189 +add test 10.10.2.190 +add test 10.10.2.191 +add test 10.10.2.192 +add test 10.10.2.193 +add test 10.10.2.194 +add test 10.10.2.195 +add test 10.10.2.196 +add test 10.10.2.197 +add test 10.10.2.198 +add test 10.10.2.199 +add test 10.10.2.200 +add test 10.10.2.201 +add test 10.10.2.202 +add test 10.10.2.203 +add test 10.10.2.204 +add test 10.10.2.205 +add test 10.10.2.206 +add test 10.10.2.207 +add test 10.10.2.208 +add test 10.10.2.209 +add test 10.10.2.210 +add test 10.10.2.211 +add test 10.10.2.212 +add test 10.10.2.213 +add test 10.10.2.214 +add test 10.10.2.215 +add test 10.10.2.216 +add test 10.10.2.217 +add test 10.10.2.218 +add test 10.10.2.219 +add test 10.10.2.220 +add test 10.10.2.221 +add test 10.10.2.222 +add test 10.10.2.223 +add test 10.10.2.224 +add test 10.10.2.225 +add test 10.10.2.226 +add test 10.10.2.227 +add test 10.10.2.228 +add test 10.10.2.229 +add test 10.10.2.230 +add test 10.10.2.231 +add test 10.10.2.232 +add test 10.10.2.233 +add test 10.10.2.234 +add test 10.10.2.235 +add test 10.10.2.236 +add test 10.10.2.237 +add test 10.10.2.238 +add test 10.10.2.239 +add test 10.10.2.240 +add test 10.10.2.241 +add test 10.10.2.242 +add test 10.10.2.243 +add test 10.10.2.244 +add test 10.10.2.245 +add test 10.10.2.246 +add test 10.10.2.247 +add test 10.10.2.248 +add test 10.10.2.249 +add test 10.10.2.250 +add test 10.10.2.251 +add test 10.10.2.252 +add test 10.10.2.253 +add test 10.10.2.254 +add test 10.10.2.255 +add test 10.10.3.0 +add test 10.10.3.1 +add test 10.10.3.2 +add test 10.10.3.3 +add test 10.10.3.4 +add test 10.10.3.5 +add test 10.10.3.6 +add test 10.10.3.7 +add test 10.10.3.8 +add test 10.10.3.9 +add test 10.10.3.10 +add test 10.10.3.11 +add test 10.10.3.12 +add test 10.10.3.13 +add test 10.10.3.14 +add test 10.10.3.15 +add test 10.10.3.16 +add test 10.10.3.17 +add test 10.10.3.18 +add test 10.10.3.19 +add test 10.10.3.20 +add test 10.10.3.21 +add test 10.10.3.22 +add test 10.10.3.23 +add test 10.10.3.24 +add test 10.10.3.25 +add test 10.10.3.26 +add test 10.10.3.27 +add test 10.10.3.28 +add test 10.10.3.29 +add test 10.10.3.30 +add test 10.10.3.31 +add test 10.10.3.32 +add test 10.10.3.33 +add test 10.10.3.34 +add test 10.10.3.35 +add test 10.10.3.36 +add test 10.10.3.37 +add test 10.10.3.38 +add test 10.10.3.39 +add test 10.10.3.40 +add test 10.10.3.41 +add test 10.10.3.42 +add test 10.10.3.43 +add test 10.10.3.44 +add test 10.10.3.45 +add test 10.10.3.46 +add test 10.10.3.47 +add test 10.10.3.48 +add test 10.10.3.49 +add test 10.10.3.50 +add test 10.10.3.51 +add test 10.10.3.52 +add test 10.10.3.53 +add test 10.10.3.54 +add test 10.10.3.55 +add test 10.10.3.56 +add test 10.10.3.57 +add test 10.10.3.58 +add test 10.10.3.59 +add test 10.10.3.60 +add test 10.10.3.61 +add test 10.10.3.62 +add test 10.10.3.63 +add test 10.10.3.64 +add test 10.10.3.65 +add test 10.10.3.66 +add test 10.10.3.67 +add test 10.10.3.68 +add test 10.10.3.69 +add test 10.10.3.70 +add test 10.10.3.71 +add test 10.10.3.72 +add test 10.10.3.73 +add test 10.10.3.74 +add test 10.10.3.75 +add test 10.10.3.76 +add test 10.10.3.77 +add test 10.10.3.78 +add test 10.10.3.79 +add test 10.10.3.80 +add test 10.10.3.81 +add test 10.10.3.82 +add test 10.10.3.83 +add test 10.10.3.84 +add test 10.10.3.85 +add test 10.10.3.86 +add test 10.10.3.87 +add test 10.10.3.88 +add test 10.10.3.89 +add test 10.10.3.90 +add test 10.10.3.91 +add test 10.10.3.92 +add test 10.10.3.93 +add test 10.10.3.94 +add test 10.10.3.95 +add test 10.10.3.96 +add test 10.10.3.97 +add test 10.10.3.98 +add test 10.10.3.99 +add test 10.10.3.100 +add test 10.10.3.101 +add test 10.10.3.102 +add test 10.10.3.103 +add test 10.10.3.104 +add test 10.10.3.105 +add test 10.10.3.106 +add test 10.10.3.107 +add test 10.10.3.108 +add test 10.10.3.109 +add test 10.10.3.110 +add test 10.10.3.111 +add test 10.10.3.112 +add test 10.10.3.113 +add test 10.10.3.114 +add test 10.10.3.115 +add test 10.10.3.116 +add test 10.10.3.117 +add test 10.10.3.118 +add test 10.10.3.119 +add test 10.10.3.120 +add test 10.10.3.121 +add test 10.10.3.122 +add test 10.10.3.123 +add test 10.10.3.124 +add test 10.10.3.125 +add test 10.10.3.126 +add test 10.10.3.127 +add test 10.10.3.128 +add test 10.10.3.129 +add test 10.10.3.130 +add test 10.10.3.131 +add test 10.10.3.132 +add test 10.10.3.133 +add test 10.10.3.134 +add test 10.10.3.135 +add test 10.10.3.136 +add test 10.10.3.137 +add test 10.10.3.138 +add test 10.10.3.139 +add test 10.10.3.140 +add test 10.10.3.141 +add test 10.10.3.142 +add test 10.10.3.143 +add test 10.10.3.144 +add test 10.10.3.145 +add test 10.10.3.146 +add test 10.10.3.147 +add test 10.10.3.148 +add test 10.10.3.149 +add test 10.10.3.150 +add test 10.10.3.151 +add test 10.10.3.152 +add test 10.10.3.153 +add test 10.10.3.154 +add test 10.10.3.155 +add test 10.10.3.156 +add test 10.10.3.157 +add test 10.10.3.158 +add test 10.10.3.159 +add test 10.10.3.160 +add test 10.10.3.161 +add test 10.10.3.162 +add test 10.10.3.163 +add test 10.10.3.164 +add test 10.10.3.165 +add test 10.10.3.166 +add test 10.10.3.167 +add test 10.10.3.168 +add test 10.10.3.169 +add test 10.10.3.170 +add test 10.10.3.171 +add test 10.10.3.172 +add test 10.10.3.173 +add test 10.10.3.174 +add test 10.10.3.175 +add test 10.10.3.176 +add test 10.10.3.177 +add test 10.10.3.178 +add test 10.10.3.179 +add test 10.10.3.180 +add test 10.10.3.181 +add test 10.10.3.182 +add test 10.10.3.183 +add test 10.10.3.184 +add test 10.10.3.185 +add test 10.10.3.186 +add test 10.10.3.187 +add test 10.10.3.188 +add test 10.10.3.189 +add test 10.10.3.190 +add test 10.10.3.191 +add test 10.10.3.192 +add test 10.10.3.193 +add test 10.10.3.194 +add test 10.10.3.195 +add test 10.10.3.196 +add test 10.10.3.197 +add test 10.10.3.198 +add test 10.10.3.199 +add test 10.10.3.200 +add test 10.10.3.201 +add test 10.10.3.202 +add test 10.10.3.203 +add test 10.10.3.204 +add test 10.10.3.205 +add test 10.10.3.206 +add test 10.10.3.207 +add test 10.10.3.208 +add test 10.10.3.209 +add test 10.10.3.210 +add test 10.10.3.211 +add test 10.10.3.212 +add test 10.10.3.213 +add test 10.10.3.214 +add test 10.10.3.215 +add test 10.10.3.216 +add test 10.10.3.217 +add test 10.10.3.218 +add test 10.10.3.219 +add test 10.10.3.220 +add test 10.10.3.221 +add test 10.10.3.222 +add test 10.10.3.223 +add test 10.10.3.224 +add test 10.10.3.225 +add test 10.10.3.226 +add test 10.10.3.227 +add test 10.10.3.228 +add test 10.10.3.229 +add test 10.10.3.230 +add test 10.10.3.231 +add test 10.10.3.232 +add test 10.10.3.233 +add test 10.10.3.234 +add test 10.10.3.235 +add test 10.10.3.236 +add test 10.10.3.237 +add test 10.10.3.238 +add test 10.10.3.239 +add test 10.10.3.240 +add test 10.10.3.241 +add test 10.10.3.242 +add test 10.10.3.243 +add test 10.10.3.244 +add test 10.10.3.245 +add test 10.10.3.246 +add test 10.10.3.247 +add test 10.10.3.248 +add test 10.10.3.249 +add test 10.10.3.250 +add test 10.10.3.251 +add test 10.10.3.252 +add test 10.10.3.253 +add test 10.10.3.254 +add test 10.10.3.255 +add test 10.10.4.0 +add test 10.10.4.1 +add test 10.10.4.2 +add test 10.10.4.3 +add test 10.10.4.4 +add test 10.10.4.5 +add test 10.10.4.6 +add test 10.10.4.7 +add test 10.10.4.8 +add test 10.10.4.9 +add test 10.10.4.10 +add test 10.10.4.11 +add test 10.10.4.12 +add test 10.10.4.13 +add test 10.10.4.14 +add test 10.10.4.15 +add test 10.10.4.16 +add test 10.10.4.17 +add test 10.10.4.18 +add test 10.10.4.19 +add test 10.10.4.20 +add test 10.10.4.21 +add test 10.10.4.22 +add test 10.10.4.23 +add test 10.10.4.24 +add test 10.10.4.25 +add test 10.10.4.26 +add test 10.10.4.27 +add test 10.10.4.28 +add test 10.10.4.29 +add test 10.10.4.30 +add test 10.10.4.31 diff --git a/tests/iphash.t.list0 b/tests/iphash.t.list0 new file mode 100644 index 0000000..4d75711 --- /dev/null +++ b/tests/iphash.t.list0 @@ -0,0 +1,9 @@ +Name: test +Type: hash:ip +Header: family inet hashsize 128 maxelem 65536 +Size in memory: 224 +References: 0 +Number of entries: 2 +Members: +192.168.68.69 +2.0.0.1 diff --git a/tests/iphash.t.list1 b/tests/iphash.t.list1 new file mode 100644 index 0000000..18ec027 --- /dev/null +++ b/tests/iphash.t.list1 @@ -0,0 +1,9 @@ +Name: test +Type: hash:ip +Header: family inet hashsize 128 maxelem 65536 netmask 24 +Size in memory: 224 +References: 0 +Number of entries: 2 +Members: +192.168.68.0 +2.0.0.0 diff --git a/tests/iphash.t.restore b/tests/iphash.t.restore new file mode 100644 index 0000000..d521c87 --- /dev/null +++ b/tests/iphash.t.restore @@ -0,0 +1,130 @@ +create test hash:ip hashsize 128 +add test 10.0.0.38 +add test 10.0.0.94 +add test 10.0.0.17 +add test 10.0.0.114 +add test 10.0.0.69 +add test 10.0.0.112 +add test 10.0.0.122 +add test 10.0.0.119 +add test 10.0.0.70 +add test 10.0.0.101 +add test 10.0.0.37 +add test 10.0.0.45 +add test 10.0.0.41 +add test 10.0.0.123 +add test 10.0.0.18 +add test 10.0.0.33 +add test 10.0.0.35 +add test 10.0.0.48 +add test 10.0.0.29 +add test 10.0.0.80 +add test 10.0.0.12 +add test 10.0.0.42 +add test 10.0.0.85 +add test 10.0.0.116 +add test 10.0.0.56 +add test 10.0.0.83 +add test 10.0.0.28 +add test 10.0.0.32 +add test 10.0.0.68 +add test 10.0.0.84 +add test 10.0.0.82 +add test 10.0.0.20 +add test 10.0.0.43 +add test 10.0.0.2 +add test 10.0.0.121 +add test 10.0.0.6 +add test 10.0.0.31 +add test 10.0.0.66 +add test 10.0.0.57 +add test 10.0.0.77 +add test 10.0.0.25 +add test 10.0.0.76 +add test 10.0.0.47 +add test 10.0.0.8 +add test 10.0.0.105 +add test 10.0.0.73 +add test 10.0.0.60 +add test 10.0.0.75 +add test 10.0.0.7 +add test 10.0.0.46 +add test 10.0.0.39 +add test 10.0.0.99 +add test 10.0.0.51 +add test 10.0.0.54 +add test 10.0.0.9 +add test 10.0.0.103 +add test 10.0.0.5 +add test 10.0.0.124 +add test 10.0.0.52 +add test 10.0.0.1 +add test 10.0.0.125 +add test 10.0.0.117 +add test 10.0.0.72 +add test 10.0.0.127 +add test 10.0.0.63 +add test 10.0.0.27 +add test 10.0.0.21 +add test 10.0.0.91 +add test 10.0.0.74 +add test 10.0.0.30 +add test 10.0.0.23 +add test 10.0.0.95 +add test 10.0.0.120 +add test 10.0.0.89 +add test 10.0.0.24 +add test 10.0.0.10 +add test 10.0.0.96 +add test 10.0.0.92 +add test 10.0.0.71 +add test 10.0.0.34 +add test 10.0.0.67 +add test 10.0.0.59 +add test 10.0.0.4 +add test 10.0.0.79 +add test 10.0.0.13 +add test 10.0.0.100 +add test 10.0.0.111 +add test 10.0.0.58 +add test 10.0.0.106 +add test 10.0.0.107 +add test 10.0.0.44 +add test 10.0.0.40 +add test 10.0.0.50 +add test 10.0.0.118 +add test 10.0.0.87 +add test 10.0.0.3 +add test 10.0.0.49 +add test 10.0.0.126 +add test 10.0.0.109 +add test 10.0.0.55 +add test 10.0.0.102 +add test 10.0.0.11 +add test 10.0.0.16 +add test 10.0.0.97 +add test 10.0.0.115 +add test 10.0.0.93 +add test 10.0.0.86 +add test 10.0.0.113 +add test 10.0.0.53 +add test 10.0.0.110 +add test 10.0.0.65 +add test 10.0.0.0 +add test 10.0.0.15 +add test 10.0.0.62 +add test 10.0.0.90 +add test 10.0.0.108 +add test 10.0.0.81 +add test 10.0.0.128 +add test 10.0.0.64 +add test 10.0.0.61 +add test 10.0.0.88 +add test 10.0.0.104 +add test 10.0.0.26 +add test 10.0.0.36 +add test 10.0.0.78 +add test 10.0.0.14 +add test 10.0.0.98 +add test 10.0.0.22 +add test 10.0.0.19 diff --git a/tests/iphash.t.restore.old b/tests/iphash.t.restore.old new file mode 100644 index 0000000..fd915cc --- /dev/null +++ b/tests/iphash.t.restore.old @@ -0,0 +1,131 @@ +-N test iphash --hashsize 128 +-A test 10.0.0.0 +-A test 10.0.0.1 +-A test 10.0.0.10 +-A test 10.0.0.100 +-A test 10.0.0.101 +-A test 10.0.0.102 +-A test 10.0.0.103 +-A test 10.0.0.104 +-A test 10.0.0.105 +-A test 10.0.0.106 +-A test 10.0.0.107 +-A test 10.0.0.108 +-A test 10.0.0.109 +-A test 10.0.0.11 +-A test 10.0.0.110 +-A test 10.0.0.111 +-A test 10.0.0.112 +-A test 10.0.0.113 +-A test 10.0.0.114 +-A test 10.0.0.115 +-A test 10.0.0.116 +-A test 10.0.0.117 +-A test 10.0.0.118 +-A test 10.0.0.119 +-A test 10.0.0.12 +-A test 10.0.0.120 +-A test 10.0.0.121 +-A test 10.0.0.122 +-A test 10.0.0.123 +-A test 10.0.0.124 +-A test 10.0.0.125 +-A test 10.0.0.126 +-A test 10.0.0.127 +-A test 10.0.0.128 +-A test 10.0.0.13 +-A test 10.0.0.14 +-A test 10.0.0.15 +-A test 10.0.0.16 +-A test 10.0.0.17 +-A test 10.0.0.18 +-A test 10.0.0.19 +-A test 10.0.0.2 +-A test 10.0.0.20 +-A test 10.0.0.21 +-A test 10.0.0.22 +-A test 10.0.0.23 +-A test 10.0.0.24 +-A test 10.0.0.25 +-A test 10.0.0.26 +-A test 10.0.0.27 +-A test 10.0.0.28 +-A test 10.0.0.29 +-A test 10.0.0.3 +-A test 10.0.0.30 +-A test 10.0.0.31 +-A test 10.0.0.32 +-A test 10.0.0.33 +-A test 10.0.0.34 +-A test 10.0.0.35 +-A test 10.0.0.36 +-A test 10.0.0.37 +-A test 10.0.0.38 +-A test 10.0.0.39 +-A test 10.0.0.4 +-A test 10.0.0.40 +-A test 10.0.0.41 +-A test 10.0.0.42 +-A test 10.0.0.43 +-A test 10.0.0.44 +-A test 10.0.0.45 +-A test 10.0.0.46 +-A test 10.0.0.47 +-A test 10.0.0.48 +-A test 10.0.0.49 +-A test 10.0.0.5 +-A test 10.0.0.50 +-A test 10.0.0.51 +-A test 10.0.0.52 +-A test 10.0.0.53 +-A test 10.0.0.54 +-A test 10.0.0.55 +-A test 10.0.0.56 +-A test 10.0.0.57 +-A test 10.0.0.58 +-A test 10.0.0.59 +-A test 10.0.0.6 +-A test 10.0.0.60 +-A test 10.0.0.61 +-A test 10.0.0.62 +-A test 10.0.0.63 +-A test 10.0.0.64 +-A test 10.0.0.65 +-A test 10.0.0.66 +-A test 10.0.0.67 +-A test 10.0.0.68 +-A test 10.0.0.69 +-A test 10.0.0.7 +-A test 10.0.0.70 +-A test 10.0.0.71 +-A test 10.0.0.72 +-A test 10.0.0.73 +-A test 10.0.0.74 +-A test 10.0.0.75 +-A test 10.0.0.76 +-A test 10.0.0.77 +-A test 10.0.0.78 +-A test 10.0.0.79 +-A test 10.0.0.8 +-A test 10.0.0.80 +-A test 10.0.0.81 +-A test 10.0.0.82 +-A test 10.0.0.83 +-A test 10.0.0.84 +-A test 10.0.0.85 +-A test 10.0.0.86 +-A test 10.0.0.87 +-A test 10.0.0.88 +-A test 10.0.0.89 +-A test 10.0.0.9 +-A test 10.0.0.90 +-A test 10.0.0.91 +-A test 10.0.0.92 +-A test 10.0.0.93 +-A test 10.0.0.94 +-A test 10.0.0.95 +-A test 10.0.0.96 +-A test 10.0.0.97 +-A test 10.0.0.98 +-A test 10.0.0.99 +COMMIT diff --git a/tests/iphash.t.restore.sorted b/tests/iphash.t.restore.sorted new file mode 100644 index 0000000..5bd53a2 --- /dev/null +++ b/tests/iphash.t.restore.sorted @@ -0,0 +1,389 @@ +create test hash:ip family inet hashsize 128 maxelem 65536 +add test 10.0.0.0 +add test 10.0.0.1 +add test 10.0.0.10 +add test 10.0.0.100 +add test 10.0.0.101 +add test 10.0.0.102 +add test 10.0.0.103 +add test 10.0.0.104 +add test 10.0.0.105 +add test 10.0.0.106 +add test 10.0.0.107 +add test 10.0.0.108 +add test 10.0.0.109 +add test 10.0.0.11 +add test 10.0.0.110 +add test 10.0.0.111 +add test 10.0.0.112 +add test 10.0.0.113 +add test 10.0.0.114 +add test 10.0.0.115 +add test 10.0.0.116 +add test 10.0.0.117 +add test 10.0.0.118 +add test 10.0.0.119 +add test 10.0.0.12 +add test 10.0.0.120 +add test 10.0.0.121 +add test 10.0.0.122 +add test 10.0.0.123 +add test 10.0.0.124 +add test 10.0.0.125 +add test 10.0.0.126 +add test 10.0.0.127 +add test 10.0.0.128 +add test 10.0.0.13 +add test 10.0.0.14 +add test 10.0.0.15 +add test 10.0.0.16 +add test 10.0.0.17 +add test 10.0.0.18 +add test 10.0.0.19 +add test 10.0.0.2 +add test 10.0.0.20 +add test 10.0.0.21 +add test 10.0.0.22 +add test 10.0.0.23 +add test 10.0.0.24 +add test 10.0.0.25 +add test 10.0.0.26 +add test 10.0.0.27 +add test 10.0.0.28 +add test 10.0.0.29 +add test 10.0.0.3 +add test 10.0.0.30 +add test 10.0.0.31 +add test 10.0.0.32 +add test 10.0.0.33 +add test 10.0.0.34 +add test 10.0.0.35 +add test 10.0.0.36 +add test 10.0.0.37 +add test 10.0.0.38 +add test 10.0.0.39 +add test 10.0.0.4 +add test 10.0.0.40 +add test 10.0.0.41 +add test 10.0.0.42 +add test 10.0.0.43 +add test 10.0.0.44 +add test 10.0.0.45 +add test 10.0.0.46 +add test 10.0.0.47 +add test 10.0.0.48 +add test 10.0.0.49 +add test 10.0.0.5 +add test 10.0.0.50 +add test 10.0.0.51 +add test 10.0.0.52 +add test 10.0.0.53 +add test 10.0.0.54 +add test 10.0.0.55 +add test 10.0.0.56 +add test 10.0.0.57 +add test 10.0.0.58 +add test 10.0.0.59 +add test 10.0.0.6 +add test 10.0.0.60 +add test 10.0.0.61 +add test 10.0.0.62 +add test 10.0.0.63 +add test 10.0.0.64 +add test 10.0.0.65 +add test 10.0.0.66 +add test 10.0.0.67 +add test 10.0.0.68 +add test 10.0.0.69 +add test 10.0.0.7 +add test 10.0.0.70 +add test 10.0.0.71 +add test 10.0.0.72 +add test 10.0.0.73 +add test 10.0.0.74 +add test 10.0.0.75 +add test 10.0.0.76 +add test 10.0.0.77 +add test 10.0.0.78 +add test 10.0.0.79 +add test 10.0.0.8 +add test 10.0.0.80 +add test 10.0.0.81 +add test 10.0.0.82 +add test 10.0.0.83 +add test 10.0.0.84 +add test 10.0.0.85 +add test 10.0.0.86 +add test 10.0.0.87 +add test 10.0.0.88 +add test 10.0.0.89 +add test 10.0.0.9 +add test 10.0.0.90 +add test 10.0.0.91 +add test 10.0.0.92 +add test 10.0.0.93 +add test 10.0.0.94 +add test 10.0.0.95 +add test 10.0.0.96 +add test 10.0.0.97 +add test 10.0.0.98 +add test 10.0.0.99 +create test2 hash:ip family inet hashsize 128 maxelem 65536 +add test2 20.0.0.0 +add test2 20.0.0.1 +add test2 20.0.0.10 +add test2 20.0.0.100 +add test2 20.0.0.101 +add test2 20.0.0.102 +add test2 20.0.0.103 +add test2 20.0.0.104 +add test2 20.0.0.105 +add test2 20.0.0.106 +add test2 20.0.0.107 +add test2 20.0.0.108 +add test2 20.0.0.109 +add test2 20.0.0.11 +add test2 20.0.0.110 +add test2 20.0.0.111 +add test2 20.0.0.112 +add test2 20.0.0.113 +add test2 20.0.0.114 +add test2 20.0.0.115 +add test2 20.0.0.116 +add test2 20.0.0.117 +add test2 20.0.0.118 +add test2 20.0.0.119 +add test2 20.0.0.12 +add test2 20.0.0.120 +add test2 20.0.0.121 +add test2 20.0.0.122 +add test2 20.0.0.123 +add test2 20.0.0.124 +add test2 20.0.0.125 +add test2 20.0.0.126 +add test2 20.0.0.127 +add test2 20.0.0.128 +add test2 20.0.0.13 +add test2 20.0.0.14 +add test2 20.0.0.15 +add test2 20.0.0.16 +add test2 20.0.0.17 +add test2 20.0.0.18 +add test2 20.0.0.19 +add test2 20.0.0.2 +add test2 20.0.0.20 +add test2 20.0.0.21 +add test2 20.0.0.22 +add test2 20.0.0.23 +add test2 20.0.0.24 +add test2 20.0.0.25 +add test2 20.0.0.26 +add test2 20.0.0.27 +add test2 20.0.0.28 +add test2 20.0.0.29 +add test2 20.0.0.3 +add test2 20.0.0.30 +add test2 20.0.0.31 +add test2 20.0.0.32 +add test2 20.0.0.33 +add test2 20.0.0.34 +add test2 20.0.0.35 +add test2 20.0.0.36 +add test2 20.0.0.37 +add test2 20.0.0.38 +add test2 20.0.0.39 +add test2 20.0.0.4 +add test2 20.0.0.40 +add test2 20.0.0.41 +add test2 20.0.0.42 +add test2 20.0.0.43 +add test2 20.0.0.44 +add test2 20.0.0.45 +add test2 20.0.0.46 +add test2 20.0.0.47 +add test2 20.0.0.48 +add test2 20.0.0.49 +add test2 20.0.0.5 +add test2 20.0.0.50 +add test2 20.0.0.51 +add test2 20.0.0.52 +add test2 20.0.0.53 +add test2 20.0.0.54 +add test2 20.0.0.55 +add test2 20.0.0.56 +add test2 20.0.0.57 +add test2 20.0.0.58 +add test2 20.0.0.59 +add test2 20.0.0.6 +add test2 20.0.0.60 +add test2 20.0.0.61 +add test2 20.0.0.62 +add test2 20.0.0.63 +add test2 20.0.0.64 +add test2 20.0.0.65 +add test2 20.0.0.66 +add test2 20.0.0.67 +add test2 20.0.0.68 +add test2 20.0.0.69 +add test2 20.0.0.7 +add test2 20.0.0.70 +add test2 20.0.0.71 +add test2 20.0.0.72 +add test2 20.0.0.73 +add test2 20.0.0.74 +add test2 20.0.0.75 +add test2 20.0.0.76 +add test2 20.0.0.77 +add test2 20.0.0.78 +add test2 20.0.0.79 +add test2 20.0.0.8 +add test2 20.0.0.80 +add test2 20.0.0.81 +add test2 20.0.0.82 +add test2 20.0.0.83 +add test2 20.0.0.84 +add test2 20.0.0.85 +add test2 20.0.0.86 +add test2 20.0.0.87 +add test2 20.0.0.88 +add test2 20.0.0.89 +add test2 20.0.0.9 +add test2 20.0.0.90 +add test2 20.0.0.91 +add test2 20.0.0.92 +add test2 20.0.0.93 +add test2 20.0.0.94 +add test2 20.0.0.95 +add test2 20.0.0.96 +add test2 20.0.0.97 +add test2 20.0.0.98 +add test2 20.0.0.99 +add test2 30.0.0.0 +add test2 30.0.0.1 +add test2 30.0.0.10 +add test2 30.0.0.100 +add test2 30.0.0.101 +add test2 30.0.0.102 +add test2 30.0.0.103 +add test2 30.0.0.104 +add test2 30.0.0.105 +add test2 30.0.0.106 +add test2 30.0.0.107 +add test2 30.0.0.108 +add test2 30.0.0.109 +add test2 30.0.0.11 +add test2 30.0.0.110 +add test2 30.0.0.111 +add test2 30.0.0.112 +add test2 30.0.0.113 +add test2 30.0.0.114 +add test2 30.0.0.115 +add test2 30.0.0.116 +add test2 30.0.0.117 +add test2 30.0.0.118 +add test2 30.0.0.119 +add test2 30.0.0.12 +add test2 30.0.0.120 +add test2 30.0.0.121 +add test2 30.0.0.122 +add test2 30.0.0.123 +add test2 30.0.0.124 +add test2 30.0.0.125 +add test2 30.0.0.126 +add test2 30.0.0.127 +add test2 30.0.0.128 +add test2 30.0.0.13 +add test2 30.0.0.14 +add test2 30.0.0.15 +add test2 30.0.0.16 +add test2 30.0.0.17 +add test2 30.0.0.18 +add test2 30.0.0.19 +add test2 30.0.0.2 +add test2 30.0.0.20 +add test2 30.0.0.21 +add test2 30.0.0.22 +add test2 30.0.0.23 +add test2 30.0.0.24 +add test2 30.0.0.25 +add test2 30.0.0.26 +add test2 30.0.0.27 +add test2 30.0.0.28 +add test2 30.0.0.29 +add test2 30.0.0.3 +add test2 30.0.0.30 +add test2 30.0.0.31 +add test2 30.0.0.32 +add test2 30.0.0.33 +add test2 30.0.0.34 +add test2 30.0.0.35 +add test2 30.0.0.36 +add test2 30.0.0.37 +add test2 30.0.0.38 +add test2 30.0.0.39 +add test2 30.0.0.4 +add test2 30.0.0.40 +add test2 30.0.0.41 +add test2 30.0.0.42 +add test2 30.0.0.43 +add test2 30.0.0.44 +add test2 30.0.0.45 +add test2 30.0.0.46 +add test2 30.0.0.47 +add test2 30.0.0.48 +add test2 30.0.0.49 +add test2 30.0.0.5 +add test2 30.0.0.50 +add test2 30.0.0.51 +add test2 30.0.0.52 +add test2 30.0.0.53 +add test2 30.0.0.54 +add test2 30.0.0.55 +add test2 30.0.0.56 +add test2 30.0.0.57 +add test2 30.0.0.58 +add test2 30.0.0.59 +add test2 30.0.0.6 +add test2 30.0.0.60 +add test2 30.0.0.61 +add test2 30.0.0.62 +add test2 30.0.0.63 +add test2 30.0.0.64 +add test2 30.0.0.65 +add test2 30.0.0.66 +add test2 30.0.0.67 +add test2 30.0.0.68 +add test2 30.0.0.69 +add test2 30.0.0.7 +add test2 30.0.0.70 +add test2 30.0.0.71 +add test2 30.0.0.72 +add test2 30.0.0.73 +add test2 30.0.0.74 +add test2 30.0.0.75 +add test2 30.0.0.76 +add test2 30.0.0.77 +add test2 30.0.0.78 +add test2 30.0.0.79 +add test2 30.0.0.8 +add test2 30.0.0.80 +add test2 30.0.0.81 +add test2 30.0.0.82 +add test2 30.0.0.83 +add test2 30.0.0.84 +add test2 30.0.0.85 +add test2 30.0.0.86 +add test2 30.0.0.87 +add test2 30.0.0.88 +add test2 30.0.0.89 +add test2 30.0.0.9 +add test2 30.0.0.90 +add test2 30.0.0.91 +add test2 30.0.0.92 +add test2 30.0.0.93 +add test2 30.0.0.94 +add test2 30.0.0.95 +add test2 30.0.0.96 +add test2 30.0.0.97 +add test2 30.0.0.98 +add test2 30.0.0.99 diff --git a/tests/ipmap.t b/tests/ipmap.t new file mode 100644 index 0000000..7ae141c --- /dev/null +++ b/tests/ipmap.t @@ -0,0 +1,161 @@ +# Range: Check syntax error: missing range/from-to +2 ipset -N test ipmap +# Range: Check syntax error: missing --from +2 ipset -N test ipmap --to 2.1.0.1 +# Range: Check syntax error: missing --to +2 ipset -N test ipmap --from 2.1.0.1 +# Range: Catch invalid IPv4 address +1 ipset -N test ipmap --from 2.0.0.256 --to 2.1.0.1 +# Range: Try to create from an invalid range +1 ipset -N test ipmap --from 2.0.0.1 --to 2.1.0.1 +# Range: Create a set from a valid range +0 ipset -N test ipmap --from 2.0.0.1 --to 2.1.0.0 +# Range: Add lower boundary +0 ipset -A test 2.0.0.1 +# Range: Add upper boundary +0 ipset -A test 2.1.0.0 +# Range: Test lower boundary +0 ipset -T test 2.0.0.1 +# Range: Test upper boundary +0 ipset -T test 2.1.0.0 +# Range: Test element not added to the set +1 ipset -T test 2.0.0.2 +# Range: Test element before lower boundary +1 ipset -T test 2.0.0.0 +# Range: Test element after upper boundary +1 ipset -T test 2.1.0.1 +# Range: Try to add element before lower boundary +1 ipset -A test 2.0.0.0 +# Range: Try to add element after upper boundary +1 ipset -A test 2.1.0.1 +# Range: Delete element not added to the set +1 ipset -D test 2.0.0.2 +# Range: Add element in the middle +0 ipset -A test 2.0.0.128 +# Range: Delete the same element +0 ipset -D test 2.0.0.128 +# Range: Add a range of elements +0 ipset -A test 2.0.0.128-2.0.0.131 +# Range: Save set +0 ipset -S test > ipmap.t.restore +# Range: Destroy set +0 ipset -X test +# Range: Restore set and catch error +1 sed 's/2.0.0.131/222.0.0.131/' < ipmap.t.restore | ipset -R +# Range: Check returned error line number +0 num=`grep 'in line' < .foo.err | sed 's/.* in line //' | cut -d : -f 1` && test $num -eq 6 +# Range: Destroy set +0 ipset -X test +# Range: Restore set +0 ipset -R < ipmap.t.restore && rm ipmap.t.restore +# Range: List set +0 ipset -L test | grep -v Revision: > .foo +# Range: Check listing +0 diff -u -I 'Size in memory.*' .foo ipmap.t.list0 +# Range: Delete a range of elements +0 ipset -! -D test 2.0.0.128-2.0.0.132 +# Range: List set +0 ipset -L test | grep -v Revision: > .foo +# Range: Check listing +0 diff -u -I 'Size in memory.*' .foo ipmap.t.list1 +# Range: Flush test set +0 ipset -F test +# Range: Delete test set +0 ipset -X test +# Network: Try to create a set from an invalid network +1 ipset -N test ipmap --network 2.0.0.0/15 +# Network: Create a set from a valid network +0 ipset -N test ipmap --network 2.0.0.0/16 +# Network: Add lower boundary +0 ipset -A test 2.0.0.0 +# Network: Add upper boundary +0 ipset -A test 2.0.255.255 +# Network: Test lower boundary +0 ipset -T test 2.0.0.0 +# Network: Test upper boundary +0 ipset -T test 2.0.255.255 +# Network: Test element not added to the set +1 ipset -T test 2.0.0.1 +# Network: Test element before lower boundary +1 ipset -T test 1.255.255.255 +# Network: Test element after upper boundary +1 ipset -T test 2.1.0.0 +# Network: Try to add element before lower boundary +1 ipset -A test 1.255.255.255 +# Network: Try to add element after upper boundary +1 ipset -A test 2.1.0.0 +# Network: Delete element not added to the set +1 ipset -D test 2.0.0.2 +# Network: Add element in the middle +0 ipset -A test 2.0.0.128 +# Network: Delete the same element +0 ipset -D test 2.0.0.128 +# Network: List set +0 ipset -L test | grep -v Revision: > .foo +# Network: Check listing +0 diff -u -I 'Size in memory.*' .foo ipmap.t.list2 +# Network: Flush test set +0 ipset -F test +# Network: Delete test set +0 ipset -X test +# Subnets: Create a set to store networks +0 ipset -N test ipmap --network 10.0.0.0/8 --netmask 24 +# Subnets: Add lower boundary +0 ipset -A test 10.0.0.0 +# Subnets: Add upper boundary +0 ipset -A test 10.255.255.255 +# Subnets: Test lower boundary +0 ipset -T test 10.0.0.255 +# Subnets: Test upper boundary +0 ipset -T test 10.255.255.0 +# Subnets: Test element not added to the set +1 ipset -T test 10.1.0.0 +# Subnets: Test element before lower boundary +1 ipset -T test 9.255.255.255 +# Subnets: Test element after upper boundary +1 ipset -T test 11.0.0.0 +# Subnets: Try to add element before lower boundary +1 ipset -A test 9.255.255.255 +# Subnets: Try to add element after upper boundary +1 ipset -A test 11.0.0.0 +# Subnets: Try to delete element not added to the set +1 ipset -D test 10.2.0.0 +# Subnets: Add element to the set +0 ipset -A test 10.2.0.0 +# Subnets: Delete the same element from the set +0 ipset -D test 10.2.0.0 +# Subnets: Add a subnet of subnets +0 ipset -A test 10.8.0.0/16 +# Subnets: List set +0 ipset -L test | grep -v Revision: > .foo +# Subnets: Check listing +0 diff -u -I 'Size in memory.*' .foo ipmap.t.list3 +# Subnets: FLush test set +0 ipset -F test +# Subnets: Delete test set +0 ipset -X test +# Full: Create full IPv4 space with /16 networks +0 ipset -N test ipmap --network 0.0.0.0/0 --netmask 16 +# Full: Add lower boundary +0 ipset -A test 0.0.0.0 +# Full: Add upper boundary +0 ipset -A test 255.255.0.0 +# Full: Test lower boundary +0 ipset -T test 0.0.0.0 +# Full: Test upper boundary +0 ipset -T test 255.255.255.255 +# Full: Test element not added to the set +1 ipset -T test 0.1.0.0 +# Full: Delete element not added to the set +1 ipset -T test 0.1.0.0 +# Full: Add element to the set +0 ipset -A test 0.1.0.0 +# Full: Delete same element +0 ipset -D test 0.1.0.0 +# Full: List set +0 ipset -L test | grep -v Revision: > .foo +# Full: Check listing +0 diff -u -I 'Size in memory.*' .foo ipmap.t.list4 +# Full: Delete test set +0 ipset -X test +# eof diff --git a/tests/ipmap.t.list0 b/tests/ipmap.t.list0 new file mode 100644 index 0000000..d3b99a8 --- /dev/null +++ b/tests/ipmap.t.list0 @@ -0,0 +1,13 @@ +Name: test +Type: bitmap:ip +Header: range 2.0.0.1-2.1.0.0 +Size in memory: 8352 +References: 0 +Number of entries: 6 +Members: +2.0.0.1 +2.0.0.128 +2.0.0.129 +2.0.0.130 +2.0.0.131 +2.1.0.0 diff --git a/tests/ipmap.t.list1 b/tests/ipmap.t.list1 new file mode 100644 index 0000000..f9b311d --- /dev/null +++ b/tests/ipmap.t.list1 @@ -0,0 +1,9 @@ +Name: test +Type: bitmap:ip +Header: range 2.0.0.1-2.1.0.0 +Size in memory: 8352 +References: 0 +Number of entries: 2 +Members: +2.0.0.1 +2.1.0.0 diff --git a/tests/ipmap.t.list2 b/tests/ipmap.t.list2 new file mode 100644 index 0000000..c2c5691 --- /dev/null +++ b/tests/ipmap.t.list2 @@ -0,0 +1,9 @@ +Name: test +Type: bitmap:ip +Header: range 2.0.0.0-2.0.255.255 +Size in memory: 8352 +References: 0 +Number of entries: 2 +Members: +2.0.0.0 +2.0.255.255 diff --git a/tests/ipmap.t.list3 b/tests/ipmap.t.list3 new file mode 100644 index 0000000..3586211 --- /dev/null +++ b/tests/ipmap.t.list3 @@ -0,0 +1,265 @@ +Name: test +Type: bitmap:ip +Header: range 10.0.0.0-10.255.255.255 netmask 24 +Size in memory: 8352 +References: 0 +Number of entries: 258 +Members: +10.0.0.0 +10.8.0.0 +10.8.1.0 +10.8.2.0 +10.8.3.0 +10.8.4.0 +10.8.5.0 +10.8.6.0 +10.8.7.0 +10.8.8.0 +10.8.9.0 +10.8.10.0 +10.8.11.0 +10.8.12.0 +10.8.13.0 +10.8.14.0 +10.8.15.0 +10.8.16.0 +10.8.17.0 +10.8.18.0 +10.8.19.0 +10.8.20.0 +10.8.21.0 +10.8.22.0 +10.8.23.0 +10.8.24.0 +10.8.25.0 +10.8.26.0 +10.8.27.0 +10.8.28.0 +10.8.29.0 +10.8.30.0 +10.8.31.0 +10.8.32.0 +10.8.33.0 +10.8.34.0 +10.8.35.0 +10.8.36.0 +10.8.37.0 +10.8.38.0 +10.8.39.0 +10.8.40.0 +10.8.41.0 +10.8.42.0 +10.8.43.0 +10.8.44.0 +10.8.45.0 +10.8.46.0 +10.8.47.0 +10.8.48.0 +10.8.49.0 +10.8.50.0 +10.8.51.0 +10.8.52.0 +10.8.53.0 +10.8.54.0 +10.8.55.0 +10.8.56.0 +10.8.57.0 +10.8.58.0 +10.8.59.0 +10.8.60.0 +10.8.61.0 +10.8.62.0 +10.8.63.0 +10.8.64.0 +10.8.65.0 +10.8.66.0 +10.8.67.0 +10.8.68.0 +10.8.69.0 +10.8.70.0 +10.8.71.0 +10.8.72.0 +10.8.73.0 +10.8.74.0 +10.8.75.0 +10.8.76.0 +10.8.77.0 +10.8.78.0 +10.8.79.0 +10.8.80.0 +10.8.81.0 +10.8.82.0 +10.8.83.0 +10.8.84.0 +10.8.85.0 +10.8.86.0 +10.8.87.0 +10.8.88.0 +10.8.89.0 +10.8.90.0 +10.8.91.0 +10.8.92.0 +10.8.93.0 +10.8.94.0 +10.8.95.0 +10.8.96.0 +10.8.97.0 +10.8.98.0 +10.8.99.0 +10.8.100.0 +10.8.101.0 +10.8.102.0 +10.8.103.0 +10.8.104.0 +10.8.105.0 +10.8.106.0 +10.8.107.0 +10.8.108.0 +10.8.109.0 +10.8.110.0 +10.8.111.0 +10.8.112.0 +10.8.113.0 +10.8.114.0 +10.8.115.0 +10.8.116.0 +10.8.117.0 +10.8.118.0 +10.8.119.0 +10.8.120.0 +10.8.121.0 +10.8.122.0 +10.8.123.0 +10.8.124.0 +10.8.125.0 +10.8.126.0 +10.8.127.0 +10.8.128.0 +10.8.129.0 +10.8.130.0 +10.8.131.0 +10.8.132.0 +10.8.133.0 +10.8.134.0 +10.8.135.0 +10.8.136.0 +10.8.137.0 +10.8.138.0 +10.8.139.0 +10.8.140.0 +10.8.141.0 +10.8.142.0 +10.8.143.0 +10.8.144.0 +10.8.145.0 +10.8.146.0 +10.8.147.0 +10.8.148.0 +10.8.149.0 +10.8.150.0 +10.8.151.0 +10.8.152.0 +10.8.153.0 +10.8.154.0 +10.8.155.0 +10.8.156.0 +10.8.157.0 +10.8.158.0 +10.8.159.0 +10.8.160.0 +10.8.161.0 +10.8.162.0 +10.8.163.0 +10.8.164.0 +10.8.165.0 +10.8.166.0 +10.8.167.0 +10.8.168.0 +10.8.169.0 +10.8.170.0 +10.8.171.0 +10.8.172.0 +10.8.173.0 +10.8.174.0 +10.8.175.0 +10.8.176.0 +10.8.177.0 +10.8.178.0 +10.8.179.0 +10.8.180.0 +10.8.181.0 +10.8.182.0 +10.8.183.0 +10.8.184.0 +10.8.185.0 +10.8.186.0 +10.8.187.0 +10.8.188.0 +10.8.189.0 +10.8.190.0 +10.8.191.0 +10.8.192.0 +10.8.193.0 +10.8.194.0 +10.8.195.0 +10.8.196.0 +10.8.197.0 +10.8.198.0 +10.8.199.0 +10.8.200.0 +10.8.201.0 +10.8.202.0 +10.8.203.0 +10.8.204.0 +10.8.205.0 +10.8.206.0 +10.8.207.0 +10.8.208.0 +10.8.209.0 +10.8.210.0 +10.8.211.0 +10.8.212.0 +10.8.213.0 +10.8.214.0 +10.8.215.0 +10.8.216.0 +10.8.217.0 +10.8.218.0 +10.8.219.0 +10.8.220.0 +10.8.221.0 +10.8.222.0 +10.8.223.0 +10.8.224.0 +10.8.225.0 +10.8.226.0 +10.8.227.0 +10.8.228.0 +10.8.229.0 +10.8.230.0 +10.8.231.0 +10.8.232.0 +10.8.233.0 +10.8.234.0 +10.8.235.0 +10.8.236.0 +10.8.237.0 +10.8.238.0 +10.8.239.0 +10.8.240.0 +10.8.241.0 +10.8.242.0 +10.8.243.0 +10.8.244.0 +10.8.245.0 +10.8.246.0 +10.8.247.0 +10.8.248.0 +10.8.249.0 +10.8.250.0 +10.8.251.0 +10.8.252.0 +10.8.253.0 +10.8.254.0 +10.8.255.0 +10.255.255.0 diff --git a/tests/ipmap.t.list4 b/tests/ipmap.t.list4 new file mode 100644 index 0000000..2042ee6 --- /dev/null +++ b/tests/ipmap.t.list4 @@ -0,0 +1,9 @@ +Name: test +Type: bitmap:ip +Header: range 0.0.0.0-255.255.255.255 netmask 16 +Size in memory: 8352 +References: 0 +Number of entries: 2 +Members: +0.0.0.0 +255.255.0.0 diff --git a/tests/ipmarkhash.t b/tests/ipmarkhash.t new file mode 100644 index 0000000..e96bbfa --- /dev/null +++ b/tests/ipmarkhash.t @@ -0,0 +1,71 @@ +# Create a set from a range (range ignored) +0 ipset -N test ipmarkhash --from 2.0.0.1 --to 2.1.0.0 +# Destroy set +0 ipset -X test +# Create a set +0 ipset -N test ipmarkhash +# Add partly zero valued element +0 ipset -A test 2.0.0.1,0x0 +# Test partly zero valued element +0 ipset -T test 2.0.0.1,0x0 +# Delete partly zero valued element +0 ipset -D test 2.0.0.1,0x0 +# Add first random value +0 ipset -A test 2.0.0.1,0x5 +# Add second random value +0 ipset -A test 2.1.0.0,0x80 +# Test first random value +0 ipset -T test 2.0.0.1,0x5 +# Test second random value +0 ipset -T test 2.1.0.0,0x80 +# Test value not added to the set +1 ipset -T test 2.0.0.1,0x4 +# Delete value not added to the set +1 ipset -D test 2.0.0.1,0x6 +# Test value before first random value +1 ipset -T test 2.0.0.0,0x5 +# Test value after second random value +1 ipset -T test 2.1.0.1,0x80 +# Try to add value before first random value +0 ipset -A test 2.0.0.0,0x5 +# Try to add value after second random value +0 ipset -A test 2.1.0.1,0x80 +# List set +0 ipset -L test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo ipmarkhash.t.list0 +# Flush test set +0 ipset -F test +# Delete test set +0 ipset -X test +# Create a set from a network (network ignored) +0 ipset -N test ipmarkhash --network 2.0.0.0/16 +# Add first random value +0 ipset -A test 2.0.0.0,0x5 +# Add second random value +0 ipset -A test 2.0.255.255,0x80 +# Test first random value +0 ipset -T test 2.0.0.0,0x5 +# Test second random value +0 ipset -T test 2.0.255.255,0x80 +# Test value not added to the set +1 ipset -T test 2.0.0.0,0x4 +# Delete value not added to the set +1 ipset -D test 2.0.0.0,0x6 +# Test value before first random value +1 ipset -T test 1.255.255.255,0x5 +# Test value after second random value +1 ipset -T test 2.1.0.0,0x80 +# Try to add value before first random value +0 ipset -A test 1.255.255.255,0x5 +# Try to add value after second random value +0 ipset -A test 2.1.0.0,0x80 +# List set +0 ipset -L test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo ipmarkhash.t.list1 +# Flush test set +0 ipset -F test +# Delete test set +0 ipset -X test +# eof diff --git a/tests/ipmarkhash.t.list0 b/tests/ipmarkhash.t.list0 new file mode 100644 index 0000000..9ebf116 --- /dev/null +++ b/tests/ipmarkhash.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:ip,mark +Header: family inet markmask 0xffffffff hashsize 1024 maxelem 65536 +Size in memory: 384 +References: 0 +Number of entries: 4 +Members: +2.0.0.0,0x00000005 +2.0.0.1,0x00000005 +2.1.0.0,0x00000080 +2.1.0.1,0x00000080 diff --git a/tests/ipmarkhash.t.list1 b/tests/ipmarkhash.t.list1 new file mode 100644 index 0000000..af39998 --- /dev/null +++ b/tests/ipmarkhash.t.list1 @@ -0,0 +1,11 @@ +Name: test +Type: hash:ip,mark +Header: family inet markmask 0xffffffff hashsize 1024 maxelem 65536 +Size in memory: 384 +References: 0 +Number of entries: 4 +Members: +1.255.255.255,0x00000005 +2.0.0.0,0x00000005 +2.0.255.255,0x00000080 +2.1.0.0,0x00000080 diff --git a/tests/ipporthash.t b/tests/ipporthash.t new file mode 100644 index 0000000..866c720 --- /dev/null +++ b/tests/ipporthash.t @@ -0,0 +1,71 @@ +# Create a set from a range (range ignored) +0 ipset -N test ipporthash --from 2.0.0.1 --to 2.1.0.0 +# Destroy set +0 ipset -X test +# Create a set +0 ipset -N test ipporthash +# Add partly zero valued element +0 ipset -A test 2.0.0.1,0 +# Test partly zero valued element +0 ipset -T test 2.0.0.1,0 +# Delete partly zero valued element +0 ipset -D test 2.0.0.1,0 +# Add first random value +0 ipset -A test 2.0.0.1,5 +# Add second random value +0 ipset -A test 2.1.0.0,128 +# Test first random value +0 ipset -T test 2.0.0.1,5 +# Test second random value +0 ipset -T test 2.1.0.0,128 +# Test value not added to the set +1 ipset -T test 2.0.0.1,4 +# Delete value not added to the set +1 ipset -D test 2.0.0.1,6 +# Test value before first random value +1 ipset -T test 2.0.0.0,5 +# Test value after second random value +1 ipset -T test 2.1.0.1,128 +# Try to add value before first random value +0 ipset -A test 2.0.0.0,5 +# Try to add value after second random value +0 ipset -A test 2.1.0.1,128 +# List set +0 ipset -L test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo ipporthash.t.list0 +# Flush test set +0 ipset -F test +# Delete test set +0 ipset -X test +# Create a set from a network (network ignored) +0 ipset -N test ipporthash --network 2.0.0.0/16 +# Add first random value +0 ipset -A test 2.0.0.0,5 +# Add second random value +0 ipset -A test 2.0.255.255,128 +# Test first random value +0 ipset -T test 2.0.0.0,5 +# Test second random value +0 ipset -T test 2.0.255.255,128 +# Test value not added to the set +1 ipset -T test 2.0.0.0,4 +# Delete value not added to the set +1 ipset -D test 2.0.0.0,6 +# Test value before first random value +1 ipset -T test 1.255.255.255,5 +# Test value after second random value +1 ipset -T test 2.1.0.0,128 +# Try to add value before first random value +0 ipset -A test 1.255.255.255,5 +# Try to add value after second random value +0 ipset -A test 2.1.0.0,128 +# List set +0 ipset -L test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo ipporthash.t.list1 +# Flush test set +0 ipset -F test +# Delete test set +0 ipset -X test +# eof diff --git a/tests/ipporthash.t.list0 b/tests/ipporthash.t.list0 new file mode 100644 index 0000000..902160f --- /dev/null +++ b/tests/ipporthash.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:ip,port +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 384 +References: 0 +Number of entries: 4 +Members: +2.0.0.0,tcp:5 +2.0.0.1,tcp:5 +2.1.0.0,tcp:128 +2.1.0.1,tcp:128 diff --git a/tests/ipporthash.t.list1 b/tests/ipporthash.t.list1 new file mode 100644 index 0000000..d298cc0 --- /dev/null +++ b/tests/ipporthash.t.list1 @@ -0,0 +1,11 @@ +Name: test +Type: hash:ip,port +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 384 +References: 0 +Number of entries: 4 +Members: +1.255.255.255,tcp:5 +2.0.0.0,tcp:5 +2.0.255.255,tcp:128 +2.1.0.0,tcp:128 diff --git a/tests/ipportiphash.t b/tests/ipportiphash.t new file mode 100644 index 0000000..5632433 --- /dev/null +++ b/tests/ipportiphash.t @@ -0,0 +1,81 @@ +# Create a set from a range (range ignored) +0 ipset -N test ipportiphash --from 2.0.0.1 --to 2.1.0.0 +# Destroy set +0 ipset -X test +# Create a set +0 ipset -N test ipportiphash +# Add partly zero valued element +0 ipset -A test 2.0.0.1,0,0.0.0.0 +# Test partly zero valued element +0 ipset -T test 2.0.0.1,0,0.0.0.0 +# Delete party zero valued element +0 ipset -D test 2.0.0.1,0,0.0.0.0 +# Add almost zero valued element +0 ipset -A test 2.0.0.1,0,0.0.0.1 +# Test almost zero valued element +0 ipset -T test 2.0.0.1,0,0.0.0.1 +# Delete almost zero valued element +0 ipset -D test 2.0.0.1,0,0.0.0.1 +# Add first random value +0 ipset -A test 2.0.0.1,5,1.1.1.1 +# Add second random value +0 ipset -A test 2.1.0.0,128,2.2.2.2 +# Test first random value +0 ipset -T test 2.0.0.1,5,1.1.1.1 +# Test second random value +0 ipset -T test 2.1.0.0,128,2.2.2.2 +# Test value not added to the set +1 ipset -T test 2.0.0.1,5,1.1.1.2 +# Test value not added to the set +1 ipset -T test 2.0.0.1,6,1.1.1.1 +# Test value not added to the set +1 ipset -T test 2.0.0.2,6,1.1.1.1 +# Test value before first random value +1 ipset -T test 2.0.0.0,5,1.1.1.1 +# Test value after second random value +1 ipset -T test 2.1.0.1,128,2.2.2.2 +# Try to add value before first random value +0 ipset -A test 2.0.0.0,5,1.1.1.1 +# Try to add value after second random value +0 ipset -A test 2.1.0.1,128,2.2.2.2 +# List set +0 ipset -L test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo ipportiphash.t.list0 +# Flush test set +0 ipset -F test +# Delete test set +0 ipset -X test +# Create a set from a valid network (network ignored) +0 ipset -N test ipportiphash --network 2.0.0.0/16 +# Add first random value +0 ipset -A test 2.0.0.0,5,1.1.1.1 +# Add second random value +0 ipset -A test 2.0.255.255,128,2.2.2.2 +# Test first random value +0 ipset -T test 2.0.0.0,5,1.1.1.1 +# Test second random value +0 ipset -T test 2.0.255.255,128,2.2.2.2 +# Test value not added to the set +1 ipset -T test 2.0.0.0,5,1.1.1.2 +# Test value not added to the set +1 ipset -T test 2.0.0.0,6,1.1.1.1 +# Test value before first random value +1 ipset -T test 1.255.255.255,5,1.1.1.1 +# Test value after second random value +1 ipset -T test 2.1.0.0,128,2.2.2.2 +# Try to add value before first random value +0 ipset -A test 1.255.255.255,5,1.1.1.1 +# Try to test value before first random value +0 ipset -T test 1.255.255.255,5,1.1.1.1 +# Try to del value before first random value +0 ipset -D test 1.255.255.255,5,1.1.1.1 +# List set +0 ipset -L test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo ipportiphash.t.list1 +# Flush test set +0 ipset -F test +# Delete test set +0 ipset -X test +# eof diff --git a/tests/ipportiphash.t.list0 b/tests/ipportiphash.t.list0 new file mode 100644 index 0000000..bde5356 --- /dev/null +++ b/tests/ipportiphash.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:ip,port,ip +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 456 +References: 0 +Number of entries: 4 +Members: +2.0.0.0,tcp:5,1.1.1.1 +2.0.0.1,tcp:5,1.1.1.1 +2.1.0.0,tcp:128,2.2.2.2 +2.1.0.1,tcp:128,2.2.2.2 diff --git a/tests/ipportiphash.t.list1 b/tests/ipportiphash.t.list1 new file mode 100644 index 0000000..d5cc29e --- /dev/null +++ b/tests/ipportiphash.t.list1 @@ -0,0 +1,9 @@ +Name: test +Type: hash:ip,port,ip +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 296 +References: 0 +Number of entries: 2 +Members: +2.0.0.0,tcp:5,1.1.1.1 +2.0.255.255,tcp:128,2.2.2.2 diff --git a/tests/ipportnethash.t b/tests/ipportnethash.t new file mode 100644 index 0000000..b34d46d --- /dev/null +++ b/tests/ipportnethash.t @@ -0,0 +1,101 @@ +# Range: Create a set from a range (range ignored) +0 ipset -N test ipportnethash --from 2.0.0.1 --to 2.1.0.0 +# Range: Add zero valued element +1 ipset -A test 2.0.0.1,0,0.0.0.0/0 +# Range: Test zero valued element +1 ipset -T test 2.0.0.1,0,0.0.0.0/0 +# Range: Delete zero valued element +1 ipset -D test 2.0.0.1,0,0.0.0.0/0 +# Range: Add almost zero valued element +0 ipset -A test 2.0.0.1,0,0.0.0.0/24 +# Range: Test almost zero valued element +0 ipset -T test 2.0.0.1,0,0.0.0.0/24 +# Range: Delete almost zero valued element +0 ipset -D test 2.0.0.1,0,0.0.0.0/24 +# Range: Add first random value +0 ipset -A test 2.0.0.1,5,1.1.1.1/24 +# Range: Add second random value +0 ipset -A test 2.1.0.0,128,2.2.2.2/12 +# Range: Test first random value +0 ipset -T test 2.0.0.1,5,1.1.1.2 +# Range: Test second random value +0 ipset -T test 2.1.0.0,128,2.2.2.0 +# Range: Test value not added to the set +1 ipset -T test 2.0.0.1,5,1.1.0.255 +# Range: Test value not added to the set +1 ipset -T test 2.0.0.1,6,1.1.1.1 +# Range: Test value not added to the set +1 ipset -T test 2.0.0.2,6,1.1.1.1 +# Range: Test value before first random value +1 ipset -T test 2.0.0.0,5,1.1.1.1 +# Range: Test value after second random value +1 ipset -T test 2.1.0.1,128,2.2.2.2 +# Range: Try to add value before first random value +0 ipset -A test 2.0.0.0,5,1.1.1.1/24 +# Range: Try to add value after second random value +0 ipset -A test 2.1.0.1,128,2.2.2.2/12 +# Range: List set +0 ipset -L test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Range: Check listing +0 diff -u -I 'Size in memory.*' .foo ipportnethash.t.list0 +# Range: Flush test set +0 ipset -F test +# Range: Delete test set +0 ipset -X test +# Network: Create a set from a valid network (network ignored) +0 ipset -N test ipportnethash --network 2.0.0.0/16 +# Network: Add first random value +0 ipset -A test 2.0.0.0,5,1.1.1.1/24 +# Network: Add second random value +0 ipset -A test 2.0.255.255,128,2.2.2.2/12 +# Network: Test first random value +0 ipset -T test 2.0.0.0,5,1.1.1.2 +# Network: Test second random value +0 ipset -T test 2.0.255.255,128,2.2.2.0 +# Network: Test value not added to the set +1 ipset -T test 2.0.0.0,5,1.1.0.255 +# Network: Test value not added to the set +1 ipset -T test 2.0.0.0,6,1.1.1.1 +# Network: Test value before first random value +1 ipset -T test 1.255.255.255,5,1.1.1.1 +# Network: Test value after second random value +1 ipset -T test 2.1.0.0,128,2.2.2.2 +# Network: Try to add value before first random value +0 ipset -A test 1.255.255.255,5,1.1.1.1/24 +# Network: Try to add value after second random value +0 ipset -A test 2.1.0.0,128,2.2.2.2/12 +# Network: List set +0 ipset -L test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Network: Check listing +0 diff -u -I 'Size in memory.*' .foo ipportnethash.t.list1 +# Network: Flush test set +0 ipset -F test +# Add a non-matching IP address entry +0 ipset -A test 2.1.0.0,80,1.1.1.1 nomatch +# Add an overlapping matching small net +0 ipset -A test 2.1.0.0,80,1.1.1.0/30 +# Add an overlapping non-matching larger net +0 ipset -A test 2.1.0.0,80,1.1.1.0/28 nomatch +# Add an even larger matching net +0 ipset -A test 2.1.0.0,80,1.1.1.0/26 +# Check non-matching IP +1 ipset -T test 2.1.0.0,80,1.1.1.1 +# Check matching IP from non-matchin small net +0 ipset -T test 2.1.0.0,80,1.1.1.3 +# Check non-matching IP from larger net +1 ipset -T test 2.1.0.0,80,1.1.1.4 +# Check matching IP from even larger net +0 ipset -T test 2.1.0.0,80,1.1.1.16 +# Update non-matching IP to matching one +0 ipset -! -A test 2.1.0.0,80,1.1.1.1 +# Delete overlapping small net +0 ipset -D test 2.1.0.0,80,1.1.1.0/30 +# Check matching IP +0 ipset -T test 2.1.0.0,80,1.1.1.1 +# Update matching IP as a non-matching one +0 ipset -! -A test 2.1.0.0,80,1.1.1.1 nomatch +# Check non-matching IP +1 ipset -T test 2.1.0.0,80,1.1.1.1 +# Delete test set +0 ipset -X test +# eof diff --git a/tests/ipportnethash.t.list0 b/tests/ipportnethash.t.list0 new file mode 100644 index 0000000..2747032 --- /dev/null +++ b/tests/ipportnethash.t.list0 @@ -0,0 +1,10 @@ +Name: test +Type: hash:ip,port,net +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 8776 +References: 0 +Members: +2.0.0.0,tcp:5,1.1.1.0/24 +2.0.0.1,tcp:5,1.1.1.0/24 +2.1.0.0,tcp:128,2.0.0.0/12 +2.1.0.1,tcp:128,2.0.0.0/12 diff --git a/tests/ipportnethash.t.list1 b/tests/ipportnethash.t.list1 new file mode 100644 index 0000000..76becdb --- /dev/null +++ b/tests/ipportnethash.t.list1 @@ -0,0 +1,10 @@ +Name: test +Type: hash:ip,port,net +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 8776 +References: 0 +Members: +1.255.255.255,tcp:5,1.1.1.0/24 +2.0.0.0,tcp:5,1.1.1.0/24 +2.0.255.255,tcp:128,2.0.0.0/12 +2.1.0.0,tcp:128,2.0.0.0/12 diff --git a/tests/iptables.sh b/tests/iptables.sh new file mode 100755 index 0000000..bca3253 --- /dev/null +++ b/tests/iptables.sh @@ -0,0 +1,140 @@ +#!/bin/sh + +# set -x +set -e + +ipset=${IPSET_BIN:-../src/ipset} + +# We play with the following networks: +# inet: 10.255.255.0/24 +# 10.255.255.0-31 in ip1 +# 10.255.255.32-63 in ip2 +# rest in ipport +# inet6: 1002:1002:1002:1002::/64 +# 1002:1002:1002:1002::1 in ip1 +# 1002:1002:1002:1002::32 in ip2 +# rest in ipport + +case "$1" in +inet) + cmd=iptables + family= + NET=10.255.255.0/24 + IP1=10.255.255.1 + IP2=10.255.255.32 + ;; +inet6) + cmd=ip6tables + family="family inet6" + NET=1002:1002:1002:1002::/64 + IP1=1002:1002:1002:1002::1 + IP2=1002:1002:1002:1002::32 + ;; +*) + echo "Usage: $0 inet|inet6 start|stop" + exit 1 + ;; +esac + +case "$2" in +start) + $ipset n ip1 hash:ip $family 2>/dev/null + $ipset a ip1 $IP1 2>/dev/null + $ipset n ip2 hash:ip $family 2>/dev/null + $ipset a ip2 $IP2 2>/dev/null + $ipset n ipport hash:ip,port $family 2>/dev/null + $ipset n list list:set 2>/dev/null + $ipset a list ipport 2>/dev/null + $ipset a list ip1 2>/dev/null + $cmd -A INPUT ! -s $NET -j ACCEPT + $cmd -A INPUT -m set ! --match-set ip1 src \ + -m set ! --match-set ip2 src \ + -j SET --add-set ipport src,src + $cmd -A INPUT -m set --match-set ip1 src \ + -j LOG --log-prefix "in set ip1: " + $cmd -A INPUT -m set --match-set ip2 src \ + -j LOG --log-prefix "in set ip2: " + $cmd -A INPUT -m set --match-set ipport src,src \ + -j LOG --log-prefix "in set ipport: " + $cmd -A INPUT -m set --match-set list src,src \ + -j LOG --log-prefix "in set list: " + $cmd -A OUTPUT -d $NET -j DROP + cat /dev/null > .foo.err + cat /dev/null > /var/log/kern.log + ;; +start_flags) + $ipset n test hash:net $family 2>/dev/null + $ipset a test 10.0.0.0/16 2>/dev/null + $ipset a test 10.0.0.0/24 nomatch 2>/dev/null + $ipset a test 10.0.0.1 2>/dev/null + $cmd -A INPUT ! -s 10.0.0.0/16 -j ACCEPT + $cmd -A INPUT -m set --match-set test src \ + -j LOG --log-prefix "in set test: " + $cmd -A INPUT -m set --match-set test src --return-nomatch \ + -j LOG --log-prefix "in set test-nomatch: " + $cmd -A INPUT -s 10.0.0.0/16 -j DROP + cat /dev/null > .foo.err + cat /dev/null > /var/log/kern.log + ;; +start_flags_reversed) + $ipset n test hash:net $family 2>/dev/null + $ipset a test 10.0.0.0/16 2>/dev/null + $ipset a test 10.0.0.0/24 nomatch 2>/dev/null + $ipset a test 10.0.0.1 2>/dev/null + $cmd -A INPUT ! -s 10.0.0.0/16 -j ACCEPT + $cmd -A INPUT -m set --match-set test src --return-nomatch \ + -j LOG --log-prefix "in set test-nomatch: " + $cmd -A INPUT -m set --match-set test src \ + -j LOG --log-prefix "in set test: " + $cmd -A INPUT -s 10.0.0.0/16 -j DROP + cat /dev/null > .foo.err + cat /dev/null > /var/log/kern.log + ;; +del) + $cmd -F INPUT + $cmd -A INPUT -s $NET -j SET --del-set ipport src,src + ;; +add) + $ipset n test hash:net $family 2>/dev/null + $cmd -F INPUT + $cmd -A INPUT -s $NET -j SET --add-set test src + ;; +timeout) + $ipset n test hash:ip,port timeout 2 + $cmd -A INPUT -s $NET -j SET --add-set test src,src --timeout 10 --exist + ;; +mangle) + $ipset n test hash:net $family skbinfo 2>/dev/null + $ipset a test 10.255.0.0/16 skbmark 0x1234 2>/dev/null + $cmd -t mangle -A INPUT -j SET --map-set test src --map-mark + $cmd -t mangle -A INPUT -m mark --mark 0x1234 -j LOG --log-prefix "in set mark: " + $cmd -t mangle -A INPUT -s 10.255.0.0/16 -j DROP + ;; +netiface) + $ipset n test hash:net,iface + $ipset a test 0.0.0.0/0,eth0 + $cmd -A OUTPUT -m set --match-set test dst,dst -j LOG --log-prefix "in set netiface: " + $cmd -A OUTPUT -d 10.255.255.254 -j DROP + ;; +counter) + $ipset n test hash:ip counters + $ipset a test 10.255.255.64 + $cmd -A OUTPUT -m set --match-set test src --packets-gt 1 ! --update-counters -j DROP + $cmd -A OUTPUT -m set --match-set test src -j DROP + ./sendip.sh -p ipv4 -id 10.255.255.254 -is 10.255.255.64 -p udp -ud 80 -us 1025 10.255.255.254 >/dev/null 2>&1 + ./sendip.sh -p ipv4 -id 10.255.255.254 -is 10.255.255.64 -p udp -ud 80 -us 1025 10.255.255.254 >/dev/null 2>&1 + ./sendip.sh -p ipv4 -id 10.255.255.254 -is 10.255.255.64 -p udp -ud 80 -us 1025 10.255.255.254 >/dev/null 2>&1 + ;; +stop) + $cmd -F + $cmd -X + $cmd -F -t mangle + $cmd -X -t mangle + $ipset -F 2>/dev/null + $ipset -X 2>/dev/null + ;; +*) + echo "Usage: $0 start|stop" + exit 1 + ;; +esac diff --git a/tests/iptree.t b/tests/iptree.t new file mode 100644 index 0000000..1e5f7ad --- /dev/null +++ b/tests/iptree.t @@ -0,0 +1,59 @@ +# Static: Create a set without timeout +0 ipset -N test iptree +# Static: Add first random entry +0 ipset -A test 2.0.0.1 +# Static: Add second random value +0 ipset -A test 192.168.68.69 +# Static: Test first random value +0 ipset -T test 2.0.0.1 +# Static: Test second random value +0 ipset -T test 192.168.68.69 +# Static: Test value not added to the set +1 ipset -T test 2.0.0.2 +# Static: Test value not added to the set +1 ipset -T test 192.168.68.70 +# Static: List set +0 ipset -L test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Static: Check listing +0 diff -u -I 'Size in memory.*' .foo iptree.t.list0 +# Static: Flush test set +0 ipset -F test +# Static: Delete test set +0 ipset -X test +# Timeout: Create a set with a timeout parameter +0 ipset -N test iptree --timeout 5 +# Timeout: Add first random entry +0 ipset -A test 2.0.0.1 +# Timeout: Add second random value +0 ipset -A test 192.168.68.69 +# Timeout: Test first random value +0 ipset -T test 2.0.0.1 +# Timeout: Test second random value +0 ipset -T test 192.168.68.69 +# Timeout: Test value not added to the set +1 ipset -T test 2.0.0.2 +# Timeout: Test value not added to the set +1 ipset -T test 192.168.68.70 +# Timeout: Sleep 6s so that entries can time out +0 sleep 6 +# Timeout: Test first random value +1 ipset -T test 2.0.0.1 +# Timeout: Test second random value +1 ipset -T test 192.168.68.69 +# Timeout: Test value not added to the set +1 ipset -T test 2.0.0.2 +# Timeout: Test value not added to the set +1 ipset -T test 192.168.68.70 +# Timeout: Add entry with 3s timeout value +0 ipset -A test 2.0.0.2,3 +# Timeout: Test entry added with 3s timeout +0 ipset -T test 2.0.0.2 +# Timeout: Sleep 4s so that entry can time out +0 sleep 4 +# Timeout: Test entry added with 3s timeout +1 ipset -T test 2.0.0.2 +# Timeout: Flush test set +0 ipset -F test +# Timeout: Delete test set +0 ipset -X test +# eof diff --git a/tests/iptree.t.list0 b/tests/iptree.t.list0 new file mode 100644 index 0000000..c5f1527 --- /dev/null +++ b/tests/iptree.t.list0 @@ -0,0 +1,8 @@ +Name: test +Type: hash:ip +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 8352 +References: 0 +Members: +192.168.68.69 +2.0.0.1 diff --git a/tests/iptreemap.t b/tests/iptreemap.t new file mode 100644 index 0000000..8061b4f --- /dev/null +++ b/tests/iptreemap.t @@ -0,0 +1,59 @@ +# Create a set without timeout +0 ipset -N test iptreemap +# Add first random IP entry +0 ipset -A test 2.0.0.1 +# Add second random IP entry +0 ipset -A test 192.168.68.69 +# Test first random IP entry +0 ipset -T test 2.0.0.1 +# Test second random IP entry +0 ipset -T test 192.168.68.69 +# Test value not added to the set +1 ipset -T test 2.0.0.2 +# Test value not added to the set +1 ipset -T test 192.168.68.70 +# Add IP range +0 ipset -A test 3.0.0.0-3.0.0.2 +# Test the three members of the range: first +0 ipset -T test 3.0.0.0 +# Test the three members of the range: second +0 ipset -T test 3.0.0.1 +# Test the three members of the range: third +0 ipset -T test 3.0.0.2 +# Delete the middle of the range +0 ipset -D test 3.0.0.1 +# Test the range: first +0 ipset -T test 3.0.0.0 +# Test the range: second +1 ipset -T test 3.0.0.1 +# Test the range: third +0 ipset -T test 3.0.0.2 +# Delete second random IP entry +0 ipset -D test 192.168.68.69 +# Add a network block +0 ipset -A test 192.168.68.69/27 +# Test the lower bound of the network +0 ipset -T test 192.168.68.64 +# Test the upper bound of the network +0 ipset -T test 192.168.68.95 +# Test element from the middle +0 ipset -T test 192.168.68.71 +# Delete a network from the middle +0 ipset -D test 192.168.68.70/30 +# Test lower bound of deleted network +1 ipset -T test 192.168.68.68 +# Test upper bound of deleted network +1 ipset -T test 192.168.68.71 +# Test element before lower bound of deleted network +0 ipset -T test 192.168.68.67 +# Test element after upper bound of deleted network +0 ipset -T test 192.168.68.72 +# List set +0 ipset -L test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo iptreemap.t.list0 +# Flush test set +0 ipset -F test +# Delete test set +0 ipset -X test +# eof diff --git a/tests/iptreemap.t.list0 b/tests/iptreemap.t.list0 new file mode 100644 index 0000000..4c66472 --- /dev/null +++ b/tests/iptreemap.t.list0 @@ -0,0 +1,37 @@ +Name: test +Type: hash:ip +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 9048 +References: 0 +Members: +192.168.68.64 +192.168.68.65 +192.168.68.66 +192.168.68.67 +192.168.68.72 +192.168.68.73 +192.168.68.74 +192.168.68.75 +192.168.68.76 +192.168.68.77 +192.168.68.78 +192.168.68.79 +192.168.68.80 +192.168.68.81 +192.168.68.82 +192.168.68.83 +192.168.68.84 +192.168.68.85 +192.168.68.86 +192.168.68.87 +192.168.68.88 +192.168.68.89 +192.168.68.90 +192.168.68.91 +192.168.68.92 +192.168.68.93 +192.168.68.94 +192.168.68.95 +2.0.0.1 +3.0.0.0 +3.0.0.2 diff --git a/tests/macipmap.t b/tests/macipmap.t new file mode 100644 index 0000000..45783d6 --- /dev/null +++ b/tests/macipmap.t @@ -0,0 +1,199 @@ +# Range: Try to create from an invalid range +1 ipset -N test macipmap --from 2.0.0.1 --to 2.1.0.1 +# Range: Create a set from a valid range +0 ipset -N test macipmap --from 2.0.0.1 --to 2.1.0.0 +# Range: Add lower boundary +0 ipset -A test 2.0.0.1 +# Range: Add upper boundary +0 ipset -A test 2.1.0.0 +# Range: Test lower boundary +0 ipset -T test 2.0.0.1 +# Range: Test upper boundary +0 ipset -T test 2.1.0.0 +# Range: Test value not added to the set +1 ipset -T test 2.0.0.2 +# Range: Test value before lower boundary +1 ipset -T test 2.0.0.0 +# Range: Test value after upper boundary +1 ipset -T test 2.1.0.1 +# Range: Try to add value before lower boundary +1 ipset -A test 2.0.0.0 +# Range: Try to add value after upper boundary +1 ipset -A test 2.1.0.1 +# Range: Delete element not added to the set +1 ipset -D test 2.0.0.2 +# Range: Try to add value with MAC +0 ipset -A test 2.0.0.2,00:11:22:33:44:55 +# Range: Test value with invalid MAC +1 ipset -T test 2.0.0.2,00:11:22:33:44:56 +# Range: Test value with valid MAC +0 ipset -T test 2.0.0.2,00:11:22:33:44:55 +# Range: Add MAC to already added element +0 ipset -A test 2.0.0.1,00:11:22:33:44:56 +# Range: Test value without supplying MAC +0 ipset -T test 2.0.0.1 +# Range: Test value with valid MAC +0 ipset -T test 2.0.0.1,00:11:22:33:44:56 +# Range: Add an element in the middle +0 ipset -A test 2.0.200.214,00:11:22:33:44:57 +# Range: Delete the same element +0 ipset -D test 2.0.200.214 +# Range: List set +0 ipset -L test | grep -v Revision: > .foo +# Range: Check listing +0 diff -u -I 'Size in memory.*' .foo macipmap.t.list0 +# Range: Flush test set +0 ipset -F test +# Range: Catch invalid (too long) MAC +1 ipset -A test 2.0.0.2,00:11:22:33:44:55:66 +# Range: Catch invalid (too short) MAC +1 ipset -A test 2.0.0.2,00:11:22:33:44 +# Range: Add an element with MAC without leading zeros +0 ipset -A test 2.0.0.2,0:1:2:3:4:5 +# Range: Check element with MAC without leading zeros +0 ipset -T test 2.0.0.2,0:1:2:3:4:5 +# Range: Delete test set +0 ipset -X test +# Network: Try to create a set from an invalid network +1 ipset -N test macipmap --network 2.0.0.0/15 +# Network: Create a set from a valid network +0 ipset -N test macipmap --network 2.0.0.1/16 +# Network: Add lower boundary +0 ipset -A test 2.0.0.0 +# Network: Add upper boundary +0 ipset -A test 2.0.255.255 +# Network: Test lower boundary +0 ipset -T test 2.0.0.0 +# Network: Test upper boundary +0 ipset -T test 2.0.255.255 +# Network: Test value not added to the set +1 ipset -T test 2.0.0.1 +# Network: Test value before lower boundary +1 ipset -T test 1.255.255.255 +# Network: Test value after upper boundary +1 ipset -T test 2.1.0.0 +# Network: Try to add value before lower boundary +1 ipset -A test 1.255.255.255 +# Network: Try to add value after upper boundary +1 ipset -A test 2.1.0.0 +# Network: Delete element not added to the set +1 ipset -D test 2.0.0.2 +# Network: Try to add value with MAC +0 ipset -A test 2.0.0.2,00:11:22:33:44:55 +# Network: Test value with invalid MAC +1 ipset -T test 2.0.0.2,00:11:22:33:44:56 +# Network: Test value with valid MAC +0 ipset -T test 2.0.0.2,00:11:22:33:44:55 +# Network: Add MAC to already added element +0 ipset -A test 2.0.255.255,00:11:22:33:44:56 +# Network: List set +0 ipset -L test | grep -v Revision: > .foo +# Network: Check listing +0 diff -u -I 'Size in memory.*' .foo macipmap.t.list1 +# Network: Flush test set +0 ipset -F test +# Network: Delete test set +0 ipset -X test +# Range: Create a set from a valid range with timeout +0 ipset -N test macipmap --from 2.0.0.1 --to 2.1.0.0 timeout 5 +# Range: Add lower boundary +0 ipset -A test 2.0.0.1 timeout 4 +# Range: Add upper boundary +0 ipset -A test 2.1.0.0 timeout 3 +# Range: Test lower boundary +0 ipset -T test 2.0.0.1 +# Range: Test upper boundary +0 ipset -T test 2.1.0.0 +# Range: Test value not added to the set +1 ipset -T test 2.0.0.2 +# Range: Test value before lower boundary +1 ipset -T test 2.0.0.0 +# Range: Test value after upper boundary +1 ipset -T test 2.1.0.1 +# Range: Try to add value before lower boundary +1 ipset -A test 2.0.0.0 +# Range: Try to add value after upper boundary +1 ipset -A test 2.1.0.1 +# Range: Try to add value with MAC +0 ipset -A test 2.0.0.2,00:11:22:33:44:55 timeout 4 +# Range: Test value with invalid MAC +1 ipset -T test 2.0.0.2,00:11:22:33:44:56 +# Range: Test value with valid MAC +0 ipset -T test 2.0.0.2,00:11:22:33:44:55 +# Range: Add MAC to already added element +0 ipset -A test 2.0.0.1,00:11:22:33:44:56 +# Range: Add an element in the middle +0 ipset -A test 2.0.200.214,00:11:22:33:44:57 +# Range: Delete the same element +0 ipset -D test 2.0.200.214 +# Range: List set +0 ipset -L test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo +# Range: Check listing +0 diff -u -I 'Size in memory.*' .foo macipmap.t.list3 +# Range: sleep 5s so that elements can timeout +0 sleep 5 +# Range: List set +0 ipset -L test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo +# Range: Check listing +0 diff -u -I 'Size in memory.*' .foo macipmap.t.list2 +# Range: Flush test set +0 ipset -F test +# Range: add element with 1s timeout +0 ipset add test 2.0.200.214,00:11:22:33:44:57 timeout 1 +# Range: readd element with 3s timeout +0 ipset add test 2.0.200.214,00:11:22:33:44:57 timeout 3 -exist +# Range: sleep 2s +0 sleep 2s +# Range: check readded element +0 ipset test test 2.0.200.214 +# Range: Delete test set +0 ipset -X test +# Counters: create set +0 ipset n test bitmap:ip,mac range 2.0.0.1-2.1.0.0 counters +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.1,00:11:22:33:44:57 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 2.0.0.1,00:11:22:33:44:57 +# Counters: check counters +0 ./check_counters test 2.0.0.1,00:11:22:33:44:57 5 3456 +# Counters: delete element +0 ipset d test 2.0.0.1,00:11:22:33:44:57 +# Counters: test deleted element +1 ipset t test 2.0.0.1,00:11:22:33:44:57 +# Counters: add element with packet, byte counters +0 ipset a test 2.0.0.1,00:11:22:33:44:57 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 2.0.0.1,00:11:22:33:44:57 12 9876 +# Counters: update counters +0 ipset -! a test 2.0.0.1,00:11:22:33:44:57 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 2.0.0.1,00:11:22:33:44:57 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test bitmap:ip,mac range 2.0.0.1-2.1.0.0 counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.1,00:11:22:33:44:57 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 2.0.0.1,00:11:22:33:44:57 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.1,00:11:22:33:44:57 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 2.0.0.1,00:11:22:33:44:57 +# Counters and timeout: test deleted element +1 ipset t test 2.0.0.1,00:11:22:33:44:57 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 2.0.0.10,00:11:22:33:44:88 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.10,00:11:22:33:44:88 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 2.0.0.10,00:11:22:33:44:88 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.10,00:11:22:33:44:88 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 2.0.0.10,00:11:22:33:44:88 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 2.0.0.10,00:11:22:33:44:88 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/macipmap.t.list0 b/tests/macipmap.t.list0 new file mode 100644 index 0000000..4268a2c --- /dev/null +++ b/tests/macipmap.t.list0 @@ -0,0 +1,10 @@ +Name: test +Type: bitmap:ip,mac +Header: range 2.0.0.1-2.1.0.0 +Size in memory: 532632 +References: 0 +Number of entries: 3 +Members: +2.0.0.1,00:11:22:33:44:56 +2.0.0.2,00:11:22:33:44:55 +2.1.0.0 diff --git a/tests/macipmap.t.list1 b/tests/macipmap.t.list1 new file mode 100644 index 0000000..a568148 --- /dev/null +++ b/tests/macipmap.t.list1 @@ -0,0 +1,10 @@ +Name: test +Type: bitmap:ip,mac +Header: range 2.0.0.0-2.0.255.255 +Size in memory: 532632 +References: 0 +Number of entries: 3 +Members: +2.0.0.0 +2.0.0.2,00:11:22:33:44:55 +2.0.255.255,00:11:22:33:44:56 diff --git a/tests/macipmap.t.list2 b/tests/macipmap.t.list2 new file mode 100644 index 0000000..f6a78c7 --- /dev/null +++ b/tests/macipmap.t.list2 @@ -0,0 +1,8 @@ +Name: test +Type: bitmap:ip,mac +Header: range 2.0.0.1-2.1.0.0 timeout x +Size in memory: 1056920 +References: 0 +Number of entries: 1 +Members: +2.1.0.0 timeout x diff --git a/tests/macipmap.t.list3 b/tests/macipmap.t.list3 new file mode 100644 index 0000000..78c78d3 --- /dev/null +++ b/tests/macipmap.t.list3 @@ -0,0 +1,10 @@ +Name: test +Type: bitmap:ip,mac +Header: range 2.0.0.1-2.1.0.0 timeout x +Size in memory: 1056920 +References: 0 +Number of entries: 3 +Members: +2.0.0.1,00:11:22:33:44:56 timeout x +2.0.0.2,00:11:22:33:44:55 timeout x +2.1.0.0 timeout x diff --git a/tests/match_flags.t b/tests/match_flags.t new file mode 100644 index 0000000..f14198c --- /dev/null +++ b/tests/match_flags.t @@ -0,0 +1,49 @@ +# Create sets and inet rules which call set match +0 ./iptables.sh inet start_flags +# Send probe packet from 10.0.0.0,tcp:1025 +0 ./sendip.sh -p ipv4 -id 127.0.0.1 -is 10.0.0.0 -p tcp -td 80 -ts 1025 127.0.0.1 +# Check that test set matched with --return-nomatch +0 ./check_klog.sh 10.0.0.0 tcp 1025 test-nomatch +# Send probe packet from 10.0.0.1,tcp:1025 +0 ./sendip.sh -p ipv4 -id 127.0.0.1 -is 10.0.0.1 -p tcp -td 80 -ts 1025 127.0.0.1 +# Check that test set matched +0 ./check_klog.sh 10.0.0.1 tcp 1025 test +# Send probe packet from 10.0.0.2,tcp:1025 +0 ./sendip.sh -p ipv4 -id 127.0.0.2 -is 10.0.0.2 -p tcp -td 80 -ts 1025 127.0.0.1 +# Check that test set matched with --return-nomatch +0 ./check_klog.sh 10.0.0.2 tcp 1025 test-nomatch +# Send probe packet from 10.0.0.255,tcp:1025 +0 ./sendip.sh -p ipv4 -id 127.0.0.1 -is 10.0.0.255 -p tcp -td 80 -ts 1025 127.0.0.1 +# Check that test set matched with --return-nomatch +0 ./check_klog.sh 10.0.0.255 tcp 1025 test-nomatch +# Send probe packet from 10.0.1.0,tcp:1025 +0 ./sendip.sh -p ipv4 -id 127.0.0.1 -is 10.0.1.0 -p tcp -td 80 -ts 1025 127.0.0.1 +# Check that test set matched +0 ./check_klog.sh 10.0.1.0 tcp 1025 test +# Destroy sets and rules +0 ./iptables.sh inet stop +# Create sets and inet rules which call set match, reversed rule order +0 ./iptables.sh inet start_flags_reversed +# Send probe packet from 10.0.0.0,tcp:1025 +0 ./sendip.sh -p ipv4 -id 127.0.0.1 -is 10.0.0.0 -p tcp -td 80 -ts 1025 127.0.0.1 +# Check that test set matched with --return-nomatch +0 ./check_klog.sh 10.0.0.0 tcp 1025 test-nomatch +# Send probe packet from 10.0.0.1,tcp:1025 +0 ./sendip.sh -p ipv4 -id 127.0.0.1 -is 10.0.0.1 -p tcp -td 80 -ts 1025 127.0.0.1 +# Check that test set matched +0 ./check_klog.sh 10.0.0.1 tcp 1025 test +# Send probe packet from 10.0.0.2,tcp:1025 +0 ./sendip.sh -p ipv4 -id 127.0.0.2 -is 10.0.0.2 -p tcp -td 80 -ts 1025 127.0.0.1 +# Check that test set matched with --return-nomatch +0 ./check_klog.sh 10.0.0.2 tcp 1025 test-nomatch +# Send probe packet from 10.0.0.255,tcp:1025 +0 ./sendip.sh -p ipv4 -id 127.0.0.1 -is 10.0.0.255 -p tcp -td 80 -ts 1025 127.0.0.1 +# Check that test set matched with --return-nomatch +0 ./check_klog.sh 10.0.0.255 tcp 1025 test-nomatch +# Send probe packet from 10.0.1.0,tcp:1025 +0 ./sendip.sh -p ipv4 -id 127.0.0.1 -is 10.0.1.0 -p tcp -td 80 -ts 1025 127.0.0.1 +# Check that test set matched +0 ./check_klog.sh 10.0.1.0 tcp 1025 test +# Destroy sets and rules +0 ./iptables.sh inet stop +# eof diff --git a/tests/match_target.t b/tests/match_target.t new file mode 100644 index 0000000..4141ce6 --- /dev/null +++ b/tests/match_target.t @@ -0,0 +1,121 @@ +# Create test set +0 ipset create test hash:ip +# Check that iptables set match catches invalid number of dir parameters +2 iptables -m set --match-set test src,dst,src,dst,src,dst,src +# Check reference number of test set +0 ref=`ipset list test|grep References|sed 's/References: //'` && test $ref -eq 0 +# Check that iptables SET target catches invalid number of dir parameters +2 iptables -j SET --add-set test src,dst,src,dst,src,dst,src +# Check reference number of test set +0 ref=`ipset list test|grep References|sed 's/References: //'` && test $ref -eq 0 +# Destroy test set +0 ipset destroy test +# Create sets and inet rules which call set match and SET target +0 ./iptables.sh inet start +# Check that 10.255.255.64,tcp:1025 is not in ipport set +1 ipset test ipport 10.255.255.64,tcp:1025 +# Send probe packet from 10.255.255.64,tcp:1025 +0 ./sendip.sh -p ipv4 -id 127.0.0.1 -is 10.255.255.64 -p tcp -td 80 -ts 1025 127.0.0.1 +# Check that proper sets matched and target worked +0 ./check_klog.sh 10.255.255.64 tcp 1025 ipport list +# Check that 10.255.255.64,tcp:1025 is in ipport set now +0 ipset test ipport 10.255.255.64,tcp:1025 +# Check that 10.255.255.64,udp:1025 is not in ipport set +1 ipset test ipport 10.255.255.64,udp:1025 +# Send probe packet from 10.255.255.64,udp:1025 +0 ./sendip.sh -p ipv4 -id 127.0.0.1 -is 10.255.255.64 -p udp -ud 80 -us 1025 127.0.0.1 +# Check that proper sets matched and target worked +0 ./check_klog.sh 10.255.255.64 udp 1025 ipport list +# Check that 10.255.255.64,udp:1025 is in ipport set now +0 ipset test ipport 10.255.255.64,udp:1025 +# Check that 10.255.255.1,tcp:1025 is not in ipport set +1 ipset test ipport 10.255.255.1,tcp:1025 +# Send probe packet from 10.255.255.1,tcp:1025 +0 ./sendip.sh -p ipv4 -id 127.0.0.1 -is 10.255.255.1 -p tcp -td 80 -ts 1025 127.0.0.1 +# Check that proper sets matched and target worked +0 ./check_klog.sh 10.255.255.1 tcp 1025 ip1 list +# Check that 10.255.255.1,tcp:1025 is not in ipport set +1 ipset test ipport 10.255.255.1,tcp:1025 +# Check that 10.255.255.32,tcp:1025 is not in ipport set +1 ipset test ipport 10.255.255.32,tcp:1025 +# Send probe packet from 10.255.255.32,tcp:1025 +0 ./sendip.sh -p ipv4 -id 127.0.0.1 -is 10.255.255.32 -p tcp -td 80 -ts 1025 127.0.0.1 +# Check that proper sets matched and target worked +0 ./check_klog.sh 10.255.255.32 tcp 1025 ip2 +# Check that 10.255.255.32,tcp:1025 is not in ipport set +1 ipset test ipport 10.255.255.32,tcp:1025 +# Check that 10.255.255.64,icmp:host-prohibited is not in ipport set +1 ipset test ipport 10.255.255.64,icmp:host-prohibited +# Send probe packet 10.255.255.64,icmp:host-prohibited +0 ./sendip.sh -d r10 -p ipv4 -id 127.0.0.1 -is 10.255.255.64 -p icmp -ct 3 -cd 10 127.0.0.1 +# Check that 10.255.255.64,icmp:3/10 is in ipport set now +0 ipset test ipport 10.255.255.64,icmp:host-prohibited +# Modify rules to check target and deletion +0 ./iptables.sh inet del +# Send probe packet 10.255.255.64,icmp:host-prohibited +0 ./sendip.sh -d r10 -p ipv4 -id 127.0.0.1 -is 10.255.255.64 -p icmp -ct 3 -cd 10 127.0.0.1 +# Check that 10.255.255.64,icmp:3/10 isn't in ipport +1 ipset test ipport 10.255.255.64,icmp:host-prohibited +# Destroy sets and rules +0 ./iptables.sh inet stop +# Create set and rules to check --exist and --timeout flags of SET target +0 ./iptables.sh inet timeout +# Add 10.255.255.64,icmp:host-prohibited to the set +0 ipset add test 10.255.255.64,icmp:host-prohibited +# Check that 10.255.255.64,icmp:3/10 is in ipport set +0 ipset test test 10.255.255.64,icmp:host-prohibited +# Sleep 3s so that entry can time out +0 sleep 3s +# Check that 10.255.255.64,icmp:3/10 is not in ipport set +1 ipset test test 10.255.255.64,icmp:host-prohibited +# Add 10.255.255.64,icmp:host-prohibited to the set again +0 ipset add test 10.255.255.64,icmp:host-prohibited +# Sleep 1s +0 sleep 1s +# Send probe packet 10.255.255.64,icmp:host-prohibited +0 ./sendip.sh -d r10 -p ipv4 -id 127.0.0.1 -is 10.255.255.64 -p icmp -ct 3 -cd 10 127.0.0.1 +# Sleep 5s, so original entry could time out +0 sleep 5s +# Check that 10.255.255.64,icmp:3/10 is not in ipport set +0 ipset test test 10.255.255.64,icmp:host-prohibited +# Destroy sets and rules +0 ./iptables.sh inet stop +# Create test set and iptables rules +0 ./iptables.sh inet mangle +# Send probe packet from 10.255.255.64,udp:1025 +0 ./sendip.sh -p ipv4 -id 127.0.0.1 -is 10.255.255.64 -p udp -ud 80 -us 1025 127.0.0.1 +# Check that proper sets matched and target worked +0 ./check_klog.sh 10.255.255.64 udp 1025 mark +# Destroy sets and rules +0 ./iptables.sh inet stop +# Create test set and iptables rules +0 ./iptables.sh inet add +# Send probe packet from 10.255.255.64,udp:1025 +0 ./sendip.sh -p ipv4 -id 127.0.0.1 -is 10.255.255.64 -p udp -ud 80 -us 1025 127.0.0.1 +# Check that 10.255.255.64 is added to the set +0 ipset t test 10.255.255.64 +# Flush set +0 ipset f test +# Add a /24 network to the set +0 ipset a test 1.1.1.0/24 +# Send probe packet from 10.255.255.64,udp:1025 again +0 ./sendip.sh -p ipv4 -id 127.0.0.1 -is 10.255.255.64 -p udp -ud 80 -us 1025 127.0.0.1 +# Check that 10.255.255.0/24 is added to the set +0 ipset t test 10.255.255.0/24 +# Destroy sets and rules +0 ./iptables.sh inet stop +# Create set and rules for 0.0.0.0/0 check in hash:net,iface +0 ./iptables.sh inet netiface +# Send probe packet +0 ./sendip.sh -p ipv4 -id 10.255.255.254 -is 10.255.255.64 -p udp -ud 80 -us 1025 10.255.255.254 >/dev/null 2>&1 +# Check kernel log that the packet matched the set +0 ./check_klog.sh 10.255.255.64 udp 1025 netiface +# Destroy sets and rules +0 ./iptables.sh inet stop +# Create set and rules for the counter test +0 ./iptables.sh inet counter +# Check packet counter +0 ipset l test |grep -q '^10.255.255.64 packets 2' +# Destroy sets and rules +0 ./iptables.sh inet stop +# eof diff --git a/tests/match_target6.t b/tests/match_target6.t new file mode 100644 index 0000000..c2a6bf8 --- /dev/null +++ b/tests/match_target6.t @@ -0,0 +1,61 @@ +# Create test set +0 ipset create test hash:ip family inet6 +# Check that iptables set match catches invalid number of dir parameters +2 ip6tables -m set --match-set test src,dst,src,dst,src,dst,src +# Check reference number of test set +0 ref=`ipset list test|grep References|sed 's/References: //'` && test $ref -eq 0 +# Check that iptables SET target catches invalid number of dir parameters +2 ip6tables -j SET --del-set test src,dst,src,dst,src,dst,src +# Check reference number of test set +0 ref=`ipset list test|grep References|sed 's/References: //'` && test $ref -eq 0 +# Destroy test set +0 ipset destroy test +# Create sets and inet6 rules which call set match and SET target +0 ./iptables.sh inet6 start +# Check that 1002:1002:1002:1002::64,tcp:1025 is not in ipport set +1 ipset test ipport 1002:1002:1002:1002::64,tcp:1025 +# Send probe packet from 1002:1002:1002:1002::64,tcp:1025 +0 ./sendip.sh -p ipv6 -6d ::1 -6s 1002:1002:1002:1002::64 -p tcp -td 80 -ts 1025 ::1 +# Check that proper sets matched and target worked +0 ./check_klog.sh 1002:1002:1002:1002::64 tcp 1025 ipport list +# Check that 1002:1002:1002:1002::64,tcp:1025 is in ipport set now +0 ipset test ipport 1002:1002:1002:1002::64,tcp:1025 +# Check that 1002:1002:1002:1002::64,udp:1025 is not in ipport set +1 ipset test ipport 1002:1002:1002:1002::64,udp:1025 +# Send probe packet from 1002:1002:1002:1002::64,udp:1025 +0 ./sendip.sh -p ipv6 -6d ::1 -6s 1002:1002:1002:1002::64 -p udp -ud 80 -us 1025 ::1 +# Check that proper sets matched and target worked +0 ./check_klog.sh 1002:1002:1002:1002::64 udp 1025 ipport list +# Check that 1002:1002:1002:1002::64,udp:1025 is in ipport set now +0 ipset test ipport 1002:1002:1002:1002::64,udp:1025 +# Check that 1002:1002:1002:1002::1,tcp:1025 is not in ipport set +1 ipset test ipport 1002:1002:1002:1002::1,tcp:1025 +# Send probe packet from 1002:1002:1002:1002::1,tcp:1025 +0 ./sendip.sh -p ipv6 -6d ::1 -6s 1002:1002:1002:1002::1 -p tcp -td 80 -ts 1025 ::1 +# Check that proper sets matched and target worked +0 ./check_klog.sh 1002:1002:1002:1002::1 tcp 1025 ip1 list +# Check that 1002:1002:1002:1002::1,tcp:1025 is not in ipport set +1 ipset test ipport 1002:1002:1002:1002::1,tcp:1025 +# Check that 1002:1002:1002:1002::32,tcp:1025 is not in ipport set +1 ipset test ipport 1002:1002:1002:1002::32,tcp:1025 +# Send probe packet from 1002:1002:1002:1002::32,tcp:1025 +0 ./sendip.sh -p ipv6 -6d ::1 -6s 1002:1002:1002:1002::32 -p tcp -td 80 -ts 1025 ::1 +# Check that proper sets matched and target worked +0 ./check_klog.sh 1002:1002:1002:1002::32 tcp 1025 ip2 +# Check that 1002:1002:1002:1002::32,tcp:1025 is not in ipport set +1 ipset test ipport 1002:1002:1002:1002::32,tcp:1025 +# Check that 1002:1002:1002:1002::64,icmpv6:ttl-zero-during-reassembly is not in ipport set +1 ipset test ipport 1002:1002:1002:1002::64,icmpv6:ttl-zero-during-reassembly +# Send probe packet from 1002:1002:1002:1002::64,icmpv6:ttl-zero-during-reassembly +0 ./sendip.sh -d r10 -p ipv6 -6d ::1 -6s 1002:1002:1002:1002::64 -p icmp -ct 3 -cd 1 ::1 +# Check that 1002:1002:1002:1002::64,icmpv6:ttl-zero-during-reassembly is in ipport set now +0 ipset test ipport 1002:1002:1002:1002::64,icmpv6:ttl-zero-during-reassembly +# Modify rules to check target and deletion +0 ./iptables.sh inet6 del +# Send probe packet from 1002:1002:1002:1002::64,icmpv6:ttl-zero-during-reassembly +0 ./sendip.sh -d r10 -p ipv6 -6d ::1 -6s 1002:1002:1002:1002::64 -p icmp -ct 3 -cd 1 ::1 +# Check that 1002:1002:1002:1002::64,icmpv6:ttl-zero-during-reassembly isn't in ipport set +1 ipset test ipport 1002:1002:1002:1002::64,icmpv6:ttl-zero-during-reassembly +# Destroy sets and rules +0 ./iptables.sh inet6 stop +# eof diff --git a/tests/netgen.sh b/tests/netgen.sh new file mode 100755 index 0000000..eb59124 --- /dev/null +++ b/tests/netgen.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +echo "n test hash:net hashsize 32" +for x in `seq 0 255`; do + for y in `seq 0 3 253`; do + z=$((y+2)) + echo "a test 10.$x.$y.0-10.$x.$z.255" + done +done diff --git a/tests/nethash.t b/tests/nethash.t new file mode 100644 index 0000000..05e64c3 --- /dev/null +++ b/tests/nethash.t @@ -0,0 +1,69 @@ +# Create a set +0 ipset -N test nethash --hashsize 128 +# Add zero valued element +1 ipset -A test 0.0.0.0/0 +# Test zero valued element +1 ipset -T test 0.0.0.0/0 +# Delete zero valued element +1 ipset -D test 0.0.0.0/0 +# Try to add /0 +1 ipset -A test 1.1.1.1/0 +# Try to add /32 +0 ipset -A test 1.1.1.1/32 +# Add almost zero valued element +0 ipset -A test 0.0.0.0/1 +# Test almost zero valued element +0 ipset -T test 0.0.0.0/1 +# Delete almost zero valued element +0 ipset -D test 0.0.0.0/1 +# Test deleted element +1 ipset -T test 0.0.0.0/1 +# Delete element not added to the set +1 ipset -D test 0.0.0.0/1 +# Add first random network +0 ipset -A test 2.0.0.1/24 +# Add second random network +0 ipset -A test 192.168.68.69/27 +# Test first random value +0 ipset -T test 2.0.0.255 +# Test second random value +0 ipset -T test 192.168.68.95 +# Test value not added to the set +1 ipset -T test 2.0.1.0 +# Try to add IP address +0 ipset -A test 2.0.0.1 +# List set +0 ipset -L test | grep -v Revision: > .foo0 && ./sort.sh .foo0 +# Check listing +0 diff -u -I 'Size in memory.*' .foo nethash.t.list0 +# Flush test set +0 ipset -F test +# Add a non-matching IP address entry +0 ipset -A test 1.1.1.1 nomatch +# Add an overlapping matching small net +0 ipset -A test 1.1.1.0/30 +# Add an overlapping non-matching larger net +0 ipset -A test 1.1.1.0/28 nomatch +# Add an even larger matching net +0 ipset -A test 1.1.1.0/26 +# Check non-matching IP +1 ipset -T test 1.1.1.1 +# Check matching IP from non-matchin small net +0 ipset -T test 1.1.1.3 +# Check non-matching IP from larger net +1 ipset -T test 1.1.1.4 +# Check matching IP from even larger net +0 ipset -T test 1.1.1.16 +# Update non-matching IP to matching one +0 ipset -! -A test 1.1.1.1 +# Delete overlapping small net +0 ipset -D test 1.1.1.0/30 +# Check matching IP +0 ipset -T test 1.1.1.1 +# Update matching IP as a non-matching one +0 ipset -! -A test 1.1.1.1 nomatch +# Check non-matching IP +1 ipset -T test 1.1.1.1 +# Delete test set +0 ipset -X test +# eof diff --git a/tests/nethash.t.list0 b/tests/nethash.t.list0 new file mode 100644 index 0000000..0aeb852 --- /dev/null +++ b/tests/nethash.t.list0 @@ -0,0 +1,11 @@ +Name: test +Type: hash:net +Header: family inet hashsize 128 maxelem 65536 +Size in memory: 640 +References: 0 +Number of entries: 4 +Members: +1.1.1.1 +192.168.68.64/27 +2.0.0.0/24 +2.0.0.1 diff --git a/tests/netnetgen.sh b/tests/netnetgen.sh new file mode 100755 index 0000000..f2a31cc --- /dev/null +++ b/tests/netnetgen.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +while [ -n "$1" ]; do + case "$1" in + comment) + comment=" comment" + ;; + timeout) + timeout=" timeout 5" + ;; + *) + ;; + esac + shift +done + +echo "n test hash:net,net hashsize 32 maxelem 87040$comment$timeout" +for x in `seq 0 255`; do + for y in `seq 0 3 253`; do + z=$((y+2)) + if [ -n "$comment" ]; then + c="$comment \"text 10.0.0.0-10.0.2.255,10.$x.$y.0-10.$x.$z.255\"" + fi + echo "a test 10.0.0.0-10.0.2.255,10.$x.$y.0-10.$x.$z.255$c" + done +done diff --git a/tests/portmap.t b/tests/portmap.t new file mode 100644 index 0000000..5eeaaff --- /dev/null +++ b/tests/portmap.t @@ -0,0 +1,141 @@ +# Range: Create a set from a valid range +0 ipset -N test portmap --from 1 --to 1024 +# Range: Add lower boundary +0 ipset -A test 1 +# Range: Add upper boundary +0 ipset -A test 1024 +# Range: Test lower boundary +0 ipset -T test 1 +# Range: Test upper boundary +0 ipset -T test 1024 +# Range: Test value not added to the set +1 ipset -T test 1023 +# Range: Test value before lower boundary +1 ipset -T test 0 +# Range: Test value after upper boundary +1 ipset -T test 1025 +# Range: Try to add value before lower boundary +1 ipset -A test 0 +# Range: Try to add value after upper boundary +1 ipset -A test 1025 +# Range: Delete element not added to the set +1 ipset -D test 567 +# Range: Add element in the middle +0 ipset -A test 567 +# Range: Delete the same element +0 ipset -D test 567 +# Range: List set +0 ipset -L test | grep -v Revision: > .foo +# Range: Check listing +0 diff -u -I 'Size in memory.*' .foo portmap.t.list0 +# Range: Flush test set +0 ipset -F test +# Range: Delete test set +0 ipset -X test +# Full: Create a full set of ports +0 ipset -N test portmap --from 0 --to 65535 +# Full: Add lower boundary +0 ipset -A test 0 +# Full: Add upper boundary +0 ipset -A test 65535 +# Full: Test lower boundary +0 ipset -T test 0 +# Full: Test upper boundary +0 ipset -T test 65535 +# Full: Test value not added to the set +1 ipset -T test 1 +# Full: List set +0 ipset -L test | grep -v Revision: > .foo +# Full: Check listing +0 diff -u -I 'Size in memory.*' .foo portmap.t.list1 +# Full: Flush test set +0 ipset -F test +# Full: Delete test set +0 ipset -X test +# Full: Create a full set of ports and timeout +0 ipset -N test portmap --from 0 --to 65535 timeout 5 +# Full: Add lower boundary +0 ipset -A test 0 timeout 5 +# Full: Add upper boundary +0 ipset -A test 65535 timeout 0 +# Full: Test lower boundary +0 ipset -T test 0 +# Full: Test upper boundary +0 ipset -T test 65535 +# Full: Test value not added to the set +1 ipset -T test 1 +# Full: Add element in the middle +0 ipset -A test 567 +# Full: Delete the same element +0 ipset -D test 567 +# Full: List set +0 ipset -L test | grep -v Revision: | sed 's/timeout ./timeout x/' > .foo +# Full: Check listing +0 diff -u -I 'Size in memory.*' .foo portmap.t.list3 +# Full: sleep 5s so that elements can timeout +0 sleep 5 +# Full: List set +0 ipset -L test | grep -v Revision: > .foo +# Full: Check listing +# 0 diff -u -I 'Size in memory.*' .foo portmap.t.list2 +# Full: Flush test set +0 ipset -F test +# Full: add element with 1s timeout +0 ipset add test 567 timeout 1 +# Full: readd element with 3s timeout +0 ipset add test 567 timeout 3 -exist +# Full: sleep 2s +0 sleep 2s +# Full: check readded element +0 ipset test test 567 +# Full: Delete test set +0 ipset -X test +# Counters: create set +0 ipset n test bitmap:port range 1024-65535 counters +# Counters: add element with packet, byte counters +0 ipset a test 12345 packets 5 bytes 3456 +# Counters: check element +0 ipset t test 12345 +# Counters: check counters +0 ./check_counters test 12345 5 3456 +# Counters: delete element +0 ipset d test 12345 +# Counters: test deleted element +1 ipset t test 12345 +# Counters: add element with packet, byte counters +0 ipset a test 48310 packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test 48310 12 9876 +# Counters: update counters +0 ipset -! a test 48310 packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test 48310 13 12479 +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test bitmap:port range 1024-65535 counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 12345 packets 5 bytes 3456 +# Counters and timeout: check element +0 ipset t test 12345 +# Counters and timeout: check counters +0 ./check_extensions test 12345 600 5 3456 +# Counters and timeout: delete element +0 ipset d test 12345 +# Counters and timeout: test deleted element +1 ipset t test 12345 +# Counters and timeout: add element with packet, byte counters +0 ipset a test 48310 packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test 48310 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test 48310 packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test 48310 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test 48310 timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test 48310 700 13 12479 +# Counters and timeout: destroy set +0 ipset x test +# eof diff --git a/tests/portmap.t.list0 b/tests/portmap.t.list0 new file mode 100644 index 0000000..7f8657e --- /dev/null +++ b/tests/portmap.t.list0 @@ -0,0 +1,9 @@ +Name: test +Type: bitmap:port +Header: range 1-1024 +Size in memory: 276 +References: 0 +Number of entries: 2 +Members: +1 +1024 diff --git a/tests/portmap.t.list1 b/tests/portmap.t.list1 new file mode 100644 index 0000000..55ba0d0 --- /dev/null +++ b/tests/portmap.t.list1 @@ -0,0 +1,9 @@ +Name: test +Type: bitmap:port +Header: range 0-65535 +Size in memory: 8340 +References: 0 +Number of entries: 2 +Members: +0 +65535 diff --git a/tests/portmap.t.list2 b/tests/portmap.t.list2 new file mode 100644 index 0000000..d5756e6 --- /dev/null +++ b/tests/portmap.t.list2 @@ -0,0 +1,9 @@ +Name: test +Type: bitmap:port +Header: range 0-65535 timeout x +Size in memory: 532628 +References: 0 +Number of entries: 2 +Members: +0 timeout x +65535 timeout x diff --git a/tests/portmap.t.list3 b/tests/portmap.t.list3 new file mode 100644 index 0000000..d5756e6 --- /dev/null +++ b/tests/portmap.t.list3 @@ -0,0 +1,9 @@ +Name: test +Type: bitmap:port +Header: range 0-65535 timeout x +Size in memory: 532628 +References: 0 +Number of entries: 2 +Members: +0 timeout x +65535 timeout x diff --git a/tests/resize-and-list.sh b/tests/resize-and-list.sh new file mode 100755 index 0000000..78d521c --- /dev/null +++ b/tests/resize-and-list.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +./resize.sh & +ipset=${IPSET_BIN:-../src/ipset} +n=0 +while [ $n -ne 8161 ]; do + # echo $n + n=`$ipset -S resize-test 2>/dev/null| wc -l` +done +$ipset x diff --git a/tests/resize.sh b/tests/resize.sh new file mode 100755 index 0000000..19b93fb --- /dev/null +++ b/tests/resize.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +ipset=${IPSET_BIN:-../src/ipset} + +$ipset x resize-test 2>/dev/null + +set -e + +$ipset n resize-test hash:ip hashsize 64 +for x in `seq 1 32`; do + for y in `seq 1 255`; do + $ipset a resize-test 192.168.$x.$y + done +done diff --git a/tests/resizec.sh b/tests/resizec.sh new file mode 100755 index 0000000..28d6747 --- /dev/null +++ b/tests/resizec.sh @@ -0,0 +1,97 @@ +#!/bin/sh + +# set -x +set -e + +ipset=${IPSET_BIN:-../src/ipset} + +case "$1" in + -4) + ip=10.0. + sep=. + net=32 + ip2=192.168.162.33 + ;; + -6) + ip=10:: + sep=: + net=128 + ip2=192:168::162:33 + ;; +esac + +case "$2" in + ip) + $ipset n test hash:ip $1 hashsize 64 comment + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y comment "text $ip$x$sep$y" + done + done + ;; + ipport) + $ipset n test hash:ip,port $1 hashsize 64 comment + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y,1023 "text $ip$x$sep$y,1023" + done + done + ;; + ipportip) + $ipset n test hash:ip,port,ip $1 hashsize 64 comment + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y,1023,$ip2 comment "text $ip$x$sep$y,1023,$ip2" + done + done + ;; + ipportnet) + $ipset n test hash:ip,port,net $1 hashsize 64 comment + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y,1023,$ip2/$net comment "text $ip$x$sep$y,1023,$ip2/$net" + done + done + ;; + net) + $ipset n test hash:net $1 hashsize 64 comment + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y/$net comment "text $ip$x$sep$y/$net" + done + done + ;; + netnet) + $ipset n test hash:net,net $1 hashsize 64 comment + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y/$net,$ip$y$sep$x/$net comment "text $ip$x$sep$y/$net,$ip$y$sep$x/$net" + done + done + ;; + netport) + $ipset n test hash:net,port $1 hashsize 64 comment + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y/$net,1023 comment "text $ip$x$sep$y/$net,1023" + done + done + ;; + netiface) + $ipset n test hash:net,iface $1 hashsize 64 comment + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y/$net,eth0 comment "text $ip$x$sep$y/$net,eth0" + done + done + ;; +esac +$ipset l test | grep ^$ip | while read x y z; do + z=`echo $z | sed 's/\/32//g'` + if [ "$z" != "\"text $x\"" ]; then + echo $x $y $z + exit 1 + fi +done +$ipset x +exit 0 diff --git a/tests/resizen.sh b/tests/resizen.sh new file mode 100755 index 0000000..9322bd2 --- /dev/null +++ b/tests/resizen.sh @@ -0,0 +1,105 @@ +#!/bin/sh + +# set -x +set -e + +ipset=${IPSET_BIN:-../src/ipset} + +case "$1" in + -4) + ip=10.0. + sep=. + net=32 + ip2=192.168.162.33 + ;; + -6) + ip=10:: + sep=: + net=128 + ip2=192:168::162:33 + ;; +esac + +case "$2" in + ipportnet) + $ipset n test hash:ip,port,net $1 hashsize 64 + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y,1023,$ip2/$net nomatch + done + done + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset t test $ip$x$sep$y,1023,$ip2/$net nomatch 2>/dev/null + done + done + ;; + netportnet) + $ipset n test hash:net,port,net $1 hashsize 64 + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y,1023,$ip2/$net nomatch + done + done + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset t test $ip$x$sep$y,1023,$ip2/$net nomatch 2>/dev/null + done + done + ;; + net) + $ipset n test hash:net $1 hashsize 64 + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y/$net nomatch + done + done + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset t test $ip$x$sep$y/$net nomatch 2>/dev/null + done + done + ;; + netnet) + $ipset n test hash:net,net $1 hashsize 64 + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y/$net,$ip$y$sep$x/$net nomatch + done + done + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset t test $ip$x$sep$y/$net,$ip$y$sep$x/$net nomatch \ + 2>/dev/null + done + done + ;; + netport) + $ipset n test hash:net,port $1 hashsize 64 + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y/$net,1023 nomatch + done + done + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset t test $ip$x$sep$y/$net,1023 nomatch 2>/dev/null + done + done + ;; + netiface) + $ipset n test hash:net,iface $1 hashsize 64 + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y/$net,eth0 nomatch + done + done + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset t test $ip$x$sep$y/$net,eth0 nomatch 2>/dev/null + done + done + ;; +esac +$ipset x +exit 0 diff --git a/tests/resizet.sh b/tests/resizet.sh new file mode 100755 index 0000000..eed4abf --- /dev/null +++ b/tests/resizet.sh @@ -0,0 +1,111 @@ +#!/bin/sh + +#set -x +set -e + +ipset=${IPSET_BIN:-../src/ipset} + +case "$1" in + -4) + ip=10.0. + sep=. + net=32 + ip2=192.168.162.33 + ;; + -6) + ip=10:: + sep=: + net=128 + ip2=192:168::162:33 + ;; +esac + +case "$2" in + ip) + $ipset n test hash:ip $1 hashsize 64 timeout 100 + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y + done + done + ;; + ipmark) + $ipset n test hash:ip,mark $1 hashsize 64 timeout 100 + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y,1023 + done + done + ;; + ipport) + $ipset n test hash:ip,port $1 hashsize 64 timeout 100 + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y,1023 + done + done + ;; + ipportip) + $ipset n test hash:ip,port,ip $1 hashsize 64 timeout 100 + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y,1023,$ip2 + done + done + ;; + ipportnet) + $ipset n test hash:ip,port,net $1 hashsize 64 timeout 100 + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y,1023,$ip2/$net + done + done + ;; + netportnet) + $ipset n test hash:net,port,net $1 hashsize 64 timeout 100 + for x in `seq 0 16`; do + for y in `seq 0 128`; do + $ipset a test $ip$x$sep$y/$net,1023,$ip$y$sep$x/$net + done + done + ;; + net) + $ipset n test hash:net $1 hashsize 64 timeout 100 + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y/$net + done + done + ;; + netnet) + $ipset n test hash:net,net $1 hashsize 64 timeout 100 + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y/$net,$ip$y$sep$x/$net + done + done + ;; + netport) + $ipset n test hash:net,port $1 hashsize 64 timeout 100 + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y/$net,1023 + done + done + ;; + netiface) + $ipset n test hash:net,iface $1 hashsize 64 timeout 100 + for x in `seq 0 16`; do + for y in `seq 0 255`; do + $ipset a test $ip$x$sep$y/$net,eth0 + done + done + ;; +esac +$ipset l test | grep ^$ip | while read x y z; do + if [ $z -lt 10 -o $z -gt 100 ]; then + exit 1 + fi +done +$ipset x +exit 0 diff --git a/tests/restore.t b/tests/restore.t new file mode 100644 index 0000000..ffde2d1 --- /dev/null +++ b/tests/restore.t @@ -0,0 +1,9 @@ +# Check multi-set restore +0 ipset restore < restore.t.multi +# Save sets and compare +0 ipset save > .foo && diff restore.t.multi.saved .foo +# Delete all sets +0 ipset x +# Check auto-increasing maximal number of sets +0 ./setlist_resize.sh +# eof diff --git a/tests/restore.t.destroy b/tests/restore.t.destroy new file mode 100644 index 0000000..56d4f93 --- /dev/null +++ b/tests/restore.t.destroy @@ -0,0 +1,2 @@ +destroy a +destroy b diff --git a/tests/restore.t.list0 b/tests/restore.t.list0 new file mode 100644 index 0000000..3c73ab3 --- /dev/null +++ b/tests/restore.t.list0 @@ -0,0 +1,10 @@ +Name: a +Type: hash:ip +Header: family inet6 hashsize 1024 maxelem 65536 +Size in memory: 416 +References: 0 +Number of entries: 3 +Members: +3::3 +4::4 +a::a diff --git a/tests/restore.t.list1 b/tests/restore.t.list1 new file mode 100644 index 0000000..e2c1f8e --- /dev/null +++ b/tests/restore.t.list1 @@ -0,0 +1,10 @@ +Name: b +Type: hash:ip +Header: family inet6 hashsize 1024 maxelem 65536 +Size in memory: 416 +References: 0 +Number of entries: 3 +Members: +1::1 +2::2 +b::b diff --git a/tests/restore.t.multi b/tests/restore.t.multi new file mode 100644 index 0000000..5f5d026 --- /dev/null +++ b/tests/restore.t.multi @@ -0,0 +1,9 @@ +create priviledged-ports bitmap:port range 1-1023 timeout 0 +add priviledged-ports 1-1023 +create test-net bitmap:ip range 10.1.1.172/29 timeout 0 +add test-net 10.1.1.172/29 +create test-ports bitmap:port range 12770-19999 timeout 0 +add test-ports 12770-12784 +add test-ports 19999 +create test-port bitmap:port range 29950-29950 timeout 0 +add test-port 29950 diff --git a/tests/restore.t.multi.saved b/tests/restore.t.multi.saved new file mode 100644 index 0000000..5a569ba --- /dev/null +++ b/tests/restore.t.multi.saved @@ -0,0 +1,1052 @@ +create priviledged-ports bitmap:port range 1-1023 timeout 0 +add priviledged-ports 1 timeout 0 +add priviledged-ports 2 timeout 0 +add priviledged-ports 3 timeout 0 +add priviledged-ports 4 timeout 0 +add priviledged-ports 5 timeout 0 +add priviledged-ports 6 timeout 0 +add priviledged-ports 7 timeout 0 +add priviledged-ports 8 timeout 0 +add priviledged-ports 9 timeout 0 +add priviledged-ports 10 timeout 0 +add priviledged-ports 11 timeout 0 +add priviledged-ports 12 timeout 0 +add priviledged-ports 13 timeout 0 +add priviledged-ports 14 timeout 0 +add priviledged-ports 15 timeout 0 +add priviledged-ports 16 timeout 0 +add priviledged-ports 17 timeout 0 +add priviledged-ports 18 timeout 0 +add priviledged-ports 19 timeout 0 +add priviledged-ports 20 timeout 0 +add priviledged-ports 21 timeout 0 +add priviledged-ports 22 timeout 0 +add priviledged-ports 23 timeout 0 +add priviledged-ports 24 timeout 0 +add priviledged-ports 25 timeout 0 +add priviledged-ports 26 timeout 0 +add priviledged-ports 27 timeout 0 +add priviledged-ports 28 timeout 0 +add priviledged-ports 29 timeout 0 +add priviledged-ports 30 timeout 0 +add priviledged-ports 31 timeout 0 +add priviledged-ports 32 timeout 0 +add priviledged-ports 33 timeout 0 +add priviledged-ports 34 timeout 0 +add priviledged-ports 35 timeout 0 +add priviledged-ports 36 timeout 0 +add priviledged-ports 37 timeout 0 +add priviledged-ports 38 timeout 0 +add priviledged-ports 39 timeout 0 +add priviledged-ports 40 timeout 0 +add priviledged-ports 41 timeout 0 +add priviledged-ports 42 timeout 0 +add priviledged-ports 43 timeout 0 +add priviledged-ports 44 timeout 0 +add priviledged-ports 45 timeout 0 +add priviledged-ports 46 timeout 0 +add priviledged-ports 47 timeout 0 +add priviledged-ports 48 timeout 0 +add priviledged-ports 49 timeout 0 +add priviledged-ports 50 timeout 0 +add priviledged-ports 51 timeout 0 +add priviledged-ports 52 timeout 0 +add priviledged-ports 53 timeout 0 +add priviledged-ports 54 timeout 0 +add priviledged-ports 55 timeout 0 +add priviledged-ports 56 timeout 0 +add priviledged-ports 57 timeout 0 +add priviledged-ports 58 timeout 0 +add priviledged-ports 59 timeout 0 +add priviledged-ports 60 timeout 0 +add priviledged-ports 61 timeout 0 +add priviledged-ports 62 timeout 0 +add priviledged-ports 63 timeout 0 +add priviledged-ports 64 timeout 0 +add priviledged-ports 65 timeout 0 +add priviledged-ports 66 timeout 0 +add priviledged-ports 67 timeout 0 +add priviledged-ports 68 timeout 0 +add priviledged-ports 69 timeout 0 +add priviledged-ports 70 timeout 0 +add priviledged-ports 71 timeout 0 +add priviledged-ports 72 timeout 0 +add priviledged-ports 73 timeout 0 +add priviledged-ports 74 timeout 0 +add priviledged-ports 75 timeout 0 +add priviledged-ports 76 timeout 0 +add priviledged-ports 77 timeout 0 +add priviledged-ports 78 timeout 0 +add priviledged-ports 79 timeout 0 +add priviledged-ports 80 timeout 0 +add priviledged-ports 81 timeout 0 +add priviledged-ports 82 timeout 0 +add priviledged-ports 83 timeout 0 +add priviledged-ports 84 timeout 0 +add priviledged-ports 85 timeout 0 +add priviledged-ports 86 timeout 0 +add priviledged-ports 87 timeout 0 +add priviledged-ports 88 timeout 0 +add priviledged-ports 89 timeout 0 +add priviledged-ports 90 timeout 0 +add priviledged-ports 91 timeout 0 +add priviledged-ports 92 timeout 0 +add priviledged-ports 93 timeout 0 +add priviledged-ports 94 timeout 0 +add priviledged-ports 95 timeout 0 +add priviledged-ports 96 timeout 0 +add priviledged-ports 97 timeout 0 +add priviledged-ports 98 timeout 0 +add priviledged-ports 99 timeout 0 +add priviledged-ports 100 timeout 0 +add priviledged-ports 101 timeout 0 +add priviledged-ports 102 timeout 0 +add priviledged-ports 103 timeout 0 +add priviledged-ports 104 timeout 0 +add priviledged-ports 105 timeout 0 +add priviledged-ports 106 timeout 0 +add priviledged-ports 107 timeout 0 +add priviledged-ports 108 timeout 0 +add priviledged-ports 109 timeout 0 +add priviledged-ports 110 timeout 0 +add priviledged-ports 111 timeout 0 +add priviledged-ports 112 timeout 0 +add priviledged-ports 113 timeout 0 +add priviledged-ports 114 timeout 0 +add priviledged-ports 115 timeout 0 +add priviledged-ports 116 timeout 0 +add priviledged-ports 117 timeout 0 +add priviledged-ports 118 timeout 0 +add priviledged-ports 119 timeout 0 +add priviledged-ports 120 timeout 0 +add priviledged-ports 121 timeout 0 +add priviledged-ports 122 timeout 0 +add priviledged-ports 123 timeout 0 +add priviledged-ports 124 timeout 0 +add priviledged-ports 125 timeout 0 +add priviledged-ports 126 timeout 0 +add priviledged-ports 127 timeout 0 +add priviledged-ports 128 timeout 0 +add priviledged-ports 129 timeout 0 +add priviledged-ports 130 timeout 0 +add priviledged-ports 131 timeout 0 +add priviledged-ports 132 timeout 0 +add priviledged-ports 133 timeout 0 +add priviledged-ports 134 timeout 0 +add priviledged-ports 135 timeout 0 +add priviledged-ports 136 timeout 0 +add priviledged-ports 137 timeout 0 +add priviledged-ports 138 timeout 0 +add priviledged-ports 139 timeout 0 +add priviledged-ports 140 timeout 0 +add priviledged-ports 141 timeout 0 +add priviledged-ports 142 timeout 0 +add priviledged-ports 143 timeout 0 +add priviledged-ports 144 timeout 0 +add priviledged-ports 145 timeout 0 +add priviledged-ports 146 timeout 0 +add priviledged-ports 147 timeout 0 +add priviledged-ports 148 timeout 0 +add priviledged-ports 149 timeout 0 +add priviledged-ports 150 timeout 0 +add priviledged-ports 151 timeout 0 +add priviledged-ports 152 timeout 0 +add priviledged-ports 153 timeout 0 +add priviledged-ports 154 timeout 0 +add priviledged-ports 155 timeout 0 +add priviledged-ports 156 timeout 0 +add priviledged-ports 157 timeout 0 +add priviledged-ports 158 timeout 0 +add priviledged-ports 159 timeout 0 +add priviledged-ports 160 timeout 0 +add priviledged-ports 161 timeout 0 +add priviledged-ports 162 timeout 0 +add priviledged-ports 163 timeout 0 +add priviledged-ports 164 timeout 0 +add priviledged-ports 165 timeout 0 +add priviledged-ports 166 timeout 0 +add priviledged-ports 167 timeout 0 +add priviledged-ports 168 timeout 0 +add priviledged-ports 169 timeout 0 +add priviledged-ports 170 timeout 0 +add priviledged-ports 171 timeout 0 +add priviledged-ports 172 timeout 0 +add priviledged-ports 173 timeout 0 +add priviledged-ports 174 timeout 0 +add priviledged-ports 175 timeout 0 +add priviledged-ports 176 timeout 0 +add priviledged-ports 177 timeout 0 +add priviledged-ports 178 timeout 0 +add priviledged-ports 179 timeout 0 +add priviledged-ports 180 timeout 0 +add priviledged-ports 181 timeout 0 +add priviledged-ports 182 timeout 0 +add priviledged-ports 183 timeout 0 +add priviledged-ports 184 timeout 0 +add priviledged-ports 185 timeout 0 +add priviledged-ports 186 timeout 0 +add priviledged-ports 187 timeout 0 +add priviledged-ports 188 timeout 0 +add priviledged-ports 189 timeout 0 +add priviledged-ports 190 timeout 0 +add priviledged-ports 191 timeout 0 +add priviledged-ports 192 timeout 0 +add priviledged-ports 193 timeout 0 +add priviledged-ports 194 timeout 0 +add priviledged-ports 195 timeout 0 +add priviledged-ports 196 timeout 0 +add priviledged-ports 197 timeout 0 +add priviledged-ports 198 timeout 0 +add priviledged-ports 199 timeout 0 +add priviledged-ports 200 timeout 0 +add priviledged-ports 201 timeout 0 +add priviledged-ports 202 timeout 0 +add priviledged-ports 203 timeout 0 +add priviledged-ports 204 timeout 0 +add priviledged-ports 205 timeout 0 +add priviledged-ports 206 timeout 0 +add priviledged-ports 207 timeout 0 +add priviledged-ports 208 timeout 0 +add priviledged-ports 209 timeout 0 +add priviledged-ports 210 timeout 0 +add priviledged-ports 211 timeout 0 +add priviledged-ports 212 timeout 0 +add priviledged-ports 213 timeout 0 +add priviledged-ports 214 timeout 0 +add priviledged-ports 215 timeout 0 +add priviledged-ports 216 timeout 0 +add priviledged-ports 217 timeout 0 +add priviledged-ports 218 timeout 0 +add priviledged-ports 219 timeout 0 +add priviledged-ports 220 timeout 0 +add priviledged-ports 221 timeout 0 +add priviledged-ports 222 timeout 0 +add priviledged-ports 223 timeout 0 +add priviledged-ports 224 timeout 0 +add priviledged-ports 225 timeout 0 +add priviledged-ports 226 timeout 0 +add priviledged-ports 227 timeout 0 +add priviledged-ports 228 timeout 0 +add priviledged-ports 229 timeout 0 +add priviledged-ports 230 timeout 0 +add priviledged-ports 231 timeout 0 +add priviledged-ports 232 timeout 0 +add priviledged-ports 233 timeout 0 +add priviledged-ports 234 timeout 0 +add priviledged-ports 235 timeout 0 +add priviledged-ports 236 timeout 0 +add priviledged-ports 237 timeout 0 +add priviledged-ports 238 timeout 0 +add priviledged-ports 239 timeout 0 +add priviledged-ports 240 timeout 0 +add priviledged-ports 241 timeout 0 +add priviledged-ports 242 timeout 0 +add priviledged-ports 243 timeout 0 +add priviledged-ports 244 timeout 0 +add priviledged-ports 245 timeout 0 +add priviledged-ports 246 timeout 0 +add priviledged-ports 247 timeout 0 +add priviledged-ports 248 timeout 0 +add priviledged-ports 249 timeout 0 +add priviledged-ports 250 timeout 0 +add priviledged-ports 251 timeout 0 +add priviledged-ports 252 timeout 0 +add priviledged-ports 253 timeout 0 +add priviledged-ports 254 timeout 0 +add priviledged-ports 255 timeout 0 +add priviledged-ports 256 timeout 0 +add priviledged-ports 257 timeout 0 +add priviledged-ports 258 timeout 0 +add priviledged-ports 259 timeout 0 +add priviledged-ports 260 timeout 0 +add priviledged-ports 261 timeout 0 +add priviledged-ports 262 timeout 0 +add priviledged-ports 263 timeout 0 +add priviledged-ports 264 timeout 0 +add priviledged-ports 265 timeout 0 +add priviledged-ports 266 timeout 0 +add priviledged-ports 267 timeout 0 +add priviledged-ports 268 timeout 0 +add priviledged-ports 269 timeout 0 +add priviledged-ports 270 timeout 0 +add priviledged-ports 271 timeout 0 +add priviledged-ports 272 timeout 0 +add priviledged-ports 273 timeout 0 +add priviledged-ports 274 timeout 0 +add priviledged-ports 275 timeout 0 +add priviledged-ports 276 timeout 0 +add priviledged-ports 277 timeout 0 +add priviledged-ports 278 timeout 0 +add priviledged-ports 279 timeout 0 +add priviledged-ports 280 timeout 0 +add priviledged-ports 281 timeout 0 +add priviledged-ports 282 timeout 0 +add priviledged-ports 283 timeout 0 +add priviledged-ports 284 timeout 0 +add priviledged-ports 285 timeout 0 +add priviledged-ports 286 timeout 0 +add priviledged-ports 287 timeout 0 +add priviledged-ports 288 timeout 0 +add priviledged-ports 289 timeout 0 +add priviledged-ports 290 timeout 0 +add priviledged-ports 291 timeout 0 +add priviledged-ports 292 timeout 0 +add priviledged-ports 293 timeout 0 +add priviledged-ports 294 timeout 0 +add priviledged-ports 295 timeout 0 +add priviledged-ports 296 timeout 0 +add priviledged-ports 297 timeout 0 +add priviledged-ports 298 timeout 0 +add priviledged-ports 299 timeout 0 +add priviledged-ports 300 timeout 0 +add priviledged-ports 301 timeout 0 +add priviledged-ports 302 timeout 0 +add priviledged-ports 303 timeout 0 +add priviledged-ports 304 timeout 0 +add priviledged-ports 305 timeout 0 +add priviledged-ports 306 timeout 0 +add priviledged-ports 307 timeout 0 +add priviledged-ports 308 timeout 0 +add priviledged-ports 309 timeout 0 +add priviledged-ports 310 timeout 0 +add priviledged-ports 311 timeout 0 +add priviledged-ports 312 timeout 0 +add priviledged-ports 313 timeout 0 +add priviledged-ports 314 timeout 0 +add priviledged-ports 315 timeout 0 +add priviledged-ports 316 timeout 0 +add priviledged-ports 317 timeout 0 +add priviledged-ports 318 timeout 0 +add priviledged-ports 319 timeout 0 +add priviledged-ports 320 timeout 0 +add priviledged-ports 321 timeout 0 +add priviledged-ports 322 timeout 0 +add priviledged-ports 323 timeout 0 +add priviledged-ports 324 timeout 0 +add priviledged-ports 325 timeout 0 +add priviledged-ports 326 timeout 0 +add priviledged-ports 327 timeout 0 +add priviledged-ports 328 timeout 0 +add priviledged-ports 329 timeout 0 +add priviledged-ports 330 timeout 0 +add priviledged-ports 331 timeout 0 +add priviledged-ports 332 timeout 0 +add priviledged-ports 333 timeout 0 +add priviledged-ports 334 timeout 0 +add priviledged-ports 335 timeout 0 +add priviledged-ports 336 timeout 0 +add priviledged-ports 337 timeout 0 +add priviledged-ports 338 timeout 0 +add priviledged-ports 339 timeout 0 +add priviledged-ports 340 timeout 0 +add priviledged-ports 341 timeout 0 +add priviledged-ports 342 timeout 0 +add priviledged-ports 343 timeout 0 +add priviledged-ports 344 timeout 0 +add priviledged-ports 345 timeout 0 +add priviledged-ports 346 timeout 0 +add priviledged-ports 347 timeout 0 +add priviledged-ports 348 timeout 0 +add priviledged-ports 349 timeout 0 +add priviledged-ports 350 timeout 0 +add priviledged-ports 351 timeout 0 +add priviledged-ports 352 timeout 0 +add priviledged-ports 353 timeout 0 +add priviledged-ports 354 timeout 0 +add priviledged-ports 355 timeout 0 +add priviledged-ports 356 timeout 0 +add priviledged-ports 357 timeout 0 +add priviledged-ports 358 timeout 0 +add priviledged-ports 359 timeout 0 +add priviledged-ports 360 timeout 0 +add priviledged-ports 361 timeout 0 +add priviledged-ports 362 timeout 0 +add priviledged-ports 363 timeout 0 +add priviledged-ports 364 timeout 0 +add priviledged-ports 365 timeout 0 +add priviledged-ports 366 timeout 0 +add priviledged-ports 367 timeout 0 +add priviledged-ports 368 timeout 0 +add priviledged-ports 369 timeout 0 +add priviledged-ports 370 timeout 0 +add priviledged-ports 371 timeout 0 +add priviledged-ports 372 timeout 0 +add priviledged-ports 373 timeout 0 +add priviledged-ports 374 timeout 0 +add priviledged-ports 375 timeout 0 +add priviledged-ports 376 timeout 0 +add priviledged-ports 377 timeout 0 +add priviledged-ports 378 timeout 0 +add priviledged-ports 379 timeout 0 +add priviledged-ports 380 timeout 0 +add priviledged-ports 381 timeout 0 +add priviledged-ports 382 timeout 0 +add priviledged-ports 383 timeout 0 +add priviledged-ports 384 timeout 0 +add priviledged-ports 385 timeout 0 +add priviledged-ports 386 timeout 0 +add priviledged-ports 387 timeout 0 +add priviledged-ports 388 timeout 0 +add priviledged-ports 389 timeout 0 +add priviledged-ports 390 timeout 0 +add priviledged-ports 391 timeout 0 +add priviledged-ports 392 timeout 0 +add priviledged-ports 393 timeout 0 +add priviledged-ports 394 timeout 0 +add priviledged-ports 395 timeout 0 +add priviledged-ports 396 timeout 0 +add priviledged-ports 397 timeout 0 +add priviledged-ports 398 timeout 0 +add priviledged-ports 399 timeout 0 +add priviledged-ports 400 timeout 0 +add priviledged-ports 401 timeout 0 +add priviledged-ports 402 timeout 0 +add priviledged-ports 403 timeout 0 +add priviledged-ports 404 timeout 0 +add priviledged-ports 405 timeout 0 +add priviledged-ports 406 timeout 0 +add priviledged-ports 407 timeout 0 +add priviledged-ports 408 timeout 0 +add priviledged-ports 409 timeout 0 +add priviledged-ports 410 timeout 0 +add priviledged-ports 411 timeout 0 +add priviledged-ports 412 timeout 0 +add priviledged-ports 413 timeout 0 +add priviledged-ports 414 timeout 0 +add priviledged-ports 415 timeout 0 +add priviledged-ports 416 timeout 0 +add priviledged-ports 417 timeout 0 +add priviledged-ports 418 timeout 0 +add priviledged-ports 419 timeout 0 +add priviledged-ports 420 timeout 0 +add priviledged-ports 421 timeout 0 +add priviledged-ports 422 timeout 0 +add priviledged-ports 423 timeout 0 +add priviledged-ports 424 timeout 0 +add priviledged-ports 425 timeout 0 +add priviledged-ports 426 timeout 0 +add priviledged-ports 427 timeout 0 +add priviledged-ports 428 timeout 0 +add priviledged-ports 429 timeout 0 +add priviledged-ports 430 timeout 0 +add priviledged-ports 431 timeout 0 +add priviledged-ports 432 timeout 0 +add priviledged-ports 433 timeout 0 +add priviledged-ports 434 timeout 0 +add priviledged-ports 435 timeout 0 +add priviledged-ports 436 timeout 0 +add priviledged-ports 437 timeout 0 +add priviledged-ports 438 timeout 0 +add priviledged-ports 439 timeout 0 +add priviledged-ports 440 timeout 0 +add priviledged-ports 441 timeout 0 +add priviledged-ports 442 timeout 0 +add priviledged-ports 443 timeout 0 +add priviledged-ports 444 timeout 0 +add priviledged-ports 445 timeout 0 +add priviledged-ports 446 timeout 0 +add priviledged-ports 447 timeout 0 +add priviledged-ports 448 timeout 0 +add priviledged-ports 449 timeout 0 +add priviledged-ports 450 timeout 0 +add priviledged-ports 451 timeout 0 +add priviledged-ports 452 timeout 0 +add priviledged-ports 453 timeout 0 +add priviledged-ports 454 timeout 0 +add priviledged-ports 455 timeout 0 +add priviledged-ports 456 timeout 0 +add priviledged-ports 457 timeout 0 +add priviledged-ports 458 timeout 0 +add priviledged-ports 459 timeout 0 +add priviledged-ports 460 timeout 0 +add priviledged-ports 461 timeout 0 +add priviledged-ports 462 timeout 0 +add priviledged-ports 463 timeout 0 +add priviledged-ports 464 timeout 0 +add priviledged-ports 465 timeout 0 +add priviledged-ports 466 timeout 0 +add priviledged-ports 467 timeout 0 +add priviledged-ports 468 timeout 0 +add priviledged-ports 469 timeout 0 +add priviledged-ports 470 timeout 0 +add priviledged-ports 471 timeout 0 +add priviledged-ports 472 timeout 0 +add priviledged-ports 473 timeout 0 +add priviledged-ports 474 timeout 0 +add priviledged-ports 475 timeout 0 +add priviledged-ports 476 timeout 0 +add priviledged-ports 477 timeout 0 +add priviledged-ports 478 timeout 0 +add priviledged-ports 479 timeout 0 +add priviledged-ports 480 timeout 0 +add priviledged-ports 481 timeout 0 +add priviledged-ports 482 timeout 0 +add priviledged-ports 483 timeout 0 +add priviledged-ports 484 timeout 0 +add priviledged-ports 485 timeout 0 +add priviledged-ports 486 timeout 0 +add priviledged-ports 487 timeout 0 +add priviledged-ports 488 timeout 0 +add priviledged-ports 489 timeout 0 +add priviledged-ports 490 timeout 0 +add priviledged-ports 491 timeout 0 +add priviledged-ports 492 timeout 0 +add priviledged-ports 493 timeout 0 +add priviledged-ports 494 timeout 0 +add priviledged-ports 495 timeout 0 +add priviledged-ports 496 timeout 0 +add priviledged-ports 497 timeout 0 +add priviledged-ports 498 timeout 0 +add priviledged-ports 499 timeout 0 +add priviledged-ports 500 timeout 0 +add priviledged-ports 501 timeout 0 +add priviledged-ports 502 timeout 0 +add priviledged-ports 503 timeout 0 +add priviledged-ports 504 timeout 0 +add priviledged-ports 505 timeout 0 +add priviledged-ports 506 timeout 0 +add priviledged-ports 507 timeout 0 +add priviledged-ports 508 timeout 0 +add priviledged-ports 509 timeout 0 +add priviledged-ports 510 timeout 0 +add priviledged-ports 511 timeout 0 +add priviledged-ports 512 timeout 0 +add priviledged-ports 513 timeout 0 +add priviledged-ports 514 timeout 0 +add priviledged-ports 515 timeout 0 +add priviledged-ports 516 timeout 0 +add priviledged-ports 517 timeout 0 +add priviledged-ports 518 timeout 0 +add priviledged-ports 519 timeout 0 +add priviledged-ports 520 timeout 0 +add priviledged-ports 521 timeout 0 +add priviledged-ports 522 timeout 0 +add priviledged-ports 523 timeout 0 +add priviledged-ports 524 timeout 0 +add priviledged-ports 525 timeout 0 +add priviledged-ports 526 timeout 0 +add priviledged-ports 527 timeout 0 +add priviledged-ports 528 timeout 0 +add priviledged-ports 529 timeout 0 +add priviledged-ports 530 timeout 0 +add priviledged-ports 531 timeout 0 +add priviledged-ports 532 timeout 0 +add priviledged-ports 533 timeout 0 +add priviledged-ports 534 timeout 0 +add priviledged-ports 535 timeout 0 +add priviledged-ports 536 timeout 0 +add priviledged-ports 537 timeout 0 +add priviledged-ports 538 timeout 0 +add priviledged-ports 539 timeout 0 +add priviledged-ports 540 timeout 0 +add priviledged-ports 541 timeout 0 +add priviledged-ports 542 timeout 0 +add priviledged-ports 543 timeout 0 +add priviledged-ports 544 timeout 0 +add priviledged-ports 545 timeout 0 +add priviledged-ports 546 timeout 0 +add priviledged-ports 547 timeout 0 +add priviledged-ports 548 timeout 0 +add priviledged-ports 549 timeout 0 +add priviledged-ports 550 timeout 0 +add priviledged-ports 551 timeout 0 +add priviledged-ports 552 timeout 0 +add priviledged-ports 553 timeout 0 +add priviledged-ports 554 timeout 0 +add priviledged-ports 555 timeout 0 +add priviledged-ports 556 timeout 0 +add priviledged-ports 557 timeout 0 +add priviledged-ports 558 timeout 0 +add priviledged-ports 559 timeout 0 +add priviledged-ports 560 timeout 0 +add priviledged-ports 561 timeout 0 +add priviledged-ports 562 timeout 0 +add priviledged-ports 563 timeout 0 +add priviledged-ports 564 timeout 0 +add priviledged-ports 565 timeout 0 +add priviledged-ports 566 timeout 0 +add priviledged-ports 567 timeout 0 +add priviledged-ports 568 timeout 0 +add priviledged-ports 569 timeout 0 +add priviledged-ports 570 timeout 0 +add priviledged-ports 571 timeout 0 +add priviledged-ports 572 timeout 0 +add priviledged-ports 573 timeout 0 +add priviledged-ports 574 timeout 0 +add priviledged-ports 575 timeout 0 +add priviledged-ports 576 timeout 0 +add priviledged-ports 577 timeout 0 +add priviledged-ports 578 timeout 0 +add priviledged-ports 579 timeout 0 +add priviledged-ports 580 timeout 0 +add priviledged-ports 581 timeout 0 +add priviledged-ports 582 timeout 0 +add priviledged-ports 583 timeout 0 +add priviledged-ports 584 timeout 0 +add priviledged-ports 585 timeout 0 +add priviledged-ports 586 timeout 0 +add priviledged-ports 587 timeout 0 +add priviledged-ports 588 timeout 0 +add priviledged-ports 589 timeout 0 +add priviledged-ports 590 timeout 0 +add priviledged-ports 591 timeout 0 +add priviledged-ports 592 timeout 0 +add priviledged-ports 593 timeout 0 +add priviledged-ports 594 timeout 0 +add priviledged-ports 595 timeout 0 +add priviledged-ports 596 timeout 0 +add priviledged-ports 597 timeout 0 +add priviledged-ports 598 timeout 0 +add priviledged-ports 599 timeout 0 +add priviledged-ports 600 timeout 0 +add priviledged-ports 601 timeout 0 +add priviledged-ports 602 timeout 0 +add priviledged-ports 603 timeout 0 +add priviledged-ports 604 timeout 0 +add priviledged-ports 605 timeout 0 +add priviledged-ports 606 timeout 0 +add priviledged-ports 607 timeout 0 +add priviledged-ports 608 timeout 0 +add priviledged-ports 609 timeout 0 +add priviledged-ports 610 timeout 0 +add priviledged-ports 611 timeout 0 +add priviledged-ports 612 timeout 0 +add priviledged-ports 613 timeout 0 +add priviledged-ports 614 timeout 0 +add priviledged-ports 615 timeout 0 +add priviledged-ports 616 timeout 0 +add priviledged-ports 617 timeout 0 +add priviledged-ports 618 timeout 0 +add priviledged-ports 619 timeout 0 +add priviledged-ports 620 timeout 0 +add priviledged-ports 621 timeout 0 +add priviledged-ports 622 timeout 0 +add priviledged-ports 623 timeout 0 +add priviledged-ports 624 timeout 0 +add priviledged-ports 625 timeout 0 +add priviledged-ports 626 timeout 0 +add priviledged-ports 627 timeout 0 +add priviledged-ports 628 timeout 0 +add priviledged-ports 629 timeout 0 +add priviledged-ports 630 timeout 0 +add priviledged-ports 631 timeout 0 +add priviledged-ports 632 timeout 0 +add priviledged-ports 633 timeout 0 +add priviledged-ports 634 timeout 0 +add priviledged-ports 635 timeout 0 +add priviledged-ports 636 timeout 0 +add priviledged-ports 637 timeout 0 +add priviledged-ports 638 timeout 0 +add priviledged-ports 639 timeout 0 +add priviledged-ports 640 timeout 0 +add priviledged-ports 641 timeout 0 +add priviledged-ports 642 timeout 0 +add priviledged-ports 643 timeout 0 +add priviledged-ports 644 timeout 0 +add priviledged-ports 645 timeout 0 +add priviledged-ports 646 timeout 0 +add priviledged-ports 647 timeout 0 +add priviledged-ports 648 timeout 0 +add priviledged-ports 649 timeout 0 +add priviledged-ports 650 timeout 0 +add priviledged-ports 651 timeout 0 +add priviledged-ports 652 timeout 0 +add priviledged-ports 653 timeout 0 +add priviledged-ports 654 timeout 0 +add priviledged-ports 655 timeout 0 +add priviledged-ports 656 timeout 0 +add priviledged-ports 657 timeout 0 +add priviledged-ports 658 timeout 0 +add priviledged-ports 659 timeout 0 +add priviledged-ports 660 timeout 0 +add priviledged-ports 661 timeout 0 +add priviledged-ports 662 timeout 0 +add priviledged-ports 663 timeout 0 +add priviledged-ports 664 timeout 0 +add priviledged-ports 665 timeout 0 +add priviledged-ports 666 timeout 0 +add priviledged-ports 667 timeout 0 +add priviledged-ports 668 timeout 0 +add priviledged-ports 669 timeout 0 +add priviledged-ports 670 timeout 0 +add priviledged-ports 671 timeout 0 +add priviledged-ports 672 timeout 0 +add priviledged-ports 673 timeout 0 +add priviledged-ports 674 timeout 0 +add priviledged-ports 675 timeout 0 +add priviledged-ports 676 timeout 0 +add priviledged-ports 677 timeout 0 +add priviledged-ports 678 timeout 0 +add priviledged-ports 679 timeout 0 +add priviledged-ports 680 timeout 0 +add priviledged-ports 681 timeout 0 +add priviledged-ports 682 timeout 0 +add priviledged-ports 683 timeout 0 +add priviledged-ports 684 timeout 0 +add priviledged-ports 685 timeout 0 +add priviledged-ports 686 timeout 0 +add priviledged-ports 687 timeout 0 +add priviledged-ports 688 timeout 0 +add priviledged-ports 689 timeout 0 +add priviledged-ports 690 timeout 0 +add priviledged-ports 691 timeout 0 +add priviledged-ports 692 timeout 0 +add priviledged-ports 693 timeout 0 +add priviledged-ports 694 timeout 0 +add priviledged-ports 695 timeout 0 +add priviledged-ports 696 timeout 0 +add priviledged-ports 697 timeout 0 +add priviledged-ports 698 timeout 0 +add priviledged-ports 699 timeout 0 +add priviledged-ports 700 timeout 0 +add priviledged-ports 701 timeout 0 +add priviledged-ports 702 timeout 0 +add priviledged-ports 703 timeout 0 +add priviledged-ports 704 timeout 0 +add priviledged-ports 705 timeout 0 +add priviledged-ports 706 timeout 0 +add priviledged-ports 707 timeout 0 +add priviledged-ports 708 timeout 0 +add priviledged-ports 709 timeout 0 +add priviledged-ports 710 timeout 0 +add priviledged-ports 711 timeout 0 +add priviledged-ports 712 timeout 0 +add priviledged-ports 713 timeout 0 +add priviledged-ports 714 timeout 0 +add priviledged-ports 715 timeout 0 +add priviledged-ports 716 timeout 0 +add priviledged-ports 717 timeout 0 +add priviledged-ports 718 timeout 0 +add priviledged-ports 719 timeout 0 +add priviledged-ports 720 timeout 0 +add priviledged-ports 721 timeout 0 +add priviledged-ports 722 timeout 0 +add priviledged-ports 723 timeout 0 +add priviledged-ports 724 timeout 0 +add priviledged-ports 725 timeout 0 +add priviledged-ports 726 timeout 0 +add priviledged-ports 727 timeout 0 +add priviledged-ports 728 timeout 0 +add priviledged-ports 729 timeout 0 +add priviledged-ports 730 timeout 0 +add priviledged-ports 731 timeout 0 +add priviledged-ports 732 timeout 0 +add priviledged-ports 733 timeout 0 +add priviledged-ports 734 timeout 0 +add priviledged-ports 735 timeout 0 +add priviledged-ports 736 timeout 0 +add priviledged-ports 737 timeout 0 +add priviledged-ports 738 timeout 0 +add priviledged-ports 739 timeout 0 +add priviledged-ports 740 timeout 0 +add priviledged-ports 741 timeout 0 +add priviledged-ports 742 timeout 0 +add priviledged-ports 743 timeout 0 +add priviledged-ports 744 timeout 0 +add priviledged-ports 745 timeout 0 +add priviledged-ports 746 timeout 0 +add priviledged-ports 747 timeout 0 +add priviledged-ports 748 timeout 0 +add priviledged-ports 749 timeout 0 +add priviledged-ports 750 timeout 0 +add priviledged-ports 751 timeout 0 +add priviledged-ports 752 timeout 0 +add priviledged-ports 753 timeout 0 +add priviledged-ports 754 timeout 0 +add priviledged-ports 755 timeout 0 +add priviledged-ports 756 timeout 0 +add priviledged-ports 757 timeout 0 +add priviledged-ports 758 timeout 0 +add priviledged-ports 759 timeout 0 +add priviledged-ports 760 timeout 0 +add priviledged-ports 761 timeout 0 +add priviledged-ports 762 timeout 0 +add priviledged-ports 763 timeout 0 +add priviledged-ports 764 timeout 0 +add priviledged-ports 765 timeout 0 +add priviledged-ports 766 timeout 0 +add priviledged-ports 767 timeout 0 +add priviledged-ports 768 timeout 0 +add priviledged-ports 769 timeout 0 +add priviledged-ports 770 timeout 0 +add priviledged-ports 771 timeout 0 +add priviledged-ports 772 timeout 0 +add priviledged-ports 773 timeout 0 +add priviledged-ports 774 timeout 0 +add priviledged-ports 775 timeout 0 +add priviledged-ports 776 timeout 0 +add priviledged-ports 777 timeout 0 +add priviledged-ports 778 timeout 0 +add priviledged-ports 779 timeout 0 +add priviledged-ports 780 timeout 0 +add priviledged-ports 781 timeout 0 +add priviledged-ports 782 timeout 0 +add priviledged-ports 783 timeout 0 +add priviledged-ports 784 timeout 0 +add priviledged-ports 785 timeout 0 +add priviledged-ports 786 timeout 0 +add priviledged-ports 787 timeout 0 +add priviledged-ports 788 timeout 0 +add priviledged-ports 789 timeout 0 +add priviledged-ports 790 timeout 0 +add priviledged-ports 791 timeout 0 +add priviledged-ports 792 timeout 0 +add priviledged-ports 793 timeout 0 +add priviledged-ports 794 timeout 0 +add priviledged-ports 795 timeout 0 +add priviledged-ports 796 timeout 0 +add priviledged-ports 797 timeout 0 +add priviledged-ports 798 timeout 0 +add priviledged-ports 799 timeout 0 +add priviledged-ports 800 timeout 0 +add priviledged-ports 801 timeout 0 +add priviledged-ports 802 timeout 0 +add priviledged-ports 803 timeout 0 +add priviledged-ports 804 timeout 0 +add priviledged-ports 805 timeout 0 +add priviledged-ports 806 timeout 0 +add priviledged-ports 807 timeout 0 +add priviledged-ports 808 timeout 0 +add priviledged-ports 809 timeout 0 +add priviledged-ports 810 timeout 0 +add priviledged-ports 811 timeout 0 +add priviledged-ports 812 timeout 0 +add priviledged-ports 813 timeout 0 +add priviledged-ports 814 timeout 0 +add priviledged-ports 815 timeout 0 +add priviledged-ports 816 timeout 0 +add priviledged-ports 817 timeout 0 +add priviledged-ports 818 timeout 0 +add priviledged-ports 819 timeout 0 +add priviledged-ports 820 timeout 0 +add priviledged-ports 821 timeout 0 +add priviledged-ports 822 timeout 0 +add priviledged-ports 823 timeout 0 +add priviledged-ports 824 timeout 0 +add priviledged-ports 825 timeout 0 +add priviledged-ports 826 timeout 0 +add priviledged-ports 827 timeout 0 +add priviledged-ports 828 timeout 0 +add priviledged-ports 829 timeout 0 +add priviledged-ports 830 timeout 0 +add priviledged-ports 831 timeout 0 +add priviledged-ports 832 timeout 0 +add priviledged-ports 833 timeout 0 +add priviledged-ports 834 timeout 0 +add priviledged-ports 835 timeout 0 +add priviledged-ports 836 timeout 0 +add priviledged-ports 837 timeout 0 +add priviledged-ports 838 timeout 0 +add priviledged-ports 839 timeout 0 +add priviledged-ports 840 timeout 0 +add priviledged-ports 841 timeout 0 +add priviledged-ports 842 timeout 0 +add priviledged-ports 843 timeout 0 +add priviledged-ports 844 timeout 0 +add priviledged-ports 845 timeout 0 +add priviledged-ports 846 timeout 0 +add priviledged-ports 847 timeout 0 +add priviledged-ports 848 timeout 0 +add priviledged-ports 849 timeout 0 +add priviledged-ports 850 timeout 0 +add priviledged-ports 851 timeout 0 +add priviledged-ports 852 timeout 0 +add priviledged-ports 853 timeout 0 +add priviledged-ports 854 timeout 0 +add priviledged-ports 855 timeout 0 +add priviledged-ports 856 timeout 0 +add priviledged-ports 857 timeout 0 +add priviledged-ports 858 timeout 0 +add priviledged-ports 859 timeout 0 +add priviledged-ports 860 timeout 0 +add priviledged-ports 861 timeout 0 +add priviledged-ports 862 timeout 0 +add priviledged-ports 863 timeout 0 +add priviledged-ports 864 timeout 0 +add priviledged-ports 865 timeout 0 +add priviledged-ports 866 timeout 0 +add priviledged-ports 867 timeout 0 +add priviledged-ports 868 timeout 0 +add priviledged-ports 869 timeout 0 +add priviledged-ports 870 timeout 0 +add priviledged-ports 871 timeout 0 +add priviledged-ports 872 timeout 0 +add priviledged-ports 873 timeout 0 +add priviledged-ports 874 timeout 0 +add priviledged-ports 875 timeout 0 +add priviledged-ports 876 timeout 0 +add priviledged-ports 877 timeout 0 +add priviledged-ports 878 timeout 0 +add priviledged-ports 879 timeout 0 +add priviledged-ports 880 timeout 0 +add priviledged-ports 881 timeout 0 +add priviledged-ports 882 timeout 0 +add priviledged-ports 883 timeout 0 +add priviledged-ports 884 timeout 0 +add priviledged-ports 885 timeout 0 +add priviledged-ports 886 timeout 0 +add priviledged-ports 887 timeout 0 +add priviledged-ports 888 timeout 0 +add priviledged-ports 889 timeout 0 +add priviledged-ports 890 timeout 0 +add priviledged-ports 891 timeout 0 +add priviledged-ports 892 timeout 0 +add priviledged-ports 893 timeout 0 +add priviledged-ports 894 timeout 0 +add priviledged-ports 895 timeout 0 +add priviledged-ports 896 timeout 0 +add priviledged-ports 897 timeout 0 +add priviledged-ports 898 timeout 0 +add priviledged-ports 899 timeout 0 +add priviledged-ports 900 timeout 0 +add priviledged-ports 901 timeout 0 +add priviledged-ports 902 timeout 0 +add priviledged-ports 903 timeout 0 +add priviledged-ports 904 timeout 0 +add priviledged-ports 905 timeout 0 +add priviledged-ports 906 timeout 0 +add priviledged-ports 907 timeout 0 +add priviledged-ports 908 timeout 0 +add priviledged-ports 909 timeout 0 +add priviledged-ports 910 timeout 0 +add priviledged-ports 911 timeout 0 +add priviledged-ports 912 timeout 0 +add priviledged-ports 913 timeout 0 +add priviledged-ports 914 timeout 0 +add priviledged-ports 915 timeout 0 +add priviledged-ports 916 timeout 0 +add priviledged-ports 917 timeout 0 +add priviledged-ports 918 timeout 0 +add priviledged-ports 919 timeout 0 +add priviledged-ports 920 timeout 0 +add priviledged-ports 921 timeout 0 +add priviledged-ports 922 timeout 0 +add priviledged-ports 923 timeout 0 +add priviledged-ports 924 timeout 0 +add priviledged-ports 925 timeout 0 +add priviledged-ports 926 timeout 0 +add priviledged-ports 927 timeout 0 +add priviledged-ports 928 timeout 0 +add priviledged-ports 929 timeout 0 +add priviledged-ports 930 timeout 0 +add priviledged-ports 931 timeout 0 +add priviledged-ports 932 timeout 0 +add priviledged-ports 933 timeout 0 +add priviledged-ports 934 timeout 0 +add priviledged-ports 935 timeout 0 +add priviledged-ports 936 timeout 0 +add priviledged-ports 937 timeout 0 +add priviledged-ports 938 timeout 0 +add priviledged-ports 939 timeout 0 +add priviledged-ports 940 timeout 0 +add priviledged-ports 941 timeout 0 +add priviledged-ports 942 timeout 0 +add priviledged-ports 943 timeout 0 +add priviledged-ports 944 timeout 0 +add priviledged-ports 945 timeout 0 +add priviledged-ports 946 timeout 0 +add priviledged-ports 947 timeout 0 +add priviledged-ports 948 timeout 0 +add priviledged-ports 949 timeout 0 +add priviledged-ports 950 timeout 0 +add priviledged-ports 951 timeout 0 +add priviledged-ports 952 timeout 0 +add priviledged-ports 953 timeout 0 +add priviledged-ports 954 timeout 0 +add priviledged-ports 955 timeout 0 +add priviledged-ports 956 timeout 0 +add priviledged-ports 957 timeout 0 +add priviledged-ports 958 timeout 0 +add priviledged-ports 959 timeout 0 +add priviledged-ports 960 timeout 0 +add priviledged-ports 961 timeout 0 +add priviledged-ports 962 timeout 0 +add priviledged-ports 963 timeout 0 +add priviledged-ports 964 timeout 0 +add priviledged-ports 965 timeout 0 +add priviledged-ports 966 timeout 0 +add priviledged-ports 967 timeout 0 +add priviledged-ports 968 timeout 0 +add priviledged-ports 969 timeout 0 +add priviledged-ports 970 timeout 0 +add priviledged-ports 971 timeout 0 +add priviledged-ports 972 timeout 0 +add priviledged-ports 973 timeout 0 +add priviledged-ports 974 timeout 0 +add priviledged-ports 975 timeout 0 +add priviledged-ports 976 timeout 0 +add priviledged-ports 977 timeout 0 +add priviledged-ports 978 timeout 0 +add priviledged-ports 979 timeout 0 +add priviledged-ports 980 timeout 0 +add priviledged-ports 981 timeout 0 +add priviledged-ports 982 timeout 0 +add priviledged-ports 983 timeout 0 +add priviledged-ports 984 timeout 0 +add priviledged-ports 985 timeout 0 +add priviledged-ports 986 timeout 0 +add priviledged-ports 987 timeout 0 +add priviledged-ports 988 timeout 0 +add priviledged-ports 989 timeout 0 +add priviledged-ports 990 timeout 0 +add priviledged-ports 991 timeout 0 +add priviledged-ports 992 timeout 0 +add priviledged-ports 993 timeout 0 +add priviledged-ports 994 timeout 0 +add priviledged-ports 995 timeout 0 +add priviledged-ports 996 timeout 0 +add priviledged-ports 997 timeout 0 +add priviledged-ports 998 timeout 0 +add priviledged-ports 999 timeout 0 +add priviledged-ports 1000 timeout 0 +add priviledged-ports 1001 timeout 0 +add priviledged-ports 1002 timeout 0 +add priviledged-ports 1003 timeout 0 +add priviledged-ports 1004 timeout 0 +add priviledged-ports 1005 timeout 0 +add priviledged-ports 1006 timeout 0 +add priviledged-ports 1007 timeout 0 +add priviledged-ports 1008 timeout 0 +add priviledged-ports 1009 timeout 0 +add priviledged-ports 1010 timeout 0 +add priviledged-ports 1011 timeout 0 +add priviledged-ports 1012 timeout 0 +add priviledged-ports 1013 timeout 0 +add priviledged-ports 1014 timeout 0 +add priviledged-ports 1015 timeout 0 +add priviledged-ports 1016 timeout 0 +add priviledged-ports 1017 timeout 0 +add priviledged-ports 1018 timeout 0 +add priviledged-ports 1019 timeout 0 +add priviledged-ports 1020 timeout 0 +add priviledged-ports 1021 timeout 0 +add priviledged-ports 1022 timeout 0 +add priviledged-ports 1023 timeout 0 +create test-net bitmap:ip range 10.1.1.168-10.1.1.175 timeout 0 +add test-net 10.1.1.168 timeout 0 +add test-net 10.1.1.169 timeout 0 +add test-net 10.1.1.170 timeout 0 +add test-net 10.1.1.171 timeout 0 +add test-net 10.1.1.172 timeout 0 +add test-net 10.1.1.173 timeout 0 +add test-net 10.1.1.174 timeout 0 +add test-net 10.1.1.175 timeout 0 +create test-ports bitmap:port range 12770-19999 timeout 0 +add test-ports 12770 timeout 0 +add test-ports 12771 timeout 0 +add test-ports 12772 timeout 0 +add test-ports 12773 timeout 0 +add test-ports 12774 timeout 0 +add test-ports 12775 timeout 0 +add test-ports 12776 timeout 0 +add test-ports 12777 timeout 0 +add test-ports 12778 timeout 0 +add test-ports 12779 timeout 0 +add test-ports 12780 timeout 0 +add test-ports 12781 timeout 0 +add test-ports 12782 timeout 0 +add test-ports 12783 timeout 0 +add test-ports 12784 timeout 0 +add test-ports 19999 timeout 0 +create test-port bitmap:port range 29950-29950 timeout 0 +add test-port 29950 timeout 0 diff --git a/tests/restore.t.restore b/tests/restore.t.restore new file mode 100644 index 0000000..1865281 --- /dev/null +++ b/tests/restore.t.restore @@ -0,0 +1,11 @@ +create a hash:ip family inet6 +add a 1::1 +add a 2::2 +create b hash:ip family inet6 +add b 3::3 +add b 4::4 +rename a c +swap c b +rename c a +add a a::a +add b b::b diff --git a/tests/runtest.sh b/tests/runtest.sh new file mode 100755 index 0000000..7afa1dd --- /dev/null +++ b/tests/runtest.sh @@ -0,0 +1,140 @@ +#!/bin/bash + +# set -x + +ipset=${IPSET_BIN:-../src/ipset} + +tests="init" +tests="$tests ipmap bitmap:ip" +tests="$tests macipmap portmap" +tests="$tests iphash hash:ip hash:ip6" +tests="$tests ipporthash hash:ip,port hash:ip6,port" +tests="$tests ipmarkhash hash:ip,mark hash:ip6,mark" +tests="$tests ipportiphash hash:ip,port,ip hash:ip6,port,ip6" +tests="$tests nethash hash:net hash:net6 hash:net,port hash:net6,port" +tests="$tests hash:ip,port,net hash:ip6,port,net6 hash:net,net hash:net6,net6" +tests="$tests hash:net,port,net hash:net6,port,net6" +tests="$tests hash:net,iface.t hash:mac.t" +tests="$tests comment setlist restore" +# tests="$tests iptree iptreemap" + +# For correct sorting: +LC_ALL=C +export LC_ALL + +add_tests() { + # inet|inet6 network + if [ $1 = "inet" ]; then + cmd=iptables-save + add="match_target match_flags" + else + cmd=ip6tables-save + add=match_target6 + fi + #line="`dmesg | tail -1 | cut -d " " -f 2-`" + #if [ ! -e /var/log/kern.log -o -z "`grep -F \"$line\" /var/log/kern.log`" ]; then + # echo "The destination for kernel log is not /var/log/kern.log, skipping $1 match and target tests" + # return + #fi + c=${cmd%%-save} + if [ "`$c -m set -h 2>&1| grep 'cannot open shared object'`" ]; then + echo "$c does not support set match, skipping $1 match and target tests" + return + fi + if [ `$cmd -t filter | wc -l` -eq 7 -a \ + `$cmd -t filter | grep ACCEPT | wc -l` -eq 3 ]; then + if [ -z "`which sendip`" ]; then + echo "sendip utility is missig: skipping $1 match and target tests" + return + elif [ -n "`which ss`" ]; then + if [ -n "`ss -f $1 -t -u -a | grep $2`" ]; then + echo "Our test network $2 in use: skipping $1 match and target tests" + return + fi + elif [ -n "`which netstat`" ]; then + if [ -n "`netstat --protocol $1 -n | grep $2`" ]; then + echo "Our test network $2 in use: skipping $1 match and target tests" + return + fi + else + echo "Cannot check test network, skipping $1 match and target tests" + return + fi + tests="$tests $add" + else + echo "You have got iptables rules: skipping $1 match and target tests" + fi +} + +if [ "$1" ]; then + tests="init $@" +else + add_tests inet 10.255.255 + add_tests inet6 1002:1002:1002:1002:: +fi + +# Make sure the scripts are executable +chmod a+x check_* *.sh + +for types in $tests; do + $ipset -X test >/dev/null 2>&1 + if [ -f $types ]; then + filename=$types + else + filename=$types.t + fi + while read ret cmd; do + case $ret in + \#) + if [ "$cmd" = "eof" ]; then + break + fi + what=$cmd + continue + ;; + skip) + eval $cmd >/dev/null + if [ $? -ne 0 ]; then + echo "Skipping tests, '$cmd' failed" + break + fi + continue + ;; + *) + ;; + esac + echo -ne "$types: $what: " + cmd=`echo $cmd | sed "s|ipset|$ipset 2>.foo.err|"` + # For the case: ipset list | ... | xargs -n1 ipset + cmd=`echo $cmd | sed "s|ipset|$ipset|2g"` + eval $cmd + r=$? + # echo $ret $r + if [ "$ret" = "$r" ]; then + echo "passed" + else + echo "FAILED" + echo "Failed test: $cmd" + cat .foo.err + exit 1 + fi + # sleep 1 + done < $filename +done +# Remove test sets created by setlist.t +$ipset -X >/dev/null 2>&1 +for x in $tests; do + case $x in + init) + ;; + *) + for x in `lsmod | grep ip_set_ | awk '{print $1}'`; do + rmmod $x >/dev/null 2>&1 + done + ;; + esac +done +rmmod ip_set >/dev/null 2>&1 +rm -f .foo* +echo "All tests are passed" + diff --git a/tests/sendip.sh b/tests/sendip.sh new file mode 100755 index 0000000..3a951f5 --- /dev/null +++ b/tests/sendip.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +# Save lineno for checking +wc -l /var/log/kern.log | cut -d ' ' -f 1 > .loglines +sendip "$@" + diff --git a/tests/setlist.t b/tests/setlist.t new file mode 100644 index 0000000..7d14ec8 --- /dev/null +++ b/tests/setlist.t @@ -0,0 +1,214 @@ +# Create dummy set +0 ipset -N dummy list:set +# Create base set foo +0 ipset -N foo ipmap --from 2.0.0.1 --to 2.1.0.0 +# Create base set bar +0 ipset -N bar iphash +# Create setlist kind of set +0 ipset -N test setlist +# Swap test and dumy sets +0 ipset -W test dummy +# Destroy dummy set +0 ipset -X dummy +# Add foo set to setlist +0 ipset -A test foo +# Test foo set in setlist +0 ipset -T test foo +# Test nonexistent set in setlist +1 ipset -T test nonexistent +# Try to delete foo set +1 ipset -X foo +# Add bar set to setlist, after foo +0 ipset -A test bar +# Test bar,after,foo +0 ipset -T test bar,after,foo +# Test foo,before,bar +0 ipset -T test foo,before,bar +# Test bar,before,foo +1 ipset -T test bar,before,foo +# Test foo,after,bar +1 ipset -T test foo,after,bar +# Save sets +0 ipset -S > setlist.t.r +# Delete bar,before,foo +1 ipset -D test bar,before,foo +# Delete foo,after,bar +1 ipset -D test foo,after,bar +# Delete bar,after,foo +0 ipset -D test bar,after,foo +# Flush test set +0 ipset -F test +# Delete test set +0 ipset -X test +# Delete all sets +0 ipset -X +# Restore saved sets +0 ipset -R < setlist.t.r +# List set +0 ipset -L test | grep -v Revision: > .foo +# Check listing +0 diff -u -I 'Size in memory.*' .foo setlist.t.list0 +# Flush all sets +0 ipset -F +# Delete all sets +0 ipset -X && rm setlist.t.r +# Create sets a, b, c to check before/after in all combinations +0 ipset restore < setlist.t.before +# Add set b to test set +0 ipset add test b +# Add set c after b +0 ipset add test c after b +# Add set a before b +0 ipset add test a before b +# List test set +0 ipset list test | grep -v Revision: > .foo +# Check listing +0 diff -u -I 'Size in memory.*' .foo setlist.t.list1 +# Test a set before b +0 ipset test test a before b +# Test c set after b +0 ipset test test c after b +# Delete b set before c +0 ipset del test b before c +# List test set +0 ipset list test | grep -v Revision: > .foo +# Check listing +0 diff -u -I 'Size in memory.*' .foo setlist.t.list2 +# Delete c set after a +0 ipset del test c after a +# List test set +0 ipset list test | grep -v Revision: > .foo +# Check listing +0 diff -u -I 'Size in memory.*' .foo setlist.t.list3 +# List all sets +0 sleep .1s; ipset list | grep -v Revision: > .foo +# Check listing +0 diff -u -I 'Size in memory.*' .foo setlist.t.list4 +# Flush sets +0 ipset flush +# Destroy sets +0 ipset destroy +# Restore list:set with timeout +0 ipset -R < setlist.t.restore +# Add set "before" last one +0 ipset add test e before d +# Try to add already added set +1 ipset add test a +# Check reference number of added set +0 ref=`ipset list a | grep References | sed 's/References: //'` && test $ref -eq 1 +# Try to add already added set with exist flag +0 ipset add test a -! +# Check reference number of added set +0 ref=`ipset list a | grep References | sed 's/References: //'` && test $ref -eq 1 +# Delete set from the set +0 ipset del test a +# Check reference number of deleted set +0 ref=`sleep .1s; ipset list a | grep References | sed 's/References: //'` && test $ref -eq 0 +# Add element to set a +0 ipset add a 1.1.1.1 +# Swap sets +0 ipset swap a b +# Check reference number of deleted set +0 ref=`ipset list a | grep References | sed 's/References: //'` && test $ref -eq 0 +# Check reference number of member set +0 ref=`ipset list b | grep References | sed 's/References: //'` && test $ref -eq 1 +# Check element in member set +0 ipset test b 1.1.1.1 +# Sleep 10s so that entries can time out +0 sleep 10 +# Check reference numbers of the sets +0 ref=`ipset list | grep 'References: 1' | wc -l` && test $ref -eq 0 +# Flush test set +0 ipset flush test +# Add element with 1s timeout +0 ipset add test a timeout 1 +# Readd element with 3s timeout +0 ipset add test a timeout 3 -exist +# Sleep 2s +# Check readded element +0 ipset test test a +# Flush all sets +0 ipset flush +# Delete test set +0 ipset x test +# Counters: create set +0 ipset n test list:set counters +# Counters: add element with packet, byte counters +0 ipset a test a packets 5 bytes 3456 +# Counters: check counters +0 ./check_counters test a 5 3456 +# Counters: delete element +0 ipset d test a +# Counters: add element with packet, byte counters +0 ipset a test b packets 12 bytes 9876 +# Counters: check counters +0 ./check_counters test b 12 9876 +# Counters: update counters +0 ipset -! a test b packets 13 bytes 12479 +# Counters: check counters +0 ./check_counters test b 13 12479 +# Counters: flush test set +0 ipset f test +# Counters: destroy set +0 ipset x test +# Counters and timeout: create set +0 ipset n test list:set counters timeout 600 +# Counters and timeout: add element with packet, byte counters +0 ipset a test a packets 5 bytes 3456 +# Counters and timeout: check counters +0 ./check_extensions test a 600 5 3456 +# Counters and timeout: add element with packet, byte counters +0 ipset a test b packets 12 bytes 9876 +# Counters and timeout: check counters +0 ./check_extensions test b 600 12 9876 +# Counters and timeout: update counters +0 ipset -! a test b packets 13 bytes 12479 +# Counters and timeout: check counters +0 ./check_extensions test b 600 13 12479 +# Counters and timeout: update timeout +0 ipset -! a test b timeout 700 +# Counters and timeout: check counters +0 ./check_extensions test b 700 13 12479 +# Counters and timeout: flush +0 ipset f test +# Counters and timeout: destroy sets +0 ipset x +# Counters: require sendip +skip which sendip >/dev/null +# Counters: create set +0 ipset n a hash:ip counters +# Counters: create list set +0 ipset n test list:set counters +# Counters: add elemet with zero counters +0 ipset a a 10.255.255.64 +# Counters: add set to test set +0 ipset a test a +# Counters: generate packets +0 ./check_sendip_packets -4 src 5 +# Counters: check counters +0 ./check_counters a 10.255.255.64 5 $((5*40)) +# Counters: check counters in list set +0 ./check_counters test a 5 $((5*40)) +# Counters: flush sets +0 ipset f +# Counters: destroy sets +0 ipset x +# Counters and timeout: create set +0 ipset n a hash:ip counters timeout 600 +# Counters and timeout: create list set +0 ipset n test list:set counters timeout 600 +# Counters and timeout: add elemet with zero counters +0 ipset a a 10.255.255.64 +# Counters: add set to test set +0 ipset a test a +# Counters and timeout: generate packets +0 ./check_sendip_packets -4 src 6 +# Counters and timeout: check counters +0 ./check_extensions a 10.255.255.64 600 6 $((6*40)) +# Counters and timeout: check counters in list set +0 ./check_extensions test a 600 6 $((6*40)) +# Counters and timeout: flush sets +0 ipset f +# Counters and timeout: destroy sets +0 ipset x +# eof diff --git a/tests/setlist.t.before b/tests/setlist.t.before new file mode 100644 index 0000000..64ed849 --- /dev/null +++ b/tests/setlist.t.before @@ -0,0 +1,5 @@ +create a hash:ip +create b hash:ip +create c hash:ip +create test list:set +create d hash:ip diff --git a/tests/setlist.t.list0 b/tests/setlist.t.list0 new file mode 100644 index 0000000..2925a73 --- /dev/null +++ b/tests/setlist.t.list0 @@ -0,0 +1,9 @@ +Name: test +Type: list:set +Header: size 8 +Size in memory: 224 +References: 0 +Number of entries: 2 +Members: +foo +bar diff --git a/tests/setlist.t.list1 b/tests/setlist.t.list1 new file mode 100644 index 0000000..5446c14 --- /dev/null +++ b/tests/setlist.t.list1 @@ -0,0 +1,10 @@ +Name: test +Type: list:set +Header: size 8 +Size in memory: 264 +References: 0 +Number of entries: 3 +Members: +a +b +c diff --git a/tests/setlist.t.list2 b/tests/setlist.t.list2 new file mode 100644 index 0000000..70fb52b --- /dev/null +++ b/tests/setlist.t.list2 @@ -0,0 +1,9 @@ +Name: test +Type: list:set +Header: size 8 +Size in memory: 224 +References: 0 +Number of entries: 2 +Members: +a +c diff --git a/tests/setlist.t.list3 b/tests/setlist.t.list3 new file mode 100644 index 0000000..6be4b37 --- /dev/null +++ b/tests/setlist.t.list3 @@ -0,0 +1,8 @@ +Name: test +Type: list:set +Header: size 8 +Size in memory: 184 +References: 0 +Number of entries: 1 +Members: +a diff --git a/tests/setlist.t.list4 b/tests/setlist.t.list4 new file mode 100644 index 0000000..6b115d9 --- /dev/null +++ b/tests/setlist.t.list4 @@ -0,0 +1,40 @@ +Name: a +Type: hash:ip +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 152 +References: 1 +Number of entries: 0 +Members: + +Name: b +Type: hash:ip +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 152 +References: 0 +Number of entries: 0 +Members: + +Name: c +Type: hash:ip +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 152 +References: 0 +Number of entries: 0 +Members: + +Name: d +Type: hash:ip +Header: family inet hashsize 1024 maxelem 65536 +Size in memory: 152 +References: 0 +Number of entries: 0 +Members: + +Name: test +Type: list:set +Header: size 8 +Size in memory: 184 +References: 0 +Number of entries: 1 +Members: +a diff --git a/tests/setlist.t.restore b/tests/setlist.t.restore new file mode 100644 index 0000000..55c145b --- /dev/null +++ b/tests/setlist.t.restore @@ -0,0 +1,10 @@ +create a hash:ip +create b hash:ip +create c hash:ip +create d hash:ip +create e hash:ip +create test list:set timeout 5 size 4 +add test a +add test b +add test c +add test d diff --git a/tests/setlist_resize.sh b/tests/setlist_resize.sh new file mode 100755 index 0000000..3255656 --- /dev/null +++ b/tests/setlist_resize.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +# set -x + +ipset=${IPSET_BIN:-../src/ipset} + +loop=8 + +for x in ip_set_list_set ip_set_hash_netiface ip_set_hash_ipportnet \ + ip_set_hash_netport ip_set_hash_net ip_set_hash_ipportip \ + ip_set_hash_ipport ip_set_hash_ip ip_set_hash_netnet \ + ip_set_hash_netportnet ip_set_hash_ipmark ip_set_hash_mac \ + ip_set_bitmap_port ip_set_bitmap_ipmac \ + ip_set_bitmap_ip xt_set ip_set; do + rmmod $x +done + +create() { + n=$1 + while [ $n -le 1024 ]; do + $ipset c test$n hash:ip + n=$((n+2)) + done +} + +for x in `seq 1 $loop`; do + # echo "test round $x" + create 1 & + create 2 & + wait + test `$ipset l -n | wc -l` -eq 1024 || exit 1 + $ipset x + test `lsmod|grep -w ^ip_set_hash_ip | awk '{print $3}'` -eq 0 || exit 1 + rmmod ip_set_hash_ip + rmmod ip_set +done diff --git a/tests/sort.sh b/tests/sort.sh new file mode 100755 index 0000000..c5edad1 --- /dev/null +++ b/tests/sort.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +head -n 7 $1 > .foo +tail -n +8 $1 | grep '[[:alnum:]]' | sort >> .foo +rm $1 diff --git a/utils/Makefile.am b/utils/Makefile.am new file mode 100644 index 0000000..40128d3 --- /dev/null +++ b/utils/Makefile.am @@ -0,0 +1,4 @@ +include $(top_srcdir)/Make_global.am + +bashcompdir = @bashcompdir@ +dist_bashcomp_DATA = ipset_bash_completion/ipset diff --git a/utils/Makefile.in b/utils/Makefile.in new file mode 100644 index 0000000..e666ebc --- /dev/null +++ b/utils/Makefile.in @@ -0,0 +1,645 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 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@ + +# This is _NOT_ the library release version, it's an API version. +# Please read Chapter 6 "Library interface versions" of the libtool +# documentation before making any modification +# +# http://sources.redhat.com/autobook/autobook/autobook_91.html +# +# The version scheme used by Libtool tracks interfaces, where an interface +# is the set of exported entry points into the library. All Libtool libraries +# start with `-version-info' set to `0:0:0' -- this will be the default +# version number if you don't explicitly set it on the Libtool link command +# line. The meaning of these numbers (from left to right) is as follows: +# +# current +# The number of the current interface exported by the library. A current +# value of `0', means that you are calling the interface exported by this +# library interface 0. +# +# revision +# The implementation number of the most recent interface exported by this +# library. In this case, a revision value of `0' means that this is the +# first implementation of the interface. +# +# If the next release of this library exports the same interface, but has +# a different implementation (perhaps some bugs have been fixed), the +# revision number will be higher, but current number will be the same. +# In that case, when given a choice, the library with the highest revision +# will always be used by the runtime loader. +# +# age +# The number of previous additional interfaces supported by this library. +# If age were `2', then this library can be linked into executables which +# were built with a release of this library that exported the current +# interface number, current, or any of the previous two interfaces. +# +# By definition age must be less than or equal to current. At the outset, +# only the first ever interface is implemented, so age can only be `0'. +# +# 1. If you have changed any of the sources for this library, the revision +# number must be incremented. +# This is a new revision of the current interface. +# +# 2. If the interface has changed, then current must be incremented, and +# revision reset to `0'. +# This is the first revision of a new interface. +# +# 3. If the new interface is a superset of the previous interface (that is, +# if the previous interface has not been broken by the changes in this +# new release), then age must be incremented. +# This release is backwards compatible with the previous release. +# +# 4. If the new interface has removed elements with respect to the previous +# interface, then you have broken backward compatibility and age must be +# reset to `0'. +# This release has a new, but backwards incompatible interface. +# +# For example, if the next release of the library included some new commands +# for an existing socket protocol, you would use -version-info 1:0:1. +# This is the first revision of a new interface. This release is backwards +# compatible with the previous release. +# +# Later, you implement a faster way of handling part of the algorithm at the +# core of the library, and release it with -version-info 1:1:1. This is a new +# revision of the current interface. +# +# Unfortunately the speed of your new implementation can only be fully +# exploited by changing the API to access the structures at a lower level, +# which breaks compatibility with the previous interface, so you release it +# as -version-info 2:0:0. This release has a new, but backwards incompatible +# interface. + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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@ +@ENABLE_DEBUG_TRUE@am__append_1 = -g -g3 -ggdb -gdwarf-2 -DIPSET_DEBUG -Wall -Werror +@ENABLE_DEBUG_FALSE@am__append_2 = -O2 -DNDEBUG +subdir = utils +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltargz.m4 \ + $(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(dist_bashcomp_DATA) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +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__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(bashcompdir)" +DATA = $(dist_bashcomp_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/Make_global.am +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +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@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +HAVE_CHECKENTRY_BOOL = @HAVE_CHECKENTRY_BOOL@ +HAVE_ETHER_ADDR_COPY = @HAVE_ETHER_ADDR_COPY@ +HAVE_ETHER_ADDR_EQUAL = @HAVE_ETHER_ADDR_EQUAL@ +HAVE_EXPORT_H = @HAVE_EXPORT_H@ +HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H = @HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H@ +HAVE_IPV6_SKIP_EXTHDR_ARGS = @HAVE_IPV6_SKIP_EXTHDR_ARGS@ +HAVE_IS_ZERO_ETHER_ADDR = @HAVE_IS_ZERO_ETHER_ADDR@ +HAVE_KVCALLOC = @HAVE_KVCALLOC@ +HAVE_KVFREE = @HAVE_KVFREE@ +HAVE_LIST_LAST_ENTRY = @HAVE_LIST_LAST_ENTRY@ +HAVE_LIST_NEXT_ENTRY = @HAVE_LIST_NEXT_ENTRY@ +HAVE_LOCKDEP_NFNL_IS_HELD = @HAVE_LOCKDEP_NFNL_IS_HELD@ +HAVE_NETLINK_DUMP_START_ARGS = @HAVE_NETLINK_DUMP_START_ARGS@ +HAVE_NETLINK_EXTENDED_ACK = @HAVE_NETLINK_EXTENDED_ACK@ +HAVE_NET_IN_NFNL_CALLBACK_FN = @HAVE_NET_IN_NFNL_CALLBACK_FN@ +HAVE_NET_IN_XT_ACTION_PARAM = @HAVE_NET_IN_XT_ACTION_PARAM@ +HAVE_NET_OPS_ASYNC = @HAVE_NET_OPS_ASYNC@ +HAVE_NET_OPS_ID = @HAVE_NET_OPS_ID@ +HAVE_NFNL_LOCK_SUBSYS = @HAVE_NFNL_LOCK_SUBSYS@ +HAVE_NFNL_MSG_TYPE = @HAVE_NFNL_MSG_TYPE@ +HAVE_NF_BRIDGE_GET_PHYSDEV = @HAVE_NF_BRIDGE_GET_PHYSDEV@ +HAVE_NLA_PUT_64BIT = @HAVE_NLA_PUT_64BIT@ +HAVE_NLA_PUT_BE16 = @HAVE_NLA_PUT_BE16@ +HAVE_NLA_PUT_BE64 = @HAVE_NLA_PUT_BE64@ +HAVE_NLA_PUT_IN_ADDR = @HAVE_NLA_PUT_IN_ADDR@ +HAVE_NL_INFO_PORTID = @HAVE_NL_INFO_PORTID@ +HAVE_NS_CAPABLE = @HAVE_NS_CAPABLE@ +HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS = @HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS@ +HAVE_PASSING_EXTENDED_ACK_TO_PARSERS = @HAVE_PASSING_EXTENDED_ACK_TO_PARSERS@ +HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE = @HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE@ +HAVE_STATE_IN_XT_ACTION_PARAM = @HAVE_STATE_IN_XT_ACTION_PARAM@ +HAVE_STRSCPY = @HAVE_STRSCPY@ +HAVE_STRUCT_XT_ACTION_PARAM = @HAVE_STRUCT_XT_ACTION_PARAM@ +HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET = @HAVE_TCF_EMATCH_OPS_CHANGE_ARG_NET@ +HAVE_TCF_EMATCH_STRUCT_NET = @HAVE_TCF_EMATCH_STRUCT_NET@ +HAVE_TC_SKB_PROTOCOL = @HAVE_TC_SKB_PROTOCOL@ +HAVE_TIMER_SETUP = @HAVE_TIMER_SETUP@ +HAVE_TYPEDEF_SCTP_SCTPHDR_T = @HAVE_TYPEDEF_SCTP_SCTPHDR_T@ +HAVE_USER_NS_IN_STRUCT_NET = @HAVE_USER_NS_IN_STRUCT_NET@ +HAVE_VZALLOC = @HAVE_VZALLOC@ +HAVE_XT_FAMILY = @HAVE_XT_FAMILY@ +HAVE_XT_MTCHK_PARAM_STRUCT_NET = @HAVE_XT_MTCHK_PARAM_STRUCT_NET@ +HAVE_XT_NET = @HAVE_XT_NET@ +HAVE_XT_TARGET_PARAM = @HAVE_XT_TARGET_PARAM@ +INCLTDL = @INCLTDL@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KBUILDDIR = @KBUILDDIR@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBADD_DL = @LIBADD_DL@ +LIBADD_DLD_LINK = @LIBADD_DLD_LINK@ +LIBADD_DLOPEN = @LIBADD_DLOPEN@ +LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@ +LIBLTDL = @LIBLTDL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTDLDEPS = @LTDLDEPS@ +LTDLINCL = @LTDLINCL@ +LTDLOPEN = @LTDLOPEN@ +LTLIBOBJS = @LTLIBOBJS@ +LT_ARGZ_H = @LT_ARGZ_H@ +LT_CONFIG_H = @LT_CONFIG_H@ +LT_DLLOADERS = @LT_DLLOADERS@ +LT_DLPREOPEN = @LT_DLPREOPEN@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAXSETS = @MAXSETS@ +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@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SETTYPE_MODLIST = @SETTYPE_MODLIST@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +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_AR = @ac_ct_AR@ +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@ +bashcompdir = @bashcompdir@ +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@ +libmnl_CFLAGS = @libmnl_CFLAGS@ +libmnl_LIBS = @libmnl_LIBS@ +localedir = @localedir@ +localstatedir = @localstatedir@ +ltdl_LIBOBJS = @ltdl_LIBOBJS@ +ltdl_LTLIBOBJS = @ltdl_LTLIBOBJS@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sys_symbol_underscore = @sys_symbol_underscore@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# curr:rev:age +LIBVERSION = 14:0:1 +AM_CPPFLAGS = $(kinclude_CFLAGS) $(all_includes) -I$(top_srcdir)/include +AM_CFLAGS = -std=gnu99 $(am__append_1) $(am__append_2) +SPARSE = sparse +SPARSE_FLAGS = -Wsparse-all -I../include $(SPARSE_EXT_FLAGS) +IPSET_AM_V_CHECK = $(ipset_am__v_CHECK_$(V)) +ipset_am__v_CHECK_ = $(ipset_am__v_CHECK_$(AM_DEFAULT_VERBOSITY)) +ipset_am__v_CHECK_0 = @echo " CHECK " $<; +dist_bashcomp_DATA = ipset_bash_completion/ipset +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/Make_global.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) --foreign utils/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign utils/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_srcdir)/Make_global.am $(am__empty): + +$(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-dist_bashcompDATA: $(dist_bashcomp_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_bashcomp_DATA)'; test -n "$(bashcompdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bashcompdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bashcompdir)" || exit 1; \ + fi; \ + 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)$(bashcompdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(bashcompdir)" || exit $$?; \ + done + +uninstall-dist_bashcompDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_bashcomp_DATA)'; test -n "$(bashcompdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(bashcompdir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +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 $(DATA) +installdirs: + for dir in "$(DESTDIR)$(bashcompdir)"; 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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +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 + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-dist_bashcompDATA + +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-dist_bashcompDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-dist_bashcompDATA 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-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-dist_bashcompDATA + +.PRECIOUS: Makefile + + +# 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/utils/ipset_bash_completion/README.md b/utils/ipset_bash_completion/README.md new file mode 100644 index 0000000..ce5c47e --- /dev/null +++ b/utils/ipset_bash_completion/README.md @@ -0,0 +1,220 @@ +ipset-bash-completion +===================== + +Description +=========== + +Programmable completion specification (compspec) for the bash shell +to support the ipset program (netfilter.org). + + +Programmable completion allows the user, while working in an interactive shell, +to retrieve and auto-complete commands, their options, filenames, etc. +Pressing [TAB] will complete on the current word, if only one match is found. +If multiple completions are possible, they will be listed by hitting [TAB] again. + + +Features +======== + +This completion specification follows the logic of ipset and + will show commands and options only when they are available for the current context +(combination of commands and/or options). +Providing some kind of interactive help. + +- Show and complete commands and options. +- Show and complete set names. +- Show and complete the set types when using the create and help command. +- Show and complete set elements (members) when using the del command. +- Show and complete services (also named port ranges), protocols, +icmp[6] types and interface names when adding, deleting or testing elements. +- Show and complete hostnames, when adding, deleting or testing elements. +- Show and complete ip and mac addresses (dynamically and from file). +- Complete on filenames if the current option requires it. +- Complete variable names and command substitution. +- Do not complete if an invalid combination of options is used. +- Do not complete if an invalid value of an option argument is detected. +- Environment variables allow to modify completion behaviour. + + +Installation +============ + +Put it into ~/.bash_completion or /etc/bash_completion.d/. + +Tip: +To make tab completion more handsome put the following into either +/etc/inputrc or ~/.inputrc: + + set show-all-if-ambiguous on + +This will allow single tab completion as opposed to requiring a double tab. + + set page-completions off + +This turns off the use of the internal pager when returning long completion lists. + + +Usage +===== + +Type -[TAB] to start option completion. +Sets named - (hyphen) or starting with it, are supported, +excluded are option names (i.e. -exist). + +Type [TAB] to complete on anything available at the current context. + +Depending on the environment variable **_IPSET_COMPL_OPT_FORMAT**, +either the long, short or both forms of options are shown for completion. +By default (empty _IPSET_COMPL_OPT_FORMAT) the long versions of options +are displayed (_IPSET_COMPL_OPT_FORMAT=long also does the same). +Setting it to 'short' will cause completion to show only the short form. +Setting it to any other value, will result in both version being displayed and completed. + +--- + +To complete named port ranges, enter the hypen after the first completed service (port) name, +hit [TAB] again to start completion on the second named port (the brackets [] for service names +containing a - (hyphen) are already surrounding the name in the completion list). + +--- + +The environment variable **HOSTFILE** controls how hostname completion is performed. +Taking the description from the bash man-page: + + Contains the name of a file in the same format as /etc/hosts that + should be read when the shell needs to complete a hostname. + The list of possible hostname completions may be changed while the shell is running + the next time hostname completion is attempted after the value is changed, + bash adds the contents of the new file to the existing list. + If HOSTFILE is set, but has no value, or does not name a readable file, bash + attempts to read /etc/hosts to obtain the list of possible hostname completions. + When HOSTFILE is unset, the hostname list is cleared. + +As it is impossible to distinguish between IPv4 and IPv6 hostnames without resolving +them, it is considered best practice to seperate IPv4 hosts from IPv6 hosts +in different files. + +If the *bash-completion* package is available hostname completion is extended +the following way (description from bash-completion source): + + Helper function for completing _known_hosts. + This function performs host completion based on ssh config and known_hosts + files, as well as hostnames reported by avahi-browse if + COMP_KNOWN_HOSTS_WITH_AVAHI is set to a non-empty value. + Also hosts from HOSTFILE (compgen -A hostname) are added, unless + COMP_KNOWN_HOSTS_WITH_HOSTFILE is set to an empty value. + + +Also the environment variable **_IPSET_SSH_CONFIGS** controls which files are taken +as ssh_config files, in order to retrieve the global and user known_host files, +which will be used for hostname completion. + +For all *net* type of sets and the hash:ip,mark set type, if hostname completion is attempted, +if the environment variable **_IPSET_COMP_NETWORKS** is set to a non-empty value, +networks are retrieved from /etc/networks. + +Also a list of ip addresses can be supplied using the environment variable +**_IPSET_IPLIST_FILE**. Which should point to a file containing an ip address per line. +They can be ipv4 and/or ipv6. Detection which type should be included +is done automatically based on the set header. + +--- + +When deleting elements from any but list:set set types: +the environment variable **_IPSET_COMPL_DEL_MODE** is queried to decide how to complete. +If it is set to 'members' it will list the members of the set. +If it is set to 'spec' it will follow the format of a port specification ([proto:]port). +If it is set to any other value both methods are used to generate +the list of possible completions (this is the default). + +--- + +When testing elements from any but list:set set types: +the environment variable **_IPSET_COMPL_TEST_MODE** is queried to decide how to complete. +If it is set to 'members' it will list the members of the set. +If it is set to 'spec' it will follow the format of a port specification ([proto:]port). +If it is set to any other value both methods are used to generate +the list of possible completions (this is the default). + +--- + +When adding elements to a **bitmap:ip,mac** type of set, +the environment variable **_IPSET_MACLIST_FILE** will be queried +for a file containing a list of mac addresses. +The file should contain one mac address per line. +Empty lines and comments (also after the address) are supported. +If the variable is unset mac addresses are fetched from arp cache, +/etc/ethers and the output of `ip link show`. + +--- + +When adding elements to one of the following set types: +**hash:ip,port hash:ip,port,ip hash:ip,port,net hash:net,port hash:net,port,net** +and completion is attempted on the port specification, +the list of possible completions may become quite long. +Especially if no characters are given to match on. +This behaviour is because of the many different +values such a port specification can possibly have. + + +--- + +At any time completion on variable names (starting with '$' or '${'), +or command substitution (starting with '$(') is available. +Using this with values validated by input validation, will stop further completion. +In that case it is recommended to disable input validation (see below). + + +--- + +If the environment variable **_IPSET_VALIDATE_INPUT** is set to a non empty value +validation of users input is disabled. + +--- + +If the environment variable **_DEBUG_NF_COMPLETION** is defined (any value) +debugging information is displayed. + + + +Compatibility +============= + +Compatible with ipset versions 6+. + +Tested with ipset v6.20.1. + +bash v4+ is required. + +Compatibility for future ipset versions cannot be promised, as new options may appear, +which of course are currently unpredictable. + +The bash-completion (v2.0+) package is highly recommended, though not mandatory. + +http://bash-completion.alioth.debian.org/ + +Some things might not be that reliable or feature rich without it. +Also the colon (if there) is removed from COMP_WORDBREAKS. +This alteration is globally, which might affect other completions, +if they do not take care of it themselves. + +The iproute program (ip) is needed to display information about the local system. + + + +Availability +============ + +https://github.com/AllKind/ipset-bash-completion + +http://sourceforge.net/projects/ipset-bashcompl/ + + + +Bugs +============ + +Please report bugs! + + diff --git a/utils/ipset_bash_completion/ipset b/utils/ipset_bash_completion/ipset new file mode 100644 index 0000000..b6d94c2 --- /dev/null +++ b/utils/ipset_bash_completion/ipset @@ -0,0 +1,1796 @@ +#!/bin/bash + +# ----------------------------------------------------------------- +# Programmable completion code for ipset (netfilter.org) +# +# https://github.com/AllKind/ipset-bash-completion +# https://sourceforge.net/projects/ipset-bashcompl +# ----------------------------------------------------------------- + +# Copyright (C) 2013-2014 AllKind (AllKind@fastest.cc) +# +# 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 . + +# ----------------------------------------------------------------- +# Compatible with ipset versions: 6+ +# Tested with ipset versions: +# 6.22 +# ----------------------------------------------------------------- +# Requirements: +# +# bash v4 or greater. +# +# The bash completion package version 2.0 or greater is recommended. +# http://bash-completion.alioth.debian.org/ +# +# If the package is not available, things might not be so reliable. +# Also the colon (if there) is removed from COMP_WORDBREAKS. +# This alteration is globally, which might affect other completions, +# if they don't take care of it themselves. +# +# ----------------------------------------------------------------- +# Installation: +# +# Put it into ~/.bash_completion or /etc/bash_completion.d/ +# +# ----------------------------------------------------------------- +# +# Version 2.6 +# +# ----------------------------------------------------------------- + +shopt -s extglob + +# ----------------------------------------------------------------- +# Functions +# ----------------------------------------------------------------- + +_ipset_colon_ltrim() { +((got_bashcompl)) || return 0 +__ltrim_colon_completions "$1" +} + +_ipset_is_set() { +local -i idx +((${#arr_sets[@]})) || arr_sets=( $(ipset list -n) ) +for idx in ${!arr_sets[@]}; do + if [[ ${arr_sets[idx]} = $1 ]]; then + return 0 + fi +done +return 1 +} + +_ipset_get_set_type() { +local n d +while read n d; do + [[ $n = Type: ]] && printf '%s\n' $d && break +done < <(ipset -t list "$1" 2>/dev/null) +} + +_ipset_set_has_option() { +while read -r; do + [[ $REPLY = Header:*$1* ]] && return 0 +done < <(ipset -t list "$2") +return 1 +} + +_ipset_get_supported_types() { +((${#arr_types[@]})) && return +local -i i=0 +while read -r; do + [[ $REPLY = "Supported set types:"* ]] && ((!i)) && i=1 && continue + ((i)) || continue + if [[ $REPLY = *:* ]]; then + set -- $REPLY + arr_types+=("$1") + fi +done < <(ipset help) +for i in ${!arr_types[@]}; do # remove dupe entries + for ((x=i+1; x < ${#arr_types[@]}; x++)); do + if [[ ${arr_types[i]} = ${arr_types[x]} ]]; then + unset arr_types[x] + fi + done +done +} + +_ipset_get_members() { +local -i in_list=0 no=0 +arr_members=() +if [[ $1 = --names-only ]]; then no=1 + shift +fi +while read -r; do + [[ $REPLY = Members:* ]] && in_list=1 && continue + ((in_list)) || continue + if ((no)); then + arr_members+=("${REPLY%% *}") + else + arr_members+=("$REPLY") + fi +done < <(ipset list "$1" 2>/dev/null) +} + +_ipset_get_set_family() { +while read -r; do + [[ $REPLY = Header:*"family inet6"* ]] && printf "v6\n" && return + [[ $REPLY = Header:*"family inet "* ]] && printf "v4\n" && return + [[ $REPLY = Header:*"range "*.*.*.* ]] && printf "v4\n" && return +done < <(ipset -t list "$1") +} + +_ipset_dedupe_cmd_opts() { +local str_opt +local -i idx +for str_opt; do + for idx in ${!arr_dupe_cmd_opts[@]}; do + if [[ $str_opt = ${arr_dupe_cmd_opts[idx]} ]]; then + if [[ $_DEBUG_NF_COMPLETION ]]; then + printf "removing dupe option str_opt: %s\n" \ + "${arr_dupe_cmd_opts[idx]}" + fi + continue 2 + fi + done + printf "%s\n" "$str_opt" +done +} + +_ipset_get_options() { +local str_list +local -i idx oidx ridx +if ((got_action)); then + case "$str_action" in + rename|e|swap|w|test|flush|destroy|x) + str_list='-q -quiet' + ;; + save) + str_list='-f -file -q -quiet' + ;; + create|n|add|del) + str_list='-! -exist -q -quiet' + ;; + restore) + str_list='-! -exist -f -file -q -quiet' + ;; + list) + str_list='-f -file -q -quiet' + if ((names_only || headers_only)); then + str_list+=' -o -output' + elif ((res_sort)); then + str_list+=' -o -output -r -resolve -s -sorted' + elif ((save_format == 1)); then + str_list+=' -r -resolve -s -sorted -t -terse' + elif ((save_format == 3)); then + str_list+=' -r -resolve -s -sorted' + else + str_list+=' -n -name -o -output -r -resolve \ + -s -sorted -t -terse' + fi + ;; + esac +else + str_list='-f -file -q -quiet' + if ((names_only || headers_only)) && ((save_format == 1)); then + : + elif ((names_only || headers_only)); then + str_list+=' -o -output' + elif ((res_sort)); then + str_list+=' -o -output -r -resolve -s -sorted' + elif ((save_format == 1)); then + str_list+=' -r -resolve -s -sorted -t -terse' + elif ((save_format == 3)); then + str_list+=' -r -resolve -s -sorted' + elif ((ignore_errors)); then + : + elif ((use_file)); then + str_list='-! -exist -n -name -o -output -q -quiet -r \ + -resolve -s -sorted -t -terse' + else + str_list='- ${arr_opts[@]}' + fi +fi +COMPREPLY=( $( compgen -W "$str_list" -- "$cur" ) ) +((${#COMPREPLY[@]})) || return 0 + +# post process the reply +if [[ ${_IPSET_COMPL_OPT_FORMAT:=long} = long ]]; then # choose on env var + for ridx in ${!COMPREPLY[@]}; do # remove short version of options + [[ ${COMPREPLY[ridx]} = -? ]] && unset COMPREPLY[ridx] + done +elif [[ ${_IPSET_COMPL_OPT_FORMAT} = short ]]; then + for ridx in ${!COMPREPLY[@]}; do # remove short version of options + [[ ${COMPREPLY[ridx]} = -??* ]] && unset COMPREPLY[ridx] + done +fi +for idx in ${!arr_used_opts[@]}; do + # if the user supplied the short form of an option previously, + # and now requests the long form, remove the corresponding long option, + # vice versa for short options + for oidx in ${!arr_opts[@]}; do # cycle through main options + set -- ${arr_opts[oidx]} # $1 = short , $2 = long option + [[ $1 = $cur ]] && continue + [[ ${arr_used_opts[idx]} =~ ^($1|$2)$ ]] || continue + for ridx in ${!COMPREPLY[@]}; do # compare with compreply + if [[ ${COMPREPLY[ridx]} = ${BASH_REMATCH[1]} ]]; then + if [[ $_DEBUG_NF_COMPLETION ]]; then + printf "removing option alias COMPREPLY[$ridx]: %s\n" \ + "${COMPREPLY[ridx]}" + fi + unset COMPREPLY[ridx] + break 2 + fi + done + done + for ridx in ${!COMPREPLY[@]}; do # de-dupe options + if [[ ${arr_used_opts[idx]} = ${COMPREPLY[ridx]} && \ + ${COMPREPLY[ridx]} != $cur ]]; then + if [[ $_DEBUG_NF_COMPLETION ]]; then + printf "removing dupe option COMPREPLY[$ridx]: %s\n" \ + "${COMPREPLY[ridx]}" + fi + unset COMPREPLY[ridx] + break + fi + done +done +} + +_ipset_get_networks() { +local foo str_net rest +[[ -r /etc/networks ]] || return 0 +[[ ${_IPSET_COMP_NETWORKS-1} ]] || return 0 +while read -r foo str_net rest; do + [[ $foo = @(""|*([[:blank:]])#*) ]] && continue + [[ $str_net = *([[:blank:]])#* ]] && continue + printf "%s\n" "$str_net" +done < /etc/networks +} + +_ipset_get_protocols() { +local str_name rest +while read -r str_name rest; do + if [[ $str_name = @(""|*([[:blank:]])#*) ]]; then continue + elif [[ $str_name = *-* ]]; then str_name="[$str_name]" + fi + printf "%s\n" "$str_name" +done < /etc/protocols +} + +_ipset_get_svnum() { +# find service num to set offset +local str_name str_num str_p=all rest +local _str_p _str_o="" +while (($#)); do + if [[ $1 = -p ]]; then + _str_p="${2:-all}" + shift + elif [[ $1 = -o && ${2:-"-no"} != -* ]]; then + # second part of range will have offset = first_part_of_range+1 + _str_o="$2" + shift + fi + shift +done +if [[ $_str_o && $_str_o != +([[:digit:]]) ]]; then + while read str_name str_num rest; do + if [[ $str_name = *([[:blank:]])#* ]]; then continue + elif [[ $_str_p != all && ${str_num#*/} != $_str_p ]]; then + continue + fi + [[ $str_name = $_str_o ]] && printf "%s\n" ${str_num%/*} && return + + done < /etc/services +else + printf "%s\n" "$_str_o" +fi +} + +_ipset_get_services() { +local str_offset="" str_name str_num str_p=all rest +while (($#)); do + if [[ $1 = -p ]]; then + str_p="${2:-all}" + shift + elif [[ $1 = -o && ${2:-"-no"} != -* ]]; then + # second part of range will have offset = first_part_of_range+1 + str_offset="${2}" + shift + fi + shift +done +# find service num to set offset +if [[ $str_offset && $str_offset != +([[:digit:]]) ]]; then + str_offset=$(_ipset_get_svnum -p "$str_p" -o "$str_offset") + [[ $str_offset = +([[:digit:]]) ]] || str_offset="" # we failed +fi +# identify and print the services +while read -r str_name str_num rest; do + if [[ $str_name = @(""|*([[:blank:]])#*) ]]; then continue + elif [[ $str_p != all && ${str_num#*/} != $str_p ]]; then + continue + elif [[ $str_offset && $str_num && $str_num = +([[:digit:]])/* ]] && \ + ((${str_num%/*} <= $str_offset)); then + continue + elif [[ $str_name = *-* ]]; then str_name="[$str_name]" + fi + printf "%s\n" "$str_name" +done < /etc/services +} + +_ipset_get_ifnames() { +while read -r; do + REPLY="${REPLY#*: }" + printf "%s\n" ${REPLY%%:*} +done < <(PATH=${PATH}:/sbin command ip -o link show) +} + +_ipset_get_iplist() { +# if a file with ip addresses is in env var, load em +local str_ip rest +if [[ $1 = v4 ]]; then +str_regex='^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(/([3][0-2]|[1-2]?[0-9]))?$' +elif [[ $1 = v6 ]]; then +str_regex='^([0-9a-fA-F]{1,4}(:[0-9a-fA-F]{1,4}){7}|([0-9a-fA-F]{1,4}:){1}(:[0-9a-fA-F]{1,4}){1,6}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,6}(:[0-9a-fA-F]{1,4}){1})(/([1][0-2][0-9]|[1-9]?[0-9]))?$' +else return 0 +fi +[[ $_IPSET_IPLIST_FILE && -r $_IPSET_IPLIST_FILE ]] || return 0 +while read -r str_ip rest; do + [[ $str_ip = *([[:blank:]])\#* ]] && continue + str_ip="${str_ip//\#*/}" + [[ $str_ip =~ $str_regex ]] && printf "%s\n" "$str_ip" +done < "${_IPSET_IPLIST_FILE}" +} + +_ipset_complete_elements() { +local lcur="$1" str_lprefix="" +local -i no_range=0 +shift +while (($#)); do + [[ $1 = --no-range ]] && no_range=1 + shift +done +if [[ $lcur = *-[[]+([!]]) ]]; then # incomplete range - host/port with dash + str_lprefix="${lcur%\-[*}-" + lcur="${lcur#"$str_lprefix"}" +elif [[ $lcur = \[*\]-* ]]; then # first part of host/portname range + str_lprefix="${lcur%\]-*}]-" lcur="${lcur##*\]-}" +elif [[ $lcur = *-* ]]; then + str_lprefix="${lcur%-*}-" lcur="${lcur##*-}" +elif [[ $lcur =~ (tcp|udp):.* ]]; then # proto:port (bitmap:port) + str_lprefix="${BASH_REMATCH[1]}:" lcur="${lcur#*:}" + no_range=0 # workaround +fi +if [[ $str_lprefix ]]; then + [[ $str_lprefix = */* ]] && return 1 + ((no_range)) && return 1 + _ipset_get_members --names-only "$str_setname" + COMPREPLY+=( $( compgen -P "$str_lprefix" -W '${arr_members[@]/*\/*/}' -- "$lcur" ) ) +else + _ipset_get_members --names-only "$str_setname" + COMPREPLY+=( $( compgen -W '${arr_members[@]}' -- "$lcur" ) ) +fi +} + +_ipset_complete_portrange() { +# complete port ranges +local lcur="$1" +local str_lprefix="$lcur" str_p="" +str_var=0 str_glob='[^[]*-*' +if [[ $lcur = *:* ]]; then # look for `proto:' + ((got_bp_proto)) || return 0 # supported since ipset v6.20 + # only tcp/udp is valid as PROTO spec + [[ ${lcur%%:*} = @(tcp|udp) ]] || return 0 + str_p=${lcur%%:*} + lcur="${lcur#$str_p:}" +fi +if [[ $lcur = \[*-*\]-* ]]; then # spec with bracket + str_var="${lcur#\[}" + str_var="${str_var%%\]*}" + lcur="${lcur#*\]-}" + str_lprefix=${str_lprefix%"$lcur"} +elif [[ $lcur = $str_glob ]]; then # spec without bracket + str_var="${lcur%%-*}" + lcur="${lcur#*-}" + str_lprefix=${str_lprefix%"$lcur"} +else # no prefix + str_lprefix="" + compopt -o nospace +fi +if [[ $str_p ]]; then # we have a proto spec + COMPREPLY=( $(compgen -P "$str_p:$str_lprefix" \ + -W '$(_ipset_get_services -o $str_var -p $str_p)' -- "$lcur" ) ) + _ipset_colon_ltrim "$str_p:$str_lprefix$lcur" +else + if [[ $str_lprefix ]]; then + COMPREPLY=( $(compgen -P "$str_lprefix" \ + -W '$(_ipset_get_services -o $str_var)' -- "$lcur" ) ) + else + if ((got_bp_proto)); then # supported since ipset v6.20 + COMPREPLY=( $(compgen \ + -W 'tcp: udp: $(_ipset_get_services)' -- "$lcur" ) ) + else # only tcp services prior to ipset v6.20 + COMPREPLY=( $(compgen \ + -W '$(_ipset_get_services -p tcp)' -- "$lcur" ) ) + fi + fi +fi +} + +_ipset_complete_hostnames() { +local -i idx got_bracket=0 +local lcur="${1//@(\[|\])}" +[[ $lcur = $1 ]] || got_bracket=1 +if ((got_bashcompl)); then + _ipset_known_hosts -F "$_IPSET_SSH_CONFIGS" -- "$lcur" +else + if [[ ${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1} ]]; then + COMPREPLY+=( $( compgen -A hostname -- "$lcur" ) ) + fi +fi +for idx in ${!COMPREPLY[@]}; do + if [[ ${COMPREPLY[idx]} = *-* ]]; then + COMPREPLY[idx]="[${COMPREPLY[idx]}]" + else + ((got_bracket)) && unset COMPREPLY[idx] + fi +done +#_ipset_colon_ltrim "$lcur" +} + +_ipset_complete_iface_spec() { +local lcur="$1" str_lprefix="" +if [[ $lcur != *,* ]]; then + str_lprefix="" str_glob='+([![])-*' + compopt -o nospace + if [[ x$str_action != xtest ]]; then + if [[ $lcur = \[*-*\]-* ]]; then # hostrange spec + str_lprefix="${lcur%\]-*}]-" lcur="${lcur#*\]-}" + elif [[ $lcur = *-[[]+([!]]) ]]; then # incomplete range - host with dash + str_lprefix="${lcur%-\[*}-" + lcur="${lcur#"$str_lprefix"}" + elif [[ $lcur = $str_glob ]]; then # range spec + str_lprefix="${lcur%-*}-" lcur="${lcur#*-}" + fi + fi + # ip-list from file + COMPREPLY+=( $( compgen -W \ + '$(_ipset_get_iplist "$(_ipset_get_set_family "$str_setname")")' \ + -- "$lcur" ) ) + # networks + COMPREPLY+=( $( compgen -W '$(_ipset_get_networks)' -- "$lcur" ) ) + # hostnames + _ipset_complete_hostnames "$lcur" + if [[ $str_lprefix ]]; then # range spec + COMPREPLY=( $( compgen -P "$str_lprefix" -W '${COMPREPLY[@]//*\/*/}' \ + -- "$lcur" ) ) + else + COMPREPLY=( $( compgen -W '${COMPREPLY[@]}' -- "$lcur" ) ) + fi + if ((${#COMPREPLY[@]} == 1)); then + if [[ $str_lprefix || x$str_action = xtest ]]; then + COMPREPLY=( ${COMPREPLY[*]}, ) + else + COMPREPLY=( ${COMPREPLY[*]}, ${COMPREPLY[*]}- ) + fi + fi + _ipset_colon_ltrim "$str_lprefix$lcur" +elif [[ $lcur = *,* ]]; then + str_lprefix="${lcur}" lcur="${lcur#*,}" str_var="" + str_lprefix="${str_lprefix%"$lcur"}" + if [[ $lcur = physdev:* ]]; then + lcur="${lcur#physdev:}" + str_lprefix="${str_lprefix}physdev:" + else + str_var="physdev:" + fi + COMPREPLY+=( $( compgen -P "$str_lprefix" -W \ + '${str_var} $(_ipset_get_ifnames)' -- "$lcur" ) ) + [[ ${COMPREPLY[0]} = *physdev: ]] && compopt -o nospace + _ipset_colon_ltrim "$str_lprefix" +fi +} + +_ipset_complete_host_spec() { +local lcur="$1" str_lprefix="" str_lsuffix="" +local -i no_range=0 v4_only=0 +if [[ $lcur = *,* && $str_type = hash:ip,mark ]]; then + return 0 +fi +shift +compopt -o nospace +while (($#)); do + [[ $1 = --no-range ]] && no_range=1 + [[ $1 = --v4 ]] && v4_only=1 + shift +done +# range spec +if [[ $lcur = @(""|+([[:word:]])) ]]; then # empty or [:word:] + str_lsuffix="-" +elif [[ $lcur = [[]*-*[]] ]]; then # host with hyphen + str_lsuffix="-" +elif [[ $lcur = [[]*([!]]) ]]; then # incomplete host with dash + str_lsuffix="-" +elif [[ $lcur = *-[[]+([!]]) ]]; then # incomplete range - host with dash + str_lprefix="${lcur%\-[*}-" + lcur="${lcur#"$str_lprefix"}" +elif [[ $lcur = \[*\]-* ]]; then # first part of hostname range + str_lprefix="${lcur%\]-*}]-" lcur="${lcur##*\]-}" +elif [[ $lcur != *-* ]]; then # no hypen + str_lsuffix="-" +else # ip-range + str_lprefix="${lcur%-*}-" lcur="${lcur##*-}" +fi +if [[ $str_lprefix ]]; then + # range not valid + ((no_range)) && return 1 + # range not valid if first part is ip/cidr + [[ $str_lprefix = */* ]] && return 1 +fi +# ip-list from file +if [[ $str_lprefix ]]; then + # only ipv4 range supported + COMPREPLY+=( $( compgen -W '$(_ipset_get_iplist v4)' -- "$lcur" ) ) +elif ((v4_only)); then + # this type only supports ipv4 + COMPREPLY+=( $( compgen -W '$(_ipset_get_iplist v4)' -- "$lcur" ) ) +else + # we gather the family type + COMPREPLY+=( $( compgen -W \ + '$(_ipset_get_iplist "$(_ipset_get_set_family "$str_setname")")' \ + -- "$lcur" ) ) + _ipset_colon_ltrim "$lcur" +fi +_ipset_complete_hostnames "$lcur" +if [[ $str_lprefix ]]; then + # if the prefix is defined add it to compreply + COMPREPLY=( $( compgen -P "$str_lprefix" -W '${COMPREPLY[@]}' -- "$lcur" ) ) +else + # add networks for hash:net?(,net), hash:ip,mark, or bitmap:ip for add/del action + if [[ $str_type = hash:@(net?(,net)|ip,mark) ]] || \ + [[ $str_type = bitmap:* && $str_action = @(add|create|del) ]] + then + COMPREPLY+=( $( compgen -W '$(_ipset_get_networks)' -- "$lcur" ) ) + fi +fi +if ((${#COMPREPLY[@]} == 1)); then + if [[ $str_lprefix ]]; then + # we can add a space, if it's a range (not with hash:net,net or hash:ip,mark) + if [[ $str_type != hash:@(net,net|ip,mark) ]]; then + compopt +o nospace + fi + fi +fi +} + +_ipset_complete_hostport_spec() { +# complete on host,proto:port[,host] spec +local str_proto str_glob2 str_lprefix lcur str_lprefix2 lcur2 +local lcur="$1" +if [[ $str_type = hash:@(ip|net),port,@(ip|net) ]]; then str_suffix=',' +else str_suffix='' +fi +str_regex='^[^,]+,([^,]+)?$' +if [[ $lcur != *,* ]]; then + str_lprefix="" str_suffix="" + compopt -o nospace + if [[ $str_type = hash:@(ip,port|net,port|ip,port,ip|ip,port,net|net,port,net) && \ + $str_action = @(add|del|test) ]] + then + # range spec + if [[ $lcur = @(""|+([[:word:]])) ]]; then # empty or [:word:] + str_suffix="-" + elif [[ $lcur = [[]*-*[]] ]]; then # host with hyphen + str_suffix="-" + elif [[ $lcur = [[]*([!]]) ]]; then # incomplete host with dash + str_suffix="-" + elif [[ $lcur = *-[[]+([!]]) ]]; then # incomplete range - host with dash + str_lprefix="${lcur%\-[*}-" + lcur="${lcur#"$str_lprefix"}" + elif [[ $lcur = \[*\]-* ]]; then # first part of hostname range + str_lprefix="${lcur%\]-*}]-" lcur="${lcur##*\]-}" + elif [[ $lcur != *-* ]]; then # no hypen + str_suffix="-" + else # ip-range + str_lprefix="${lcur%-*}-" lcur="${lcur##*-}" + fi + fi + # ip-list from file + COMPREPLY+=( $( compgen -W \ + '$(_ipset_get_iplist "$(_ipset_get_set_family "$str_setname")")' \ + -- "$lcur" ) ) + if [[ $str_type = hash:net,port?(,net) ]]; then + COMPREPLY+=( $( compgen -W '$(_ipset_get_networks)' -- "$lcur" ) ) + _ipset_colon_ltrim "$lcur" + fi + _ipset_complete_hostnames "$lcur" + if [[ $str_lprefix ]]; then # range spec + COMPREPLY=( $( compgen -P "$str_lprefix" -W '${COMPREPLY[@]}' -- "$lcur" ) ) + fi + if ((${#COMPREPLY[@]} == 1)); then + if [[ $str_suffix = - ]]; then + COMPREPLY=( $( compgen -W '${COMPREPLY[*]}, ${COMPREPLY[*]}-' -- "$lcur" ) ) + else + COMPREPLY=( ${COMPREPLY[*]}, ) + fi + fi + _ipset_colon_ltrim "$str_lprefix$lcur" +elif [[ $lcur =~ $str_regex ]]; then + compopt -o nospace + str_glob='[^[]*-' # otherwise messes up my vim syntax highlightning + str_regex='.*,(icmp|icmp6|tcp|sctp|udp|udplite):.*' # for compat put regex in var + if [[ $lcur != *icmp* && \ + $lcur = *,@(?(tcp:|sctp:|udp:|udplite:)@(+([[:word:]])-|\[*-*\]-)|\[*-*\]-)* ]] + then # range spec + str_lprefix="$lcur" str_glob='*[[]*' str_glob2='*,*-\[*' str_proto="tcp" str_var="" + [[ $lcur =~ .*(tcp|sctp|udp|udplite):.* ]] && str_proto=${BASH_REMATCH[1]} + if [[ $lcur = *,*\[*-*\]-* ]]; then + str_var="${lcur#*,*[}" lcur="${lcur##*\]-}" + str_lprefix=${str_lprefix%"$lcur"} str_var="${str_var%\]*}" + elif [[ $lcur = $str_glob2 ]]; then + str_var="${lcur#*,}" lcur="${lcur##*-}" + str_var="${str_var#${BASH_REMATCH[1]}:}" + str_lprefix=${str_lprefix%"$lcur"} str_var="${str_var%%-*}" + else + str_var="${lcur#*,}" lcur="${lcur##*-}" + str_var="${str_var#${BASH_REMATCH[1]}:}" + str_lprefix=${str_lprefix%"$lcur"} str_var="${str_var%-*}" + fi + COMPREPLY+=( $( compgen -P "$str_lprefix" -S "$str_suffix" -W \ + '$(_ipset_get_services -p "$str_proto" -o "$str_var")' -- "$lcur") ) + if [[ $str_lprefix = *:* ]]; then + str_lprefix="${str_lprefix%:*}:" + fi + _ipset_colon_ltrim "${str_lprefix}" + if ((${#COMPREPLY[@]} == 1)); then + if [[ $str_lprefix && $str_type != hash:@(ip|net),port,@(ip|net) ]]; then + compopt +o nospace + fi + fi + elif [[ $lcur =~ $str_regex ]]; then + # icmp[6] and services with (tcp|udp|sctp|udplite): prefix + str_var=${BASH_REMATCH[1]} + str_lprefix="${lcur}" lcur="${lcur#*,}" + str_lprefix="${str_lprefix%"$lcur"}" + lcur="${lcur#${BASH_REMATCH[1]}:}" + str_lprefix="${str_lprefix}${BASH_REMATCH[1]}:" + if [[ $str_var = icmp ]]; then + COMPREPLY+=( $( compgen -P "$str_lprefix" -S "$str_suffix" -W \ + '${arr_icmp_types[@]}' -- "$lcur" ) ) + elif [[ $str_var = icmp6 ]]; then + COMPREPLY+=( $( compgen -P "$str_lprefix" -S "$str_suffix" -W \ + '${arr_icmp6_types[@]}' -- "$lcur" ) ) + elif [[ $str_var = @(tcp|udp|sctp|udplite) ]]; then + COMPREPLY+=( $( compgen -P "$str_lprefix" -W \ + '$(_ipset_get_services -p $str_var)' -- "$lcur" ) ) + fi + _ipset_colon_ltrim "$str_lprefix" + elif [[ $lcur = *,* ]]; then # first attempt :/ long list + str_lprefix="${lcur%,*}," lcur="${lcur#*,}" + str_var="tcp: udp: sctp: udplite: icmp: icmp6:" + # add the services + COMPREPLY+=( $( compgen -P "$str_lprefix" -W \ + '$str_var $(_ipset_get_services)' -- "$lcur" ) ) + # add the protocols + COMPREPLY+=( $( compgen -P "$str_lprefix" -S ":0$str_suffix" -W \ + '$(_ipset_get_protocols)' -- "$lcur" ) ) + _ipset_colon_ltrim "$str_lprefix$lcur" + compopt -o nospace + fi +elif [[ $lcur = *,*,* && $str_type = hash:@(ip,port,@(ip|net)|net,port,net) ]]; then + str_lprefix2="${lcur}" lcur2="${lcur##*,}" + str_lprefix2="${str_lprefix2%"$lcur2"}" + lcur="$lcur2" + # ip-list from file + COMPREPLY+=( $( compgen -W \ + '$(_ipset_get_iplist "$(_ipset_get_set_family "$str_setname")")' \ + -- "$lcur2" ) ) + if [[ $str_type = hash:@(ip|net),port,net && x$str_action != xtest ]]; then + # range spec + if [[ $lcur = @(""|+([[:word:]])) ]]; then # empty or [:word:] + str_suffix="-" + elif [[ $lcur = [[]*-*[]] ]]; then # host with hyphen + str_suffix="-" + elif [[ $lcur = [[]+([!]]) ]]; then # incomplete host with dash + str_suffix="-" + elif [[ $lcur = *-[[]+([!]]) ]]; then # incomplete range - host with dash + str_lprefix="${lcur%\-[*}-" + lcur="${lcur#"$str_lprefix"}" + elif [[ $lcur = \[*\]-* ]]; then # first part of hostname range + str_lprefix="${lcur%\]-*}]-" lcur="${lcur##*\]-}" + elif [[ $lcur != *-* ]]; then # no hypen + str_suffix="-" + else # ip-range + str_lprefix="${lcur%-*}-" lcur="${lcur##*-}" + fi + # networks + COMPREPLY+=( $( compgen -W '$(_ipset_get_networks)' -- "$lcur" ) ) + fi + _ipset_complete_hostnames "$lcur" + if [[ $str_lprefix ]]; then + COMPREPLY=( $( compgen -P "$str_lprefix" \ + -W '${COMPREPLY[@]}' -- "$lcur" ) ) + fi + if [[ $str_lprefix2 ]]; then + COMPREPLY=( $( compgen -P "$str_lprefix2" \ + -W '${COMPREPLY[@]}' -- "$lcur2" ) ) + fi + _ipset_colon_ltrim "$str_lprefix2$lcur2" + if ((${#COMPREPLY[@]} == 1)); then + if [[ $str_type = hash:@(ip|net),port,net && \ + ${COMPREPLY[*]##*,} != */* ]] + then + compopt -o nospace + fi + fi +fi +} + +_ipset_complete_netnet_spec() { +# complete hash:net,net sets +local lcur="$1" +if [[ $lcur = *,* ]]; then + str_lprefix="$lcur" lcur="${lcur#*,}" + str_lprefix="${str_lprefix%,*}," + _ipset_complete_host_spec "$lcur" + compopt -o nospace + COMPREPLY+=( $( compgen -P "$str_lprefix" -W '${COMPREPLY[@]}' -- "$lcur" ) ) + if ((${#COMPREPLY[@]} == 1 )); then + str_glob='@(*/*|\[*\]-*|+([![])-*)' + [[ ${COMPREPLY[0]#*,} = $str_glob ]] && compopt +o nospace + fi +else + _ipset_complete_host_spec "$lcur" + compopt -o nospace + if ((${#COMPREPLY[@]} == 1 )); then + str_glob='@(*/*|\[*\]-\[*\]|+([![])-+([![])|\[*\]-+([![])|+([![])-\[*\])' + if [[ ${COMPREPLY[0]} = $str_glob ]]; then + COMPREPLY=( ${COMPREPLY[*]}, ) + else + COMPREPLY=( ${COMPREPLY[*]}- ${COMPREPLY[*]}, ) + fi + fi +fi +} + +_ipset_complete_mac_spec() { +local lcur="$1" mac rest a b addr str_tmp +local str_regex='^([[:xdigit:]]{2})(:[[:xdigit:]]{2}){5}$' +local -i x=y=0 +if [[ ${_IPSET_MAC_COMPL_MODE:=both} = both ]]; then + x=1 y=1 +elif [[ $_IPSET_MAC_COMPL_MODE = file ]]; then + x=1 +elif [[ $_IPSET_MAC_COMPL_MODE = system ]]; then + y=1 +fi +if ((x)); then + if [[ $_IPSET_MACLIST_FILE && -r $_IPSET_MACLIST_FILE ]]; then + # if a file with mac addresses is in env var, load em + while read -r mac rest; do + [[ $mac = *([[:blank:]])\#* ]] && continue + mac="${mac//\#*/}" + [[ $mac =~ $str_regex ]] && printf "%s\n" "$mac" + done < "${_IPSET_MACLIST_FILE}" + fi +fi +if ((y)); then + # read arp cache, addresses of local interfaces and /etc/ethers + str_tmp=$(while read a b addr rest; do + [[ $addr =~ $str_regex ]] && printf "%s\n" "$addr" + done < <(PATH=$PATH:/sbin command arp -n 2>/dev/null)) + str_tmp+=" $(while read -r; do + [[ $REPLY = *link/loopback* ]] && continue + REPLY=${REPLY#*link/*+([[:blank:]])} + REPLY=${REPLY%+([[:blank:]])brd*} + [[ $REPLY =~ $str_regex ]] && printf "%s\n" "$REPLY" + done < <(PATH=$PATH:/sbin command ip -o link show 2>/dev/null))" + if [[ -r /etc/ethers ]]; then + str_tmp+=" $(while read -r addr rest; do + [[ $addr =~ $str_regex ]] && printf "%s\n" "$addr" + done < /etc/ethers)" + fi + printf "%s\n" "$str_tmp" +fi +} + +# ----------------------------------------------------------------- +# Main +# ----------------------------------------------------------------- + +_ipset_complete() { +local cur prev cword words ips_version +local str_action str_setname str_type str_filename +local str_glob str_regex str_prefix str_suffix +local str_tmp="" str_var="" +local str_timeout="timeout" str_order="before after" str_forceadd="" +local str_counters="" str_bp_counters="" str_comment="" str_markmask="" +local str_skbinfo="" str_skbflags="" +local -i i=x=y=0 +local -i got_bashcompl=got_action=action_index=order_index=set_has_timeout=0 +local -i got_bp_proto=0 +local -i ignore_errors=use_file=names_only=headers_only=save_format=res_sort=0 +local arr_sets=() arr_types=() arr_members=() arr_unknown_opts=() +local arr_dupe_cmd_opts=() arr_used_opts=() arr_tmp=() +local arr_opts=( +"-! -exist" +"-o -output" +"-q -quiet" +"-r -resolve" +"-s -sorted" +"-n -name" +"-t -terse" +"-f -file" +) +local arr_icmp_types=( +echo-reply +pong +network-unreachable +host-unreachable +protocol-unreachable +port-unreachable +fragmentation-needed +source-route-failed +network-unknown +host-unknown +network-prohibited +host-prohibited +TOS-network-unreachable +TOS-host-unreachable +communication-prohibited +host-precedence-violation +precedence-cutoff +source-quench +network-redirect +host-redirect +TOS-network-redirect +TOS-host-redirect +echo-request +ping +router-advertisement +router-solicitation +ttl-zero-during-transit +ttl-zero-during-reassembly +ip-header-bad +required-option-missing +timestamp-request +timestamp-reply +address-mask-request +address-mask-reply +) +local arr_icmp6_types=( +no-route +communication-prohibited +address-unreachable +port-unreachable +packet-too-big +ttl-zero-during-transit +ttl-zero-during-reassembly +bad-header +unknown-header-type +unknown-option +echo-request +ping +echo-reply +pong +router-solicitation +router-advertisement +neighbour-solicitation +neigbour-solicitation +neighbour-advertisement +neigbour-advertisement +redirect +) + +# at least bash 4 is required +((${BASH_VERSINFO[0]} < 4)) && return 0 + +COMPREPLY=() + +# ipset version check 6.x upwards (to v?) is supported +ips_version="$(ipset version)" +ips_version="${ips_version#ipset v}" +ips_version="${ips_version%,+([[:blank:]])protocol*}" +read -a ips_version <<< ${ips_version//./ } +[[ ${ips_version[0]} = +([[:digit:]]) ]] || return 1 +((ips_version[0] < 6)) && return 1 + +# ipset -ge v6.19 has counters flag +# ipset -ge v6.20 has comment flag +# ipset -ge v6.21 has hash:ip,mark markmask flag +# ipset -ge v6.22 has skbinfo flag +if ((ips_version[0] > 6)); then + str_counters="counters" + str_bp_counters="bytes packets" + str_comment="comment" + str_markmask="markmask" + str_skbinfo="skbinfo" str_skbflags="skbmark skbprio skbqueue" + got_bp_proto=1 +elif ((ips_version[0] == 6)); then + if ((ips_version[1] >= 22)); then + str_comment="comment" + str_markmask="markmask" + str_forceadd="forceadd" + str_skbinfo="skbinfo" str_skbflags="skbmark skbprio skbqueue" + got_bp_proto=1 + elif ((ips_version[1] >= 21)); then + str_comment="comment" + str_markmask="markmask" + str_forceadd="forceadd" + got_bp_proto=1 + elif ((ips_version[1] >= 20)); then + str_comment="comment" + got_bp_proto=1 + elif ((ips_version[1] >= 19)); then + str_counters="counters" + str_bp_counters="bytes packets" + fi +else + return 0 +fi + +# expecting _get_comp_words_by_ref() to exist from bash_completion +if declare -f _get_comp_words_by_ref &>/dev/null; then got_bashcompl=1 + _get_comp_words_by_ref -n : cur prev cword words || return +else got_bashcompl=0 # not so neat, but a workaround + COMP_WORDBREAKS="${COMP_WORDBREAKS//:/}" + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + cword=$COMP_CWORD + for i in ${!COMP_WORDS[@]}; do words[i]="${COMP_WORDS[i]}"; done +fi + +if ((got_bashcompl)); then +# current bash completion got a bug i reported: +# https://alioth.debian.org/tracker/index.php?func=detail&aid=314056&group_id=100114&atid=413095 +# putting corrected function here, so things don't break +__ltrim_colon_completions() { + if [[ "$1" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then + # Remove colon-word prefix from COMPREPLY items + local colon_word="${1%"${1##*:}"}" + local i=${#COMPREPLY[*]} + while [[ $((--i)) -ge 0 ]]; do + COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"} + done + fi +} + +# construct own known_hosts function from origin +# just remove the __ltrim_colon_completions call +# to avoid unwanted ltrim if we need to work with the list of hosts +# ugly hack - gimme better ;p +if ! declare -F _ipset_known_hosts &>/dev/null; then +eval '_ipset_known_hosts() { '$(declare -f _known_hosts_real | grep -v __ltrim_colon_completions | grep -Ev "^_known_hosts_real.*$" | grep -Ev "^(\{|\})")'; }' +fi +fi + +#_DEBUG_NF_COMPLETION=Y +if [[ $_DEBUG_NF_COMPLETION ]]; then + printf "\nCOMP_WORDBREAKS: <%s>\n" "$COMP_WORDBREAKS" + printf "COMP_LINE: <%s>\n" "$COMP_LINE" + printf "COMP_TYPE: <%s>\n" "$COMP_TYPE" + printf "COMP_POINT: <%s>\n" "$COMP_POINT" + printf "COMP_KEY: <%s>\n" "$COMP_KEY" + printf "COMP_CWORD: <%s>\n" "$COMP_CWORD" + printf "cword: <%s>\n" "$cword" + printf "cur: <%s> prev: <%s>\n" "$cur" "$prev" + printf "words:\n" "<%s>\n" "${words[@]}" +fi + +# collect information about used options +for ((i=1; i < ${#words[@]}-1; i++)); do +case "${words[i]}" in + @(create|n|add|del|test|destroy|x|list|save|restore|flush|rename|e|swap|w|help|version)) + [[ ${words[i-1]} = @(-f|-file) ]] && continue # there could be a file named like a command + if ! ((got_action)); then + if [[ ${words[i]} != save ]]; then + got_action=1 action_index=$i str_action=${words[i]} + elif [[ ${words[i-1]} != @(-o|-output) ]]; then + got_action=1 action_index=$i str_action=${words[i]} + fi + if [[ $str_action = @(create|n|add|del|test|destroy|x|list|save|restore|flush|rename|e|swap|w) ]] + then str_setname=${words[i+1]} # register the set name + fi + fi + ;; + -\!|-exist) + [[ ${words[i-1]} != @(-f|-file) ]] &&\ + ignore_errors=1 arr_used_opts+=(${words[i]}) + ;; + -f|-file) + [[ ${words[i-1]} != @(-f|-file) ]] &&\ + use_file=1 str_filename="${words[i+1]}" \ + arr_used_opts+=(${words[i]}) + ;; + -n|-name) + [[ ${words[i-1]} != @(-f|-file) ]] &&\ + names_only=1 arr_used_opts+=(${words[i]}) + ;; + -t|-terse) + [[ ${words[i-1]} != @(-f|-file) ]] &&\ + headers_only=1 arr_used_opts+=(${words[i]}) + ;; + -o|-output) + if [[ ${words[i-1]} != @(-f|-file) ]]; then + arr_used_opts+=(${words[i]}) + if [[ $prev = @(-o|-output) ]]; then + save_format=2 # expecting opt-arg + elif [[ ${words[i+1]} = save ]]; then + save_format=3 # no -n/-t with -o save + else + save_format=1 + fi + fi + ;; + -r|-resolve|-s|-sorted) + [[ ${words[i-1]} != @(-f|-file) ]] &&\ + res_sort=1 arr_used_opts+=(${words[i]}) + ;; + -q|-quiet) + arr_used_opts+=(${words[i]}) + ;; +# -?*) +# if [[ ${words[i]#-} != @(q|quiet) ]]; then +# # don't include filenames +# if [[ ${words[i-1]} != @(-f|-file|\>) || ${words[i+1]} != \< ]]; then +# arr_unknown_opts[${#arr_unknown_opts[@]}]="${words[i]}" +# fi +# fi +# ;; + before|after) + if ((got_action && ! order_index && i == action_index+3)); then + order_index=$i str_order="" + fi + ;; + timeout|range|maxelem|family|hashsize|size|netmask|nomatch|counters|bytes|packets|comment|markmask|forceadd|skbinfo|skbmark|skbprio|skbqueue) + if ((got_action && i > action_index+2)); then + str_tmp="$COMP_LINE" + [[ $str_setname = ${words[i]} ]] && str_tmp="${str_tmp/${words[i]}/}" + [[ $str_filename = ${words[i]} ]] && str_tmp="${str_tmp/${words[i]}/}" + [[ $str_tmp = *${words[i]}* ]] && arr_dupe_cmd_opts[${#arr_dupe_cmd_opts[@]}]="${words[i]}" + fi + ;; +esac +done + +if [[ $_DEBUG_NF_COMPLETION ]]; then + printf "\ngot_action: <%s>\n" "$got_action" + printf "str_action: <%s>\n" "$str_action" + printf "action_index: <%s>\n" "$action_index" + printf "order_index: <%s>\n" "$order_index" + printf "str_setname: <%s>\n" "$str_setname" + printf "str_filename: <%s>\n" "$str_filename" + printf "save_format: <%s>\n" "$save_format" + printf "ignore_errors: <%s>\n" "$ignore_errors" + printf "names_only: <%s>\n" "$names_only" + printf "headers_only: <%s>\n" "$headers_only" +# printf "arr_unknown_opts: <%s>\n" "${arr_unknown_opts[@]}" + printf "arr_used_opts: <%s>\n" "${arr_used_opts[@]}" + printf "arr_dupe_cmd_opts: <%s>\n" "${arr_dupe_cmd_opts[@]}" +fi + +# invalid combination of options +if ((names_only && headers_only)); then + return 0 +elif ((names_only || headers_only)); then + if ((res_sort || ignore_errors)) || ((save_format == 3)); then + return 0 + fi +elif ((ignore_errors)); then + if ((res_sort || save_format)); then + return 0 + fi +fi + +#case "$cur" in # depend on current +# \<|\>) # redirection operator +# compopt -o nospace +# COMPREPLY=( $( compgen -f ) ) # no $cur, so completion starts without space after redirection +# return 0 +# ;; +#esac +# catch variables and command substitution +if [[ $cur == \$\(* ]]; then # command substitution + COMPREPLY=( $(compgen -c -P '$(' ${cur#??}) ) + return 0 +elif [[ $cur == \$\{* ]]; then # variables with a leading `${' + COMPREPLY=( $(compgen -v -P '${' -S '}' ${cur#??}) ) + return 0 +elif [[ $cur == \$* ]]; then # variables with a leading `$' + COMPREPLY=( $(compgen -v -P '$' ${cur#?} ) ) + return 0 +fi + +case "$prev" in # depend on previous option + -o|-output) + # make sure it's not a filename named -o or -output + if [[ $str_filename != $prev ]]; then + if ((names_only || headers_only)); then + COMPREPLY=( $( compgen -W 'plain xml' -- "$cur" ) ) + else + COMPREPLY=( $( compgen -W 'plain save xml' -- "$cur" ) ) + fi + return 0 + fi + ;; + -f|-file|\<|\>) + if ((got_bashcompl)); then + _filedir + else + compopt -o nospace + COMPREPLY=( $( compgen -f -- "$cur" ) ) + fi + return 0 + ;; +esac + +if ((got_action)); then # we got the main action +# Disallow sets with names of options starting with a hyphen +if [[ $str_setname = -?* && $cur != -?* && \ + $str_action = @(create|n|add|del|test|rename|e|swap|w) ]] +then + for x in ${!arr_opts[@]}; do set -- ${arr_opts[x]} + [[ $str_setname = @($1|$2) ]] && return 0 + done +fi +if ((cword == action_index+1)) && [[ $str_action = $prev ]]; then + # depend on previous option which should be the action + case "$str_action" in +# create|n|version) : +# ;; + help) + _ipset_get_supported_types + COMPREPLY=( $( compgen -W '${arr_types[@]}' -- "$cur" ) ) + _ipset_colon_ltrim "$cur" + ;; + add|del|rename|e|swap|w|test) + COMPREPLY=( $( compgen -W '$(ipset list -n)' -- "$cur" ) ) + _ipset_colon_ltrim "$cur" + ;; + list|flush|save|destroy|x) + # we don't know if its an option request, could also be a set + # named `-*', if the latter is true, show sets and options + if [[ $cur = -* ]]; then + _ipset_get_options + if _ipset_is_set "${cur}*"; then + COMPREPLY=( $( compgen -W '${arr_sets[@]}' -- "$cur" ) ) + _ipset_colon_ltrim "$cur" + fi + else + COMPREPLY=( $( compgen -W '$(ipset list -n)' -- "$cur" ) ) + _ipset_colon_ltrim "$cur" + fi + ;; + restore) + if [[ $cur = -* ]]; then + _ipset_get_options + elif ! [[ $str_filename ]]; then + # don't show redirector if we have option -f + COMPREPLY=( \< ) + fi + ;; + esac +elif ((cword == action_index+2)) && [[ $str_setname = $prev ]]; then + case "$str_action" in +# rename|e) : +# ;; + save|restore|list|flush|destroy|x) + if [[ $cur = -* ]]; then + _ipset_get_options + fi + ;; + @(create|n)) + _ipset_get_supported_types + COMPREPLY=( $( compgen -W '${arr_types[@]}' -- "$cur" ) ) + _ipset_colon_ltrim "$cur" + ;; + @(swap|w)) # list two sets + COMPREPLY=( $( compgen -W '$(ipset list -n)' -- "$cur" ) ) + for i in ${!COMPREPLY[@]}; do # remove the dupe setname from the list + [[ ${COMPREPLY[i]} = $str_setname ]] && unset COMPREPLY[i] && break + done + _ipset_colon_ltrim "$cur" + ;; + add) + str_type=$(_ipset_get_set_type "$str_setname") + case "$str_type" in + bitmap:ip) + _ipset_complete_host_spec "$cur" --v4 + _ipset_colon_ltrim "$cur" + ;; + hash:ip|hash:net|hash:ip,mark) + _ipset_complete_host_spec "$cur" + _ipset_colon_ltrim "$cur" + ;; + hash:net,iface) + _ipset_complete_iface_spec "$cur" + ;; + hash:@(ip,port|ip,port,ip|ip,port,net|net,port|net,port,net)) + _ipset_complete_hostport_spec "$cur" + ;; + hash:net,net) + _ipset_complete_netnet_spec "$cur" + _ipset_colon_ltrim "$cur" + ;; + hash:mac) + COMPREPLY=( $( compgen -W '$(_ipset_complete_mac_spec)' -- "$cur" ) ) + _ipset_colon_ltrim "$cur" + ;; + bitmap:ip,mac) + if [[ $cur = *,* ]]; then + str_prefix="$cur" cur="${cur#*,}" + str_prefix="${str_prefix%$cur}" + COMPREPLY+=( $( compgen -P "$str_prefix" -W '$(_ipset_complete_mac_spec)' \ + -- "$cur" ) ) + _ipset_colon_ltrim "$str_prefix$cur" + else + compopt -o nospace + _ipset_complete_host_spec "$cur" --v4 --no-range + _ipset_colon_ltrim "$cur" + if ((${#COMPREPLY[@]} == 1)); then + COMPREPLY=( ${COMPREPLY[*]}, ) + fi + fi + ;; + bitmap:port) + # complete port [range] + _ipset_complete_portrange "$cur" + ;; + # show sets if the set to add is of type list:set + list:*) arr_tmp=() arr_sets=( $(ipset list -n) ) + _ipset_get_members --names-only "$str_setname" + for x in ${!arr_sets[@]}; do + [[ ${arr_sets[x]} = $str_setname ]] && continue + for y in ${!arr_members[@]}; do + [[ ${arr_sets[x]} = ${arr_members[y]} ]] && continue 2 + done + arr_tmp+=("${arr_sets[x]}") + done + COMPREPLY=( $( compgen -W '${arr_tmp[@]}' -- "$cur" ) ) + _ipset_colon_ltrim "$cur" + ;; + esac + ;; + del) + str_type=$(_ipset_get_set_type "$str_setname") + if [[ $str_type = bitmap:ip ]]; then + str_prefix="" + if [[ ${_IPSET_COMPL_DEL_MODE:=both} = members ]]; then + _ipset_complete_elements "$cur" + elif [[ ${_IPSET_COMPL_DEL_MODE} = spec ]]; then + _ipset_complete_host_spec "$cur" --v4 + _ipset_colon_ltrim "$cur" + else + _ipset_complete_host_spec "$cur" --v4 + _ipset_complete_elements "$cur" + _ipset_colon_ltrim "$cur" + fi + elif [[ $str_type = bitmap:port ]]; then + str_prefix="" + if [[ ${_IPSET_COMPL_DEL_MODE:=both} = members ]]; then + _ipset_complete_elements "$cur" + elif [[ ${_IPSET_COMPL_DEL_MODE} = spec ]]; then + _ipset_complete_portrange "$cur" + else + _ipset_complete_portrange "$cur" + _ipset_get_members --names-only "$str_setname" + str_glob='?(tcp:|udp:)@([![]*-*|\[?*\]-*)' + if [[ $cur = $str_glob ]]; then + str_var="${cur#?(tcp:|udp:)}" # offset + str_tmp="${cur%"$str_var"}" # proto + # identify service number by name, to find the offset + if [[ $str_var != +([[:digit:]]) ]]; then + if [[ $str_var = \[+([![])\]-* ]]; then + str_var="${str_var%%\]*}" + str_var="${str_var#\[}" + elif [[ $str_var = *-* ]]; then + str_var="${str_var%%-*}" + fi + str_var=$(_ipset_get_svnum -p "${str_tmp:-all}" -o "$str_var") + fi + if [[ $str_var = +([[:digit:]]) ]]; then + for i in ${!arr_members[@]}; do + ((${arr_members[i]} <= $str_var)) && \ + unset arr_members[i] || break + done + fi + str_prefix="${cur%-*}-" cur="${cur##*-}" + fi + COMPREPLY+=( $( compgen -P "$str_prefix" -W '${arr_members[@]}' -- "$cur" ) ) + fi + elif [[ $str_type = bitmap:ip,mac ]]; then + str_prefix="" + if [[ ${_IPSET_COMPL_DEL_MODE:=both} = members ]]; then + _ipset_complete_elements "$cur" --no-range + _ipset_colon_ltrim "$cur" + elif [[ ${_IPSET_COMPL_DEL_MODE} = spec ]]; then + _ipset_complete_host_spec "$cur" --v4 --no-range + _ipset_colon_ltrim "$cur" + else + _ipset_complete_host_spec "$cur" --v4 --no-range + _ipset_complete_elements "$cur" --no-range + _ipset_colon_ltrim "$cur" + fi + elif [[ $str_type = hash:@(ip?(,mark)|net) ]]; then + str_prefix="" + if [[ ${_IPSET_COMPL_DEL_MODE:=both} = members ]]; then + _ipset_complete_elements "$cur" + _ipset_colon_ltrim "$cur" + elif [[ ${_IPSET_COMPL_DEL_MODE} = spec ]]; then + _ipset_complete_host_spec "$cur" + _ipset_colon_ltrim "$cur" + else + _ipset_complete_host_spec "$cur" + _ipset_complete_elements "$cur" + _ipset_colon_ltrim "$cur" + fi + elif [[ $str_type = hash:net,net ]]; then + if [[ ${_IPSET_COMPL_DEL_MODE:=both} = members ]]; then + _ipset_complete_elements "$cur" + _ipset_colon_ltrim "$cur" + elif [[ ${_IPSET_COMPL_DEL_MODE} = spec ]]; then + _ipset_complete_netnet_spec "$cur" + _ipset_colon_ltrim "$cur" + else + _ipset_complete_netnet_spec "$cur" + _ipset_complete_elements "$cur" + _ipset_colon_ltrim "$cur" + fi + elif [[ $str_type = hash:@(ip,port|ip,port,ip|ip,port,net|net,port|net,port,net) ]] + then + if [[ ${_IPSET_COMPL_DEL_MODE:=both} = members ]]; then + _ipset_complete_elements "$cur" --no-range + _ipset_colon_ltrim "$cur" + elif [[ ${_IPSET_COMPL_DEL_MODE} = spec ]]; then + _ipset_complete_hostport_spec "$cur" + else + _ipset_complete_elements "$cur" --no-range + _ipset_complete_hostport_spec "$cur" + _ipset_colon_ltrim "$cur" + fi + elif [[ $str_type = hash:net,iface ]]; then + if [[ ${_IPSET_COMPL_TEST_MODE:=both} = members ]]; then + _ipset_complete_elements "$cur" --no-range + _ipset_colon_ltrim "$cur" + elif [[ ${_IPSET_COMPL_TEST_MODE} = spec ]]; then + _ipset_complete_iface_spec "$cur" + else + _ipset_complete_elements "$cur" --no-range + _ipset_complete_iface_spec "$cur" + _ipset_colon_ltrim "$cur" + fi + else + _ipset_complete_elements "$cur" --no-range + _ipset_colon_ltrim "$cur" + fi + ;; + test) + str_type=$(_ipset_get_set_type "$str_setname") + if [[ $str_type = bitmap:ip ]]; then + if [[ ${_IPSET_COMPL_TEST_MODE:=both} = members ]]; then + _ipset_complete_elements "$cur" --no-range + elif [[ ${_IPSET_COMPL_TEST_MODE} = spec ]]; then + _ipset_complete_host_spec "$cur" --no-range --v4 + else + _ipset_complete_elements "$cur" --no-range + if ! _ipset_complete_host_spec "$cur" --no-range --v4; then + COMPREPLY=() + fi + fi + elif [[ $str_type = hash:ip?(,mark) ]]; then + if [[ ${_IPSET_COMPL_TEST_MODE:=both} = members ]]; then + _ipset_complete_elements "$cur" --no-range + _ipset_colon_ltrim "$cur" + elif [[ ${_IPSET_COMPL_TEST_MODE} = spec ]]; then + _ipset_complete_host_spec "$cur" --no-range + _ipset_colon_ltrim "$cur" + else + _ipset_complete_elements "$cur" --no-range + if ! _ipset_complete_host_spec "$cur" --no-range; then + COMPREPLY=() + fi + _ipset_colon_ltrim "$cur" + fi + elif [[ $str_type = hash:net ]]; then + if [[ ${_IPSET_COMPL_TEST_MODE:=both} = members ]]; then + _ipset_complete_elements "$cur" --no-range + _ipset_colon_ltrim "$cur" + elif [[ ${_IPSET_COMPL_TEST_MODE} = spec ]]; then + _ipset_complete_host_spec "$cur" + _ipset_colon_ltrim "$cur" + else + _ipset_complete_elements "$cur" --no-range + if ! _ipset_complete_host_spec "$cur"; then + COMPREPLY=() + fi + _ipset_colon_ltrim "$cur" + fi + elif [[ $str_type = hash:@(ip,port|ip,port,ip|ip,port,net|net,port|net,port,net) ]] + then + if [[ ${_IPSET_COMPL_TEST_MODE:=both} = members ]]; then + _ipset_complete_elements "$cur" --no-range + _ipset_colon_ltrim "$cur" + elif [[ ${_IPSET_COMPL_TEST_MODE} = spec ]]; then + _ipset_complete_hostport_spec "$cur" + else + _ipset_complete_elements "$cur" --no-range + _ipset_complete_hostport_spec "$cur" + _ipset_colon_ltrim "$cur" + fi + elif [[ $str_type = hash:net,iface ]]; then + if [[ ${_IPSET_COMPL_TEST_MODE:=both} = members ]]; then + _ipset_complete_elements "$cur" --no-range + _ipset_colon_ltrim "$cur" + elif [[ ${_IPSET_COMPL_TEST_MODE} = spec ]]; then + _ipset_complete_iface_spec "$cur" + else + _ipset_complete_elements "$cur" --no-range + _ipset_complete_iface_spec "$cur" + _ipset_colon_ltrim "$cur" + fi + elif [[ $str_type = bitmap:port ]]; then + str_prefix="" str_tmp="$cur" + if [[ $cur = @(tcp|udp):* ]]; then + ((got_bp_proto)) || return 0 # supported since ipset v6.20 + str_prefix="${cur%:*}" + str_tmp="${str_tmp#${str_prefix}:}" + fi + if [[ ${_IPSET_COMPL_TEST_MODE:=both} = members ]]; then + _ipset_complete_elements "$cur" --no-range + _ipset_colon_ltrim "$cur" + elif [[ ${_IPSET_COMPL_TEST_MODE} = spec ]]; then + if ((got_bp_proto)); then # supported since ipset v6.20 + COMPREPLY=( $(compgen -W \ + 'tcp: udp: $(_ipset_get_services -p "$str_prefix")' -- "$str_tmp" ) ) + [[ ${COMPREPLY[*]} = @(tcp|udp): ]] && compopt -o nospace + _ipset_colon_ltrim "$cur" + else # only tcp services prior to ipset v6.20 + COMPREPLY=( $(compgen \ + -W '$(_ipset_get_services -p tcp)' -- "$cur" ) ) + fi + else + if ((got_bp_proto)); then # supported since ipset v6.20 + COMPREPLY=( $(compgen -W \ + 'tcp: udp: $(_ipset_get_services -p "$str_prefix")' -- "$str_tmp" ) ) + [[ ${COMPREPLY[*]} = @(tcp|udp): ]] && compopt -o nospace + _ipset_colon_ltrim "$cur" + else # only tcp services prior to ipset v6.20 + COMPREPLY=( $(compgen \ + -W '$(_ipset_get_services -p tcp)' -- "$cur" ) ) + fi + _ipset_complete_elements "$cur" --no-range + _ipset_colon_ltrim "$cur" + fi + else + _ipset_complete_elements "$cur" --no-range + _ipset_colon_ltrim "$cur" + fi + ;; + esac +elif ((cword == action_index+3)) && [[ $cur != -* ]]; then + case "$str_action" in + add) + str_type=$(_ipset_get_set_type "$str_setname") + if _ipset_set_has_option timeout "$str_setname"; then + str_timeout=timeout + else + str_timeout="" + fi + if ! _ipset_set_has_option counters "$str_setname"; then + str_bp_counters="" + fi + if ! _ipset_set_has_option comment "$str_setname"; then + str_comment="" + fi + if ! _ipset_set_has_option skbinfo "$str_setname"; then + str_skbflags="" + fi + case "$str_type" in + hash:*net*) + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts $str_timeout $str_bp_counters $str_comment $str_skbflags nomatch)' \ + -- "$cur" ) ) + ;; + hash:*!(net)*|bitmap:*) + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts $str_timeout $str_bp_counters $str_skbflags $str_comment)' \ + -- "$cur" ) ) + ;; + list:*) + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts $str_order $str_timeout $str_bp_counters $str_skbflags $str_comment)' \ + -- "$cur" ) ) + ;; + esac + ;; + create|n) + case "$prev" in + hash:ip,mark) + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts family hashsize timeout maxelem $str_counters $str_skbinfo $str_markmask $str_comment $str_forceadd)' \ + -- "$cur" ) ) + ;; + hash:*) + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts family hashsize timeout maxelem $str_counters $str_skbinfo $str_comment $str_forceadd)' \ + -- "$cur" ) ) + ;; + bitmap:ip) + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts range netmask timeout $str_counters $str_skbinfo $str_comment)' \ + -- "$cur" ) ) + ;; + bitmap:!(ip)?*) + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts range timeout $str_counters $str_skbinfo $str_comment)' \ + -- "$cur" ) ) + ;; + list:*) + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts size timeout $str_counters $str_skbinfo $str_comment)' \ + -- "$cur" ) ) + ;; + esac + ;; + del|test) + str_type=$(_ipset_get_set_type "$str_setname") + if [[ $str_type = list:* ]]; then + COMPREPLY=( $( compgen -W '$str_order' -- "$cur" ) ) + elif [[ $str_action = test && $str_type = hash:*net* ]]; then + COMPREPLY=( $( compgen -W 'nomatch' -- "$cur" ) ) + fi + ;; + esac +elif ((cword == action_index+3)) && [[ $cur = -* ]]; then + _ipset_get_options +elif ((cword >= action_index+4)) && [[ $cur = -* ]]; then # add all following hyphen options + if [[ $prev != @(timeout|hashsize|size|family|maxelem|range|netmask|before|after|bytes|packets|comment|markmask|skbmark|skbprio|skbqueue) ]] + then + _ipset_get_options + fi +elif ((cword >= action_index+4)); then # add all following non-hyphen options + case "$str_action" in + add) + str_type=$(_ipset_get_set_type "$str_setname") + if _ipset_set_has_option timeout "$str_setname"; then + str_timeout=timeout + else + str_timeout="" + fi + if ! _ipset_set_has_option counters "$str_setname"; then + str_bp_counters="" + fi + if ! _ipset_set_has_option comment "$str_setname"; then + str_comment="" + fi + if ! _ipset_set_has_option skbinfo "$str_setname"; then + str_skbflags="" + fi + # validate option argument values + if [[ ${_IPSET_VALIDATE_INPUT-1} ]]; then + for ((x=$action_index+3; x < ${#words[@]}; x++)); do + if [[ ${words[x]} = @(timeout|bytes|packets) ]]; then + [[ ${words[x+1]} = @(+([[:digit:]])|0[xX]+([[:xdigit:]])) ]] || return 0 + elif [[ ${words[x]} = skbmark ]]; then + if [[ ${words[x+1]} = 0[xX]+([[:xdigit:]])?(/0[xX]+([[:xdigit:]])) ]]; then + (( ${words[x+1]%/*} >= 0 && ${words[x+1]%/*} <= 0xFFFFFFFF )) || return 0 + (( ${words[x+1]#*/} >= 0 && ${words[x+1]#*/} <= 0xFFFFFFFF )) || return 0 + else + return 0 + fi + elif [[ ${words[x]} = skbprio ]]; then + [[ ${words[x+1]} = +([[:xdigit:]]):?(+([[:xdigit:]])) ]] || return 0 + elif [[ ${words[x]} = skbqueue ]]; then + [[ ${words[x+1]} = +([[:digit:]]) ]] || return 0 + fi + done + fi + case "$str_type" in + hash:*net*) + if [[ $prev != @(timeout|bytes|packets|comment|skbmark|skbprio|skbqueue) ]]; then + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts $str_timeout $str_bp_counters $str_comment $str_skbflags nomatch)' \ + -- "$cur" ) ) + fi + ;; + hash:*!(net)*|bitmap:*) + if [[ $prev != @(timeout|bytes|packets|comment|skbmark|skbprio|skbqueue) ]]; then + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts $str_timeout $str_bp_counters $str_comment $str_skbflags)' \ + -- "$cur" ) ) + fi + ;; + list:*) + if [[ $prev = @(before|after) ]] && ((cword-1 == order_index)); then + _ipset_complete_elements "$cur" + _ipset_colon_ltrim "$cur" + elif [[ $prev != @(timeout|bytes|packets|skbmark|skbprio|skbqueue) ]]; then + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts $str_order $str_timeout $str_bp_counters $str_comment $str_skbflags)' \ + -- "$cur" ) ) + fi + ;; + esac + ;; + create|n) + # validate option argument values + if [[ ${_IPSET_VALIDATE_INPUT-1} ]]; then + for ((x=$action_index+3; x < ${#words[@]}; x++)); do + if [[ ${words[x+1]} && ${words[x+1]} != $cur ]]; then + case "${words[x]}" in + @(hashsize|timeout|size|maxelem|markmask)) + [[ ${words[x+1]} != @(+([[:digit:]])|0[xX]+([[:xdigit:]])) ]] && return 0 + ;; + family) + [[ ${words[x+1]} != inet?(6) ]] && return 0 + ;; + range) + case "$str_type" in + bitmap:port) + [[ ${words[x+1]} != *-* ]] && return 0 + ;; + *) + [[ ${words[x+1]} != @(*-*|*/+([[:digit:]])) ]] && return 0 + ;; + esac + ;; + esac + fi + done + fi + case "${words[action_index+2]}" in # must be the set type + hash:ip,mark) + if [[ $prev = family ]]; then + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts inet inet6)' \ + -- "$cur" ) ) + elif [[ $prev != @(hashsize|timeout|maxelem|markmask) ]]; then + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts family hashsize timeout maxelem $str_counters $str_markmask $str_comment $str_forceadd $str_skbinfo)' \ + -- "$cur" ) ) + fi + ;; + hash:*) + if [[ $prev = family ]]; then + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts inet inet6)' \ + -- "$cur" ) ) + elif [[ $prev != @(hashsize|timeout|maxelem) ]]; then + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts family hashsize timeout maxelem $str_counters $str_comment $str_forceadd $str_skbinfo)' \ + -- "$cur" ) ) + fi + ;; + bitmap:ip) + if [[ $prev != @(range|netmask|timeout) ]]; then + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts range netmask timeout $str_counters $str_comment $str_skbinfo)' \ + -- "$cur" ) ) + fi + ;; + bitmap:!(ip)?*) + if [[ $prev != @(range|timeout) ]]; then + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts range timeout $str_counters $str_comment $str_skbinfo)' \ + -- "$cur" ) ) + fi + ;; + list:*) + if [[ $prev != @(size|timeout) ]]; then + COMPREPLY=( $( compgen -W \ + '$(_ipset_dedupe_cmd_opts size timeout $str_counters $str_comment $str_skbinfo)' \ + -- "$cur" ) ) + fi + ;; + esac + if [[ ${words[action_index+2]} = bitmap:port && $prev = range ]]; then + # complete port ranges + _ipset_complete_portrange "$cur" + elif [[ ${words[action_index+2]} = bitmap:* && $prev = range ]]; then + str_prefix="" + if [[ $cur = @(""|+([[:word:]])) ]]; then # empty or [:word:] + : + elif [[ $cur = [\[]*-*[\]] ]]; then # host with hyphen + : + elif [[ $cur = [[]*([!]]) ]]; then # incomplete host with dash + : + elif [[ $cur = *-[[]+([!]]) ]]; then # incomplete range - host with dash + str_prefix="${cur%\-[*}-" + elif [[ $cur = \[*\]-* ]]; then # first part of hostname range + str_prefix="${cur%\]-*}]-" + elif [[ $cur != *-* ]]; then # no hypen + : + else # ip-range + str_prefix="${cur%-*}-" + fi + _ipset_complete_host_spec "$cur" --v4 + if ((${#COMPREPLY[@]} == 1)); then + if [[ -z $str_prefix && ${COMPREPLY[*]} != */* ]]; then + compopt -o nospace + COMPREPLY=( $( compgen -W '${COMPREPLY[*]}/ ${COMPREPLY[*]}-' -- "$cur" ) ) + fi + fi + fi + ;; + del|test) + str_type=$(_ipset_get_set_type "$str_setname") + case "$str_type" in + list:*) arr_tmp=() + _ipset_get_members --names-only "$str_setname" + if [[ $prev = @(before|after) ]] && ((cword-1 == order_index)) + then + case "$prev" in + before) + for x in ${!arr_members[@]}; do + if [[ ${arr_members[x]} = ${words[action_index+2]} ]] + then + if [[ ${arr_members[x+1]} ]]; then + arr_tmp+=(${arr_members[x+1]}) + break + fi + fi + done + ;; + after) + for x in ${!arr_members[@]}; do + if [[ ${arr_members[x]} = ${words[action_index+2]} ]] + then + if ((x>0)) && [[ ${arr_members[x-1]} ]]; then + arr_tmp+=(${arr_members[x-1]}) + break + fi + fi + done + ;; + esac + COMPREPLY=( $( compgen -W '${arr_tmp[@]}' -- "$cur" ) ) + _ipset_colon_ltrim "$cur" + fi + ;; + esac + ;; + esac +fi +else # we don't have the main action yet +if [[ $prev = - ]] && ((cword == 2)); then + return 0 # interactive mode, don't complete on anything further +fi +if [[ $cur = -* ]]; then # any option is requested + _ipset_get_options +else + # we don't have the action yet, check options to display appropiate actions + if ((save_format || names_only || headers_only)); then + COMPREPLY=( $( compgen -W 'list' -- "$cur" ) ) + elif ((res_sort)); then + COMPREPLY=( $( compgen -W 'list save' -- "$cur" ) ) + elif ((ignore_errors && use_file)); then + COMPREPLY=( $( compgen -W 'restore' -- "$cur" ) ) + elif ((ignore_errors)); then + COMPREPLY=( $( compgen -W 'create n add del restore' -- "$cur" ) ) + elif ((use_file)); then + COMPREPLY=( $( compgen -W 'list save restore' -- "$cur" ) ) + else + COMPREPLY=( $( compgen -W 'create n add del test destroy x list save \ + restore flush rename e swap w help version' -- "$cur" ) ) + fi +fi +fi +if [[ $_DEBUG_NF_COMPLETION ]]; then + printf "COMPREPLY:\n" + printf "<%s>\n" "${COMPREPLY[@]}" +fi +} +complete -F _ipset_complete ipset + diff --git a/utils/ipset_list/README.md b/utils/ipset_list/README.md new file mode 100644 index 0000000..f34070f --- /dev/null +++ b/utils/ipset_list/README.md @@ -0,0 +1,76 @@ +ipset_list +========== + +ipset set listing wrapper script written for the bash shell. +It allows you to match and display sets, headers and elements in various ways. + + +Features: +========== + +- Calculate sum of set members (and match on that count). +- List only members of a specified set. +- Choose a delimiter character for separating members. +- Show only sets containing a specific (glob matching) header. +- Arithmetic comparison on headers with an integer value. +- Arithmetic comparison on flags of the headers 'Header' field. +- Arithmetic comparison on member options with an integer value. +- Match members using a globbing or regex pattern. +- Suppress listing of (glob matching) sets. +- Suppress listing of (glob matching) headers. +- Suppress listing of members matching a glob or regex pattern. +- Suppress listing of members options. +- Calculate the total size in memory of all matching sets. +- Calculate the amount of matching, excluded and traversed sets. +- Colorize the output. +- Operate on a single, selected, or all sets. +- Programmable completion is included to make usage easier and faster. + + +Examples: +========== + +- `ipset_list` - no args, just list set names +- `ipset_list -c` - show all set names and their member sum +- `ipset_list -t` - show all sets, but headers only +- `ipset_list -c -t setA` - show headers and member sum of setA +- `ipset_list -i setA` - show only members entries of setA +- `ipset_list -c -m setA setB` - show members and sum of setA & setB +- `ipset_list -a -c -d :` - show all sets members, sum and use `:' as entry delimiter +- `ipset_list -a -c setA` - show all info of setA and its members sum +- `ipset_list -c -m -d $'\n' setA` - show members and sum of setA, delim with newline +- `ipset_list -m -r -s setA` - show members of setA resolved and sorted +- `ipset_list -Fi References:0` - show all sets with 0 references +- `ipset_list -Hr 0` - shortcut for -Fi References:0 +- `ipset_list -Ht "!(hash:ip)"` - show sets which are not of type hash:ip +- `ipset_list -Ht "!(bitmap:*)"` - show sets wich are not of any bitmap type +- `ipset_list -Cs -Ht "hash:*"` - find sets of any hash type, count their amount. +- `ipset_list -Ts` - show all set names and total count of sets. +- `ipset_list -Tm` - calculate total size in memory of all sets. +- `ipset_list -Xs setA -Xs setB` - show all set names, but exclude setA and setB. +- `ipset_list -Xs "set[AB]"` - show all set names, but exclude setA and setB. +- `ipset_list -Mc 0` - show sets with zero members +- `ipset_list -Hr \>=1 -Hv 0 -Hs \>10000` - find sets with at least one reference, revision of 0 and size in memory greater than 10000 +- `ipset_list -i -Fr "^210\..*" setA` - show only members of setA matching the regex "^210\\..*" +- `ipset_list -Mc \>=100 -Mc \<=150` - show sets with a member count greater or equal to 100 and not greater than 150. +- `ipset_list -a -c -Fh "Type:hash:ip" -Fr "^210\..*"` - show all information of sets with type hash:ip, matching the regex "^210\\..*", show match and members sum +- `ipset_list -Fh Type:hash:ip -Fh "Header:family inet *"` - show all set names, which are of type hash:ip and header of ipv4. +- `ipset_list -t -Xh "Revision:*" -Xh "References:*"` - show all sets headers, but exclude Revision and References entries. +- `ipset_list -c -m -Xg "210.*" setA` - show members of setA, but suppress listing of entries matching the glob pattern "210.*", show count of excluded and total members. +- `ipset_list -m -Fg "!(210.*)" setA` - show members of setA excluding the elements matching the negated glob. +- `ipset_list -a -Xh "@(@(H|R|M)e*):*"` - show all info of all sets, but suppress Header, References, Revision and Member header entries (headers existing as per ipset 6.x -> tested version). +- `ipset_list -t -Tm -Xh "@(Type|Re*|Header):*"` - show all sets headers, but suppress all but name and memsize entry, calculate the total memory size of all sets. +- `ipset_list -t -Tm -Xh "!(Size*|Type):*" -Ts -Co` List all sets headers, but suppress all but name, type and memsize entry, + count amount of sets, calculate total memory usage, colorize the output. +- `ipset_list -t -Ht "!(@(bit|port)map):*" -Xh "!(Type):*"` - show all sets that are neither of type bitmap or portmap, suppress all but the type header. +- `ipset_list -c -t -Cs -Ts -Xh "@(Size*|Re*|Header):*" -Ht "!(bitmap:*)"` - find all sets not of any bitmap type, count their members sum, display only the 'Type' header, count amount of matching and traversed sets. +- `ipset_list -Co -c -Ts -Tm` - show all set names, count their members, count total amount of sets, show total memory usage of all sets, colorize the output +- `ipset_list -m -r -To 0` - show members of all sets, try to resolve hosts, set the timeout to 0 (effectivly disabling it). +- `ipset_list -m -Xo setA` - show members of setA, but suppress displaying of the elements options. +- `ipset_list -m -Oi packets:0` - show members of all sets which have a packet count of 0. +- `ipset_list -m -Oi "packets:>100" -Oi "bytes:>1024"` - show members of all sets which have a packet count greater than 100 and a byte count greater than 1024. +- `ipset_list -m -Oi "skbmark:>0x123/0XFF" -Oi skbprio:\>=2:<=3 -Oi skbqueue:\!1` - show members of all sets which have the following member options set: skbmark greater than 0x123/0xFF, skbprio major greater or equal to 2 and minor lower or equal to 3, skbqueue not of value 1. +- `ipset_list -n -Ca "foo*"` - show only set names matching the glob "foo*" and enable all counters. +- `ipset_list -Hi "markmask:>=0x0000beef" -Hi timeout:\!10000` - show only sets with the header 'Header' fields containing a markmask greater or equal to 0x0000beef and a timeout which is not 10000. + + diff --git a/utils/ipset_list/ipset_list b/utils/ipset_list/ipset_list new file mode 100755 index 0000000..ad15f18 --- /dev/null +++ b/utils/ipset_list/ipset_list @@ -0,0 +1,1072 @@ +#!/bin/bash + +# ----------------------------------------------------------------- +# ipset set listing wrapper script +# +# https://github.com/AllKind/ipset_list +# https://sourceforge.net/projects/ipset-list/ +# ----------------------------------------------------------------- + +# Copyright (C) 2013-2014 AllKind (AllKind@fastest.cc) +# +# 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 . + +# ----------------------------------------------------------------- +# Compatible with ipset version 6+ +# Tested with ipset versions: +# 6.16.1, 6.20.1, 6.22 +# ----------------------------------------------------------------- + +# ----------------------------------------------------------------- +# Features (in addition to the native ipset options): +# - Calculate sum of set members (and match on that count). +# - List only members of a specified set. +# - Choose a delimiter character for separating members. +# - Show only sets containing a specific (glob matching) header. +# - Arithmetic comparison on headers with an integer value. +# - Arithmetic comparison on flags of the headers 'Header' field. +# - Arithmetic comparison on member options with an integer value. +# - Match members using a globbing or regex pattern. +# - Suppress listing of (glob matching) sets. +# - Suppress listing of (glob matching) headers. +# - Suppress listing of members matching a glob or regex pattern. +# - Calculate the total size in memory of all matching sets. +# - Calculate the amount of matching, excluded and traversed sets. +# - Colorize the output. +# - Operate on a single, selected, or all sets. +# - Programmable completion is included to make usage easier and faster. +# ----------------------------------------------------------------- + +# ----------------------------------------------------------------- +# Examples: +# $0 - no args, just list set names +# $0 -c - show all set names and their member sum +# $0 -t - show all sets, but headers only +# $0 -c -t setA - show headers and member sum of setA +# $0 -i setA - show only members entries of setA +# $0 -c -m setA setB - show members and sum of setA & setB +# $0 -a -c -d : - show all sets members, sum and use `:' as entry delimiter +# $0 -a -c setA - show all info of setA and its members sum +# $0 -c -m -d $'\n' setA - show members and sum of setA, delim with newline +# $0 -m -r -s setA - show members of setA resolved and sorted +# $0 -Ts - show all set names and total count of sets. +# $0 -Tm - calculate total size in memory of all sets. +# $0 -Mc 0 - show sets with zero members +# $0 -Fi References:0 - show all sets with 0 references +# $0 -Hr 0 - shortcut for `-Fi References:0' +# $0 -Xs setA -Xs setB - show all set names, but exclude setA and setB. +# $0 -Xs "set[AB]" - show all set names, but exclude setA and setB. +# $0 -Cs -Ht "hash:*" - find sets of any hash type, count their amount. +# $0 -Ht "!(hash:ip)" - show sets which are not of type hash:ip +# $0 -Ht "!(bitmap:*)" - show sets wich are not of any bitmap type +# $0 -i -Fr "^210\..*" setA - show only members of setA matching the regex "^210\..*" +# $0 -Mc \>=100 -Mc \<=150 - show sets with a member count greater or equal to 100 +#+ and not greater than 150. +# $0 -a -c -Fh "Type:hash:ip" -Fr "^210\..*" +#+ - show all information of sets with type hash:ip, +#+ matching the regex "^210\..*", show match and members sum. +# +# $0 -m -Fg "!(210.*)" setA +#+ show members of setA excluding the elements matching the negated glob. +# +# $0 -Hr \>=1 -Hv 0 -Hs \>10000 - find sets with at least one reference, +#+ revision of 0 and size in memory greater than 10000 +# +# $0 -Fh Type:hash:ip -Fh "Header:family inet *" +#+ - show all set names, which are of type hash:ip and header of ipv4. +# +# $0 -t -Xh "Revision:*" -Xh "References:*" +#+ - show all sets headers, but exclude Revision and References entries. +# +# $0 -t -Ht "!(@(bit|port)map):*" -Xh "!(Type):*" - show all sets that are +#+ neither of type bitmap or portmap, suppress all but the type header. +# +# $0 -c -m -Xg "210.*" setA - show members of setA, but suppress listing of entries +#+ matching the glob pattern "210.*", show count of excluded and total members. +# +# $0 -t -Tm -Xh "@(Type|Re*|Header):*" +#+ show all sets headers, but suppress all but name and memsize entry, +#+ calculate the total memory size of all sets. +# +# $0 -t -Tm -Xh "!(Size*|Type):*" -Ts -Co +# + List all sets headers, but suppress all but name, type and memsize entry, +# + count amount of sets, calculate total memory usage, colorize the output. +# +# $0 -c -t -Cs -Ts -Xh "@(Size*|Re*|Header):*" -Ht "!(bitmap:*)" +#+ find all sets not of any bitmap type, count their members sum, +#+ display only the 'Type' header, +#+ count amount of matching and traversed sets. +# +# $0 -a -Xh "@(@(H|R|M)e*):*" - show all info of all sets, +#+ but suppress Header, References, Revision and Member header entries. +#+ (headers existing as per ipset 6.x -> tested version). +# +# $0 -Co -c -Ts -Tm - show all set names, count their members, +# + count total amount of sets, show total memory usage of all sets, +# + colorize the output +# +# $0 -m -r -To 0 - show members of all sets, try to resolve hosts, +# set the timeout to 0 (effectivly disabling it). +# +# $0 -m -Xo setA - show members of setA, +# + but suppress displaying of the elements options. +# +# $0 -m -Oi packets:0 +# + show members of all sets which have a packet count of 0. +# +# $0 -m -Oi "packets:>100" -Oi "bytes:>1024" +# + show members of all sets which have a +# + packet count greater than 100 and a byte count greater than 1024. +# +# $0 -m -Oi "skbmark:>0x123/0XFF" -Oi skbprio:\>=2:<=3 -Oi skbqueue:\!1 +# + show members of all sets which have the following member options set: +# + skbmark greater than 0x123/0xFF, skbprio major greater or equal to 2 +# + and minor lower or equal to 3, skbqueue not of value 1. +# +# $0 -n -Ca "foo*" +# + show only set names matching the glob "foo*" and enable all counters. +# +# $0 -Hi "markmask:>=0x0000beef" -Hi timeout:\!10000` +# + show only sets with the header 'Header' fields containing a markmask +# + greater or equal to 0x0000beef and a timeout which is not 10000. +# ----------------------------------------------------------------- + +# ----------------------------------------------------------------- +# Modify here +# ----------------------------------------------------------------- + +# modify your PATH variable +# by default the path is only set if the PATH variable is not already set in the environment +# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +: ${PATH:=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin} + +# path to ipset. +# defaults to `/sbin/ipset' if unset. +#ipset="/sbin/ipset" +# find in path if not declared in parent environment +: ${ipset:=$(command -v ipset)} + +# default delimiter character for set members (elements). +# defaults to whitespace if unset. +# use delim=$'\n' to use the ipset default newline as delimiter. +delim=" " + +# default read timeout (for reading sets - esp. with the -r switch). +# the command line option -To overrides this. +TMOUT=30 + +# colorize the output (bool 0/1). +colorize=0 + +# path to cl (to colorize the output). +# http://sourceforge.net/projects/colorize-shell/ or +# https://github.com/AllKind/cl +# defaults to `/usr/local/bin/cl' if unset. +cl="/usr/local/bin/cl" + +# define colors +# run `cl --list' to retrieve the valid color names +# +# default foreground color +# defaults to: white +col_fg="white" + +# default background color +# defaults to: black +col_bg="black" + +# color for headers +# defaults to: cyan +col_headers="cyan" + +# color for members +# defaults to: yellow +col_members="yellow" + +# color for matches +# defaults to: red +col_match="red" + +# color for displaying of memsize +# defaults to: green +col_memsize="green" + +# color for counting of matched sets +# defaults to: magenta +col_set_count="magenta" + +# color for counting of traversed sets +# defaults to: blue +col_set_total="blue" + +# general higlightning color +# defaults to: white +col_highlight="white" + +# ----------------------------------------------------------------- +# DO NOT MODIFY ANYTHING BEYOND THIS LINE! +# ----------------------------------------------------------------- + + +# bash check +if [ -z "$BASH" ]; then + printf "\`BASH' variable is not available. Not running bash?\n" >&2 + exit 1 +fi + +# shell settings +shopt -s extglob +set -f +set +o posix +set +u + +# variables +export LC_ALL=C +readonly version=3.2.1 +readonly me="${0//*\//}" +readonly oIFS="$IFS" +declare ips_version="" str_search="" str_xclude="" opt str_name str_val str_op +declare -i show_all=show_count=show_members=headers_only=names_only=isolate=calc_mem=count_sets=sets_total=0 +declare -i match_on_header=glob_search=regex_search=member_count=match_count=do_count=opt_int_search=0 +declare -i exclude_header=glob_xclude_element=glob_xclude_element=exclude_set=xclude_member_opts=0 +declare -i in_header=found_set=found_member_opt=found_hxclude=found_sxclude=xclude_count=mem_total=mem_tmp=set_count=sets_sum=i=x=y=idx=0 +declare -a arr_sets=() arr_par=() arr_hcache=() arr_mcache=() arr_hsearch=() arr_tmp=() +declare -a arr_hsearch_int=() arr_hsearch_xint=() arr_hxclude=() arr_sxclude=() arr_match_on_msum=() arr_opt_int_search=() + +# ----------------------------------------------------------------- +# functions +# ----------------------------------------------------------------- + +ex_miss_optarg() { +printf "%s of option \`%s' is missing\n" "$2" "$1" >&2 +exit 2 +} + +ex_invalid_usage() { +printf "%s\n" "$*" >&2 +exit 2 +} + +is_int() { +[[ $1 = +([[:digit:]]) ]] +} + +is_digit_or_xigit() { +[[ $1 = @(+([[:digit:]])|0[xX]+([[:xdigit:]])) ]] +} + +is_compare_str() { + [[ $1 = ?(\!|<|>|<=|>=)@(+([[:digit:]])|0[x|X]+([[:xdigit:]])) ]] +} + +is_compare_str_complex() { + [[ $1 = ?(\!|<|>|<=|>=)@(+([[:digit:]])|0@(x|X)+([[:xdigit:]])?(/0@(x|X)+([[:xdigit:]]))|+([[:xdigit:]]):?(\!|<|>|<=|>=)+([[:xdigit:]])) ]] +} + +add_search_to_member_cache() { +if ((show_members || show_all || isolate)); then + arr_mcache[i++]="$REPLY" +fi +} + +arith_elem_opt_search() { +local str_opt_val str_val2 str_op2 str_cg='?(\!|<|>|<=|>=)' str_xdig='0[xX]+([[:xdigit:]])' +found_member_opt=0 +for y in ${!arr_opt_int_search[@]}; do + str_val="${arr_opt_int_search[y]#*:}" + if [[ $str_val = ${str_cg}@(+([[:digit:]])|$str_xdig) ]]; then # i.e. timeout or skbqueue + str_op="${str_val//[![:punct:]]}" + str_val="${str_val//[=\!\>\<]}" + elif [[ $str_val = ${str_cg}${str_xdig}/$str_xdig ]]; then # i.e. skbmark + str_op="${str_val//[![:punct:]]}" + str_op="${str_op//\/}" + str_val="${str_val//[=\!\>\<]}" + elif [[ $str_val = ${str_cg}+([[:xdigit:]]):${str_cg}+([[:xdigit:]]) ]]; then # i.e. skbprio + str_op="${str_val%:*}" + str_op="${str_op%%+([[:xdigit:]])}" + str_op2="${str_val#*:}" + str_op2="${str_op2%%+([[:xdigit:]])}" + str_val="${str_val##+([[:punct:]])}" + str_val2="${str_val#*:}" + str_val2="${str_val2//[[:punct:]]}" + fi + # compare operator defaults to `==' + # if it's a '!' set it to '!=' + [[ ${str_op:===} = \! ]] && str_op='!=' + [[ ${str_op2:===} = \! ]] && str_op2='!=' + set -- $REPLY + shift + while (($# > 1)); do # cycle through options + if [[ $1 = ${arr_opt_int_search[y]%%:*} ]]; then str_opt_val="$2" + if [[ $str_val = @(+([[:digit:]])|$str_xdig) && $str_opt_val = @(+([[:digit:]])|$str_xdig) ]]; then # i.e. timeout or skbqueue + if (( $str_opt_val $str_op $str_val )); then + let found_member_opt+=1 + fi + shift + elif [[ $str_val = $str_xdig && $str_opt_val = ${str_xdig}/$str_xdig ]]; then # i.e. skbmark + if (( $str_opt_val $str_op $(( ${str_val%/*} & ${str_val#*/} )) )); then # logicaly AND mark/mask + let found_member_opt+=1 + fi + shift + elif [[ $str_val = ${str_xdig}/$str_xdig && $str_opt_val = ${str_xdig}/$str_xdig ]]; then # i.e. skbmark + if (( $(( ${str_opt_val%/*} & ${str_opt_val#*/} )) $str_op $(( ${str_val%/*} & ${str_val#*/} )) )); then # logicaly AND mark/mask + let found_member_opt+=1 + fi + shift + elif [[ $str_val = +([[:xdigit:]]):${str_cg}+([[:xdigit:]]) && $str_opt_val = +([[:xdigit:]]):+([[:xdigit:]]) ]]; then # i.e. skbprio + if (( ${str_opt_val%:*} $str_op ${str_val%:*} && ${str_opt_val#*:} $str_op2 $str_val2 )); then + let found_member_opt+=1 + fi + shift + fi + fi + shift + done +done +if ((opt_int_search == found_member_opt)); then + let match_count+=1 + add_search_to_member_cache +fi +} + +xclude_elem_search() { +if ((glob_xclude_element)); then # exclude matching members + if [[ $REPLY = $str_xclude ]]; then + let xclude_count+=1 + return 0 + fi +elif ((regex_xclude_element)); then # exclude matching members + if [[ $REPLY =~ $str_xclude ]]; then + let xclude_count+=1 + return 0 + else + if (($? == 2)); then + printf "Invalid regex pattern \`%s'.\n" "$str_xclude" >&2 + exit 1 + fi + fi +fi +return 1 +} + +# ----------------------------------------------------------------- +# main +# ----------------------------------------------------------------- + +# validate value of colorize +if [[ ${colorize:=0} != [01] ]]; then + ex_invalid_usage "value of variable \`colorize' \`$colorize' is not 0 or 1." +fi + +# parse cmd-line options +while (($#)); do + case "$1" in + -\?|-h) printf "\n\tipset set listing wrapper script\n\n" + printf '%s [option [opt-arg]] [set-name-glob] [...]\n\n' "$me" + printf '%s %s\n' "$me" "{-?|-h} | -v" + printf '%s %s\n\t%s\n\t%s\n' "$me"\ + "[-i|-r|-s|-Co|-Xo] [-d char] [-To value]"\ + "[-Fg|-Fr pattern] [-Xg|-Xr pattern]"\ + "[-Oi option-glob:[!|<|>|<=|>=]value] [...] -- set-name" + printf '%s %s\n\t%s\n\t%s\n\t%s\n' "$me"\ + "[-n|-c|-Ca|-Co|-Cs|-Tm|-Ts|-Xs] [-To value]"\ + "[-Fh header-glob:value-glob] [...] [-Fg|-Fr pattern]"\ + "[-Hi glob:[!|<|>|<=|>=]value] [...]"\ + "[-Oi option-glob:[!|<|>|<=|>=]value] [...] -- [set-name-glob] [...]" + printf '%s %s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n' "$me"\ + "[-t|-c|-Ca|-Co|-Cs|-Tm|-Ts]"\ + "[-Fh header-glob:value-glob] [...]"\ + "[-Fi header-glob:[!|<|>|<=|>=]value] [...]"\ + "[-Fg|-Fr pattern] [-Ht type-glob]"\ + "[-Hi glob:[!|<|>|<=|>=]value] [...]"\ + "[-Hr|-Hs|-Hv [!|<|>|<=|>=]value]"\ + "[-Mc [!|<|>|<=|>=]value] [...] [-To value]"\ + "[-Oi option-glob:[!|<|>|<=|>=]value] [...]"\ + "[-Xh header-glob:value-glob] [...]"\ + "[-Xs set-name-glob] [...] -- [set-name-glob] [...]" + printf '%s %s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n' "$me"\ + "[-a|-c|-m|-r|-s|-Ca|-Co|-Cs|-Tm|-Ts|-Xo] [-d char]"\ + "[-Fh header-glob:value-glob] [...]"\ + "[-Fi header-glob:[!|<|>|<=|>=]value] [...]"\ + "[-Fg|-Fr pattern] [-Ht type-glob]"\ + "[-Hi glob:[!|<|>|<=|>=]value] [...]"\ + "[-Hr|-Hs|-Hv [!|<|>|<=|>=]value]"\ + "[-Mc [!|<|>|<=|>=]value] [...]"\ + "[-Oi option-glob:[!|<|>|<=|>=]value] [...]"\ + "[-To value] [-Xh header-glob:value-glob] [...]"\ + "[-Xg|-Xr pattern] [-Xs set-name-glob] [...] -- [set-name-glob] [...]" + printf 'options:\n' + printf '%-13s%s\n' '-a' 'show all information but with default delim (whitespace).'\ + '-c' 'calculate members and match sum.'\ + '-d delim' 'delimiter character for separating member entries.'\ + '-h|-?' 'show this help text.'\ + '-i' 'show only the members of a single set.'\ + '-m' 'show set members.'\ + '-n' "show set names only."\ + '-r' 'try to resolve ip addresses in the output (slow!).'\ + '-s' 'print elements sorted (if supported by the set type).'\ + '-t' 'show set headers only.'\ + '-v' 'version information.'\ + '-Ca' "shortcut for -c -Cs -Ts -Tm (enable all counters)."\ + '-Co' "colorize output (requires \`cl')."\ + '-Cs' 'count amount of matching sets.'\ + '-Fg pattern' 'match on members using a [ext]glob pattern.'\ + '-Fr pattern' 'match on members using a regex (=~ operator) pattern.' + printf '%s\n\t%s\n' '-Fh header-glob:value-glob [...]'\ + 'show sets containing one or more [ext]glob matching headers.' + printf '%s\n\t%s\n' '-Fi header-glob:[!|<|>|<=|>=]value [...]'\ + 'show sets matching one or more integer valued header entries.' + printf '%s\n\t%s\n' '-Hi header-glob:[!|<|>|<=|>=]value [...]'\ + "match one or more integer valued headers \`Header' entries." + printf '%-24s%s\n' '-Ht set-type-glob' 'match on set type.'\ + '-Hr [!|<|>|<=|>=]value' 'match on number of references (value=int).'\ + '-Hs [!|<|>|<=|>=]value' 'match on size in memory (value=int).'\ + '-Hv [!|<|>|<=|>=]value' 'match on revision number (value=int).' + printf '%-30s%s\n' '-Mc [!|<|>|<=|>=]value [...]' 'match on member count (value=int).' + printf '%s\n\t%s\n' '-Oi option-glob:[!|<|>|<=|>=]value [...]'\ + 'match member options (value=int | 0xhex[/0xhex] | hex:[!|<|>|<=|>=]hex).' + printf '%-13s%s\n' '-Tm' 'calculate total memory usage of all matching sets.'\ + '-To' 'set timeout value (int) for read (listing sets).'\ + '-Ts' 'count amount of traversed sets.'\ + '-Xo' 'suppress display of member options.' + printf '%s\n\t%s\n' '-Xh header-glob:value-glob [...]'\ + 'exclude one or more [ext]glob matching header entries.' + printf '%-13s%s\n' '-Xg pattern' 'exclude members matching a [ext]glob pattern.'\ + '-Xr pattern' 'exclude members matching a regex pattern.'\ + '-Xs pattern' 'exclude sets matching a [ext]glob pattern.' + printf '%-13s%s\n' '--' 'stop further option processing.' + exit 0 + ;; + -a) show_all=1 # like `ipset list', but with $delim as delim + ;; + -c) show_count=1 # show sum of member entries + ;; + -i) isolate=1 # show only members of a single set + ;; + -m) show_members=1 # show set members + ;; + -n) names_only=1 # only list set names + ;; + -t) headers_only=1 # show only set headers + ;; + -s|-r) arr_par[i++]="$1" # ipset sort & resolve options are passed on + ;; + -d) # delimiter char for separating member entries + [[ $2 ]] || ex_miss_optarg $1 "delim character" + if ((${#2} > 1)); then + ex_invalid_usage "only one character is allowed as delim" + fi + delim="$2" + shift + ;; + -o) if [[ $2 != plain ]]; then + ex_invalid_usage "only plain output is supported" + fi + ;; + -Ca) # shortcut for -c -Cs -Ts -Tm + show_count=1 count_sets=1 calc_mem=1 sets_total=1 + ;; + -Cs) count_sets=1 # calculate total count of matching sets + ;; + -Co) colorize=1 # colorize the output (requires cl) + ;; + -Fg) glob_search=1 # find entry with globbing pattern + [[ $2 ]] || ex_miss_optarg $1 "glob pattern" + str_search="$2" + shift + ;; + -Fr) regex_search=1 # find entry with regex pattern + [[ $2 ]] || ex_miss_optarg $1 "regex pattern" + str_search="$2" + shift + ;; + -Oi) let opt_int_search+=1 + [[ $2 ]] || ex_miss_optarg $1 "pattern" + if [[ $2 = *:* ]] && is_compare_str_complex "${2#*:}"; then + arr_opt_int_search[y++]="$2" + shift + else + ex_invalid_usage "invalid format of header descriptor. expecting: \`glob:[!|<|>|<=|>=]value'" + fi + ;; + -Fh) let match_on_header+=1 # show only sets, which contain a matching header entry + [[ $2 ]] || ex_miss_optarg $1 "header pattern" + if [[ $2 = *:* ]]; then + arr_hsearch[x++]="$2" + shift + else + ex_invalid_usage "invalid format of header descriptor. expecting: \`*:*'" + fi + ;; + -Fi) let match_on_header+=1 # show only sets, containing a matching (int compare) header entry + [[ $2 ]] || ex_miss_optarg $1 "header pattern" + if [[ $2 = *:* ]] && is_compare_str "${2#*:}"; then + arr_hsearch_int[idx++]="$2" + shift + else + ex_invalid_usage "invalid format of header descriptor. expecting: \`name:[!|<|>|<=|>=]value'" + fi + ;; + -Hi) let match_on_header+=1 # match on name + integer (digit & xdigit) inside of headers 'Header' flag + [[ $2 ]] || ex_miss_optarg $1 "header pattern" + if [[ $2 = *:?(\!|<|>|<=|>=)@(+([[:digit:]])|0[xX]+([[:xdigit:]])) ]]; then + arr_hsearch_xint[${#arr_hsearch_xint[@]}]="$2" + shift + else + ex_invalid_usage "invalid format of headers \'Header' flag descriptor. expecting: \`name:[!|<|>|<=|>=]value'" + fi + ;; + -Hr) let match_on_header+=1 # shortcut for -Fi References:... + [[ $2 ]] || ex_miss_optarg $1 "header pattern" + if is_compare_str "$2"; then + arr_hsearch_int[idx++]="References:$2" + shift + else + ex_invalid_usage "invalid format of references header descriptor. expecting: \`[!|<|>|<=|>=]value'" + fi + ;; + -Hs) let match_on_header+=1 # shortcut for -Fi "Size in Memory:..." + [[ $2 ]] || ex_miss_optarg $1 "header pattern" + if is_compare_str "$2"; then + arr_hsearch_int[idx++]="Size in memory:$2" + shift + else + ex_invalid_usage "invalid format of memsize header descriptor. expecting: \`[!|<|>|<=|>=]value'" + fi + ;; + -Ht) let match_on_header+=1 # shortcut for -Fh Type:x:y + [[ $2 ]] || ex_miss_optarg $1 "header pattern" + if [[ $2 = *:* ]]; then + arr_hsearch[x++]="Type:$2" + shift + else + ex_invalid_usage "invalid format of set type descriptor. expecting: \`*:*'." + fi + ;; + -Hv) let match_on_header+=1 # shortcut for -Fi Revision:... + [[ $2 ]] || ex_miss_optarg $1 "header pattern" + if is_compare_str "$2"; then + arr_hsearch_int[idx++]="Revision:$2" + shift + else + ex_invalid_usage "invalid format of revision header descriptor. expecting: \`[!|<|>|<=|>=]value'" + fi + ;; + -Mc) do_count=1 # match on the count of members + [[ $2 ]] || ex_miss_optarg $1 "value pattern" + if is_compare_str "$2"; then + arr_match_on_msum[${#arr_match_on_msum[@]}]="$2" + shift + else + ex_invalid_usage "invalid format of match on member count value. expecting: \`[!|<|>|<=|>=]value'" + fi + ;; + -To) # set the timeout for read (limited to integer) + [[ $2 ]] || ex_miss_optarg $1 "value" + TMOUT=$2 + shift + ;; + -Tm) calc_mem=1 # caculate total memory usage of all matching sets + ;; + -Ts) sets_total=1 # caculate sum of all traversed sets + ;; + -Xh) exclude_header=1 # don't show certain headers + [[ $2 ]] || ex_miss_optarg $1 "header pattern" + if [[ $2 = *:* ]]; then + arr_hxclude[${#arr_hxclude[@]}]="$2" + shift + else + ex_invalid_usage "invalid format of header descriptor. expecting: \`*:*'" + fi + ;; + -Xg) glob_xclude_element=1 # suppress printing of matching members using a globbing pattern + [[ $2 ]] || ex_miss_optarg $1 "glob pattern" + str_xclude="$2" + shift + ;; + -Xr) regex_xclude_element=1 # suppress printing of matching members using a regex pattern + [[ $2 ]] || ex_miss_optarg $1 "regex pattern" + str_xclude="$2" + shift + ;; + -Xo) xclude_member_opts=1 # don't show elements options + ;; + -Xs) exclude_set=1 # don't show certain sets + [[ $2 ]] || ex_miss_optarg $1 "set name ([ext]glob pattern)" + arr_sxclude[${#arr_sxclude[@]}]="$2" + shift + ;; + -\!|-f) ex_invalid_usage "unsupported option: \`$1'" + ;; + -v) printf "%s version %s\n" "$me" "$version" + exit 0 + ;; + --) break + ;; + *) break + esac + shift +done +declare -i i=x=y=idx=0 + +# check for ipset program and version +[[ -x ${ipset:=/sbin/ipset} ]] || { + printf "ipset binary \`%s' does not exist, or is not executable. check \`ipset' variable\n" "$ipset" >&2 + exit 1 +} +ips_version="$("$ipset" version)" +ips_version="${ips_version#ipset v}" +ips_version="${ips_version%%.*}" +if ! is_int "$ips_version"; then + printf "failed retrieving ipset version. expected digits, got: \`%s'\n" "$ips_version" >&2 + exit 1 +fi +if ((ips_version < 6)); then + printf "found version \`%s' - ipset versions from 6.x and upwards are supported\n" "$ips_version" >&2 + exit 1 +fi + +# validate TMOUT variable +if [[ $TMOUT ]] && ! is_int "$TMOUT"; then + ex_invalid_usage "timeout value \`$TMOUT' is not an integer" +fi + +# option logic +if ((names_only)); then + if ((headers_only||show_members||show_all||isolate||\ + glob_xclude_element||regex_xclude_element||xclude_member_opts)) + then + ex_invalid_usage "option -n does not allow this combination of options" + fi +fi +if ((headers_only)); then + if ((show_members || show_all || isolate)); then + ex_invalid_usage "options -t and -a|-i|-m are mutually exclusive" + fi +fi +if ((headers_only)); then + if ((xclude_member_opts||glob_xclude_element||regex_xclude_element)); then + ex_invalid_usage "options -t and -Xg|-Xr|-Xo are mutually exclusive" + fi +fi +if ((isolate)); then + if ((show_count||show_all||calc_mem||count_sets||sets_total||exclude_set)); then + ex_invalid_usage "options -i and -a|-c|-Ca|-Cs|-Tm|-Ts|-Xs are mutually exclusive" + fi + if ((match_on_header)); then + ex_invalid_usage "option -i does not allow matching on header entries" + fi +fi +if ((glob_search || regex_search)); then + if ((glob_search && regex_search)); then + ex_invalid_usage "options -Fg and -Fr are mutually exclusive" + fi +fi +if ((exclude_header)); then + if ! ((headers_only || show_all)); then + ex_invalid_usage "option -Xh requires -a or -t" + fi +fi +if ((glob_xclude_element || regex_xclude_element)); then + if ! ((show_members || show_all || isolate)); then + ex_invalid_usage "options -Xg|-Xr require any of -a|-i|-m" + fi +fi +if ((colorize)); then + if ! [[ -x ${cl:=/usr/local/bin/cl} ]]; then + printf "\ncl program \`%s' does not exist, or is not executable.\ncheck \`cl' variable.\n\n" "$cl" >&2 + printf "If you do not have the program, you can download it from:\n" + printf "%s\n" "http://sourceforge.net/projects/colorize-shell/" \ + "https://github.com/AllKind/cl" >&2 + printf "\n" + exit 1 + fi + # set color defaults if unset + : ${col_fg:=white} + : ${col_bg:=black} + : ${col_headers:=cyan} + : ${col_members:=yellow} + : ${col_match:=red} + : ${col_memsize:=green} + : ${col_set_count:=magenta} + : ${col_set_total:=blue} + : ${col_highlight:=white} + + # check if color defines are valid + for opt in col_fg col_bg col_headers col_members col_match col_memsize \ + col_set_count col_set_total col_highlight + do + ("$cl" ${!opt}) || ex_invalid_usage "variable \`$opt' has an invalid color value: \`${!opt}'" + done + [[ -t 1 ]] || colorize=0 # output is not a terminal +fi + +# sets to work on (no arg means all sets) +while IFS=$'\n' read -r; do + arr_sets[idx++]="$REPLY" +done < <("$ipset" list -n) +if ! ((${#arr_sets[@]})); then + printf "Cannot find any sets\n" >&2 + exit 1 +fi +if [[ $1 ]]; then # there are remaining arg(s) + for opt; do found_set=0 # check if the sets exist + for idx in ${!arr_sets[@]}; do + if [[ ${arr_sets[idx]} = $opt ]]; then found_set=1 + # match could be a glob, thus multiple matches possible + # save to temp array + arr_tmp[${#arr_tmp[@]}]="${arr_sets[idx]}" + unset arr_sets[idx] + fi + done + if ! ((found_set)); then + ex_invalid_usage "\`$opt' is not a valid option nor an existing set name" + fi + done + if ((isolate)); then + if (($# != 1)); then + ex_invalid_usage "option -i is only valid for a single set" + fi + fi + arr_sets=("${arr_tmp[@]}") # reassign matched sets + if ((isolate && ${#arr_sets[@]} > 1)); then + ex_invalid_usage "option -i is only valid for a single set" + fi +else + if ((isolate)); then + ex_invalid_usage "option -i is only valid for a single set" + fi +fi + +# read sets +for idx in "${!arr_sets[@]}"; do found_set=0 arr_hcache=() arr_mcache=() + while read -r || { + (($? > 128)) && \ + printf "timeout reached or signal received, while reading set \`%s'.\n" \ + "${arr_sets[idx]}" >&2 && continue 2; + }; do + case "$REPLY" in + "") : ;; + Name:*) # header opened (set found) + if ((in_header)); then + printf "unexpected entry: \`%s' - header not closed?\n" "$REPLY" >&2 + exit 1 + fi + let sets_sum+=1 + if ((exclude_set)); then # don't show certain sets + for y in ${!arr_sxclude[@]}; do + if [[ ${arr_sets[idx]} = ${arr_sxclude[y]} ]]; then let found_sxclude+=1 + continue 3 # don't unset, as user could list sets multiple times + fi + done + fi + in_header=1 found_set=1 found_header=0 member_count=0 match_count=0 xclude_count=0 mem_tmp=0 i=0 x=0 + if ! ((isolate)); then # if showing members only, continue without saving any header data + if ((names_only)); then + if ((colorize)); then + arr_hcache[x++]="$("$cl" bold $col_headers)${REPLY#*:+([[:blank:]])}$("$cl" normal $col_fg $col_bg)" + else + arr_hcache[x++]="${REPLY#*:+([[:blank:]])}" + fi + elif ! ((headers_only||show_members||show_all||show_count||match_on_header||do_count||calc_mem||glob_search||regex_search||opt_int_search)) + then + in_header=0 + if ((colorize)); then + arr_hcache[x++]="$("$cl" bold $col_headers)${REPLY}$("$cl" normal $col_fg $col_bg)" + else + arr_hcache[x++]="$REPLY" + fi + break # nothing to show but the names + else + if ((colorize)); then + arr_hcache[x++]=$'\n'"$("$cl" bold $col_headers)${REPLY}$("$cl" normal $col_fg $col_bg)" + else + arr_hcache[x++]=$'\n'"$REPLY" + fi + fi + fi + ;; + Members:*) # closes header (if not `ipset -t') + if ! ((in_header)); then + printf "unexpected entry: \`%s' - header not opened?\n" "$REPLY" >&2 + exit 1 + fi + in_header=0 found_hxclude=0 + if ((match_on_header)); then + if ((found_header != match_on_header)); then found_set=0 + break # set does not contain wanted header + fi + fi + if ((exclude_header)); then # don't show certain headers + for y in ${!arr_hxclude[@]}; do + if [[ ${REPLY%%:*} = ${arr_hxclude[y]%%:*} && ${REPLY#*: } = ${arr_hxclude[y]#*:} ]] + then found_hxclude=1 + break + fi + done + fi + if ((show_all && ! found_hxclude)); then + if ((colorize)); then + arr_hcache[x++]="$("$cl" bold $col_headers)${REPLY}$("$cl" normal $col_fg $col_bg)" + else + arr_hcache[x++]="$REPLY" + fi + fi + ;; + *) # either in-header, or member entry + if ! ((found_set)); then + printf "no set opened by \`Name:'. unexpected entry \`%s'.\n" "$REPLY" >&2 + exit 1 + fi + if ((in_header)); then # we should be in the header + if ((match_on_header && found_header < match_on_header)); then # match on an header entry + for y in ${!arr_hsearch[@]}; do # string compare + if [[ ${REPLY%%:*} = ${arr_hsearch[y]%%:*} && ${REPLY#*: } = ${arr_hsearch[y]#*:} ]] + then let found_header+=1 + fi + done + for y in ${!arr_hsearch_int[@]}; do # int compare + if [[ ${REPLY%%:*} = ${arr_hsearch_int[y]%%:*} ]]; then # header name matches + if ! is_int "${REPLY#*: }"; then + printf "header value \`%s' is not an integer.\n" "${REPLY#*: }" >&2 + exit 1 + fi + str_val="${arr_hsearch_int[y]#*:}" + str_op="${str_val//[[:digit:]]}" # compare operator defaults to `==' + [[ ${str_op:===} = \! ]] && str_op='!=' + if ((${REPLY#*: } $str_op ${str_val//[[:punct:]]})); then + let found_header+=1 + fi + fi + done + # search and arithmetic compare values of the headers 'Header' flag + if ((${#arr_hsearch_xint[@]})) && [[ ${REPLY%%:*} = Header ]]; then + set -- ${REPLY#*:} + while (($#)); do + if is_digit_or_xigit "$1"; then + shift + continue + fi + for y in ${!arr_hsearch_xint[@]}; do + str_name="${arr_hsearch_xint[y]%%:*}" + str_val="${arr_hsearch_xint[y]#*:}" + if [[ $str_val = ??0[xX]+([[:xdigit:]]) ]]; then + str_op="${str_val%0[xX]*}" + elif [[ $str_val = ??+([[:digit:]]) ]]; then + str_op="${str_val//[[:digit:]]}" + fi + str_val="${str_val#"${str_op}"}" + [[ ${str_op:===} = \! ]] && str_op='!=' + if [[ $1 = $str_name ]]; then + if is_digit_or_xigit "$2"; then + if (($2 $str_op $str_val)); then + let found_header+=1 + shift + break + fi + fi + fi + done + shift + done + fi + fi + if ((calc_mem)); then + if [[ ${REPLY%%:*} = "Size in memory" ]]; then + if ! is_int "${REPLY#*: }"; then + printf "header value \`%s' is not an integer.\n" "${REPLY#*: }" >&2 + exit 1 + fi + # save to temp, in case we throw away the set, if it doesn't match other criteria + mem_tmp=${REPLY#*: } + fi + fi + if ((headers_only || show_all)); then found_hxclude=0 + if ((exclude_header)); then # don't show certain headers + for y in ${!arr_hxclude[@]}; do + if [[ ${REPLY%%:*} = ${arr_hxclude[y]%%:*} && ${REPLY#*: } = ${arr_hxclude[y]#*:} ]] + then found_hxclude=1 + break + fi + done + fi + if ! ((found_hxclude)); then + arr_hcache[x++]="$REPLY" + fi + fi + else # this should be a member entry + if ((show_members || show_all || isolate || glob_search || regex_search || opt_int_search)); then + if ((glob_search)); then # show sets with glob pattern matching members + if ! xclude_elem_search; then + if [[ $REPLY = $str_search ]]; then + if ((opt_int_search)); then + arith_elem_opt_search + else + let match_count+=1 + add_search_to_member_cache + fi + fi + fi + elif ((regex_search)); then # show sets with regex pattern matching members + if ! xclude_elem_search; then + if [[ $REPLY =~ $str_search ]]; then + if ((opt_int_search)); then + arith_elem_opt_search + else + let match_count+=1 + add_search_to_member_cache + fi + else + if (($? == 2)); then + printf "Invalid regex pattern \`%s'.\n" "$str_search" >&2 + exit 1 + fi + fi + fi + elif ((opt_int_search)); then # show sets with matching member options + if ! xclude_elem_search; then + arith_elem_opt_search + fi + else + if ((glob_xclude_element)); then # exclude matching members + if ! [[ $REPLY = $str_xclude ]]; then + add_search_to_member_cache + else let xclude_count+=1 + fi + elif ((regex_xclude_element)); then # exclude matching members + if [[ $REPLY =~ $str_xclude ]]; then + let xclude_count+=1 + else + if (($? == 2)); then + printf "Invalid regex pattern \`%s'.\n" "$str_xclude" >&2 + exit 1 + fi + add_search_to_member_cache + fi + else + arr_mcache[i++]="$REPLY" + fi + fi + else # nothing to show or search for, do we need to count members? + if ! ((show_count || do_count)); then + break # nothing more to do for this set + fi + fi + let member_count+=1 + fi + esac + done < <("$ipset" list "${arr_sets[idx]}" "${arr_par[@]}") + if ((found_set)); then # print gathered information + if ((glob_search || regex_search || opt_int_search)) && ((match_count == 0)); then + continue # glob, regex or option-integer search didn't match + fi + if ((${#arr_match_on_msum[@]} > 0)); then # match on member sum (do_count=1) + for i in ${!arr_match_on_msum[@]}; do + str_op="${arr_match_on_msum[i]//[[:digit:]]}" + [[ ${str_op:===} = \! ]] && str_op='!=' + if ! (($member_count $str_op ${arr_match_on_msum[i]//[[:punct:]]})); then + continue 2 # does not match + fi + done + fi + let set_count+=1 # count amount of matching sets + if ((calc_mem)); then + let mem_total+=$mem_tmp + fi + if ((${#arr_hcache[@]})); then # print header + if ((colorize)); then + printf "$("$cl" $col_headers)%b$("$cl" normal $col_fg $col_bg)\n" "${arr_hcache[@]}" + else + printf "%s\n" "${arr_hcache[@]}" + fi + fi + if ((${#arr_mcache[@]})); then # print members + if ((xclude_member_opts)); then + arr_mcache=( "${arr_mcache[@]%% *}" ) + fi + IFS="${delim:= }" + if ((colorize)); then + printf "$("$cl" $col_members)%s$("$cl" normal $col_fg $col_bg)" "${arr_mcache[*]}" + else + printf "%s" "${arr_mcache[*]}" + fi + IFS="$oIFS" + printf "\n" + fi + if ((show_count)); then # print counters + if ((glob_search || regex_search || opt_int_search)); then + if ((colorize)); then + printf "$("$cl" $col_match)Match count$("$cl" normal $col_fg $col_bg):\ + $("$cl" bold $col_match)%d$("$cl" normal $col_fg $col_bg)\n" $match_count + else + printf "Match count: %d\n" $match_count + fi + fi + if ((glob_xclude_element || regex_xclude_element)); then + if ((colorize)); then + printf "$("$cl" $col_match)Exclude count$("$cl" normal $col_fg $col_bg):\ + $("$cl" bold $col_match)%d$("$cl" normal $col_fg $col_bg)\n" $xclude_count + else + printf "Exclude count: %d\n" $xclude_count + fi + fi + if ((colorize)); then + printf "$("$cl" bold $col_highlight)Member count$("$cl" normal $col_fg $col_bg):\ + $("$cl" bold $col_members)%d$("$cl" normal $col_fg $col_bg)\n" $member_count + else + printf "Member count: %d\n" $member_count + fi + fi + fi +done + +# print global counters +if ((count_sets || calc_mem || sets_total || exclude_set)); then + printf "\n" + if ((count_sets)); then + if ((colorize)); then + printf "$("$cl" bold $col_highlight)Count$("$cl" normal $col_fg $col_bg) of all\ + $("$cl" bold $col_set_count)matched sets$("$cl" normal $col_fg $col_bg):\ + $("$cl" bold $col_set_count)%d$("$cl" normal $col_fg $col_bg)\n" $set_count + else + printf "Count of all matched sets: %d\n" $set_count + fi + if ((exclude_set)); then + if ((colorize)); then + printf "$("$cl" bold $col_highlight)Count$("$cl" normal $col_fg $col_bg) of all\ + $("$cl" bold $col_match)excluded sets$("$cl" normal $col_fg $col_bg):\ + $("$cl" bold $col_match)%d$("$cl" normal $col_fg $col_bg)\n" $found_sxclude + else + printf "Count of all excluded sets: %d\n" $found_sxclude + fi + fi + fi + if ((sets_total)); then + if ((colorize)); then + printf "$("$cl" bold $col_highlight)Count$("$cl" normal $col_fg $col_bg) of all\ + $("$cl" bold $col_set_total)traversed sets$("$cl" normal $col_fg $col_bg):\ + $("$cl" bold $col_set_total)%d$("$cl" normal $col_fg $col_bg)\n" $sets_sum + else + printf "Count of all traversed sets: %d\n" $sets_sum + fi + fi + if ((calc_mem)); then + if ((colorize)); then + printf "$("$cl" bold $col_memsize)Total memory size$("$cl" normal $col_fg $col_bg)\ + of all matched sets: $("$cl" bold $col_memsize)%d$("$cl" normal $col_fg $col_bg)\n" $mem_total + else + printf "Total memory size of all matched sets: %d\n" $mem_total + fi + fi +fi diff --git a/utils/ipset_list/ipset_list_bash_completion b/utils/ipset_list/ipset_list_bash_completion new file mode 100644 index 0000000..f92c7ab --- /dev/null +++ b/utils/ipset_list/ipset_list_bash_completion @@ -0,0 +1,303 @@ +#!/bin/bash + +# ----------------------------------------------------------------- +# ipset set listing wrapper script +# +# https://github.com/AllKind/ipset_list +# https://sourceforge.net/projects/ipset-list/ +# ----------------------------------------------------------------- + +# Copyright (C) 2013-2014 AllKind (AllKind@fastest.cc) +# +# 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 . + +# ----------------------------------------------------------------- +# +# This is the bash programmable completion for ipset_list +# (put it into ~/.bash_completion or /etc/bash_completion.d/) +# +# ----------------------------------------------------------------- + +# Name may be modified +ipset_list=ipset_list + +# ----------------------------------------------------------------- + +# ----------------------------------------------------------------- +# DO NOT MODIFY ANYTHING BEYOND THIS LINE! +# ----------------------------------------------------------------- + +shopt -s extglob + +# ----------------------------------------------------------------- +# Functions +# ----------------------------------------------------------------- + +_ipset_list_show_sets() { +COMPREPLY=( $( compgen -W '${sets[@]}' -- "$cur" ) ) +# dedupe sets listing +for ((i=set_index; i < ${#words[@]}-1; i++)); do + _ipset_list_remove_reply_entry "${words[i]}" +done +} + +_ipset_list_remove_reply_entry() { +local -i x +while (($#)); do + for x in ${!COMPREPLY[@]}; do + if [[ ${COMPREPLY[x]} = $1 ]]; then + if [[ $_DEBUG_NF_COMPLETION ]]; then + printf "removing dupe entry COMPREPLY[$x]: %s\n" \ + "${COMPREPLY[x]}" + fi + unset COMPREPLY[x] + break + fi + done + shift +done +} + +# ----------------------------------------------------------------- +# Main +# ----------------------------------------------------------------- + +_ipset_list_complete() { +local -i i=x=got_bashcompl=0 +local -i show_all=isolate=show_members=resolve=headers_only=names_only=0 +local -i header_operation=set_index=0 +local cur prev cword words str_tmp +local sets=( $("${ipset_list:-ipset_list}" -n) ) +local opts=(-- -? -a -c -d -h -i -m -n -r -s -t -v) +local Copts=(-Ca -Cs -Co) +local Fopts=(-Fh -Fi -Fg -Fr -Oi) +local Hopts=(-Hi -Hr -Hs -Ht -Hv) +local Topts=(-Tm -To -Ts) +local Xopts=(-Xh -Xg -Xr -Xs -Xo) +local arr_types=() + +: ${PATH:=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin} + +COMPREPLY=() + +# expecting _get_comp_words_by_ref() to exist from bash_completion +if declare -f _get_comp_words_by_ref &>/dev/null; then got_bashcompl=1 + _get_comp_words_by_ref -n : cur prev cword words || return +else got_bashcompl=0 # not so neat, but a workaround + COMP_WORDBREAKS="${COMP_WORDBREAKS//:/}" + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + cword=$COMP_CWORD + for i in ${!COMP_WORDS[@]}; do words[i]="${COMP_WORDS[i]}"; done +fi + +#_DEBUG_NF_COMPLETION=Y +if [[ $_DEBUG_NF_COMPLETION ]]; then + printf "\nCOMP_WORDBREAKS: <%s>\n" "$COMP_WORDBREAKS" + printf "COMP_LINE: <%s>\n" "$COMP_LINE" + printf "COMP_TYPE: <%s>\n" "$COMP_TYPE" + printf "COMP_POINT: <%s>\n" "$COMP_POINT" + printf "COMP_KEY: <%s>\n" "$COMP_KEY" + printf "COMP_CWORD: <%s>\n" "$COMP_CWORD" + printf "\ncur: <%s> prev: <%s>\n" "$cur" "$prev" + printf "words:\n" + printf "<%s>\n" "${words[@]}" +fi + +# collect info of cmdline +for ((i=1; i < ${#words[@]}-1; i++)); do + case "${words[i]}" in + -a) ((set_index)) && break || show_all=1 ;; + -i) ((set_index)) && break || isolate=1 Copts=(-Co) ;; + -m) ((set_index)) && break || show_members=1 ;; + -n) ((set_index)) && break || names_only=1 ;; + -r) ((set_index)) && break || resolve=1 ;; + -t) ((set_index)) && break || headers_only=1 Xopts=(-Xh -Xs) Fopts=(${Fopts[*]/-Oi/}) ;; + --) ((set_index)) && break || set_index=$((i+1)) ;; + -\?|-h|-v) + ((set_index)) || return 0 + ;; + @(-Fh|-Fi|-Hi|-Xh)) ((set_index)) && break || header_operation=1 ;; + *) + ((set_index)) && break + # options expecting an opt arg + str_tmp="@(-@(d|Fg|Fh|Fi|Fr|Hi|Ht|Hr|Hs|Hv|Mc|Oi|To|Xg|Xh|Xr|Xs))" + if [[ ${words[i-1]} = $str_tmp ]]; then + continue + fi + # if not an option, register set index + str_tmp="@(-@(-|?|a|c|d|h|i|m|n|r|s|t|v|Ca|Cs|Co|Fg|Fh|Fi|Fr|Hi|Ht|Hr|Hs|Hv|Mc|Oi|To|Tm|Ts|Xg|Xh|Xo|Xr))" + if [[ ${words[i]} != $str_tmp ]]; then + for x in ${!sets[@]}; do + if [[ ${sets[x]} = ${words[i]} ]]; then + set_index=$i + break + fi + done + fi + esac +done + +# invalid combinations of options +if ((names_only)); then + if ((headers_only)); then + return 0 + fi +fi +if ((headers_only||names_only)); then + if ((show_all || show_members || isolate || resolve)); then + return 0 + fi +elif ((isolate)); then + if ((show_all || header_operation)); then + return 0 + fi +fi + +# start setting compreply +# all depends on $set_index +if ((set_index)); then + if ((isolate && cword > set_index)); then + return 0 # allow only one set with isolate + fi + # dont' allow an option after the set name(s) + # allows to list sets which start with an hyphen + # and also handles those who have the name of ipset_list options + _ipset_list_show_sets +else +if [[ $prev = @(-@(\?|d|h|v|Fg|Fi|Fr|Hi|Ht|Oi|To|Xg|Xr)) ]]; then + return 0 +elif [[ $prev = -Xs ]]; then + # list sets if user does not want to enter a glob + _ipset_list_show_sets +elif [[ $prev = -Ht ]]; then i=0 + # show supported set types + while read -r; do + [[ $REPLY = "Supported set types:"* ]] && ((!i)) && \ + i=1 && continue + ((i)) || continue + if [[ $REPLY = *:* ]]; then + set -- $REPLY + arr_types[${#arr_types[@]}]="$1" + fi + done < <(ipset help) + for i in ${!arr_types[@]}; do # remove dupe entries + for ((x=i+1; x < ${#arr_types[@]}; x++)); do + if [[ ${arr_types[i]} = ${arr_types[x]} ]]; then + unset arr_types[x] + fi + done + done + COMPREPLY=( $( compgen -W '${arr_types[@]}' -- "$cur" ) ) +elif [[ $prev = @(-Fh|-Xh) ]]; then + # retrieve list of headers + if ((${#sets[*]} > 0)); then + while read -r; do + [[ $REPLY = Name ]] && continue + COMPREPLY[${#COMPREPLY[@]}]="$REPLY" + done < <("$ipset_list" -t "${sets[0]}"|command awk -F: '{print $1}') + compopt -o nospace + local IFS=$'\n' + if [[ $prev = -Xh ]]; then + COMPREPLY=( $( compgen -P '"' -S ':*"' \ + -W '${COMPREPLY[@]}' -- "$cur" ) ) + elif [[ $prev = -Fh ]]; then + COMPREPLY=( $( compgen -P '"' -S ':"' \ + -W '${COMPREPLY[@]}' -- "$cur" ) ) + fi + fi +elif [[ $prev = @(-@(Hr|Hs|Hv|Mc)) ]]; then + # options making use of arithmetic comparison + compopt -o nospace + COMPREPLY=( $( compgen -P '\' -W '\! \< \> \<= \>=' -- "$cur" ) ) +elif [[ $cur = -* ]]; then + # any option is requested + case "$prev" in + @(-@(\?|d|h|v|Fg|Fh|Fi|Fr|Hi|Ht|Hr|Hs|Hv|Mc|Oi|To|Xg|Xh|Xr))) + # options that exclude any other option, + # or need a value we can't predict + return 0 + ;; + esac + # these options don't allow any other + if ((${#words[@]} > 2)); then + opts=("${opts[@]/@(-v|-h|-\?)/}") + fi + # some options allow only a subset of other options + if ((isolate)); then + COMPREPLY=( $(compgen -W '-- -Co -d -r -s -Fg -Fr -Oi -To -Xg -Xo -Xr' -- $cur ) ) + elif ((names_only)); then + COMPREPLY=( $(compgen -W \ + '-- -c ${Copts[@]} ${Fopts[@]} ${Hopts[@]} -Mc ${Topts[@]} -Xs' \ + -- $cur ) ) + elif ((headers_only)); then + COMPREPLY=( $(compgen -W \ + '-- -c ${Copts[@]} ${Fopts[@]} ${Hopts[@]} -Mc ${Topts[@]} ${Xopts[@]}' \ + -- $cur ) ) + elif ((show_members)); then + COMPREPLY=( $(compgen -W \ + '-- -c -d -r -s ${Copts[@]} ${Fopts[@]} ${Hopts[@]} -Mc ${Topts[@]} -Xg -Xr -Xo' \ + -- $cur ) ) + elif ((show_all)); then + COMPREPLY=( $(compgen -W \ + '-- -c -d -r -s ${Copts[@]} ${Fopts[@]} ${Hopts[@]} -Mc ${Topts[@]} ${Xopts[@]}' \ + -- $cur ) ) + elif ((resolve)); then + COMPREPLY=( $(compgen -W \ + '-- -a -c -d -s -m ${Copts[@]} ${Fopts[@]} ${Hopts[@]} -Mc ${Topts[@]} ${Xopts[@]}' \ + -- $cur ) ) + elif ((header_operation)); then + COMPREPLY=( $(compgen -W \ + '-- -a -c -d -s -m -t ${Copts[@]} ${Fopts[@]} ${Hopts[@]} -Mc ${Topts[@]} ${Xopts[@]}' \ + -- $cur ) ) + else + COMPREPLY=( $(compgen -W \ + '${opts[@]} ${Copts[@]} ${Fopts[@]} ${Hopts[@]} -Mc ${Topts[@]} ${Xopts[@]}' \ + -- $cur ) ) + fi + # post process the reply + if ((${#COMPREPLY[@]})); then + x=$((set_index ? set_index : ${#words[*]}-1)) + # mutual exclusive options + for ((i=1; i < x; i++)); do + case "${words[i]}" in + -Fg) _ipset_list_remove_reply_entry "-Fr" ;; + -Fr) _ipset_list_remove_reply_entry "-Fg" ;; + -Xg) _ipset_list_remove_reply_entry "-Xr" ;; + -Xr) _ipset_list_remove_reply_entry "-Xg" ;; + esac + # options allowed multiple times + if [[ ${words[i]} = @(""|-|-@(Fh|Fi|Hi|Mc|Oi|Xh|Xs)) ]]; then + continue + else # remove dupe + _ipset_list_remove_reply_entry "${words[i]}" + fi + done + fi +elif [[ $cur = * ]]; then + # non option request + # default to sets listing + _ipset_list_show_sets +fi +fi + +((got_bashcompl)) && __ltrim_colon_completions "$cur" + +if [[ $_DEBUG_NF_COMPLETION ]]; then + printf "COMPREPLY:\n" + printf "<%s>\n" "${COMPREPLY[@]}" +fi +} +complete -F _ipset_list_complete "${ipset_list:-ipset_list}" +